org.chromium.debug.ui/src/org/chromium/debug/ui/launcher/ChromiumRemoteTab.java
changeset 2 e4420d2515f1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/org.chromium.debug.ui/src/org/chromium/debug/ui/launcher/ChromiumRemoteTab.java	Wed Dec 23 17:13:18 2009 -0800
@@ -0,0 +1,155 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.debug.ui.launcher;
+
+import org.chromium.debug.core.ChromiumDebugPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.debug.core.ILaunchConfiguration;
+import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
+import org.eclipse.debug.ui.AbstractLaunchConfigurationTab;
+import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.jface.preference.BooleanFieldEditor;
+import org.eclipse.jface.preference.FieldEditor;
+import org.eclipse.jface.preference.IntegerFieldEditor;
+import org.eclipse.jface.preference.PreferenceStore;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * The "Remote" tab for the Chromium JavaScript launch tab group.
+ */
+public class ChromiumRemoteTab extends AbstractLaunchConfigurationTab {
+
+  private static final String PORT_FIELD_NAME = "port_field"; //$NON-NLS-1$
+  private static final String ADD_NETWORK_CONSOLE_FIELD_NAME =
+      "add_network_console_field"; //$NON-NLS-1$
+
+   // However, recommended range is [1024, 32767].
+  private static final int minimumPortValue = 0;
+  private static final int maximumPortValue = 65535;
+
+  private IntegerFieldEditor debugPort;
+  private BooleanFieldEditor addNetworkConsole;
+  private final PreferenceStore store = new PreferenceStore();
+
+  public void createControl(Composite parent) {
+    Composite composite = createDefaultComposite(parent);
+
+    IPropertyChangeListener modifyListener = new IPropertyChangeListener() {
+      public void propertyChange(PropertyChangeEvent event) {
+        updateLaunchConfigurationDialog();
+      }
+    };
+
+    Composite propertiesComp = createInnerComposite(composite, 2);
+    // Port text field
+    debugPort = new IntegerFieldEditor(PORT_FIELD_NAME, Messages.ChromiumRemoteTab_PortLabel,
+        propertiesComp);
+    debugPort.setPropertyChangeListener(modifyListener);
+    debugPort.setPreferenceStore(store);
+
+    addNetworkConsole = new BooleanFieldEditor(ADD_NETWORK_CONSOLE_FIELD_NAME,
+        Messages.ChromiumRemoteTab_ShowDebuggerNetworkCommunication,
+        propertiesComp);
+    addNetworkConsole.setPreferenceStore(store);
+    addNetworkConsole.setPropertyChangeListener(modifyListener);
+  }
+
+  public String getName() {
+    return Messages.ChromiumRemoteTab_RemoteTabName;
+  }
+
+  public void initializeFrom(ILaunchConfiguration config) {
+    int debugPortDefault = PluginVariablesUtil.getValueAsInt(PluginVariablesUtil.DEFAULT_PORT);
+
+    try {
+      store.setDefault(PORT_FIELD_NAME, config.getAttribute(LaunchTypeBase.CHROMIUM_DEBUG_PORT,
+          debugPortDefault));
+      store.setDefault(ADD_NETWORK_CONSOLE_FIELD_NAME, config.getAttribute(
+          LaunchTypeBase.ADD_NETWORK_CONSOLE, false));
+    } catch (CoreException e) {
+      ChromiumDebugPlugin.log(new Exception("Unexpected storage problem", e)); //$NON-NLS-1$
+      store.setDefault(PORT_FIELD_NAME, debugPortDefault);
+      store.setDefault(ADD_NETWORK_CONSOLE_FIELD_NAME, false);
+    }
+
+    debugPort.loadDefault();
+    addNetworkConsole.loadDefault();
+  }
+
+  public void performApply(ILaunchConfigurationWorkingCopy config) {
+    storeEditor(debugPort, "-1"); //$NON-NLS-1$
+    storeEditor(addNetworkConsole, ""); //$NON-NLS-1$
+
+    config.setAttribute(LaunchTypeBase.CHROMIUM_DEBUG_PORT, store.getInt(PORT_FIELD_NAME));
+    config.setAttribute(LaunchTypeBase.ADD_NETWORK_CONSOLE,
+        store.getBoolean(ADD_NETWORK_CONSOLE_FIELD_NAME));
+  }
+
+  @Override
+  public boolean isValid(ILaunchConfiguration config) {
+    try {
+      int port = config.getAttribute(LaunchTypeBase.CHROMIUM_DEBUG_PORT, -1);
+      if (port < minimumPortValue || port > maximumPortValue) {
+        setErrorMessage(Messages.ChromiumRemoteTab_InvalidPortNumberError);
+        return false;
+      }
+    } catch (CoreException e) {
+      ChromiumDebugPlugin.log(new Exception("Unexpected storage problem", e)); //$NON-NLS-1$
+    }
+
+    setErrorMessage(null);
+    return true;
+  }
+
+
+  public void setDefaults(ILaunchConfigurationWorkingCopy config) {
+    int port = PluginVariablesUtil.getValueAsInt(PluginVariablesUtil.DEFAULT_PORT);
+    config.setAttribute(LaunchTypeBase.CHROMIUM_DEBUG_PORT, port);
+  }
+
+  @Override
+  public Image getImage() {
+    return DebugUITools.getImage(IDebugUIConstants.IMG_LCL_DISCONNECT);
+  }
+
+  private Composite createDefaultComposite(Composite parent) {
+    Composite composite = new Composite(parent, SWT.NULL);
+    setControl(composite);
+
+    GridLayout layout = new GridLayout();
+    layout.numColumns = 1;
+    composite.setLayout(layout);
+
+    GridData data = new GridData();
+    data.verticalAlignment = GridData.FILL;
+    data.horizontalAlignment = GridData.FILL;
+    composite.setLayoutData(data);
+
+    return composite;
+  }
+
+  private Composite createInnerComposite(Composite parent, int numColumns) {
+    Composite composite = new Composite(parent, SWT.NONE);
+    composite.setLayout(new GridLayout(numColumns, false));
+    GridData gd = new GridData(GridData.FILL_BOTH);
+    composite.setLayoutData(gd);
+    return composite;
+  }
+
+  private static void storeEditor(FieldEditor editor, String errorValue) {
+    if (editor.isValid()) {
+      editor.store();
+    } else {
+      editor.getPreferenceStore().setValue(editor.getPreferenceName(), errorValue);
+    }
+  }
+}