diff options
Diffstat (limited to 'autotools/org.eclipse.linuxtools.cdt.autotools.ui/src/org/eclipse/linuxtools/internal/cdt/autotools/ui/editors/automake/AbstractElementListSelectionDialog.java')
-rw-r--r-- | autotools/org.eclipse.linuxtools.cdt.autotools.ui/src/org/eclipse/linuxtools/internal/cdt/autotools/ui/editors/automake/AbstractElementListSelectionDialog.java | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/autotools/org.eclipse.linuxtools.cdt.autotools.ui/src/org/eclipse/linuxtools/internal/cdt/autotools/ui/editors/automake/AbstractElementListSelectionDialog.java b/autotools/org.eclipse.linuxtools.cdt.autotools.ui/src/org/eclipse/linuxtools/internal/cdt/autotools/ui/editors/automake/AbstractElementListSelectionDialog.java new file mode 100644 index 0000000000..f63da33227 --- /dev/null +++ b/autotools/org.eclipse.linuxtools.cdt.autotools.ui/src/org/eclipse/linuxtools/internal/cdt/autotools/ui/editors/automake/AbstractElementListSelectionDialog.java @@ -0,0 +1,283 @@ +/******************************************************************************* + * Copyright (c) 2005 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + * QNX Software System + *******************************************************************************/ +package org.eclipse.linuxtools.internal.cdt.autotools.ui.editors.automake; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.BusyIndicator; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; + +import org.eclipse.jface.viewers.ILabelProvider; + +/** + * A class to select one or more elements out of an indexed property + */ +public abstract class AbstractElementListSelectionDialog extends SelectionStatusDialog { + + private ILabelProvider fRenderer; + private boolean fIgnoreCase; + private boolean fIsMultipleSelection; + + private SelectionList fSelectionList; + private Label fMessage; + private ISelectionValidator fValidator; + + private String fMessageText; + private String fEmptyListMessage; + private String fNothingSelectedMessage; + + private StatusInfo fCurrStatus; + + /* + * @private + */ + protected void access$superOpen() { + super.open(); + } + /* + * @private + * @see Dialog#cancelPressed + */ + protected void cancelPressed() { + setResult(null); + super.cancelPressed(); + } + protected Point computeInitialSize() { + return new Point(convertWidthInCharsToPixels(60), convertHeightInCharsToPixels(18)); + } + /* + * @private + * @see Window#createDialogArea(Composite) + */ + protected Control createDialogArea(Composite parent) { + Composite contents= (Composite)super.createDialogArea(parent); + + fMessage= createMessage(contents); + + int flags= fIsMultipleSelection ? SWT.MULTI : SWT.SINGLE; + fSelectionList= new SelectionList(contents, flags | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL, + fRenderer, fIgnoreCase); + + fSelectionList.addSelectionListener(new SelectionListener() { + public void widgetDefaultSelected(SelectionEvent e) { + handleDoubleClick(); + } + public void widgetSelected(SelectionEvent e) { + verifyCurrentSelection(); + } + }); + + GridData spec= new GridData(); + Point initialSize= computeInitialSize(); + spec.widthHint= initialSize.x; + spec.heightHint= initialSize.y; + spec.grabExcessVerticalSpace= true; + spec.grabExcessHorizontalSpace= true; + spec.horizontalAlignment= GridData.FILL; + spec.verticalAlignment= GridData.FILL; + fSelectionList.setLayoutData(spec); + + return contents; + } + /** + * Creates the message text widget and sets layout data. + */ + protected Label createMessage(Composite parent) { + Label text= new Label(parent, SWT.NULL); + text.setText(fMessageText); + GridData spec= new GridData(); + spec.grabExcessVerticalSpace= false; + spec.grabExcessHorizontalSpace= true; + spec.horizontalAlignment= GridData.FILL; + spec.verticalAlignment= GridData.BEGINNING; + text.setLayoutData(spec); + return text; + } + /* + * @private + * @see Window#create(Shell) + */ + public void create() { + super.create(); + if (isEmptyList()) { + fMessage.setEnabled(false); + fSelectionList.setEnabled(false); + } else { + verifyCurrentSelection(); + fSelectionList.selectFilterText(); + fSelectionList.setFocus(); + } + } + /** + * Returns the currently used filter text. + */ + protected String getFilter() { + return fSelectionList.getFilter(); + } + /** + * Returns the selection indices. + */ + protected int[] getSelectionIndices() { + return fSelectionList.getSelectionIndices(); + } + /** + * Returns the widget selection. Returns empty list when the widget is not + * usable. + */ + protected List<Object> getWidgetSelection() { + if (fSelectionList == null || fSelectionList.isDisposed()) + return new ArrayList<Object>(0); + return fSelectionList.getSelection(); + } + /** + * An element as been selected in the list by double clicking on it. + * Emulate a OK button pressed to close the dialog. + */ + protected abstract void handleDoubleClick(); + /** + * Checks whether the list of elements is empty or not. + */ + protected boolean isEmptyList() { + if (fSelectionList == null) + return true; + return fSelectionList.isEmptyList(); + } + /** + * Constructs a list selection dialog. + * @param renderer The label renderer used + * @param ignoreCase Decides if the match string ignores lower/upppr case + * @param multipleSelection Allow multiple selection + */ + protected AbstractElementListSelectionDialog(Shell parent, String title, Image image, ILabelProvider renderer, boolean ignoreCase, boolean multipleSelection) { + super(parent); + setTitle(title); + setImage(image); + fRenderer= renderer; + fIgnoreCase= ignoreCase; + fIsMultipleSelection= multipleSelection; + + fMessageText= ""; //$NON-NLS-1$ + + fCurrStatus= new StatusInfo(); + + fValidator= null; + fEmptyListMessage= ""; //$NON-NLS-1$ + fNothingSelectedMessage= ""; //$NON-NLS-1$ + } + /** + * Constructs a list selection dialog. + * @param renderer The label renderer used + * @param ignoreCase Decides if the match string ignores lower/upppr case + * @param multipleSelection Allow multiple selection + */ + protected AbstractElementListSelectionDialog(Shell parent, ILabelProvider renderer, boolean ignoreCase, boolean multipleSelection) { + this(parent, "", null, renderer, ignoreCase, multipleSelection); //$NON-NLS-1$ + } + /* + * @private + */ + public int open() { + BusyIndicator.showWhile(null, new Runnable() { + public void run() { + access$superOpen(); + } + }); + return getReturnCode() ; + } + /** + * Refilters the current list according to the filter entered into the + * text edit field. + */ + protected void refilter() { + fSelectionList.filter(true); + } + /** + * If a empty-list message is set, a error message is shown + * Must be set before widget creation + */ + public void setEmptyListMessage(String message) { + fEmptyListMessage= message; + } + /** + * Sets the filter text to the given value. + */ + protected void setFilter(String text, boolean refilter) { + fSelectionList.setFilter(text, refilter); + } + /** + * Sets the message to be shown above the match text field. + * Must be set before widget creation + */ + public void setMessage(String message) { + fMessageText= message; + } + /** + * If the selection is empty, this message is shown + */ + public void setNothingSelectedMessage(String message) { + fNothingSelectedMessage= message; + } + /** + * Selects the elements in the list determined by the given + * selection indices. + */ + protected void setSelection(int[] selection) { + fSelectionList.setSelection(selection); + } + /** + * Initializes the selection list widget with the given list of + * elements. + */ + protected void setSelectionListElements(List<Object> elements, boolean refilter) { + fSelectionList.setElements(elements, refilter); + } + /** + * A validator can be set to check if the current selection + * is valid + */ + public void setValidator(ISelectionValidator validator) { + fValidator= validator; + } + /** + * Verifies the current selection and updates the status line + * accordingly. + */ + protected boolean verifyCurrentSelection() { + List<Object> sel= getWidgetSelection(); + int length= sel.size(); + if (length > 0) { + if (fValidator != null) { + fValidator.isValid(sel.toArray(), fCurrStatus); + } else { + fCurrStatus.setOK(); + } + } else { + if (isEmptyList()) { + fCurrStatus.setError(fEmptyListMessage); + } else { + fCurrStatus.setError(fNothingSelectedMessage); + } + } + updateStatus(fCurrStatus); + return fCurrStatus.isOK(); + } +} |