diff options
Diffstat (limited to 'common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets')
29 files changed, 0 insertions, 10111 deletions
diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/AddRemoveListPane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/AddRemoveListPane.java deleted file mode 100644 index 8b06cae4f4..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/AddRemoveListPane.java +++ /dev/null @@ -1,554 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.jface.viewers.IBaseLabelProvider; -import org.eclipse.jface.viewers.ILabelProvider; -import org.eclipse.jface.viewers.ITableLabelProvider; -import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; -import org.eclipse.jpt.common.ui.internal.swt.ColumnAdapter; -import org.eclipse.jpt.common.ui.internal.swt.TableModelAdapter; -import org.eclipse.jpt.common.ui.internal.swt.TableModelAdapter.SelectionChangeEvent; -import org.eclipse.jpt.common.ui.internal.swt.TableModelAdapter.SelectionChangeListener; -import org.eclipse.jpt.common.ui.internal.util.SWTUtil; -import org.eclipse.jpt.utility.internal.model.value.SimplePropertyValueModel; -import org.eclipse.jpt.utility.internal.model.value.swing.ObjectListSelectionModel; -import org.eclipse.jpt.utility.model.Model; -import org.eclipse.jpt.utility.model.event.ListAddEvent; -import org.eclipse.jpt.utility.model.event.ListChangeEvent; -import org.eclipse.jpt.utility.model.event.ListClearEvent; -import org.eclipse.jpt.utility.model.event.ListMoveEvent; -import org.eclipse.jpt.utility.model.event.ListRemoveEvent; -import org.eclipse.jpt.utility.model.event.ListReplaceEvent; -import org.eclipse.jpt.utility.model.event.PropertyChangeEvent; -import org.eclipse.jpt.utility.model.listener.PropertyChangeListener; -import org.eclipse.jpt.utility.model.value.ListValueModel; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Layout; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; - -/** - * This implementation of the <code>AddRemovePane</code> uses a <code>Table</code> - * as its main widget, a <code>List</code> can't be used because it doesn't - * support showing images. However, the table is displayed like a list. - * <p> - * Here the layot of this pane: - * <pre> - * ----------------------------------------------------------------------------- - * | ------------------------------------------------------------- ----------- | - * | | Item 1 | | Add... | | - * | | ... | ----------- | - * | | Item n | ----------- | - * | | | | Edit... | | - * | | | ----------- | - * | | | ----------- | - * | | | | Remove | | - * | | | ----------- | - * | ------------------------------------------------------------- | - * -----------------------------------------------------------------------------</pre> - * - * @version 2.0 - * @since 1.0 - */ -@SuppressWarnings("nls") -public class AddRemoveListPane<T extends Model> extends AddRemovePane<T> -{ - - /** - * The main widget of this add/remove pane. - */ - private Table table; - - /** - * Creates a new <code>AddRemoveListPane</code>. - * - * @param parentPane The parent container of this one - * @param parent The parent container - * @param adapter - * @param listHolder The <code>ListValueModel</code> containing the items - * @param selectedItemHolder The holder of the selected item, if more than - * one item or no items are selected, then <code>null</code> will be passed - * @param labelProvider The renderer used to format the table holder's items - */ - public AddRemoveListPane(Pane<? extends T> parentPane, - Composite parent, - Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - ILabelProvider labelProvider) { - - super(parentPane, - parent, - adapter, - listHolder, - selectedItemHolder, - labelProvider); - } - - /** - * Creates a new <code>AddRemoveListPane</code>. - * - * @param parentPane The parent container of this one - * @param parent The parent container - * @param adapter - * @param listHolder The <code>ListValueModel</code> containing the items - * @param selectedItemHolder The holder of the selected item, if more than - * one item or no items are selected, then <code>null</code> will be passed - * @param labelProvider The renderer used to format the table holder's items - * @param helpId The topic help ID to be registered with this pane - */ - public AddRemoveListPane(Pane<? extends T> parentPane, - Composite parent, - Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - ILabelProvider labelProvider, - String helpId) { - - super(parentPane, - parent, - adapter, - listHolder, - selectedItemHolder, - labelProvider, - helpId); - } - - /** - * Creates a new <code>AddRemoveListPane</code>. - * - * @param parentPane The parent container of this one - * @param parent The parent container - * @param adapter - * @param listHolder The <code>ListValueModel</code> containing the items - * @param selectedItemHolder The holder of the selected item, if more than - * one item or no items are selected, then <code>null</code> will be passed - * @param labelProvider The renderer used to format the table holder's items - * @param helpId The topic help ID to be registered with this pane - * @param parentManagePane <code>true</code> to have the parent pane manage - * the enabled state of this pane - */ - public AddRemoveListPane(Pane<? extends T> parentPane, - Composite parent, - Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - ILabelProvider labelProvider, - String helpId, - boolean parentManagePane) { - - super(parentPane, - parent, - adapter, - listHolder, - selectedItemHolder, - labelProvider, - helpId, - parentManagePane); - } - - /** - * Creates a new <code>AddRemoveListPane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of the subject - * @param adapter - * @param parent The parent container - * @param listHolder The <code>ListValueModel</code> containing the items - * @param selectedItemHolder The holder of the selected item, if more than - * one item or no items are selected, then <code>null</code> will be passed - * @param labelProvider The renderer used to format the table holder's items - */ - public AddRemoveListPane(Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent, - Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - ILabelProvider labelProvider) { - - super(parentPane, - subjectHolder, - parent, - adapter, - listHolder, - selectedItemHolder, - labelProvider); - } - - /** - * Creates a new <code>AddRemoveListPane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of the subject - * @param adapter - * @param parent The parent container - * @param listHolder The <code>ListValueModel</code> containing the items - * @param selectedItemHolder The holder of the selected item, if more than - * one item or no items are selected, then <code>null</code> will be passed - * @param labelProvider The renderer used to format the table holder's items - * @param helpId The topic help ID to be registered with this pane - */ - public AddRemoveListPane(Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent, - Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - ILabelProvider labelProvider, - String helpId) { - - super(parentPane, - subjectHolder, - parent, - adapter, - listHolder, - selectedItemHolder, - labelProvider, - helpId); - } - - private ColumnAdapter<Object> buildColumnAdapter() { - return new ColumnAdapter<Object>() { - public WritablePropertyValueModel<?>[] cellModels(Object subject) { - WritablePropertyValueModel<?>[] valueHolders = new WritablePropertyValueModel<?>[1]; - valueHolders[0] = new SimplePropertyValueModel<Object>(subject); - return valueHolders; - } - - public int columnCount() { - return 1; - } - - public String columnName(int columnIndex) { - return ""; - } - }; - } - - @Override - protected void itemsAdded(ListAddEvent e) { - super.itemsAdded(e); - revalidateLayout(); - } - - @Override - protected void itemsMoved(ListMoveEvent e) { - super.itemsMoved(e); - revalidateLayout(); - } - - @Override - protected void itemsRemoved(ListRemoveEvent e) { - super.itemsRemoved(e); - revalidateLayout(); - } - - @Override - protected void itemsReplaced(ListReplaceEvent e) { - super.itemsReplaced(e); - revalidateLayout(); - } - - @Override - protected void listChanged(ListChangeEvent e) { - super.listChanged(e); - revalidateLayout(); - } - - @Override - protected void listCleared(ListClearEvent e) { - super.listCleared(e); - revalidateLayout(); - } - - /** - * Revalidates the table layout after the list of items has changed. The - * layout has to be done in a new UI thread because our listener might be - * notified before the table has been updated (table column added or removed). - */ - private void revalidateLayout() { - SWTUtil.asyncExec(new Runnable() { public void run() { - if (!table.isDisposed()) { - table.getParent().computeSize(SWT.DEFAULT, SWT.DEFAULT); - table.getParent().layout(); - } - }}); - } - - private PropertyChangeListener buildSelectedItemPropertyChangeListener() { - return new SWTPropertyChangeListenerWrapper( - buildSelectedItemPropertyChangeListener_() - ); - } - - private PropertyChangeListener buildSelectedItemPropertyChangeListener_() { - return new PropertyChangeListener() { - public void propertyChanged(PropertyChangeEvent e) { - if (table.isDisposed()) { - return; - } - getSelectionModel().setSelectedValue(e.getNewValue()); - updateButtons(); - } - }; - } - - private SelectionChangeListener<Object> buildSelectionListener() { - return new SelectionChangeListener<Object>() { - public void selectionChanged(SelectionChangeEvent<Object> e) { - AddRemoveListPane.this.selectionChanged(); - } - }; - } - - private Composite addTableContainer(Composite container) { - - container = addPane(container, buildTableContainerLayout()); - container.setLayoutData(new GridData(GridData.FILL_BOTH)); - return container; - } - - private Layout buildTableContainerLayout() { - return new Layout() { - @Override - protected Point computeSize(Composite composite, - int widthHint, - int heightHint, - boolean flushCache) { - - Table table = (Table) composite.getChildren()[0]; - TableColumn tableColumn = table.getColumn(0); - int columnWidth = tableColumn.getWidth(); - packColumn(table); - - // Calculate the table size and adjust it with the hints - Point size = table.computeSize(SWT.DEFAULT, SWT.DEFAULT); - - if (widthHint != SWT.DEFAULT) { - size.x = widthHint; - } - - if (heightHint != SWT.DEFAULT) { - size.y = heightHint; - } - - // Revert the column's width to its current value - table.setRedraw(false); - table.setLayoutDeferred(true); - tableColumn.setWidth(columnWidth); - table.setLayoutDeferred(false); - table.setRedraw(true); - - return size; - } - - private boolean isVerticalScrollbarBarVisible(Table table, - Rectangle clientArea) { - - // Get the height of all the rows - int height = table.getItemCount() * table.getItemHeight(); - - // Remove the border from the height - height += (table.getBorderWidth() * 2); - - return (clientArea.height < height); - } - - @Override - protected void layout(Composite composite, boolean flushCache) { - - Rectangle bounds = composite.getClientArea(); - - if (bounds.width > 0) { - - Table table = (Table) composite.getChildren()[0]; - table.setBounds(0, 0, bounds.width, bounds.height); - - updateTableColumnWidth( - table, - bounds.width, - isVerticalScrollbarBarVisible(table, bounds) - ); - } - } - - private void packColumn(Table table) { - - TableColumn tableColumn = table.getColumn(0); - - table.setRedraw(false); - table.setLayoutDeferred(true); - tableColumn.pack(); - table.setLayoutDeferred(false); - table.setRedraw(true); - - // Cache the column width so it can be used in - // updateTableColumnWidth() when determine which width to use - table.setData( - "column.width", - Integer.valueOf(tableColumn.getWidth()) - ); - } - - private void updateTableColumnWidth(Table table, - int width, - boolean verticalScrollbarBarVisible) { - - // Remove the border from the width - width -= (table.getBorderWidth() * 2); - - // Remove the scrollbar from the width if it is shown - if (verticalScrollbarBarVisible) { - width -= table.getVerticalBar().getSize().x; - } - - TableColumn tableColumn = table.getColumn(0); - - // Retrieve the cached column width, which is required for - // determining which width to use (the column width or the - // calculated width) - Integer columnWitdh = (Integer) table.getData("column.width"); - - // Use the calculated width if the column is smaller, otherwise - // use the column width and a horizontal scroll bar will show up - width = Math.max(width, columnWitdh); - - // Adjust the column width - tableColumn.setWidth(width); - } - }; - } - - private ITableLabelProvider buildTableLabelProvider(IBaseLabelProvider labelProvider) { - return new TableLabelProvider((ILabelProvider) labelProvider); - } - - /* - * (non-Javadoc) - */ - @Override - public Table getMainControl() { - return table; - } - - /* - * (non-Javadoc) - */ - @Override - @SuppressWarnings("unchecked") - protected void initializeMainComposite(Composite container, - Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - IBaseLabelProvider labelProvider, - String helpId) { - - table = addUnmanagedTable( - addTableContainer(container), - SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI, - helpId - ); - - - TableModelAdapter model = TableModelAdapter.adapt( - (ListValueModel<Object>) listHolder, - getSelectedItemHolder(), - table, - buildColumnAdapter(), - buildTableLabelProvider(labelProvider) - ); - - model.addSelectionChangeListener(buildSelectionListener()); - - selectedItemHolder.addPropertyChangeListener( - PropertyValueModel.VALUE, - buildSelectedItemPropertyChangeListener() - ); - - initializeTable(table); - } - - /** - * Initializes the given table, which acts like a list in our case. - * - * @param table The main widget of this pane - */ - protected void initializeTable(Table table) { - - table.setData("column.width", new Integer(0)); - table.setHeaderVisible(false); - table.setLinesVisible(false); - } - - /** - * The selection has changed, update (1) the selected item holder, (2) the - * selection model and (3) the buttons. - */ - private void selectionChanged() { - WritablePropertyValueModel<Object> selectedItemHolder = getSelectedItemHolder(); - ObjectListSelectionModel selectionModel = getSelectionModel(); - int selectionCount = this.table.getSelectionCount(); - - if (selectionCount == 0) { - selectedItemHolder.setValue(null); - selectionModel.clearSelection(); - } - else if (selectionCount != 1) { - selectedItemHolder.setValue(null); - selectionModel.clearSelection(); - - for (int index : this.table.getSelectionIndices()) { - selectionModel.addSelectionInterval(index, index); - } - } - else { - int selectedIndex = this.table.getSelectionIndex(); - Object selectedItem = getListHolder().get(selectedIndex); - - selectedItemHolder.setValue(selectedItem); - selectionModel.setSelectedValue(selectedItem); - } - - updateButtons(); - } - - /** - * This label provider simply delegates the rendering to the provided - * <code>ILabelProvider</code>. - */ - private class TableLabelProvider extends LabelProvider - implements ITableLabelProvider { - - private ILabelProvider labelProvider; - - TableLabelProvider(ILabelProvider labelProvider) { - super(); - this.labelProvider = labelProvider; - } - - public Image getColumnImage(Object element, int columnIndex) { - return labelProvider.getImage(element); - } - - public String getColumnText(Object element, int columnIndex) { - return labelProvider.getText(element); - } - } -}
\ No newline at end of file diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/AddRemovePane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/AddRemovePane.java deleted file mode 100644 index 1ff01a483b..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/AddRemovePane.java +++ /dev/null @@ -1,923 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import java.util.Arrays; - -import org.eclipse.jface.viewers.IBaseLabelProvider; -import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages; -import org.eclipse.jpt.common.ui.internal.listeners.SWTListChangeListenerWrapper; -import org.eclipse.jpt.utility.internal.CollectionTools; -import org.eclipse.jpt.utility.internal.model.value.swing.ListModelAdapter; -import org.eclipse.jpt.utility.internal.model.value.swing.ObjectListSelectionModel; -import org.eclipse.jpt.utility.model.Model; -import org.eclipse.jpt.utility.model.event.ListAddEvent; -import org.eclipse.jpt.utility.model.event.ListChangeEvent; -import org.eclipse.jpt.utility.model.event.ListClearEvent; -import org.eclipse.jpt.utility.model.event.ListMoveEvent; -import org.eclipse.jpt.utility.model.event.ListRemoveEvent; -import org.eclipse.jpt.utility.model.event.ListReplaceEvent; -import org.eclipse.jpt.utility.model.listener.ListChangeListener; -import org.eclipse.jpt.utility.model.value.ListValueModel; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; - -/** - * The abstract definition of a pane that has buttons for adding, removing and - * possibly editing the items. - * - * @see AddRemoveListPane - * - * @version 1.0 - * @since 2.0 - */ -public abstract class AddRemovePane<T extends Model> extends Pane<T> -{ - private Adapter adapter; - private Button addButton; - private Composite container; - private boolean enabled; - private IBaseLabelProvider labelProvider; - private ListValueModel<?> listHolder; - private Button optionalButton; - private Button removeButton; - private WritablePropertyValueModel<Object> selectedItemHolder; - private ObjectListSelectionModel selectionModel; - - /** - * Creates a new <code>AddRemovePane</code>. - * - * @param parentPane The parent container of this one - * @param parent The parent container - * @param adapter This <code>Adapter</code> is used to dictacte the behavior - * of this <code>AddRemovePane</code> and by delegating to it some of the - * behavior - * @param listHolder The <code>ListValueModel</code> containing the items - * @param selectedItemHolder The holder of the selected item, if more than - * one item or no items are selected, then <code>null</code> will be passed - * @param labelProvider The renderer used to format the list holder's items - */ - protected AddRemovePane(Pane<? extends T> parentPane, - Composite parent, - Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - IBaseLabelProvider labelProvider) { - - this(parentPane, - parent, - adapter, - listHolder, - selectedItemHolder, - labelProvider, - null); - } - - /** - * Creates a new <code>AddRemovePane</code>. - * - * @param parentPane The parent container of this one - * @param parent The parent container - * @param adapter This <code>Adapter</code> is used to dictacte the behavior - * of this <code>AddRemovePane</code> and by delegating to it some of the - * behavior - * @param listHolder The <code>ListValueModel</code> containing the items - * @param selectedItemHolder The holder of the selected item, if more than - * one item or no items are selected, then <code>null</code> will be passed - * @param labelProvider The renderer used to format the list holder's items - * @param helpId The topic help ID to be registered with this pane - */ - protected AddRemovePane(Pane<? extends T> parentPane, - Composite parent, - Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - IBaseLabelProvider labelProvider, - String helpId) { - - this(parentPane, - parent, - adapter, - listHolder, - selectedItemHolder, - labelProvider, - helpId, - true); - } - /** - * Creates a new <code>AddRemovePane</code>. - * - * @param parentPane The parent container of this one - * @param parent The parent container - * @param adapter This <code>Adapter</code> is used to dictacte the behavior - * of this <code>AddRemovePane</code> and by delegating to it some of the - * behavior - * @param listHolder The <code>ListValueModel</code> containing the items - * @param selectedItemHolder The holder of the selected item, if more than - * one item or no items are selected, then <code>null</code> will be passed - * @param labelProvider The renderer used to format the list holder's items - * @param helpId The topic help ID to be registered with this pane - * @param parentManagePane <code>true</code> to have the parent pane manage - * the enabled state of this pane - */ - protected AddRemovePane(Pane<? extends T> parentPane, - Composite parent, - Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - IBaseLabelProvider labelProvider, - String helpId, - boolean parentManagePane) { - - super(parentPane, parent, true, parentManagePane); - - initialize( - adapter, - listHolder, - selectedItemHolder, - labelProvider - ); - - initializeLayout( - adapter, - listHolder, - selectedItemHolder, - labelProvider, - helpId - ); - } - - /** - * Creates a new <code>AddRemovePane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of the subject - * @param adapter This <code>Adapter</code> is used to dictacte the behavior - * of this <code>AddRemovePane</code> and by delegating to it some of the - * behavior - * @param parent The parent container - * @param listHolder The <code>ListValueModel</code> containing the items - * @param selectedItemHolder The holder of the selected item, if more than - * one item or no items are selected, then <code>null</code> will be passed - * @param labelProvider The renderer used to format the list holder's items - */ - protected AddRemovePane(Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent, - Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - IBaseLabelProvider labelProvider) { - - this(parentPane, - subjectHolder, - parent, - adapter, - listHolder, - selectedItemHolder, - labelProvider, - null); - } - - /** - * Creates a new <code>AddRemovePane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of the subject - * @param adapter This <code>Adapter</code> is used to dictacte the behavior - * of this <code>AddRemovePane</code> and by delegating to it some of the - * behavior - * @param parent The parent container - * @param listHolder The <code>ListValueModel</code> containing the items - * @param selectedItemHolder The holder of the selected item, if more than - * one item or no items are selected, then <code>null</code> will be passed - * @param labelProvider The renderer used to format the list holder's items - * @param helpId The topic help ID to be registered with this pane - */ - protected AddRemovePane(Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent, - Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - IBaseLabelProvider labelProvider, - String helpId) { - - super(parentPane, subjectHolder, parent); - - initialize( - adapter, - listHolder, - selectedItemHolder, - labelProvider - ); - - initializeLayout( - adapter, - listHolder, - selectedItemHolder, - labelProvider, - helpId - ); - } - - /** - * Gives the possibility to add buttons after the Add button and before the - * optional button. - * - * @param container The parent container - * @param helpId The topic help ID to be registered with the buttons - * - * @category Layout - */ - protected void addCustomButtonAfterAddButton(Composite container, - String helpId) { - } - - /** - * Gives the possibility to add buttons after the optional button and before - * the Remove button. - * - * @param container The parent container - * @param helpId The topic help ID to be registered with the buttons - * - * @category Layout - */ - protected void addCustomButtonAfterOptionalButton(Composite container, - String helpId) { - } - - /** - * @category Add - */ - protected void addItem() { - adapter.addNewItem(selectionModel); - } - - /** - * @category Initialize - */ - protected Adapter buildAdapter() { - return adapter; - } - - /** - * @category Add - */ - protected Button addAddButton(Composite parent) { - return addUnmanagedButton( - parent, - adapter.addButtonText(), - buildAddItemAction() - ); - } - - /** - * @category Add - */ - private Runnable buildAddItemAction() { - return new Runnable() { - public void run() { - AddRemovePane.this.addItem(); - } - }; - } - - private ListChangeListener buildListChangeListener() { - return new SWTListChangeListenerWrapper(buildListChangeListener_()); - } - - private ListChangeListener buildListChangeListener_() { - return new ListChangeListener() { - - public void itemsAdded(ListAddEvent e) { - AddRemovePane.this.itemsAdded(e); - } - - public void itemsMoved(ListMoveEvent e) { - AddRemovePane.this.itemsMoved(e); - } - - public void itemsRemoved(ListRemoveEvent e) { - AddRemovePane.this.itemsRemoved(e); - } - - public void itemsReplaced(ListReplaceEvent e) { - AddRemovePane.this.itemsReplaced(e); - } - - public void listChanged(ListChangeEvent e) { - AddRemovePane.this.listChanged(e); - } - - public void listCleared(ListClearEvent e) { - AddRemovePane.this.listCleared(e); - } - }; - } - - protected void itemsAdded(ListAddEvent e) { - - } - - protected void itemsMoved(ListMoveEvent e) { - - } - - protected void itemsRemoved(ListRemoveEvent e) { - Object selectedItem = this.selectedItemHolder.getValue(); - - if (selectedItem == null) { - updateButtons(); - return; - } - - if (CollectionTools.contains(e.getItems(), selectedItem)) { - this.selectedItemHolder.setValue(null); - updateButtons(); - } - } - - protected void itemsReplaced(ListReplaceEvent e) { - - } - - protected void listChanged(ListChangeEvent e) { - - } - - protected void listCleared(ListClearEvent e) { - this.selectedItemHolder.setValue(null); - updateButtons(); - } - - - /** - * @category Option - */ - private Runnable buildOptionalAction() { - return new Runnable() { - public void run() { - AddRemovePane.this.editItem(); - } - }; - } - - /** - * @category Option - */ - protected Button addOptionalButton(Composite container) { - return addUnmanagedButton( - container, - adapter.optionalButtonText(), - buildOptionalAction() - ); - } - - /** - * @category Add - */ - protected Button addRemoveButton(Composite parent) { - return addUnmanagedButton( - parent, - adapter.removeButtonText(), - buildRemoveItemsAction() - ); - } - - /** - * @category Remove - */ - private Runnable buildRemoveItemsAction() { - return new Runnable() { - public void run() { - AddRemovePane.this.removeItems(); - } - }; - } - - protected ObjectListSelectionModel buildRowSelectionModel(ListValueModel<?> listModel) { - return new ObjectListSelectionModel(new ListModelAdapter(listModel)); - } - - /** - * @category Option - */ - protected void editItem() { - this.adapter.optionOnSelection(getSelectionModel()); - } - - /* - * (non-Javadoc) - */ - @Override - public void enableWidgets(boolean enabled) { - - super.enableWidgets(enabled); - this.enabled = enabled; - - if (!this.getMainControl().isDisposed()) { - this.getMainControl().setEnabled(enabled); - } - - this.updateButtons(); - } - - protected final Composite getContainer() { - return container; - } - - protected IBaseLabelProvider getLabelProvider() { - return labelProvider; - } - - protected final ListValueModel<?> getListHolder() { - return listHolder; - } - - /** - * Returns - * - * @return - */ - public abstract Composite getMainControl(); - - protected final WritablePropertyValueModel<Object> getSelectedItemHolder() { - return selectedItemHolder; - } - - public final ObjectListSelectionModel getSelectionModel() { - return selectionModel; - } - - /** - * Initializes this add/remove pane. - * - * @param adapter This <code>Adapter</code> is used to dictacte the behavior - * of this <code>AddRemovePane</code> and by delegating to it some of the - * behavior - * @param listHolder The <code>ListValueModel</code> containing the items - * @param selectedItemHolder The holder of the selected item, if more than - * one item or no items are selected, then <code>null</code> will be passed - * @param labelProvider The renderer used to format the list holder's items - * - * @category Initialization - */ - @SuppressWarnings("unchecked") - protected void initialize(Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - IBaseLabelProvider labelProvider) - { - this.listHolder = listHolder; - this.labelProvider = labelProvider; - this.adapter = (adapter == null) ? buildAdapter() : adapter; - this.selectedItemHolder = (WritablePropertyValueModel<Object>) selectedItemHolder; - this.selectionModel = new ObjectListSelectionModel(new ListModelAdapter(listHolder)); - - this.listHolder.addListChangeListener( - ListValueModel.LIST_VALUES, - buildListChangeListener() - ); - } - - /** - * Initializes the pane containing the buttons (Add, optional (if required) - * and Remove). - * - * @param container The parent container - * @param helpId The topic help ID to be registered with the buttons - * - * @category Layout - */ - protected void initializeButtonPane(Composite container, String helpId) { - - container = addSubPane(container); - - GridData gridData = new GridData(); - gridData.grabExcessVerticalSpace = true; - gridData.verticalAlignment = SWT.TOP; - container.setLayoutData(gridData); - - // Add button - this.addButton = addAddButton(container); - addAlignRight(this.addButton); - - // Custom button - addCustomButtonAfterAddButton(container, helpId); - - // Optional button - if (this.adapter.hasOptionalButton()) { - this.optionalButton = addOptionalButton(container); - addAlignRight(this.optionalButton); - } - - // Custom button - addCustomButtonAfterOptionalButton(container, helpId); - - // Remove button - removeButton = addRemoveButton(container); - addAlignRight(removeButton); - - // Update the help topic ID - if (helpId != null) { - getHelpSystem().setHelp(addButton, helpId); - getHelpSystem().setHelp(removeButton, helpId); - - if (optionalButton != null) { - getHelpSystem().setHelp(optionalButton, helpId); - } - } - } - - /** - * Initializes this add/remove pane by creating the widgets. The subclass is - * required to build the main widget. - * - * @param adapter This <code>Adapter</code> is used to dictacte the behavior - * of this <code>AddRemovePane</code> and by delegating to it some of the - * behavior - * @param listHolder The <code>ListValueModel</code> containing the items - * @param selectedItemHolder The holder of the selected item, if more than - * one item or no items are selected, then <code>null</code> will be passed - * @param labelProvider The renderer used to format the list holder's items - * @param helpId The topic help ID to be registered with this pane - * - * @category Layout - */ - protected void initializeLayout(Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - IBaseLabelProvider labelProvider, - String helpId) { - - initializeMainComposite( - container, - adapter, - listHolder, - selectedItemHolder, - labelProvider, - helpId); - - initializeButtonPane(container, helpId); - enableWidgets(getSubject() != null); - } - - /** - * {@inheritDoc} - */ - @Override - protected void initializeLayout(Composite container) { - this.container = addSubPane(container, 2, 0, 0, 0, 0); - } - - /** - * Initializes the main widget of this add/remove pane. - * - * @param container The parent container - * @param adapter This <code>Adapter</code> is used to dictacte the behavior - * of this <code>AddRemovePane</code> and by delegating to it some of the - * behavior - * @param listHolder The <code>ListValueModel</code> containing the items - * @param selectedItemHolder The holder of the selected item, if more than - * one item or no items are selected, then <code>null</code> will be passed - * @param labelProvider The renderer used to format the list holder's items - * @param helpId The topic help ID to be registered with this pane or - * <code>null</code> if it was not specified - * - * @category Layout - */ - protected abstract void initializeMainComposite(Composite container, - Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - IBaseLabelProvider labelProvider, - String helpId); - - /** - * @category Remove - */ - protected void removeItems() { - - // Keep track of the selected indices so we can select an item - // before the lowest index - int[] indices = selectionModel.selectedIndices(); - Arrays.sort(indices); - - // Notify the adapter to remove the selected items - adapter.removeSelectedItems(selectionModel); - - // Select a new item - if (getListHolder().size() > 0) { - int index = Math.min(indices[0], getListHolder().size() - 1); - Object item = getListHolder().get(index); - selectedItemHolder.setValue(item); - } - // The list is empty, clear the value - else { - selectedItemHolder.setValue(null); - } - } - - /** - * Selects the given value, which can be <code>null</code>. - * - * @param value The new selected value - */ - public void setSelectedItem(Object value) { - selectedItemHolder.setValue(value); - } - - /** - * @category UpdateButtons - */ - protected void updateAddButton(Button addButton) { - addButton.setEnabled(enabled); - } - - /** - * @category UpdateButtons - */ - protected void updateButtons() { - if (!container.isDisposed()) { - updateAddButton(addButton); - updateRemoveButton(removeButton); - updateOptionalButton(optionalButton); - } - } - - /** - * @category UpdateButtons - */ - protected void updateOptionalButton(Button optionalButton) { - if (optionalButton != null) { - optionalButton.setEnabled( - enabled && - adapter.enableOptionOnSelectionChange(selectionModel) - ); - } - } - - /** - * @category UpdateButtons - */ - protected void updateRemoveButton(Button removeButton) { - removeButton.setEnabled( - enabled && - adapter.enableRemoveOnSelectionChange(selectionModel) - ); - } - - /** - * An abstract implementation of <code>Adapter</code>. - */ - public static abstract class AbstractAdapter implements Adapter { - - /** - * The text of the add button. - */ - private String addButtonText; - - /** - * Determines whether the optional button should be shown or not. - */ - private boolean hasOptionalButton; - - /** - * The text of the optional button, if used. - */ - private String optionalButtonText; - - /** - * The text of the remove button. - */ - private String removeButtonText; - - /** - * Creates a new <code>AbstractAdapter</code> with default text for the - * add and remove buttons. - */ - public AbstractAdapter() { - this(JptCommonUiMessages.AddRemovePane_AddButtonText, - JptCommonUiMessages.AddRemovePane_RemoveButtonText); - } - - /** - * Creates a new <code>AbstractAdapter</code> with default text for the - * add and remove buttons. - * - * @param hasOptionalButton <code>true</code> to show an optional button - * and to use the behavior related to the optional button; - * <code>false</code> to not use it - */ - public AbstractAdapter(boolean hasOptionalButton) { - this(); - this.setHasOptionalButton(hasOptionalButton); - } - - /** - * Creates a new <code>AbstractAdapter</code> with default text for the - * add and remove buttons. - * - * @param optionalButtonText The text of the optional button, which means - * the optional button will be shown - */ - public AbstractAdapter(String optionalButtonText) { - this(true); - this.setOptionalButtonText(optionalButtonText); - } - - /** - * Creates a new <code>AbstractAdapter</code>. - * - * @param addButtonText The add button's text - * @param removeButtonText The remove button's text - */ - public AbstractAdapter(String addButtonText, - String removeButtonText) { - - super(); - this.addButtonText = addButtonText; - this.removeButtonText = removeButtonText; - } - - /** - * Creates a new <code>AbstractAdapter</code>. - * - * @param addButtonText The add button's text - * @param removeButtonText The remove button's text - * @param optionalButtonText The text of the optional button, which means - * the optional button will be shown - */ - public AbstractAdapter(String addButtonText, - String removeButtonText, - String optionalButtonText) { - - this(optionalButtonText); - this.setAddButtonText(addButtonText); - this.setRemoveButtonText(removeButtonText); - } - - /* - * (non-Javadoc) - */ - public String addButtonText() { - return addButtonText; - } - - /* - * (non-Javadoc) - */ - public boolean enableOptionOnSelectionChange(ObjectListSelectionModel listSelectionModel) { - return listSelectionModel.selectedValuesSize() == 1; - } - - public boolean enableRemoveOnSelectionChange(ObjectListSelectionModel listSelectionModel) { - return listSelectionModel.selectedValue() != null; - } - - /* - * (non-Javadoc) - */ - public boolean hasOptionalButton() { - return hasOptionalButton; - } - - /* - * (non-Javadoc) - */ - public String optionalButtonText() { - return optionalButtonText; - } - - /* - * (non-Javadoc) - */ - public void optionOnSelection(ObjectListSelectionModel listSelectionModel) { - } - - /* - * (non-Javadoc) - */ - public String removeButtonText() { - return removeButtonText; - } - - /** - * Changes the text of the add button. This method has to be called before - * the <code>AddRemoveListPane</code> is initialized. - * - * @param addButtonText The add button's text - */ - public void setAddButtonText(String addButtonText) { - this.addButtonText = addButtonText; - } - - /** - * Changes the state of the optional button, meaning if it should be shown - * between the add and remove buttons or not. - * - * @param hasOptionalButton <code>true</code> to show an optional button - * and to use the behavior related to the optional button; - * <code>false</code> to not use it - */ - public void setHasOptionalButton(boolean hasOptionalButton) { - this.hasOptionalButton = hasOptionalButton; - } - - /** - * Changes the text of the optional button. This method has to be called - * before the <code>AddRemoveListPane</code> is initialized. This does not - * make the optional button visible. - * - * @param optionalButtonText The optional button's text - */ - public void setOptionalButtonText(String optionalButtonText) { - this.optionalButtonText = optionalButtonText; - } - - /** - * Changes the text of the remove button. This method has to be called - * before the <code>AddRemoveListPane</code> is initialized. - * - * @param removeButtonText The remove button's text - */ - public void setRemoveButtonText(String removeButtonText) { - this.removeButtonText = removeButtonText; - } - } - - /** - * This adapter is used to perform the actual action when adding a new item - * or removing the selected items. It is possible to add an optional button. - */ - public static interface Adapter { - - /** - * The add button's text. - * - * @return The text shown on the add button - */ - String addButtonText(); - - /** - * Invoked when the user selects the Add button. - */ - void addNewItem(ObjectListSelectionModel listSelectionModel); - - /** - * Invoked when selection changes. Implementation dictates whether button - * should be enabled. - */ - boolean enableOptionOnSelectionChange(ObjectListSelectionModel listSelectionModel); - - /** - * Invoked when selection changes. Implementation dictates whether remove button - * should be enabled. - */ - boolean enableRemoveOnSelectionChange(ObjectListSelectionModel listSelectionModel); - - /** - * Determines whether an optional button should be added between the add - * and remove buttons. - * - * @return <code>true</code> to show an optional button and to use the - * behavior related to the optional button; <code>false</code> to not use - * it - */ - boolean hasOptionalButton(); - - /** - * Resource string key for the optional button. - */ - String optionalButtonText(); - - /** - * Invoked when the user selects the optional button - */ - void optionOnSelection(ObjectListSelectionModel listSelectionModel); - - /** - * The remove button's text. - * - * @return The text shown on the remove button - */ - String removeButtonText(); - - /** - * Invoked when the user selects the Remove button. - */ - void removeSelectedItems(ObjectListSelectionModel listSelectionModel); - } -}
\ No newline at end of file diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/AddRemoveTablePane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/AddRemoveTablePane.java deleted file mode 100644 index 5befb986ad..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/AddRemoveTablePane.java +++ /dev/null @@ -1,314 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.jface.viewers.IBaseLabelProvider; -import org.eclipse.jface.viewers.ITableLabelProvider; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; -import org.eclipse.jpt.common.ui.internal.swt.ColumnAdapter; -import org.eclipse.jpt.common.ui.internal.swt.TableModelAdapter; -import org.eclipse.jpt.common.ui.internal.swt.TableModelAdapter.SelectionChangeEvent; -import org.eclipse.jpt.common.ui.internal.swt.TableModelAdapter.SelectionChangeListener; -import org.eclipse.jpt.utility.internal.CollectionTools; -import org.eclipse.jpt.utility.internal.model.value.SimplePropertyValueModel; -import org.eclipse.jpt.utility.internal.model.value.swing.ObjectListSelectionModel; -import org.eclipse.jpt.utility.model.Model; -import org.eclipse.jpt.utility.model.event.PropertyChangeEvent; -import org.eclipse.jpt.utility.model.listener.PropertyChangeListener; -import org.eclipse.jpt.utility.model.value.ListValueModel; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Table; - -/** - * This implementation of the <code>AddRemovePane</code> uses a <code>Table</code> - * as its main widget. - * <p> - * Here the layout of this pane: - * <pre> - * ----------------------------------------------------------------------------- - * | ------------------------------------------------------------- ----------- | - * | | Column 1 | Column 2 | ... | Column i | ... | Colunm n | | Add... | | - * | |-----------------------------------------------------------| ----------- | - * | | | | | | | | ----------- | - * | |-----------------------------------------------------------| | Edit... | | - * | | | | | | | | ----------- | - * | |-----------------------------------------------------------| ----------- | - * | | | | | | | | | Remove | | - * | |-----------------------------------------------------------| ----------- | - * | ------------------------------------------------------------- | - * -----------------------------------------------------------------------------</pre> - * - * @version 2.0 - * @since 1.0 - */ -public abstract class AddRemoveTablePane<T extends Model> extends AddRemovePane<T> -{ - /** - * Flag used to prevent circular - */ - private boolean locked; - - /** - * The main widget of this add/remove pane. - */ - private Table table; - - /** - * Creates a new <code>AddRemoveTablePane</code>. - * - * @param parentPane The parent container of this one - * @param parent The parent container - * @param adapter - * @param listHolder The <code>ListValueModel</code> containing the items - * @param selectedItemHolder The holder of the selected item, if more than - * one item or no items are selected, then <code>null</code> will be passed - * @param labelProvider The renderer used to format the list holder's items - */ - public AddRemoveTablePane(Pane<? extends T> parentPane, - Composite parent, - Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - ITableLabelProvider labelProvider) { - - super(parentPane, - parent, - adapter, - listHolder, - selectedItemHolder, - labelProvider); - - } - - /** - * Creates a new <code>AddRemoveTablePane</code>. - * - * @param parentPane The parent container of this one - * @param parent The parent container - * @param adapter - * @param listHolder The <code>ListValueModel</code> containing the items - * @param selectedItemHolder The holder of the selected item, if more than - * one item or no items are selected, then <code>null</code> will be passed - * @param labelProvider The renderer used to format the list holder's items - * @param helpId The topic help ID to be registered with this pane - */ - public AddRemoveTablePane(Pane<? extends T> parentPane, - Composite parent, - Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - ITableLabelProvider labelProvider, - String helpId) { - - super(parentPane, - parent, - adapter, - listHolder, - selectedItemHolder, - labelProvider, - helpId); - } - - /** - * Creates a new <code>AddRemoveTablePane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of the subject - * @param adapter - * @param parent The parent container - * @param listHolder The <code>ListValueModel</code> containing the items - * @param selectedItemHolder The holder of the selected item, if more than - * one item or no items are selected, then <code>null</code> will be passed - * @param labelProvider The renderer used to format the list holder's items - */ - public AddRemoveTablePane(Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent, - Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - ITableLabelProvider labelProvider) { - - super(parentPane, - subjectHolder, - parent, - adapter, - listHolder, - selectedItemHolder, - labelProvider); - } - - /** - * Creates a new <code>AddRemoveTablePane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of the subject - * @param adapter - * @param parent The parent container - * @param listHolder The <code>ListValueModel</code> containing the items - * @param selectedItemHolder The holder of the selected item, if more than - * one item or no items are selected, then <code>null</code> will be passed - * @param labelProvider The renderer used to format the list holder's items - * @param helpId The topic help ID to be registered with this pane - */ - public AddRemoveTablePane(Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent, - Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - ITableLabelProvider labelProvider, - String helpId) { - - super(parentPane, - subjectHolder, - parent, - adapter, - listHolder, - selectedItemHolder, - labelProvider, - helpId); - } - - protected abstract ColumnAdapter<?> buildColumnAdapter(); - - private WritablePropertyValueModel<Object> buildSelectedItemHolder() { - return new SimplePropertyValueModel<Object>(); - } - - private PropertyChangeListener buildSelectedItemPropertyChangeListener() { - return new SWTPropertyChangeListenerWrapper( - buildSelectedItemPropertyChangeListener_() - ); - } - - private PropertyChangeListener buildSelectedItemPropertyChangeListener_() { - return new PropertyChangeListener() { - public void propertyChanged(PropertyChangeEvent e) { - if (table.isDisposed()) { - return; - } - - if (!locked) { - locked = true; - - try { - Object value = e.getNewValue(); - getSelectionModel().setSelectedValue(e.getNewValue()); - int index = -1; - - if (value != null) { - index = CollectionTools.indexOf(getListHolder().iterator(), value); - } - - table.select(index); - updateButtons(); - } - finally { - locked = false; - } - } - } - }; - } - - private SelectionChangeListener<Object> buildSelectionListener() { - return new SelectionChangeListener<Object>() { - public void selectionChanged(SelectionChangeEvent<Object> e) { - AddRemoveTablePane.this.selectionChanged(); - } - }; - } - - /* - * (non-Javadoc) - */ - @Override - public Table getMainControl() { - return table; - } - - /* - * (non-Javadoc) - */ - @Override - @SuppressWarnings("unchecked") - protected void initializeMainComposite(Composite container, - Adapter adapter, - ListValueModel<?> listHolder, - WritablePropertyValueModel<?> selectedItemHolder, - IBaseLabelProvider labelProvider, - String helpId) - { - table = addUnmanagedTable(container, helpId); - table.setHeaderVisible(true); - - TableModelAdapter<Object> tableModel = TableModelAdapter.adapt( - (ListValueModel<Object>) listHolder, - buildSelectedItemHolder(), - table, - (ColumnAdapter<Object>) buildColumnAdapter(), - (ITableLabelProvider) labelProvider - ); - - tableModel.addSelectionChangeListener(buildSelectionListener()); - - selectedItemHolder.addPropertyChangeListener( - PropertyValueModel.VALUE, - buildSelectedItemPropertyChangeListener() - ); - } - - /** - * The selection has changed, update (1) the selected item holder, (2) the - * selection model and (3) the buttons. - */ - private void selectionChanged() { - - if (locked) { - return; - } - - locked = true; - - try { - WritablePropertyValueModel<Object> selectedItemHolder = getSelectedItemHolder(); - ObjectListSelectionModel selectionModel = getSelectionModel(); - int selectionCount = table.getSelectionCount(); - - if (selectionCount == 0) { - selectedItemHolder.setValue(null); - selectionModel.clearSelection(); - } - else if (selectionCount != 1) { - selectedItemHolder.setValue(null); - selectionModel.clearSelection(); - - for (int index : table.getSelectionIndices()) { - selectionModel.addSelectionInterval(index, index); - } - } - else { - int selectedIndex = table.getSelectionIndex(); - Object selectedItem = getListHolder().get(selectedIndex); - - selectedItemHolder.setValue(selectedItem); - selectionModel.setSelectedValue(selectedItem); - } - - updateButtons(); - } - finally { - locked = false; - } - } -} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ChooserPane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ChooserPane.java deleted file mode 100644 index e4177f129a..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ChooserPane.java +++ /dev/null @@ -1,167 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages; -import org.eclipse.jpt.utility.model.Model; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; - -/** - * A chooser is simply a pane with three widgets, the label on the left, a main - * widget, usually a text field, and a right widget which is usually a browse - * button. - * - * @see ClassChooserPane - * @see PackageChooserPane - * - * @version 3.0 - * @since 2.0 - */ -public abstract class ChooserPane<T extends Model> extends Pane<T> -{ - /** - * The control shown after the label (left control). - */ - private Control mainControl; - - /** - * The control shown after the main control. - */ - private Control rightControl; - - /** - * Creates a new <code>ChooserPane</code>. - * - * @param parentPane The parent pane of this one - * @param parent The parent container - */ - public ChooserPane(Pane<? extends T> parentPane, - Composite parent) { - - super(parentPane, parent); - } - - /** - * Creates a new <code>ChooserPane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of this pane's subject - * @param parent The parent container - */ - public ChooserPane(Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent) { - - super(parentPane, subjectHolder, parent); - } - - @Override - protected void initializeLayout(Composite container) { - - this.mainControl = addMainControl(container); - this.rightControl = addRightControl(container); - - addLabeledComposite( - container, - addLeftControl(container), - this.mainControl, - this.rightControl, - getHelpId() - ); - } - - /** - * Creates the left control. By default a label is created and its text is - * retrieved by {@link #getLabelText()}. - * - * @param container The parent container - * @return The newly created left control - */ - protected Control addLeftControl(Composite container) { - return addLabel(container, getLabelText()); - } - - /** - * The text of the label. This method is called by - * {@link #buildLeftControl(Composite)}. - * - * @return The localized text of the left control (which is a label by - * default) - */ - protected abstract String getLabelText(); - - /** - * Creates the main control of this pane. - * - * @param container The parent container - * @return The newly created main control - */ - protected abstract Control addMainControl(Composite container); - - /** - * Creates the right control. By default a browse button is created and its - * action is performed by {@link #buildBrowseAction()} and its text is - * retrieved by {@link #getBrowseButtonText()}. - * - * @param container The parent container - * @return The newly created right control - */ - protected Control addRightControl(Composite container) { - return addButton( - container, - getBrowseButtonText(), - buildBrowseAction() - ); - } - - /** - * Returns the text of the browse button. This method is called by - * {@link #buildRightControl(Composite)}. - * - * @return "Browse..." - */ - protected String getBrowseButtonText() { - return JptCommonUiMessages.ChooserPane_browseButton; - } - - /** - * Creates the action responsible to perform the action when the Browse is - * clicked. - * - * @return A new <code>Runnable</code> performing the actual action of the - * button - */ - protected abstract Runnable buildBrowseAction(); - - /** - * Returns the help topic ID for the controls of this pane. - * - * @return <code>null</code> is returned otherwise the subclass can return an ID - */ - protected String getHelpId() { - return null; - } - - @Override - public void enableWidgets(boolean enabled) { - - super.enableWidgets(enabled); - - if (!this.mainControl.isDisposed()) { - this.mainControl.setEnabled(enabled); - } - - if (!this.rightControl.isDisposed()) { - this.rightControl.setEnabled(enabled); - } - } -} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ClassChooserComboPane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ClassChooserComboPane.java deleted file mode 100644 index 3ec910c76f..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ClassChooserComboPane.java +++ /dev/null @@ -1,92 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2010 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.jdt.internal.ui.refactoring.contentassist.ControlContentAssistHelper; -import org.eclipse.jpt.utility.internal.StringConverter; -import org.eclipse.jpt.utility.model.Model; -import org.eclipse.jpt.utility.model.value.ListValueModel; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; - -/** - * This chooser allows the user to choose a type when browsing and it adds code - * completion support to the text field, which is the main component. - * <p> - * Here the layout of this pane: - * <pre> - * ----------------------------------------------------------------------------- - * | ---------------------------------------------------- ------------- | - * | Label: | I X | | Browse... | | - * | ---------------------------------------------------- ------------- | - * -----------------------------------------------------------------------------</pre> - * - * @version 2.0 - * @since 2.0 - */ -public abstract class ClassChooserComboPane<T extends Model> extends ClassChooserPane<T> -{ - - /** - * Creates a new <code>ClassChooserPane</code>. - * - * @param parentPane The parent pane of this one - * @param parent The parent container - */ - public ClassChooserComboPane(Pane<? extends T> parentPane, - Composite parent) { - - super(parentPane, parent); - } - - /** - * Creates a new <code>ClassChooserPane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of this pane's subject - * @param parent The parent container - */ - public ClassChooserComboPane(Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent) { - - super(parentPane, subjectHolder, parent); - } - - @Override - protected Control addMainControl(Composite container) { - Composite subPane = addSubPane(container); - Combo combo = this.addClassCombo(subPane); - - ControlContentAssistHelper.createComboContentAssistant( - combo, - javaTypeCompletionProcessor - ); - - return subPane; - } - - protected Combo addClassCombo(Composite container) { - return this.addEditableCombo( - container, - this.buildClassListHolder(), - this.buildTextHolder(), - this.buildClassConverter() - ); - } - - protected abstract ListValueModel<String> buildClassListHolder(); - - protected StringConverter<String> buildClassConverter() { - return StringConverter.Default.instance(); - } -}
\ No newline at end of file diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ClassChooserPane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ClassChooserPane.java deleted file mode 100644 index f68ad8c788..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ClassChooserPane.java +++ /dev/null @@ -1,368 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2011 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import org.eclipse.jdt.core.IJavaElement; -import org.eclipse.jdt.core.IJavaProject; -import org.eclipse.jdt.core.IPackageFragment; -import org.eclipse.jdt.core.IPackageFragmentRoot; -import org.eclipse.jdt.core.IType; -import org.eclipse.jdt.core.JavaModelException; -import org.eclipse.jdt.core.search.IJavaSearchScope; -import org.eclipse.jdt.core.search.SearchEngine; -import org.eclipse.jdt.internal.ui.refactoring.contentassist.ControlContentAssistHelper; -import org.eclipse.jdt.internal.ui.refactoring.contentassist.JavaTypeCompletionProcessor; -import org.eclipse.jdt.internal.ui.wizards.NewClassCreationWizard; -import org.eclipse.jdt.ui.IJavaElementSearchConstants; -import org.eclipse.jdt.ui.JavaUI; -import org.eclipse.jdt.ui.wizards.NewClassWizardPage; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.window.Window; -import org.eclipse.jface.wizard.WizardDialog; -import org.eclipse.jpt.common.core.internal.utility.jdt.JDTTools; -import org.eclipse.jpt.common.ui.JptCommonUiPlugin; -import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; -import org.eclipse.jpt.utility.internal.ClassName; -import org.eclipse.jpt.utility.internal.StringTools; -import org.eclipse.jpt.utility.model.Model; -import org.eclipse.jpt.utility.model.event.PropertyChangeEvent; -import org.eclipse.jpt.utility.model.listener.PropertyChangeListener; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.dialogs.SelectionDialog; -import org.eclipse.ui.forms.widgets.Hyperlink; - -/** - * This chooser allows the user to choose a type when browsing and it adds code - * completion support to the text field, which is the main component. - * <p> - * Here the layout of this pane: - * <pre> - * ----------------------------------------------------------------------------- - * | ---------------------------------------------------- ------------- | - * | Label: | I | | Browse... | | - * | ---------------------------------------------------- ------------- | - * -----------------------------------------------------------------------------</pre> - * - * @version 2.3 - * @since 2.0 - */ -@SuppressWarnings("nls") -public abstract class ClassChooserPane<T extends Model> extends ChooserPane<T> -{ - /** - * The code completion manager. - */ - protected JavaTypeCompletionProcessor javaTypeCompletionProcessor; - - private PropertyChangeListener subjectChangeListener; - - /** - * Creates a new <code>ClassChooserPane</code>. - * - * @param parentPane The parent pane of this one - * @param parent The parent container - */ - public ClassChooserPane(Pane<? extends T> parentPane, - Composite parent) { - - super(parentPane, parent); - } - - /** - * Creates a new <code>ClassChooserPane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of this pane's subject - * @param parent The parent container - */ - public ClassChooserPane(Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent) { - - super(parentPane, subjectHolder, parent); - } - - @Override - protected void initialize() { - super.initialize(); - - // TODO bug 156185 - when this is fixed there should be api for this - this.javaTypeCompletionProcessor = new JavaTypeCompletionProcessor(false, false); - - this.subjectChangeListener = this.buildSubjectChangeListener(); - this.getSubjectHolder().addPropertyChangeListener(PropertyValueModel.VALUE, this.subjectChangeListener); - - this.classChooserSubjectChanged(getSubject()); - } - - private PropertyChangeListener buildSubjectChangeListener() { - return new SWTPropertyChangeListenerWrapper(this.buildSubjectChangeListener_()); - } - - private PropertyChangeListener buildSubjectChangeListener_() { - return new PropertyChangeListener() { - @SuppressWarnings("unchecked") - public void propertyChanged(PropertyChangeEvent e) { - ClassChooserPane.this.classChooserSubjectChanged((T) e.getNewValue()); - } - }; - } - - protected void classChooserSubjectChanged(T newSubject) { - IPackageFragment packageFragment = null; - if (newSubject != null) { - IPackageFragmentRoot root = getPackageFragmentRoot(); - if (root != null) { - packageFragment = root.getPackageFragment(""); - } - } - this.javaTypeCompletionProcessor.setPackageFragment(packageFragment); - } - - @Override - protected Control addLeftControl(Composite container) { - if( ! this.allowTypeCreation()) { - return super.addLeftControl(container); - } - Hyperlink labelLink = this.addHyperlink(container, - this.getLabelText(), - this.buildHyperLinkAction() - ); - return labelLink; - } - - private Runnable buildHyperLinkAction() { - return new Runnable() { - public void run() { - ClassChooserPane.this.hyperLinkSelected(); - } - }; - } - - protected void hyperLinkSelected() { - IType type = getType(); - if (type != null) { - openInEditor(type); - } - else if (allowTypeCreation()){ - createType(); - } - } - - protected IType getType() { - if (getClassName() == null) { - return null; - } - IType type = null; - try { - type = getJavaProject().findType(getClassName().replace('$', '.')); - } - catch (JavaModelException e) { - JptCommonUiPlugin.log(e); - } - return type; - } - - protected void createType() { - StructuredSelection selection = new StructuredSelection(getJavaProject().getProject()); - - NewClassWizardPage newClassWizardPage = new NewClassWizardPage(); - newClassWizardPage.init(selection); - newClassWizardPage.setSuperClass(getSuperclassName(), true); - newClassWizardPage.setSuperInterfaces(getSuperInterfaceNames(), true); - if (!StringTools.stringIsEmpty(getClassName())) { - newClassWizardPage.setTypeName(ClassName.getSimpleName(getClassName()), true); - String packageName = ClassName.getPackageName(getClassName()); - newClassWizardPage.setPackageFragment(getFirstJavaSourceFolder().getPackageFragment(packageName), true); - } - NewClassCreationWizard wizard = new NewClassCreationWizard(newClassWizardPage, false); - wizard.init(PlatformUI.getWorkbench(), selection); - - WizardDialog dialog = new WizardDialog(getShell(), wizard); - dialog.create(); - int dResult = dialog.open(); - if (dResult == Window.OK) { - String className = (newClassWizardPage.getCreatedType()).getFullyQualifiedName(getEnclosingTypeSeparator()); - setClassName(className); - } - } - - protected abstract void setClassName(String className); - - /** - * Override this to change the enclosing type separator - */ - protected char getEnclosingTypeSeparator() { - return '$'; - } - - /** - * Override this to set a superclass in the New Class wizard. If no class is chosen, - * clicking the hyperlink label will open the new class wizard. - */ - protected String getSuperclassName() { - return ""; - } - - /** - * Override this to set a super interface in the New Class wizard. If no class is chosen, - * clicking the hyperlink label will open the new class wizard. - * @see getSuperInterfaceName - */ - protected List<String> getSuperInterfaceNames() { - return getSuperInterfaceName() != null ? Collections.singletonList(getSuperInterfaceName()) : Collections.<String>emptyList(); - } - - /** - * Override this to set a super interface in the New Class wizard. If no class is chosen, - * clicking the hyperlink label will open the new class wizard. - */ - protected String getSuperInterfaceName() { - return null; - } - - /** - * Override this if it does not make sense to allow the user to create a new type. - * This will determine whether clicking the hyperlink opens the New Class wizard - * @return - */ - protected boolean allowTypeCreation() { - return true; - } - - protected void openInEditor(IType type) { - IJavaElement javaElement = type.getParent(); - try { - JavaUI.openInEditor(javaElement, true, true); - } - catch (JavaModelException e) { - JptCommonUiPlugin.log(e); - } - catch (PartInitException e) { - JptCommonUiPlugin.log(e); - } - } - - protected abstract IJavaProject getJavaProject(); - - @Override - protected final Runnable buildBrowseAction() { - return new Runnable() { - public void run() { - promptType(); - } - }; - } - - @Override - protected Control addMainControl(Composite container) { - Composite subPane = addSubPane(container); - Text text = addText(subPane, buildTextHolder()); - - ControlContentAssistHelper.createTextContentAssistant( - text, - javaTypeCompletionProcessor - ); - - return subPane; - } - - /** - * Creates the value holder of the subject's property. - * - * @return The holder of the class name - */ - protected abstract WritablePropertyValueModel<String> buildTextHolder(); - - /** - * Prompts the user the Open Type dialog. - * - * @return Either the selected type or <code>null</code> if the user - * cancelled the dialog - */ - protected IType chooseType() { - IJavaElement[] elements = new IJavaElement[] { getJavaProject() }; - IJavaSearchScope scope = SearchEngine.createJavaSearchScope(elements); - SelectionDialog typeSelectionDialog; - - try { - typeSelectionDialog = JavaUI.createTypeDialog( - getShell(), - PlatformUI.getWorkbench().getProgressService(), - scope, - getTypeDialogStyle(), - false, - StringTools.stringIsEmpty(getClassName()) ? "" : ClassName.getSimpleName(getClassName()) - ); - } - catch (JavaModelException e) { - JptCommonUiPlugin.log(e); - return null; - } - - typeSelectionDialog.setTitle(JptCommonUiMessages.ClassChooserPane_dialogTitle); - typeSelectionDialog.setMessage(JptCommonUiMessages.ClassChooserPane_dialogMessage); - - if (typeSelectionDialog.open() == Window.OK) { - return (IType) typeSelectionDialog.getResult()[0]; - } - - return null; - } - - protected int getTypeDialogStyle() { - return IJavaElementSearchConstants.CONSIDER_CLASSES; - } - - /** - * Returns the class name from its subject. - * - * @return The class name or <code>null</code> if none is defined - */ - protected abstract String getClassName(); - - protected IPackageFragmentRoot getFirstJavaSourceFolder() { - Iterator<IPackageFragmentRoot> i = JDTTools.getJavaSourceFolders(getJavaProject()).iterator(); - return i.hasNext() ? i.next() : null; - } - - /** - * The browse button was clicked, its action invokes this action which should - * prompt the user to select a class and set it. - */ - protected void promptType() { - IType type = this.chooseType(); - - if (type != null) { - String className = type.getFullyQualifiedName(getEnclosingTypeSeparator()); - setClassName(className); - } - } - - protected IPackageFragmentRoot getPackageFragmentRoot() { - return JDTTools.getCodeCompletionContextRoot(getJavaProject()); - } - - @Override - public void dispose() { - this.getSubjectHolder().removePropertyChangeListener(PropertyValueModel.VALUE, this.subjectChangeListener); - super.dispose(); - } -}
\ No newline at end of file diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ComboPane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ComboPane.java deleted file mode 100644 index 940dabbd57..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ComboPane.java +++ /dev/null @@ -1,289 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009, 2010 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages; -import org.eclipse.jpt.common.ui.internal.util.SWTUtil; -import org.eclipse.jpt.utility.internal.StringTools; -import org.eclipse.jpt.utility.internal.Tools; -import org.eclipse.jpt.utility.model.Model; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.events.ModifyEvent; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; - -/** - * Pane with combo box support for automatic updating of: - * - selected value - * - default value - * - value choices - */ -public abstract class ComboPane<T extends Model> - extends Pane<T> -{ - /** - * The main (only) widget of this pane. - */ - protected Combo comboBox; - - - // **************** constructors ****************************************** - - protected ComboPane( - Pane<? extends T> parentPane, - Composite parent) { - - super(parentPane, parent); - } - - protected ComboPane( - Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent) { - - super(parentPane, subjectHolder, parent); - } - - protected ComboPane( - Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent, - PropertyValueModel<Boolean> enabledModel) { - - super(parentPane, subjectHolder, parent, enabledModel); - } - - - // **************** initialization **************************************** - - @Override - protected void initializeLayout(Composite container) { - this.comboBox = this.addEditableCombo(container); - this.comboBox.addModifyListener(this.buildModifyListener()); - SWTUtil.attachDefaultValueHandler(this.comboBox); - } - - protected ModifyListener buildModifyListener() { - return new ModifyListener() { - public void modifyText(ModifyEvent e) { - ComboPane.this.comboBoxModified(); - } - }; - } - - - // **************** typical overrides ************************************* - - /** - * Return the possible values to be added to the combo during - * population. - */ - protected abstract Iterable<String> getValues(); - - /** - * Return whether the combo is to add a default value to the choices - */ - protected boolean usesDefaultValue() { - // default response is 'true' - return true; - } - - /** - * Return the default value, or <code>null</code> if no default is - * specified. This method is only called when the subject is non-null. - */ - protected abstract String getDefaultValue(); - - /** - * Return the current value from the subject. - * This method is only called when the subject is non-null. - */ - protected abstract String getValue(); - - /** - * Set the specified value as the new value on the subject. - */ - protected abstract void setValue(String value); - - - // **************** overrides ********************************************* - - @Override - protected void propertyChanged(String propertyName) { - super.propertyChanged(propertyName); - this.updateSelectedItem(); - } - - @Override - protected void doPopulate() { - super.doPopulate(); - this.populateComboBox(); - } - - - // **************** populating ******************************************** - - /** - * Populate the combo-box list by clearing it, then adding first the default - * value, if available, and then the possible choices. - */ - protected void populateComboBox() { - this.comboBox.removeAll(); - - if (usesDefaultValue()) { - this.comboBox.add(this.buildDefaultValueEntry()); - } - - for (String value : this.getValues()) { - this.comboBox.add(value); - } - - this.updateSelectedItem_(); - } - - protected String buildDefaultValueEntry() { - if (getSubject() == null) { - return JptCommonUiMessages.NoneSelected; - } - String defaultValue = this.getDefaultValue(); - return (defaultValue == null) ? this.buildNullDefaultValueEntry() : this.buildNonNullDefaultValueEntry(defaultValue); - } - - protected String buildNullDefaultValueEntry() { - return JptCommonUiMessages.DefaultEmpty; - } - - protected String buildNonNullDefaultValueEntry(String defaultValue) { - return NLS.bind( - JptCommonUiMessages.DefaultWithOneParam, - defaultValue); - } - - protected void updateSelectedItem() { - // make sure the default value is up to date (??? ~bjv) - if (usesDefaultValue()) { - String defaultValueEntry = this.buildDefaultValueEntry(); - if ( ! this.comboBox.getItem(0).equals(defaultValueEntry)) { - this.comboBox.remove(0); - this.comboBox.add(defaultValueEntry, 0); - } - } - - this.updateSelectedItem_(); - } - - /** - * Updates the selected item by selecting the current value, if not - * <code>null</code>, or select the default value if one is available, - * otherwise remove the selection. - */ - protected void updateSelectedItem_() { - String value = (this.getSubject() == null) ? null : this.getValue(); - if (value == null) { - if (usesDefaultValue()) { - // select the default value - this.comboBox.select(0); - } - else { - this.comboBox.setText(""); - } - } else { - // select the new value - if ( ! value.equals(this.comboBox.getText())) { - // This prevents the cursor from being set back to the beginning of the line (bug 234418). - // The reason we are hitting this method at all is because the - // context model is updating from the resource model in a way - // that causes change notifications to be fired (the annotation - // is added to the resource model, change notification occurs - // on the update thread, and then the name is set, these 2 - // threads can get in the wrong order). - // The #valueChanged() method sets the populating flag to true, - // but in this case it is already set back to false when we - // receive notification back from the model because it has - // moved to the update thread and then jumps back on the UI thread. - this.comboBox.setText(value); - } - } - } - - protected void repopulateComboBox() { - if ( ! this.comboBox.isDisposed()) { - this.repopulate(); - } - } - - - // **************** combo-box listener callback *************************** - - protected void comboBoxModified() { - if ( ! this.isPopulating()) { - this.valueChanged(this.comboBox.getText()); - } - } - - /** - * The combo-box selection has changed, update the model if necessary. - * If the value has changed and the subject is null, we can build a subject - * before setting the value. - */ - protected void valueChanged(String newValue) { - T subject = this.getSubject(); - String oldValue; - if (subject == null) { - if (this.nullSubjectIsNotAllowed()) { - return; // no subject to set the value on - } - oldValue = null; - } else { - oldValue = this.getValue(); - } - - // convert empty string or default to null - if (StringTools.stringIsEmpty(newValue) || this.valueIsDefault(newValue)) { - newValue = null; - } - - // set the new value if it is different from the old value - if (Tools.valuesAreDifferent(oldValue, newValue)) { - this.setPopulating(true); - - try { - this.setValue(newValue); - } finally { - this.setPopulating(false); - } - } - } - - /** - * Return whether we can set the value when the subject is null - * (i.e. #setValue(String) will construct the subject if necessary). - */ - protected boolean nullSubjectIsAllowed() { - return false; - } - - protected final boolean nullSubjectIsNotAllowed() { - return ! this.nullSubjectIsAllowed(); - } - - /** - * pre-condition: value is not null - */ - protected boolean valueIsDefault(String value) { - if (! usesDefaultValue()) { - return false; - } - return (this.comboBox.getItemCount() > 0) - && value.equals(this.comboBox.getItem(0)); - } -} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/DefaultWidgetFactory.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/DefaultWidgetFactory.java deleted file mode 100644 index 97f4dc388c..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/DefaultWidgetFactory.java +++ /dev/null @@ -1,260 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2010 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.jpt.common.ui.WidgetFactory; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.CCombo; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.DateTime; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.List; -import org.eclipse.swt.widgets.Spinner; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.forms.widgets.FormText; -import org.eclipse.ui.forms.widgets.FormToolkit; -import org.eclipse.ui.forms.widgets.Hyperlink; -import org.eclipse.ui.forms.widgets.Section; -import org.eclipse.ui.forms.widgets.TableWrapData; -import org.eclipse.ui.forms.widgets.TableWrapLayout; - -/** - * This <code>WidgetFactory</code> simply creates plain SWT widgets. - * - * @version 2.0 - * @since 2.0 - */ -public class DefaultWidgetFactory implements WidgetFactory { - - /** - * The singleton instance of this <code>IWidgetFactory</code> - */ - private static final WidgetFactory INSTANCE = new DefaultWidgetFactory(); - - /** - * Creates a new <code>DefaultWidgetFactory</code>. - */ - private DefaultWidgetFactory() { - super(); - } - - /** - * Returns the singleton instance of this <code>IWidgetFactory</code>. - * - * @return The singleton instance of this <code>IWidgetFactory</code> - */ - public static WidgetFactory instance() { - return INSTANCE; - } - - /** - * {@inheritDoc} - */ - public Button createButton(Composite parent, String text) { - return this.createButton(parent, text, SWT.NULL); - } - - /** - * Creates a new button. - * - * @param parent The parent container - * @param text The button's text - * @param style The style to apply to the button, which determines its type: - * toggle, push, check box, radio - * @return The newly created <code>Button</code> - */ - private Button createButton(Composite parent, String text, int style) { - Button button = new Button(parent, style); - button.setText(text); - return button; - } - - /** - * {@inheritDoc} - */ - @Deprecated - public CCombo createCCombo(Composite parent) { - return new CCombo(parent, SWT.BORDER | SWT.READ_ONLY); - } - - /** - * {@inheritDoc} - */ - public Button createCheckBox(Composite parent, String text) { - return this.createButton(parent, text, SWT.CHECK); - } - - /** - * {@inheritDoc} - */ - public Combo createCombo(Composite parent) { - return new Combo(parent, SWT.BORDER | SWT.READ_ONLY); - } - - /** - * {@inheritDoc} - */ - public Composite createComposite(Composite parent) { - return new Composite(parent, SWT.NULL); - } - - /** - * {@inheritDoc} - */ - public DateTime createDateTime(Composite parent, int style) { - return new DateTime(parent, style); - } - - /** - * {@inheritDoc} - */ - @Deprecated - public CCombo createEditableCCombo(Composite parent) { - return new CCombo(parent, SWT.BORDER); - } - - /** - * {@inheritDoc} - */ - public Combo createEditableCombo(Composite parent) { - return new Combo(parent, SWT.BORDER); - } - - /** - * {@inheritDoc} - */ - public Group createGroup(Composite parent, String title) { - Group group = new Group(parent, SWT.NULL); - group.setText(title); - return group; - } - - /** - * {@inheritDoc} - */ - public Hyperlink createHyperlink(Composite parent, String text) { - Hyperlink hyperlink = new Hyperlink(parent, SWT.NULL); - hyperlink.setText(text); - return hyperlink; - } - - /** - * {@inheritDoc} - */ - public Label createLabel(Composite parent, String labelText) { - Label label = new Label(parent, SWT.WRAP); - label.setText(labelText); - return label; - } - - /** - * {@inheritDoc} - */ - public List createList(Composite parent, int style) { - return new List(parent, SWT.BORDER | style); - } - - /** - * {@inheritDoc} - */ - public FormText createMultiLineLabel(Composite parent, String labelText) { - - Composite container = new Composite(parent, SWT.NONE); - - GridData gridData = new GridData(); - gridData.horizontalAlignment = GridData.FILL; - gridData.grabExcessHorizontalSpace = true; - container.setLayoutData(gridData); - - TableWrapLayout layout = new TableWrapLayout(); - layout.numColumns = 1; - layout.bottomMargin = 0; - layout.leftMargin = 0; - layout.rightMargin = 0; - layout.topMargin = 0; - container.setLayout(layout); - - FormToolkit widgetFactory = new FormToolkit(parent.getDisplay()); - FormText text = widgetFactory.createFormText(container, true); - text.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); - text.setText(labelText, false, false); - - return text; - } - - /** - * {@inheritDoc} - */ - public Text createMultiLineText(Composite parent) { - return new Text(parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL); - } - - /** - * {@inheritDoc} - */ - public Text createPasswordText(Composite parent) { - return new Text(parent, SWT.BORDER | SWT.PASSWORD); - } - - /** - * {@inheritDoc} - */ - public Button createPushButton(Composite parent, String text) { - return this.createButton(parent, text, SWT.PUSH); - } - - /** - * {@inheritDoc} - */ - public Button createRadioButton(Composite parent, String text) { - return this.createButton(parent, text, SWT.RADIO); - } - - /** - * {@inheritDoc} - */ - public Section createSection(Composite parent, int style) { - return new Section(parent, style); - } - - /** - * {@inheritDoc} - */ - public Spinner createSpinner(Composite parent) { - return new Spinner(parent, SWT.NULL); - } - - /** - * {@inheritDoc} - */ - public Table createTable(Composite parent, int style) { - return new Table(parent, SWT.BORDER | style); - } - - /** - * {@inheritDoc} - */ - public Text createText(Composite parent) { - return new Text(parent, SWT.BORDER); - } - - /** - * {@inheritDoc} - */ - public Button createTriStateCheckBox(Composite parent, String text) { - TriStateCheckBox checkBox = new TriStateCheckBox(parent, text, this); - return checkBox.getCheckBox(); - } -}
\ No newline at end of file diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/Dialog.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/Dialog.java deleted file mode 100644 index e68c992ed9..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/Dialog.java +++ /dev/null @@ -1,350 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.jface.dialogs.TitleAreaDialog; -import org.eclipse.jpt.common.ui.internal.util.SWTUtil; -import org.eclipse.jpt.utility.internal.model.value.SimplePropertyValueModel; -import org.eclipse.jpt.utility.internal.node.Node; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; -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; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.help.IWorkbenchHelpSystem; - -/** - * The abstract implementation of a dialog using a "state object" (model object) - * for behavior. - * <p> - * The main pane of this dialog should be extending <code>DialogPane</code> - * for creating the right type of widgets and it has the "state object" (subject) - * behavior built-in. - * - * @see Node - * @see DialogPane - * - * @version 2.0 - * @since 2.0 - */ -@SuppressWarnings("nls") -public abstract class Dialog<T extends Node> extends TitleAreaDialog -{ - /** - * The main content pane of this dialog. - */ - private DialogPane<?> pane; - - /** - * The holder of the "state object" used by this dialog. - */ - private WritablePropertyValueModel<T> subjectHolder; - - /** - * Caches the title text until the dialog is created and the dialog's shell - * needs to be configured. - */ - private String title; - - /** - * Creates a new <code>Dialog</code>. - * - * @param parent The parent shell - */ - protected Dialog(Shell parent) { - this(parent, ""); - } - - /** - * Creates a new <code>Dialog</code>. - * - * @param parent The parent shell - * @param title The dialog's title - */ - protected Dialog(Shell parent, String title) { - super(parent); - this.title = title; - initialize(); - } - - /** - * Initializes the main pane of this dialog. This method is invoked only - * when the dialog is requested to show on screen and not during - * initialization. - * - * @param container The container to which the widgets should be added to, - * the layout is already set - */ - protected abstract DialogPane<?> buildLayout(Composite container); - - /** - * Creates the state object (model object) that will be used to keep track - * of the information entered in this dialog. The state object will be stored - * in the subject holder and can be retrieved using {@link #subject()}. - * - * @return A new state object - */ - protected T buildStateObject() { - return null; - } - - /** - * Creates the <code>Validator</code> that will be notified when changes are - * made to the state object. - * - * @return The validator that will be set on the state object - */ - Node.Validator buildValidator() { - return Node.NULL_VALIDATOR; - } - - /* - * (non-Javadoc) - */ - @Override - public boolean close() { - - // Dispose the pane in order to remove any listeners that could - // have been installed outside the scrope of the state object - if (pane != null) { - pane.dispose(); - pane = null; - } - - return super.close(); - } - - /** - * {@inheritDoc} - */ - @Override - protected void configureShell(Shell shell) { - super.configureShell(shell); - shell.setText(getTitle()); - } - - /** - * {@inheritDoc} - */ - @Override - public void create() { - super.create(); - installSubject(); - } - - /* - * (non-Javadoc) - */ - @Override - protected Control createContents(Composite parent) { - if (hasTitleArea()) { - return super.createContents(parent); - } - - return createDefaultContent(parent); - } - - /** - * Creates the default main container of this dialog when the title area is - * not required. The top part is the dialog area populated by the subclass - * and the lower part is the button pane having the OK and Cancel buttons. - * - * @param parent The parent container - * @return The - */ - private Composite createDefaultContent(Composite parent) { - - Composite composite = new Composite(parent, SWT.NULL); - - GridLayout layout = new GridLayout(1, false); - layout.marginHeight = 0; - layout.marginWidth = 0; - layout.verticalSpacing = 0; - composite.setLayout(layout); - composite.setLayoutData(new GridData(GridData.FILL_BOTH)); - - applyDialogFont(composite); - initializeDialogUnits(composite); - dialogArea = createDialogArea(composite); - buttonBar = createButtonBar(composite); - - return composite; - } - - /* - * (non-Javadoc) - */ - @Override - protected Composite createDialogArea(Composite parent) { - - // If the title area needs to be shown, then leave the superclass to - // create the necessary widgets - if (hasTitleArea()) { - parent = (Composite) super.createDialogArea(parent); - } - - // Create the main area's container - Composite container = new Composite(parent, SWT.NULL); - container.setLayout(new GridLayout(1, false)); - - GridData gridData = new GridData(); - gridData.horizontalAlignment = GridData.FILL; - gridData.verticalAlignment = GridData.FILL; - gridData.grabExcessHorizontalSpace = true; - gridData.grabExcessVerticalSpace = true; - container.setLayoutData(gridData); - - // Initialize the content pane - pane = buildLayout(container); - - // Initialize the UI part, which requires the widgets being created - initializeUI(); - - return parent; - } - - /** - * Determines whether the description area (where a title, description and - * image) should be visible or hidden. <code>ValidatingDialog</code> - * automatically show the description area in order to show problems. - * - * @return <code>false</code> by default, which means the methods used to - * update the title, description and image shouldn't be called; <code>true</code> - * to make the description pane visible - */ - protected boolean hasTitleArea() { - return false; - } - - /** - * Returns the helps system. - * - * @return The platform's help system - * - * @category Helper - */ - protected final IWorkbenchHelpSystem getHelpSystem() { - return PlatformUI.getWorkbench().getHelpSystem(); - } - - /** - * Initializes this dialog. - */ - protected void initialize() { - this.subjectHolder = new SimplePropertyValueModel<T>(); - } - - /** - * Initializes the UI part of this dialog, this is called after the widgets - * have been created. - */ - protected void initializeUI() { - } - - /** - * Creates the state object, if one is needed and install a <code>Validator</code> - * in order to receive notification of changes done to that state object. The - * subject can be retrieved from the subject holder. - */ - private void installSubject() { - - T subject = buildStateObject(); - - if (subject != null) { - subject.setValidator(buildValidator()); - } - - subjectHolder.setValue(subject); - } - - /** - * Asynchronously launches this dialog in the UI thread. - */ - public final void openDialog() { - SWTUtil.setUserInterfaceActive(false); - SWTUtil.show(this); - } - - /** - * Asynchronously launches this dialog in the UI thread and invoke the given - * <code>PostExecution</code> to perform any post-task. - * - * @param postExecution This interface let the caller to invoke a piece of - * code once the dialog is disposed - */ - public final void openDialog(PostExecution<? extends Dialog<T>> execution) { - SWTUtil.setUserInterfaceActive(false); - SWTUtil.show(this, execution); - } - - /** - * Gives access to the dialog's main pane. - * - * @return The pane showing the custom widgets - */ - protected DialogPane<?> getPane() { - return pane; - } - - /** - * Returns the subject of this dialog. - * - * @return The subject of this dialog or <code>null</code> if no subject was - * used - */ - public T getSubject() { - return subjectHolder.getValue(); - } - - /** - * Returns the holder of the subject. - * - * @return The subject holder used to be passed to the dialog pane, which is - * an instance of <code>DialogPane</code> - */ - protected final PropertyValueModel<T> getSubjectHolder() { - return subjectHolder; - } - - /** - * Retrieves the dialog's title. The title passed to the constructor will be - * returned by default but if it wasn't specified, this method can be used - * to return it. - * - * @return Either the title passed to the constructor or a different title - */ - protected String getTitle() { - return title; - } - - /** - * Determines whether the dialog was cancelled or not. - * - * @return <code>true</code> if the dialog was cancelled; <code>false</code> - * if it was confirmed - */ - public final boolean wasCancelled() { - return getReturnCode() == CANCEL; - } - - /** - * Determines whether the dialog was confirmed or not. - * - * @return <code>true</code> if the dialog was confirmed; <code>false</code> - * if it was cancelled - */ - public final boolean wasConfirmed() { - return getReturnCode() == OK; - } -}
\ No newline at end of file diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/DialogPane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/DialogPane.java deleted file mode 100644 index 7d041c8240..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/DialogPane.java +++ /dev/null @@ -1,109 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.jpt.utility.internal.node.Node; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.swt.widgets.Composite; - -/** - * The abstract pane to use when the pane is shown in an <code>Dialog</code>. - * - * @see Dialog - * - * @version 2.0 - * @since 2.0 - */ -public abstract class DialogPane<T extends Node> extends Pane<T> { - - /** - * Creates a new <code>DialogPane</code>. - * - * @param parentPane The parent controller of this one - * @param parent The parent container - * - * @category Constructor - */ - protected DialogPane(DialogPane<? extends T> parentPane, - Composite parent) { - - super(parentPane, parent); - } - - /** - * Creates a new <code>DialogPane</code>. - * - * @param parentPane The parent container of this one - * @param parent The parent container - * @param widgetFactory The factory used to create various widgets - * @param automaticallyAlignWidgets <code>true</code> to make the widgets - * this pane aligned with the widgets of the given parent controller; - * <code>false</code> to not align them - * - * @category Constructor - */ - protected DialogPane(DialogPane<? extends T> parentPane, - Composite parent, - boolean automaticallyAlignWidgets) { - - super(parentPane, parent, automaticallyAlignWidgets); - } - - /** - * Creates a new <code>DialogPane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of this pane's subject - * @param parent The parent container - * - * @category Constructor - */ - protected DialogPane(DialogPane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent) { - - super(parentPane, subjectHolder, parent); - } - - /** - * Creates a new <code>DialogPane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of this pane's subject - * @param parent The parent container - * @param widgetFactory The factory used to create various widgets - * @param automaticallyAlignWidgets <code>true</code> to make the widgets - * this pane aligned with the widgets of the given parent controller; - * <code>false</code> to not align them - * - * @category Constructor - */ - protected DialogPane(DialogPane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent, - boolean automaticallyAlignWidgets) { - - super(parentPane, subjectHolder, parent, automaticallyAlignWidgets); - } - - /** - * Creates a new <code>DialogPane</code>. - * - * @param subjectHolder The holder of this pane's subject - * @param parent The parent container - * - * @category Constructor - */ - protected DialogPane(PropertyValueModel<? extends T> subjectHolder, - Composite parent) { - - super(subjectHolder, parent, DefaultWidgetFactory.instance()); - } -}
\ No newline at end of file diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/EnumComboViewer.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/EnumComboViewer.java deleted file mode 100644 index 8cd31f08ef..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/EnumComboViewer.java +++ /dev/null @@ -1,369 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2011 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import java.util.Arrays; -import java.util.Comparator; -import org.eclipse.jface.viewers.ComboViewer; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jpt.common.ui.WidgetFactory; -import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages; -import org.eclipse.jpt.common.ui.internal.util.SWTUtil; -import org.eclipse.jpt.utility.model.Model; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.widgets.Composite; -import com.ibm.icu.text.Collator; - -/** - * This pane simply shows a combo where its data is populating through - * {@link #choices()} and a default value can also be added. - * <p> - * Here the layout of this pane: - * <pre> - * ----------------------------------------------------------------------------- - * | ------------------------------------------------------------------------- | - * | | I |v| | - * | ------------------------------------------------------------------------- | - * -----------------------------------------------------------------------------</pre> - * - * @version 2.0 - * @since 1.0 - */ -@SuppressWarnings("nls") -abstract class EnumComboViewer<T extends Model, V> extends Pane<T> -{ - /** - * The main widget of this pane. - */ - private ComboViewer comboViewer; - - /** - * A constant used to represent the <code>null</code> value. - */ - public static final String NULL_VALUE = "null"; - - /** - * Creates a new <code>EnumComboViewer</code>. - * - * @param parentPane The parent container of this one - * @param parent The parent container - * @param widgetFactory The factory used to create various widgets - */ - EnumComboViewer(Pane<? extends T> parentPane, - Composite parent) { - - super(parentPane, parent); - } - - /** - * Creates a new <code>EnumComboViewer</code>. - * - * @param parentPane The parent container of this one - * @param parent The parent container - * @param widgetFactory The factory used to create various widgets - */ - EnumComboViewer(Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent) { - - super(parentPane, subjectHolder, parent); - } - - /** - * Creates a new <code>EnumComboViewer</code>. - * - * @param subjectHolder The holder of this pane's subject - * @param parent The parent container - * @param widgetFactory The factory used to create various widgets - */ - EnumComboViewer(PropertyValueModel<? extends T> subjectHolder, - Composite parent, - WidgetFactory widgetFactory) { - - super(subjectHolder, parent, widgetFactory); - } - - /** - * Creates the list of choices and add an extra element that represents the - * default value. - * - * @return The combo's choices including the default value - */ - private Object[] buildChoices() { - V[] choices = getChoices(); - if (sortChoices()) { - Arrays.sort(choices, buildComparator()); - } - - Object[] extendedChoices = new Object[choices.length + 1]; - System.arraycopy(choices, 0, extendedChoices, 1, choices.length); - extendedChoices[0] = NULL_VALUE; - - return extendedChoices; - } - - /** - * Return true to sort the choices in alphabetical order - * @return - */ - protected boolean sortChoices() { - return true; - } - - /** - * Creates the <code>ComboViewer</code> with the right combo widgets. - * - * @param container The container of the combo - * @return A new <code>ComboViewer</code> containing the right combo widget - */ - protected ComboViewer addComboViewer(Composite container) { - return addComboViewer(container, buildLabelProvider()); - } - - private Comparator<Object> buildComparator() { - return new Comparator<Object>() { - final LabelProvider labelProvider = buildLabelProvider(); - - public int compare(Object value1, Object value2) { - String displayString1 = labelProvider.getText(value1); - String displayString2 = labelProvider.getText(value2); - return Collator.getInstance().compare(displayString1, displayString2); - } - }; - } - - /** - * Retrieves the localized string from the given NLS class by creating the - * key. That key is the concatenation of the composite's short class name - * with the toString() of the given value separated by an underscore. - * - * @param nlsClass The NLS class used to retrieve the localized text - * @param compositeClass The class used for creating the key, its short class - * name is the beginning of the key - * @param value The value used to append its toString() to the generated key - * @return The localized text associated with the value - */ - protected final String buildDisplayString(Class<?> nlsClass, - Class<?> compositeClass, - Object value) { - - return SWTUtil.buildDisplayString(nlsClass, compositeClass, value); - } - - /** - * Retrieves the localized string from the given NLS class by creating the - * key. That key is the concatenation of the composite's short class name - * with the toString() of the given value separated by an underscore. - * - * @param nlsClass The NLS class used to retrieve the localized text - * @param composite The object used to retrieve the short class name that is - * the beginning of the key - * @param value The value used to append its toString() to the generated key - * @return The localized text associated with the value - */ - protected final String buildDisplayString(Class<?> nlsClass, - Object composite, - Object value) { - - return SWTUtil.buildDisplayString(nlsClass, composite, value); - } - - /** - * Creates the display string for the given element. If the element is the - * virtual <code>null</code> value then its display string will be "Default" - * appended by the actual default value, if it exists. - * - * @param value The value to convert into a human readable string - * @return The string representation of the given element - */ - @SuppressWarnings("unchecked") - private String buildDisplayString(Object value) { - if (value == NULL_VALUE) { - V defaultValue = (getSubject() != null) ? getDefaultValue() : null; - - if (defaultValue != null) { - String displayString = displayString(defaultValue); - return NLS.bind(JptCommonUiMessages.EnumComboViewer_defaultWithDefault, displayString); - } - return nullDisplayString(); - } - - return displayString((V) value); - } - - final LabelProvider buildLabelProvider() { - return new LabelProvider() { - @Override - public String getText(Object element) { - return buildDisplayString(element); - } - }; - } - - private ISelection buildSelection() { - Object value = (getSubject() != null) ? getValue() : null; - - if (value == null) { - value = NULL_VALUE; - } - - return new StructuredSelection(value); - } - - private ISelectionChangedListener buildSelectionChangedListener() { - return new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent e) { - if (!isPopulating()) { - StructuredSelection selection = (StructuredSelection) e.getSelection(); - valueChanged(selection.getFirstElement()); - } - } - }; - } - - /** - * Returns the possible choices to show in the viewer. - * - * @return The items to show in the combos - */ - protected abstract V[] getChoices(); - - /** - * Returns the default value, this method is not called if the subject is - * <code>null</code>. - * - * @return The value that is declared as being the default when it is not - * defined or <code>null</code> if there is no default value - */ - protected abstract V getDefaultValue(); - - /** - * Returns the displayable string for the given value. - * - * @param value The value to translate into a human readable string - * @return The localized text representing the given value - */ - protected abstract String displayString(V value); - - /** - * Returns the displayable string for a null value. - */ - protected String nullDisplayString() { - return null; //I would rather display nothing than "Default()" - } - - /* - * (non-Javadoc) - */ - @Override - protected void doPopulate() { - super.doPopulate(); - this.populateCombo(); - } - - /** - * Returns - * - * @return - */ - final ComboViewer getComboViewer() { - return comboViewer; - } - - /** - * Retrieves the subject's value. The subject is never <code>null</code>. - * - * @return The subject' value, which can be <code>null</code> - */ - protected abstract V getValue(); - - /* - * (non-Javadoc) - */ - @Override - protected final void initializeLayout(Composite container) { - - this.comboViewer = this.addComboViewer(container); - this.comboViewer.addSelectionChangedListener(buildSelectionChangedListener()); - } - - /** - * Populates the combo by re-adding all the items. - */ - private void populateCombo() { - - removeAll(); - comboViewer.add(buildChoices()); - updateSelection(); - } - - /* - * (non-Javadoc) - */ - @Override - protected void propertyChanged(String propertyName) { - super.propertyChanged(propertyName); - this.populateCombo(); - } - - /** - * Removes all the items from the combo. - */ - abstract void removeAll(); - - /** - * Requests the given new value be set on the subject. - * - * @param value The new value to be set - */ - protected abstract void setValue(V value); - - /** - * Updates the cursor, which is required to show the entire selected item - * within the combo's area. - */ - abstract void updateCursor(); - - /** - * Updates the combo's selected item. - */ - private void updateSelection() { - comboViewer.setSelection(buildSelection()); - updateCursor(); - } - - /** - * The selection changes, notify the subclass to set the value. - * - * @param value The new selected item - */ - @SuppressWarnings("unchecked") - private void valueChanged(Object value) { - - // Convert the default "null" value to a real null - if (value == NULL_VALUE) { - value = null; - } - - setPopulating(true); - - try { - setValue((V) value); - } - finally { - setPopulating(false); - } - } -} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/EnumDialogComboViewer.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/EnumDialogComboViewer.java deleted file mode 100644 index 8cd752ac61..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/EnumDialogComboViewer.java +++ /dev/null @@ -1,77 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2010 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.jpt.utility.model.Model; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; - -/** - * This <code>EnumComboViewer</code> should be used within a dialog pane. - * - * @version 2.0 - * @since 2.0 - */ -public abstract class EnumDialogComboViewer<T extends Model, V> - extends EnumComboViewer<T, V> -{ - /** - * Creates a new <code>EnumDialogComboViewer</code>. - * - * @param parentPane The parent container of this one - * @param parent The parent container - * @param widgetFactory The factory used to create various widgets - */ - protected EnumDialogComboViewer(DialogPane<? extends T> parentPane, - Composite parent - ) { - super(parentPane, parent); - } - - /** - * Creates a new <code>EnumDialogComboViewer</code>. - * - * @param parentPane The parent container of this one - * @param parent The parent container - * @param widgetFactory The factory used to create various widgets - */ - protected EnumDialogComboViewer(DialogPane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent - ) { - super(parentPane, subjectHolder, parent); - } - - @Override - public void enableWidgets(boolean enabled) { - super.enableWidgets(enabled); - - Combo combo = getCombo(); - if ( ! combo.isDisposed()) { - combo.setEnabled(enabled); - } - } - - protected final Combo getCombo() { - return getComboViewer().getCombo(); - } - - @Override - void removeAll() { - getCombo().removeAll(); - } - - @Override - void updateCursor() { - getCombo().setSelection(new Point(0, 0)); - } -} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/EnumFormComboViewer.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/EnumFormComboViewer.java deleted file mode 100644 index c79501c0af..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/EnumFormComboViewer.java +++ /dev/null @@ -1,77 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2006, 2010 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.jpt.utility.model.Model; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; - -/** - * This <code>EnumComboViewer</code> should be used within a form pane. - * - * @version 2.3 - * @since 1.0 - */ -public abstract class EnumFormComboViewer<T extends Model, V> - extends EnumComboViewer<T, V> -{ - /** - * Creates a new <code>EnumFormComboViewer</code>. - * - * @param parentPane The parent container of this one - * @param parent The parent container - * @param widgetFactory The factory used to create various widgets - */ - protected EnumFormComboViewer(Pane<? extends T> parentPane, - Composite parent - ) { - super(parentPane, parent); - } - - /** - * Creates a new <code>EnumFormComboViewer</code>. - * - * @param parentPane The parent container of this one - * @param parent The parent container - * @param widgetFactory The factory used to create various widgets - */ - protected EnumFormComboViewer(Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent - ) { - super(parentPane, subjectHolder, parent); - } - - @Override - public void enableWidgets(boolean enabled) { - super.enableWidgets(enabled); - - Combo combo = getCombo(); - if ( ! combo.isDisposed()) { - combo.setEnabled(enabled); - } - } - - protected final Combo getCombo() { - return this.getComboViewer().getCombo(); - } - - @Override - void removeAll() { - getCombo().removeAll(); - } - - @Override - void updateCursor() { - getCombo().setSelection(new Point(0, 0)); - } -} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/FileChooserComboPane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/FileChooserComboPane.java deleted file mode 100644 index bae31806c6..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/FileChooserComboPane.java +++ /dev/null @@ -1,105 +0,0 @@ -/******************************************************************************* -* Copyright (c) 2010 Oracle. 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: -* Oracle - initial API and implementation -*******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import java.util.Arrays; -import java.util.List; - -import org.eclipse.jpt.utility.internal.StringConverter; -import org.eclipse.jpt.utility.internal.model.value.SimpleListValueModel; -import org.eclipse.jpt.utility.model.Model; -import org.eclipse.jpt.utility.model.value.ListValueModel; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; - -/** - * This chooser allows the user to choose a file when browsing. - * <p> - * Here the layout of this pane: - * <pre> - * ----------------------------------------------------------------------------- - * | ---------------------------------------------------- ------------- | - * | Label: | I |v| | | Browse... | | - * | ---------------------------------------------------- ------------- | - * -----------------------------------------------------------------------------</pre> - * - * @version 3.0 - * @since 3.0 - */ -public abstract class FileChooserComboPane<T extends Model> extends FileChooserPane<T> -{ - /** - * Creates a new <code>FileChooserComboPane</code>. - * - * @param parentPane The parent pane of this one - * @param parent The parent container - */ - public FileChooserComboPane(Pane<? extends T> parentPane, - Composite parent) { - - super(parentPane, parent); - } - - /** - * Creates a new <code>FileChooserComboPane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of this pane's subject - * @param parent The parent container - */ - public FileChooserComboPane(Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent) { - - super(parentPane, subjectHolder, parent); - } - - @Override - protected Control addMainControl(Composite container) { - - return addEditableCombo( - container, - this.buildListHolder(), - this.getTextHolder(), - this.buildStringConverter() - ); - } - - /** - * Creates the list holder of the combo box. - */ - protected ListValueModel<String> buildListHolder() { - return new SimpleListValueModel<String>( - this.buildDefaultList() - ); - } - - /** - * Creates the default list of the combo box. - */ - protected List<String> buildDefaultList() { - return Arrays.asList(this.getDefaultString()); - } - - /** - * Returns the default value of the combo box. - */ - protected abstract String getDefaultString(); - - /** - * The converter responsible to transform each combo box item - * into a string representation - */ - protected StringConverter<String> buildStringConverter() { - return StringConverter.Default.<String>instance(); - } - -}
\ No newline at end of file diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/FileChooserPane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/FileChooserPane.java deleted file mode 100644 index 98b2063f06..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/FileChooserPane.java +++ /dev/null @@ -1,167 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2010 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jface.viewers.ViewerFilter; -import org.eclipse.jpt.common.ui.JptCommonUiPlugin; -import org.eclipse.jpt.utility.model.Model; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.ui.dialogs.ISelectionStatusValidator; - -/** - * This chooser allows the user to choose a file when browsing. - * <p> - * Here the layout of this pane: - * <pre> - * ----------------------------------------------------------------------------- - * | ---------------------------------------------------- ------------- | - * | Label: | I | | Browse... | | - * | ---------------------------------------------------- ------------- | - * -----------------------------------------------------------------------------</pre> - * - * @version 2.0 - * @since 2.0 - */ -@SuppressWarnings("nls") -public abstract class FileChooserPane<T extends Model> extends ChooserPane<T> -{ - private WritablePropertyValueModel<String> textHolder; - - /** - * Creates a new <code>FileChooserPane</code>. - * - * @param parentPane The parent pane of this one - * @param parent The parent container - */ - public FileChooserPane(Pane<? extends T> parentPane, - Composite parent) { - - super(parentPane, parent); - } - - /** - * Creates a new <code>FileChooserPane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of this pane's subject - * @param parent The parent container - */ - public FileChooserPane(Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent) { - - super(parentPane, subjectHolder, parent); - } - - @Override - protected final Runnable buildBrowseAction() { - return new Runnable() { - public void run() { - promptFile(); - } - }; - } - - /** - * Creates the <code>ViewerFilter</code> that will filter the content of the - * dialog and only displays what is valid. - * - * @return A new <code>ViewerFilter</code> - */ - protected ViewerFilter buildFilter() { - return new ViewerFilter() { - @Override - public boolean select(Viewer viewer, - Object parentElement, - Object element) { - - return true; - } - }; - } - - @Override - protected Control addMainControl(Composite container) { - return this.addText(container, this.textHolder); - } - - /** - * Creates the value holder of the subject's property. - * - * @return The holder of the class name - */ - protected abstract WritablePropertyValueModel<String> buildTextHolder(); - - /** - * Creates the validator that will show a status message based on what is - * selected in the selection dialog. - * - * @return A new <code>ISelectionStatusValidator</code> - */ - protected ISelectionStatusValidator buildValidator() { - return new ISelectionStatusValidator() { - public IStatus validate(Object[] selection) { - - if (selection.length != 1) { - return new Status(IStatus.ERROR, JptCommonUiPlugin.PLUGIN_ID, ""); - } - - return new Status(IStatus.OK, JptCommonUiPlugin.PLUGIN_ID, ""); - } - }; - } - - /** - * Returns the selection dialog's title. - * - * @return A non-<code>null</code> string - */ - protected abstract String getDialogTitle(); - - /** - * Retrieves the project path that will be used by the selection dialog. - * - * @return The project path used to display its content in a selection dialog - */ - protected abstract String getProjectPath(); - - protected WritablePropertyValueModel<String> getTextHolder() { - return this.textHolder; - } - - @Override - protected void initialize() { - super.initialize(); - this.textHolder = this.buildTextHolder(); - } - - /** - * The browse button was clicked, its action invokes this action which should - * prompt the user to select a file and set it. - */ - protected void promptFile() { - String projectPath= this.getProjectPath(); - - FileDialog dialog = new FileDialog(getShell()); - dialog.setText(this.getDialogTitle()); - dialog.setFilterPath(projectPath); - String filePath = dialog.open(); - if (filePath != null) { - FileChooserPane.this.textHolder.setValue(filePath); - } - } -} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/FolderChooserComboPane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/FolderChooserComboPane.java deleted file mode 100644 index ec4e55cb2d..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/FolderChooserComboPane.java +++ /dev/null @@ -1,106 +0,0 @@ -/******************************************************************************* -* Copyright (c) 2010 Oracle. 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: -* Oracle - initial API and implementation -*******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import java.util.Arrays; -import java.util.List; - -import org.eclipse.jpt.utility.internal.StringConverter; -import org.eclipse.jpt.utility.internal.model.value.SimpleListValueModel; -import org.eclipse.jpt.utility.model.Model; -import org.eclipse.jpt.utility.model.value.ListValueModel; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; - - -/** - * This chooser allows the user to choose a folder when browsing. - * <p> - * Here the layout of this pane: - * <pre> - * ----------------------------------------------------------------------------- - * | ---------------------------------------------------- ------------- | - * | Label: | I |v| | | Browse... | | - * | ---------------------------------------------------- ------------- | - * -----------------------------------------------------------------------------</pre> - * - * @version 3.0 - * @since 3.0 - */ -public abstract class FolderChooserComboPane<T extends Model> extends FolderChooserPane<T> -{ - /** - * Creates a new <code>FolderChooserComboPane</code>. - * - * @param parentPane The parent pane of this one - * @param parent The parent container - */ - public FolderChooserComboPane(Pane<? extends T> parentPane, - Composite parent) { - - super(parentPane, parent); - } - - /** - * Creates a new <code>FolderChooserComboPane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of this pane's subject - * @param parent The parent container - */ - public FolderChooserComboPane(Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent) { - - super(parentPane, subjectHolder, parent); - } - - @Override - protected Control addMainControl(Composite container) { - - return addEditableCombo( - container, - this.buildListHolder(), - this.getTextHolder(), - this.buildStringConverter() - ); - } - - /** - * Creates the list holder of the combo box. - */ - protected ListValueModel<String> buildListHolder() { - return new SimpleListValueModel<String>( - this.buildDefaultList() - ); - } - - /** - * Creates the default list of the combo box. - */ - protected List<String> buildDefaultList() { - return Arrays.asList(this.getDefaultString()); - } - - /** - * Returns the default value of the combo box. - */ - protected abstract String getDefaultString(); - - /** - * The converter responsible to transform each combo box item - * into a string representation - */ - protected StringConverter<String> buildStringConverter() { - return StringConverter.Default.<String>instance(); - } - -} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/FolderChooserPane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/FolderChooserPane.java deleted file mode 100644 index b9f3fd4448..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/FolderChooserPane.java +++ /dev/null @@ -1,140 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 20010 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.jpt.utility.model.Model; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.DirectoryDialog; - -/** - * This chooser allows the user to choose a folder when browsing. - * <p> - * Here the layout of this pane: - * <pre> - * ----------------------------------------------------------------------------- - * | ---------------------------------------------------- ------------- | - * | Label: | I | | Browse... | | - * | ---------------------------------------------------- ------------- | - * -----------------------------------------------------------------------------</pre> - * - * @version 3.0 - * @since 2.0 - */ -public abstract class FolderChooserPane<T extends Model> extends ChooserPane<T> -{ - private WritablePropertyValueModel<String> textHolder; - - /** - * Creates a new <code>FolderChooserPane</code>. - * - * @param parentPane The parent pane of this one - * @param parent The parent container - */ - public FolderChooserPane(Pane<? extends T> parentPane, - Composite parent) { - - super(parentPane, parent); - } - - /** - * Creates a new <code>FolderChooserPane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of this pane's subject - * @param parent The parent container - */ - public FolderChooserPane(Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent) { - - super(parentPane, subjectHolder, parent); - } - - @Override - protected final Runnable buildBrowseAction() { - return new Runnable() { - public void run() { - promptFolder(); - } - }; - } - - @Override - protected Control addMainControl(Composite container) { - return this.addText(container, this.textHolder); - } - - /** - * Creates the value holder of the subject's property. - * - * @return The holder of the class name - */ - protected abstract WritablePropertyValueModel<String> buildTextHolder(); - - /** - * Returns the message to be shown in the selection dialog. - * - * @return A non-<code>null</code> string shown above the text field of the - * selection dialog - */ - protected abstract String getDialogMessage(); - - /** - * Returns the selection dialog's title. - * - * @return A non-<code>null</code> string - */ - protected abstract String getDialogTitle(); - - /** - * Returns the path that the dialog will use to filter the directories it - * shows to the argument, which may be null. If the string is null, then the - * operating system's default filter path will be used. - * <p> - * Note that the path string is platform dependent. For convenience, either - * '/' or '\' can be used as a path separator. - * </p> - * - * @return The filter path - */ - protected String filterPath() { - return null; - } - - protected WritablePropertyValueModel<String> getTextHolder() { - return this.textHolder; - } - - @Override - protected void initialize() { - super.initialize(); - this.textHolder = this.buildTextHolder(); - } - - /** - * The browse button was clicked, its action invokes this action which should - * prompt the user to select a folder and set it. - */ - protected void promptFolder() { - - DirectoryDialog dialog = new DirectoryDialog(getShell()); - dialog.setMessage(this.getDialogMessage()); - dialog.setText(this.getDialogTitle()); - dialog.setFilterPath(this.filterPath()); - String directory = dialog.open(); - - if (directory != null) { - this.textHolder.setValue(directory); - } - } -} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/FormWidgetFactory.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/FormWidgetFactory.java deleted file mode 100644 index ea1302f7df..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/FormWidgetFactory.java +++ /dev/null @@ -1,338 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2010 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.jpt.common.ui.WidgetFactory; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.CCombo; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.DateTime; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.List; -import org.eclipse.swt.widgets.Spinner; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.forms.widgets.FormText; -import org.eclipse.ui.forms.widgets.FormToolkit; -import org.eclipse.ui.forms.widgets.Hyperlink; -import org.eclipse.ui.forms.widgets.Section; -import org.eclipse.ui.forms.widgets.TableWrapData; -import org.eclipse.ui.forms.widgets.TableWrapLayout; - -/** - * This <code>WidgetFactory</code> is responsible to create the widgets - * using the <code>FormToolkit</code> in order use the form style (flat-style) - * look and feel. - * - * @see FormToolkit - * - * @version 2.0 - * @since 2.0 - */ -@SuppressWarnings("nls") -public class FormWidgetFactory implements WidgetFactory { - - /** - * The actual factory responsible for creating the new widgets. - */ - private final FormToolkit widgetFactory; - - /** - * Creates a new <code>FormWidgetFactory</code>. - * - * @param widgetFactory The actual factory responsible for creating the new - * widgets - */ - public FormWidgetFactory(FormToolkit widgetFactory) { - super(); - - Assert.isNotNull(widgetFactory, "The widget factory cannot be null"); - this.widgetFactory = widgetFactory; - } - - /** - * Wraps the given <code>Composite</code> into a new <code>Composite</code> - * in order to have the widgets' border painted. Except for <code>CCombo</code>, - * the top and bottom margins have to be 2 pixel and the left and right - * margins have to be 1 pixel. - * - * @param container The parent of the sub-pane - * @return A new <code>Composite</code> that has the necessary space to paint - * the border - */ - protected Composite createBorderContainer(Composite container) { - return createBorderContainer(container, 2, 1); - } - - protected Composite createBorderContainer(Composite container, int marginHeight, int marginWidth) { - - GridLayout layout = new GridLayout(1, false); - layout.marginHeight = marginHeight; - layout.marginWidth = marginWidth; - - GridData gridData = new GridData(); - gridData.horizontalAlignment = GridData.FILL; - gridData.grabExcessHorizontalSpace = true; - - container = widgetFactory.createComposite(container); - container.setLayoutData(gridData); - container.setLayout(layout); - - return container; - } - - /** - * {@inheritDoc} - */ - public Button createButton(Composite parent, String text) { - return createButton(parent, text, SWT.NULL); - } - - /** - * Creates a new button. - * - * @param parent The parent container - * @param text The button's text - * @param style The style to apply to the button, which determines its type: - * toggle, push, check box, radio - * @return The newly created <code>Button</code> - */ - protected Button createButton(Composite parent, String text, int style) { - return widgetFactory.createButton(parent, text, SWT.FLAT | style); - } - - /** - * {@inheritDoc} - */ - @Deprecated - public CCombo createCCombo(Composite parent) { - return createCCombo(parent, SWT.READ_ONLY); - } - - /** - * Creates a new combo. - * - * @param parent The parent container - * @param style The style to apply to the combo, usually read-only, flat - * @return The newly created <code>CCombo</code> - */ - protected CCombo createCCombo(Composite parent, int style) { - parent = createBorderContainer(parent, 1, 1); - - CCombo combo = new CCombo(parent, style); - widgetFactory.adapt(combo, true, false); - - // Bugzilla 145837 - workaround for no borders on Windows XP - if (widgetFactory.getBorderStyle() == SWT.BORDER) { - combo.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); - } - - return combo; - } - - /** - * {@inheritDoc} - */ - public Button createCheckBox(Composite parent, String text) { - return createButton(parent, text, SWT.CHECK); - } - - /** - * {@inheritDoc} - */ - public Combo createCombo(Composite parent) { - return new Combo(parent, SWT.READ_ONLY | SWT.FLAT); - } - - /** - * {@inheritDoc} - */ - public Composite createComposite(Composite parent) { - return this.widgetFactory.createComposite(parent); - } - /** - * {@inheritDoc} - */ - public DateTime createDateTime(Composite parent, int style) { - parent = createBorderContainer(parent); - - DateTime dateTime = new DateTime(parent, style | SWT.FLAT); - dateTime.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); - this.widgetFactory.adapt(dateTime, true, false); - - return dateTime; - } - - /** - * {@inheritDoc} - */ - @Deprecated - public CCombo createEditableCCombo(Composite parent) { - return createCCombo(parent, SWT.NULL); - } - - /** - * {@inheritDoc} - */ - public Combo createEditableCombo(Composite parent) { - Combo combo = new Combo(parent, SWT.FLAT); - return combo; - } - - /** - * {@inheritDoc} - */ - public Group createGroup(Composite parent, String title) { - Group group = new Group(parent, SWT.NULL); - group.setText(title); - return group; - } - - /** - * {@inheritDoc} - */ - public Hyperlink createHyperlink(Composite parent, String text) { - return widgetFactory.createHyperlink(parent, text, SWT.FLAT); - } - - /** - * {@inheritDoc} - */ - public Label createLabel(Composite container, String labelText) { - return widgetFactory.createLabel(container, labelText, SWT.WRAP); - } - - /** - * {@inheritDoc} - */ - public List createList(Composite container, int style) { - List list = new List(container, SWT.FLAT | style); - list.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); - return list; - } - - /** - * {@inheritDoc} - */ - public FormText createMultiLineLabel(Composite parent, String labelText) { - - Composite container = widgetFactory.createComposite(parent, SWT.NONE); - - GridData gridData = new GridData(); - gridData.horizontalAlignment = GridData.FILL; - gridData.grabExcessHorizontalSpace = true; - container.setLayoutData(gridData); - - TableWrapLayout layout = new TableWrapLayout(); - layout.numColumns = 1; - layout.bottomMargin = 0; - layout.leftMargin = 0; - layout.rightMargin = 0; - layout.topMargin = 0; - container.setLayout(layout); - - FormText text = widgetFactory.createFormText(container, true); - text.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB)); - text.setText(labelText, false, false); - - return text; - } - - /** - * {@inheritDoc} - */ - public Text createMultiLineText(Composite parent) { - return createText(parent, SWT.MULTI | SWT.V_SCROLL); - } - - /** - * {@inheritDoc} - */ - public Text createPasswordText(Composite parent) { - return createText(parent, SWT.PASSWORD); - } - - /** - * {@inheritDoc} - */ - public Button createPushButton(Composite parent, String text) { - return createButton(parent, text, SWT.PUSH); - } - - /** - * {@inheritDoc} - */ - public Button createRadioButton(Composite parent, String text) { - return createButton(parent, text, SWT.RADIO); - } - - /** - * {@inheritDoc} - */ - public Section createSection(Composite parent, int style) { - return widgetFactory.createSection(parent, SWT.FLAT | style); - } - - /** - * {@inheritDoc} - */ - public Spinner createSpinner(Composite parent) { - parent = createBorderContainer(parent); - - Spinner spinner = new Spinner(parent, SWT.FLAT); - spinner.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); - widgetFactory.adapt(spinner, true, false); - - return spinner; - } - - /** - * {@inheritDoc} - */ - public Table createTable(Composite parent, int style) { - Table table = this.widgetFactory.createTable(parent, SWT.BORDER | style); - table.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER); - return table; - } - - /** - * {@inheritDoc} - */ - public Text createText(Composite parent) { - return createText(parent, SWT.NONE); - } - - protected Text createText(Composite parent, int style) { - return widgetFactory.createText(parent, null, SWT.BORDER | SWT.FLAT | style); - } - - /** - * {@inheritDoc} - */ - public Button createTriStateCheckBox(Composite parent, String text) { - TriStateCheckBox checkBox = new TriStateCheckBox(parent, text, this); - return checkBox.getCheckBox(); - } - - /** - * Returns the actual factory responsible for creating the new widgets. - * - * @return The factory creating the widgets with the form style (flat-style) - */ - public FormToolkit getWidgetFactory() { - return widgetFactory; - } -}
\ No newline at end of file diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/IntegerCombo.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/IntegerCombo.java deleted file mode 100644 index 2f34008a21..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/IntegerCombo.java +++ /dev/null @@ -1,188 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009, 2010 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.jface.fieldassist.FieldDecorationRegistry; -import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages; -import org.eclipse.jpt.common.ui.internal.util.SWTUtil; -import org.eclipse.jpt.utility.internal.model.value.PropertyListValueModelAdapter; -import org.eclipse.jpt.utility.internal.model.value.TransformationPropertyValueModel; -import org.eclipse.jpt.utility.internal.model.value.TransformationWritablePropertyValueModel; -import org.eclipse.jpt.utility.model.Model; -import org.eclipse.jpt.utility.model.value.ListValueModel; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.events.VerifyEvent; -import org.eclipse.swt.events.VerifyListener; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; - -/** - * This is a replacement for a Spinner. It is a combo that only accepts integers. - * It also includes a Default option in the combo. - */ -public abstract class IntegerCombo<T extends Model> - extends Pane<T> -{ - - /** - * The main (only) widget of this pane. - */ - private Combo comboBox; - - - private PropertyValueModel<String> defaultValueHolder; - - // ********** constructors ********** - - protected IntegerCombo( - Pane<? extends T> parentPane, - Composite parent - ) { - super(parentPane, parent); - } - - protected IntegerCombo( - Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent - ) { - super(parentPane, subjectHolder, parent); - } - - public Combo getCombo() { - return this.comboBox; - } - - // ********** initialization ********** - - @Override - protected void initializeLayout(Composite container) { - this.defaultValueHolder = buildDefaultStringHolder(); - this.comboBox = this.addIntegerCombo(container); - - int margin = FieldDecorationRegistry.getDefault().getMaximumDecorationWidth(); - GridData gridData = new GridData(); - gridData.horizontalAlignment = GridData.FILL_HORIZONTAL; - gridData.horizontalIndent = margin; - gridData.grabExcessHorizontalSpace = false; - this.comboBox.setLayoutData(gridData); - - this.comboBox.addVerifyListener(this.buildVerifyListener()); - SWTUtil.attachDefaultValueHandler(this.comboBox); - } - - protected Combo addIntegerCombo(Composite container) { - return this.addLabeledEditableCombo( - container, - getLabelText(), - buildDefaultListHolder(), - buildSelectedItemStringHolder(), - getHelpId() - ); - - } - - protected VerifyListener buildVerifyListener() { - return new VerifyListener() { - public void verifyText(VerifyEvent e) { - IntegerCombo.this.verifyComboBox(e); - } - }; - } - - protected ListValueModel<String> buildDefaultListHolder() { - return new PropertyListValueModelAdapter<String>(this.defaultValueHolder); - } - - private PropertyValueModel<String> buildDefaultStringHolder() { - return new TransformationPropertyValueModel<Integer, String>(buildDefaultHolder()) { - @Override - protected String transform(Integer value) { - if (value == null) { - return JptCommonUiMessages.NoneSelected; - } - return super.transform(value); - } - @Override - protected String transform_(Integer value) { - return getDefaultValueString(value); - } - }; - } - - private String getDefaultValueString(Integer defaultValue) { - return NLS.bind( - JptCommonUiMessages.DefaultWithOneParam, - defaultValue - ); - } - - private String getDefaultValueString() { - return this.defaultValueHolder.getValue(); - } - - protected WritablePropertyValueModel<String> buildSelectedItemStringHolder() { - return new TransformationWritablePropertyValueModel<Integer, String>(buildSelectedItemHolder()) { - @Override - protected String transform(Integer value) { - return value == null ? - getDefaultValueString() - : - value.toString(); - } - - @Override - protected Integer reverseTransform_(String value) { - int intLength; - try { - intLength = Integer.parseInt(value); - } - catch (NumberFormatException e) { - //if the default is selected from the combo, set length to null - return null; - } - return Integer.valueOf(intLength); - } - }; - } - - // ********** abstract methods ********** - - protected abstract String getLabelText(); - - protected abstract String getHelpId(); - - protected abstract PropertyValueModel<Integer> buildDefaultHolder(); - - protected abstract WritablePropertyValueModel<Integer> buildSelectedItemHolder(); - - // ********** combo-box verify listener callback ********** - - protected void verifyComboBox(VerifyEvent e) { - if (e.character == '\b') { - //ignore backspace - return; - } - if (e.text.equals("") //DefaultValueHandler sets the text to "" //$NON-NLS-1$ - || e.text.equals(this.defaultValueHolder.getValue())) { - return; - } - try { - Integer.parseInt(e.text); - } - catch (NumberFormatException exception) { - e.doit = false; - } - } - -} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/NewNameDialog.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/NewNameDialog.java deleted file mode 100644 index ea51d6209b..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/NewNameDialog.java +++ /dev/null @@ -1,166 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import java.util.Collection; -import org.eclipse.jpt.utility.internal.model.value.PropertyAspectAdapter; -import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; - -/** - * The dialog used to requests a name from the user. - * - * @version 2.0 - * @since 2.0 - */ -public class NewNameDialog extends ValidatingDialog<NewNameStateObject> -{ - private String description; - private Image descriptionImage; - private String descriptionTitle; - private String labelText; - private String name; - private Collection<String> names; - - /** - * Creates a new <code>NewNameDialog</code>. - * - * @param parentShell - * @param dialogTitle - * @param descriptionTitle - * @param descriptionImage - * @param description - * @param labelText - * @param name - * @param names - */ - NewNameDialog(Shell parentShell, - String dialogTitle, - String descriptionTitle, - Image descriptionImage, - String description, - String labelText, - String name, - Collection<String> names) - { - super(parentShell, dialogTitle); - - this.name = name; - this.names = names; - this.labelText = labelText; - this.description = description; - this.descriptionImage = descriptionImage; - this.descriptionTitle = descriptionTitle; - } - - /* - * (non-Javadoc) - */ - @Override - protected DialogPane<NewNameStateObject> buildLayout(Composite container) { - return new NewNameDialogPane(container); - } - - /* - * (non-Javadoc) - */ - @Override - protected NewNameStateObject buildStateObject() { - return new NewNameStateObject(name, names); - } - - /* - * (non-Javadoc) - */ - @Override - public void create() { - super.create(); - - NewNameDialogPane pane = (NewNameDialogPane) getPane(); - pane.selectAll(); - - getButton(OK).setEnabled(false); - } - - /* - * (non-Javadoc) - */ - @Override - protected String getDescription() { - return description; - } - - /* - * (non-Javadoc) - */ - @Override - protected Image getDescriptionImage() { - return descriptionImage; - } - - /* (non-Javadoc) - */ - @Override - protected String getDescriptionTitle() { - return descriptionTitle; - } - - /** - * Returns the text field's input, which is the new name the user entered. - * - * @return The name the user entered - */ - public String getName() { - return getSubject().getName(); - } - - private class NewNameDialogPane extends DialogPane<NewNameStateObject> { - - private Text text; - - NewNameDialogPane(Composite parent) { - super(NewNameDialog.this.getSubjectHolder(), parent); - } - - private WritablePropertyValueModel<String> buildNameHolder() { - return new PropertyAspectAdapter<NewNameStateObject, String>(getSubjectHolder(), NewNameStateObject.NAME_PROPERTY) { - @Override - protected String buildValue_() { - return subject.getName(); - } - - @Override - protected void setValue_(String value) { - subject.setName(value); - } - }; - } - - /* - * (non-Javadoc) - */ - @Override - protected void initializeLayout(Composite container) { - - text = addLabeledText( - container, - labelText, - buildNameHolder() - ); - } - - void selectAll() { - text.selectAll(); - } - } -} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/NewNameDialogBuilder.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/NewNameDialogBuilder.java deleted file mode 100644 index 55b884133b..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/NewNameDialogBuilder.java +++ /dev/null @@ -1,179 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import org.eclipse.core.runtime.Assert; -import org.eclipse.jpt.utility.internal.CollectionTools; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Shell; - -/** - * This builder is responsible to create a fully initialized - * <code>NewNameDialog</code> once all the properties have been set. - * - * @see NewNameDialog - * - * @version 2.0 - * @since 2.0 - */ -@SuppressWarnings("nls") -public final class NewNameDialogBuilder { - - /** - * The message to show in the description area. - */ - private String description; - - /** - * The image of the description area. - */ - private Image descriptionImage; - - /** - * The title to show in the description area. - */ - private String descriptionTitle; - - /** - * The title of the new name dialog. - */ - private String dialogTitle; - - /** - * The text field's label. - */ - private String labelText; - - /** - * The initial input or <code>null</code> if no initial value can be - * specified. - */ - private String name; - - /** - * The collection of names that can't be used or an empty collection if none - * are available. - */ - private Collection<String> names; - - /** - * The parent shell of the new name dialog. - */ - private Shell parentShell; - - /** - * Creates a new <code>NewNameDialogBuilder</code>. - * - * @param parentShell The parent shell of the new name dialog - */ - public NewNameDialogBuilder(Shell parentShell) { - super(); - initialize(parentShell); - } - - /** - * Creates the dialog that will be used to request a new name from the user. - * - * @return The initialized dialog - */ - public NewNameDialog buildDialog() { - return new NewNameDialog( - parentShell, - dialogTitle, - descriptionTitle, - descriptionImage, - description, - labelText, - name, - names - ); - } - - /** - * Initializes this builder. - * - * @param parentShell The parent shell of the new name dialog - */ - protected void initialize(Shell parentShell) { - - Assert.isNotNull(parentShell, "The parent shell cannot be null"); - - this.parentShell = parentShell; - this.names = Collections.emptyList(); - } - - /** - * Sets the description to be shown in the description area under the title. - * - * @param description The message to show in the description area - */ - public void setDescription(String description) { - this.description = description; - } - - /** - * Sets the image to be shown to the right side of the description area. - * - * @param descriptionImage The image of the description area - */ - public void setDescriptionImage(Image descriptionImage) { - this.descriptionImage = descriptionImage; - } - - /** - * Sets the title to be shown in the description area. - * - * @param descriptionTitle The title to show in the description area - */ - public void setDescriptionTitle(String descriptionTitle) { - this.descriptionTitle = descriptionTitle; - } - - /** - * Sets the dialog's title. - * - * @param dialogTitle The title of the new name dialog - */ - public void setDialogTitle(String dialogTitle) { - this.dialogTitle = dialogTitle; - } - - /** - * Sets the existing names that will be used to validate the text field's - * input and prevent the user from using it. - * - * @param names The collection of names that can't be used - */ - public void setExistingNames(Iterator<String> names) { - this.names = CollectionTools.collection(names); - } - - /** - * Sets the text to label the text field. - * - * @param labelText The text field's label - */ - public void setLabelText(String labelText) { - this.labelText = labelText; - } - - /** - * Sets the initial name if one exists. It is valid to leave this - * <code>null</code> when the user has to enter something. - * - * @param name The initial input - */ - public void setName(String name) { - this.name = name; - } -} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/NewNameStateObject.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/NewNameStateObject.java deleted file mode 100644 index cd8fa6f7f4..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/NewNameStateObject.java +++ /dev/null @@ -1,146 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2009 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import java.util.Collection; -import java.util.List; -import org.eclipse.jface.dialogs.IMessageProvider; -import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages; -import org.eclipse.jpt.utility.internal.StringTools; -import org.eclipse.jpt.utility.internal.node.AbstractNode; -import org.eclipse.jpt.utility.internal.node.Node; -import org.eclipse.jpt.utility.internal.node.Problem; - -/** - * This is the state object used by the <code>NewNameDialog</code>, which stores - * the current name and validates it when it is modified. - * - * @see NewNameDialog - * - * @version 2.0 - * @since 2.0 - */ -@SuppressWarnings("nls") -final class NewNameStateObject extends AbstractNode -{ - /** - * The initial input or <code>null</code> if no initial value can be - * specified. - */ - private String name; - - /** - * The collection of names that can't be used or an empty collection if none - * are available. - */ - private Collection<String> names; - - /** - * The <code>Validator</code> used to validate this state object. - */ - private Validator validator; - - /** - * Notifies a change in the name property. - */ - static final String NAME_PROPERTY = "name"; - - /** - * Creates a new <code>NewNameStateObject</code>. - * - * @param name The initial input or <code>null</code> if no initial value can - * be specified - * @param names The collection of names that can't be used or an empty - * collection if none are available - */ - NewNameStateObject(String name, Collection<String> names) { - super(null); - - this.name = name; - this.names = names; - } - - /** - * Validates the name property. - * - * @param currentProblems The list to which <code>Problem</code>s can be - * added - */ - private void addNameProblems(List<Problem> currentProblems) { - - if (StringTools.stringIsEmpty(name)) { - currentProblems.add(buildProblem(JptCommonUiMessages.NewNameStateObject_nameMustBeSpecified, IMessageProvider.ERROR)); - } - else if (names.contains(name.trim())) { - currentProblems.add(buildProblem(JptCommonUiMessages.NewNameStateObject_nameAlreadyExists, IMessageProvider.ERROR)); - } - } - - /* - * (non-Javadoc) - */ - @Override - protected void addProblemsTo(List<Problem> currentProblems) - { - super.addProblemsTo(currentProblems); - addNameProblems(currentProblems); - } - - /* - * (non-Javadoc) - */ - @Override - protected void checkParent(Node parentNode) { - } - - /* - * (non-Javadoc) - */ - public String displayString() { - return null; - } - - /** - * Returns the current name stored in this state object. - * - * @return The current name or <code>null</code> - */ - String getName() { - return name; - } - - /** - * Sets the current name stored in this state object or <code>null</code> to - * clear it. - * - * @param name The new name or <code>null</code> - */ - public void setName(String name) { - String oldName = this.name; - this.name = name; - firePropertyChanged(NAME_PROPERTY, oldName, name); - } - - /* - * (non-Javadoc) - */ - @Override - public void setValidator(Validator validator) { - this.validator = validator; - } - - /* - * (non-Javadoc) - */ - @Override - public Validator getValidator() { - return validator; - } -} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/NullPostExecution.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/NullPostExecution.java deleted file mode 100644 index 21e7420523..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/NullPostExecution.java +++ /dev/null @@ -1,56 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.jface.dialogs.Dialog; - -/** - * A <code>null</code> instance of <code>PostExecution</code>. - * - * @version 2.0 - * @since 1.0 - */ -public final class NullPostExecution implements PostExecution<Dialog> { - - /** - * The singleton instance of this <code>NullPostExecution</code>. - */ - private static PostExecution<Dialog> INSTANCE; - - /** - * Creates a new <code>NullPostExecution</code>. - */ - private NullPostExecution() { - super(); - } - - /** - * Returns the singleton instance of this <code>NullPostExecution</code>. - * - * @param <T> The dialog where this <code>PostExecution</code> will be used - * @return The singleton instance with the proper type - */ - @SuppressWarnings("unchecked") - public static synchronized <T extends Dialog> PostExecution<T> instance() { - - if (INSTANCE == null) { - INSTANCE = new NullPostExecution(); - } - - return (PostExecution<T>) INSTANCE; - } - - /* - * (non-Javadoc) - */ - public void execute(Dialog dialog) { - // Nothing to do - } -} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/PackageChooserPane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/PackageChooserPane.java deleted file mode 100644 index f88dfba108..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/PackageChooserPane.java +++ /dev/null @@ -1,237 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2011 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.jdt.core.IJavaProject; -import org.eclipse.jdt.core.IPackageFragment; -import org.eclipse.jdt.core.IPackageFragmentRoot; -import org.eclipse.jdt.core.JavaModelException; -import org.eclipse.jdt.internal.ui.refactoring.contentassist.ControlContentAssistHelper; -import org.eclipse.jdt.internal.ui.refactoring.contentassist.JavaPackageCompletionProcessor; -import org.eclipse.jdt.ui.JavaElementLabelProvider; -import org.eclipse.jdt.ui.JavaUI; -import org.eclipse.jface.fieldassist.FieldDecorationRegistry; -import org.eclipse.jface.window.Window; -import org.eclipse.jpt.common.core.internal.utility.jdt.JDTTools; -import org.eclipse.jpt.common.ui.JptCommonUiPlugin; -import org.eclipse.jpt.common.ui.internal.JptCommonUiMessages; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; -import org.eclipse.jpt.utility.model.Model; -import org.eclipse.jpt.utility.model.event.PropertyChangeEvent; -import org.eclipse.jpt.utility.model.listener.PropertyChangeListener; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.dialogs.SelectionDialog; - -/** - * This chooser allows the user to choose a package when browsing and it adds - * code completion support to the text field, which is the main component. - * <p> - * Here the layout of this pane: - * <pre> - * ----------------------------------------------------------------------------- - * | !---------------------------------------------------- ------------- | - * | Label: | I | | Browse... | | - * | ---------------------------------------------------- ------------- | - * -----------------------------------------------------------------------------</pre> - * - * @version 2.0 - * @since 2.0 - */ -public abstract class PackageChooserPane<T extends Model> extends ChooserPane<T> -{ - /** - * The code completion manager. - */ - private JavaPackageCompletionProcessor javaPackageCompletionProcessor; - - private PropertyChangeListener subjectChangeListener; - - /** - * Creates a new <code>PackageChooserPane</code>. - * - * @param parentPane The parent pane of this one - * @param parent The parent container - */ - public PackageChooserPane(Pane<? extends T> parentPane, - Composite parent) { - - super(parentPane, parent); - } - - /** - * Creates a new <code>PackageChooserPane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of this pane's subject - * @param parent The parent container - */ - public PackageChooserPane(Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent) { - - super(parentPane, subjectHolder, parent); - } - - @Override - protected void initialize() { - super.initialize(); - - // TODO bug 156185 - when this is fixed there should be api for this - this.javaPackageCompletionProcessor = new JavaPackageCompletionProcessor( - new JavaElementLabelProvider(JavaElementLabelProvider.SHOW_ROOT) - ); - this.subjectChangeListener = this.buildSubjectChangeListener(); - this.getSubjectHolder().addPropertyChangeListener(PropertyValueModel.VALUE, this.subjectChangeListener); - this.packageChooserSubjectChanged(getSubject()); - } - - private PropertyChangeListener buildSubjectChangeListener() { - return new SWTPropertyChangeListenerWrapper(this.buildSubjectChangeListener_()); - } - - private PropertyChangeListener buildSubjectChangeListener_() { - return new PropertyChangeListener() { - @SuppressWarnings("unchecked") - public void propertyChanged(PropertyChangeEvent e) { - PackageChooserPane.this.packageChooserSubjectChanged((T) e.getNewValue()); - } - }; - } - - protected void packageChooserSubjectChanged(T newSubject) { - IPackageFragmentRoot root = null; - if (newSubject != null) { - root = getPackageFragmentRoot(); - } - this.javaPackageCompletionProcessor.setPackageFragmentRoot(root); - } - - @Override - protected final Runnable buildBrowseAction() { - return new Runnable() { - public void run() { - promptPackage(); - } - }; - } - - @Override - protected Control addMainControl(Composite container) { - Composite subPane = addSubPane(container); - - Text text = addText(subPane, buildTextHolder()); - - Image image = FieldDecorationRegistry.getDefault().getFieldDecoration(FieldDecorationRegistry.DEC_CONTENT_PROPOSAL).getImage(); - GridData data = new GridData(GridData.FILL_HORIZONTAL); - data.horizontalIndent = image.getBounds().width; - text.setLayoutData(data); - - ControlContentAssistHelper.createTextContentAssistant( - text, - javaPackageCompletionProcessor - ); - - return subPane; - } - - /** - * Creates the value holder of the subject's property. - * - * @return The holder of the package name - */ - protected abstract WritablePropertyValueModel<String> buildTextHolder(); - - /** - * Prompts the user the Open Package dialog. - * - * @return Either the selected package or <code>null</code> if the user - * cancelled the dialog - */ - protected IPackageFragment choosePackage() { - - SelectionDialog selectionDialog; - - try { - selectionDialog = JavaUI.createPackageDialog( - getShell(), - getPackageFragmentRoot() - ); - } - catch (JavaModelException e) { - JptCommonUiPlugin.log(e); - return null; - } - - selectionDialog.setTitle(JptCommonUiMessages.PackageChooserPane_dialogTitle); - selectionDialog.setMessage(JptCommonUiMessages.PackageChooserPane_dialogMessage); - - IPackageFragment pack = getPackageFragment(); - - if (pack != null) { - selectionDialog.setInitialSelections(new Object[] { pack }); - } - - if (selectionDialog.open() == Window.OK) { - return (IPackageFragment) selectionDialog.getResult()[0]; - } - - return null; - } - - protected abstract IJavaProject getJavaProject(); - - /** - * Returns the package name from its subject. - * - * @return The package name or <code>null</code> if none is defined - */ - protected abstract String getPackageName(); - - /** - * The browse button was clicked, its action invokes this action which should - * prompt the user to select a package and set it. - */ - protected void promptPackage() { - IPackageFragment packageFragment = choosePackage(); - - if (packageFragment != null) { - String packageName = packageFragment.getElementName(); - this.setPackageName(packageName); - } - } - - protected abstract void setPackageName(String packageName); - - private IPackageFragment getPackageFragment() { - String packageName = getPackageName(); - - if (packageName == null) { - return null; - } - - return getPackageFragmentRoot().getPackageFragment(packageName); - } - - protected IPackageFragmentRoot getPackageFragmentRoot() { - return JDTTools.getCodeCompletionContextRoot(getJavaProject()); - } - - @Override - public void dispose() { - this.getSubjectHolder().removePropertyChangeListener(PropertyValueModel.VALUE, this.subjectChangeListener); - super.dispose(); - } -} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/Pane.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/Pane.java deleted file mode 100644 index 1bfd10fa30..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/Pane.java +++ /dev/null @@ -1,3722 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2010 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import java.util.ArrayList; -import java.util.Collection; -import org.eclipse.core.runtime.Assert; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.fieldassist.FieldDecorationRegistry; -import org.eclipse.jface.viewers.ComboViewer; -import org.eclipse.jface.viewers.IBaseLabelProvider; -import org.eclipse.jface.viewers.ILabelProvider; -import org.eclipse.jpt.common.ui.WidgetFactory; -import org.eclipse.jpt.common.ui.internal.Tracing; -import org.eclipse.jpt.common.ui.internal.listeners.SWTPropertyChangeListenerWrapper; -import org.eclipse.jpt.common.ui.internal.swt.ComboModelAdapter; -import org.eclipse.jpt.common.ui.internal.swt.DateTimeModelAdapter; -import org.eclipse.jpt.common.ui.internal.swt.SpinnerModelAdapter; -import org.eclipse.jpt.common.ui.internal.swt.TriStateCheckBoxModelAdapter; -import org.eclipse.jpt.common.ui.internal.util.ControlAligner; -import org.eclipse.jpt.common.ui.internal.util.LabeledButton; -import org.eclipse.jpt.common.ui.internal.util.LabeledControlUpdater; -import org.eclipse.jpt.common.ui.internal.util.SWTUtil; -import org.eclipse.jpt.common.ui.internal.utility.swt.SWTTools; -import org.eclipse.jpt.utility.internal.NonNullBooleanTransformer; -import org.eclipse.jpt.utility.internal.StringConverter; -import org.eclipse.jpt.utility.internal.model.value.CompositeBooleanPropertyValueModel; -import org.eclipse.jpt.utility.internal.model.value.SimplePropertyValueModel; -import org.eclipse.jpt.utility.internal.model.value.TransformationPropertyValueModel; -import org.eclipse.jpt.utility.model.Model; -import org.eclipse.jpt.utility.model.event.PropertyChangeEvent; -import org.eclipse.jpt.utility.model.listener.PropertyChangeListener; -import org.eclipse.jpt.utility.model.value.ListValueModel; -import org.eclipse.jpt.utility.model.value.PropertyValueModel; -import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ModifyListener; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.DateTime; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Layout; -import org.eclipse.swt.widgets.List; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Spinner; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.forms.widgets.ExpandableComposite; -import org.eclipse.ui.forms.widgets.FormText; -import org.eclipse.ui.forms.widgets.Hyperlink; -import org.eclipse.ui.forms.widgets.Section; -import org.eclipse.ui.help.IWorkbenchHelpSystem; -import org.eclipse.ui.part.PageBook; - -/** - * The abstract definition of a pane which holds onto a <code>PropertyValueModel</code> - * that contains the subject of this pane. - * <p> - * It also contains convenience methods for building buttons, labels, check - * boxes, and radio buttons, etc. - * <p> - * It is possible to easily listen to any property changes coming from the - * subject, {@link #addPropertyNames(Collection)} is specify which properties - * are of interest and {@link #propertyChanged(String)} is used to notify the - * pane when the property has changed. - * - * @see FormPane - * @see DialogPane - * - * @version 2.0 - * @since 2.0 - */ -@SuppressWarnings("nls") -public abstract class Pane<T extends Model> -{ - /** - * The listener registered with the subject in order to be notified when a - * property has changed, the property names are determined by - * {@link #propertyNames()}. - */ - private PropertyChangeListener aspectChangeListener; - - /** - * The container of this composite. - */ - private final Composite container; - - /** - * The aligner responsible to align the left controls. - */ - private ControlAligner leftControlAligner; - - /** - * Flag used to stop the circular population of widgets. - */ - private boolean populating; - - /** - * The aligner responsible to align the left controls. - */ - private ControlAligner rightControlAligner; - - /** - * This listener is registered with the subject holder in order to - * automatically repopulate this pane with the new subject. - */ - private PropertyChangeListener subjectChangeListener; - - /** - * The subject of this pane. - */ - private PropertyValueModel<T> subjectHolder; - - /** - * The collection of registered sub-panes will be automatically notified - * when listeners need to be engaged or disengaged or when to populate its - * widgets. - */ - private Collection<Pane<?>> subPanes; - - /** - * The factory used to create various common widgets. - */ - private WidgetFactory widgetFactory; - - /** - * The collection of <code>Control</code>s that are displayed in this pane, - * which will have their enablement state updated when - * {@link #enableWidgets(boolean)} is called. - */ - private ArrayList<Control> managedWidgets; - - /** - * The collection of <code>Pane</code>s that are displayed in this pane, - * which will have their enablement state updated when - * {@link #enableWidgets(boolean)} is called. - */ - private ArrayList<Pane<?>> managedSubPanes; - - /** - * This enabled model is used to store the pane's base enablement state. - * If API is called to set the pane enabled, this model gets updated. If the pane is thereby - * fully enabled (controller enabled model is also in agreement) the pane's widgets are set - * enabled. - * @see #getCombinedEnabledModel() - */ - private final WritablePropertyValueModel<Boolean> baseEnabledModel - = new SimplePropertyValueModel<Boolean>(Boolean.TRUE); - - /** - * This enabled model is used to define the pane's enablement as controlled by other widgets, - * tests, etc. (for example a radio button) - * If this model is changed, and the pane is thereby fully enabled (base enabled model is also - * in agreement) the pane's widgets are set enabled. - * @see #getCombinedEnabledModel() - */ - private PropertyValueModel<Boolean> controllerEnabledModel; - - /** - * The "and" combination of {@link #baseEnabledModel} and {@link #controllerEnabledModel} - */ - private PropertyValueModel<Boolean> combinedEnabledModel; - - private PropertyChangeListener combinedEnabledModelListener; - - /** - * Creates a new <code>Pane</code>. - * - * @param parentPane The parent pane of this one - * @param parent The parent container - * - * @category Constructor - */ - protected Pane( - Pane<? extends T> parentPane, - Composite parent) { - - this(parentPane, parent, true); - } - - /** - * Creates a new <code>Pane</code>. - * - * @param parentPane The parent container of this one - * @param parent The parent container - * @param widgetFactory The factory used to create various widgets - * @param automaticallyAlignWidgets <code>true</code> to make the widgets - * this pane aligned with the widgets of the given parent pane; - * <code>false</code> to not align them - * - * @category Constructor - */ - protected Pane( - Pane<? extends T> parentPane, - Composite parent, - boolean automaticallyAlignWidgets) { - - this( - parentPane, - parentPane.getSubjectHolder(), - parent, - automaticallyAlignWidgets); - } - - /** - * Creates a new <code>Pane</code>. - * - * @param parentPane The parent container of this one - * @param parent The parent container - * @param widgetFactory The factory used to create various widgets - * @param automaticallyAlignWidgets <code>true</code> to make the widgets - * this pane aligned with the widgets of the given parent pane; - * <code>false</code> to not align them - * - * @category Constructor - */ - protected Pane( - Pane<? extends T> parentPane, - Composite parent, - boolean automaticallyAlignWidgets, - boolean parentManagePane) { - - this( - parentPane, - parentPane.getSubjectHolder(), - parent, - automaticallyAlignWidgets, - parentManagePane); - } - - /** - * Creates a new <code>Pane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of this pane's subject - * @param parent The parent container - * - * @category Constructor - */ - protected Pane( - Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent) { - - this(parentPane, subjectHolder, parent, true); - } - - protected Pane( - Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent, - PropertyValueModel<Boolean> enabledModel) { - - this(parentPane, subjectHolder, parent, true, enabledModel); - } - - /** - * Creates a new <code>Pane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of this pane's subject - * @param parent The parent container - * @param widgetFactory The factory used to create various widgets - * @param automaticallyAlignWidgets <code>true</code> to make the widgets - * this pane aligned with the widgets of the given parent pane; - * <code>false</code> to not align them - * - * @category Constructor - */ - protected Pane( - Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent, - boolean automaticallyAlignWidgets) { - - this(parentPane, subjectHolder, parent, automaticallyAlignWidgets, true); - } - - protected Pane( - Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent, - boolean automaticallyAlignWidgets, - PropertyValueModel<Boolean> enabledModel) { - - this(parentPane, subjectHolder, parent, automaticallyAlignWidgets, true, enabledModel); - } - - /** - * Creates a new <code>Pane</code>. - * - * @param parentPane The parent container of this one - * @param subjectHolder The holder of this pane's subject - * @param parent The parent container - * @param widgetFactory The factory used to create various widgets - * @param automaticallyAlignWidgets <code>true</code> to make the widgets - * this pane aligned with the widgets of the given parent pane; - * <code>false</code> to not align them - * @param parentManagePane <code>true</code> to have the parent pane manage - * the enabled state of this pane - * - * @category Constructor - */ - protected Pane( - Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent, - boolean automaticallyAlignWidgets, - boolean parentManagePane) { - - this(subjectHolder, parent, parentPane.getWidgetFactory()); - this.initialize(parentPane, automaticallyAlignWidgets, parentManagePane); - } - - protected Pane( - Pane<?> parentPane, - PropertyValueModel<? extends T> subjectHolder, - Composite parent, - boolean automaticallyAlignWidgets, - boolean parentManagePane, - PropertyValueModel<Boolean> enabledModel) { - - this(subjectHolder, parent, parentPane.getWidgetFactory()); - this.initialize(parentPane, automaticallyAlignWidgets, parentManagePane); - this.initializeEnabledModel(enabledModel); - } - - /** - * Creates a new <code>Pane</code>. - * - * @param subjectHolder The holder of this pane's subject - * @param parent The parent container - * @param widgetFactory The factory used to create various common widgets - * - * @category Constructor - */ - protected Pane( - PropertyValueModel<? extends T> subjectHolder, - Composite parent, - WidgetFactory widgetFactory) { - - super(); - this.initialize(subjectHolder, widgetFactory); - this.container = this.addContainer(parent); - this.initializeLayout(this.container); - this.engageSubjectHolder(); - this.engageListeners(getSubject()); - this.populate(); - } - - - // ********** initialization ********** - - @SuppressWarnings("unchecked") - private void initialize( - PropertyValueModel<? extends T> subjectHolder, - WidgetFactory widgetFactory) { - - Assert.isNotNull(subjectHolder, "The subject holder cannot be null"); - - this.subjectHolder = (PropertyValueModel<T>) subjectHolder; - this.widgetFactory = widgetFactory; - this.subPanes = new ArrayList<Pane<?>>(); - this.managedWidgets = new ArrayList<Control>(); - this.managedSubPanes = new ArrayList<Pane<?>>(); - this.leftControlAligner = new ControlAligner(); - this.rightControlAligner = new ControlAligner(); - this.subjectChangeListener = this.buildSubjectChangeListener(); - this.aspectChangeListener = this.buildAspectChangeListener(); - - this.initialize(); - } - - protected void initialize() { - // do nothing by default - } - - /** - * Registers this pane with the parent pane. - * - * @param parentPane The parent pane - * @param automaticallyAlignWidgets <code>true</code> to make the widgets - * this pane aligned with the widgets of the given parent pane; - * <code>false</code> to not align them - * @param parentManagePane <code>true</code> to have the parent pane manage - * the enabled state of this pane - * - * @category Initialization - */ - private void initialize( - Pane<?> parentPane, - boolean automaticallyAlignWidgets, - boolean parentManagePane) { - - // Register this pane with the parent pane, it will call the methods - // automatically (engageListeners(), disengageListeners(), populate(), - // dispose(), etc) - parentPane.registerSubPane(this); - - if (parentManagePane) { - parentPane.manageSubPane(this); - } - - // Align the left and right controls with the controls from the parent - // pane - if (automaticallyAlignWidgets) { - parentPane.addAlignLeft(this); - parentPane.addAlignRight(this); - } - } - - private void initializeEnabledModel(PropertyValueModel<Boolean> enabledModel) { - this.controllerEnabledModel = enabledModel; - this.combinedEnabledModel = - CompositeBooleanPropertyValueModel.and(this.baseEnabledModel, this.controllerEnabledModel); - this.combinedEnabledModelListener = buildCombinedEnabledModelListener(); - this.combinedEnabledModel.addPropertyChangeListener( - PropertyValueModel.VALUE, this.combinedEnabledModelListener); - enableWidgets_(getCombinedEnablement()); - } - - private PropertyChangeListener buildCombinedEnabledModelListener() { - return new SWTPropertyChangeListenerWrapper(buildControllerEnabledModelListener_()); - } - - private PropertyChangeListener buildControllerEnabledModelListener_() { - return new PropertyChangeListener() { - @SuppressWarnings("unchecked") - public void propertyChanged(PropertyChangeEvent e) { - Pane.this.controllerEnablementChanged(); - } - }; - } - - /** - * Initializes the layout of this pane. - * - * @param container The parent container - * - * @category Layout - */ - protected abstract void initializeLayout(Composite container); - - private void manageWidget(Control control) { - if (this.managedWidgets.contains(control)) { - throw new IllegalStateException(); - } - this.managedWidgets.add(control); - } - - private void manageSubPane(Pane<?> subPane) { - if (this.managedSubPanes.contains(subPane)) { - throw new IllegalStateException(); - } - this.managedSubPanes.add(subPane); - } - - /** - * Adds the given pane's widgets (those that were registered with its - * left <code>ControlAligner</code>) to this pane's left - * <code>ControlAligner</code> so that their width can be adjusted to have - * the width of the widest widget. - * - * @param pane The pane containing the widgets to add - * - * @category Layout - */ - protected final void addAlignLeft(Pane<?> container) { - this.leftControlAligner.add(container.leftControlAligner); - } - - /** - * Adds the given control to the collection of widgets that have their width - * adjust with the width of the widest widget. The left alignment is usually - * used for labels. - * - * @param pane The pane to add - * - * @category Layout - */ - protected final void addAlignLeft(Control control) { - this.leftControlAligner.add(control); - } - - /** - * Adds the given pane's widgets (those that were registered with its - * right <code>ControlAligner</code>) to this pane's right - * <code>ControlAligner</code> so that their width can be adjusted to have - * the width of the widest widget. - * - * @param pane The pane containing the widgets to add - * - * @category Layout - */ - protected final void addAlignRight(Pane<?> container) { - this.rightControlAligner.add(container.rightControlAligner); - } - - /** - * Adds the given control to the collection of widgets that have their width - * adjust with the width of the widest widget. The left alignment is usually - * used for buttons. - * - * @param pane The pane to add - * - * @category Layout - */ - protected final void addAlignRight(Control control) { - this.rightControlAligner.add(control); - } - - /** - * Adds the given pane's controls (those that were registered for - * alignment) from this pane. - * - * @param pane The pane containing the widgets to add for - * alignment - * - * @category Layout - */ - protected final void addPaneForAlignment(Pane<?> container) { - addAlignLeft(container); - addAlignRight(container); - } - - /** - * Adds any property names to the given collection in order to be notified - * when the actual property changes in the subject. - * - * @param propertyNames The collection of property names to register with the - * subject - */ - protected void addPropertyNames(Collection<String> propertyNames) { - } - - private PropertyChangeListener buildAspectChangeListener() { - return new SWTPropertyChangeListenerWrapper(buildAspectChangeListener_()); - } - - private PropertyChangeListener buildAspectChangeListener_() { - return new PropertyChangeListener() { - public void propertyChanged(PropertyChangeEvent e) { - //subject() could have changed or is null because of the possibility of - //"jumping" on the UI thread here and a selection change occuring - if (e.getSource() == getSubject()) { - updatePane(e.getPropertyName()); - } - } - }; - } - - /** - * Creates a new button using the given information. - * - * @param parent The parent container - * @param buttonText The button's text - * @param buttonAction The action to be invoked when the button is pressed - * @return The newly created <code>Button</code> - * - * @category Layout - */ - protected final Button addButton(Composite container, - String text, - final Runnable buttonAction) { - - return this.addButton(container, text, null, buttonAction); - } - - /** - * Creates a new unmanaged <code>Button</code> widget. Unmanaged means - * that this Pane will not handle the enabling/disabling of this widget. - * The owning object will handle it with its own PaneEnabler or ControlEnabler. - * - * @param parent The parent container - * @param buttonText The button's text - * @param buttonAction The action to be invoked when the button is pressed - * @return The newly created <code>Button</code> - * - * @category Layout - */ - protected final Button addUnmanagedButton(Composite container, - String text, - final Runnable buttonAction) { - - return this.addUnmanagedButton(container, text, null, buttonAction); - } - - /** - * Creates a new button using the given information. - * - * @param parent The parent container - * @param buttonText The button's text - * @param helpId The topic help ID to be registered for the new check box - * @param buttonAction The action to be invoked when the button is pressed - * @return The newly created <code>Button</code> - * - * @category Layout - */ - protected final Button addButton(Composite container, - String text, - String helpId, - final Runnable buttonAction) { - - Button button = addUnmanagedButton(container, text, helpId, buttonAction); - this.manageWidget(button); - - return button; - } - - /** - * Creates a new unmanaged <code>Button</code> widget. Unmanaged means - * that this Pane will not handle the enabling/disabling of this widget. - * The owning object will handle it with its own PaneEnabler or ControlEnabler. - * - * @param parent The parent container - * @param buttonText The button's text - * @param helpId The topic help ID to be registered for the new check box - * @param buttonAction The action to be invoked when the button is pressed - * @return The newly created <code>Button</code> - * - * @category Layout - */ - private Button addUnmanagedButton(Composite container, - String text, - String helpId, - final Runnable buttonAction) { - - Button button = this.widgetFactory.createButton(container, text); - button.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - SWTUtil.asyncExec(buttonAction); - } - }); - - if (helpId != null) { - getHelpSystem().setHelp(button, helpId); - } - - GridData gridData = new GridData(); - gridData.grabExcessHorizontalSpace = false; - gridData.horizontalAlignment = GridData.FILL; - button.setLayoutData(gridData); - - return button; - } - - /** - * This layout will leave space for decorations on widgets. - * Whether decorated or not, all of the widgets need the same indent - * so that they align properly. - */ - protected GridData getFieldGridData() { - int margin = FieldDecorationRegistry.getDefault() - .getMaximumDecorationWidth(); - GridData data = new GridData(); - data.horizontalAlignment = SWT.FILL; - data.widthHint = IDialogConstants.ENTRY_FIELD_WIDTH + margin; - data.horizontalIndent = margin; - data.grabExcessHorizontalSpace = true; - return data; - } - - /** - * Creates a new check box using the given information. - * - * @param parent The parent container - * @param buttonText The button's text - * @param booleanHolder The holder of the selection state - * @param helpId The topic help ID to be registered for the new check box - * @return The newly created <code>Button</code> - * - * @category Layout - */ - protected final Button addCheckBox( - Composite parent, - String buttonText, - WritablePropertyValueModel<Boolean> booleanHolder, - String helpId) { - - return this.addToggleButton( - parent, - buttonText, - booleanHolder, - helpId, - SWT.CHECK); - } - - protected final Button addCheckBox( - Composite parent, - String buttonText, - WritablePropertyValueModel<Boolean> booleanHolder, - String helpId, - PropertyValueModel<Boolean> enabledModel) { - - Button button = this.addUnmanagedToggleButton(parent, buttonText, booleanHolder, helpId, SWT.CHECK); - this.controlEnabledState(enabledModel, button); - return button; - } - - /** - * Creates a new <code>Section</code> that can be collapsed. A sub-pane is - * automatically added as its client and is the returned <code>Composite</code>. - * - * @param container The container of the new widget - * @param sectionText The text of the new section - * @return The <code>Section</code>'s sub-pane - * - * @category Layout - */ - protected final Composite addCollapsibleSection( - Composite container, - String sectionText) { - - return this.addCollapsibleSection( - container, - sectionText, - new SimplePropertyValueModel<Boolean>(Boolean.FALSE)); - } - - /** - * Creates a new <code>Section</code> that can be collapsed. A sub-pane is - * automatically added as its client and is the returned <code>Composite</code>. - * - * @param container The container of the new widget - * @param sectionText The text of the new section - * @param description The section's description or <code>null</code> if none - * @return The <code>Section</code>'s sub-pane - * - * @category Layout - */ - protected final Composite addCollapsibleSection(Composite container, - String sectionText, - String description) { - - return this.addCollapsibleSection( - container, - sectionText, - description, - new SimplePropertyValueModel<Boolean>(Boolean.FALSE) - ); - } - - /** - * Creates a new <code>Section</code>. A sub-pane is automatically added as - * its client and is the returned <code>Composite</code>. - * - * @param container The container of the new widget - * @param sectionText The text of the new section - * @param type The type of section to create - * @param expandedStateHolder The holder of the boolean that will dictate - * when to expand or collapse the section - * @return The <code>Section</code>'s sub-pane - * - * @category Layout - */ - private Composite addCollapsibleSection(Composite container, - String sectionText, - int type, - PropertyValueModel<Boolean> expandedStateHolder) { - - return addCollapsibleSection(container, sectionText, null, type, expandedStateHolder); - } - - /** - * Creates a new <code>Section</code>. A sub-pane is automatically added as - * its client and is the returned <code>Composite</code>. - * - * @param container The container of the new widget - * @param sectionText The text of the new section - * @param description The section's description or <code>null</code> if none - * was provided - * @param type The type of section to create - * @param expandedStateHolder The holder of the boolean that will dictate - * when to expand or collapse the section - * @return The <code>Section</code>'s sub-pane - * - * @category Layout - */ - private Composite addCollapsibleSection(Composite container, - String sectionText, - String description, - int type, - PropertyValueModel<Boolean> expandedStateHolder) { - - Composite subPane = this.addSection( - container, - sectionText, - description, - ExpandableComposite.TWISTIE | type - ); - - Section section = (Section) subPane.getParent(); - - expandedStateHolder.addPropertyChangeListener( - PropertyValueModel.VALUE, - buildExpandedStateChangeListener(section) - ); - - section.setExpanded( - expandedStateHolder.getValue() != null ? expandedStateHolder.getValue() : true - ); - - return subPane; - } - - /** - * Creates a new <code>Section</code>. A sub-pane is automatically added as - * its client and is the returned <code>Composite</code>. - * - * @param container The container of the new widget - * @param sectionText The text of the new section - * @param expandedStateHolder The holder of the boolean that will dictate - * when to expand or collapse the section - * @return The <code>Section</code>'s sub-pane - * - * @category Layout - */ - protected final Composite addCollapsibleSection(Composite container, - String sectionText, - PropertyValueModel<Boolean> expandedStateHolder) { - - return this.addCollapsibleSection( - container, - sectionText, - ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE, - expandedStateHolder - ); - } - - /** - * Creates a new <code>Section</code>. A sub-pane is automatically added as - * its client and is the returned <code>Composite</code>. - * - * @param container The container of the new widget - * @param sectionText The text of the new section - * @param description The section's description or <code>null</code> if none - * @param expandedStateHolder The holder of the boolean that will dictate - * when to expand or collapse the section - * @return The <code>Section</code>'s sub-pane - * - * @category Layout - */ - protected final Composite addCollapsibleSection(Composite container, - String sectionText, - String description, - PropertyValueModel<Boolean> expandedStateHolder) { - - return this.addCollapsibleSection( - container, - sectionText, - description, - ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE, - expandedStateHolder - ); - } - - /** - * Creates a new <code>Section</code>. A sub-pane is automatically added as - * its client which can be typed cast directly as a <code>Composite</code>. - * - * @param container The container of the new widget - * @param sectionText The text of the new section - * @param expandedStateHolder The holder of the boolean that will dictate - * when to expand or collapse the section - * @return The <code>Section</code>'s sub-pane - * - * @category Layout - */ - protected final Composite addCollapsibleSubSection(Composite container, - String sectionText, - PropertyValueModel<Boolean> expandedStateHolder) { - - return this.addCollapsibleSection( - container, - sectionText, - SWT.NULL, - expandedStateHolder - ); - } - - /** - * Creates a new non-editable <code>Combo</code>. - * - * @param container The parent container - * @return The newly created <code>Combo</code> - * - * @category Layout - */ - protected final Combo addCombo(Composite container) { - Combo combo = this.addUnmanagedCombo(container); - this.manageWidget(combo); - return combo; - } - - /** - * Creates a new non-editable <code>Combo</code>. - * - * @param container The parent container - * @return The newly created <code>Combo</code> - * - * @category Layout - */ - private Combo addUnmanagedCombo(Composite container) { - Combo combo = this.widgetFactory.createCombo(container); - combo.setLayoutData(getFieldGridData()); - return combo; - } - - /** - * Creates a new non-editable <code>Combo</code>. - * - * @param container The parent container - * @param listHolder The <code>ListValueHolder</code> - * @param selectedItemHolder The holder of the selected item - * @param stringConverter The converter responsible to transform each item - * into a string representation - * @return The newly created <code>Combo</code> - * - * @category Layout - */ - protected final <V> Combo addCombo(Composite container, - ListValueModel<V> listHolder, - WritablePropertyValueModel<V> selectedItemHolder, - StringConverter<V> stringConverter) { - - Combo combo = this.addCombo(container); - - ComboModelAdapter.adapt( - listHolder, - selectedItemHolder, - combo, - stringConverter - ); - - return combo; - } - - /** - * Creates a new non-editable <code>Combo</code>. - * - * @param container The parent container - * @param listHolder The <code>ListValueHolder</code> - * @param selectedItemHolder The holder of the selected item - * @param stringConverter The converter responsible to transform each item - * into a string representation - * @return The newly created <code>Combo</code> - * - * @category Layout - */ - private <V> Combo addUnmanagedCombo(Composite container, - ListValueModel<V> listHolder, - WritablePropertyValueModel<V> selectedItemHolder, - StringConverter<V> stringConverter) { - - Combo combo = this.addUnmanagedCombo(container); - - ComboModelAdapter.adapt( - listHolder, - selectedItemHolder, - combo, - stringConverter - ); - - return combo; - } - - protected final <V> Combo addCombo( - Composite container, - ListValueModel<V> listHolder, - WritablePropertyValueModel<V> selectedItemHolder, - StringConverter<V> stringConverter, - PropertyValueModel<Boolean> enabledModel) { - - Combo combo = this.addUnmanagedCombo(container, listHolder, selectedItemHolder, stringConverter); - this.controlEnabledState(enabledModel, combo); - return combo; - } - - /** - * Creates a new <code>ComboViewer</code> using a <code>Combo</code>. - * - * @param container The parent container - * @param labelProvider The provider responsible to convert the combo's items - * into human readable strings - * @return The newly created <code>ComboViewer</code> - * - * @category Layout - */ - protected final ComboViewer addComboViewer(Composite container, - IBaseLabelProvider labelProvider) { - - Combo combo = this.addCombo(container); - ComboViewer viewer = new ComboViewer(combo); - viewer.setLabelProvider(labelProvider); - return viewer; - } - - /** - * Creates the main container of this pane. The layout and layout data are - * automatically set. - * - * @param parent The parent container - * @return The newly created <code>Composite</code> that will holds all the - * widgets created by this pane through {@link #initializeLayout(Composite)} - * - * @category Layout - */ - protected Composite addContainer(Composite parent) { - return this.addSubPane(parent); - } - - protected final <V> Combo addEditableCombo( - Composite container, - ListValueModel<V> listHolder, - WritablePropertyValueModel<V> selectedItemHolder, - StringConverter<V> stringConverter, - PropertyValueModel<Boolean> enabledModel) { - - Combo combo = this.addUnmanagedEditableCombo(container, listHolder, selectedItemHolder, stringConverter); - this.controlEnabledState(enabledModel, combo); - return combo; - } - - protected final Combo addEditableCombo( - Composite container) { - - Combo combo = this.widgetFactory.createEditableCombo(container); - combo.setLayoutData(getFieldGridData()); - this.manageWidget(combo); - return combo; - } - - /** - * Creates a new editable <code>Combo</code>. - * - * @param container The parent container - * @param listHolder The <code>ListValueHolder</code> - * @param selectedItemHolder The holder of the selected item - * @param stringConverter The converter responsible to transform each item - * into a string representation - * @return The newly created <code>Combo</code> - * - * @category Layout - */ - protected final <V> Combo addEditableCombo(Composite container, - ListValueModel<V> listHolder, - WritablePropertyValueModel<V> selectedItemHolder, - StringConverter<V> stringConverter) { - - Combo combo = this.addEditableCombo(container); - - ComboModelAdapter.adapt( - listHolder, - selectedItemHolder, - combo, - stringConverter - ); - - return combo; - } - - /** - * Creates a new editable <code>ComboViewer</code> using a <code>Combo</code>. - * - * @param container The parent container - * @param labelProvider The provider responsible to convert the combo's items - * into human readable strings - * @return The newly created <code>ComboViewer</code> - * - * @category Layout - */ - protected final ComboViewer addEditableComboViewer(Composite container, - IBaseLabelProvider labelProvider) { - - Combo combo = this.addEditableCombo(container); - ComboViewer viewer = new ComboViewer(combo); - viewer.setLabelProvider(labelProvider); - return viewer; - } - - private PropertyChangeListener buildExpandedStateChangeListener(final Section section) { - return new SWTPropertyChangeListenerWrapper(buildExpandedStateChangeListener_(section)); - } - - private PropertyChangeListener buildExpandedStateChangeListener_(final Section section) { - return new PropertyChangeListener() { - public void propertyChanged(final PropertyChangeEvent e) { - Boolean value = (Boolean) e.getNewValue(); - if (value == null) { - value = Boolean.TRUE; - } - section.setExpanded(value); - } - }; - } - - /** - * Creates a new <code>Hyperlink</code> that will invoked the given - * <code>Runnable</code> when selected. The given action is always invoked - * from the UI thread. - * - * @param parent The parent container - * @param text The hyperlink's text - * @param hyperLinkAction The action to be invoked when the link was selected - * return The newly created <code>Hyperlink</code> - * - * @category Layout - */ - protected final Hyperlink addHyperlink(Composite parent, - String text, - final Runnable hyperLinkAction) { - - Hyperlink link = this.widgetFactory.createHyperlink(parent, text); - this.manageWidget(link); - - link.addMouseListener(new MouseAdapter() { - @Override - public void mouseUp(MouseEvent e) { - - Hyperlink hyperLink = (Hyperlink) e.widget; - - if (hyperLink.isEnabled()) { - SWTUtil.asyncExec(hyperLinkAction); - } - } - }); - - return link; - } - - /** - * Creates a new label using the given information. - * - * @param parent The parent container - * @param labelText The label's text - * - * @category Layout - */ - protected final Label addLabel(Composite container, - String labelText) { - - Label label = addUnmanagedLabel(container, labelText); - manageWidget(label); - return label; - } - - protected final Label addLabel( - Composite container, - String labelText, - PropertyValueModel<Boolean> enabledModel - ) { - Label label = this.addUnmanagedLabel(container, labelText); - this.controlEnabledState(enabledModel, label); - return label; - } - - /** - * Creates a new unmanaged <code>Label</code> widget. Unmanaged means - * that this Pane will not handle the enabling/disabling of this widget. - * The owning object will handle it with its own PaneEnabler or ControlEnabler. - * - * @param parent The parent container - * @param labelText The label's text - * - * @category Layout - */ - private Label addUnmanagedLabel(Composite container, - String labelText) { - - return this.widgetFactory.createLabel(container, labelText); - } - - /** - * Creates a new container that will have a non-editable combo labeled with - * the given text. - * - * @param container The parent container - * @param labelText The text of the label - * @param listHolder The <code>ListValueHolder</code> - * @param selectedItemHolder The holder of the selected item - * @param rightControl The control shown to the right of the main widget - * @param helpId The topic help ID to be registered for the given center - * compositer - * @return The container of the label and the given center control - * - * @category Layout - */ - protected final <V> Combo addLabeledCombo(Composite container, - String labelText, - ListValueModel<V> listHolder, - WritablePropertyValueModel<V> selectedItemHolder, - StringConverter<V> stringConverter, - Control rightControl, - String helpId) { - - Combo combo = this.addCombo( - container, - listHolder, - selectedItemHolder, - stringConverter - ); - - this.addLabeledComposite( - container, - labelText, - (combo.getParent() != container) ? combo.getParent() : combo, - rightControl, - helpId - ); - - return combo; - } - - /** - * Creates a new container that will have a non-editable combo labeled with - * the given text. - * - * @param container The parent container - * @param labelText The text of the label - * @param listHolder The <code>ListValueHolder</code> - * @param selectedItemHolder The holder of the selected item - * @param helpId The topic help ID to be registered for the given center - * compositer - * @return The container of the label and the given center control - * - * @category Layout - */ - protected final <V> Combo addLabeledCombo(Composite container, - String labelText, - ListValueModel<V> listHolder, - WritablePropertyValueModel<V> selectedItemHolder, - StringConverter<V> stringConverter, - String helpId) { - - return this.addLabeledCombo( - container, - labelText, - listHolder, - selectedItemHolder, - stringConverter, - null, - helpId - ); - } - - /** - * Creates a new container that will have the given center control labeled - * with the given label. - * - * @param container The parent container - * @param leftControl The widget shown to the left of the main widget - * @param centerControl The main widget - * @param rightControl The control shown to the right of the main widget - * @param helpId The topic help ID to be registered for the given center - * compositer - * @return The container of the label and the given center control - * - * @category Layout - */ - protected final Composite addLabeledComposite(Composite container, - Control leftControl, - Control centerControl, - Control rightControl, - String helpId) { - - // Container for the label and main composite - container = this.addSubPane(container, 3, 0, 0, 0, 0); - - // Left control - GridData gridData = new GridData(); - gridData.horizontalAlignment = GridData.BEGINNING; - gridData.grabExcessHorizontalSpace = false; - leftControl.setLayoutData(gridData); - - // Re-parent the left control to the new sub pane - leftControl.setParent(container); - this.addAlignLeft(leftControl); - - - // Re-parent the center control to the new sub pane - centerControl.setParent(container); - - // Register the help id for the center control - if (helpId != null) { - getHelpSystem().setHelp(centerControl, helpId); - } - - // Right control - if (rightControl == null) { - Composite spacer = this.addPane(container); - spacer.setLayout(this.buildSpacerLayout()); - rightControl = spacer; - } - else { - rightControl.setParent(container); - - // Register the help id for the right control - if (helpId != null) { - getHelpSystem().setHelp(rightControl, helpId); - } - } - - gridData = new GridData(); - gridData.horizontalAlignment = GridData.FILL_HORIZONTAL; - gridData.grabExcessHorizontalSpace = false; - - rightControl.setLayoutData(gridData); - this.addAlignRight(rightControl); - - return container; - } - - /** - * Creates a new container that will have the given center control labeled - * with the given label. - * - * @param container The parent container - * @param label The label used to describe the center control - * @param centerControl The main widget - * @param helpId The topic help ID to be registered for the given center - * control - * @return The container of the label and the given center control - * - * @category Layout - */ - protected final Composite addLabeledComposite(Composite container, - Control label, - Control centerControl, - String helpId) { - - return this.addLabeledComposite( - container, - label, - centerControl, - null, - helpId - ); - } - - /** - * Creates a new container that will have the given center composite labeled - * with the given label text. - * - * @param container The parent container - * @param labelText The text to label the main composite - * @param centerPane The main widget - * @param helpId The topic help ID to be registered for the given center - * compositer - * @return The container of the label and the given center control - * - * @category Layout - */ - protected final Composite addLabeledComposite(Composite container, - String labelText, - Pane<?> centerPane, - String helpId) { - - return this.addLabeledComposite( - container, - labelText, - centerPane.getControl(), - helpId - ); - } - - /** - * Creates a new container that will have the given center composite labeled - * with the given label text. - * - * @param container The parent container - * @param labelText The text to label the main composite - * @param centerControl The main widget - * @return The container of the label and the given center control - * - * @category Layout - */ - protected final Composite addLabeledComposite(Composite container, - String labelText, - Control centerControl) { - - - return this.addLabeledComposite( - container, - labelText, - centerControl, - null, - null - ); - } - - /** - * Creates a new container that will have the given center composite labeled - * with the given label text. - * - * @param container The parent container - * @param labelText The text to label the main composite - * @param centerControl The main widget - * @param rightControl The control shown to the right of the main widget - * @param helpId The topic help ID to be registered for the given center - * compositer - * @return The container of the label and the given center control - * - * @category Layout - */ - protected final Composite addLabeledComposite(Composite container, - String labelText, - Control centerControl, - Control rightControl, - String helpId) { - - return this.addLabeledComposite( - container, - this.addLabel(container, labelText), - centerControl, - rightControl, - helpId - ); - } - - /** - * Creates a new container that will have the given center composite labeled - * with the given label text. - * - * @param container The parent container - * @param labelText The text to label the main composite - * @param centerControl The main widget - * @param helpId The topic help ID to be registered for the given center - * compositer - * @return The container of the label and the given center control - * - * @category Layout - */ - protected final Composite addLabeledComposite(Composite container, - String labelText, - Control centerControl, - String helpId) { - - Label label = this.addLabel(container, labelText); - - return this.addLabeledComposite( - container, - label, - centerControl, - helpId - ); - } - - /** - * Creates a new container that will have the given center control labeled - * with the given label. - * - * @param container The parent container - * @param leftControl The widget shown to the left of the main widget - * @param centerControl The main widget - * @param rightControl The control shown to the right of the main widget - * @param helpId The topic help ID to be registered for the given center - * compositer - * @return The newly created <code>CCombo</code> - * - * @category Layout - */ - protected final Combo addLabeledEditableCombo(Composite container, - String labelText, - ModifyListener comboListener, - Control rightControl, - String helpId) { - - Combo combo = this.addEditableCombo(container); - combo.addModifyListener(comboListener); - - this.addLabeledComposite( - container, - labelText, - (combo.getParent() != container) ? combo.getParent() : combo, - rightControl, - helpId - ); - - return combo; - } - - /** - * Creates a new container that will have an editable combo labeled with the - * given text. - * - * @param container The parent container - * @param labelText The text of the label - * @param comboListener The listener that will be notified when the selection - * changes - * @param helpId The topic help ID to be registered for the given center - * compositer - * @return The newly created <code>CCombo</code> - * - * @category Layout - */ - protected final Combo addLabeledEditableCombo(Composite container, - String labelText, - ModifyListener comboListener, - String helpId) { - - return this.addLabeledEditableCombo( - container, - labelText, - comboListener, - null, - helpId - ); - } - - /** - * Creates a new container that will have the given center control labeled - * with the given label. - * - * @param container The parent container - * @param leftControl The widget shown to the left of the main widget - * @param centerControl The main widget - * @param labelProvider The provider responsible to convert the combo's items - * into human readable strings - * @param rightControl The control shown to the right of the main widget - * @param helpId The topic help ID to be registered for the given center - * compositer - * @return The newly created <code>CCombo</code> - * - * @category Layout - */ - protected final Combo addLabeledEditableComboViewer(Composite container, - String labelText, - ModifyListener comboListener, - ILabelProvider labelProvider, - Control rightControl, - String helpId) { - - ComboViewer comboViewer = this.addEditableComboViewer( - container, - labelProvider - ); - - Combo combo = comboViewer.getCombo(); - combo.addModifyListener(comboListener); - - this.addLabeledComposite( - container, - labelText, - (combo.getParent() != container) ? combo.getParent() : combo, - rightControl, - helpId - ); - - return combo; - } - - /** - * Creates a new container that will have an editable combo labeled with the - * given text. - * - * @param container The parent container - * @param labelText The text of the label - * @param comboListener The listener that will be notified when the selection - * changes - * @param labelProvider The provider responsible to convert the combo's items - * into human readable strings - * @param helpId The topic help ID to be registered for the given center - * compositer - * @return The newly created <code>CCombo</code> - * - * @category Layout - */ - protected final Combo addLabeledEditableComboViewer(Composite container, - String labelText, - ModifyListener comboListener, - ILabelProvider labelProvider, - String helpId) { - - return this.addLabeledEditableComboViewer( - container, - labelText, - comboListener, - labelProvider, - null, - helpId - ); - } - - /** - * Creates a new container that will have an editable combo labeled with the - * given text. - * - * @param container The parent container - * @param labelText The text of the label - * @param listHolder The <code>ListValueHolder</code> - * @param selectedItemHolder The holder of the selected item - * @param helpId The topic help ID to be registered for the given center - * composite - * @return The newly created <code>CCombo</code> - * - * @category Layout - */ - protected final <V> Combo addLabeledEditableCombo(Composite container, - String labelText, - ListValueModel<V> listHolder, - WritablePropertyValueModel<V> selectedItemHolder, - String helpId) { - - return this.addLabeledEditableCombo( - container, - labelText, - listHolder, - selectedItemHolder, - StringConverter.Default.<V>instance(), - null, - helpId - ); - } - - /** - * Creates a new container that will have the given center control labeled - * with the given label. - * - * @param container The parent container - * @param labelText The text of the label - * @param listHolder The <code>ListValueHolder</code> - * @param selectedItemHolder The holder of the selected item - * @param stringConverter The converter responsible to transform each item - * into a string representation - * @param rightControl The control shown to the right of the main widget - * @param helpId The topic help ID to be registered for the given center - * compositer - * @return The newly created <code>Combo</code> - * - * @category Layout - */ - protected final <V> Combo addLabeledEditableCombo(Composite container, - String labelText, - ListValueModel<V> listHolder, - WritablePropertyValueModel<V> selectedItemHolder, - StringConverter<V> stringConverter, - Control rightControl, - String helpId) { - - Combo combo = this.addEditableCombo( - container, - listHolder, - selectedItemHolder, - stringConverter - ); - - this.addLabeledComposite( - container, - labelText, - (combo.getParent() != container) ? combo.getParent() : combo, - rightControl, - helpId - ); - - return combo; - } - - /** - * Creates a new container that will have an editable combo labeled with the - * given text. - * - * @param container The parent container - * @param labelText The text of the label - * @param listHolder The <code>ListValueHolder</code> - * @param selectedItemHolder The holder of the selected item - * @param stringConverter The converter responsible to transform each item - * into a string representation - * @param helpId The topic help ID to be registered for the given center - * compositer - * @return The newly created <code>Combo</code> - * - * @category Layout - */ - protected final <V> Combo addLabeledEditableCombo(Composite container, - String labelText, - ListValueModel<V> listHolder, - WritablePropertyValueModel<V> selectedItemHolder, - StringConverter<V> stringConverter, - String helpId) { - - return this.addLabeledEditableCombo( - container, - labelText, - listHolder, - selectedItemHolder, - stringConverter, - null, - helpId - ); - } - - /** - * Creates a new container that will have a text field as the center control - * labeled with the given label. - * - * @param container The parent container - * @param labelText The text area's label - * @param textHolder The holder of the text field's input - * @param lineCount The number of lines the text area should display - * @param helpId The topic help ID to be registered for the text field - * @return The newly created <code>Text</code> - * - * @category Layout - */ - protected final Text addLabeledMultiLineText(Composite container, - String labelText, - WritablePropertyValueModel<String> textHolder, - int lineCount, - String helpId) { - - Text text = this.addMultiLineText(container, textHolder, lineCount); - - container = this.addLabeledComposite( - container, - labelText, - text, - helpId - ); - - int textHeight = text.computeSize(SWT.DEFAULT, SWT.DEFAULT).y; - - // Specify the number of lines the text area should display - GridData gridData = (GridData) text.getLayoutData(); - gridData.heightHint = text.getLineHeight() * lineCount; - - // Move the label to the top of its cell - Control label = container.getChildren()[0]; - int labelHeight = label.computeSize(SWT.DEFAULT, SWT.DEFAULT).y; - - gridData = (GridData) label.getLayoutData(); - gridData.verticalAlignment = SWT.TOP; - gridData.verticalIndent += (Math.abs(textHeight - labelHeight) / 2); - - return text; - } - - /** - * Creates a new container that will have a text field as the center control - * labeled with the given label. - * - * @param container The parent container - * @param textHolder The holder of the text field's input - * @return The newly created <code>Text</code> - * - * @category Layout - */ - protected final Text addLabeledPasswordText(Composite container, - String labelText, - WritablePropertyValueModel<String> textHolder) { - - return this.addLabeledPasswordText( - container, - labelText, - textHolder, - null - ); - } - - /** - * Creates a new container that will have a text field as the center control - * labeled with the given label. - * - * @param container The parent container - * @param labelText The text field's label - * @param rightComponent The component to be placed to the right of the text - * field - * @param textHolder The holder of the text field's input - * @param helpId The topic help ID to be registered for the text field - * @return The newly created <code>Text</code> - * - * @category Layout - */ - protected final Text addLabeledPasswordText(Composite container, - String labelText, - WritablePropertyValueModel<String> textHolder, - Control rightControl, - String helpId) { - - Text text = this.addPasswordText(container, textHolder); - - this.addLabeledComposite( - container, - labelText, - text, - rightControl, - helpId - ); - - return text; - } - - /** - * Creates a new container that will have a text field as the center control - * labeled with the given label. - * - * @param container The parent container - * @param textHolder The holder of the text field's input - * @param helpId The topic help ID to be registered for the text field - * @return The newly created <code>Text</code> - * - * @category Layout - */ - protected final Text addLabeledPasswordText(Composite container, - String labelText, - WritablePropertyValueModel<String> textHolder, - String helpId) { - - return this.addLabeledPasswordText( - container, - labelText, - textHolder, - null, - helpId - ); - } - - /** - * Creates a new spinner. - * - * @param parent The parent container - * @param labelText The label's text - * @param numberHolder The holder of the integer value - * @param defaultValue The value shown when the holder has <code>null</code> - * @param minimumValue The minimum value that the spinner will allow - * @param maximumValue The maximum value that the spinner will allow - * @param rightControl The widget to be placed to the right of spinner - * @param helpId The topic help ID to be registered for the spinner - * @return The newly created <code>Spinner</code> - * - * @category Layout - */ - protected final Spinner addLabeledSpinner(Composite parent, - String labelText, - WritablePropertyValueModel<Integer> numberHolder, - int defaultValue, - int minimumValue, - int maximumValue, - Control rightControl, - String helpId) { - - Spinner spinner = this.addSpinner( - parent, - numberHolder, - defaultValue, - minimumValue, - maximumValue, - helpId - ); - Label label = addLabel(parent, labelText); - addLabeledComposite( - parent, - label, - (spinner.getParent() != parent) ? spinner.getParent() : spinner, - rightControl, - helpId - ); - - GridData gridData = (GridData) spinner.getLayoutData(); - gridData.horizontalAlignment = GridData.BEGINNING; - - return spinner; - } - - /** - * Creates a new managed spinner. Managed means that this Pane will - * handle enabling/disabling of this widget if a PaneEnabler is used. - * - * @param parent The parent container - * @param numberHolder The holder of the integer value - * @param defaultValue The value shown when the holder has <code>null</code> - * @param minimumValue The minimum value that the spinner will allow - * @param maximumValue The maximum value that the spinner will allow - * @param helpId The topic help ID to be registered for the new button - * @return The newly created <code>Spinner</code> - * - * @category Layout - */ - protected final Spinner addSpinner(Composite parent, - WritablePropertyValueModel<Integer> numberHolder, - int defaultValue, - int minimumValue, - int maximumValue, - String helpId) { - - Spinner spinner = addUnmanagedSpinner(parent, numberHolder, defaultValue, minimumValue, maximumValue, helpId); - this.manageWidget(spinner); - return spinner; - } - - /** - * Creates a new unmanaged spinner. Unmanaged means that this Pane will - * not handle the enabling/disabling of this widget. The owning object will handle - * it with its own PaneEnabler or ControlEnabler. - * - * @param parent The parent container - * @param numberHolder The holder of the integer value - * @param defaultValue The value shown when the holder has <code>null</code> - * @param minimumValue The minimum value that the spinner will allow - * @param maximumValue The maximum value that the spinner will allow - * @param helpId The topic help ID to be registered for the new button - * @return The newly created <code>Spinner</code> - * - * @category Layout - */ - private Spinner addUnmanagedSpinner(Composite parent, - WritablePropertyValueModel<Integer> numberHolder, - int defaultValue, - int minimumValue, - int maximumValue, - String helpId) { - - Spinner spinner = this.widgetFactory.createSpinner(parent); - spinner.setMinimum(minimumValue); - spinner.setMaximum(maximumValue); - GridData gridData = getFieldGridData(); - gridData.grabExcessHorizontalSpace = false; - spinner.setLayoutData(gridData); - - SpinnerModelAdapter.adapt(numberHolder, spinner, defaultValue); - - if (helpId != null) { - getHelpSystem().setHelp(spinner, helpId); - } - - return spinner; - } - - /** - * Creates a new managed DateTime of type SWT.TIME. Managed means that this Pane will - * handle enabling/disabling of this widget if a PaneEnabler is used. - * - * @param parent The parent container - * @param hoursHolder The holder of the hours integer value - * @param minutesHolder The holder of the minutes integer value - * @param secondsHolder The holder of the seconds integer value - * @param helpId The topic help ID to be registered for the new dateTime - * @return The newly created <code>DateTime</code> - * - * @category Layout - */ - protected final DateTime addDateTime(Composite parent, - WritablePropertyValueModel<Integer> hoursHolder, - WritablePropertyValueModel<Integer> minutesHolder, - WritablePropertyValueModel<Integer> secondsHolder, - String helpId) { - - DateTime dateTime = this.addUnmanagedDateTime(parent, hoursHolder, minutesHolder, secondsHolder, helpId); - this.manageWidget(dateTime); - - return dateTime; - } - - protected final DateTime addDateTime( - Composite parent, - WritablePropertyValueModel<Integer> hoursHolder, - WritablePropertyValueModel<Integer> minutesHolder, - WritablePropertyValueModel<Integer> secondsHolder, - String helpId, - PropertyValueModel<Boolean> enabledModel - ) { - DateTime dateTime = this.addUnmanagedDateTime(parent, hoursHolder, minutesHolder, secondsHolder, helpId); - this.controlEnabledState(enabledModel, dateTime); - return dateTime; - } - - /** - * Creates a new unmanaged DateTime of type SWT.TIME. Unmanaged means that this Pane will - * not handle the enabling/disabling of this widget. The owning object will handle - * it with its own PaneEnabler or ControlEnabler. - * - * @param parent The parent container - * @param hoursHolder The holder of the hours integer value - * @param minutesHolder The holder of the minutes integer value - * @param secondsHolder The holder of the seconds integer value - * @param helpId The topic help ID to be registered for the new dateTime - * @return The newly created <code>DateTime</code> - * - * @category Layout - */ - private DateTime addUnmanagedDateTime(Composite parent, - WritablePropertyValueModel<Integer> hoursHolder, - WritablePropertyValueModel<Integer> minutesHolder, - WritablePropertyValueModel<Integer> secondsHolder, - String helpId) { - - DateTime dateTime = this.widgetFactory.createDateTime(parent, SWT.TIME); - - DateTimeModelAdapter.adapt(hoursHolder, minutesHolder, secondsHolder, dateTime); - - if (helpId != null) { - getHelpSystem().setHelp(dateTime, helpId); - } - - return dateTime; - } - /** - * Creates a new editable <code>Combo</code>. - * - * @param container The parent container - * @param listHolder The <code>ListValueHolder</code> - * @param selectedItemHolder The holder of the selected item - * @param stringConverter The converter responsible to transform each item - * into a string representation - * @return The newly created <code>CCombo</code> - * - * @category Layout - */ - private <V> Combo addUnmanagedEditableCombo(Composite container, - ListValueModel<V> listHolder, - WritablePropertyValueModel<V> selectedItemHolder, - StringConverter<V> stringConverter) { - - Combo combo = addUnmanagedEditableCombo(container); - - ComboModelAdapter.adapt( - listHolder, - selectedItemHolder, - combo, - stringConverter - ); - - return combo; - } - - - /** - * Creates a new editable <code>Combo</code>. - * - * @param container The parent container - * @return The newly created <code>CCombo</code> - * - * @category Layout - */ - private Combo addUnmanagedEditableCombo(Composite container) { - - Combo combo = this.widgetFactory.createEditableCombo(container); - combo.setLayoutData(getFieldGridData()); - return combo; - } - - /** - * Creates a new container that will have a text field as the center control - * labeled with the given label. - * - * @param container The parent container - * @param textHolder The holder of the text field's input - * @return The newly created <code>Text</code> - * - * @category Layout - */ - protected final Text addLabeledText(Composite container, - String labelText, - WritablePropertyValueModel<String> textHolder) { - - return this.addLabeledText(container, labelText, textHolder, null); - } - - /** - * Creates a new container that will have a text field as the center control - * labeled with the given label. - * - * @param container The parent container - * @param labelText The text field's label - * @param rightComponent The component to be placed to the right of the text - * field - * @param textHolder The holder of the text field's input - * @param helpId The topic help ID to be registered for the text field - * @return The newly created <code>Text</code> - * - * @category Layout - */ - protected final Text addLabeledText(Composite container, - String labelText, - WritablePropertyValueModel<String> textHolder, - Control rightComponent, - String helpId) { - - Text text = this.addText(container, textHolder); - - this.addLabeledComposite( - container, - labelText, - text, - rightComponent, - helpId - ); - - return text; - } - /** - * - * Creates a new container that will have a text field as the center control - * labeled with the given label. - * - * @param container The parent container - * @param labelText The text field's label - * @param rightComponent The component to be placed to the right of the text - * field - * @param textHolder The holder of the text field's input - * @param helpId The topic help ID to be registered for the text field - * @return The newly created <code>Text</code> - * - * @category Layout - */ - protected final Text addLabeledText(Composite container, - Label label, - WritablePropertyValueModel<String> textHolder, - Control rightComponent, - String helpId) { - - Text text = this.addText(container, textHolder); - - this.addLabeledComposite( - container, - label, - text, - rightComponent, - helpId - ); - - return text; - } - - /** - * Creates a new container that will have a text field as the center control - * labeled with the given label. - * - * @param container The parent container - * @param textHolder The holder of the text field's input - * @param helpId The topic help ID to be registered for the text field - * @return The newly created <code>Text</code> - * - * @category Layout - */ - protected final Text addLabeledText(Composite container, - String labelText, - WritablePropertyValueModel<String> textHolder, - String helpId) { - - return this.addLabeledText( - container, - labelText, - textHolder, - null, - helpId - ); - } - - /** - * Creates a new container that will have a text field as the center control - * labeled with the given label. - * - * @param container The parent container - * @param textHolder The holder of the text field's input - * @param helpId The topic help ID to be registered for the text field - * @return The newly created <code>Text</code> - * - * @category Layout - */ - protected final Text addLabeledText(Composite container, - Label label, - WritablePropertyValueModel<String> textHolder, - String helpId) { - - return this.addLabeledText( - container, - label, - textHolder, - null, - helpId - ); - } - - /** - * Creates a new list and notify the given selection holder when the - * selection changes. If the selection count is different than one than the - * holder will receive <code>null</code>. - * - * @param container The parent container - * @param helpId The topic help ID to be registered for the new radio button - * @return The newly created <code>List</code> - * - * @category Layout - */ - protected final List addList(Composite container, String helpId) { - - return this.addList( - container, - new SimplePropertyValueModel<String>(), - helpId - ); - } - - /** - * Creates a new list and notify the given selection holder when the - * selection changes. If the selection count is different than one than the - * holder will receive <code>null</code>. - * - * @param container The parent container - * @param selectionHolder The holder of the unique selected item - * @param helpId The topic help ID to be registered for the new radio button - * @return The newly created <code>List</code> - * - * @category Layout - */ - protected final List addList(Composite container, - WritablePropertyValueModel<String> selectionHolder, - String helpId) { - - List list = this.addUnmanagedList(container, selectionHolder, helpId); - this.manageWidget(list); - - return list; - } - - /** - * Creates a new unmanaged list and notify the given selection holder when the - * selection changes. If the selection count is different than one than the - * holder will receive <code>null</code>. - * Unmanaged means that this Pane will not handle the enabling/disabling of this widget. - * The owning object will handle it with its own PaneEnabler or ControlEnabler. - * - * @param container The parent container - * @param selectionHolder The holder of the unique selected item - * @param helpId The topic help ID to be registered for the new radio button - * @return The newly created <code>List</code> - * - * @category Layout - */ - private List addUnmanagedList(Composite container, - WritablePropertyValueModel<String> selectionHolder, - String helpId) { - - List list = this.widgetFactory.createList( - container, - SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI - ); - - list.addSelectionListener(buildSelectionListener(selectionHolder)); - list.setLayoutData(new GridData(GridData.FILL_BOTH)); - - if (helpId != null) { - getHelpSystem().setHelp(list, helpId); - } - - return list; - } - - /** - * Creates a new lable expanding on multiple lines. - * - * @param parent The parent container - * @param labelText The label's text - * - * @category Layout - */ - protected final FormText addMultiLineLabel(Composite container, - String labelText) { - - FormText label = this.widgetFactory.createMultiLineLabel(container, labelText); - manageWidget(label); - return label; - } - - /** - * Creates a new <code>Text</code> widget that has multiple lines. - * - * @param container The parent container - * @return The newly created <code>Text</code> widget - * - */ - protected final Text addMultiLineText(Composite container) { - - Text text = this.widgetFactory.createMultiLineText(container); - text.setLayoutData(getFieldGridData()); - this.manageWidget(text); - - return text; - } - - /** - * Creates a new <code>Text</code> widget that has multiple lines. - * - * @param container The parent container - * @param lineCount The number of lines the text area should display - * @param helpId The topic help ID to be registered for the new text - * @return The newly created <code>Text</code> widget - * - * @category Layout - */ - protected final Text addMultiLineText(Composite container, - int lineCount, - String helpId) { - - Text text = this.addMultiLineText(container); - - GridData gridData = getFieldGridData(); - gridData.heightHint = text.getLineHeight() * lineCount; - text.setLayoutData(gridData); - - if (helpId != null) { - getHelpSystem().setHelp(text, helpId); - } - - return text; - } - - /** - * Creates a new <code>Text</code> widget that has multiple lines. - * - * @param container The parent container - * @param textHolder The holder of the text field's input - * @param lineCount The number of lines the text area should display - * @return The newly created <code>Text</code> widget - * - * @category Layout - */ - protected final Text addMultiLineText(Composite container, - WritablePropertyValueModel<String> textHolder, - int lineCount) { - - return this.addMultiLineText(container, textHolder, lineCount, null); - } - - /** - * Creates a new <code>Text</code> widget that has multiple lines. - * - * @param container The parent container - * @param textHolder The holder of the text field's input - * @param helpId The topic help ID to be registered for the new text - * @return The newly created <code>Text</code> widget - * - * @category Layout - */ - protected final Text addMultiLineText(Composite container, - WritablePropertyValueModel<String> textHolder, - int lineCount, - String helpId) { - - Text text = this.addMultiLineText(container, lineCount, helpId); - SWTTools.bind(textHolder, text); - return text; - } - - /** - * Creates a new <code>PageBook</code> and set the proper layout and layout - * data. - * - * @param container The parent container - * @return The newly created <code>PageBook</code> - * - * @category Layout - */ - protected final PageBook addPageBook(Composite container) { - - PageBook pageBook = new PageBook(container, SWT.NULL); - pageBook.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - return pageBook; - } - - /** - * Creates a new container without specifying any layout manager. - * - * @param container The parent of the new container - * @return The newly created <code>Composite</code> - * - * @category Layout - */ - protected final Composite addPane(Composite parent) { - return this.widgetFactory.createComposite(parent); - } - - /** - * Creates a new container using the given layout manager. - * - * @param parent The parent of the new container - * @param layout The layout manager of the new container - * @return The newly created container - * - * @category Layout - */ - protected final Composite addPane(Composite container, Layout layout) { - - container = this.addPane(container); - container.setLayout(layout); - container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - return container; - } - - /** - * Creates a new <code>Text</code> widget. - * - * @param container The parent container - * @param textHolder The holder of the text field's input - * @return The newly created <code>Text</code> widget - * - * @category Layout - */ - protected final Text addPasswordText(Composite container, - WritablePropertyValueModel<String> textHolder) { - - Text text = this.addPasswordText(container); - SWTTools.bind(textHolder, text); - - return text; - } - - /** - * Creates a new <code>Text</code> widget. - * - * @param container The parent container - * @param textHolder The holder of the text field's input - * @return The newly created <code>Text</code> widget - * - * @category Layout - */ - protected final Text addPasswordText(Composite container) { - - Text text = this.widgetFactory.createPasswordText(container); - text.setLayoutData(getFieldGridData()); - - this.manageWidget(text); - return text; - } - - /** - * Creates a new push button using the given information. - * - * @param parent The parent container - * @param buttonText The button's text - * @param buttonAction The action to be invoked when the button is pressed - * @return The newly created <code>Button</code> - * - * @category Layout - */ - protected final Button addPushButton(Composite parent, - String buttonText, - final Runnable buttonAction) { - - return this.addPushButton(parent, buttonText, null, buttonAction); - } - - /** - * Creates a new push button using the given information. - * - * @param parent The parent container - * @param buttonText The button's text - * @param buttonAction The action to be invoked when the button is pressed - * @param helpId The topic help ID to be registered for the new radio button - * @return The newly created <code>Button</code> - * - * @category Layout - */ - protected final Button addPushButton(Composite parent, - String buttonText, - String helpId, - final Runnable buttonAction) { - - Button button = this.widgetFactory.createPushButton(parent, buttonText); - manageWidget(button); - button.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - SWTUtil.asyncExec(buttonAction); - } - }); - - button.setLayoutData(new GridData()); - - if (helpId != null) { - getHelpSystem().setHelp(button, helpId); - } - - return button; - } - - /** - * Creates a new check box using the given information. - * - * @param parent The parent container - * @param buttonText The button's text - * @param booleanHolder The holder of the selection state - * @param helpId The topic help ID to be registered for the new radio button - * @return The newly created <code>Button</code> - * - * @category Layout - */ - protected final Button addRadioButton(Composite parent, - String buttonText, - WritablePropertyValueModel<Boolean> booleanHolder, - String helpId) { - - return this.addToggleButton( - parent, - buttonText, - booleanHolder, - helpId, - SWT.RADIO - ); - } - - /** - * Creates a new <code>Section</code>. A sub-pane is automatically added as - * its client and is the returned <code>Composite</code>. - * - * @param container The container of the new widget - * @param sectionText The text of the new section - * @return The <code>Section</code>'s sub-pane - * - * @category Layout - */ - protected final Composite addSection(Composite container, - String sectionText) { - - return this.addSection( - container, - sectionText, - ExpandableComposite.TITLE_BAR - ); - } - - /** - * Creates a new <code>Section</code>. A sub-pane is automatically added as - * its client and is the returned <code>Composite</code>. - * - * @param container The container of the new widget - * @param sectionText The text of the new section - * @param type The type of section to create - * @param expandedStateHolder The holder of the boolean that will dictate - * when to expand or collapse the section - * @return The <code>Section</code>'s sub-pane - * - * @category Layout - */ - private Composite addSection(Composite container, - String sectionText, - int type) { - - return this.addSection(container, sectionText, null, type); - } - - /** - * Creates a new <code>Section</code>. A sub-pane is automatically added as - * its client and is the returned <code>Composite</code>. - * - * @param container The container of the new widget - * @param sectionText The text of the new section - * @param description The section's description - * @return The <code>Section</code>'s sub-pane - * - * @category Layout - */ - protected final Composite addSection(Composite container, - String sectionText, - String description) { - - return this.addSection( - container, - sectionText, - description, - ExpandableComposite.TITLE_BAR - ); - } - - /** - * Creates a new <code>Section</code>. A sub-pane is automatically added as - * its client and is the returned <code>Composite</code>. - * - * @param container The container of the new widget - * @param sectionText The text of the new section - * @param description The section's description or <code>null</code> if none - * was provider - * @param type The type of section to create - * @param expandedStateHolder The holder of the boolean that will dictate - * when to expand or collapse the section - * @return The <code>Section</code>'s sub-pane - * - * @category Layout - */ - private Composite addSection(Composite container, - String sectionText, - String description, - int type) { - - Section section = this.widgetFactory.createSection(container, type | ((description != null) ? Section.DESCRIPTION : SWT.NULL)); - section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - section.setText(sectionText); - section.marginWidth = 0; - section.marginHeight = 0; - - if (description != null) { - section.setDescription(description); - } - - Composite subPane = this.addSubPane(section); - section.setClient(subPane); - - return subPane; - } - - private SelectionListener buildSelectionListener(final WritablePropertyValueModel<String> selectionHolder) { - return new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - List list = (List) e.widget; - String[] selectedItems = list.getSelection(); - if ((selectedItems == null) || (selectedItems.length != 1)) { - selectionHolder.setValue(null); - } - else { - selectionHolder.setValue(selectedItems[0]); - } - } - }; - } - - /** - * Creates the layout responsible to compute the size of the spacer created - * for the right control when none was given. The spacer helps to align all - * the right controls. - * - * @category Layout - */ - private Layout buildSpacerLayout() { - return new Layout() { - @Override - protected Point computeSize(Composite composite, - int widthHint, - int heightHint, - boolean flushCache) { - - return new Point(widthHint, heightHint); - } - - @Override - protected void layout(Composite composite, boolean flushCache) { - GridData data = (GridData) composite.getLayoutData(); - composite.setBounds(0, 0, data.widthHint, data.heightHint); - } - }; - } - - private PropertyChangeListener buildSubjectChangeListener() { - return new SWTPropertyChangeListenerWrapper(this.buildSubjectChangeListener_()); - } - - private PropertyChangeListener buildSubjectChangeListener_() { - return new PropertyChangeListener() { - @SuppressWarnings("unchecked") - public void propertyChanged(PropertyChangeEvent e) { - Pane.this.subjectChanged((T) e.getOldValue(), (T) e.getNewValue()); - } - }; - } - - /** - * Creates a new <code>Composite</code> used as a sub-pane. - * - * @param container The parent container - * @return The newly created <code>Composite</code> used as a sub-pane - * - * @category Layout - */ - protected final Composite addSubPane(Composite container) { - return this.addSubPane(container, 0); - } - - /** - * Creates a new <code>Composite</code> used as a sub-pane. - * - * @param container The parent container - * @param topMargin The extra spacing to add at the top of the pane - * @return The newly created <code>Composite</code> used as a sub-pane - * - * @category Layout - */ - protected final Composite addSubPane(Composite container, int topMargin) { - return this.addSubPane(container, topMargin, 0); - } - - /** - * Creates a new <code>Composite</code> used as a sub-pane. - * - * @param container The parent container - * @param topMargin The extra spacing to add at the top of the pane - * @param leftMargin The extra spacing to add to the left of the pane - * @return The newly created <code>Composite</code> used as a sub-pane - * - * @category Layout - */ - protected final Composite addSubPane(Composite container, - int topMargin, - int leftMargin) { - - return this.addSubPane(container, topMargin, leftMargin, 0, 0); - } - - /** - * Creates a new <code>Composite</code> used as a sub-pane, the new widget - * will have its layout and layout data already initialized, the layout will - * be a <code>GridLayout</code> with 1 column. - * - * @param container The parent container - * @param topMargin The extra spacing to add at the top of the pane - * @param leftMargin The extra spacing to add to the left of the pane - * @param bottomMargin The extra spacing to add at the bottom of the pane - * @param rightMargin The extra spacing to add to the right of the pane - * @return The newly created <code>Composite</code> used as a sub-pane - * - * @category Layout - */ - protected final Composite addSubPane(Composite container, - int topMargin, - int leftMargin, - int bottomMargin, - int rightMargin) { - - return this.addSubPane( - container, - 1, - topMargin, - leftMargin, - bottomMargin, - rightMargin); - } - - /** - * Creates a new <code>Composite</code> used as a sub-pane, the new widget - * will have its layout and layout data already initialized, the layout will - * be a <code>GridLayout</code> with 1 column. - * - * @param container The parent container - * @param topMargin The extra spacing to add at the top of the pane - * @param leftMargin The extra spacing to add to the left of the pane - * @param bottomMargin The extra spacing to add at the bottom of the pane - * @param rightMargin The extra spacing to add to the right of the pane - * @return The newly created <code>Composite</code> used as a sub-pane - * - * @category Layout - */ - protected final Composite addSubPane(Composite container, - int columnCount, - int topMargin, - int leftMargin, - int bottomMargin, - int rightMargin) { - - GridLayout layout = new GridLayout(columnCount, false); - layout.marginHeight = 0; - layout.marginWidth = 0; - layout.marginTop = topMargin; - layout.marginLeft = leftMargin; - layout.marginBottom = bottomMargin; - layout.marginRight = rightMargin; - - container = this.addPane(container, layout); - - return container; - } - - /** - * Creates a new <code>Section</code>. A sub-pane is automatically added as - * its client which can be typed cast directly as a <code>Composite</code>. - * - * @param container The container of the new widget - * @param sectionText The text of the new section - * @return The <code>Section</code>'s sub-pane - * - * @category Layout - */ - protected final Composite addSubSection(Composite container, - String sectionText) { - - return this.addCollapsibleSubSection( - container, - sectionText, - new SimplePropertyValueModel<Boolean>(Boolean.TRUE) - ); - } - - /** - * Creates a new table. - * - * @param container The parent container - * @param style The style to apply to the table - * @param helpId The topic help ID to be registered for the new table or - * <code>null</code> if no help ID is required - * @return The newly created <code>Table</code> - * - * @category Layout - */ - protected final Table addTable(Composite container, - int style, - String helpId) { - - Table table = addUnmanagedTable(container, style, helpId); - this.manageWidget(table); - - return table; - } - /** - * Creates a new unmanaged table. Unmanaged means that this Pane will - * not handle the enabling/disabling of this widget. The owning object will handle - * it with its own PaneEnabler or ControlEnabler. - * - * @param container The parent container - * @param style The style to apply to the table - * @param helpId The topic help ID to be registered for the new table or - * <code>null</code> if no help ID is required - * @return The newly created <code>Table</code> - * - * @category Layout - */ - protected final Table addUnmanagedTable(Composite container, - int style, - String helpId) { - - Table table = this.widgetFactory.createTable(container, style); - table.setHeaderVisible(true); - table.setLinesVisible(true); - - GridData gridData = new GridData(GridData.FILL_BOTH); - gridData.heightHint = table.getItemHeight() * 4; - table.setLayoutData(gridData); - - if (helpId != null) { - getHelpSystem().setHelp(table, helpId); - } - - return table; - } - - /** - * Creates a new table. - * - * @param container The parent container - * @param helpId The topic help ID to be registered for the new table or - * <code>null</code> if no help ID is required - * @return The newly created <code>Table</code> - * - * @category Layout - */ - protected final Table addTable(Composite container, String helpId) { - - return this.addTable( - container, - SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION | SWT.MULTI, - helpId - ); - } - - /** - * Creates a new unmanaged table. Unmanaged means that this Pane will - * not handle the enabling/disabling of this widget. The owning object will handle - * it with its own PaneEnabler or ControlEnabler. - * - * @param container The parent container - * @param helpId The topic help ID to be registered for the new table or - * <code>null</code> if no help ID is required - * @return The newly created <code>Table</code> - * - * @category Layout - */ - protected final Table addUnmanagedTable(Composite container, String helpId) { - - return this.addUnmanagedTable( - container, - SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION | SWT.MULTI, - helpId - ); - } - - /** - * Creates a new managed <code>Text</code> widget. - * - * @param container The parent container - * @return The newly created <code>Text</code> widget - * - * @category Layout - */ - protected final Text addText(Composite container) { - Text text = this.addUnmanagedText(container); - this.manageWidget(text); - return text; - } - - /** - * Creates a new unmanaged <code>Text</code> widget. Unmanaged means - * that this Pane will not handle the enabling/disabling of this widget. - * The owning object will handle it with its own PaneEnabler or ControlEnabler. - * - * @param container The parent container - * @return The newly created <code>Text</code> widget - * - * @category Layout - */ - private Text addUnmanagedText(Composite container) { - Text text = this.widgetFactory.createText(container); - text.setLayoutData(getFieldGridData()); - return text; - } - - /** - * Creates a new <code>Text</code> widget. - * - * @param container The parent container - * @param helpId The topic help ID to be registered for the new text - * @return The newly created <code>Text</code> widget - * - * @category Layout - */ - protected final Text addText(Composite container, String helpId) { - - Text text = this.addText(container); - - if (helpId != null) { - getHelpSystem().setHelp(text, helpId); - } - - return text; - } - - /** - * Creates a new unmanaged <code>Text</code> widget. Unmanaged means - * that this Pane will not handle the enabling/disabling of this widget. - * The owning object will handle it with its own PaneEnabler or ControlEnabler. - * - * @param container The parent container - * @param helpId The topic help ID to be registered for the new text - * @return The newly created <code>Text</code> widget - * - * @category Layout - */ - private Text addUnmanagedText(Composite container, String helpId) { - - Text text = this.addUnmanagedText(container); - - if (helpId != null) { - getHelpSystem().setHelp(text, helpId); - } - - return text; - } - - /** - * Creates a new <code>Text</code> widget. - * - * @param container The parent container - * @param textHolder The holder of the text field's input - * @return The newly created <code>Text</code> widget - * - * @category Layout - */ - protected final Text addText(Composite container, - WritablePropertyValueModel<String> textHolder) { - - return this.addText(container, textHolder, null); - } - - /** - * Creates a new <code>Text</code> widget. - * - * @param container The parent container - * @param textHolder The holder of the text field's input - * @param helpId The topic help ID to be registered for the new text - * @return The newly created <code>Text</code> widget - * - * @category Layout - */ - protected final Text addText(Composite container, - WritablePropertyValueModel<String> textHolder, - String helpId) { - - Text text = this.addText(container, helpId); - SWTTools.bind(textHolder, text); - - return text; - } - - protected final Text addText( - Composite container, - WritablePropertyValueModel<String> textHolder, - String helpId, - PropertyValueModel<Boolean> enabledModel - ) { - Text text = this.addUnmanagedText(container, textHolder, helpId); - this.controlEnabledState(enabledModel, text); - return text; - } - - /** - * Creates a new unmanaged <code>Text</code> widget. Unmanaged means - * that this Pane will not handle the enabling/disabling of this widget. - * The owning object will handle it with its own PaneEnabler or ControlEnabler. - * - * @param container The parent container - * @param textHolder The holder of the text field's input - * @param helpId The topic help ID to be registered for the new text - * @return The newly created <code>Text</code> widget - * - * @category Layout - */ - private Text addUnmanagedText(Composite container, - WritablePropertyValueModel<String> textHolder, - String helpId) { - - Text text = this.addUnmanagedText(container, helpId); - SWTTools.bind(textHolder, text); - - return text; - } - - /** - * Creates a new container with a titled border. - * - * @param title The text of the titled border - * @param container The parent container - * @return The newly created <code>Composite</code> with a titled border - * - * @category Layout - */ - protected final Group addTitledGroup(Composite container, String title) { - return this.addTitledGroup(container, title, null); - } - - /** - * Creates a new container with a titled border. - * - * @param title The text of the titled border - * @param container The parent container - * @param helpId The topic help ID to be registered for the new group - * @return The newly created <code>Composite</code> with a titled border - * - * @category Layout - */ - protected final Group addTitledGroup(Composite container, - String title, - String helpId) { - - return addTitledGroup(container, title, 1, helpId); - } - - /** - * Creates a new container with a titled border. - * - * @param title The text of the titled border - * @param container The parent container - * @param helpId The topic help ID to be registered for the new group - * @return The newly created <code>Composite</code> with a titled border - * - * @category Layout - */ - protected final Group addTitledGroup(Composite container, - String title, - int columnCount, - String helpId) { - - Group group = this.widgetFactory.createGroup(container, title); - //manageWidget(group); TODO unsure if I want to manage groups, - //also should probably rename this addUnmanagedTitledPane - group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); - - GridLayout layout = new GridLayout(columnCount, false); - layout.marginHeight = 0; - layout.marginWidth = 0; - layout.marginTop = 5; - layout.marginLeft = 5; - layout.marginBottom = 5; - layout.marginRight = 5; - group.setLayout(layout); - - if (helpId != null) { - getHelpSystem().setHelp(group, helpId); - } - - return group; - } - - /** - * Creates a new unmanaged new toggle button (radio button or check box). - * Unmanaged means that this Pane will not handle the enabling/disabling - * of this widget. The owning object will handle it with its own PaneEnabler - * or ControlEnabler. - * - * @param parent The parent container - * @param buttonText The button's text - * @param booleanHolder The holder of the selection state - * @param helpId The topic help ID to be registered for the new button - * @return The newly created <code>Button</code> - * - * @category Layout - */ - private Button addUnmanagedToggleButton( - Composite parent, - String buttonText, - WritablePropertyValueModel<Boolean> booleanHolder, - String helpId, - int toggleButtonType) { - - Button button; - - if (toggleButtonType == SWT.PUSH) { - button = this.widgetFactory.createPushButton(parent, buttonText); - } - else if (toggleButtonType == SWT.RADIO) { - button = this.widgetFactory.createRadioButton(parent, buttonText); - } - else if (toggleButtonType == SWT.CHECK) { - button = this.widgetFactory.createCheckBox(parent, buttonText); - } - else { - button = this.widgetFactory.createButton(parent, buttonText); - } - - button.setLayoutData(new GridData()); - SWTTools.bind(booleanHolder, button); - - if (helpId != null) { - getHelpSystem().setHelp(button, helpId); - } - - return button; - } - - /** - * Creates a new toggle button (radio button or check box) using the given - * information. - * - * @param parent The parent container - * @param buttonText The button's text - * @param booleanHolder The holder of the selection state - * @param helpId The topic help ID to be registered for the new button - * @return The newly created <code>Button</code> - * - * @category Layout - */ - private Button addToggleButton( - Composite parent, - String buttonText, - WritablePropertyValueModel<Boolean> booleanHolder, - String helpId, - int toggleButtonType) { - - Button button = addUnmanagedToggleButton( - parent, - buttonText, - booleanHolder, - helpId, - toggleButtonType); - this.manageWidget(button); - return button; - } - - /** - * Creates a new check box that can have 3 selection states (selected, - * unselected and partially selected. - * - * @param parent The parent container - * @param text The button's text - * @param booleanHolder The holder of the boolean value where <code>null</code> - * means partially selected - * @param helpId The topic help ID to be registered for the new check box - * @return The newly created <code>TriStateCheckBox</code> - * - * @category Layout - */ - protected final TriStateCheckBox addTriStateCheckBox(Composite parent, - String text, - WritablePropertyValueModel<Boolean> booleanHolder, - String helpId) { - - TriStateCheckBox checkBox = new TriStateCheckBox( - parent, - text, - this.getWidgetFactory() - ); - - this.manageWidget(checkBox.getCheckBox()); - - TriStateCheckBoxModelAdapter.adapt( - booleanHolder, - checkBox - ); - - if (helpId != null) { - getHelpSystem().setHelp(checkBox.getCheckBox(), helpId); - } - - return checkBox; - } - - /** - * Creates a new check box that can have 3 selection states (selected, - * unselected and partially selected. - * - * @param parent The parent container - * @param text The button's text - * @param booleanHolder The holder of the boolean value where <code>null</code> - * means partially selected - * @param stringHolder The holder of the string to put in parenthesis after - * the check box's text when it is partially selected - * @param helpId The topic help ID to be registered for the new check box - * @return The newly created <code>TriStateCheckBox</code> - * - * @category Layout - */ - protected final TriStateCheckBox addTriStateCheckBoxWithDefault(Composite parent, - String text, - WritablePropertyValueModel<Boolean> booleanHolder, - PropertyValueModel<String> stringHolder, - String helpId) { - - TriStateCheckBox checkBox = this.addTriStateCheckBox( - parent, - text, - booleanHolder, - helpId - ); - - new LabeledControlUpdater( - new LabeledButton(checkBox.getCheckBox()), - stringHolder - ); - - return checkBox; - } - - /** - * Requests this pane to populate its widgets with the subject's values. - * - * @category Populate - */ - protected void doPopulate() { - this.log(Tracing.UI_LAYOUT, " ->doPopulate()"); - } - - private void controlEnabledState(PropertyValueModel<Boolean> booleanModel, Control... controls) { - this.controlEnabledState_(this.wrapEnabledModel(booleanModel), controls); - } - - /** - * Assume the "enabled" models can return null (which is typical with aspect - * adapters etc.). - */ - private PropertyValueModel<Boolean> wrapEnabledModel(PropertyValueModel<Boolean> booleanModel) { - return new TransformationPropertyValueModel<Boolean, Boolean>(booleanModel, NonNullBooleanTransformer.FALSE); - } - - private void controlEnabledState_(PropertyValueModel<Boolean> booleanModel, Control... controls) { - SWTTools.controlEnabledState(this.andEnabledModel(booleanModel), controls); - } - - private PropertyValueModel<Boolean> getCombinedEnabledModel() { - return (this.combinedEnabledModel != null) ? this.combinedEnabledModel : this.baseEnabledModel; - } - - private boolean getCombinedEnablement() { - Boolean enabled = getCombinedEnabledModel().getValue(); - return (enabled == null) ? true : enabled.booleanValue(); - } - - private PropertyValueModel<Boolean> andEnabledModel(PropertyValueModel<Boolean> booleanModel) { - return CompositeBooleanPropertyValueModel.and(getCombinedEnabledModel(), booleanModel); - } - - protected void controllerEnablementChanged() { - enableWidgets_(getCombinedEnablement()); - } - - /** - * Changes the enablement state of the widgets of this pane. - * - * @param enabled <code>true</code> to enable the widgets or <code>false</code> - * to disable them - * - * @category Layout - */ - public void enableWidgets(boolean enabled) { - this.baseEnabledModel.setValue(Boolean.valueOf(enabled)); - enableWidgets_(getCombinedEnablement()); - } - - private void enableWidgets_(boolean enabled) { - if (! this.container.isDisposed()) { - for (Control control : this.managedWidgets) { - control.setEnabled(enabled); - } - - for (Pane<?> subPane : this.managedSubPanes) { - subPane.enableWidgets(enabled); - } - } - } - - private void engageSubjectHolder() { - this.subjectHolder.addPropertyChangeListener(PropertyValueModel.VALUE, this.subjectChangeListener); - } - - /** - * engage the specified subject - */ - protected void engageListeners(T subject) { - if (subject != null) { - this.engageListeners_(subject); - } - } - - /** - * specified subject is not null - */ - protected void engageListeners_(T subject) { - this.log(Tracing.UI_LAYOUT, " ->engageListeners_(" + subject + ')'); - - for (String propertyName : this.getPropertyNames()) { - subject.addPropertyChangeListener(propertyName, this.aspectChangeListener); - } - } - - /** - * disengage the specified subject - */ - protected void disengageListeners(T subject) { - if (subject != null) { - this.disengageListeners_(subject); - } - } - - /** - * specified subject is not null - */ - protected void disengageListeners_(T subject) { - this.log(Tracing.UI_LAYOUT, " ->disengageListeners_(" + subject + ')'); - - for (String propertyName : this.getPropertyNames()) { - subject.removePropertyChangeListener(propertyName, this.aspectChangeListener); - } - } - - private void disengageSubjectHolder() { - this.subjectHolder.removePropertyChangeListener(PropertyValueModel.VALUE, this.subjectChangeListener); - } - - /** - * Returns the main <code>Control</code> of this pane. - * - * @return The main container - * - * @category Layout - */ - public Composite getControl() { - return this.container; - } - - /** - * Returns the subject holder used by this pane. - * - * @return The holder of the subject - * - * @category Populate - */ - protected final PropertyValueModel<T> getSubjectHolder() { - return this.subjectHolder; - } - - /** - * Returns the factory responsible for creating the widgets. - * - * @return The factory used by this pane to create the widgets - * - * @category Layout - */ - protected final WidgetFactory getWidgetFactory() { - return this.widgetFactory; - } - - /** - * Returns the margin taken by a group box, which is the number of pixel the - * group box border and its margin takes before displaying its widgets plus - * 5 pixels since the widgets inside of the group box and the border should - * have that extra 5 pixels. - * - * @return The width taken by the group box border with its margin - * - * @category Layout - */ - protected final int getGroupBoxMargin() { - Group group = this.widgetFactory.createGroup(SWTUtil.getShell(), ""); - Rectangle clientArea = group.getClientArea(); - group.dispose(); - return clientArea.x + 5; - } - - /** - * Returns the helps system. - * - * @return The platform's help system - * - * @category Helper - */ - protected final IWorkbenchHelpSystem getHelpSystem() { - return PlatformUI.getWorkbench().getHelpSystem(); - } - - - /** - * Determines whether - * - * @return - * - * @category Populate - */ - protected final boolean isPopulating() { - return this.populating; - } - - /** - * Logs the given message if the <code>Tracing.DEBUG_LAYOUT</code> is enabled. - * - * @param flag - * @param message The logging message - */ - protected void log(String flag, String message) { - if (flag.equals(Tracing.UI_LAYOUT) && Tracing.booleanDebugOption(Tracing.UI_LAYOUT)) { - this.log(message); - } - } - - protected void log(String message) { - Class<?> thisClass = this.getClass(); - String className = thisClass.getSimpleName(); - - if (thisClass.isAnonymousClass()) { - className = className.substring(0, className.indexOf('$')); - className += "->" + thisClass.getSuperclass().getSimpleName(); - } - - Tracing.log(className + ": " + message); - } - - /** - * Notifies this pane to populate itself using the subject's information. - * - * @category Populate - */ - private void populate() { - if (!this.container.isDisposed()) { - this.log(Tracing.UI_LAYOUT, "populate()"); - this.repopulate(); - } - } - - /** - * Notifies the subject's property associated with the given property name - * has changed. - * - * @param propertyName The property name associated with the property change - * - * @category Populate - */ - protected void propertyChanged(String propertyName) { - } - - /** - * Returns the list of names to listen for properties changing from the - * subject. - * - * @return A non-<code>null</code> list of property names - * - * @category Populate - */ - protected Collection<String> getPropertyNames() { - ArrayList<String> propertyNames = new ArrayList<String>(); - addPropertyNames(propertyNames); - return propertyNames; - } - - /** - * Removes the given pane's widgets (those that were registered with - * its left <code>ControlAligner</code>) from this pane's left - * <code>ControlAligner</code> so that their width will no longer be adjusted - * with the width of the widest widget. - * - * @param pane The pane containing the widgets to remove - * - * @category Layout - */ - protected final void removeAlignLeft(Pane<?> pane) { - this.leftControlAligner.remove(pane.leftControlAligner); - } - - /** - * Removes the given control from the collection of widgets that are aligned - * to have the same width when they are shown to the left side of the 3 - * widget colums. - * - * @param pane The pane to remove, its width will no longer be - * ajusted to be the width of the longest widget - * - * @category Layout - */ - protected final void removeAlignLeft(Control control) { - this.leftControlAligner.remove(control); - } - - /** - * Removes the given pane's widgets (those that were registered with - * its right <code>ControlAligner</code>) from this pane's right - * <code>ControlAligner</code> so that their width will no longer be adjusted - * with the width of the widest widget. - * - * @param pane The pane containing the widgets to remove - * - * @category Layout - */ - protected final void removeAlignRight(Pane<?> pane) { - this.rightControlAligner.remove(pane.rightControlAligner); - } - - /** - * Removes the given control from the collection of widgets that are aligned - * to have the same width when they are shown to the right side of the 3 - * widget colums. - * - * @param pane The pane to remove, its width will no longer be - * ajusted to be the width of the longest widget - * - * @category Layout - */ - protected final void removeAlignRight(Control control) { - this.rightControlAligner.remove(control); - } - - /** - * Removes the given pane's controls (those that were registered for - * alignment) from this pane. - * - * @param pane The pane containing the widgets that no longer - * requires their width adjusted with the width of the longest widget - * - * @category Layout - */ - protected final void removePaneForAlignment(Pane<?> pane) { - removeAlignLeft(pane); - removeAlignRight(pane); - } - - /** - * This method is called (perhaps internally) when this needs to repopulate - * but the object of interest has not changed. - * - * @category Populate - */ - protected final void repopulate() { - - this.log(Tracing.UI_LAYOUT, " ->repopulate()"); - - // Populate this pane - try { - setPopulating(true); - doPopulate(); - } - finally { - setPopulating(false); - } - - // Ask the sub-panes to repopulate themselves - for (Pane<?> subPane : this.subPanes) { - subPane.repopulate(); - } - } - - /** - * Sets the internal flag that is used to determine whether the pane is being - * populated or not. During population, it is required to not update the - * widgets when the model is updated nor to update the model when the widgets - * are being synchronized with the model's values. - * - * @param populating - * - * @category Populate - */ - protected final void setPopulating(boolean populating) { - this.populating = populating; - } - - /** - * Either show or hides this pane. - * - * @param visible The new visibility state - */ - public void setVisible(boolean visible) { - if (!this.container.isDisposed()) { - this.container.setVisible(visible); - } - } - - /** - * Returns the nearest <code>Shell</code> displaying the main widget of this - * pane. - * - * @return The nearest window displaying this pane - */ - public final Shell getShell() { - return this.container.getShell(); - } - - /** - * Returns the subject of this pane. - * - * @return The subject if this pane was not disposed; <code>null</code> - * if it was - * - * @category Populate - */ - public T getSubject() { - return this.subjectHolder.getValue(); - } - - /** - * The subject has changed, disconnects any listeners from the old subject - * and connects those listeners onto the new subject. - * - * @param oldsubject The old subject or <code>null</code> if none was set - * @param newSubject The new subject or <code>null</code> if none needs to be - * set - * - * @category Populate - */ - protected final void subjectChanged(T oldSubject, T newSubject) { - if (!this.container.isDisposed()) { - - this.log(Tracing.UI_LAYOUT, "subjectChanged()"); - this.disengageListeners(oldSubject); - - this.repopulate(); - - this.engageListeners(newSubject); - } - } - - - /** - * Registers another <code>Pane</code> with this one so it can - * be automatically notified about certain events such as engaging or - * disengaging the listeners, etc. - * - * @param subPane The sub-pane to register - * - * @category Controller - */ - protected final void registerSubPane(Pane<?> subPane) { - this.subPanes.add(subPane); - } - - /** - * Unregisters the given <code>Pane</code> from this one so it - * can no longer be automatically notified about certain events such as - * engaging or disengaging the listeners, etc. - * - * @param subPane The sub-pane to unregister - * - * @category Controller - */ - protected final void unregisterSubPane(Pane<?> subPane) { - this.subPanes.remove(subPane); - } - - private void updatePane(String propertyName) { - if (!isPopulating() && !this.container.isDisposed()) { - this.populating = true; - - try { - propertyChanged(propertyName); - } - finally { - this.populating = false; - } - } - } - - public void dispose() { - this.log(Tracing.UI_LAYOUT, "dispose()"); - - // Dispose this pane - this.disengageListeners(getSubject()); - this.disengageSubjectHolder(); - - if (this.combinedEnabledModel != null && this.combinedEnabledModelListener != null) { - this.combinedEnabledModel.removePropertyChangeListener(PropertyValueModel.VALUE, this.combinedEnabledModelListener); - } - - this.leftControlAligner.dispose(); - this.rightControlAligner.dispose(); - - // Ask the sub-panes to dispose themselves - for (Pane<?> subPane : this.subPanes) { - subPane.dispose(); - } - } - -}
\ No newline at end of file diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/PostExecution.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/PostExecution.java deleted file mode 100644 index bae4b60382..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/PostExecution.java +++ /dev/null @@ -1,31 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.jface.dialogs.Dialog; - -/** - * This <code>PostExecution</code> is used to post execute a portion of code - * once a dialog, that was launched into a different UI thread, has been - * disposed. - * - * @version 2.0 - * @since 1.0 - */ -public interface PostExecution<T extends Dialog> { - - /** - * Notifies this post exection the dialog that was launched into a different - * UI thread has been disposed. - * - * @param dialog The dialog that was launched into a different thread - */ - public void execute(T dialog); -} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/PropertySheetWidgetFactory.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/PropertySheetWidgetFactory.java deleted file mode 100644 index c841976fc0..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/PropertySheetWidgetFactory.java +++ /dev/null @@ -1,61 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Group; -import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory; - -/** - * This <code>WidgetFactory</code> is responsible to create the widgets using - * <code>TabbedPropertySheetWidgetFactory</code> in order use the form style - * (flat-style) look and feel. - * - * @see TabbedPropertySheetWidgetFactory - * - * @version 2.0 - * @since 2.0 - */ -public class PropertySheetWidgetFactory extends FormWidgetFactory { - - /** - * Creates a new <code>PropertySheetWidgetFactory</code>. - * - * @param widgetFactory The actual factory responsible for creating the new - * widgets - */ - public PropertySheetWidgetFactory(TabbedPropertySheetWidgetFactory widgetFactory) { - super(widgetFactory); - } - - /** - * {@inheritDoc} - */ - @Override - public Composite createComposite(Composite parent) { - return getWidgetFactory().createComposite(parent); - } - - /** - * {@inheritDoc} - */ - @Override - public Group createGroup(Composite parent, String title) { - return getWidgetFactory().createGroup(parent, title); - } - - /** - * {@inheritDoc} - */ - @Override - public TabbedPropertySheetWidgetFactory getWidgetFactory() { - return (TabbedPropertySheetWidgetFactory) super.getWidgetFactory(); - } -}
\ No newline at end of file diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/TriStateCheckBox.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/TriStateCheckBox.java deleted file mode 100644 index ecb0d2098c..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/TriStateCheckBox.java +++ /dev/null @@ -1,287 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008, 2011 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import org.eclipse.jpt.common.ui.WidgetFactory; -import org.eclipse.swt.events.DisposeListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; - -/** - * This <code>TriStateCheckBox</code> can display one of three states: - * unchecked, checked, or partially checked. It can be modified via a mouse - * selection, via a keyboard selection, or programmatically. The selection state is - * represented by a <code>Boolean</code> value where a <code>null</code> - * value means partially checked. - * <p> - * The order of state changes is: unchecked -> partially checked -> checked. - * - * @version 2.0 - * @since 2.0 - */ -@SuppressWarnings("nls") -public final class TriStateCheckBox -{ - /** - * A check box button. - */ - private final Button button; - - /** - * The current selection state. - */ - private TriState state; - - /** - * Creates a new <code>TriStateCheckBox</code> with no text. - * - * @param parent The parent composite - * @param widgetFactory The factory used to create the check box - */ - public TriStateCheckBox(Composite parent, WidgetFactory widgetFactory) { - this(parent, null, widgetFactory); - } - - /** - * Creates a new <code>TriStateCheckBox</code>. - * - * @param parent The parent composite - * @param text The check box's text - * @param widgetFactory The factory used to create the check box - */ - public TriStateCheckBox(Composite parent, - String text, - WidgetFactory widgetFactory) { - super(); - this.state = TriState.UNCHECKED; - this.button = widgetFactory.createCheckBox(parent, text); - this.button.addSelectionListener(this.buildSelectionListener()); - } - - /** - * Convenience method: Adds a dispose listener to the check box. - * The source of any events sent to the listener will be the check box widget. - */ - public void addDisposeListener(DisposeListener disposeListener) { - this.button.addDisposeListener(disposeListener); - } - - /** - * Convenience method: Adds a selection listener to the check box. - * The source of any events sent to the listener will be the check box widget. - */ - public void addSelectionListener(SelectionListener selectionListener) { - this.button.addSelectionListener(selectionListener); - } - - private SelectionListener buildSelectionListener() { - return new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - TriStateCheckBox.this.checkBoxClicked(); - } - }; - } - - /** - * The check box was clicked, change the tri-state to the next value and - * update the check box's state. - */ - void checkBoxClicked() { - this.state = this.nextState(); - this.updateCheckBox(); - } - - /** - * Disposes the check box widget. - */ - public void dispose() { - this.button.dispose(); - } - - /** - * Returns the <code>Button</code> used to show a tri-state check box. - * - * @return The <code>Button</code> used to show a tri-state check box - */ - public Button getCheckBox() { - return this.button; - } - - /** - * Returns the check box's image. - * - * @return The check box's image. - */ - public Image getImage() { - return this.button.getImage(); - } - - /** - * Returns the check box's selection state. - * - * @return Either <code>true</code> or <code>false</code> for checked or - * unchecked; or <code>null</code> for partially selected - */ - public Boolean getSelection() { - return (this.state == TriState.PARTIALLY_CHECKED) ? null : Boolean.valueOf(this.state == TriState.CHECKED); - } - - /** - * Returns the check box's text. - * - * @return The text of the check box - */ - public String getText() { - return this.button.getText(); - } - - /** - * Returns whether the check box is disposed. - * - * @return <code>true</code> if the check box is disposed; <code>false</code> - * otherwise - */ - public boolean isDisposed() { - return this.button.isDisposed(); - } - - /** - * Returns whether the check box is enabled. - * - * @return <code>true</code> if the check box is enabled; <code>false</code> - * otherwise - */ - public boolean isEnabled() { - return this.button.isEnabled(); - } - - /** - * Returns the next state: - * UNCHECKED -> PARTIALLY_CHECKED - * PARTIALLY_CHECKED -> CHECKED - * CHECKED -> UNCHECKED - */ - private TriState nextState() { - switch (this.state) { - case UNCHECKED: - return TriState.PARTIALLY_CHECKED; - case PARTIALLY_CHECKED: - return TriState.CHECKED; - case CHECKED: - return TriState.UNCHECKED; - default: - throw new IllegalStateException("unknown state: " + this.state); - } - } - - /** - * Convenience method: Removes a dispose listener from the check box. - */ - public void removeDisposeListener(DisposeListener disposeListener) { - this.button.removeDisposeListener(disposeListener); - } - - /** - * Convenience method: Removes a selection listener from the check box. - */ - public void removeSelectionListener(SelectionListener selectionListener) { - this.button.removeSelectionListener(selectionListener); - } - - /** - * Changes the check box's enablement state. - * - * @param enabled <code>true</code> to enable the check box or <code>false</code> - * to disable it - */ - public void setEnabled(boolean enabled) { - this.button.setEnabled(enabled); - } - - /** - * Sets the check box's image. - * - * @param image The new image of the check box - */ - public void setImage(Image image) { - this.button.setImage(image); - } - - /** - * Changes the check box's selection state. - * - * @param selection Either <code>true</code> or <code>false</code> for - * checked and unchecked; or <code>null</code> for partially selected - */ - public void setSelection(Boolean selection) { - TriState old = this.state; - this.state = this.stateForBoolean(selection); - if (old != this.state) { - this.updateCheckBox(); - } - } - - /** - * Sets the check box's text. - * - * @param text The new text of the check box - */ - public void setText(String text) { - this.button.setText(text); - } - - /** - * Returns the tri-state corresponding to the boolean. - * - * @param selection The boolean to be converted to a tri-state - */ - private TriState stateForBoolean(Boolean selection) { - return (selection == null) ? TriState.PARTIALLY_CHECKED : - selection.booleanValue() ? TriState.CHECKED : TriState.UNCHECKED; - } - - /** - * Updates the selection state of the of the check box based on the tri-state - * value. - */ - void updateCheckBox() { - switch (this.state) { - case UNCHECKED: - this.button.setSelection(false); - this.button.setGrayed(false); - break; - case PARTIALLY_CHECKED: - this.button.setSelection(true); - this.button.setGrayed(true); - break; - case CHECKED: - this.button.setSelection(true); - this.button.setGrayed(false); - break; - default: - throw new IllegalStateException("unknown state: " + this.state); - } - } - - /** - * An enum containing the possible selections. - */ - enum TriState { - CHECKED, - PARTIALLY_CHECKED, - UNCHECKED - } - -} diff --git a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ValidatingDialog.java b/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ValidatingDialog.java deleted file mode 100644 index b257fac8a5..0000000000 --- a/common/plugins/org.eclipse.jpt.common.ui/src/org/eclipse/jpt/common/ui/internal/widgets/ValidatingDialog.java +++ /dev/null @@ -1,233 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 Oracle. 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: - * Oracle - initial API and implementation - ******************************************************************************/ -package org.eclipse.jpt.common.ui.internal.widgets; - -import java.util.ListIterator; -import org.eclipse.jface.dialogs.IMessageProvider; -import org.eclipse.jpt.utility.internal.node.Node; -import org.eclipse.jpt.utility.internal.node.Problem; -import org.eclipse.osgi.util.NLS; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.Shell; - -/** - * This dialog is similar to it superclass, <code>Dialog</code>, with - * the added value of an error message label below the main panel. A subclass - * can set this error message as needed so that it can inform the user something - * incorrect has been entered. - * <p> - * If there is an error message, it will be shown. If there is a warning - * message, it will only be shown if there is no error message. Warning messages - * have a different icon than error messages. - * - * @version 2.0 - * @since 2.0 - */ -public abstract class ValidatingDialog<T extends Node> extends Dialog<T> { - - /** - * Creates a new <code>ValidatingDialog</code>. - * - * @param parent The parent shell - */ - public ValidatingDialog(Shell parent) { - super(parent); - } - - /** - * Creates a new <code>ValidatingDialog</code>. - * - * @param parent The parent shell - * @param title The dialog's title - */ - public ValidatingDialog(Shell parent, String title) { - super(parent, title); - } - - /* - * (non-Javadoc) - */ - @Override - final Node.Validator buildValidator() { - return new Node.Validator() { - public void pause() { - } - - public void resume() { - } - - public void validate() { - ValidatingDialog.this.validate(); - } - }; - } - - /** - * Clears the messages from the description pane - */ - protected final void clearMessage(){ - setMessage(getDescription()); - } - - /** - * Clears the error message from the description pane. - */ - protected final void clearErrorMessage() { - setErrorMessage(null); - } - - /** - * Returns the description shown in the description pane. - * - * @return The description under the description's title - */ - protected String getDescription() { - return null; - } - - /** - * Returns the image shown in the description pane. - * - * @return The image of the description pane or <code>null</code> if none is - * required - */ - protected Image getDescriptionImage() { - return null; - } - - /** - * Returns the title of the description pane. - * - * @return The title shown in the description pane - */ - protected String getDescriptionTitle() { - return null; - } - - /* - * (non-Javadoc) - */ - @Override - protected Point getInitialSize() { - Point result = getShell().computeSize(SWT.DEFAULT, SWT.DEFAULT); - Point paneSize = getPane().getControl().computeSize(SWT.DEFAULT, SWT.DEFAULT); - int width = convertHorizontalDLUsToPixels(400); - result.x = Math.max(width, paneSize.x); - return result; - } - - /* - * (non-Javadoc) - */ - @Override - protected final boolean hasTitleArea() { - return true; - } - - /* - * (non-Javadoc) - */ - @Override - protected void initializeUI() { - - super.initializeUI(); - - // Update the description title - String descriptionTitle = getDescriptionTitle(); - - if (descriptionTitle != null) { - setTitle(descriptionTitle); - } - - // Update the description title - String description = getDescription(); - - if (description != null) { - setMessage(description); - } - - // Update the description image - Image image = getDescriptionImage(); - - if (image != null) { - setTitleImage(image); - } - } - - /** - * Updates the description pane by showing the given error message and format - * the text with the given list of arguments if any exists. - * - * @param errorMessage The error message to show in the description pane - * @param arguments The list of arguments used to format the error message - */ - protected final void setErrorMessage(String errorMessage, Object... arguments) { - setErrorMessage(NLS.bind(errorMessage, arguments)); - } - - /** - * Updates the description pane by showing the given warning message and format - * the text with the given list of arguments if any exists. - * - * @param warningMessage The warning message to show in the description pane - * @param arguments The list of arguments used to format the error message - */ - - protected final void setWarningMessage(String warningMessage, Object... arguments) { - setMessage(NLS.bind(warningMessage, arguments), IMessageProvider.WARNING); - } - - /** - * Updates the error message, either shows the first error problem or hides - * the error pane. If the progress bar is shown, then the error message will - * not be shown. - */ - private void updateMessage() { - if (getSubject().branchProblemsSize() == 0) { - clearMessage(); - } else { - for (ListIterator<Problem> problems = getSubject().branchProblems(); problems.hasNext();){ - Problem problem = problems.next(); - if (problem.messageType() == IMessageProvider.ERROR){ - this.setErrorMessage(problem.messageKey(), problem.messageArguments()); - } - else if (problem.messageType() == IMessageProvider.WARNING){ - this.setWarningMessage(problem.messageKey(), problem.messageArguments()); - } - } - } - if (!this.containsErrorMessage()){ - clearErrorMessage(); - } - } - - public final boolean containsErrorMessage(){ - boolean error = false; - for (ListIterator<Problem> problems = getSubject().branchProblems(); problems.hasNext();){ - Problem problem = problems.next(); - if (problem.messageType() ==IMessageProvider.ERROR){ - error = true; - } - } - return error; - } - /** - * Validates the state object and based on its status, update the description - * pane to show the first error if any exists and update the enablement of - * the OK button. - */ - private void validate() { - getSubject().validateBranch(); - updateMessage(); - getButton(OK).setEnabled(!containsErrorMessage()); - } -}
\ No newline at end of file |