first version of external tools
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / externaltools / variable / ResourceComponent.java
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/externaltools/variable/ResourceComponent.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/externaltools/variable/ResourceComponent.java
new file mode 100644 (file)
index 0000000..9937f78
--- /dev/null
@@ -0,0 +1,264 @@
+package net.sourceforge.phpdt.externaltools.variable;
+
+/**********************************************************************
+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 org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Tree;
+import net.sourceforge.phpdt.externaltools.group.IGroupDialogPage;
+import net.sourceforge.phpdt.externaltools.internal.model.ToolMessages;
+import net.sourceforge.phpdt.externaltools.model.ToolUtil;
+import org.eclipse.ui.model.WorkbenchContentProvider;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+
+/**
+ * Visual component to edit the resource type variable
+ * value.
+ * <p>
+ * This class is not intended to be extended by clients.
+ * </p>
+ */
+public class ResourceComponent implements IVariableComponent {
+       private IGroupDialogPage page;
+       private boolean isValid = true;
+       
+       protected Group mainGroup;
+       protected Button selectedResourceButton;
+       protected Button specificResourceButton;
+       protected TreeViewer resourceList;
+       private IResource selectedResource;
+       
+       /**
+        * Creates the component
+        */
+       public ResourceComponent() {
+               super();
+       }
+
+       /* (non-Javadoc)
+        * Method declared on IVariableComponent.
+        */
+       public void createContents(Composite parent, String varTag, IGroupDialogPage page) {
+               this.page = page;
+               
+               // main composite
+               mainGroup = new Group(parent, SWT.NONE);
+               GridLayout layout = new GridLayout();
+               layout.marginWidth = 0;
+               layout.marginHeight = 0;
+               layout.numColumns = 1;
+               GridData gridData = new GridData(GridData.FILL_BOTH);
+               mainGroup.setLayout(layout);
+               mainGroup.setLayoutData(gridData);
+               mainGroup.setFont(parent.getFont());
+               mainGroup.setText(ToolUtil.buildVariableTag(varTag, null));
+               
+               createSelectedResourceOption();
+               createSpecificResourceOption();
+               createResourceList();
+               
+               updateResourceListEnablement();
+       }
+
+       /**
+        * Creates the list of resources.
+        */
+       protected void createResourceList() {
+               Tree tree = new Tree(mainGroup, SWT.SINGLE | SWT.BORDER);
+               GridData data = new GridData(GridData.FILL_BOTH);
+               data.heightHint = tree.getItemHeight() * getInitialVisibleItemCount();
+               tree.setLayoutData(data);
+               tree.setFont(mainGroup.getFont());
+               
+               resourceList = new TreeViewer(tree);
+               resourceList.addSelectionChangedListener(new ISelectionChangedListener() {
+                       public void selectionChanged(SelectionChangedEvent event) {
+                               validateResourceListSelection();
+                               selectedResource= (IResource) ((IStructuredSelection)event.getSelection()).getFirstElement();
+                       }
+               });
+               resourceList.setContentProvider(new WorkbenchContentProvider());
+               resourceList.setLabelProvider(new WorkbenchLabelProvider());
+               resourceList.setInput(ResourcesPlugin.getWorkspace().getRoot());
+       }
+       
+       /**
+        * Creates the option button for using the selected
+        * resource.
+        */
+       protected void createSelectedResourceOption() {
+               selectedResourceButton = new Button(mainGroup, SWT.RADIO);
+               selectedResourceButton.setText(ToolMessages.getString("ResourceComponent.selectedResLabel")); //$NON-NLS-1$
+               GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+               selectedResourceButton.setLayoutData(data);
+               selectedResourceButton.setFont(mainGroup.getFont());
+               selectedResourceButton.setSelection(true);
+       }
+       
+       /**
+        * Creates the option button for using a specific
+        * resource.
+        */
+       protected void createSpecificResourceOption() {
+               specificResourceButton = new Button(mainGroup, SWT.RADIO);
+               specificResourceButton.setText(ToolMessages.getString("ResourceComponent.specificResLabel")); //$NON-NLS-1$
+               GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+               specificResourceButton.setLayoutData(data);
+               specificResourceButton.setFont(mainGroup.getFont());
+               specificResourceButton.setSelection(false);
+               
+               specificResourceButton.addSelectionListener(new SelectionAdapter() {
+                       public void widgetSelected(SelectionEvent e) {
+                               updateResourceListEnablement();
+                       }
+               });
+       }
+       
+       /* (non-Javadoc)
+        * Method declared on IVariableComponent.
+        */
+       public Control getControl() {
+               return mainGroup;
+       }
+
+       /**
+        * Returns the dialog page this component is part of
+        */
+       protected final IGroupDialogPage getPage() {
+               return page;
+       }
+       
+       /* (non-Javadoc)
+        * Method declared on IVariableComponent.
+        */
+       public String getVariableValue() {
+               if (selectedResourceButton != null && selectedResourceButton.getSelection())
+                       return null;
+               
+               if (resourceList != null) {
+                       if (selectedResource != null)
+                               return selectedResource.getFullPath().toString();
+               }
+               
+               return null;
+       }
+
+       /**
+        * Returns the number of items to be visible in the
+        * resource list. This will determine the initial height.
+        */
+       protected int getInitialVisibleItemCount() {
+               return 10;
+       }
+       
+       /* (non-Javadoc)
+        * Method declared on IVariableComponent.
+        */
+       public boolean isValid() {
+               return isValid;
+       }
+
+       /**
+        * Sets whether the component's values are all valid.
+        * Updates the components's page valid state. No action
+        * taken if new valid state same as current one.
+        * 
+        * @param isValid <code>true</code> if all values valid,
+        *              <code>false</code> otherwise
+        */
+       protected final void setIsValid(boolean isValid) {
+               if (this.isValid != isValid) {
+                       this.isValid = isValid;
+                       this.page.updateValidState();
+               }
+       }
+       
+       /**
+        * Updates the enablement of the resource list if needed
+        */
+       protected void updateResourceListEnablement() {
+               if (specificResourceButton != null && resourceList != null)
+                       resourceList.getTree().setEnabled(specificResourceButton.getSelection());
+       }
+       
+       /* (non-Javadoc)
+        * Method declared on IVariableComponent.
+        */
+       public void setVariableValue(String varValue) {
+               if (varValue == null || varValue.length() == 0) {
+                       if (selectedResourceButton != null)
+                               selectedResourceButton.setSelection(true);
+                       if (specificResourceButton != null)
+                               specificResourceButton.setSelection(false);
+                       if (resourceList != null)
+                               resourceList.getTree().setEnabled(false);
+               } else {
+                       if (selectedResourceButton != null)
+                               selectedResourceButton.setSelection(false);
+                       if (specificResourceButton != null)
+                               specificResourceButton.setSelection(true);
+                       if (resourceList != null) {
+                               resourceList.getTree().setEnabled(true);
+                               IResource member = ResourcesPlugin.getWorkspace().getRoot().findMember(varValue);
+                               if (member != null)
+                                       resourceList.setSelection(new StructuredSelection(member), true);
+                               else
+                                       resourceList.setSelection(StructuredSelection.EMPTY);
+                       }
+               }
+       }
+       
+       /* (non-Javadoc)
+        * Method declared on IVariableComponent.
+        */
+       public void validate() {
+               if (specificResourceButton != null && specificResourceButton.getSelection()) {
+                       validateResourceListSelection();
+               }
+
+               getPage().setMessage(null, IMessageProvider.NONE);
+               setIsValid(true);
+       }
+
+       /**
+        * Returns whether that the resource list selection is valid.
+        * If the list was not created, returns <code>true</code>.
+        * 
+        * @return <code>true</code> to continue validating other
+        *      fields, <code>false</code> to stop.
+        */
+       protected boolean validateResourceListSelection() {
+               if (resourceList == null)
+                       return true;
+
+               if (resourceList.getSelection().isEmpty()) {
+                       getPage().setMessage(ToolMessages.getString("ResourceComponent.selectionRequired"), IMessageProvider.WARNING); //$NON-NLS-1$
+                       setIsValid(false);
+                       return false;
+               }
+               
+               return true;
+       }
+}