/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.netbeans.modules.cordova.platforms;

import java.util.EnumSet;
import javax.swing.JPanel;
import org.netbeans.api.project.Project;
import org.netbeans.modules.web.browser.api.WebBrowser;
import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectEnhancedBrowserImplementation;
import org.netbeans.modules.web.clientproject.spi.platform.ProjectConfigurationCustomizer;

/**
 *
 * @author Jan Becicka
 */
public class BrowserCustomizer implements ProjectConfigurationCustomizer {

    private BrowserConfigurationPanel panel;
    private final Project project;
    private final WebBrowser browser;
    private final ClientProjectEnhancedBrowserImplementation impl;

    public BrowserCustomizer(Project project, ClientProjectEnhancedBrowserImplementation impl, WebBrowser browser) {
        this.project = project;
        this.browser = browser;
        this.impl = impl;
    }

    @Override
    public JPanel createPanel() {
        panel = new BrowserConfigurationPanel(project, impl, browser);
        return panel;
    }

    public boolean isAutoRefresh() {
        return panel.isAutoRefresh();
    }

    public boolean isHighlightSelection() {
        return panel.isHighlightSelection();
    }

    @Override
    public EnumSet<HiddenProperties> getHiddenProperties() {
        return EnumSet.noneOf(HiddenProperties.class);
    }

}
