diff --git a/cordova/src/org/netbeans/modules/cordova/CordovaPerformer.java b/cordova/src/org/netbeans/modules/cordova/CordovaPerformer.java --- a/cordova/src/org/netbeans/modules/cordova/CordovaPerformer.java +++ b/cordova/src/org/netbeans/modules/cordova/CordovaPerformer.java @@ -55,8 +55,9 @@ import org.netbeans.modules.cordova.platforms.Device; import org.netbeans.modules.cordova.platforms.MobileDebugTransport; import org.netbeans.modules.cordova.platforms.PlatformManager; -import org.netbeans.modules.cordova.project.ClientProjectConfigurationImpl; +import org.netbeans.modules.cordova.project.ClientProjectEnhancedBrowserImpl; import org.netbeans.modules.cordova.project.ClientProjectUtilities; +import org.netbeans.modules.cordova.project.MobileConfigurationImpl; import org.netbeans.modules.web.browser.api.PageInspector; import org.netbeans.modules.web.common.api.ServerURLMapping; import org.netbeans.modules.web.common.api.WebServer; @@ -137,9 +138,9 @@ props.put(PROP_DEBUG_ENABLE, debug);//NOI18N //workaround for some strange behavior of ant execution in netbeans props.put(PROP_ENV_DISPLAY, ":0.0");//NOI18N - if (activeConfiguration instanceof ClientProjectConfigurationImpl) { - props.put(PROP_CONFIG, ((ClientProjectConfigurationImpl) activeConfiguration).getId()); - ((ClientProjectConfigurationImpl) activeConfiguration).getDevice().addProperties(props); + if (activeConfiguration instanceof MobileConfigurationImpl) { + props.put(PROP_CONFIG, ((MobileConfigurationImpl) activeConfiguration).getId()); + ((MobileConfigurationImpl) activeConfiguration).getDevice().addProperties(props); } props.put(PROP_ANDROID_SDK_HOME, PlatformManager.getPlatform(PlatformManager.ANDROID_TYPE).getSdkLocation()); diff --git a/cordova/src/org/netbeans/modules/cordova/project/ClientProjectConfigurationImpl.java b/cordova/src/org/netbeans/modules/cordova/project/ClientProjectEnhancedBrowserImpl.java rename from cordova/src/org/netbeans/modules/cordova/project/ClientProjectConfigurationImpl.java rename to cordova/src/org/netbeans/modules/cordova/project/ClientProjectEnhancedBrowserImpl.java --- a/cordova/src/org/netbeans/modules/cordova/project/ClientProjectConfigurationImpl.java +++ b/cordova/src/org/netbeans/modules/cordova/project/ClientProjectEnhancedBrowserImpl.java @@ -43,117 +43,47 @@ package org.netbeans.modules.cordova.project; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; import org.netbeans.api.project.Project; import org.netbeans.modules.cordova.platforms.Device; import org.netbeans.modules.cordova.platforms.MobilePlatform; import org.netbeans.modules.cordova.platforms.PlatformManager; -import org.netbeans.modules.cordova.platforms.PropertyProvider; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectConfigurationImplementation; +import org.netbeans.modules.web.browser.api.BrowserFamilyId; +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; import org.netbeans.modules.web.clientproject.spi.platform.RefreshOnSaveListener; import org.netbeans.spi.project.ActionProvider; -import org.openide.filesystems.FileObject; -import org.openide.util.EditableProperties; +import org.netbeans.spi.project.ProjectConfigurationProvider; import org.openide.util.Exceptions; +import org.openide.util.Lookup; /** * */ -public class ClientProjectConfigurationImpl implements ClientProjectConfigurationImplementation, PropertyProvider { +public class ClientProjectEnhancedBrowserImpl implements ClientProjectEnhancedBrowserImplementation { final private Project project; - //final private ClientProjectPlatformImpl platform; - private final String name; - private final String displayName; - private final String type; - private final EditableProperties props; - private final FileObject file; + final private WebBrowser browser; + private MobilePlatform platform; + private MobileConfigurationsProvider configsProvider; - private ClientProjectConfigurationImpl(Project project, FileObject kid, String id, String displayName, String type, EditableProperties ep) { + ClientProjectEnhancedBrowserImpl(Project project, WebBrowser browser) { this.project = project; - this.name = id; - this.displayName = displayName; - this.type = type; - this.props = ep; - this.file = kid; + this.browser = browser; + if (browser.getBrowserFamily() == BrowserFamilyId.ANDROID) { + platform = PlatformManager.getPlatform(PlatformManager.ANDROID_TYPE); + } else { + assert browser.getBrowserFamily() == BrowserFamilyId.IOS; + platform = PlatformManager.getPlatform(PlatformManager.IOS_TYPE); } - - @Override - public String getId() { - return name; - } - - @Override - public String getBrowserId() { - return type; + // configsProvider should be created with configurations for concrete MobilePlatform + configsProvider = new MobileConfigurationsProvider(project); } @Override public void save() { - if (file == null) { - return; - } - OutputStream os = null; - try { - os = file.getOutputStream(); - try { - props.store(os); - } finally { - os.close(); - } - } catch (IOException ex) { - Exceptions.printStackTrace(ex); - } finally { - try { - os.close(); - } catch (IOException ex) { - Exceptions.printStackTrace(ex); - } - } - } - - public String getType() { - return type; - } - - public Device getDevice() { - return PlatformManager.getPlatform(type).getDevice(name, props); - } - - @Override - public String getProperty(String prop) { - return props.getProperty(prop); - } - - @Override - public String putProperty(String prop, String value) { - return props.put(prop, value); - } - - public static ClientProjectConfigurationImpl create(Project proj, FileObject configFile) { - - try { - InputStream is = configFile.getInputStream(); - try { - EditableProperties p = new EditableProperties(true); - p.load(is); - String id = configFile.getName(); - String label = p.getProperty("display.name"); // NOI18N - String type = p.getProperty("type"); //NOI18N - return new ClientProjectConfigurationImpl(proj, configFile, id, label != null ? label : id, type, p); - } finally { - is.close(); - } - } catch (IOException x) { - throw new IllegalStateException(x); - } - } - - @Override - public String getDisplayName() { - return displayName; + // this should save changes in UI for particular configuration } @Override @@ -163,26 +93,20 @@ @Override public ActionProvider getActionProvider() { - return getDevice().getActionProvider(project); + //return getDevice().getActionProvider(project); + return null; } @Override public ProjectConfigurationCustomizer getProjectConfigurationCustomizer() { - return getDevice().getProjectConfigurationCustomizer(project, this); - } + //return getDevice().getProjectConfigurationCustomizer(project, this); - @Override - public boolean canBeDeleted() { - return true; - } + // UI should show a combo box at the top with list of configurations + // user can choose from for particular family of browsers, that is + // different configuration can be shown for IOS and ANDROID and PHONEGAP + // type of browser - @Override - public void delete() { - try { - file.delete(); - } catch (IOException ex) { - Exceptions.printStackTrace(ex); - } + return null; } @Override @@ -194,4 +118,9 @@ return true; } + @Override + public ProjectConfigurationProvider getProjectConfigurationProvider() { + return configsProvider; + } + } diff --git a/cordova/src/org/netbeans/modules/cordova/project/ClientProjectPlatformProviderImpl.java b/cordova/src/org/netbeans/modules/cordova/project/ClientProjectEnhancedBrowserProviderImpl.java rename from cordova/src/org/netbeans/modules/cordova/project/ClientProjectPlatformProviderImpl.java rename to cordova/src/org/netbeans/modules/cordova/project/ClientProjectEnhancedBrowserProviderImpl.java --- a/cordova/src/org/netbeans/modules/cordova/project/ClientProjectPlatformProviderImpl.java +++ b/cordova/src/org/netbeans/modules/cordova/project/ClientProjectEnhancedBrowserProviderImpl.java @@ -42,30 +42,28 @@ package org.netbeans.modules.cordova.project; -import java.util.Collection; -import java.util.Collections; -import java.util.Map; -import java.util.WeakHashMap; import org.netbeans.api.project.Project; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectPlatformImplementation; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectPlatformProvider; -import org.openide.util.lookup.ServiceProvider; +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.ClientProjectEnhancedBrowserProvider; +import org.netbeans.spi.project.ProjectServiceProvider; -@ServiceProvider( - service=ClientProjectPlatformProvider.class, - position=2000) -public class ClientProjectPlatformProviderImpl implements ClientProjectPlatformProvider { +@ProjectServiceProvider( + projectType = "org-netbeans-modules-web-clientproject", + service=ClientProjectEnhancedBrowserProvider.class) +public class ClientProjectEnhancedBrowserProviderImpl implements ClientProjectEnhancedBrowserProvider { + private Project p; - private Map cache = new WeakHashMap(); + public ClientProjectEnhancedBrowserProviderImpl(Project p) { + this.p = p; + } @Override - public Collection getPlatforms(Project p) { - ClientProjectPlatformImplementation res = cache.get(p); - if (res == null) { - res = new ClientProjectPlatformImpl(p); - cache.put(p, res); + public ClientProjectEnhancedBrowserImplementation getEnhancedBrowser(WebBrowser webBrowser) { + if (!webBrowser.getBrowserFamily().isMobile()) { + return null; } - return Collections.singletonList(res); + return new ClientProjectEnhancedBrowserImpl(p, webBrowser); } } diff --git a/cordova/src/org/netbeans/modules/cordova/project/ClientProjectUtilities.java b/cordova/src/org/netbeans/modules/cordova/project/ClientProjectUtilities.java --- a/cordova/src/org/netbeans/modules/cordova/project/ClientProjectUtilities.java +++ b/cordova/src/org/netbeans/modules/cordova/project/ClientProjectUtilities.java @@ -79,9 +79,9 @@ public static String getProperty(Project p, String key) { ProjectConfigurationProvider provider = p.getLookup().lookup(ProjectConfigurationProvider.class); - if (!(provider.getActiveConfiguration() instanceof ClientProjectConfigurationImpl)) + if (!(provider.getActiveConfiguration() instanceof MobileConfigurationImpl)) return null; - ClientProjectConfigurationImpl activeConfiguration = (ClientProjectConfigurationImpl) provider.getActiveConfiguration(); + MobileConfigurationImpl activeConfiguration = (MobileConfigurationImpl) provider.getActiveConfiguration(); return activeConfiguration.getProperty(key); } } diff --git a/cordova/src/org/netbeans/modules/cordova/project/CordovaCustomizerPanel.java b/cordova/src/org/netbeans/modules/cordova/project/CordovaCustomizerPanel.java --- a/cordova/src/org/netbeans/modules/cordova/project/CordovaCustomizerPanel.java +++ b/cordova/src/org/netbeans/modules/cordova/project/CordovaCustomizerPanel.java @@ -162,11 +162,12 @@ private void initControls() { initComponents(); + // XXX: should be changed probably: ProjectConfigurationProvider provider = project.getLookup().lookup(ProjectConfigurationProvider.class); boolean isCordovaProject = false; if (provider!=null) { for (Object conf:provider.getConfigurations()) { - if (conf instanceof ClientProjectConfigurationImpl) { + if (conf instanceof MobileConfigurationImpl) { isCordovaProject = true; break; } diff --git a/cordova/src/org/netbeans/modules/cordova/project/ClientProjectConfigurationImpl.java b/cordova/src/org/netbeans/modules/cordova/project/MobileConfigurationImpl.java copy from cordova/src/org/netbeans/modules/cordova/project/ClientProjectConfigurationImpl.java copy to cordova/src/org/netbeans/modules/cordova/project/MobileConfigurationImpl.java --- a/cordova/src/org/netbeans/modules/cordova/project/ClientProjectConfigurationImpl.java +++ b/cordova/src/org/netbeans/modules/cordova/project/MobileConfigurationImpl.java @@ -50,10 +50,11 @@ import org.netbeans.modules.cordova.platforms.MobilePlatform; import org.netbeans.modules.cordova.platforms.PlatformManager; import org.netbeans.modules.cordova.platforms.PropertyProvider; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectConfigurationImplementation; +import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectEnhancedBrowserImplementation; import org.netbeans.modules.web.clientproject.spi.platform.ProjectConfigurationCustomizer; import org.netbeans.modules.web.clientproject.spi.platform.RefreshOnSaveListener; import org.netbeans.spi.project.ActionProvider; +import org.netbeans.spi.project.ProjectConfiguration; import org.openide.filesystems.FileObject; import org.openide.util.EditableProperties; import org.openide.util.Exceptions; @@ -61,7 +62,7 @@ /** * */ -public class ClientProjectConfigurationImpl implements ClientProjectConfigurationImplementation, PropertyProvider { +public class MobileConfigurationImpl implements ProjectConfiguration, PropertyProvider { final private Project project; //final private ClientProjectPlatformImpl platform; @@ -71,7 +72,7 @@ private final EditableProperties props; private final FileObject file; - private ClientProjectConfigurationImpl(Project project, FileObject kid, String id, String displayName, String type, EditableProperties ep) { + private MobileConfigurationImpl(Project project, FileObject kid, String id, String displayName, String type, EditableProperties ep) { this.project = project; this.name = id; this.displayName = displayName; @@ -80,17 +81,12 @@ this.file = kid; } - @Override +// @Override public String getId() { return name; } - @Override - public String getBrowserId() { - return type; - } - - @Override +// @Override public void save() { if (file == null) { return; @@ -132,7 +128,7 @@ return props.put(prop, value); } - public static ClientProjectConfigurationImpl create(Project proj, FileObject configFile) { + public static MobileConfigurationImpl create(Project proj, FileObject configFile) { try { InputStream is = configFile.getInputStream(); @@ -142,7 +138,7 @@ String id = configFile.getName(); String label = p.getProperty("display.name"); // NOI18N String type = p.getProperty("type"); //NOI18N - return new ClientProjectConfigurationImpl(proj, configFile, id, label != null ? label : id, type, p); + return new MobileConfigurationImpl(proj, configFile, id, label != null ? label : id, type, p); } finally { is.close(); } @@ -156,27 +152,13 @@ return displayName; } - @Override - public RefreshOnSaveListener getRefreshOnSaveListener() { - return new RefreshOnSaveListenerImpl(/*???*/); - } - @Override - public ActionProvider getActionProvider() { - return getDevice().getActionProvider(project); - } - - @Override - public ProjectConfigurationCustomizer getProjectConfigurationCustomizer() { - return getDevice().getProjectConfigurationCustomizer(project, this); - } - - @Override +// @Override public boolean canBeDeleted() { return true; } - @Override +// @Override public void delete() { try { file.delete(); @@ -185,13 +167,4 @@ } } - @Override - public void deactivate() { - } - - @Override - public boolean isHighlightSelectionEnabled() { - return true; - } - } diff --git a/cordova/src/org/netbeans/modules/cordova/project/ClientProjectPlatformImpl.java b/cordova/src/org/netbeans/modules/cordova/project/MobileConfigurationsProvider.java rename from cordova/src/org/netbeans/modules/cordova/project/ClientProjectPlatformImpl.java rename to cordova/src/org/netbeans/modules/cordova/project/MobileConfigurationsProvider.java --- a/cordova/src/org/netbeans/modules/cordova/project/ClientProjectPlatformImpl.java +++ b/cordova/src/org/netbeans/modules/cordova/project/MobileConfigurationsProvider.java @@ -46,6 +46,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -56,8 +57,7 @@ import org.netbeans.api.project.Project; import org.netbeans.modules.cordova.platforms.ConfigUtils; import org.netbeans.modules.cordova.platforms.PlatformManager; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectConfigurationImplementation; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectPlatformImplementation; +import org.netbeans.spi.project.ProjectConfigurationProvider; import org.openide.filesystems.FileChangeAdapter; import org.openide.filesystems.FileChangeListener; import org.openide.filesystems.FileEvent; @@ -70,14 +70,14 @@ /** * @author Jan Becicka */ -public class ClientProjectPlatformImpl implements ClientProjectPlatformImplementation { +public class MobileConfigurationsProvider implements ProjectConfigurationProvider{ private Project p; - private Map configs; + private Map configs; private FileObject configDir; private FileObject nbProjectDir; private PropertyChangeSupport support = new PropertyChangeSupport(this); - private static final Logger LOGGER = Logger.getLogger(ClientProjectPlatformImpl.class.getName()); + private static final Logger LOGGER = Logger.getLogger(MobileConfigurationsProvider.class.getName()); private FileChangeListener fclWeakNB; private FileChangeListener fclWeakConfig; @@ -121,12 +121,12 @@ calculateConfigs(); Set newConfigs = configs.keySet(); if (!oldConfigs.equals(newConfigs)) { - LOGGER.log(Level.FINER, "Firing " + ClientProjectPlatformImplementation.PROP_CONFIGURATIONS + ": {0} -> {1}", new Object[]{oldConfigs, newConfigs}); - support.firePropertyChange(ClientProjectPlatformImplementation.PROP_CONFIGURATIONS, null, null); + LOGGER.log(Level.FINER, "Firing " + ProjectConfigurationProvider.PROP_CONFIGURATIONS + ": {0} -> {1}", new Object[]{oldConfigs, newConfigs}); + support.firePropertyChange(ProjectConfigurationProvider.PROP_CONFIGURATIONS, null, null); } } - public ClientProjectPlatformImpl(Project p) { + public MobileConfigurationsProvider(Project p) { this.p = p; this.nbProjectDir = p.getProjectDirectory().getFileObject("nbproject"); // NOI18N if (nbProjectDir != null) { @@ -143,13 +143,13 @@ } private void calculateConfigs() { - configs = new HashMap(); + configs = new HashMap(); if (configDir != null) { for (FileObject kid : configDir.getChildren()) { if (!kid.hasExt("properties")) { continue; } - ClientProjectConfigurationImpl conf = ClientProjectConfigurationImpl.create(p, kid); + MobileConfigurationImpl conf = MobileConfigurationImpl.create(p, kid); configs.put(conf.getId(), conf); } } @@ -157,11 +157,11 @@ } @Override - public List getConfigurations() { + public Collection getConfigurations() { if (configs == null) { calculateConfigs(); } - List l = new ArrayList(configs.values()); + Collection l = new ArrayList(configs.values()); return l; } @@ -175,12 +175,12 @@ support.removePropertyChangeListener(lst); } - @Override +// @Override public List getNewConfigurationTypes() { return Arrays.asList(new String[]{PlatformManager.ANDROID_TYPE, PlatformManager.IOS_TYPE}); } - @Override +// @Override public String createConfiguration(String configurationType, String configurationName) { EditableProperties props = new EditableProperties(true); props.put("type", configurationType); //NOI18N @@ -188,11 +188,34 @@ FileObject conf; try { conf = ConfigUtils.createConfigFile(p.getProjectDirectory(), configurationType, props); - ClientProjectConfigurationImpl cfg = ClientProjectConfigurationImpl.create(p, conf); + MobileConfigurationImpl cfg = MobileConfigurationImpl.create(p, conf); return cfg.getId(); } catch (IOException ex) { Exceptions.printStackTrace(ex); } return null; } + + @Override + public MobileConfigurationImpl getActiveConfiguration() { + return null; + } + + @Override + public void setActiveConfiguration(MobileConfigurationImpl configuration) throws IllegalArgumentException, IOException { + } + + @Override + public boolean hasCustomizer() { + return false; + } + + @Override + public void customize() { + } + + @Override + public boolean configurationsAffectAction(String command) { + return false; + } } diff --git a/javascript.jstestdriver/src/org/netbeans/modules/javascript/jstestdriver/JSTestDriverCustomizerPanel.java b/javascript.jstestdriver/src/org/netbeans/modules/javascript/jstestdriver/JSTestDriverCustomizerPanel.java --- a/javascript.jstestdriver/src/org/netbeans/modules/javascript/jstestdriver/JSTestDriverCustomizerPanel.java +++ b/javascript.jstestdriver/src/org/netbeans/modules/javascript/jstestdriver/JSTestDriverCustomizerPanel.java @@ -219,19 +219,12 @@ private static List createModel() { boolean noSelectedBrowser = true; List model = new ArrayList(); - for (WebBrowser browser : WebBrowsers.getInstance().getAll(false)) { + for (WebBrowser browser : WebBrowsers.getInstance().getAll(false, true, false, true)) { if (browser.isEmbedded()) { continue; } - if (browser.getBrowserFamily() == BrowserFamilyId.CHROME || browser.getBrowserFamily() == BrowserFamilyId.CHROMIUM) { - boolean selected = NbPreferences.forModule(JSTestDriverCustomizerPanel.class).getBoolean(getBrowserPropertyName(browser, true), noSelectedBrowser ? true : false); - if (selected) { - noSelectedBrowser = false; - } - model.add(new TableRow(browser, selected, true)); - } model.add(new TableRow(browser, - NbPreferences.forModule(JSTestDriverCustomizerPanel.class).getBoolean(getBrowserPropertyName(browser, false), false), false)); + NbPreferences.forModule(JSTestDriverCustomizerPanel.class).getBoolean(getBrowserPropertyName(browser, false), false), browser.hasNetBeansIntegration())); } return model; } diff --git a/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/customizer/impl/CustomizerRunWeb.java b/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/customizer/impl/CustomizerRunWeb.java --- a/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/customizer/impl/CustomizerRunWeb.java +++ b/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/customizer/impl/CustomizerRunWeb.java @@ -105,7 +105,7 @@ if (selectedBrowser == null) { selectedBrowser = WebBrowserSupport.getDefaultBrowserId(); } - browserModel = WebBrowserSupport.createBrowserModel(selectedBrowser); + browserModel = WebBrowserSupport.createBrowserModel(selectedBrowser, true); browserCBox.setModel(browserModel); browserCBox.setRenderer(WebBrowserSupport.createBrowserRenderer()); diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideConfigurationProvider.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideConfigurationProvider.java deleted file mode 100644 --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideConfigurationProvider.java +++ /dev/null @@ -1,254 +0,0 @@ -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. - * - * Copyright 2012 Oracle and/or its affiliates. All rights reserved. - * - * Oracle and Java are registered trademarks of Oracle and/or its affiliates. - * Other names may be trademarks of their respective owners. - * - * The contents of this file are subject to the terms of either the GNU - * General Public License Version 2 only ("GPL") or the Common - * Development and Distribution License("CDDL") (collectively, the - * "License"). You may not use this file except in compliance with the - * License. You can obtain a copy of the License at - * http://www.netbeans.org/cddl-gplv2.html - * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the - * specific language governing permissions and limitations under the - * License. When distributing the software, include this License Header - * Notice in each file and include the License file at - * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the GPL Version 2 section of the License file that - * accompanied this code. If applicable, add the following below the - * License Header, with the fields enclosed by brackets [] replaced by - * your own identifying information: - * "Portions Copyrighted [year] [name of copyright owner]" - * - * If you wish your version of this file to be governed by only the CDDL - * or only the GPL Version 2, indicate your decision by adding - * "[Contributor] elects to include this software in this distribution - * under the [CDDL or GPL Version 2] license." If you do not indicate a - * single choice of license, a recipient has the option to distribute - * your version of this file under either the CDDL, the GPL Version 2 or - * to extend the choice of license to its licensees as provided above. - * However, if you add GPL Version 2 code and therefore, elected the GPL - * Version 2 license, then the option applies only if the new code is - * made subject to such option by the copyright holder. - * - * Contributor(s): - * - * Portions Copyrighted 2012 Sun Microsystems, Inc. - */ -package org.netbeans.modules.web.clientproject; - -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.netbeans.api.project.ProjectManager; -import org.netbeans.modules.web.clientproject.browser.ClientProjectConfigurationImpl; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectConfigurationImplementation; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectPlatformImplementation; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectPlatformProvider; -import org.netbeans.modules.web.clientproject.ui.customizer.CompositePanelProviderImpl; -import org.netbeans.modules.web.clientproject.ui.customizer.CustomizerProviderImpl; -import org.netbeans.spi.project.ActionProvider; -import org.netbeans.spi.project.ProjectConfigurationProvider; -import org.netbeans.spi.project.support.ant.AntProjectHelper; -import org.netbeans.spi.project.support.ant.EditableProperties; -import org.openide.util.Lookup; -import org.openide.util.LookupEvent; -import org.openide.util.LookupListener; -import org.openide.util.Utilities; - -/** - * - * @author Jan Becicka - */ -public final class ClientSideConfigurationProvider implements ProjectConfigurationProvider, PropertyChangeListener { - - private static final Logger LOGGER = Logger.getLogger(ClientSideConfigurationProvider.class.getName()); - - public static final String PROP_CONFIG = "config"; //NOI18N - public static final String CONFIG_PROPS_PATH = AntProjectHelper.PRIVATE_PROPERTIES_PATH; // NOI18N - - private Lookup.Result res = - Lookup.getDefault().lookupResult(ClientProjectPlatformProvider.class); - - private final ClientSideProject p; - private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); - private Map configs; - private List orderedConfigurations; - - private ClientProjectConfigurationImplementation lastConfig; - - public ClientSideConfigurationProvider(ClientSideProject p) { - this.p = p; - res.addLookupListener(new LookupListener() { - @Override - public void resultChanged(LookupEvent ev) { - refreshConfigurations(); - } - }); - lastConfig = getActiveConfiguration(); - p.getEvaluator().addPropertyChangeListener(new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - if (PROP_CONFIG.equals(evt.getPropertyName())) { - ClientProjectConfigurationImplementation cfg = getActiveConfiguration(); - if (lastConfig != null && cfg != null && lastConfig.getId().equals(cfg.getId())) { - // #220990 - configurations are the same - do not fire event - return; - } - lastConfig = cfg; - LOGGER.log(Level.FINER, "Refiring " + PROP_CONFIG + " -> " + ProjectConfigurationProvider.PROP_CONFIGURATION_ACTIVE); //NOI18N - pcs.firePropertyChange(ProjectConfigurationProvider.PROP_CONFIGURATION_ACTIVE, null, null); - } - } - }); - } - - private void calculateConfigs() { - configs = new HashMap(); - orderedConfigurations = new ArrayList(); - for (ClientProjectPlatformProvider prov : res.allInstances()) { - for (ClientProjectPlatformImplementation platform : prov.getPlatforms(p)) { - platform.removePropertyChangeListener(this); - platform.addPropertyChangeListener(this); - for (ClientProjectConfigurationImplementation cfg : platform.getConfigurations()) { - configs.put(cfg.getId(), cfg); - orderedConfigurations.add(cfg); - } - } - } - LOGGER.log(Level.FINEST, "Calculated configurations: {0}", configs); //NOI18N - } - - @Override - public Collection getConfigurations() { - if (configs==null) { - calculateConfigs(); - } - List l = new ArrayList(); - l.addAll(orderedConfigurations); - return l; - } - - @Override - public ClientProjectConfigurationImplementation getActiveConfiguration() { - if (configs == null) { - calculateConfigs(); - } - String config = p.getEvaluator().getProperty(PROP_CONFIG); - if (config != null && configs.containsKey(config)) { - return configs.get(config); - } - return getDefaultConfiguration(orderedConfigurations); - } - - @Override - public void setActiveConfiguration(ClientProjectConfigurationImplementation c) throws IllegalArgumentException, IOException { - final String n = c.getId(); - EditableProperties ep = p.getProjectHelper().getProperties(CONFIG_PROPS_PATH); - if (Utilities.compareObjects(n, ep.getProperty(PROP_CONFIG))) { - return; - } - ep.setProperty(PROP_CONFIG, n); - p.getProjectHelper().putProperties(CONFIG_PROPS_PATH, ep); - ProjectManager.getDefault().saveProject(p); - assert p.getProjectDirectory().getFileObject(CONFIG_PROPS_PATH) != null; - } - - @Override - public boolean hasCustomizer() { - return true; - } - - @Override - public void customize() { - p.getLookup().lookup(CustomizerProviderImpl.class).showCustomizer(CompositePanelProviderImpl.RUN); - } - - @Override - public boolean configurationsAffectAction(String command) { - return command.equals(ActionProvider.COMMAND_RUN) - || command.equals(ActionProvider.COMMAND_BUILD) - || command.equals(ActionProvider.COMMAND_CLEAN) - || command.equals(ActionProvider.COMMAND_RUN_SINGLE); - } - - @Override - public void addPropertyChangeListener(PropertyChangeListener lst) { - pcs.addPropertyChangeListener(lst); - } - - @Override - public void removePropertyChangeListener(PropertyChangeListener lst) { - pcs.removePropertyChangeListener(lst); - } - - - - @Override - public void propertyChange(PropertyChangeEvent e) { - LOGGER.log(Level.FINEST, "Received {0}", e); //NOI18N - refreshConfigurations(); - } - - private void refreshConfigurations() { - Set oldConfigs = configs != null ? configs.keySet() : Collections.emptySet(); - calculateConfigs(); - Set newConfigs = configs.keySet(); - if (!oldConfigs.equals(newConfigs)) { - LOGGER.log(Level.FINER, "Firing " + ProjectConfigurationProvider.PROP_CONFIGURATIONS + ": {0} -> {1}", new Object[] {oldConfigs, newConfigs}); //NOI18N - pcs.firePropertyChange(ProjectConfigurationProvider.PROP_CONFIGURATIONS, null, null); - } - } - - public String[] getNewConfigurationTypes() { - List types = new ArrayList(); - for (ClientProjectPlatformProvider prov : res.allInstances()) { - for (ClientProjectPlatformImplementation platform : prov.getPlatforms(p)) { - types.addAll(platform.getNewConfigurationTypes()); - } - } - return types.toArray(new String[types.size()]); - } - - public String createNewConfiguration(String type, String newName) { - for (ClientProjectPlatformProvider prov : res.allInstances()) { - for (ClientProjectPlatformImplementation platform : prov.getPlatforms(p)) { - String id = platform.createConfiguration(type, newName); - if (id != null) { - return id; - } - } - } - assert false : "should never happen: no platform can create configuration of type "+type+" and name it "+newName; //NOI18N - return null; - } - - private ClientProjectConfigurationImplementation getDefaultConfiguration(List cfgs) { - for (ClientProjectConfigurationImplementation cfg : cfgs) { - if (cfg instanceof ClientProjectConfigurationImpl && - ((ClientProjectConfigurationImpl)cfg).canBeDefaultConfiguration()) { - return cfg; - } - } - // fallback on first one: - if (cfgs.size() > 0) { - return cfgs.get(0); - } else { - return null; - } - } -} diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideProject.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideProject.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideProject.java +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideProject.java @@ -69,11 +69,14 @@ import org.netbeans.api.search.provider.SearchInfo; import org.netbeans.api.search.provider.SearchInfoUtils; import org.netbeans.api.search.provider.SearchListener; +import org.netbeans.modules.web.browser.api.WebBrowser; +import org.netbeans.modules.web.browser.api.WebBrowserSupport; import org.netbeans.modules.web.clientproject.api.ClientSideModule; import org.netbeans.modules.web.clientproject.problems.ProjectPropertiesProblemProvider; import org.netbeans.modules.web.clientproject.remote.RemoteFiles; import org.netbeans.modules.web.clientproject.spi.RefreshOnSaveSupport; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectConfigurationImplementation; +import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectEnhancedBrowserImplementation; +import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectEnhancedBrowserProvider; import org.netbeans.modules.web.clientproject.spi.platform.RefreshOnSaveListener; import org.netbeans.modules.web.clientproject.ui.ClientSideProjectLogicalView; import org.netbeans.modules.web.clientproject.ui.action.ProjectOperations; @@ -83,6 +86,7 @@ import org.netbeans.modules.web.common.spi.ProjectWebRootProvider; import org.netbeans.spi.project.AuxiliaryConfiguration; import org.netbeans.spi.project.ProjectConfigurationProvider; +import org.netbeans.spi.project.support.LookupProviderSupport; import org.netbeans.spi.project.support.ant.AntBasedProjectRegistration; import org.netbeans.spi.project.support.ant.AntProjectHelper; import org.netbeans.spi.project.support.ant.ProjectXmlSavedHook; @@ -104,6 +108,7 @@ import org.openide.util.Lookup; import org.openide.util.Mutex; import org.openide.util.lookup.Lookups; +import org.openide.util.lookup.ProxyLookup; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -125,50 +130,80 @@ final AntProjectHelper projectHelper; private final ReferenceHelper referenceHelper; private final PropertyEvaluator eval; - private final Lookup lookup; + private final DynamicProjectLookup lookup; volatile String name; private RefreshOnSaveListener refreshOnSaveListener; private ClassPath sourcePath; private RemoteFiles remoteFiles; - private ClientSideConfigurationProvider configurationProvider; - private ClientProjectConfigurationImplementation lastActiveConfiguration; + private ClientProjectEnhancedBrowserImplementation projectEnhancedBrowserImpl; + private WebBrowser projectWebBrowser; public ClientSideProject(AntProjectHelper helper) { this.projectHelper = helper; AuxiliaryConfiguration configuration = helper.createAuxiliaryConfiguration(); eval = createEvaluator(); referenceHelper = new ReferenceHelper(helper, configuration, eval); - configurationProvider = new ClientSideConfigurationProvider(this); lookup = createLookup(configuration); + ClientProjectEnhancedBrowserImplementation ebi = getEnhancedBrowserImpl(); + if (ebi != null) { + lookup.setConfigurationProvider(ebi.getProjectConfigurationProvider()); + } remoteFiles = new RemoteFiles(this); - lastActiveConfiguration = getProjectConfigurations().getActiveConfiguration(); - configurationProvider.addPropertyChangeListener(new PropertyChangeListener() { + eval.addPropertyChangeListener(new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { - if (ProjectConfigurationProvider.PROP_CONFIGURATION_ACTIVE.equals(evt.getPropertyName())) { + if (ClientSideProjectConstants.PROJECT_SELECTED_BROWSER.equals(evt.getPropertyName())) { refreshOnSaveListener = null; - if (lastActiveConfiguration != null) { - lastActiveConfiguration.deactivate(); + ClientProjectEnhancedBrowserImplementation ebi = projectEnhancedBrowserImpl; + if (ebi != null) { + ebi.deactivate(); } - lastActiveConfiguration = getProjectConfigurations().getActiveConfiguration(); - if (lastActiveConfiguration != null) { + projectEnhancedBrowserImpl = null; + projectWebBrowser = null; + WebBrowser wb = getProjectWebBrowser(); + if (wb != null) { ClientSideProjectUtilities.logUsage(ClientSideProject.class, "USG_PROJECT_HTML5_CONFIGURATION_CHANGE", // NOI18N - new Object[] { lastActiveConfiguration.getBrowserId()}); + new Object[] { wb.getId()}); + } + ebi = getEnhancedBrowserImpl(); + if (ebi != null) { + lookup.setConfigurationProvider(ebi.getProjectConfigurationProvider()); } } } }); } - public final ClientSideConfigurationProvider getProjectConfigurations() { - return configurationProvider; + public synchronized ClientProjectEnhancedBrowserImplementation getEnhancedBrowserImpl() { + if (projectEnhancedBrowserImpl == null) { + projectEnhancedBrowserImpl = createEnhancedBrowserImpl(this, getProjectWebBrowser()); + } + return projectEnhancedBrowserImpl; + } + + public static ClientProjectEnhancedBrowserImplementation createEnhancedBrowserImpl(Project p, WebBrowser wb) { + for (ClientProjectEnhancedBrowserProvider provider : p.getLookup().lookupAll(ClientProjectEnhancedBrowserProvider.class)) { + ClientProjectEnhancedBrowserImplementation impl = provider.getEnhancedBrowser(wb); + if (impl != null) { + return impl; + } + } + return null; + } + + public synchronized WebBrowser getProjectWebBrowser() { + if (projectWebBrowser == null) { + String id = getSelectedBrowser(); + projectWebBrowser = WebBrowserSupport.getBrowser(id); + } + return projectWebBrowser; } private RefreshOnSaveListener getRefreshOnSaveListener() { - ClientProjectConfigurationImplementation cfg = configurationProvider.getActiveConfiguration(); - if (cfg != null) { - return cfg.getRefreshOnSaveListener(); + ClientProjectEnhancedBrowserImplementation ebi = getEnhancedBrowserImpl(); + if (ebi != null) { + return ebi.getRefreshOnSaveListener(); } else { return null; } @@ -215,6 +250,11 @@ return s; } + public String getSelectedBrowser() { + String s = getEvaluator().getProperty(ClientSideProjectConstants.PROJECT_SELECTED_BROWSER); + return s; + } + public String getWebContextRoot() { String ctx = getEvaluator().getProperty(ClientSideProjectConstants.PROJECT_WEB_ROOT); if (ctx == null) { @@ -294,8 +334,8 @@ projectHelper.getPropertyProvider(AntProjectHelper.PROJECT_PROPERTIES_PATH)); } - private Lookup createLookup(AuxiliaryConfiguration configuration) { - return Lookups.fixed(new Object[] { + private DynamicProjectLookup createLookup(AuxiliaryConfiguration configuration) { + Lookup base = Lookups.fixed(new Object[] { this, new Info(), new ClientSideProjectXmlSavedHook(), @@ -312,10 +352,8 @@ new ClientSideProjectActionProvider(this), new OpenHookImpl(this), new CustomizerProviderImpl(this), - new ClientSideConfigurationProvider(this), //getBrowserSupport(), new ClassPathProviderImpl(this), - configurationProvider, new PageInspectorCustomizerImpl(this), new ProjectWebRootProviderImpl(), new ClientSideProjectSources(this, projectHelper, eval), @@ -324,7 +362,29 @@ UILookupMergerSupport.createProjectProblemsProviderMerger(), SharabilityQueryImpl.create(projectHelper, eval, ClientSideProjectConstants.PROJECT_SITE_ROOT_FOLDER, ClientSideProjectConstants.PROJECT_TEST_FOLDER, ClientSideProjectConstants.PROJECT_CONFIG_FOLDER), + new ClientSideProjectBrowserProvider(this), }); + return new DynamicProjectLookup(this, + LookupProviderSupport.createCompositeLookup(base, "Projects/org-netbeans-modules-web-clientproject/Lookup")); + } + + private static class DynamicProjectLookup extends ProxyLookup { + private Lookup base; + private ClientSideProject project; + + private DynamicProjectLookup(ClientSideProject project, Lookup base) { + super(base); + this.project = project; + this.base = base; + } + + public void setConfigurationProvider(ProjectConfigurationProvider provider) { + if (provider == null) { + setLookups(base); + } else { + setLookups(base, Lookups.fixed(provider)); + } + } } ClassPath getSourceClassPath() { @@ -430,9 +490,9 @@ addSiteRootListener(); GlobalPathRegistry.getDefault().register(ClassPathProviderImpl.SOURCE_CP, new ClassPath[]{project.getSourceClassPath()}); String browserId = ""; - ClientProjectConfigurationImplementation cfg = project.getProjectConfigurations().getActiveConfiguration(); - if (cfg != null) { - browserId = cfg.getBrowserId(); + WebBrowser wb = project.getProjectWebBrowser(); + if (wb != null) { + browserId = wb.getId(); } ClientSideProjectUtilities.logUsage(ClientSideProject.class, "USG_PROJECT_HTML5_OPEN", // NOI18N new Object[] { browserId, diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideProjectActionProvider.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideProjectActionProvider.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideProjectActionProvider.java +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideProjectActionProvider.java @@ -42,7 +42,7 @@ package org.netbeans.modules.web.clientproject; import org.netbeans.api.project.ui.ProjectProblems; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectConfigurationImplementation; +import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectEnhancedBrowserImplementation; import org.netbeans.spi.project.ActionProvider; import org.netbeans.spi.project.ui.support.DefaultProjectOperations; import org.openide.DialogDisplayer; @@ -79,7 +79,7 @@ } private ActionProvider getActionProvider() { - ClientProjectConfigurationImplementation cfg = project.getProjectConfigurations().getActiveConfiguration(); + ClientProjectEnhancedBrowserImplementation cfg = project.getEnhancedBrowserImpl(); if (cfg != null) { return cfg.getActionProvider(); } else { diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideProjectBrowserProvider.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideProjectBrowserProvider.java new file mode 100644 --- /dev/null +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideProjectBrowserProvider.java @@ -0,0 +1,129 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2013 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Contributor(s): + * + * Portions Copyrighted 2013 Sun Microsystems, Inc. + */ +package org.netbeans.modules.web.clientproject; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.io.IOException; +import java.util.Collection; +import org.netbeans.api.project.ProjectManager; +import org.netbeans.modules.web.browser.api.WebBrowser; +import org.netbeans.modules.web.browser.api.WebBrowserSupport; +import org.netbeans.modules.web.browser.api.WebBrowsers; +import org.netbeans.modules.web.browser.spi.ProjectBrowserProvider; +import static org.netbeans.modules.web.browser.spi.ProjectBrowserProvider.PROP_BROWSER_ACTIVE; +import org.netbeans.modules.web.clientproject.ui.customizer.CompositePanelProviderImpl; +import org.netbeans.modules.web.clientproject.ui.customizer.CustomizerProviderImpl; +import org.netbeans.spi.project.support.ant.AntProjectHelper; +import org.netbeans.spi.project.support.ant.EditableProperties; + +/** + * + */ +public class ClientSideProjectBrowserProvider implements ProjectBrowserProvider { + + private ClientSideProject project; + private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); + + public ClientSideProjectBrowserProvider(ClientSideProject project) { + this.project = project; + project.getEvaluator().addPropertyChangeListener(new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (evt.getPropertyName().equals(ClientSideProjectConstants.PROJECT_SELECTED_BROWSER)) { + pcs.firePropertyChange(PROP_BROWSER_ACTIVE, null, null); + } + } + }); + } + + @Override + public Collection getBrowsers() { + return WebBrowsers.getInstance().getAll(false, true, false, true); + } + + @Override + public WebBrowser getActiveBrowser() { + String selectedBrowser = project.getEvaluator().getProperty(ClientSideProjectConstants.PROJECT_SELECTED_BROWSER); + WebBrowser browser = WebBrowserSupport.getBrowser(selectedBrowser); + if (selectedBrowser == null || browser == null) { + return null; + } else { + return browser; + } + } + + @Override + public void setActiveBrowser(final WebBrowser browser) throws IllegalArgumentException, IOException { + ProjectManager.mutex().writeAccess(new Runnable() { + public void run() { + AntProjectHelper helper = project.getProjectHelper(); + EditableProperties projectProps = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); + projectProps.put(ClientSideProjectConstants.PROJECT_SELECTED_BROWSER, browser.getId()); + helper.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, projectProps); + } + }); + pcs.firePropertyChange(PROP_BROWSER_ACTIVE, null, null); + } + + @Override + public boolean hasCustomizer() { + return true; + } + + @Override + public void customize() { + project.getLookup().lookup(CustomizerProviderImpl.class).showCustomizer(CompositePanelProviderImpl.RUN); + } + + @Override + public void addPropertyChangeListener(PropertyChangeListener lst) { + pcs.addPropertyChangeListener(lst); + } + + @Override + public void removePropertyChangeListener(PropertyChangeListener lst) { + pcs.removePropertyChangeListener(lst); + } + +} diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideProjectConstants.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideProjectConstants.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideProjectConstants.java +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/ClientSideProjectConstants.java @@ -58,6 +58,7 @@ public static final String PROJECT_PROJECT_URL = "external.project.url"; //NOI18N public static final String PROJECT_AUTO_REFRESH = "browser.autorefresh"; //NOI18N public static final String PROJECT_HIGHLIGHT_SELECTION = "browser.highlightselection"; //NOI18N + public static final String PROJECT_SELECTED_BROWSER = "browser"; //NOI18N // default paths: public static final String DEFAULT_SITE_ROOT_FOLDER = "public_html"; //NOI18N diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/PageInspectorCustomizerImpl.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/PageInspectorCustomizerImpl.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/PageInspectorCustomizerImpl.java +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/PageInspectorCustomizerImpl.java @@ -46,7 +46,7 @@ import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import org.netbeans.modules.web.browser.spi.PageInspectorCustomizer; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectConfigurationImplementation; +import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectEnhancedBrowserImplementation; /** * @@ -70,7 +70,7 @@ @Override public boolean isHighlightSelectionEnabled() { - ClientProjectConfigurationImplementation cfg = project.getProjectConfigurations().getActiveConfiguration(); + ClientProjectEnhancedBrowserImplementation cfg = project.getEnhancedBrowserImpl(); return cfg == null ? true : cfg.isHighlightSelectionEnabled(); } diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/BrowserActionProvider.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/BrowserActionProvider.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/BrowserActionProvider.java +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/BrowserActionProvider.java @@ -65,11 +65,11 @@ final private ClientSideProject project; private final BrowserSupport support; - private ClientProjectConfigurationImpl cfg; + private ClientProjectEnhancedBrowserImpl cfg; private RequestProcessor RP = new RequestProcessor("js unit testing"); //NOI18N private static final Logger LOGGER = Logger.getLogger(BrowserActionProvider.class.getName()); - public BrowserActionProvider(ClientSideProject project, BrowserSupport support, ClientProjectConfigurationImpl cfg) { + public BrowserActionProvider(ClientSideProject project, BrowserSupport support, ClientProjectEnhancedBrowserImpl cfg) { this.project = project; this.support = support; this.cfg = cfg; diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/ClientProjectConfigurationImpl.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/ClientProjectEnhancedBrowserImpl.java rename from web.clientproject/src/org/netbeans/modules/web/clientproject/browser/ClientProjectConfigurationImpl.java rename to web.clientproject/src/org/netbeans/modules/web/clientproject/browser/ClientProjectEnhancedBrowserImpl.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/ClientProjectConfigurationImpl.java +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/ClientProjectEnhancedBrowserImpl.java @@ -43,115 +43,64 @@ package org.netbeans.modules.web.clientproject.browser; import javax.swing.JPanel; -import org.netbeans.modules.web.browser.api.BrowserFamilyId; import org.netbeans.modules.web.browser.api.BrowserSupport; import org.netbeans.modules.web.browser.api.WebBrowser; import org.netbeans.modules.web.clientproject.ClientSideProject; import org.netbeans.modules.web.clientproject.ClientSideProjectConstants; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectConfigurationImplementation; +import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectEnhancedBrowserImplementation; import org.netbeans.modules.web.clientproject.spi.platform.ProjectConfigurationCustomizer; import org.netbeans.modules.web.clientproject.spi.platform.RefreshOnSaveListener; -import org.netbeans.modules.web.common.spi.ServerURLMappingImplementation; import org.netbeans.modules.web.clientproject.ui.browser.BrowserConfigurationPanel; import org.netbeans.spi.project.ActionProvider; +import org.netbeans.spi.project.ProjectConfigurationProvider; import org.netbeans.spi.project.support.ant.AntProjectHelper; import org.netbeans.spi.project.support.ant.EditableProperties; -import org.netbeans.spi.project.support.ant.PropertyUtils; -import org.openide.util.NbBundle; -public class ClientProjectConfigurationImpl implements ClientProjectConfigurationImplementation { +public class ClientProjectEnhancedBrowserImpl implements ClientProjectEnhancedBrowserImplementation { final private ClientSideProject project; final private WebBrowser browser; - final private ClientProjectPlatformImpl platform; private BrowserSupport browserSupport; private ProjectConfigurationCustomizerImpl cust = null; - private ServerURLMappingImplementation mapping; - private BrowserIntegration browserIntegration; - private int order; - private boolean disableIntegration; - public static enum BrowserIntegration { - ENABLED, - DISABLE, - NONE - } - - public ClientProjectConfigurationImpl(ClientSideProject project, WebBrowser browser, - ClientProjectPlatformImpl platform, BrowserIntegration browserIntegration, int order, boolean disableIntegration) { + public ClientProjectEnhancedBrowserImpl(ClientSideProject project, WebBrowser browser) { this.project = project; this.browser = browser; - this.platform = platform; - this.browserIntegration = browserIntegration; - this.order = order; - this.disableIntegration = disableIntegration; - } - - @Override - public String getId() { - return PropertyUtils.getUsablePropertyName(browser.getId()+(disableIntegration ? ".dis" : "")); //NOI18N - } - - @Override - public String getBrowserId() { - return browser.getId()+(disableIntegration ? "" : ".INTEGRATED"); //NOI18N } @Override public void save() { - if (cust != null && getBrowserIntegration() == BrowserIntegration.ENABLED) { + if (cust != null && browser.hasNetBeansIntegration()) { EditableProperties p = project.getProjectHelper().getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); - p.put(ClientSideProjectConstants.PROJECT_AUTO_REFRESH+"."+getId(), Boolean.toString(cust.panel.isAutoRefresh())); //NOI18N - p.put(ClientSideProjectConstants.PROJECT_HIGHLIGHT_SELECTION+"."+getId(), Boolean.toString(cust.panel.isHighlightSelection())); //NOI18N + p.put(ClientSideProjectConstants.PROJECT_AUTO_REFRESH+"."+browser.getId(), Boolean.toString(cust.panel.isAutoRefresh())); //NOI18N + p.put(ClientSideProjectConstants.PROJECT_HIGHLIGHT_SELECTION+"."+browser.getId(), Boolean.toString(cust.panel.isHighlightSelection())); //NOI18N project.getProjectHelper().putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, p); } } - /** - * @return null mean that browser in this configuration does not have nifty - * NetBeans integration; TRUE means it has and it is in enabled; FALSE means it has - * but it is disabled - */ - public BrowserIntegration getBrowserIntegration() { - return browserIntegration; - } - - public boolean canBeDefaultConfiguration() { - return browserIntegration == BrowserIntegration.ENABLED && - (browser.getBrowserFamily() == BrowserFamilyId.CHROME || browser.getBrowserFamily() == BrowserFamilyId.CHROMIUM); - } - public boolean isAutoRefresh() { - String val = project.getEvaluator().getProperty(ClientSideProjectConstants.PROJECT_AUTO_REFRESH+"."+getId()); //NOI18N + String val = project.getEvaluator().getProperty(ClientSideProjectConstants.PROJECT_AUTO_REFRESH+"."+browser.getId()); //NOI18N if (val != null) { - return Boolean.parseBoolean(val) && getBrowserIntegration() == BrowserIntegration.ENABLED; + return Boolean.parseBoolean(val); } else { // if browserIntegration is available then default is true for AutoRefresh - return getBrowserIntegration() == BrowserIntegration.ENABLED; + return browser.hasNetBeansIntegration(); } } @Override public boolean isHighlightSelectionEnabled() { - String val = project.getEvaluator().getProperty(ClientSideProjectConstants.PROJECT_HIGHLIGHT_SELECTION+"."+getId()); //NOI18N + String val = project.getEvaluator().getProperty(ClientSideProjectConstants.PROJECT_HIGHLIGHT_SELECTION+"."+browser.getId()); //NOI18N if (val != null) { - return Boolean.parseBoolean(val) && getBrowserIntegration() == BrowserIntegration.ENABLED; + return Boolean.parseBoolean(val); } else { // if browserIntegration is available then default is true for HighlightSelectionEnabled - return getBrowserIntegration() == BrowserIntegration.ENABLED; + return browser.hasNetBeansIntegration(); } } @Override - public String getDisplayName() { - if (browserIntegration == BrowserIntegration.ENABLED && browser.getBrowserFamily() != BrowserFamilyId.JAVAFX_WEBVIEW) { - return NbBundle.getMessage(ClientProjectConfigurationImpl.class, "WITH_NETBEANS_INTEGRATION", browser.getName()); - } - return browser.getName(); - } - - @Override public RefreshOnSaveListener getRefreshOnSaveListener() { return new RefreshOnSaveListenerImpl(project, getBrowserSupport(), this); } @@ -174,31 +123,22 @@ if (browser.isEmbedded()) { browserSupport = BrowserSupport.getDefaultEmbedded(); } else { - browserSupport = BrowserSupport.create(browser, disableIntegration); + browserSupport = BrowserSupport.create(browser, false); } } return browserSupport; } @Override - public boolean canBeDeleted() { - return false; - } - - @Override - public void delete() { - throw new UnsupportedOperationException("not allowed"); //NOI18N - } - - @Override public void deactivate() { if (browserSupport != null) { getBrowserSupport().close(false); } } - int getOrder() { - return order; + @Override + public ProjectConfigurationProvider getProjectConfigurationProvider() { + return null; } private class ProjectConfigurationCustomizerImpl implements ProjectConfigurationCustomizer { @@ -208,7 +148,7 @@ @Override public JPanel createPanel() { panel = new BrowserConfigurationPanel(project, - ClientProjectConfigurationImpl.this, ClientProjectConfigurationImpl.this.browser); + ClientProjectEnhancedBrowserImpl.this, ClientProjectEnhancedBrowserImpl.this.browser); return panel; } diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/ClientProjectPlatformProviderImpl.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/ClientProjectEnhancedBrowserProviderImpl.java rename from web.clientproject/src/org/netbeans/modules/web/clientproject/browser/ClientProjectPlatformProviderImpl.java rename to web.clientproject/src/org/netbeans/modules/web/clientproject/browser/ClientProjectEnhancedBrowserProviderImpl.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/ClientProjectPlatformProviderImpl.java +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/ClientProjectEnhancedBrowserProviderImpl.java @@ -42,32 +42,29 @@ package org.netbeans.modules.web.clientproject.browser; -import java.util.Collection; -import java.util.Collections; -import java.util.Map; -import java.util.WeakHashMap; import org.netbeans.api.project.Project; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectPlatformImplementation; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectPlatformProvider; -import org.openide.util.lookup.ServiceProvider; +import org.netbeans.modules.web.browser.api.WebBrowser; +import org.netbeans.modules.web.clientproject.ClientSideProject; +import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectEnhancedBrowserImplementation; +import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectEnhancedBrowserProvider; +import org.netbeans.spi.project.ProjectServiceProvider; -// btw. ServiceProvider is used here instead of ProjectsServiceProvider so that position can be specified -// and this provider is before one from Cordova -@ServiceProvider( - service=ClientProjectPlatformProvider.class, - position=1000) -public class ClientProjectPlatformProviderImpl implements ClientProjectPlatformProvider { +@ProjectServiceProvider( + projectType = "org-netbeans-modules-web-clientproject", + service=ClientProjectEnhancedBrowserProvider.class) +public class ClientProjectEnhancedBrowserProviderImpl implements ClientProjectEnhancedBrowserProvider { + private Project p; - private Map cache = new WeakHashMap(); + public ClientProjectEnhancedBrowserProviderImpl(Project p) { + this.p = p; + } @Override - public Collection getPlatforms(Project p) { - ClientProjectPlatformImplementation res = cache.get(p); - if (res == null) { - res = new ClientProjectPlatformImpl(p); - cache.put(p, res); + public ClientProjectEnhancedBrowserImplementation getEnhancedBrowser(WebBrowser webBrowser) { + if (webBrowser.getBrowserFamily().isMobile()) { + return null; } - return Collections.singletonList(res); + return new ClientProjectEnhancedBrowserImpl((ClientSideProject)p, webBrowser); } } diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/ClientProjectPlatformImpl.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/ClientProjectPlatformImpl.java deleted file mode 100644 --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/ClientProjectPlatformImpl.java +++ /dev/null @@ -1,141 +0,0 @@ - -/* - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. - * - * Copyright 2012 Oracle and/or its affiliates. All rights reserved. - * - * Oracle and Java are registered trademarks of Oracle and/or its affiliates. - * Other names may be trademarks of their respective owners. - * - * The contents of this file are subject to the terms of either the GNU - * General Public License Version 2 only ("GPL") or the Common - * Development and Distribution License("CDDL") (collectively, the - * "License"). You may not use this file except in compliance with the - * License. You can obtain a copy of the License at - * http://www.netbeans.org/cddl-gplv2.html - * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the - * specific language governing permissions and limitations under the - * License. When distributing the software, include this License Header - * Notice in each file and include the License file at - * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the GPL Version 2 section of the License file that - * accompanied this code. If applicable, add the following below the - * License Header, with the fields enclosed by brackets [] replaced by - * your own identifying information: - * "Portions Copyrighted [year] [name of copyright owner]" - * - * If you wish your version of this file to be governed by only the CDDL - * or only the GPL Version 2, indicate your decision by adding - * "[Contributor] elects to include this software in this distribution - * under the [CDDL or GPL Version 2] license." If you do not indicate a - * single choice of license, a recipient has the option to distribute - * your version of this file under either the CDDL, the GPL Version 2 or - * to extend the choice of license to its licensees as provided above. - * However, if you add GPL Version 2 code and therefore, elected the GPL - * Version 2 license, then the option applies only if the new code is - * made subject to such option by the copyright holder. - * - * Contributor(s): - * - * Portions Copyrighted 2012 Sun Microsystems, Inc. - */ - -package org.netbeans.modules.web.clientproject.browser; - -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import org.netbeans.api.project.Project; -import org.netbeans.modules.web.browser.api.BrowserFamilyId; -import org.netbeans.modules.web.browser.api.BrowserSupport; -import org.netbeans.modules.web.browser.api.WebBrowser; -import org.netbeans.modules.web.browser.api.WebBrowsers; -import org.netbeans.modules.web.clientproject.ClientSideProject; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectConfigurationImplementation; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectPlatformImplementation; - -public class ClientProjectPlatformImpl implements ClientProjectPlatformImplementation { - - private Project p; - private List configs; - private PropertyChangeSupport support = new PropertyChangeSupport(this); - - public ClientProjectPlatformImpl(Project p) { - this.p = p; - WebBrowsers.getInstance().addPropertyChangeListener(new PropertyChangeListener() { - @Override - public void propertyChange(PropertyChangeEvent evt) { - if (WebBrowsers.PROP_BROWSERS.equals(evt.getPropertyName())) { - configs = null; - support.firePropertyChange(ClientProjectPlatformImplementation.PROP_CONFIGURATIONS, null, null); - } - } - }); - } - - @Override - public List getConfigurations() { - if (configs == null) { - configs = getBrowserConfigurations(); - } - return configs; - } - - @Override - public void addPropertyChangeListener(PropertyChangeListener lst) { - support.addPropertyChangeListener(lst); - } - - @Override - public void removePropertyChangeListener(PropertyChangeListener lst) { - support.removePropertyChangeListener(lst); - } - - private List getBrowserConfigurations() { - List l = new ArrayList(); - int chrome = 200; - int chromium = 300; - int others = 400; - for (WebBrowser browser : WebBrowsers.getInstance().getAll(false)) { - if (browser.getBrowserFamily() == BrowserFamilyId.JAVAFX_WEBVIEW) { - l.add(new ClientProjectConfigurationImpl((ClientSideProject)p, browser, this, - ClientProjectConfigurationImpl.BrowserIntegration.ENABLED, 100, false)); - } else if (browser.getBrowserFamily() == BrowserFamilyId.CHROME || browser.getId().endsWith("ChromeBrowser")) { //NOI18N - l.add(new ClientProjectConfigurationImpl((ClientSideProject)p, browser, this, - ClientProjectConfigurationImpl.BrowserIntegration.ENABLED, chrome++, false)); - l.add(new ClientProjectConfigurationImpl((ClientSideProject)p, browser, this, - ClientProjectConfigurationImpl.BrowserIntegration.DISABLE, chrome++, true)); - } else if (browser.getBrowserFamily() == BrowserFamilyId.CHROMIUM || browser.getId().endsWith("ChromiumBrowser")) { //NOI18N - l.add(new ClientProjectConfigurationImpl((ClientSideProject)p, browser, this, - ClientProjectConfigurationImpl.BrowserIntegration.ENABLED, chromium++, false)); - l.add(new ClientProjectConfigurationImpl((ClientSideProject)p, browser, this, - ClientProjectConfigurationImpl.BrowserIntegration.DISABLE, chromium++, true)); - } else { - l.add(new ClientProjectConfigurationImpl((ClientSideProject)p, browser, this, null, others++, false)); - } - } - Collections.sort(l, new Comparator() { - @Override - public int compare(ClientProjectConfigurationImpl o1, ClientProjectConfigurationImpl o2) { - return o1.getOrder() - o2.getOrder(); - } - }); - return l; - } - - @Override - public List getNewConfigurationTypes() { - return Collections.emptyList(); - } - - @Override - public String createConfiguration(String configurationType, String configurationName) { - return null; - } - -} diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/RefreshOnSaveListenerImpl.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/RefreshOnSaveListenerImpl.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/RefreshOnSaveListenerImpl.java +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/browser/RefreshOnSaveListenerImpl.java @@ -52,9 +52,9 @@ final private BrowserSupport support; final private Project project; - private ClientProjectConfigurationImpl cfg; + private ClientProjectEnhancedBrowserImpl cfg; - public RefreshOnSaveListenerImpl(Project project, BrowserSupport support, ClientProjectConfigurationImpl cfg) { + public RefreshOnSaveListenerImpl(Project project, BrowserSupport support, ClientProjectEnhancedBrowserImpl cfg) { this.support = support; this.project = project; this.cfg = cfg; diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/browser/BrowserConfigurationPanel.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/browser/BrowserConfigurationPanel.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/browser/BrowserConfigurationPanel.java +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/browser/BrowserConfigurationPanel.java @@ -41,11 +41,9 @@ */ package org.netbeans.modules.web.clientproject.ui.browser; -import org.netbeans.modules.web.browser.api.BrowserFamilyId; import org.netbeans.modules.web.browser.api.WebBrowser; import org.netbeans.modules.web.clientproject.ClientSideProject; -import org.netbeans.modules.web.clientproject.ClientSideProjectConstants; -import org.netbeans.modules.web.clientproject.browser.ClientProjectConfigurationImpl; +import org.netbeans.modules.web.clientproject.browser.ClientProjectEnhancedBrowserImpl; /** * @@ -53,21 +51,17 @@ */ public class BrowserConfigurationPanel extends javax.swing.JPanel { - private ClientProjectConfigurationImpl.BrowserIntegration integration; - /** * Creates new form BrowserConfigurationPanel */ - public BrowserConfigurationPanel(ClientSideProject project, ClientProjectConfigurationImpl cfg, WebBrowser browser) { + public BrowserConfigurationPanel(ClientSideProject project, ClientProjectEnhancedBrowserImpl cfg, WebBrowser browser) { initComponents(); - integration = cfg.getBrowserIntegration(); - if (integration != ClientProjectConfigurationImpl.BrowserIntegration.ENABLED) { + if (!browser.hasNetBeansIntegration()) { jAutoRefreshCheckBox.setVisible(false); jHighlightSelectionCheckBox.setVisible(false); } jAutoRefreshCheckBox.setSelected(cfg.isAutoRefresh()); jHighlightSelectionCheckBox.setSelected(cfg.isHighlightSelectionEnabled()); - updateEnablement(); } public boolean isAutoRefresh() { @@ -120,8 +114,4 @@ private javax.swing.JCheckBox jHighlightSelectionCheckBox; // End of variables declaration//GEN-END:variables - private void updateEnablement() { - jAutoRefreshCheckBox.setEnabled(integration == ClientProjectConfigurationImpl.BrowserIntegration.ENABLED); - jHighlightSelectionCheckBox.setEnabled(integration == ClientProjectConfigurationImpl.BrowserIntegration.ENABLED); - } } diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/customizer/ClientSideProjectProperties.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/customizer/ClientSideProjectProperties.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/customizer/ClientSideProjectProperties.java +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/customizer/ClientSideProjectProperties.java @@ -51,12 +51,12 @@ import java.util.logging.Logger; import org.netbeans.api.annotations.common.CheckForNull; import org.netbeans.api.project.ProjectManager; -import org.netbeans.modules.web.clientproject.ClientSideConfigurationProvider; +import org.netbeans.modules.web.browser.api.WebBrowser; import org.netbeans.modules.web.clientproject.ClientSideProject; import org.netbeans.modules.web.clientproject.ClientSideProjectConstants; import org.netbeans.modules.web.clientproject.api.jslibs.JavaScriptLibrarySelectionPanel; import org.netbeans.modules.web.clientproject.api.jslibs.JavaScriptLibrarySelectionPanel.SelectedLibrary; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectConfigurationImplementation; +import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectEnhancedBrowserImplementation; import org.netbeans.modules.web.clientproject.util.ClientSideProjectUtilities; import org.netbeans.spi.project.support.ant.AntProjectHelper; import org.netbeans.spi.project.support.ant.EditableProperties; @@ -82,10 +82,11 @@ private volatile String jsLibFolder = null; private volatile String encoding = null; private volatile String startFile = null; + private volatile String selectedBrowser = null; private volatile String webRoot = null; private volatile String projectUrl = null; private volatile ProjectServer projectServer = null; - private volatile ClientProjectConfigurationImplementation activeConfiguration = null; + private volatile ClientProjectEnhancedBrowserImplementation enhancedBrowserSettings = null; public ClientSideProjectProperties(ClientSideProject project) { @@ -140,8 +141,7 @@ @Override public Void run() throws IOException { saveProperties(); - saveConfigs(); - setActiveConfig(); + saveEnhancedBrowserConfiguration(); ProjectManager.getDefault().saveProject(project); return null; } @@ -163,6 +163,7 @@ putProperty(projectProperties, ClientSideProjectConstants.PROJECT_CONFIG_FOLDER, configFolderReference); putProperty(projectProperties, ClientSideProjectConstants.PROJECT_ENCODING, encoding); putProperty(projectProperties, ClientSideProjectConstants.PROJECT_START_FILE, startFile); + putProperty(projectProperties, ClientSideProjectConstants.PROJECT_SELECTED_BROWSER, selectedBrowser); if (projectServer != null) { putProperty(projectProperties, ClientSideProjectConstants.PROJECT_SERVER, projectServer.name()); } @@ -171,21 +172,17 @@ project.getProjectHelper().putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, projectProperties); } - void saveConfigs() { + void saveEnhancedBrowserConfiguration() { assert ProjectManager.mutex().isWriteAccess() : "Write mutex required"; //NOI18N - for (ClientProjectConfigurationImplementation config : project.getLookup().lookup(ClientSideConfigurationProvider.class).getConfigurations()) { - config.save(); + if (enhancedBrowserSettings != null) { + enhancedBrowserSettings.save(); } } - void setActiveConfig() throws IOException { - if (activeConfiguration != null) { - try { - project.getProjectConfigurations().setActiveConfiguration(activeConfiguration); - } catch (IllegalArgumentException ex) { - LOGGER.log(Level.WARNING, null, ex); - } - } + ClientProjectEnhancedBrowserImplementation createEnhancedBrowserSettings(WebBrowser wb) { + enhancedBrowserSettings = + ClientSideProject.createEnhancedBrowserImpl(project, wb); + return enhancedBrowserSettings; } public ClientSideProject getProject() { @@ -255,6 +252,17 @@ this.startFile = startFile; } + public String getSelectedBrowser() { + if (selectedBrowser == null) { + selectedBrowser = project.getSelectedBrowser(); + } + return selectedBrowser; + } + + public void setSelectedBrowser(String selectedBrowser) { + this.selectedBrowser = selectedBrowser; + } + public String getWebRoot() { if (webRoot == null) { webRoot = project.getWebContextRoot(); @@ -296,17 +304,6 @@ this.projectServer = projectServer; } - public ClientProjectConfigurationImplementation getActiveConfiguration() { - if (activeConfiguration == null) { - activeConfiguration = project.getProjectConfigurations().getActiveConfiguration(); - } - return activeConfiguration; - } - - public void setActiveConfiguration(ClientProjectConfigurationImplementation activeConfiguration) { - this.activeConfiguration = activeConfiguration; - } - public void setNewJsLibraries(List newJsLibraries) { assert newJsLibraries != null; // not needed to be locked, called always by just one caller diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/customizer/RunPanel.form b/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/customizer/RunPanel.form --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/customizer/RunPanel.form +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/customizer/RunPanel.form @@ -32,7 +32,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -149,9 +149,9 @@ - + - + diff --git a/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/customizer/RunPanel.java b/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/customizer/RunPanel.java --- a/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/customizer/RunPanel.java +++ b/web.clientproject/src/org/netbeans/modules/web/clientproject/ui/customizer/RunPanel.java @@ -56,10 +56,12 @@ import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.netbeans.api.annotations.common.CheckForNull; -import org.netbeans.modules.web.clientproject.ClientSideConfigurationProvider; +import org.netbeans.modules.web.browser.api.WebBrowser; +import org.netbeans.modules.web.browser.api.WebBrowserSupport; +import org.netbeans.modules.web.browser.api.WebBrowserSupport.BrowserComboBoxModel; import org.netbeans.modules.web.clientproject.ClientSideProject; import org.netbeans.modules.web.clientproject.api.validation.ValidationResult; -import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectConfigurationImplementation; +import org.netbeans.modules.web.clientproject.spi.platform.ClientProjectEnhancedBrowserImplementation; import org.netbeans.modules.web.clientproject.spi.platform.ProjectConfigurationCustomizer; import org.netbeans.modules.web.clientproject.ui.BrowseFolders; import org.netbeans.modules.web.clientproject.ui.customizer.ClientSideProjectProperties.ProjectServer; @@ -129,11 +131,8 @@ } private void init() { - // config - ClientSideConfigurationProvider configProvider = project.getProjectConfigurations(); - jConfigurationComboBox.setRenderer(new ConfigRenderer(jConfigurationComboBox.getRenderer())); - jConfigurationComboBox.setModel(new DefaultComboBoxModel(configProvider.getConfigurations().toArray())); - jConfigurationComboBox.setSelectedItem(uiProperties.getActiveConfiguration()); + jBrowserComboBox.setRenderer(WebBrowserSupport.createBrowserRenderer()); + jBrowserComboBox.setModel(WebBrowserSupport.createBrowserModel(uiProperties.getSelectedBrowser(), false)); updateConfigurationCustomizer(); // start file jFileToRunTextField.setText(uiProperties.getStartFile()); @@ -151,7 +150,7 @@ private void initListeners() { // config - jConfigurationComboBox.addActionListener(new ActionListener() { + jBrowserComboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { validateAndStore(); @@ -197,18 +196,20 @@ } private void storeData() { - uiProperties.setActiveConfiguration(getActiveConfiguration()); uiProperties.setStartFile(getStartFile()); uiProperties.setProjectServer(getProjectServer()); uiProperties.setProjectUrl(getProjectUrl()); uiProperties.setWebRoot(getWebRoot()); + uiProperties.setSelectedBrowser(getSelectedBrowserId()); } private void updateConfigurationCustomizer() { jConfigurationPlaceholder.removeAll(); - ClientProjectConfigurationImplementation selectedConfiguration = getActiveConfiguration(); - if (selectedConfiguration != null) { - ProjectConfigurationCustomizer customizerPanel = selectedConfiguration.getProjectConfigurationCustomizer(); + WebBrowser wb = getSelectedBrowser(); + ClientProjectEnhancedBrowserImplementation enhancedBrowser = + uiProperties.createEnhancedBrowserSettings(wb); + if (enhancedBrowser != null) { + ProjectConfigurationCustomizer customizerPanel = enhancedBrowser.getProjectConfigurationCustomizer(); if (customizerPanel != null) { jConfigurationPlaceholder.add(customizerPanel.createPanel(), BorderLayout.CENTER); } @@ -217,10 +218,6 @@ repaint(); } - private ClientProjectConfigurationImplementation getActiveConfiguration() { - return (ClientProjectConfigurationImplementation) jConfigurationComboBox.getSelectedItem(); - } - private File getSiteRoot() { return uiProperties.getResolvedSiteRootFolder(); } @@ -229,6 +226,14 @@ return jFileToRunTextField.getText(); } + private String getSelectedBrowserId() { + return ((BrowserComboBoxModel)jBrowserComboBox.getModel()).getSelectedBrowserId(); + } + + private WebBrowser getSelectedBrowser() { + return ((BrowserComboBoxModel)jBrowserComboBox.getModel()).getSelectedBrowser(); + } + @CheckForNull private File getResolvedStartFile() { String startFile = getStartFile(); @@ -282,7 +287,7 @@ jWebRootTextField = new javax.swing.JTextField(); jWebRootExampleLabel = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); - jConfigurationComboBox = new javax.swing.JComboBox(); + jBrowserComboBox = new javax.swing.JComboBox(); jProjectURLLabel = new javax.swing.JLabel(); jProjectURLTextField = new javax.swing.JTextField(); jConfigurationPlaceholder = new javax.swing.JPanel(); @@ -311,9 +316,9 @@ org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(RunPanel.class, "RunPanel.jLabel3.text")); // NOI18N - jConfigurationComboBox.addActionListener(new java.awt.event.ActionListener() { + jBrowserComboBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { - jConfigurationComboBoxActionPerformed(evt); + jBrowserComboBoxActionPerformed(evt); } }); @@ -340,12 +345,12 @@ .addComponent(jProjectURLLabel)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(jWebRootExampleLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 290, Short.MAX_VALUE) + .addComponent(jWebRootExampleLabel) .addGroup(layout.createSequentialGroup() .addComponent(jFileToRunTextField) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jBrowseButton)) - .addComponent(jConfigurationComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jBrowserComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jServerComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jProjectURLTextField) .addComponent(jWebRootTextField) @@ -357,7 +362,7 @@ .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) - .addComponent(jConfigurationComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(jBrowserComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jConfigurationPlaceholder, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(18, 18, 18) @@ -394,13 +399,13 @@ } }//GEN-LAST:event_jBrowseButtonActionPerformed - private void jConfigurationComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jConfigurationComboBoxActionPerformed + private void jBrowserComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jBrowserComboBoxActionPerformed updateConfigurationCustomizer(); - }//GEN-LAST:event_jConfigurationComboBoxActionPerformed + }//GEN-LAST:event_jBrowserComboBoxActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton jBrowseButton; - private javax.swing.JComboBox jConfigurationComboBox; + private javax.swing.JComboBox jBrowserComboBox; private javax.swing.JPanel jConfigurationPlaceholder; private javax.swing.JTextField jFileToRunTextField; private javax.swing.JLabel jLabel1; diff --git a/web.clientproject/test/qa-functional/src/org/netbeans/test/html5/GeneralHTMLProject.java b/web.clientproject/test/qa-functional/src/org/netbeans/test/html5/GeneralHTMLProject.java --- a/web.clientproject/test/qa-functional/src/org/netbeans/test/html5/GeneralHTMLProject.java +++ b/web.clientproject/test/qa-functional/src/org/netbeans/test/html5/GeneralHTMLProject.java @@ -56,8 +56,9 @@ import org.netbeans.jemmy.Waitable; import org.netbeans.jemmy.Waiter; import org.netbeans.jemmy.operators.*; -import org.netbeans.modules.web.clientproject.browser.ClientProjectConfigurationImpl; -import org.netbeans.modules.web.clientproject.browser.ClientProjectConfigurationImpl.BrowserIntegration; +import org.netbeans.modules.web.browser.api.WebBrowser; +import org.netbeans.modules.web.clientproject.browser.ClientProjectEnhancedBrowserImpl; +import org.netbeans.modules.web.clientproject.browser.ClientProjectEnhancedBrowserImpl.BrowserIntegration; import org.netbeans.modules.web.clientproject.spi.SiteTemplateImplementation; import org.netbeans.modules.web.inspect.PageInspectorImpl; import org.netbeans.modules.web.inspect.PageModel; @@ -230,14 +231,14 @@ NbDialogOperator propertiesDialogOper = new NbDialogOperator("Project Properties"); new Node(new JTreeOperator(propertiesDialogOper), "Run").select(); JComboBoxOperator browsers = new JComboBoxOperator(propertiesDialogOper, "Browser"); - ClientProjectConfigurationImpl browser; + WebBrowser browser; for (int i = 0; i < browsers.getModel().getSize(); i++) { - browser = (ClientProjectConfigurationImpl) browsers.getModel().getElementAt(i); + browser = (WebBrowser) browsers.getModel().getElementAt(i); - if (browser.getDisplayName().equals(browserName)) { + if (browser.getName().equals(browserName)) { browsers.selectItem(i); - if (browser.getBrowserIntegration() == BrowserIntegration.ENABLED) { + if (browser.getBrowserFamily().hasNetBeansAdvancedIntegration()) { (new JCheckBoxOperator(propertiesDialogOper, "Auto-refresh")).setSelected(autoRefresh); (new JCheckBoxOperator(propertiesDialogOper, "Synchronize")).setSelected(syncHover); } diff --git a/web.project/src/org/netbeans/modules/web/project/WebProject.java b/web.project/src/org/netbeans/modules/web/project/WebProject.java --- a/web.project/src/org/netbeans/modules/web/project/WebProject.java +++ b/web.project/src/org/netbeans/modules/web/project/WebProject.java @@ -632,6 +632,7 @@ QuerySupport.createBinaryForSourceQueryImplementation(getSourceRoots(), getTestSourceRoots(), helper, eval), new ProjectWebRootProviderImpl(), easelSupport, + new WebProjectBrowserProvider(this), }); Lookup ee6 = Lookups.fixed(new Object[]{ @@ -2506,8 +2507,11 @@ return browserSupport; } String selectedBrowser = evaluator().getProperty(WebProjectProperties.SELECTED_BROWSER); + if (selectedBrowser == null) { + selectedBrowser = WebBrowserSupport.getDefaultBrowserId(); + } WebBrowser browser = WebBrowserSupport.getBrowser(selectedBrowser); - if (selectedBrowser == null || browser == null) { + if (browser == null) { browserSupport = null; } else { boolean integrated = WebBrowserSupport.isIntegratedBrowser(selectedBrowser); diff --git a/web.project/src/org/netbeans/modules/web/project/WebProjectBrowserProvider.java b/web.project/src/org/netbeans/modules/web/project/WebProjectBrowserProvider.java new file mode 100644 --- /dev/null +++ b/web.project/src/org/netbeans/modules/web/project/WebProjectBrowserProvider.java @@ -0,0 +1,133 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2013 Oracle and/or its affiliates. All rights reserved. + * + * Oracle and Java are registered trademarks of Oracle and/or its affiliates. + * Other names may be trademarks of their respective owners. + * + * The contents of this file are subject to the terms of either the GNU + * General Public License Version 2 only ("GPL") or the Common + * Development and Distribution License("CDDL") (collectively, the + * "License"). You may not use this file except in compliance with the + * License. You can obtain a copy of the License at + * http://www.netbeans.org/cddl-gplv2.html + * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the + * specific language governing permissions and limitations under the + * License. When distributing the software, include this License Header + * Notice in each file and include the License file at + * nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the GPL Version 2 section of the License file that + * accompanied this code. If applicable, add the following below the + * License Header, with the fields enclosed by brackets [] replaced by + * your own identifying information: + * "Portions Copyrighted [year] [name of copyright owner]" + * + * If you wish your version of this file to be governed by only the CDDL + * or only the GPL Version 2, indicate your decision by adding + * "[Contributor] elects to include this software in this distribution + * under the [CDDL or GPL Version 2] license." If you do not indicate a + * single choice of license, a recipient has the option to distribute + * your version of this file under either the CDDL, the GPL Version 2 or + * to extend the choice of license to its licensees as provided above. + * However, if you add GPL Version 2 code and therefore, elected the GPL + * Version 2 license, then the option applies only if the new code is + * made subject to such option by the copyright holder. + * + * Contributor(s): + * + * Portions Copyrighted 2013 Sun Microsystems, Inc. + */ +package org.netbeans.modules.web.project; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.io.IOException; +import java.util.Collection; +import org.netbeans.api.project.ProjectManager; +import org.netbeans.modules.web.browser.api.WebBrowser; +import org.netbeans.modules.web.browser.api.WebBrowserSupport; +import org.netbeans.modules.web.browser.api.WebBrowsers; +import org.netbeans.modules.web.browser.spi.ProjectBrowserProvider; +import org.netbeans.modules.web.project.ui.customizer.CustomizerProviderImpl; +import org.netbeans.modules.web.project.ui.customizer.WebCompositePanelProvider; +import org.netbeans.modules.web.project.ui.customizer.WebProjectProperties; +import static org.netbeans.modules.web.project.ui.customizer.WebProjectProperties.SELECTED_BROWSER; +import org.netbeans.spi.project.support.ant.AntProjectHelper; +import org.netbeans.spi.project.support.ant.EditableProperties; + +/** + * + */ +public class WebProjectBrowserProvider implements ProjectBrowserProvider { + + private WebProject project; + private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); + + public WebProjectBrowserProvider(WebProject project) { + this.project = project; + project.evaluator().addPropertyChangeListener(new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (evt.getPropertyName().equals(WebProjectProperties.SELECTED_BROWSER)) { + pcs.firePropertyChange(PROP_BROWSER_ACTIVE, null, null); + } + } + }); + } + + @Override + public Collection getBrowsers() { + return WebBrowsers.getInstance().getAll(false, true, true, true); + } + + @Override + public WebBrowser getActiveBrowser() { + String selectedBrowser = project.evaluator().getProperty(WebProjectProperties.SELECTED_BROWSER); + if (selectedBrowser == null) { + selectedBrowser = WebBrowserSupport.getDefaultBrowserId(); + } + WebBrowser browser = WebBrowserSupport.getBrowser(selectedBrowser); + if (selectedBrowser == null || browser == null) { + return null; + } else { + return browser; + } + } + + @Override + public void setActiveBrowser(final WebBrowser browser) throws IllegalArgumentException, IOException { + ProjectManager.mutex().writeAccess(new Runnable() { + public void run() { + AntProjectHelper helper = project.getAntProjectHelper(); + EditableProperties projectProps = helper.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); + projectProps.put(SELECTED_BROWSER, browser.getId()); + helper.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, projectProps); + } + }); + pcs.firePropertyChange(PROP_BROWSER_ACTIVE, null, null); + } + + @Override + public boolean hasCustomizer() { + return true; + } + + @Override + public void customize() { + project.getLookup().lookup(CustomizerProviderImpl.class).showCustomizer(WebCompositePanelProvider.RUN); + } + + @Override + public void addPropertyChangeListener(PropertyChangeListener lst) { + pcs.addPropertyChangeListener(lst); + } + + @Override + public void removePropertyChangeListener(PropertyChangeListener lst) { + pcs.removePropertyChangeListener(lst); + } + +} diff --git a/web.project/src/org/netbeans/modules/web/project/ui/customizer/WebProjectProperties.java b/web.project/src/org/netbeans/modules/web/project/ui/customizer/WebProjectProperties.java --- a/web.project/src/org/netbeans/modules/web/project/ui/customizer/WebProjectProperties.java +++ b/web.project/src/org/netbeans/modules/web/project/ui/customizer/WebProjectProperties.java @@ -494,7 +494,7 @@ if (selectedBrowser == null) { selectedBrowser = WebBrowserSupport.getDefaultBrowserId(); } - BROWSERS_MODEL = WebBrowserSupport.createBrowserModel(selectedBrowser); + BROWSERS_MODEL = WebBrowserSupport.createBrowserModel(selectedBrowser, true); loadingFrameworksTask = RP.post(new Runnable() { public void run() { loadCurrentFrameworks();