blob: 0805cd51c9a51b7aef70501c5a73df20c77f023d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.cordova.project;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.prefs.Preferences;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import org.netbeans.api.options.OptionsDisplayer;
import org.netbeans.api.progress.ProgressUtils;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectUtils;
import org.netbeans.modules.cordova.CordovaPerformer;
import org.netbeans.modules.cordova.CordovaPlatform;
import org.netbeans.modules.cordova.updatetask.CordovaPlugin;
import org.netbeans.modules.cordova.wizard.CordovaProjectExtender;
import org.netbeans.modules.cordova.updatetask.SourceConfig;
import org.netbeans.modules.cordova.wizard.CordovaTemplate;
import org.netbeans.spi.project.ui.support.ProjectCustomizer.Category;
import org.openide.filesystems.FileObject;
import org.openide.util.EditableProperties;
import org.openide.util.Exceptions;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
import org.openide.util.RequestProcessor;
/**
*
* @author Jan Becicka
*/
public class CordovaCustomizerPanel extends javax.swing.JPanel implements ActionListener, HelpCtx.Provider {
private Project project;
private SourceConfig config;
private final Category cat;
private boolean cordovaReady;
/**
* Creates new form CordovaCustomizerPanel
*/
@NbBundle.Messages(
"LBL_InitializeCordovaPanel=Initializing Cordova Category. Please wait..."
)
public CordovaCustomizerPanel(Project p, final Category cat) {
this.project = p;
this.cat = cat;
setLayout(new BorderLayout());
add(new JLabel(Bundle.LBL_InitializeCordovaPanel(), JLabel.CENTER), BorderLayout.CENTER);
validate();
RequestProcessor.getDefault().post(new Runnable() {
@Override
public void run() {
cordovaReady = CordovaPlatform.getDefault().isReady();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
initialize(cat);
}
});
}
});
}
private void createMobileConfigs() {
try {
CordovaProjectExtender.createMobileConfigs(project.getProjectDirectory());
CordovaPerformer.getDefault().createPlatforms(project).waitFinished();
config = CordovaPerformer.getConfig(project);
setVisibility();
CordovaTemplate.CordovaExtender.setPhoneGapBrowser(project);
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
generatePanel = new javax.swing.JPanel();
createConfigs = new javax.swing.JButton();
createConfigsLabel = new javax.swing.JLabel();
mobilePlatformsSetup = new javax.swing.JButton();
jTabbedPane1 = new javax.swing.JTabbedPane();
cordovaPanel = new org.netbeans.modules.cordova.project.CordovaPanel();
pluginsPanel1 = new org.netbeans.modules.cordova.project.PluginsPanel();
org.openide.awt.Mnemonics.setLocalizedText(createConfigs, org.openide.util.NbBundle.getMessage(CordovaCustomizerPanel.class, "CordovaPanel.createConfigs.text")); // NOI18N
createConfigs.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
createConfigsActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(createConfigsLabel, org.openide.util.NbBundle.getMessage(CordovaCustomizerPanel.class, "CordovaCustomizerPanel.createConfigsLabel.text")); // NOI18N
javax.swing.GroupLayout generatePanelLayout = new javax.swing.GroupLayout(generatePanel);
generatePanel.setLayout(generatePanelLayout);
generatePanelLayout.setHorizontalGroup(
generatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(generatePanelLayout.createSequentialGroup()
.addComponent(createConfigs)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(generatePanelLayout.createSequentialGroup()
.addComponent(createConfigsLabel)
.addGap(0, 0, Short.MAX_VALUE))
);
generatePanelLayout.setVerticalGroup(
generatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(generatePanelLayout.createSequentialGroup()
.addComponent(createConfigsLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(createConfigs)
.addContainerGap())
);
org.openide.awt.Mnemonics.setLocalizedText(mobilePlatformsSetup, org.openide.util.NbBundle.getMessage(CordovaCustomizerPanel.class, "CordovaCustomizerPanel.mobilePlatformsSetup.text")); // NOI18N
mobilePlatformsSetup.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
mobilePlatformsSetupActionPerformed(evt);
}
});
jTabbedPane1.addTab(org.openide.util.NbBundle.getMessage(CordovaCustomizerPanel.class, "CordovaCustomizerPanel.cordovaPanel.TabConstraints.tabTitle"), cordovaPanel); // NOI18N
jTabbedPane1.addTab(org.openide.util.NbBundle.getMessage(CordovaCustomizerPanel.class, "CordovaCustomizerPanel.pluginsPanel1.TabConstraints.tabTitle"), pluginsPanel1); // NOI18N
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(0, 0, Short.MAX_VALUE)
.addComponent(mobilePlatformsSetup))
.addComponent(generatePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 516, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(generatePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 209, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(mobilePlatformsSetup))
);
}// </editor-fold>//GEN-END:initComponents
private void createConfigsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createConfigsActionPerformed
createConfigs.setVisible(false);
createConfigsLabel.setVisible(false);
mobilePlatformsSetup.setVisible(true);
jTabbedPane1.setVisible(true);
ProgressUtils.showProgressDialogAndRun(new Runnable() {
@Override
public void run() {
createMobileConfigs();
}
}, NbBundle.getMessage(CordovaCustomizerPanel.class, "CordovaPanel.createConfigsProgress.text"));
validate();
}//GEN-LAST:event_createConfigsActionPerformed
private void mobilePlatformsSetupActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mobilePlatformsSetupActionPerformed
OptionsDisplayer.getDefault().open("Html5/MobilePlatforms");//NOI18N
}//GEN-LAST:event_mobilePlatformsSetupActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private org.netbeans.modules.cordova.project.CordovaPanel cordovaPanel;
private javax.swing.JButton createConfigs;
private javax.swing.JLabel createConfigsLabel;
private javax.swing.JPanel generatePanel;
private javax.swing.JTabbedPane jTabbedPane1;
private javax.swing.JButton mobilePlatformsSetup;
private org.netbeans.modules.cordova.project.PluginsPanel pluginsPanel1;
// End of variables declaration//GEN-END:variables
private void initControls() {
initComponents();
cordovaPanel.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
checkIdValid(cordovaPanel.getPackageName());
}
});
try {
pluginsPanel1.init(getCurrent(), getAll());
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
setVisibility();
}
private List<CordovaPlugin> getCurrent() throws IOException {
List<CordovaPlugin> requestedPlugins = new ArrayList<CordovaPlugin>();
FileObject fileObject = project.getProjectDirectory().getFileObject("nbproject/plugins.properties");
if (fileObject == null) {
return new ArrayList<>();
}
Properties props = new Properties();
try (InputStream inputStream = fileObject.getInputStream()) {
props.load(inputStream);
}
for (String name : props.stringPropertyNames()) {
requestedPlugins.add(new CordovaPlugin(name, props.getProperty(name)));
}
return requestedPlugins;
}
private List<CordovaPlugin> getAll() throws IOException {
List<CordovaPlugin> requestedPlugins = new ArrayList<CordovaPlugin>();
Properties props = new Properties();
props.load(CordovaPerformer.class.getResourceAsStream("plugins.properties"));
for (String name : props.stringPropertyNames()) {
requestedPlugins.add(new CordovaPlugin(name, props.getProperty(name)));
}
return requestedPlugins;
}
@NbBundle.Messages({
"ERR_InvalidAppId={0} is not a valid Application ID"
})
private void checkIdValid(String packageName) {
if (SourceConfig.isValidId(packageName)) {
cat.setValid(true);
cat.setErrorMessage("");
} else {
cat.setValid(false);
cat.setErrorMessage(Bundle.ERR_InvalidAppId(packageName));
}
}
@Override
/**
* Store listener
*/
public void actionPerformed(ActionEvent e) {
try {
if (cordovaPanel == null) {
return;
}
if (!CordovaPlatform.isCordovaProject(project)) {
return;
}
Preferences preferences = ProjectUtils.getPreferences(project, CordovaPlatform.class, true);
preferences.put("phonegap", Boolean.toString(cordovaPanel.isPanelEnabled())); // NOI18N
List<CordovaPlugin> selected = pluginsPanel1.getSelectedPlugins();
EditableProperties props = new EditableProperties(false);
FileObject fileObject = project.getProjectDirectory().getFileObject("nbproject/plugins.properties");
if (fileObject == null) {
CordovaPerformer.createScript(project, "empty.properties", "nbproject/plugins.properties", false);
fileObject = project.getProjectDirectory().getFileObject("nbproject/plugins.properties");
}
try (InputStream inputStream = fileObject.getInputStream()) {
props.load(inputStream);
}
HashSet<CordovaPlugin> pluginsToAdd = new HashSet<>();
pluginsToAdd.addAll(selected);
//plugins to install
pluginsToAdd.removeAll(getCurrent());
//plugins to remove
HashSet<CordovaPlugin> pluginsToRemove = new HashSet<>();
pluginsToRemove.addAll(getCurrent());
pluginsToRemove.removeAll(selected);
for (CordovaPlugin plugin : pluginsToAdd) {
props.put(plugin.getId(), plugin.getUrl());
}
for (CordovaPlugin plugin : pluginsToRemove) {
props.remove(plugin.getId());
}
try (OutputStream outputStream = fileObject.getOutputStream()) {
props.store(outputStream);
}
try {
cordovaPanel.save(config);
} catch (IOException iOException) {
Exceptions.printStackTrace(iOException);
}
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
public void setVisibility() {
Runnable run = new Runnable() {
@Override
public void run() {
boolean platformsReady = CordovaPlatform.getDefault().isReady();
boolean isCordovaProject = CordovaPlatform.isCordovaProject(project);
createConfigs.setVisible(!isCordovaProject && platformsReady);
createConfigsLabel.setVisible(!isCordovaProject && platformsReady);
jTabbedPane1.setVisible(isCordovaProject && platformsReady);
mobilePlatformsSetup.setVisible(isCordovaProject && platformsReady);
cordovaPanel.update();
if (config != null) {
cordovaPanel.load(config);
}
validate();
}
};
if (SwingUtilities.isEventDispatchThread()) {
run.run();
} else {
SwingUtilities.invokeLater(run);
}
}
@Override
public HelpCtx getHelpCtx() {
return new HelpCtx("org.netbeans.modules.cordova.project.CordovaCustomizerPanel");
}
public void initialize(Category cat) {
removeAll();
if (!cordovaReady) {
setLayout(new BorderLayout());
add(new CordovaNotFound(), BorderLayout.CENTER);
validate();
CordovaPlatform.getDefault().addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (cordovaReady) {
if (CordovaPlatform.isCordovaProject(project)) {
config = CordovaPerformer.getConfig(project);
}
removeAll();
initControls();
}
}
});
} else {
if (CordovaPlatform.isCordovaProject(project) && cordovaReady) {
config = CordovaPerformer.getConfig(project);
}
initControls();
}
cat.setStoreListener(this);
}
}