X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/wizards/dialogfields/TreeListDialogField.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/wizards/dialogfields/TreeListDialogField.java deleted file mode 100644 index 8bed2ad..0000000 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/wizards/dialogfields/TreeListDialogField.java +++ /dev/null @@ -1,922 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2003 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are 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: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package net.sourceforge.phpdt.internal.ui.wizards.dialogfields; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import net.sourceforge.phpdt.internal.ui.util.PixelConverter; -import net.sourceforge.phpdt.internal.ui.util.SWTUtil; - -import org.eclipse.jface.util.Assert; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.ILabelProvider; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.ITreeContentProvider; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jface.viewers.ViewerSorter; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.KeyAdapter; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -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.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Tree; - -/** - * A list with a button bar. Typical buttons are 'Add', 'Remove', 'Up' and - * 'Down'. List model is independend of widget creation. DialogFields controls - * are: Label, List and Composite containing buttons. - */ -public class TreeListDialogField extends DialogField { - - protected TreeViewer fTree; - - protected ILabelProvider fLabelProvider; - - protected TreeViewerAdapter fTreeViewerAdapter; - - protected List fElements; - - protected ViewerSorter fViewerSorter; - - protected String[] fButtonLabels; - - private Button[] fButtonControls; - - private boolean[] fButtonsEnabled; - - private int fRemoveButtonIndex; - - private int fUpButtonIndex; - - private int fDownButtonIndex; - - private Label fLastSeparator; - - private Tree fTreeControl; - - private Composite fButtonsControl; - - private ISelection fSelectionWhenEnabled; - - private ITreeListAdapter fTreeAdapter; - - private Object fParentElement; - - private int fTreeExpandLevel; - - /** - * @param adapter - * Can be null. - */ - public TreeListDialogField(ITreeListAdapter adapter, String[] buttonLabels, - ILabelProvider lprovider) { - super(); - fTreeAdapter = adapter; - - fLabelProvider = lprovider; - fTreeViewerAdapter = new TreeViewerAdapter(); - fParentElement = this; - - fElements = new ArrayList(10); - - fButtonLabels = buttonLabels; - if (fButtonLabels != null) { - int nButtons = fButtonLabels.length; - fButtonsEnabled = new boolean[nButtons]; - for (int i = 0; i < nButtons; i++) { - fButtonsEnabled[i] = true; - } - } - - fTree = null; - fTreeControl = null; - fButtonsControl = null; - - fRemoveButtonIndex = -1; - fUpButtonIndex = -1; - fDownButtonIndex = -1; - - fTreeExpandLevel = 0; - } - - /** - * Sets the index of the 'remove' button in the button label array passed in - * the constructor. The behaviour of the button marked as the 'remove' - * button will then behandled internally. (enable state, button invocation - * behaviour) - */ - public void setRemoveButtonIndex(int removeButtonIndex) { - Assert.isTrue(removeButtonIndex < fButtonLabels.length); - fRemoveButtonIndex = removeButtonIndex; - } - - /** - * Sets the index of the 'up' button in the button label array passed in the - * constructor. The behaviour of the button marked as the 'up' button will - * then behandled internally. (enable state, button invocation behaviour) - */ - public void setUpButtonIndex(int upButtonIndex) { - Assert.isTrue(upButtonIndex < fButtonLabels.length); - fUpButtonIndex = upButtonIndex; - } - - /** - * Sets the index of the 'down' button in the button label array passed in - * the constructor. The behaviour of the button marked as the 'down' button - * will then be handled internally. (enable state, button invocation - * behaviour) - */ - public void setDownButtonIndex(int downButtonIndex) { - Assert.isTrue(downButtonIndex < fButtonLabels.length); - fDownButtonIndex = downButtonIndex; - } - - /** - * Sets the viewerSorter. - * - * @param viewerSorter - * The viewerSorter to set - */ - public void setViewerSorter(ViewerSorter viewerSorter) { - fViewerSorter = viewerSorter; - } - - /** - * Sets the viewerSorter. - * - * @param viewerSorter - * The viewerSorter to set - */ - public void setTreeExpansionLevel(int level) { - fTreeExpandLevel = level; - if (fTree != null) { - fTree.expandToLevel(level); - } - } - - // ------ adapter communication - - private void buttonPressed(int index) { - if (!managedButtonPressed(index) && fTreeAdapter != null) { - fTreeAdapter.customButtonPressed(this, index); - } - } - - /** - * Checks if the button pressed is handled internally - * - * @return Returns true if button has been handled. - */ - protected boolean managedButtonPressed(int index) { - if (index == fRemoveButtonIndex) { - remove(); - } else if (index == fUpButtonIndex) { - up(); - } else if (index == fDownButtonIndex) { - down(); - } else { - return false; - } - return true; - } - - // ------ layout helpers - - /* - * @see DialogField#doFillIntoGrid - */ - public Control[] doFillIntoGrid(Composite parent, int nColumns) { - PixelConverter converter = new PixelConverter(parent); - - assertEnoughColumns(nColumns); - - Label label = getLabelControl(parent); - GridData gd = gridDataForLabel(1); - gd.verticalAlignment = GridData.BEGINNING; - label.setLayoutData(gd); - - Control list = getTreeControl(parent); - gd = new GridData(); - gd.horizontalAlignment = GridData.FILL; - gd.grabExcessHorizontalSpace = false; - gd.verticalAlignment = GridData.FILL; - gd.grabExcessVerticalSpace = true; - gd.horizontalSpan = nColumns - 2; - gd.widthHint = converter.convertWidthInCharsToPixels(50); - gd.heightHint = converter.convertHeightInCharsToPixels(6); - - list.setLayoutData(gd); - - Composite buttons = getButtonBox(parent); - gd = new GridData(); - gd.horizontalAlignment = GridData.FILL; - gd.grabExcessHorizontalSpace = false; - gd.verticalAlignment = GridData.FILL; - gd.grabExcessVerticalSpace = true; - gd.horizontalSpan = 1; - buttons.setLayoutData(gd); - - return new Control[] { label, list, buttons }; - } - - /* - * @see DialogField#getNumberOfControls - */ - public int getNumberOfControls() { - return 3; - } - - /** - * Sets the minimal width of the buttons. Must be called after widget - * creation. - */ - public void setButtonsMinWidth(int minWidth) { - if (fLastSeparator != null) { - ((GridData) fLastSeparator.getLayoutData()).widthHint = minWidth; - } - } - - // ------ ui creation - - /** - * Returns the tree control. When called the first time, the control will be - * created. - * - * @param The - * parent composite when called the first time, or - * null after. - */ - public Control getTreeControl(Composite parent) { - if (fTreeControl == null) { - assertCompositeNotNull(parent); - - fTree = createTreeViewer(parent); - - fTreeControl = (Tree) fTree.getControl(); - fTreeControl.addKeyListener(new KeyAdapter() { - public void keyPressed(KeyEvent e) { - handleKeyPressed(e); - } - }); - fTree.setAutoExpandLevel(99); - fTree.setContentProvider(fTreeViewerAdapter); - fTree.setLabelProvider(fLabelProvider); - fTree.addSelectionChangedListener(fTreeViewerAdapter); - fTree.addDoubleClickListener(fTreeViewerAdapter); - - fTree.setInput(fParentElement); - fTree.expandToLevel(fTreeExpandLevel); - - if (fViewerSorter != null) { - fTree.setSorter(fViewerSorter); - } - - fTreeControl.setEnabled(isEnabled()); - if (fSelectionWhenEnabled != null) { - postSetSelection(fSelectionWhenEnabled); - } - } - return fTreeControl; - } - - /** - * Returns the internally used table viewer. - */ - public TreeViewer getTreeViewer() { - return fTree; - } - - /* - * Subclasses may override to specify a different style. - */ - protected int getTreeStyle() { - int style = SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL; - return style; - } - - protected TreeViewer createTreeViewer(Composite parent) { - Tree tree = new Tree(parent, getTreeStyle()); - return new TreeViewer(tree); - } - - protected Button createButton(Composite parent, String label, - SelectionListener listener) { - Button button = new Button(parent, SWT.PUSH); - button.setText(label); - button.addSelectionListener(listener); - GridData gd = new GridData(); - gd.horizontalAlignment = GridData.FILL; - gd.grabExcessHorizontalSpace = true; - gd.verticalAlignment = GridData.BEGINNING; - gd.heightHint = SWTUtil.getButtonHeightHint(button); - gd.widthHint = SWTUtil.getButtonWidthHint(button); - - button.setLayoutData(gd); - return button; - } - - private Label createSeparator(Composite parent) { - Label separator = new Label(parent, SWT.NONE); - separator.setVisible(false); - GridData gd = new GridData(); - gd.horizontalAlignment = GridData.FILL; - gd.verticalAlignment = GridData.BEGINNING; - gd.heightHint = 4; - separator.setLayoutData(gd); - return separator; - } - - /** - * Returns the composite containing the buttons. When called the first time, - * the control will be created. - * - * @param The - * parent composite when called the first time, or - * null after. - */ - public Composite getButtonBox(Composite parent) { - if (fButtonsControl == null) { - assertCompositeNotNull(parent); - - SelectionListener listener = new SelectionListener() { - public void widgetDefaultSelected(SelectionEvent e) { - doButtonSelected(e); - } - - public void widgetSelected(SelectionEvent e) { - doButtonSelected(e); - } - }; - - Composite contents = new Composite(parent, SWT.NULL); - GridLayout layout = new GridLayout(); - layout.marginWidth = 0; - layout.marginHeight = 0; - contents.setLayout(layout); - - if (fButtonLabels != null) { - fButtonControls = new Button[fButtonLabels.length]; - for (int i = 0; i < fButtonLabels.length; i++) { - String currLabel = fButtonLabels[i]; - if (currLabel != null) { - fButtonControls[i] = createButton(contents, currLabel, - listener); - fButtonControls[i].setEnabled(isEnabled() - && fButtonsEnabled[i]); - } else { - fButtonControls[i] = null; - createSeparator(contents); - } - } - } - - fLastSeparator = createSeparator(contents); - - updateButtonState(); - fButtonsControl = contents; - } - - return fButtonsControl; - } - - private void doButtonSelected(SelectionEvent e) { - if (fButtonControls != null) { - for (int i = 0; i < fButtonControls.length; i++) { - if (e.widget == fButtonControls[i]) { - buttonPressed(i); - return; - } - } - } - } - - /** - * Handles key events in the table viewer. Specifically when the delete key - * is pressed. - */ - protected void handleKeyPressed(KeyEvent event) { - if (event.character == SWT.DEL && event.stateMask == 0) { - if (fRemoveButtonIndex != -1 - && isButtonEnabled(fTree.getSelection(), fRemoveButtonIndex)) { - managedButtonPressed(fRemoveButtonIndex); - return; - } - } - fTreeAdapter.keyPressed(this, event); - } - - // ------ enable / disable management - - /* - * @see DialogField#dialogFieldChanged - */ - public void dialogFieldChanged() { - super.dialogFieldChanged(); - updateButtonState(); - } - - /* - * Updates the enable state of the all buttons - */ - protected void updateButtonState() { - if (fButtonControls != null) { - ISelection sel = fTree.getSelection(); - for (int i = 0; i < fButtonControls.length; i++) { - Button button = fButtonControls[i]; - if (isOkToUse(button)) { - button.setEnabled(isButtonEnabled(sel, i)); - } - } - } - } - - protected boolean containsAttributes(List selected) { - for (int i = 0; i < selected.size(); i++) { - if (!fElements.contains(selected.get(i))) { - return true; - } - } - return false; - } - - protected boolean getManagedButtonState(ISelection sel, int index) { - List selected = getSelectedElements(); - boolean hasAttributes = containsAttributes(selected); - if (index == fRemoveButtonIndex) { - return !selected.isEmpty() && !hasAttributes; - } else if (index == fUpButtonIndex) { - return !sel.isEmpty() && !hasAttributes && canMoveUp(selected); - } else if (index == fDownButtonIndex) { - return !sel.isEmpty() && !hasAttributes && canMoveDown(selected); - } - return true; - } - - /* - * @see DialogField#updateEnableState - */ - protected void updateEnableState() { - super.updateEnableState(); - - boolean enabled = isEnabled(); - if (isOkToUse(fTreeControl)) { - if (!enabled) { - fSelectionWhenEnabled = fTree.getSelection(); - selectElements(null); - } else { - selectElements(fSelectionWhenEnabled); - fSelectionWhenEnabled = null; - } - fTreeControl.setEnabled(enabled); - } - updateButtonState(); - } - - /** - * Sets a button enabled or disabled. - */ - public void enableButton(int index, boolean enable) { - if (fButtonsEnabled != null && index < fButtonsEnabled.length) { - fButtonsEnabled[index] = enable; - updateButtonState(); - } - } - - private boolean isButtonEnabled(ISelection sel, int index) { - boolean extraState = getManagedButtonState(sel, index); - return isEnabled() && extraState && fButtonsEnabled[index]; - } - - // ------ model access - - /** - * Sets the elements shown in the list. - */ - public void setElements(List elements) { - fElements = new ArrayList(elements); - refresh(); - if (fTree != null) { - fTree.expandToLevel(fTreeExpandLevel); - } - dialogFieldChanged(); - } - - /** - * Gets the elements shown in the list. The list returned is a copy, so it - * can be modified by the user. - */ - public List getElements() { - return new ArrayList(fElements); - } - - /** - * Gets the element shown at the given index. - */ - public Object getElement(int index) { - return fElements.get(index); - } - - /** - * Gets the index of an element in the list or -1 if element is not in list. - */ - public int getIndexOfElement(Object elem) { - return fElements.indexOf(elem); - } - - /** - * Replace an element. - */ - public void replaceElement(Object oldElement, Object newElement) - throws IllegalArgumentException { - int idx = fElements.indexOf(oldElement); - if (idx != -1) { - fElements.set(idx, newElement); - if (fTree != null) { - List selected = getSelectedElements(); - if (selected.remove(oldElement)) { - selected.add(newElement); - } - boolean isExpanded = fTree.getExpandedState(oldElement); - fTree.remove(oldElement); - fTree.add(fParentElement, newElement); - if (isExpanded) { - fTree.expandToLevel(newElement, fTreeExpandLevel); - } - selectElements(new StructuredSelection(selected)); - } - dialogFieldChanged(); - } else { - throw new IllegalArgumentException(); - } - } - - /** - * Adds an element at the end of the tree list. - */ - public void addElement(Object element) { - if (fElements.contains(element)) { - return; - } - fElements.add(element); - if (fTree != null) { - fTree.add(fParentElement, element); - fTree.expandToLevel(element, fTreeExpandLevel); - } - dialogFieldChanged(); - } - - /** - * Adds elements at the end of the tree list. - */ - public void addElements(List elements) { - int nElements = elements.size(); - - if (nElements > 0) { - // filter duplicated - ArrayList elementsToAdd = new ArrayList(nElements); - - for (int i = 0; i < nElements; i++) { - Object elem = elements.get(i); - if (!fElements.contains(elem)) { - elementsToAdd.add(elem); - } - } - fElements.addAll(elementsToAdd); - if (fTree != null) { - fTree.add(fParentElement, elementsToAdd.toArray()); - for (int i = 0; i < elementsToAdd.size(); i++) { - fTree.expandToLevel(elementsToAdd.get(i), fTreeExpandLevel); - } - } - dialogFieldChanged(); - } - } - - /** - * Adds an element at a position. - */ - public void insertElementAt(Object element, int index) { - if (fElements.contains(element)) { - return; - } - fElements.add(index, element); - if (fTree != null) { - fTree.add(fParentElement, element); - if (fTreeExpandLevel != -1) { - fTree.expandToLevel(element, fTreeExpandLevel); - } - } - - dialogFieldChanged(); - } - - /** - * Adds an element at a position. - */ - public void removeAllElements() { - if (fElements.size() > 0) { - fElements.clear(); - refresh(); - dialogFieldChanged(); - } - } - - /** - * Removes an element from the list. - */ - public void removeElement(Object element) throws IllegalArgumentException { - if (fElements.remove(element)) { - if (fTree != null) { - fTree.remove(element); - } - dialogFieldChanged(); - } else { - throw new IllegalArgumentException(); - } - } - - /** - * Removes elements from the list. - */ - public void removeElements(List elements) { - if (elements.size() > 0) { - fElements.removeAll(elements); - if (fTree != null) { - fTree.remove(elements.toArray()); - } - dialogFieldChanged(); - } - } - - /** - * Gets the number of elements - */ - public int getSize() { - return fElements.size(); - } - - public void selectElements(ISelection selection) { - fSelectionWhenEnabled = selection; - if (fTree != null) { - fTree.setSelection(selection, true); - } - } - - public void selectFirstElement() { - Object element = null; - if (fViewerSorter != null) { - Object[] arr = fElements.toArray(); - fViewerSorter.sort(fTree, arr); - if (arr.length > 0) { - element = arr[0]; - } - } else { - if (fElements.size() > 0) { - element = fElements.get(0); - } - } - if (element != null) { - selectElements(new StructuredSelection(element)); - } - } - - public void postSetSelection(final ISelection selection) { - if (isOkToUse(fTreeControl)) { - Display d = fTreeControl.getDisplay(); - d.asyncExec(new Runnable() { - public void run() { - if (isOkToUse(fTreeControl)) { - selectElements(selection); - } - } - }); - } - } - - /** - * Refreshes the tree. - */ - public void refresh() { - if (fTree != null) { - fTree.refresh(); - } - } - - /** - * Refreshes the tree. - */ - public void refresh(Object element) { - if (fTree != null) { - fTree.refresh(element); - } - } - - // ------- list maintenance - - private List moveUp(List elements, List move) { - int nElements = elements.size(); - List res = new ArrayList(nElements); - Object floating = null; - for (int i = 0; i < nElements; i++) { - Object curr = elements.get(i); - if (move.contains(curr)) { - res.add(curr); - } else { - if (floating != null) { - res.add(floating); - } - floating = curr; - } - } - if (floating != null) { - res.add(floating); - } - return res; - } - - private void moveUp(List toMoveUp) { - if (toMoveUp.size() > 0) { - setElements(moveUp(fElements, toMoveUp)); - fTree.reveal(toMoveUp.get(0)); - } - } - - private void moveDown(List toMoveDown) { - if (toMoveDown.size() > 0) { - setElements(reverse(moveUp(reverse(fElements), toMoveDown))); - fTree.reveal(toMoveDown.get(toMoveDown.size() - 1)); - } - } - - private List reverse(List p) { - List reverse = new ArrayList(p.size()); - for (int i = p.size() - 1; i >= 0; i--) { - reverse.add(p.get(i)); - } - return reverse; - } - - private void remove() { - removeElements(getSelectedElements()); - } - - private void up() { - moveUp(getSelectedElements()); - } - - private void down() { - moveDown(getSelectedElements()); - } - - private boolean canMoveUp(List selectedElements) { - if (isOkToUse(fTreeControl)) { - int nSelected = selectedElements.size(); - int nElements = fElements.size(); - for (int i = 0; i < nElements && nSelected > 0; i++) { - if (!selectedElements.contains(fElements.get(i))) { - return true; - } - nSelected--; - } - } - return false; - } - - private boolean canMoveDown(List selectedElements) { - if (isOkToUse(fTreeControl)) { - int nSelected = selectedElements.size(); - for (int i = fElements.size() - 1; i >= 0 && nSelected > 0; i--) { - if (!selectedElements.contains(fElements.get(i))) { - return true; - } - nSelected--; - } - } - return false; - } - - /** - * Returns the selected elements. - */ - public List getSelectedElements() { - ArrayList result = new ArrayList(); - if (fTree != null) { - ISelection selection = fTree.getSelection(); - if (selection instanceof IStructuredSelection) { - Iterator iter = ((IStructuredSelection) selection).iterator(); - while (iter.hasNext()) { - result.add(iter.next()); - } - } - } - return result; - } - - public void expandElement(Object element, int level) { - if (fTree != null) { - fTree.expandToLevel(element, level); - } - } - - // ------- TreeViewerAdapter - - private class TreeViewerAdapter implements ITreeContentProvider, - ISelectionChangedListener, IDoubleClickListener { - - private final Object[] NO_ELEMENTS = new Object[0]; - - // ------- ITreeContentProvider Interface ------------ - - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { - // will never happen - } - - public boolean isDeleted(Object element) { - return false; - } - - public void dispose() { - } - - public Object[] getElements(Object obj) { - return fElements.toArray(); - } - - public Object[] getChildren(Object element) { - if (fTreeAdapter != null) { - return fTreeAdapter.getChildren(TreeListDialogField.this, - element); - } - return NO_ELEMENTS; - } - - public Object getParent(Object element) { - if (!fElements.contains(element) && fTreeAdapter != null) { - return fTreeAdapter - .getParent(TreeListDialogField.this, element); - } - return fParentElement; - } - - public boolean hasChildren(Object element) { - if (fTreeAdapter != null) { - return fTreeAdapter.hasChildren(TreeListDialogField.this, - element); - } - return false; - } - - // ------- ISelectionChangedListener Interface ------------ - - public void selectionChanged(SelectionChangedEvent event) { - doListSelected(event); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent) - */ - public void doubleClick(DoubleClickEvent event) { - doDoubleClick(event); - } - - } - - protected void doListSelected(SelectionChangedEvent event) { - updateButtonState(); - if (fTreeAdapter != null) { - fTreeAdapter.selectionChanged(this); - } - } - - protected void doDoubleClick(DoubleClickEvent event) { - if (fTreeAdapter != null) { - fTreeAdapter.doubleClicked(this); - } - } - -}