blob: 621fc01a517c20e8e50775084f78380b24796497 [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.platforms.android;
import java.awt.BorderLayout;
import java.awt.Component;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.util.Collection;
import java.util.EnumSet;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import org.netbeans.api.project.Project;
import org.netbeans.modules.cordova.platforms.api.ClientProjectUtilities;
import org.netbeans.modules.cordova.platforms.spi.Device;
import org.netbeans.modules.cordova.platforms.api.PlatformManager;
import org.netbeans.modules.cordova.platforms.spi.PropertyProvider;
import org.netbeans.modules.web.clientproject.spi.platform.ProjectConfigurationCustomizer;
import org.openide.util.Exceptions;
import org.openide.util.NbBundle;
import org.openide.util.RequestProcessor;
/**
*
* @author Jan Becicka
*/
public class AndroidConfigurationPanel extends javax.swing.JPanel {
private PropertyProvider config;
final RequestProcessor RP = new RequestProcessor(AndroidConfigurationPanel.class);
private void initControls() {
initComponents();
String device = config.getProperty(Device.DEVICE_PROP); //NOI18N
if (Device.DEVICE.equals(device)) { //NOI18N
deviceCombo.setSelectedIndex(Device.DEVICE.equals(device)?1:0); //NOI18N
}
setAVDComboVisible(!Device.DEVICE.equals(device)); //NOI18N
debuggerCheckBox.setVisible(false);
deviceLabel.setVisible(false);
deviceCombo.setVisible(false);
String property = config.getProperty(Device.BROWSER_PROP);
if (property!=null && property.equals(Browser.CHROME.getName())) {
browserCombo.setSelectedIndex(1);
}
validate();
}
public static class AndroidConfigurationCustomizer implements ProjectConfigurationCustomizer {
private final Project p;
private final PropertyProvider config;
public AndroidConfigurationCustomizer(Project p, PropertyProvider config) {
this.p = p;
this.config = config;
}
@Override
public JPanel createPanel() {
return new AndroidConfigurationPanel(config);
}
@Override
public EnumSet<HiddenProperties> getHiddenProperties() {
return EnumSet.of(HiddenProperties.WEB_SERVER);
}
}
private static class DeviceRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (value instanceof AVD) {
setText(((AVD) value).getName());
}
return this;
}
}
/**
* Creates new form AndroidConfigurationPanel
*/
public AndroidConfigurationPanel(final PropertyProvider config) {
assert config != null;
this.config = config;
if (!AndroidPlatform.getDefault().isReady()) {
setLayout(new BorderLayout());
add(ClientProjectUtilities.createMobilePlatformsSetupPanel(), BorderLayout.CENTER);
validate();
AndroidPlatform.getDefault().addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (AndroidPlatform.getDefault().isReady()) {
removeAll();
initControls();
validate();
}
}
});
} else {
initControls();
}
}
@NbBundle.Messages("LBL_PleaseWait=Please Wait...")
private void setAVDComboVisible(boolean visible) {
if (visible) {
avdCombo.setModel(new DefaultComboBoxModel(new Object[]{Bundle.LBL_PleaseWait()}));
avdCombo.setEnabled(false);
RP.post(new Runnable() {
@Override
public void run() {
try {
final Collection<? extends Device> avDs = AndroidPlatform.getDefault().getVirtualDevices();
refreshCombo(avDs);
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
});
}
avdLabel.setVisible(visible);
avdCombo.setVisible(visible);
manageButton.setVisible(visible);
}
private void refreshCombo(final Collection<? extends Device> avDs) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
avdCombo.setEnabled(true);
avdCombo.setRenderer(new DeviceRenderer());
final AVD[] avds = avDs.toArray(new AVD[avDs.size()]);
avdCombo.setModel(new DefaultComboBoxModel(avds));
for (AVD avd : avds) {
if (avd.getName().equals(config.getProperty(Device.DEVICE_PROP))) {//NOI18N
avdCombo.setSelectedItem(avd);
break;
}
}
}
});
}
/**
* 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")
@NbBundle.Messages({
"LBL_AndroidEmulator=Emulator",
"LBL_AndroidConnectedDevice=Connected Device",
"LBL_DefaultBrowser=Default Browser",
"LBL_Chrome=Mobile Chrome"
})
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
deviceLabel = new javax.swing.JLabel();
manageButton = new javax.swing.JButton();
deviceCombo = new javax.swing.JComboBox();
avdCombo = new javax.swing.JComboBox();
avdLabel = new javax.swing.JLabel();
debuggerCheckBox = new javax.swing.JCheckBox();
jLabel1 = new javax.swing.JLabel();
browserCombo = new javax.swing.JComboBox();
deviceLabel.setLabelFor(deviceCombo);
org.openide.awt.Mnemonics.setLocalizedText(deviceLabel, org.openide.util.NbBundle.getMessage(AndroidConfigurationPanel.class, "AndroidConfigurationPanel.deviceLabel.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(manageButton, org.openide.util.NbBundle.getMessage(AndroidConfigurationPanel.class, "AndroidConfigurationPanel.manageButton.text")); // NOI18N
manageButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
manageButtonActionPerformed(evt);
}
});
deviceCombo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { Bundle.LBL_AndroidEmulator(), Bundle.LBL_AndroidConnectedDevice() }));
deviceCombo.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
deviceComboActionPerformed(evt);
}
});
avdCombo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { Bundle.LBL_PleaseWait() }));
avdCombo.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
avdComboActionPerformed(evt);
}
});
avdLabel.setLabelFor(avdCombo);
org.openide.awt.Mnemonics.setLocalizedText(avdLabel, org.openide.util.NbBundle.getMessage(AndroidConfigurationPanel.class, "AndroidConfigurationPanel.avdLabel.text")); // NOI18N
debuggerCheckBox.setSelected(true);
org.openide.awt.Mnemonics.setLocalizedText(debuggerCheckBox, org.openide.util.NbBundle.getMessage(AndroidConfigurationPanel.class, "AndroidConfigurationPanel.debuggerCheckBox.text")); // NOI18N
debuggerCheckBox.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
debuggerCheckBoxActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(AndroidConfigurationPanel.class, "AndroidConfigurationPanel.jLabel1.text")); // NOI18N
browserCombo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { Bundle.LBL_DefaultBrowser(), Bundle.LBL_Chrome() }));
browserCombo.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
browserComboActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(0, 0, 0)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(debuggerCheckBox)
.addGap(0, 0, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jLabel1)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(deviceLabel)
.addComponent(avdLabel)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(deviceCombo, 0, 174, Short.MAX_VALUE)
.addComponent(avdCombo, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(browserCombo, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(manageButton)))
.addGap(0, 0, 0))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(0, 0, 0)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
.addComponent(deviceLabel)
.addComponent(deviceCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(avdCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(manageButton)
.addComponent(avdLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1)
.addComponent(browserCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(debuggerCheckBox)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
}// </editor-fold>//GEN-END:initComponents
private void manageButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_manageButtonActionPerformed
manageButton.setEnabled(false);
RP.post(new Runnable() {
@Override
public void run() {
AndroidPlatform.getDefault().manageDevices();
Collection<? extends Device> avDs;
try {
avDs = AndroidPlatform.getDefault().getVirtualDevices();
refreshCombo(avDs);
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
manageButton.setEnabled(true);
}
});
}
});
}//GEN-LAST:event_manageButtonActionPerformed
private void avdComboActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_avdComboActionPerformed
config.putProperty("avd", ((AVD)avdCombo.getSelectedItem()).getName()); //NOI18N
}//GEN-LAST:event_avdComboActionPerformed
private void deviceComboActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deviceComboActionPerformed
if (deviceCombo.getSelectedIndex() == 0) {
config.putProperty(Device.DEVICE_PROP, Device.EMULATOR); //NOI18N
setAVDComboVisible(true);
} else {
config.putProperty(Device.DEVICE_PROP, Device.DEVICE); //NOI18N
setAVDComboVisible(false);
}
}//GEN-LAST:event_deviceComboActionPerformed
private void debuggerCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_debuggerCheckBoxActionPerformed
config.putProperty("debug.enabled", Boolean.toString(debuggerCheckBox.isSelected())); //NOI18N
}//GEN-LAST:event_debuggerCheckBoxActionPerformed
private void browserComboActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browserComboActionPerformed
config.putProperty(Device.BROWSER_PROP, browserCombo.getSelectedIndex() == 0 ? Browser.DEFAULT.getName():Browser.CHROME.getName());
}//GEN-LAST:event_browserComboActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JComboBox avdCombo;
private javax.swing.JLabel avdLabel;
private javax.swing.JComboBox browserCombo;
private javax.swing.JCheckBox debuggerCheckBox;
private javax.swing.JComboBox deviceCombo;
private javax.swing.JLabel deviceLabel;
private javax.swing.JLabel jLabel1;
private javax.swing.JButton manageButton;
// End of variables declaration//GEN-END:variables
}