/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed 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.jetbrains.android.run;
import com.android.ddmlib.IDevice;
import com.android.sdklib.IAndroidTarget;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.openapi.application.ModalityState;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.util.Disposer;
import com.intellij.ui.ColoredListCellRenderer;
import com.intellij.ui.SimpleTextAttributes;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.android.util.AndroidBundle;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* @author Eugene.Kudelevsky
*/
public class ExtendedDeviceChooserDialog extends DialogWrapper {
private final Project myProject;
private final DeviceChooser myDeviceChooser;
private JPanel myPanel;
private JRadioButton myChooserRunningDeviceRadioButton;
private JPanel myDeviceChooserWrapper;
private JRadioButton myLaunchEmulatorRadioButton;
private JPanel myComboBoxWrapper;
private JLabel myAvdLabel;
private JCheckBox myReuseSelectionCheckbox;
private final AvdComboBox myAvdCombo;
@NonNls private static final String SELECTED_SERIALS_PROPERTY = "ANDROID_EXTENDED_DEVICE_CHOOSER_SERIALS";
@NonNls private static final String SELECTED_AVD_PROPERTY = "ANDROID_EXTENDED_DEVICE_CHOOSER_AVD";
public ExtendedDeviceChooserDialog(@NotNull final AndroidFacet facet,
@NotNull IAndroidTarget projectTarget,
boolean multipleSelection,
boolean showReuseDevicesCheckbox,
boolean selectReuseDevicesCheckbox) {
super(facet.getModule().getProject(), true);
setTitle(AndroidBundle.message("choose.device.dialog.title"));
myProject = facet.getModule().getProject();
final PropertiesComponent properties = PropertiesComponent.getInstance(myProject);
final String[] selectedSerials;
final String serialsStr = properties.getValue(SELECTED_SERIALS_PROPERTY);
if (serialsStr != null) {
selectedSerials = serialsStr.split(" ");
}
else {
selectedSerials = null;
}
getOKAction().setEnabled(false);
myDeviceChooser = new DeviceChooser(multipleSelection, getOKAction(), facet, projectTarget, null);
Disposer.register(myDisposable, myDeviceChooser);
myDeviceChooser.addListener(new DeviceChooserListener() {
@Override
public void selectedDevicesChanged() {
updateOkButton();
}
});
myAvdCombo = new AvdComboBox(false, true) {
@Override
public Module getModule() {
return facet.getModule();
}
};
Disposer.register(myDisposable, myAvdCombo);
myAvdCombo.getComboBox().setRenderer(new ColoredListCellRenderer() {
@Override
protected void customizeCellRenderer(JList list, Object value, int index, boolean selected, boolean hasFocus) {
if (value == null) {
append(AndroidBundle.message("android.ddms.nodevices"),
myAvdCombo.getComboBox().isEnabled()
? SimpleTextAttributes.ERROR_ATTRIBUTES
: SimpleTextAttributes.REGULAR_ATTRIBUTES);
}
else {
append(value.toString());
}
}
});
myComboBoxWrapper.add(myAvdCombo);
myAvdLabel.setLabelFor(myAvdCombo);
myDeviceChooserWrapper.add(myDeviceChooser.getPanel());
final ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
updateEnabled();
}
};
myLaunchEmulatorRadioButton.addActionListener(listener);
myChooserRunningDeviceRadioButton.addActionListener(listener);
myAvdCombo.getComboBox().addActionListener(listener);
init();
myDeviceChooser.init(selectedSerials);
myLaunchEmulatorRadioButton.setSelected(!myDeviceChooser.hasDevices());
myChooserRunningDeviceRadioButton.setSelected(myDeviceChooser.hasDevices());
myAvdCombo.startUpdatingAvds(ModalityState.stateForComponent(myPanel));
final String savedAvd = properties.getValue(SELECTED_AVD_PROPERTY);
String avdToSelect = null;
if (savedAvd != null) {
final ComboBoxModel model = myAvdCombo.getComboBox().getModel();
for (int i = 0, n = model.getSize(); i < n; i++) {
final String item = (String)model.getElementAt(i);
if (savedAvd.equals(item)) {
avdToSelect = item;
break;
}
}
}
if (avdToSelect != null) {
myAvdCombo.getComboBox().setSelectedItem(avdToSelect);
}
else if (myAvdCombo.getComboBox().getModel().getSize() > 0) {
myAvdCombo.getComboBox().setSelectedIndex(0);
}
myReuseSelectionCheckbox.setVisible(showReuseDevicesCheckbox);
myReuseSelectionCheckbox.setSelected(selectReuseDevicesCheckbox);
updateEnabled();
}
private void updateOkButton() {
if (myLaunchEmulatorRadioButton.isSelected()) {
getOKAction().setEnabled(getSelectedAvd() != null);
}
else {
getOKAction().setEnabled(getSelectedDevices().length > 0);
}
}
private void updateEnabled() {
myAvdCombo.setEnabled(myLaunchEmulatorRadioButton.isSelected());
myAvdLabel.setEnabled(myLaunchEmulatorRadioButton.isSelected());
myDeviceChooser.setEnabled(myChooserRunningDeviceRadioButton.isSelected());
updateOkButton();
}
@Override
public JComponent getPreferredFocusedComponent() {
return myDeviceChooser.getPreferredFocusComponent();
}
@Override
protected void doOKAction() {
myDeviceChooser.finish();
final PropertiesComponent properties = PropertiesComponent.getInstance(myProject);
properties.setValue(SELECTED_SERIALS_PROPERTY, AndroidRunningState.toString(myDeviceChooser.getSelectedDevices()));
final String selectedAvd = (String)myAvdCombo.getComboBox().getSelectedItem();
if (selectedAvd != null) {
properties.setValue(SELECTED_AVD_PROPERTY, selectedAvd);
}
else {
properties.unsetValue(SELECTED_AVD_PROPERTY);
}
super.doOKAction();
}
@Override
protected String getDimensionServiceKey() {
return "AndroidExtendedDeviceChooserDialog";
}
@Override
protected JComponent createCenterPanel() {
return myPanel;
}
@NotNull
public IDevice[] getSelectedDevices() {
return myDeviceChooser.getSelectedDevices();
}
@Nullable
public String getSelectedAvd() {
return (String)myAvdCombo.getComboBox().getSelectedItem();
}
public boolean isToLaunchEmulator() {
return myLaunchEmulatorRadioButton.isSelected();
}
public boolean useSameDevicesAgain() {
return myReuseSelectionCheckbox.isSelected();
}
}