--- /dev/null
+package net.sourceforge.phpdt.externaltools.internal.dialog;
+
+/**********************************************************************
+Copyright (c) 2002 IBM Corp. and others. All rights reserved.
+This file is made available under the terms of the Common Public License v1.0
+which accompanies this distribution, and is available at
+http://www.eclipse.org/legal/cpl-v10.html
+�
+Contributors:
+**********************************************************************/
+
+import net.sourceforge.phpdt.externaltools.group.IGroupDialogPage;
+import net.sourceforge.phpdt.externaltools.internal.registry.ExternalToolVariable;
+import net.sourceforge.phpdt.externaltools.model.ToolUtil;
+import net.sourceforge.phpdt.externaltools.variable.IVariableComponent;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StackLayout;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+
+/**
+ * Visual grouping of controls that allows the user to
+ * select a variable and configure it with extra
+ * information.
+ */
+public class ExternalToolVariableForm {
+ private static final int VISIBLE_ITEM_COUNT = 9;
+
+ private String variableListLabelText;
+ private ExternalToolVariable[] variables;
+ private IVariableComponent[] components;
+ private IGroupDialogPage page;
+
+ private Label variableListLabel;
+ private List variableList;
+ private Composite variableComposite;
+ private StackLayout variableLayout;
+ private int activeComponentIndex = -1;
+
+ /**
+ * Creates the visual grouping
+ *
+ * @param variableListLabelText the label text to use for identifying the list of variables
+ * @param variables the collection of variables to display to the user
+ */
+ public ExternalToolVariableForm(String variableListLabelText, ExternalToolVariable[] variables) {
+ super();
+ this.variableListLabelText = variableListLabelText;
+ this.variables = variables;
+ this.components = new IVariableComponent[variables.length];
+ }
+
+ public Composite createContents(Composite parent, IGroupDialogPage page) {
+ Font font = parent.getFont();
+
+ this.page = page;
+
+ Composite mainComposite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ layout.numColumns = 1;
+ GridData data = new GridData(GridData.FILL_BOTH);
+ mainComposite.setLayout(layout);
+ mainComposite.setLayoutData(data);
+
+ variableListLabel = new Label(mainComposite, SWT.NONE);
+ variableListLabel.setText(variableListLabelText);
+ data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ data.horizontalSpan = 1;
+ variableListLabel.setLayoutData(data);
+ variableListLabel.setFont(font);
+
+ variableList = new List(mainComposite, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.heightHint = variableList.getItemHeight() * VISIBLE_ITEM_COUNT;
+ variableList.setLayoutData(data);
+ variableList.setFont(font);
+
+ variableComposite = new Composite(mainComposite, SWT.NONE);
+ variableLayout = new StackLayout();
+ variableLayout.marginWidth = 0;
+ variableLayout.marginHeight = 0;
+ data = new GridData(GridData.FILL_BOTH);
+ variableComposite.setLayout(variableLayout);
+ variableComposite.setLayoutData(data);
+ variableComposite.setFont(font);
+
+ createVariableComponents(data);
+
+ populateVariableList();
+
+ variableList.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ updateVariableComposite(null, false);
+ }
+ });
+
+ setEnabled(true);
+ return mainComposite;
+ }
+
+ /**
+ * Creates the visual component for each variable
+ * and determine the initial size so the form
+ * can be layout properly.
+ */
+ private void createVariableComponents(GridData data) {
+ for (int i = 0; i < variables.length; i++) {
+ ExternalToolVariable var = variables[i];
+ components[i] = var.getComponent();
+ components[i].createContents(variableComposite, var.getTag(), page);
+ Control control = components[i].getControl();
+ if (control != null) {
+ Point newSize = control.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
+ data.widthHint = Math.max(newSize.x, data.widthHint);
+ data.heightHint = Math.max(newSize.y, data.heightHint);
+ }
+ }
+ }
+
+ /**
+ * Returns the formatted variable or <code>null</code> if
+ * none selected.
+ */
+ public String getSelectedVariable() {
+ if (activeComponentIndex != -1) {
+ String varValue = components[activeComponentIndex].getVariableValue();
+ return ToolUtil.buildVariableTag(variables[activeComponentIndex].getTag(), varValue);
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns whether the current variable selection is
+ * valid, including the selected variable value.
+ */
+ public boolean isValid() {
+ if (activeComponentIndex != -1)
+ return components[activeComponentIndex].isValid();
+
+ return true;
+ }
+
+ private void populateVariableList() {
+ String[] items = new String[variables.length];
+ StringBuffer buffer = new StringBuffer(80);
+ for (int i = 0; i < variables.length; i++) {
+ ToolUtil.buildVariableTag(variables[i].getTag(), null, buffer);
+ buffer.append(" - "); //$NON-NLS-1$
+ buffer.append(variables[i].getDescription());
+ items[i] = buffer.toString();
+ buffer.setLength(0);
+ }
+ variableList.setItems(items);
+ }
+
+ public void selectVariable(String varName, String varValue) {
+ if (varName != null && varName.length() > 0) {
+ for (int i = 0; i < variables.length; i++) {
+ if (varName.equals(variables[i].getTag())) {
+ variableList.select(i);
+ updateVariableComposite(varValue, true);
+ return;
+ }
+ }
+ }
+
+ variableList.deselectAll();
+ updateVariableComposite(varValue, false);
+ }
+
+ private void setComponentVisible(int index) {
+ if (index == -1)
+ variableLayout.topControl = null;
+ else
+ variableLayout.topControl = components[index].getControl();
+ variableComposite.layout();
+ }
+
+ /**
+ * Enables or disables the variable form controls.
+ */
+ public void setEnabled(boolean enabled) {
+ variableListLabel.setEnabled(enabled);
+ variableList.setEnabled(enabled);
+ if (enabled && variableList.getSelection().length == 0) {
+ if (variableList.getItemCount() > 0) {
+ variableList.select(0);
+ activeComponentIndex= 0;
+ }
+ }
+ variableComposite.setVisible(enabled);
+ }
+
+ private void updateVariableComposite(String value, boolean setValue) {
+ activeComponentIndex = variableList.getSelectionIndex();
+ setComponentVisible(activeComponentIndex);
+ if (activeComponentIndex != -1 && setValue)
+ components[activeComponentIndex].setVariableValue(value);
+ }
+
+ /**
+ * Validates the current variable selection is and
+ * its value are acceptable.
+ */
+ public void validate() {
+ if (activeComponentIndex != -1)
+ components[activeComponentIndex].validate();
+ }
+}