X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.externaltools/src/net/sourceforge/phpdt/externaltools/internal/dialog/ExternalToolVariableForm.java b/net.sourceforge.phpeclipse.externaltools/src/net/sourceforge/phpdt/externaltools/internal/dialog/ExternalToolVariableForm.java new file mode 100644 index 0000000..5a9de70 --- /dev/null +++ b/net.sourceforge.phpeclipse.externaltools/src/net/sourceforge/phpdt/externaltools/internal/dialog/ExternalToolVariableForm.java @@ -0,0 +1,221 @@ +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 null 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(); + } +}