mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Added the 'org.eclipse.cdt.debug.internal.ui.dialogfields' package.
This commit is contained in:
parent
c2ed9818ca
commit
776735b2af
15 changed files with 2586 additions and 0 deletions
|
@ -1,3 +1,6 @@
|
||||||
|
2002-12-19 Mikhail Khodjaiants
|
||||||
|
Added the 'org.eclipse.cdt.debug.internal.ui.dialogfields' package.
|
||||||
|
|
||||||
2002-12-19 Mikhail Khodjaiants
|
2002-12-19 Mikhail Khodjaiants
|
||||||
Added new utility class - SWTUtil
|
Added new utility class - SWTUtil
|
||||||
* SWTUtil.java
|
* SWTUtil.java
|
||||||
|
|
|
@ -0,0 +1,209 @@
|
||||||
|
/*
|
||||||
|
* (c) Copyright IBM Corp. 2000, 2001.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.dialogfields;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.jface.util.Assert;
|
||||||
|
import org.eclipse.jface.viewers.CheckStateChangedEvent;
|
||||||
|
import org.eclipse.jface.viewers.CheckboxTableViewer;
|
||||||
|
import org.eclipse.jface.viewers.ICheckStateListener;
|
||||||
|
import org.eclipse.jface.viewers.ILabelProvider;
|
||||||
|
import org.eclipse.jface.viewers.ISelection;
|
||||||
|
import org.eclipse.jface.viewers.TableViewer;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Table;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list with checkboxes and a button bar. Typical buttons are 'Check All' and 'Uncheck All'.
|
||||||
|
* List model is independend of widget creation.
|
||||||
|
* DialogFields controls are: Label, List and Composite containing buttons.
|
||||||
|
*/
|
||||||
|
public class CheckedListDialogField extends ListDialogField {
|
||||||
|
|
||||||
|
private int fCheckAllButtonIndex;
|
||||||
|
private int fUncheckAllButtonIndex;
|
||||||
|
|
||||||
|
private List fCheckElements;
|
||||||
|
|
||||||
|
public CheckedListDialogField(IListAdapter adapter, String[] customButtonLabels, ILabelProvider lprovider) {
|
||||||
|
super(adapter, customButtonLabels, lprovider);
|
||||||
|
fCheckElements= new ArrayList();
|
||||||
|
|
||||||
|
fCheckAllButtonIndex= -1;
|
||||||
|
fUncheckAllButtonIndex= -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the index of the 'check' button in the button label array passed in the constructor.
|
||||||
|
* The behaviour of the button marked as the check button will then be handled internally.
|
||||||
|
* (enable state, button invocation behaviour)
|
||||||
|
*/
|
||||||
|
public void setCheckAllButtonIndex(int checkButtonIndex) {
|
||||||
|
Assert.isTrue(checkButtonIndex < fButtonLabels.length);
|
||||||
|
fCheckAllButtonIndex= checkButtonIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the index of the 'uncheck' button in the button label array passed in the constructor.
|
||||||
|
* The behaviour of the button marked as the uncheck button will then be handled internally.
|
||||||
|
* (enable state, button invocation behaviour)
|
||||||
|
*/
|
||||||
|
public void setUncheckAllButtonIndex(int uncheckButtonIndex) {
|
||||||
|
Assert.isTrue(uncheckButtonIndex < fButtonLabels.length);
|
||||||
|
fUncheckAllButtonIndex= uncheckButtonIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see ListDialogField#createTableViewer
|
||||||
|
*/
|
||||||
|
protected TableViewer createTableViewer(Composite parent) {
|
||||||
|
Table table= new Table(parent, SWT.CHECK + getListStyle());
|
||||||
|
CheckboxTableViewer tableViewer= new CheckboxTableViewer(table);
|
||||||
|
tableViewer.addCheckStateListener(new ICheckStateListener() {
|
||||||
|
public void checkStateChanged(CheckStateChangedEvent e) {
|
||||||
|
doCheckStateChanged(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return tableViewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see ListDialogField#getListControl
|
||||||
|
*/
|
||||||
|
public Control getListControl(Composite parent) {
|
||||||
|
Control control= super.getListControl(parent);
|
||||||
|
if (parent != null) {
|
||||||
|
((CheckboxTableViewer)fTable).setCheckedElements(fCheckElements.toArray());
|
||||||
|
}
|
||||||
|
return control;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#dialogFieldChanged
|
||||||
|
* Hooks in to get element changes to update check model.
|
||||||
|
*/
|
||||||
|
public void dialogFieldChanged() {
|
||||||
|
for (int i= fCheckElements.size() -1; i >= 0; i--) {
|
||||||
|
if (!fElements.contains(fCheckElements.get(i))) {
|
||||||
|
fCheckElements.remove(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
super.dialogFieldChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkStateChanged() {
|
||||||
|
//call super and do not update check model
|
||||||
|
super.dialogFieldChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the checked elements.
|
||||||
|
*/
|
||||||
|
public List getCheckedElements() {
|
||||||
|
return new ArrayList(fCheckElements);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the element is checked.
|
||||||
|
*/
|
||||||
|
public boolean isChecked(Object obj) {
|
||||||
|
return fCheckElements.contains(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the checked elements.
|
||||||
|
*/
|
||||||
|
public void setCheckedElements(List list) {
|
||||||
|
fCheckElements= new ArrayList(list);
|
||||||
|
if (fTable != null) {
|
||||||
|
((CheckboxTableViewer)fTable).setCheckedElements(list.toArray());
|
||||||
|
}
|
||||||
|
checkStateChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the checked state of an element.
|
||||||
|
*/
|
||||||
|
public void setChecked(Object object, boolean state) {
|
||||||
|
setCheckedWithoutUpdate(object, state);
|
||||||
|
checkStateChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the checked state of an element. no dialog changed listener informed
|
||||||
|
*/
|
||||||
|
public void setCheckedWithoutUpdate(Object object, boolean state) {
|
||||||
|
if (!fCheckElements.contains(object)) {
|
||||||
|
fCheckElements.add(object);
|
||||||
|
}
|
||||||
|
if (fTable != null) {
|
||||||
|
((CheckboxTableViewer)fTable).setChecked(object, state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the check state of all elements
|
||||||
|
*/
|
||||||
|
public void checkAll(boolean state) {
|
||||||
|
if (state) {
|
||||||
|
fCheckElements= getElements();
|
||||||
|
} else {
|
||||||
|
fCheckElements.clear();
|
||||||
|
}
|
||||||
|
if (fTable != null) {
|
||||||
|
((CheckboxTableViewer)fTable).setAllChecked(state);
|
||||||
|
}
|
||||||
|
checkStateChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void doCheckStateChanged(CheckStateChangedEvent e) {
|
||||||
|
if (e.getChecked()) {
|
||||||
|
fCheckElements.add(e.getElement());
|
||||||
|
} else {
|
||||||
|
fCheckElements.remove(e.getElement());
|
||||||
|
}
|
||||||
|
checkStateChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ enable / disable management
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see ListDialogField#getManagedButtonState
|
||||||
|
*/
|
||||||
|
protected boolean getManagedButtonState(ISelection sel, int index) {
|
||||||
|
if (index == fCheckAllButtonIndex) {
|
||||||
|
return !fElements.isEmpty();
|
||||||
|
} else if (index == fUncheckAllButtonIndex) {
|
||||||
|
return !fElements.isEmpty();
|
||||||
|
}
|
||||||
|
return super.getManagedButtonState(sel, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see ListDialogField#extraButtonPressed
|
||||||
|
*/
|
||||||
|
protected boolean managedButtonPressed(int index) {
|
||||||
|
if (index == fCheckAllButtonIndex) {
|
||||||
|
checkAll(true);
|
||||||
|
} else if (index == fUncheckAllButtonIndex) {
|
||||||
|
checkAll(false);
|
||||||
|
} else {
|
||||||
|
return super.managedButtonPressed(index);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,219 @@
|
||||||
|
/*
|
||||||
|
* (c) Copyright IBM Corp. 2000, 2001.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.dialogfields;
|
||||||
|
|
||||||
|
import org.eclipse.swt.events.ModifyEvent;
|
||||||
|
import org.eclipse.swt.events.ModifyListener;
|
||||||
|
import org.eclipse.swt.events.SelectionEvent;
|
||||||
|
import org.eclipse.swt.events.SelectionListener;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.widgets.Combo;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dialog field containing a label and a combo control.
|
||||||
|
*/
|
||||||
|
public class ComboDialogField extends DialogField {
|
||||||
|
|
||||||
|
private String fText;
|
||||||
|
private int fSelectionIndex;
|
||||||
|
private String[] fItems;
|
||||||
|
private Combo fComboControl;
|
||||||
|
private ModifyListener fModifyListener;
|
||||||
|
private int fFlags;
|
||||||
|
|
||||||
|
public ComboDialogField(int flags) {
|
||||||
|
super();
|
||||||
|
fText= ""; //$NON-NLS-1$
|
||||||
|
fItems= new String[0];
|
||||||
|
fFlags= flags;
|
||||||
|
fSelectionIndex= -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- layout helpers
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#doFillIntoGrid
|
||||||
|
*/
|
||||||
|
public Control[] doFillIntoGrid(Composite parent, int nColumns) {
|
||||||
|
assertEnoughColumns(nColumns);
|
||||||
|
|
||||||
|
Label label= getLabelControl(parent);
|
||||||
|
label.setLayoutData(gridDataForLabel(1));
|
||||||
|
Combo combo= getComboControl(parent);
|
||||||
|
combo.setLayoutData(gridDataForCombo(nColumns - 1));
|
||||||
|
|
||||||
|
return new Control[] { label, combo };
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#getNumberOfControls
|
||||||
|
*/
|
||||||
|
public int getNumberOfControls() {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static GridData gridDataForCombo(int span) {
|
||||||
|
GridData gd= new GridData();
|
||||||
|
gd.horizontalAlignment= gd.FILL;
|
||||||
|
gd.grabExcessHorizontalSpace= false;
|
||||||
|
gd.horizontalSpan= span;
|
||||||
|
return gd;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- focus methods
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#setFocus
|
||||||
|
*/
|
||||||
|
public boolean setFocus() {
|
||||||
|
if (isOkToUse(fComboControl)) {
|
||||||
|
fComboControl.setFocus();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- ui creation
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates or returns the created combo control.
|
||||||
|
* @param parent The parent composite or <code>null</code> when the widget has
|
||||||
|
* already been created.
|
||||||
|
*/
|
||||||
|
public Combo getComboControl(Composite parent) {
|
||||||
|
if (fComboControl == null) {
|
||||||
|
assertCompositeNotNull(parent);
|
||||||
|
fModifyListener= new ModifyListener() {
|
||||||
|
public void modifyText(ModifyEvent e) {
|
||||||
|
doModifyText(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
SelectionListener selectionListener= new SelectionListener() {
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
doSelectionChanged(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void widgetDefaultSelected(SelectionEvent e) { };
|
||||||
|
};
|
||||||
|
|
||||||
|
fComboControl= new Combo(parent, fFlags);
|
||||||
|
// moved up due to 1GEUNW2
|
||||||
|
fComboControl.setItems(fItems);
|
||||||
|
if (fSelectionIndex != -1) {
|
||||||
|
fComboControl.select(fSelectionIndex);
|
||||||
|
} else {
|
||||||
|
fComboControl.setText(fText);
|
||||||
|
}
|
||||||
|
fComboControl.setFont(parent.getFont());
|
||||||
|
fComboControl.addModifyListener(fModifyListener);
|
||||||
|
fComboControl.addSelectionListener(selectionListener);
|
||||||
|
fComboControl.setEnabled(isEnabled());
|
||||||
|
}
|
||||||
|
return fComboControl;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doModifyText(ModifyEvent e) {
|
||||||
|
if (isOkToUse(fComboControl)) {
|
||||||
|
fText= fComboControl.getText();
|
||||||
|
fSelectionIndex= fComboControl.getSelectionIndex();
|
||||||
|
}
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doSelectionChanged(SelectionEvent e) {
|
||||||
|
if (isOkToUse(fComboControl)) {
|
||||||
|
fItems= fComboControl.getItems();
|
||||||
|
fText= fComboControl.getText();
|
||||||
|
fSelectionIndex= fComboControl.getSelectionIndex();
|
||||||
|
}
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ enable / disable management
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#updateEnableState
|
||||||
|
*/
|
||||||
|
protected void updateEnableState() {
|
||||||
|
super.updateEnableState();
|
||||||
|
if (isOkToUse(fComboControl)) {
|
||||||
|
fComboControl.setEnabled(isEnabled());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ text access
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the combo items.
|
||||||
|
*/
|
||||||
|
public String[] getItems() {
|
||||||
|
return fItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the combo items. Triggers a dialog-changed event.
|
||||||
|
*/
|
||||||
|
public void setItems(String[] items) {
|
||||||
|
fItems= items;
|
||||||
|
if (isOkToUse(fComboControl)) {
|
||||||
|
fComboControl.setItems(items);
|
||||||
|
}
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the text.
|
||||||
|
*/
|
||||||
|
public String getText() {
|
||||||
|
return fText;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the text. Triggers a dialog-changed event.
|
||||||
|
*/
|
||||||
|
public void setText(String text) {
|
||||||
|
fText= text;
|
||||||
|
if (isOkToUse(fComboControl)) {
|
||||||
|
fComboControl.setText(text);
|
||||||
|
} else {
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Selects an item.
|
||||||
|
*/
|
||||||
|
public void selectItem(int index) {
|
||||||
|
if (isOkToUse(fComboControl)) {
|
||||||
|
fComboControl.select(index);
|
||||||
|
} else {
|
||||||
|
if (index >= 0 && index < fItems.length) {
|
||||||
|
fText= fItems[index];
|
||||||
|
fSelectionIndex= index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSelectionIndex() {
|
||||||
|
return fSelectionIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the text without triggering a dialog-changed event.
|
||||||
|
*/
|
||||||
|
public void setTextWithoutUpdate(String text) {
|
||||||
|
fText= text;
|
||||||
|
if (isOkToUse(fComboControl)) {
|
||||||
|
fComboControl.removeModifyListener(fModifyListener);
|
||||||
|
fComboControl.setText(text);
|
||||||
|
fComboControl.addModifyListener(fModifyListener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,222 @@
|
||||||
|
/*
|
||||||
|
* (c) Copyright IBM Corp. 2000, 2001.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.dialogfields;
|
||||||
|
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
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.jface.util.Assert;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class of all dialog fields.
|
||||||
|
* Dialog fields manage controls together with the model, independed
|
||||||
|
* from the creation time of the widgets.
|
||||||
|
* - support for automated layouting.
|
||||||
|
* - enable / disable, set focus a concept of the base class.
|
||||||
|
*
|
||||||
|
* DialogField have a label.
|
||||||
|
*/
|
||||||
|
public class DialogField {
|
||||||
|
|
||||||
|
private Label fLabel;
|
||||||
|
protected String fLabelText;
|
||||||
|
|
||||||
|
private IDialogFieldListener fDialogFieldListener;
|
||||||
|
|
||||||
|
private boolean fEnabled;
|
||||||
|
|
||||||
|
public DialogField() {
|
||||||
|
fEnabled= true;
|
||||||
|
fLabel= null;
|
||||||
|
fLabelText= ""; //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the label of the dialog field.
|
||||||
|
*/
|
||||||
|
public void setLabelText(String labeltext) {
|
||||||
|
fLabelText= labeltext;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ change listener
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the listener for this dialog field.
|
||||||
|
*/
|
||||||
|
public final void setDialogFieldListener(IDialogFieldListener listener) {
|
||||||
|
fDialogFieldListener= listener;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Programatical invocation of a dialog field change.
|
||||||
|
*/
|
||||||
|
public void dialogFieldChanged() {
|
||||||
|
if (fDialogFieldListener != null) {
|
||||||
|
fDialogFieldListener.dialogFieldChanged(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- focus management
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tries to set the focus to the dialog field.
|
||||||
|
* Returns <code>true</code> if the dialog field can take focus.
|
||||||
|
* To be reimplemented by dialog field implementors.
|
||||||
|
*/
|
||||||
|
public boolean setFocus() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Posts <code>setFocus</code> to the display event queue.
|
||||||
|
*/
|
||||||
|
public void postSetFocusOnDialogField(Display display) {
|
||||||
|
if (display != null) {
|
||||||
|
display.asyncExec(
|
||||||
|
new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
setFocus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- layout helpers
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates all controls of the dialog field and fills it to a composite.
|
||||||
|
* The composite is assumed to have <code>MGridLayout</code> as
|
||||||
|
* layout.
|
||||||
|
* The dialog field will adjust its controls' spans to the number of columns given.
|
||||||
|
* To be reimplemented by dialog field implementors.
|
||||||
|
*/
|
||||||
|
public Control[] doFillIntoGrid(Composite parent, int nColumns) {
|
||||||
|
assertEnoughColumns(nColumns);
|
||||||
|
|
||||||
|
Label label= getLabelControl(parent);
|
||||||
|
label.setLayoutData(gridDataForLabel(nColumns));
|
||||||
|
|
||||||
|
return new Control[] { label };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the number of columns of the dialog field.
|
||||||
|
* To be reimplemented by dialog field implementors.
|
||||||
|
*/
|
||||||
|
public int getNumberOfControls() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static GridData gridDataForLabel(int span) {
|
||||||
|
GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
|
||||||
|
gd.horizontalSpan= span;
|
||||||
|
return gd;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- ui creation
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates or returns the created label widget.
|
||||||
|
* @param parent The parent composite or <code>null</code> if the widget has
|
||||||
|
* already been created.
|
||||||
|
*/
|
||||||
|
public Label getLabelControl(Composite parent) {
|
||||||
|
if (fLabel == null) {
|
||||||
|
assertCompositeNotNull(parent);
|
||||||
|
|
||||||
|
fLabel= new Label(parent, SWT.LEFT | SWT.WRAP);
|
||||||
|
fLabel.setFont(parent.getFont());
|
||||||
|
fLabel.setEnabled(fEnabled);
|
||||||
|
if (fLabelText != null && !"".equals(fLabelText)) { //$NON-NLS-1$
|
||||||
|
fLabel.setText(fLabelText);
|
||||||
|
} else {
|
||||||
|
// XXX: to avoid a 16 pixel wide empty label - revisit
|
||||||
|
fLabel.setText("."); //$NON-NLS-1$
|
||||||
|
fLabel.setVisible(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a spacer control.
|
||||||
|
* @param parent The parent composite
|
||||||
|
*/
|
||||||
|
public static Control createEmptySpace(Composite parent) {
|
||||||
|
return createEmptySpace(parent, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a spacer control with the given span.
|
||||||
|
* The composite is assumed to have <code>MGridLayout</code> as
|
||||||
|
* layout.
|
||||||
|
* @param parent The parent composite
|
||||||
|
*/
|
||||||
|
public static Control createEmptySpace(Composite parent, int span) {
|
||||||
|
Label label= new Label(parent, SWT.LEFT);
|
||||||
|
GridData gd= new GridData();
|
||||||
|
gd.horizontalAlignment= gd.BEGINNING;
|
||||||
|
gd.grabExcessHorizontalSpace= false;
|
||||||
|
gd.horizontalSpan= span;
|
||||||
|
gd.horizontalIndent= 0;
|
||||||
|
gd.widthHint= 0;
|
||||||
|
gd.heightHint= 0;
|
||||||
|
label.setLayoutData(gd);
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests is the control is not <code>null</code> and not disposed.
|
||||||
|
*/
|
||||||
|
protected final boolean isOkToUse(Control control) {
|
||||||
|
return (control != null) && !(control.isDisposed());
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------- enable / disable management
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the enable state of the dialog field.
|
||||||
|
*/
|
||||||
|
public final void setEnabled(boolean enabled) {
|
||||||
|
if (enabled != fEnabled) {
|
||||||
|
fEnabled= enabled;
|
||||||
|
updateEnableState();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the enable state changed.
|
||||||
|
* To be extended by dialog field implementors.
|
||||||
|
*/
|
||||||
|
protected void updateEnableState() {
|
||||||
|
if (fLabel != null) {
|
||||||
|
fLabel.setEnabled(fEnabled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the enable state of the dialog field.
|
||||||
|
*/
|
||||||
|
public final boolean isEnabled() {
|
||||||
|
return fEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final void assertCompositeNotNull(Composite comp) {
|
||||||
|
Assert.isNotNull(comp, "uncreated control requested with composite null"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final void assertEnoughColumns(int nColumns) {
|
||||||
|
Assert.isTrue(nColumns >= getNumberOfControls(), "given number of columns is too small"); //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
/*
|
||||||
|
* (c) Copyright IBM Corp. 2000, 2001.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.dialogfields;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change listener used by <code>DialogField</code>
|
||||||
|
*/
|
||||||
|
public interface IDialogFieldListener {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The dialog field has changed.
|
||||||
|
*/
|
||||||
|
void dialogFieldChanged(DialogField field);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
/*
|
||||||
|
* (c) Copyright IBM Corp. 2000, 2001.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.dialogfields;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change listener used by <code>ListDialogField</code> and <code>CheckedListDialogField</code>
|
||||||
|
*/
|
||||||
|
public interface IListAdapter {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A button from the button bar has been pressed.
|
||||||
|
*/
|
||||||
|
void customButtonPressed(DialogField field, int index);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The selection of the list has changed.
|
||||||
|
*/
|
||||||
|
void selectionChanged(DialogField field);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
* (c) Copyright IBM Corp. 2000, 2001.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.dialogfields;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change listener used by <code>StringButtonDialogField</code>
|
||||||
|
*/
|
||||||
|
public interface IStringButtonAdapter {
|
||||||
|
|
||||||
|
void changeControlPressed(DialogField field);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,134 @@
|
||||||
|
/*
|
||||||
|
* (c) Copyright IBM Corp. 2000, 2001.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.dialogfields;
|
||||||
|
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.layout.GridLayout;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
|
||||||
|
public class LayoutUtil {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the number of columns needed by field editors
|
||||||
|
*/
|
||||||
|
public static int getNumberOfColumns(DialogField[] editors) {
|
||||||
|
int nCulumns= 0;
|
||||||
|
for (int i= 0; i < editors.length; i++) {
|
||||||
|
nCulumns= Math.max(editors[i].getNumberOfControls(), nCulumns);
|
||||||
|
}
|
||||||
|
return nCulumns;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a composite and fills in the given editors.
|
||||||
|
* @param labelOnTop Defines if the label of all fields should be on top of the fields
|
||||||
|
*/
|
||||||
|
public static void doDefaultLayout(Composite parent, DialogField[] editors, boolean labelOnTop) {
|
||||||
|
doDefaultLayout(parent, editors, labelOnTop, 0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a composite and fills in the given editors.
|
||||||
|
* @param labelOnTop Defines if the label of all fields should be on top of the fields
|
||||||
|
* @param minWidth The minimal width of the composite
|
||||||
|
* @param minHeight The minimal height of the composite
|
||||||
|
*/
|
||||||
|
public static void doDefaultLayout(Composite parent, DialogField[] editors, boolean labelOnTop, int minWidth, int minHeight) {
|
||||||
|
doDefaultLayout(parent, editors, labelOnTop, minWidth, minHeight, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a composite and fills in the given editors.
|
||||||
|
* @param labelOnTop Defines if the label of all fields should be on top of the fields
|
||||||
|
* @param minWidth The minimal width of the composite
|
||||||
|
* @param minHeight The minimal height of the composite
|
||||||
|
* @param marginWidth The margin width to be used by the composite
|
||||||
|
* @param marginHeight The margin height to be used by the composite
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
|
public static void doDefaultLayout(Composite parent, DialogField[] editors, boolean labelOnTop, int minWidth, int minHeight, int marginWidth, int marginHeight) {
|
||||||
|
int nCulumns= getNumberOfColumns(editors);
|
||||||
|
Control[][] controls= new Control[editors.length][];
|
||||||
|
for (int i= 0; i < editors.length; i++) {
|
||||||
|
controls[i]= editors[i].doFillIntoGrid(parent, nCulumns);
|
||||||
|
}
|
||||||
|
if (labelOnTop) {
|
||||||
|
nCulumns--;
|
||||||
|
modifyLabelSpans(controls, nCulumns);
|
||||||
|
}
|
||||||
|
GridLayout layout= new GridLayout();
|
||||||
|
if (marginWidth != SWT.DEFAULT) {
|
||||||
|
layout.marginWidth= marginWidth;
|
||||||
|
}
|
||||||
|
if (marginHeight != SWT.DEFAULT) {
|
||||||
|
layout.marginHeight= marginHeight;
|
||||||
|
}
|
||||||
|
layout.numColumns= nCulumns;
|
||||||
|
parent.setLayout(layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void modifyLabelSpans(Control[][] controls, int nCulumns) {
|
||||||
|
for (int i= 0; i < controls.length; i++) {
|
||||||
|
setHorizontalSpan(controls[i][0], nCulumns);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the span of a control. Assumes that GridData is used.
|
||||||
|
*/
|
||||||
|
public static void setHorizontalSpan(Control control, int span) {
|
||||||
|
Object ld= control.getLayoutData();
|
||||||
|
if (ld instanceof GridData) {
|
||||||
|
((GridData)ld).horizontalSpan= span;
|
||||||
|
} else if (span != 1) {
|
||||||
|
GridData gd= new GridData();
|
||||||
|
gd.horizontalSpan= span;
|
||||||
|
control.setLayoutData(gd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the width hint of a control. Assumes that GridData is used.
|
||||||
|
*/
|
||||||
|
public static void setWidthHint(Control control, int widthHint) {
|
||||||
|
Object ld= control.getLayoutData();
|
||||||
|
if (ld instanceof GridData) {
|
||||||
|
((GridData)ld).widthHint= widthHint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the heigthHint hint of a control. Assumes that GridData is used.
|
||||||
|
*/
|
||||||
|
public static void setHeigthHint(Control control, int heigthHint) {
|
||||||
|
Object ld= control.getLayoutData();
|
||||||
|
if (ld instanceof GridData) {
|
||||||
|
((GridData)ld).heightHint= heigthHint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the horizontal indent of a control. Assumes that GridData is used.
|
||||||
|
*/
|
||||||
|
public static void setHorizontalIndent(Control control, int horizontalIndent) {
|
||||||
|
Object ld= control.getLayoutData();
|
||||||
|
if (ld instanceof GridData) {
|
||||||
|
((GridData)ld).horizontalIndent= horizontalIndent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the horizontal indent of a control. Assumes that GridData is used.
|
||||||
|
*/
|
||||||
|
public static void setHorizontalGrabbing(Control control) {
|
||||||
|
Object ld= control.getLayoutData();
|
||||||
|
if (ld instanceof GridData) {
|
||||||
|
((GridData)ld).grabExcessHorizontalSpace= true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,774 @@
|
||||||
|
/*
|
||||||
|
* (c) Copyright IBM Corp. 2000, 2001.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.dialogfields;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.PixelConverter;
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.SWTUtil;
|
||||||
|
import org.eclipse.jface.util.Assert;
|
||||||
|
import org.eclipse.jface.viewers.ILabelProvider;
|
||||||
|
import org.eclipse.jface.viewers.ISelection;
|
||||||
|
import org.eclipse.jface.viewers.ISelectionChangedListener;
|
||||||
|
import org.eclipse.jface.viewers.IStructuredContentProvider;
|
||||||
|
import org.eclipse.jface.viewers.IStructuredSelection;
|
||||||
|
import org.eclipse.jface.viewers.SelectionChangedEvent;
|
||||||
|
import org.eclipse.jface.viewers.StructuredSelection;
|
||||||
|
import org.eclipse.jface.viewers.TableViewer;
|
||||||
|
import org.eclipse.jface.viewers.Viewer;
|
||||||
|
import org.eclipse.jface.viewers.ViewerSorter;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
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.Table;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 ListDialogField extends DialogField {
|
||||||
|
|
||||||
|
protected TableViewer fTable;
|
||||||
|
protected ILabelProvider fLabelProvider;
|
||||||
|
protected ListViewerAdapter fListViewerAdapter;
|
||||||
|
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 Table fTableControl;
|
||||||
|
private Composite fButtonsControl;
|
||||||
|
private ISelection fSelectionWhenEnabled;
|
||||||
|
|
||||||
|
private IListAdapter fListAdapter;
|
||||||
|
|
||||||
|
private Object fParentElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the <code>ListDialogField</code>.
|
||||||
|
* @param adapter A listener for button invocation, selection changes.
|
||||||
|
* @param buttonLabels The labels of all buttons: <code>null</code> is a valid array entry and
|
||||||
|
* marks a separator.
|
||||||
|
* @param lprovider The label provider to render the table entries
|
||||||
|
*/
|
||||||
|
public ListDialogField(IListAdapter adapter, String[] buttonLabels, ILabelProvider lprovider) {
|
||||||
|
super();
|
||||||
|
fListAdapter= adapter;
|
||||||
|
|
||||||
|
fLabelProvider= lprovider;
|
||||||
|
fListViewerAdapter= new ListViewerAdapter();
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fTable= null;
|
||||||
|
fTableControl= null;
|
||||||
|
fButtonsControl= null;
|
||||||
|
|
||||||
|
fRemoveButtonIndex= -1;
|
||||||
|
fUpButtonIndex= -1;
|
||||||
|
fDownButtonIndex= -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 be handled 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 be handled 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ adapter communication
|
||||||
|
|
||||||
|
private void buttonPressed(int index) {
|
||||||
|
if (!managedButtonPressed(index)) {
|
||||||
|
fListAdapter.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= gd.BEGINNING;
|
||||||
|
label.setLayoutData(gd);
|
||||||
|
|
||||||
|
Control list= getListControl(parent);
|
||||||
|
gd= new GridData();
|
||||||
|
gd.horizontalAlignment= gd.FILL;
|
||||||
|
gd.grabExcessHorizontalSpace= false;
|
||||||
|
gd.verticalAlignment= gd.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= gd.FILL;
|
||||||
|
gd.grabExcessHorizontalSpace= false;
|
||||||
|
gd.verticalAlignment= gd.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 list control. When called the first time, the control will be created.
|
||||||
|
* @param The parent composite when called the first time, or <code>null</code>
|
||||||
|
* after.
|
||||||
|
*/
|
||||||
|
public Control getListControl(Composite parent) {
|
||||||
|
if (fTableControl == null) {
|
||||||
|
assertCompositeNotNull(parent);
|
||||||
|
|
||||||
|
fTable= createTableViewer(parent);
|
||||||
|
fTable.setContentProvider(fListViewerAdapter);
|
||||||
|
fTable.setLabelProvider(fLabelProvider);
|
||||||
|
fTable.addSelectionChangedListener(fListViewerAdapter);
|
||||||
|
|
||||||
|
fTableControl= (Table)fTable.getControl();
|
||||||
|
|
||||||
|
fTable.setInput(fParentElement);
|
||||||
|
|
||||||
|
if (fViewerSorter != null) {
|
||||||
|
fTable.setSorter(fViewerSorter);
|
||||||
|
}
|
||||||
|
|
||||||
|
fTableControl.setEnabled(isEnabled());
|
||||||
|
if (fSelectionWhenEnabled != null) {
|
||||||
|
postSetSelection(fSelectionWhenEnabled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fTableControl;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the internally used table viewer.
|
||||||
|
*/
|
||||||
|
public TableViewer getTableViewer() {
|
||||||
|
return fTable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Subclasses may override to specify a different style.
|
||||||
|
*/
|
||||||
|
protected int getListStyle(){
|
||||||
|
return SWT.BORDER + SWT.MULTI + SWT.H_SCROLL + SWT.V_SCROLL;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected TableViewer createTableViewer(Composite parent) {
|
||||||
|
Table table= new Table(parent, getListStyle());
|
||||||
|
return new TableViewer(table);
|
||||||
|
}
|
||||||
|
|
||||||
|
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= gd.FILL;
|
||||||
|
gd.grabExcessHorizontalSpace= true;
|
||||||
|
gd.verticalAlignment= gd.BEGINNING;
|
||||||
|
gd.heightHint = SWTUtil.getButtonHeigthHint(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= gd.FILL;
|
||||||
|
gd.verticalAlignment= gd.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 <code>null</code>
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ enable / disable management
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#dialogFieldChanged
|
||||||
|
*/
|
||||||
|
public void dialogFieldChanged() {
|
||||||
|
super.dialogFieldChanged();
|
||||||
|
updateButtonState();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Button getButton(int index) {
|
||||||
|
if (fButtonControls != null && index >= 0 && index < fButtonControls.length) {
|
||||||
|
return fButtonControls[index];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Updates the enable state of the all buttons
|
||||||
|
*/
|
||||||
|
protected void updateButtonState() {
|
||||||
|
if (fButtonControls != null) {
|
||||||
|
ISelection sel= fTable.getSelection();
|
||||||
|
for (int i= 0; i < fButtonControls.length; i++) {
|
||||||
|
Button button= fButtonControls[i];
|
||||||
|
if (isOkToUse(button)) {
|
||||||
|
boolean extraState= getManagedButtonState(sel, i);
|
||||||
|
button.setEnabled(isEnabled() && extraState && fButtonsEnabled[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean getManagedButtonState(ISelection sel, int index) {
|
||||||
|
if (index == fRemoveButtonIndex) {
|
||||||
|
return !sel.isEmpty();
|
||||||
|
} else if (index == fUpButtonIndex) {
|
||||||
|
return !sel.isEmpty() && canMoveUp();
|
||||||
|
} else if (index == fDownButtonIndex) {
|
||||||
|
return !sel.isEmpty() && canMoveDown();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#updateEnableState
|
||||||
|
*/
|
||||||
|
protected void updateEnableState() {
|
||||||
|
super.updateEnableState();
|
||||||
|
|
||||||
|
boolean enabled= isEnabled();
|
||||||
|
if (isOkToUse(fTableControl)) {
|
||||||
|
if (!enabled) {
|
||||||
|
fSelectionWhenEnabled= fTable.getSelection();
|
||||||
|
selectElements(null);
|
||||||
|
} else {
|
||||||
|
selectElements(fSelectionWhenEnabled);
|
||||||
|
fSelectionWhenEnabled= null;
|
||||||
|
}
|
||||||
|
fTableControl.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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ model access
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the elements shown in the list.
|
||||||
|
*/
|
||||||
|
public void setElements(List elements) {
|
||||||
|
fElements= new ArrayList(elements);
|
||||||
|
if (fTable != null) {
|
||||||
|
fTable.refresh();
|
||||||
|
}
|
||||||
|
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 elements shown at the given index.
|
||||||
|
*/
|
||||||
|
public Object getElement(int index) {
|
||||||
|
return fElements.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace an element.
|
||||||
|
*/
|
||||||
|
public void replaceElement(Object oldElement, Object newElement) throws IllegalArgumentException {
|
||||||
|
int idx= fElements.indexOf(oldElement);
|
||||||
|
if (idx != -1) {
|
||||||
|
if (oldElement.equals(newElement) || fElements.contains(newElement)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fElements.set(idx, newElement);
|
||||||
|
if (fTable != null) {
|
||||||
|
List selected= getSelectedElements();
|
||||||
|
if (selected.remove(oldElement)) {
|
||||||
|
selected.add(newElement);
|
||||||
|
}
|
||||||
|
fTable.refresh();
|
||||||
|
selectElements(new StructuredSelection(selected));
|
||||||
|
}
|
||||||
|
dialogFieldChanged();
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an element at the end of the list.
|
||||||
|
*/
|
||||||
|
public void addElement(Object element) {
|
||||||
|
if (fElements.contains(element)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fElements.add(element);
|
||||||
|
if (fTable != null) {
|
||||||
|
fTable.add(element);
|
||||||
|
}
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds elements at the end of the 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 (fTable != null) {
|
||||||
|
fTable.add(elementsToAdd.toArray());
|
||||||
|
}
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an element at a position.
|
||||||
|
*/
|
||||||
|
public void insertElementAt(Object element, int index) {
|
||||||
|
if (fElements.contains(element)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fElements.add(index, element);
|
||||||
|
if (fTable != null) {
|
||||||
|
fTable.add(element);
|
||||||
|
}
|
||||||
|
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds an element at a position.
|
||||||
|
*/
|
||||||
|
public void removeAllElements() {
|
||||||
|
if (fElements.size() > 0) {
|
||||||
|
fElements.clear();
|
||||||
|
if (fTable != null) {
|
||||||
|
fTable.refresh();
|
||||||
|
}
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes an element from the list.
|
||||||
|
*/
|
||||||
|
public void removeElement(Object element) throws IllegalArgumentException {
|
||||||
|
if (fElements.remove(element)) {
|
||||||
|
if (fTable != null) {
|
||||||
|
fTable.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 (fTable != null) {
|
||||||
|
fTable.remove(elements.toArray());
|
||||||
|
}
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the number of elements
|
||||||
|
*/
|
||||||
|
public int getSize() {
|
||||||
|
return fElements.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void selectElements(ISelection selection) {
|
||||||
|
fSelectionWhenEnabled= selection;
|
||||||
|
if (fTable != null) {
|
||||||
|
fTable.setSelection(selection, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void selectFirstElement() {
|
||||||
|
Object element= null;
|
||||||
|
if (fViewerSorter != null) {
|
||||||
|
Object[] arr= fElements.toArray();
|
||||||
|
fViewerSorter.sort(fTable, 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(fTableControl)) {
|
||||||
|
Display d= fTableControl.getDisplay();
|
||||||
|
d.asyncExec(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
if (isOkToUse(fTableControl)) {
|
||||||
|
selectElements(selection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Refreshes the table.
|
||||||
|
*/
|
||||||
|
public void refresh() {
|
||||||
|
fTable.refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- 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));
|
||||||
|
fTable.reveal(toMoveUp.get(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void moveDown(List toMoveDown) {
|
||||||
|
if (toMoveDown.size() > 0) {
|
||||||
|
setElements(reverse(moveUp(reverse(fElements), toMoveDown)));
|
||||||
|
fTable.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() {
|
||||||
|
if (isOkToUse(fTableControl)) {
|
||||||
|
int[] indc= fTableControl.getSelectionIndices();
|
||||||
|
for (int i= 0; i < indc.length; i++) {
|
||||||
|
if (indc[i] != i) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean canMoveDown() {
|
||||||
|
if (isOkToUse(fTableControl)) {
|
||||||
|
int[] indc= fTableControl.getSelectionIndices();
|
||||||
|
int k= fElements.size() - 1;
|
||||||
|
for (int i= indc.length - 1; i >= 0 ; i--, k--) {
|
||||||
|
if (indc[i] != k) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the selected elements.
|
||||||
|
*/
|
||||||
|
public List getSelectedElements() {
|
||||||
|
List result= new ArrayList();
|
||||||
|
if (fTable != null) {
|
||||||
|
ISelection selection= fTable.getSelection();
|
||||||
|
if (selection instanceof IStructuredSelection) {
|
||||||
|
Iterator iter= ((IStructuredSelection)selection).iterator();
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
result.add(iter.next());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- ListViewerAdapter
|
||||||
|
|
||||||
|
private class ListViewerAdapter implements IStructuredContentProvider, ISelectionChangedListener {
|
||||||
|
|
||||||
|
// ------- ITableContentProvider 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();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- ISelectionChangedListener Interface ------------
|
||||||
|
|
||||||
|
public void selectionChanged(SelectionChangedEvent event) {
|
||||||
|
doListSelected(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void doListSelected(SelectionChangedEvent event) {
|
||||||
|
updateButtonState();
|
||||||
|
if (fListAdapter != null) {
|
||||||
|
fListAdapter.selectionChanged(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,185 @@
|
||||||
|
/*
|
||||||
|
* (c) Copyright IBM Corp. 2000, 2001.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.dialogfields;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.SWTUtil;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.events.SelectionEvent;
|
||||||
|
import org.eclipse.swt.events.SelectionListener;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.widgets.Button;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dialog Field containing a single button: e.g. radio or checkbox button.
|
||||||
|
*/
|
||||||
|
public class SelectionButtonDialogField extends DialogField {
|
||||||
|
|
||||||
|
private Button fButton;
|
||||||
|
private boolean fIsSelected;
|
||||||
|
private DialogField[] fAttachedDialogFields;
|
||||||
|
private int fButtonStyle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a selection button.
|
||||||
|
* Allowed button styles: SWT.RADIO, SWT.CHECK, SWT.TOGGLE, SWT.PUSH
|
||||||
|
*/
|
||||||
|
public SelectionButtonDialogField(int buttonStyle) {
|
||||||
|
super();
|
||||||
|
fIsSelected= false;
|
||||||
|
fAttachedDialogFields= null;
|
||||||
|
fButtonStyle= buttonStyle;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attaches a field to the selection state of the selection button.
|
||||||
|
* The attached field will be disabled if the selection button is not selected.
|
||||||
|
*/
|
||||||
|
public void attachDialogField(DialogField dialogField) {
|
||||||
|
attachDialogFields(new DialogField[] { dialogField });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attaches fields to the selection state of the selection button.
|
||||||
|
* The attached fields will be disabled if the selection button is not selected.
|
||||||
|
*/
|
||||||
|
public void attachDialogFields(DialogField[] dialogFields) {
|
||||||
|
fAttachedDialogFields= dialogFields;
|
||||||
|
for (int i= 0; i < dialogFields.length; i++) {
|
||||||
|
dialogFields[i].setEnabled(fIsSelected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns <code>true</code> is teh gived field is attached to the selection button.
|
||||||
|
*/
|
||||||
|
public boolean isAttached(DialogField editor) {
|
||||||
|
if (fAttachedDialogFields != null) {
|
||||||
|
for (int i=0; i < fAttachedDialogFields.length; i++) {
|
||||||
|
if (fAttachedDialogFields[i] == editor) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- layout helpers
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#doFillIntoGrid
|
||||||
|
*/
|
||||||
|
public Control[] doFillIntoGrid(Composite parent, int nColumns) {
|
||||||
|
assertEnoughColumns(nColumns);
|
||||||
|
|
||||||
|
Button button= getSelectionButton(parent);
|
||||||
|
GridData gd= new GridData();
|
||||||
|
gd.horizontalSpan= nColumns;
|
||||||
|
gd.horizontalAlignment= gd.FILL;
|
||||||
|
if (fButtonStyle == SWT.PUSH) {
|
||||||
|
gd.heightHint = SWTUtil.getButtonHeigthHint(button);
|
||||||
|
gd.widthHint = SWTUtil.getButtonWidthHint(button);
|
||||||
|
}
|
||||||
|
|
||||||
|
button.setLayoutData(gd);
|
||||||
|
|
||||||
|
return new Control[] { button };
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#getNumberOfControls
|
||||||
|
*/
|
||||||
|
public int getNumberOfControls() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- ui creation
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the selection button widget. When called the first time, the widget will be created.
|
||||||
|
* @param The parent composite when called the first time, or <code>null</code>
|
||||||
|
* after.
|
||||||
|
*/
|
||||||
|
public Button getSelectionButton(Composite group) {
|
||||||
|
if (fButton == null) {
|
||||||
|
assertCompositeNotNull(group);
|
||||||
|
|
||||||
|
fButton= new Button(group, fButtonStyle);
|
||||||
|
fButton.setFont(group.getFont());
|
||||||
|
fButton.setText(fLabelText);
|
||||||
|
fButton.setEnabled(isEnabled());
|
||||||
|
fButton.setSelection(fIsSelected);
|
||||||
|
fButton.addSelectionListener(new SelectionListener() {
|
||||||
|
public void widgetDefaultSelected(SelectionEvent e) {
|
||||||
|
doWidgetSelected(e);
|
||||||
|
}
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
doWidgetSelected(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return fButton;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doWidgetSelected(SelectionEvent e) {
|
||||||
|
if (isOkToUse(fButton)) {
|
||||||
|
changeValue(fButton.getSelection());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void changeValue(boolean newState) {
|
||||||
|
if (fIsSelected != newState) {
|
||||||
|
fIsSelected= newState;
|
||||||
|
if (fAttachedDialogFields != null) {
|
||||||
|
boolean focusSet= false;
|
||||||
|
for (int i= 0; i < fAttachedDialogFields.length; i++) {
|
||||||
|
fAttachedDialogFields[i].setEnabled(fIsSelected);
|
||||||
|
if (fIsSelected && !focusSet) {
|
||||||
|
focusSet= fAttachedDialogFields[i].setFocus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dialogFieldChanged();
|
||||||
|
} else if (fButtonStyle == SWT.PUSH) {
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ model access
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the selection state of the button.
|
||||||
|
*/
|
||||||
|
public boolean isSelected() {
|
||||||
|
return fIsSelected;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the selection state of the button.
|
||||||
|
*/
|
||||||
|
public void setSelection(boolean selected) {
|
||||||
|
changeValue(selected);
|
||||||
|
if (isOkToUse(fButton)) {
|
||||||
|
fButton.setSelection(selected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ enable / disable management
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#updateEnableState
|
||||||
|
*/
|
||||||
|
protected void updateEnableState() {
|
||||||
|
super.updateEnableState();
|
||||||
|
if (isOkToUse(fButton)) {
|
||||||
|
fButton.setEnabled(isEnabled());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,250 @@
|
||||||
|
/*
|
||||||
|
* (c) Copyright IBM Corp. 2000, 2001.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.dialogfields;
|
||||||
|
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
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.Group;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
|
||||||
|
import org.eclipse.jface.util.Assert;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dialog field describing a group with buttons (Checkboxes, radio buttons..)
|
||||||
|
*/
|
||||||
|
public class SelectionButtonDialogFieldGroup extends DialogField {
|
||||||
|
|
||||||
|
private Composite fButtonComposite;
|
||||||
|
|
||||||
|
private Button[] fButtons;
|
||||||
|
private String[] fButtonNames;
|
||||||
|
private boolean[] fButtonsSelected;
|
||||||
|
private boolean[] fButtonsEnabled;
|
||||||
|
|
||||||
|
private int fGroupBorderStyle;
|
||||||
|
private int fGroupNumberOfColumns;
|
||||||
|
private int fButtonsStyle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a group without border.
|
||||||
|
*/
|
||||||
|
public SelectionButtonDialogFieldGroup(int buttonsStyle, String[] buttonNames, int nColumns) {
|
||||||
|
this(buttonsStyle, buttonNames, nColumns, SWT.NONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a group with border (label in border).
|
||||||
|
* Accepted button styles are: SWT.RADIO, SWT.CHECK, SWT.TOGGLE
|
||||||
|
* For border styles see <code>Group</code>
|
||||||
|
*/
|
||||||
|
public SelectionButtonDialogFieldGroup(int buttonsStyle, String[] buttonNames, int nColumns, int borderStyle) {
|
||||||
|
super();
|
||||||
|
|
||||||
|
Assert.isTrue(buttonsStyle == SWT.RADIO || buttonsStyle == SWT.CHECK || buttonsStyle == SWT.TOGGLE);
|
||||||
|
fButtonNames= buttonNames;
|
||||||
|
|
||||||
|
int nButtons= buttonNames.length;
|
||||||
|
fButtonsSelected= new boolean[nButtons];
|
||||||
|
fButtonsEnabled= new boolean[nButtons];
|
||||||
|
for (int i= 0; i < nButtons; i++) {
|
||||||
|
fButtonsSelected[i]= false;
|
||||||
|
fButtonsEnabled[i]= true;
|
||||||
|
}
|
||||||
|
if (fButtonsStyle == SWT.RADIO) {
|
||||||
|
fButtonsSelected[0]= true;
|
||||||
|
}
|
||||||
|
|
||||||
|
fGroupBorderStyle= borderStyle;
|
||||||
|
fGroupNumberOfColumns= (nColumns <= 0) ? nButtons : nColumns;
|
||||||
|
|
||||||
|
fButtonsStyle= buttonsStyle;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- layout helpers
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#doFillIntoGrid
|
||||||
|
*/
|
||||||
|
public Control[] doFillIntoGrid(Composite parent, int nColumns) {
|
||||||
|
assertEnoughColumns(nColumns);
|
||||||
|
|
||||||
|
if (fGroupBorderStyle == SWT.NONE) {
|
||||||
|
Label label= getLabelControl(parent);
|
||||||
|
label.setLayoutData(gridDataForLabel(1));
|
||||||
|
|
||||||
|
Composite buttonsgroup= getSelectionButtonsGroup(parent);
|
||||||
|
GridData gd= new GridData();
|
||||||
|
gd.horizontalSpan= nColumns - 1;
|
||||||
|
buttonsgroup.setLayoutData(gd);
|
||||||
|
|
||||||
|
return new Control[] { label, buttonsgroup };
|
||||||
|
} else {
|
||||||
|
Composite buttonsgroup= getSelectionButtonsGroup(parent);
|
||||||
|
GridData gd= new GridData();
|
||||||
|
gd.horizontalSpan= nColumns;
|
||||||
|
buttonsgroup.setLayoutData(gd);
|
||||||
|
|
||||||
|
return new Control[] { buttonsgroup };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#doFillIntoGrid
|
||||||
|
*/
|
||||||
|
public int getNumberOfControls() {
|
||||||
|
return (fGroupBorderStyle == SWT.NONE) ? 2 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- ui creation
|
||||||
|
|
||||||
|
private Button createSelectionButton(int index, Composite group, SelectionListener listener) {
|
||||||
|
Button button= new Button(group, fButtonsStyle | SWT.LEFT);
|
||||||
|
button.setFont(group.getFont());
|
||||||
|
button.setText(fButtonNames[index]);
|
||||||
|
button.setEnabled(isEnabled() && fButtonsEnabled[index]);
|
||||||
|
button.setSelection(fButtonsSelected[index]);
|
||||||
|
button.addSelectionListener(listener);
|
||||||
|
button.setLayoutData(new GridData());
|
||||||
|
return button;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the group widget. When called the first time, the widget will be created.
|
||||||
|
* @param The parent composite when called the first time, or <code>null</code>
|
||||||
|
* after.
|
||||||
|
*/
|
||||||
|
public Composite getSelectionButtonsGroup(Composite parent) {
|
||||||
|
if (fButtonComposite == null) {
|
||||||
|
assertCompositeNotNull(parent);
|
||||||
|
|
||||||
|
GridLayout layout= new GridLayout();
|
||||||
|
layout.makeColumnsEqualWidth= true;
|
||||||
|
layout.numColumns= fGroupNumberOfColumns;
|
||||||
|
|
||||||
|
if (fGroupBorderStyle != SWT.NONE) {
|
||||||
|
Group group= new Group(parent, fGroupBorderStyle);
|
||||||
|
if (fLabelText != null && fLabelText.length() > 0) {
|
||||||
|
group.setText(fLabelText);
|
||||||
|
}
|
||||||
|
fButtonComposite= group;
|
||||||
|
} else {
|
||||||
|
fButtonComposite= new Composite(parent, SWT.NULL);
|
||||||
|
layout.marginHeight= 0;
|
||||||
|
layout.marginWidth= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fButtonComposite.setLayout(layout);
|
||||||
|
|
||||||
|
SelectionListener listener= new SelectionListener() {
|
||||||
|
public void widgetDefaultSelected(SelectionEvent e) {
|
||||||
|
doWidgetSelected(e);
|
||||||
|
}
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
doWidgetSelected(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
int nButtons= fButtonNames.length;
|
||||||
|
fButtons= new Button[nButtons];
|
||||||
|
for (int i= 0; i < nButtons; i++) {
|
||||||
|
fButtons[i]= createSelectionButton(i, fButtonComposite, listener);
|
||||||
|
}
|
||||||
|
int nRows= nButtons / fGroupNumberOfColumns;
|
||||||
|
int nFillElements= nRows * fGroupNumberOfColumns - nButtons;
|
||||||
|
for (int i= 0; i < nFillElements; i++) {
|
||||||
|
createEmptySpace(fButtonComposite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fButtonComposite;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a button from the group or <code>null</code> if not yet created.
|
||||||
|
*/
|
||||||
|
public Button getSelectionButton(int index) {
|
||||||
|
if (index >= 0 && index < fButtons.length) {
|
||||||
|
return fButtons[index];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doWidgetSelected(SelectionEvent e) {
|
||||||
|
Button button= (Button)e.widget;
|
||||||
|
for (int i= 0; i < fButtons.length; i++) {
|
||||||
|
if (fButtons[i] == button) {
|
||||||
|
fButtonsSelected[i]= button.getSelection();
|
||||||
|
dialogFieldChanged();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ model access
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the selection state of a button contained in the group.
|
||||||
|
* @param The index of the button
|
||||||
|
*/
|
||||||
|
public boolean isSelected(int index) {
|
||||||
|
if (index >= 0 && index < fButtonsSelected.length) {
|
||||||
|
return fButtonsSelected[index];
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the selection state of a button contained in the group.
|
||||||
|
*/
|
||||||
|
public void setSelection(int index, boolean selected) {
|
||||||
|
if (index >= 0 && index < fButtonsSelected.length) {
|
||||||
|
if (fButtonsSelected[index] != selected) {
|
||||||
|
fButtonsSelected[index]= selected;
|
||||||
|
if (fButtons != null) {
|
||||||
|
Button button= fButtons[index];
|
||||||
|
if (isOkToUse(button)) {
|
||||||
|
button.setSelection(selected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ enable / disable management
|
||||||
|
|
||||||
|
protected void updateEnableState() {
|
||||||
|
super.updateEnableState();
|
||||||
|
if (fButtons != null) {
|
||||||
|
boolean enabled= isEnabled();
|
||||||
|
for (int i= 0; i < fButtons.length; i++) {
|
||||||
|
Button button= fButtons[i];
|
||||||
|
if (isOkToUse(button)) {
|
||||||
|
button.setEnabled(enabled && fButtonsEnabled[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the enable state of a button contained in the group.
|
||||||
|
*/
|
||||||
|
public void enableSelectionButton(int index, boolean enable) {
|
||||||
|
if (index >= 0 && index < fButtonsEnabled.length) {
|
||||||
|
fButtonsEnabled[index]= enable;
|
||||||
|
if (fButtons != null) {
|
||||||
|
Button button= fButtons[index];
|
||||||
|
if (isOkToUse(button)) {
|
||||||
|
button.setEnabled(isEnabled() && enable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,88 @@
|
||||||
|
/*
|
||||||
|
* (c) Copyright IBM Corp. 2000, 2001.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.dialogfields;
|
||||||
|
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dialog field describing a separator.
|
||||||
|
*/
|
||||||
|
public class Separator extends DialogField {
|
||||||
|
|
||||||
|
private Label fSeparator;
|
||||||
|
private int fStyle;
|
||||||
|
|
||||||
|
public Separator() {
|
||||||
|
this(SWT.NONE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param style of the separator. See <code>Label</code> for possible
|
||||||
|
* styles.
|
||||||
|
*/
|
||||||
|
public Separator(int style) {
|
||||||
|
super();
|
||||||
|
fStyle= style;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- layout helpers
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the separator and fills it in a MGridLayout.
|
||||||
|
* @param height The heigth of the separator
|
||||||
|
*/
|
||||||
|
public Control[] doFillIntoGrid(Composite parent, int nColumns, int height) {
|
||||||
|
assertEnoughColumns(nColumns);
|
||||||
|
|
||||||
|
Control separator= getSeparator(parent);
|
||||||
|
separator.setLayoutData(gridDataForSeperator(nColumns, height));
|
||||||
|
|
||||||
|
return new Control[] { separator };
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#doFillIntoGrid
|
||||||
|
*/
|
||||||
|
public Control[] doFillIntoGrid(Composite parent, int nColumns) {
|
||||||
|
return doFillIntoGrid(parent, nColumns, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#getNumberOfControls
|
||||||
|
*/
|
||||||
|
public int getNumberOfControls() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static GridData gridDataForSeperator(int span, int height) {
|
||||||
|
GridData gd= new GridData();
|
||||||
|
gd.horizontalAlignment= gd.FILL;
|
||||||
|
gd.verticalAlignment= gd.BEGINNING;
|
||||||
|
gd.heightHint= height;
|
||||||
|
gd.horizontalSpan= span;
|
||||||
|
return gd;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- ui creation
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates or returns the created separator.
|
||||||
|
* @param parent The parent composite or <code>null</code> if the widget has
|
||||||
|
* already been created.
|
||||||
|
*/
|
||||||
|
public Control getSeparator(Composite parent) {
|
||||||
|
if (fSeparator == null) {
|
||||||
|
assertCompositeNotNull(parent);
|
||||||
|
fSeparator= new Label(parent, fStyle);
|
||||||
|
}
|
||||||
|
return fSeparator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,135 @@
|
||||||
|
/*
|
||||||
|
* (c) Copyright IBM Corp. 2000, 2001.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.dialogfields;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.debug.internal.ui.SWTUtil;
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.events.SelectionEvent;
|
||||||
|
import org.eclipse.swt.events.SelectionListener;
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
import org.eclipse.swt.widgets.Button;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.eclipse.swt.widgets.Text;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dialog field containing a label, text control and a button control.
|
||||||
|
*/
|
||||||
|
public class StringButtonDialogField extends StringDialogField {
|
||||||
|
|
||||||
|
private Button fBrowseButton;
|
||||||
|
private String fBrowseButtonLabel;
|
||||||
|
private IStringButtonAdapter fStringButtonAdapter;
|
||||||
|
|
||||||
|
private boolean fButtonEnabled;
|
||||||
|
|
||||||
|
public StringButtonDialogField(IStringButtonAdapter adapter) {
|
||||||
|
super();
|
||||||
|
fStringButtonAdapter= adapter;
|
||||||
|
fBrowseButtonLabel= "!Browse...!"; //$NON-NLS-1$
|
||||||
|
fButtonEnabled= true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the label of the button.
|
||||||
|
*/
|
||||||
|
public void setButtonLabel(String label) {
|
||||||
|
fBrowseButtonLabel= label;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ adapter communication
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Programmatical pressing of the button
|
||||||
|
*/
|
||||||
|
public void changeControlPressed() {
|
||||||
|
fStringButtonAdapter.changeControlPressed(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- layout helpers
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#doFillIntoGrid
|
||||||
|
*/
|
||||||
|
public Control[] doFillIntoGrid(Composite parent, int nColumns) {
|
||||||
|
assertEnoughColumns(nColumns);
|
||||||
|
|
||||||
|
Label label= getLabelControl(parent);
|
||||||
|
label.setLayoutData(gridDataForLabel(1));
|
||||||
|
Text text= getTextControl(parent);
|
||||||
|
text.setLayoutData(gridDataForText(nColumns - 2));
|
||||||
|
Button button= getChangeControl(parent);
|
||||||
|
button.setLayoutData(gridDataForButton(button, 1));
|
||||||
|
|
||||||
|
return new Control[] { label, text, button };
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#getNumberOfControls
|
||||||
|
*/
|
||||||
|
public int getNumberOfControls() {
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static GridData gridDataForButton(Button button, int span) {
|
||||||
|
GridData gd= new GridData();
|
||||||
|
gd.horizontalAlignment= gd.FILL;
|
||||||
|
gd.grabExcessHorizontalSpace= false;
|
||||||
|
gd.horizontalSpan= span;
|
||||||
|
gd.heightHint = SWTUtil.getButtonHeigthHint(button);
|
||||||
|
gd.widthHint = SWTUtil.getButtonWidthHint(button);
|
||||||
|
return gd;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- ui creation
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates or returns the created buttom widget.
|
||||||
|
* @param parent The parent composite or <code>null</code> if the widget has
|
||||||
|
* already been created.
|
||||||
|
*/
|
||||||
|
public Button getChangeControl(Composite parent) {
|
||||||
|
if (fBrowseButton == null) {
|
||||||
|
assertCompositeNotNull(parent);
|
||||||
|
|
||||||
|
fBrowseButton= new Button(parent, SWT.PUSH);
|
||||||
|
fBrowseButton.setText(fBrowseButtonLabel);
|
||||||
|
fBrowseButton.setEnabled(isEnabled() && fButtonEnabled);
|
||||||
|
fBrowseButton.addSelectionListener(new SelectionListener() {
|
||||||
|
public void widgetDefaultSelected(SelectionEvent e) {
|
||||||
|
changeControlPressed();
|
||||||
|
}
|
||||||
|
public void widgetSelected(SelectionEvent e) {
|
||||||
|
changeControlPressed();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
return fBrowseButton;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ enable / disable management
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the enable state of the button.
|
||||||
|
*/
|
||||||
|
public void enableButton(boolean enable) {
|
||||||
|
if (isOkToUse(fBrowseButton)) {
|
||||||
|
fBrowseButton.setEnabled(isEnabled() && enable);
|
||||||
|
}
|
||||||
|
fButtonEnabled= enable;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#updateEnableState
|
||||||
|
*/
|
||||||
|
protected void updateEnableState() {
|
||||||
|
super.updateEnableState();
|
||||||
|
if (isOkToUse(fBrowseButton)) {
|
||||||
|
fBrowseButton.setEnabled(isEnabled() && fButtonEnabled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,161 @@
|
||||||
|
/*
|
||||||
|
* (c) Copyright IBM Corp. 2000, 2001.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.dialogfields;
|
||||||
|
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.graphics.GC;
|
||||||
|
import org.eclipse.swt.graphics.Image;
|
||||||
|
import org.eclipse.swt.widgets.Button;
|
||||||
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Control;
|
||||||
|
import org.eclipse.swt.widgets.Label;
|
||||||
|
import org.eclipse.swt.widgets.Text;
|
||||||
|
|
||||||
|
import org.eclipse.swt.layout.GridData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dialog field containing a label, text control, status label and a button control.
|
||||||
|
* The status label can be either a image or text label, and can be usd to give
|
||||||
|
* additional information about the current element chosen.
|
||||||
|
*/
|
||||||
|
public class StringButtonStatusDialogField extends StringButtonDialogField {
|
||||||
|
|
||||||
|
private Label fStatusLabelControl;
|
||||||
|
private Object fStatus; // String or ImageDescriptor
|
||||||
|
|
||||||
|
private String fWidthHintString;
|
||||||
|
private int fWidthHint;
|
||||||
|
|
||||||
|
public StringButtonStatusDialogField(IStringButtonAdapter adapter) {
|
||||||
|
super(adapter);
|
||||||
|
fStatus= null;
|
||||||
|
fWidthHintString= null;
|
||||||
|
fWidthHint= -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ set status
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the status string.
|
||||||
|
*/
|
||||||
|
public void setStatus(String status) {
|
||||||
|
if (isOkToUse(fStatusLabelControl)) {
|
||||||
|
fStatusLabelControl.setText(status);
|
||||||
|
}
|
||||||
|
fStatus= status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the status image.
|
||||||
|
* Caller is responsible to dispose image
|
||||||
|
*/
|
||||||
|
public void setStatus(Image image) {
|
||||||
|
if (isOkToUse(fStatusLabelControl)) {
|
||||||
|
if (image == null) {
|
||||||
|
fStatusLabelControl.setImage(null);
|
||||||
|
} else {
|
||||||
|
fStatusLabelControl.setImage(image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fStatus= image;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the staus string hint of the status label.
|
||||||
|
* The string is used to calculate the size of the status label.
|
||||||
|
*/
|
||||||
|
public void setStatusWidthHint(String widthHintString) {
|
||||||
|
fWidthHintString= widthHintString;
|
||||||
|
fWidthHint= -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the width hint of the status label.
|
||||||
|
*/
|
||||||
|
public void setStatusWidthHint(int widthHint) {
|
||||||
|
fWidthHint= widthHint;
|
||||||
|
fWidthHintString= null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- layout helpers
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#doFillIntoGrid
|
||||||
|
*/
|
||||||
|
public Control[] doFillIntoGrid(Composite parent, int nColumns) {
|
||||||
|
assertEnoughColumns(nColumns);
|
||||||
|
|
||||||
|
Label label= getLabelControl(parent);
|
||||||
|
label.setLayoutData(gridDataForLabel(1));
|
||||||
|
Text text= getTextControl(parent);
|
||||||
|
text.setLayoutData(gridDataForText(nColumns - 3));
|
||||||
|
Label status= getStatusLabelControl(parent);
|
||||||
|
status.setLayoutData(gridDataForStatusLabel(parent, 1));
|
||||||
|
Button button= getChangeControl(parent);
|
||||||
|
button.setLayoutData(gridDataForButton(button, 1));
|
||||||
|
|
||||||
|
return new Control[] { label, text, status, button };
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#getNumberOfControls
|
||||||
|
*/
|
||||||
|
public int getNumberOfControls() {
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected GridData gridDataForStatusLabel(Control aControl, int span) {
|
||||||
|
GridData gd= new GridData();
|
||||||
|
gd.horizontalAlignment= gd.BEGINNING;
|
||||||
|
gd.grabExcessHorizontalSpace= false;
|
||||||
|
gd.horizontalIndent= 0;
|
||||||
|
if (fWidthHintString != null) {
|
||||||
|
GC gc= new GC(aControl);
|
||||||
|
gd.widthHint= gc.textExtent(fWidthHintString).x;
|
||||||
|
gc.dispose();
|
||||||
|
} else if (fWidthHint != -1) {
|
||||||
|
gd.widthHint= fWidthHint;
|
||||||
|
} else {
|
||||||
|
gd.widthHint= SWT.DEFAULT;
|
||||||
|
}
|
||||||
|
return gd;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- ui creation
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates or returns the created status label widget.
|
||||||
|
* @param parent The parent composite or <code>null</code> when the widget has
|
||||||
|
* already been created.
|
||||||
|
*/
|
||||||
|
public Label getStatusLabelControl(Composite parent) {
|
||||||
|
if (fStatusLabelControl == null) {
|
||||||
|
assertCompositeNotNull(parent);
|
||||||
|
fStatusLabelControl= new Label(parent, SWT.LEFT);
|
||||||
|
fStatusLabelControl.setFont(parent.getFont());
|
||||||
|
fStatusLabelControl.setEnabled(isEnabled());
|
||||||
|
if (fStatus instanceof Image) {
|
||||||
|
fStatusLabelControl.setImage((Image)fStatus);
|
||||||
|
} else if (fStatus instanceof String) {
|
||||||
|
fStatusLabelControl.setText((String)fStatus);
|
||||||
|
} else {
|
||||||
|
// must be null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fStatusLabelControl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ enable / disable management
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#updateEnableState
|
||||||
|
*/
|
||||||
|
protected void updateEnableState() {
|
||||||
|
super.updateEnableState();
|
||||||
|
if (isOkToUse(fStatusLabelControl)) {
|
||||||
|
fStatusLabelControl.setEnabled(isEnabled());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,153 @@
|
||||||
|
/*
|
||||||
|
* (c) Copyright IBM Corp. 2000, 2001.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*/
|
||||||
|
package org.eclipse.cdt.debug.internal.ui.dialogfields;
|
||||||
|
|
||||||
|
import org.eclipse.swt.SWT;
|
||||||
|
import org.eclipse.swt.events.ModifyEvent;
|
||||||
|
import org.eclipse.swt.events.ModifyListener;
|
||||||
|
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.Text;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dialog field containing a label and a text control.
|
||||||
|
*/
|
||||||
|
public class StringDialogField extends DialogField {
|
||||||
|
|
||||||
|
private String fText;
|
||||||
|
private Text fTextControl;
|
||||||
|
private ModifyListener fModifyListener;
|
||||||
|
|
||||||
|
public StringDialogField() {
|
||||||
|
super();
|
||||||
|
fText= ""; //$NON-NLS-1$
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- layout helpers
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#doFillIntoGrid
|
||||||
|
*/
|
||||||
|
public Control[] doFillIntoGrid(Composite parent, int nColumns) {
|
||||||
|
assertEnoughColumns(nColumns);
|
||||||
|
|
||||||
|
Label label= getLabelControl(parent);
|
||||||
|
label.setLayoutData(gridDataForLabel(1));
|
||||||
|
Text text= getTextControl(parent);
|
||||||
|
text.setLayoutData(gridDataForText(nColumns - 1));
|
||||||
|
|
||||||
|
return new Control[] { label, text };
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#getNumberOfControls
|
||||||
|
*/
|
||||||
|
public int getNumberOfControls() {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static GridData gridDataForText(int span) {
|
||||||
|
GridData gd= new GridData();
|
||||||
|
gd.horizontalAlignment= gd.FILL;
|
||||||
|
gd.grabExcessHorizontalSpace= false;
|
||||||
|
gd.horizontalSpan= span;
|
||||||
|
return gd;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- focus methods
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#setFocus
|
||||||
|
*/
|
||||||
|
public boolean setFocus() {
|
||||||
|
if (isOkToUse(fTextControl)) {
|
||||||
|
fTextControl.setFocus();
|
||||||
|
fTextControl.setSelection(0, fTextControl.getText().length());
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------- ui creation
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates or returns the created text control.
|
||||||
|
* @param parent The parent composite or <code>null</code> when the widget has
|
||||||
|
* already been created.
|
||||||
|
*/
|
||||||
|
public Text getTextControl(Composite parent) {
|
||||||
|
if (fTextControl == null) {
|
||||||
|
assertCompositeNotNull(parent);
|
||||||
|
fModifyListener= new ModifyListener() {
|
||||||
|
public void modifyText(ModifyEvent e) {
|
||||||
|
doModifyText(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
fTextControl= new Text(parent, SWT.SINGLE | SWT.BORDER);
|
||||||
|
// moved up due to 1GEUNW2
|
||||||
|
fTextControl.setText(fText);
|
||||||
|
fTextControl.setFont(parent.getFont());
|
||||||
|
fTextControl.addModifyListener(fModifyListener);
|
||||||
|
|
||||||
|
fTextControl.setEnabled(isEnabled());
|
||||||
|
}
|
||||||
|
return fTextControl;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doModifyText(ModifyEvent e) {
|
||||||
|
if (isOkToUse(fTextControl)) {
|
||||||
|
fText= fTextControl.getText();
|
||||||
|
}
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ enable / disable management
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see DialogField#updateEnableState
|
||||||
|
*/
|
||||||
|
protected void updateEnableState() {
|
||||||
|
super.updateEnableState();
|
||||||
|
if (isOkToUse(fTextControl)) {
|
||||||
|
fTextControl.setEnabled(isEnabled());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------ text access
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the text. Can not be <code>null</code>
|
||||||
|
*/
|
||||||
|
public String getText() {
|
||||||
|
return fText;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the text. Triggers a dialog-changed event.
|
||||||
|
*/
|
||||||
|
public void setText(String text) {
|
||||||
|
fText= text;
|
||||||
|
if (isOkToUse(fTextControl)) {
|
||||||
|
fTextControl.setText(text);
|
||||||
|
} else {
|
||||||
|
dialogFieldChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the text without triggering a dialog-changed event.
|
||||||
|
*/
|
||||||
|
public void setTextWithoutUpdate(String text) {
|
||||||
|
fText= text;
|
||||||
|
if (isOkToUse(fTextControl)) {
|
||||||
|
fTextControl.removeModifyListener(fModifyListener);
|
||||||
|
fTextControl.setText(text);
|
||||||
|
fTextControl.addModifyListener(fModifyListener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue