/*****************************************************************************
* Copyright (c) 2008 CEA LIST.
*
*
* 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:
* Chokri Mraidha (CEA LIST) Chokri.Mraidha@cea.fr - Initial API and implementation
* Patrick Tessier (CEA LIST) Patrick.Tessier@cea.fr - modification
*
*****************************************************************************/
package org.eclipse.papyrus.uml.profile.ui.dialogs;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Iterator;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.jface.bindings.keys.KeyStroke;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.fieldassist.ContentProposalAdapter;
import org.eclipse.jface.fieldassist.IContentProposal;
import org.eclipse.jface.fieldassist.IContentProposalListener;
import org.eclipse.jface.fieldassist.IContentProposalProvider;
import org.eclipse.jface.fieldassist.TextContentAdapter;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.papyrus.uml.profile.ImageManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
/**
* Generic dialog that allows user to add/remove items to an element, with
* a field with code assist to choose element.
*/
public class ChooseSetAssistedDialog extends Dialog implements IChooseDialog {
/**
* debug channel.
*/
protected static final int channel = 19;
/**
* Label above possible element list.
*/
protected String possibleText = "Choose Element";
/**
* Label above selected elements list.
*/
protected String selectedText = "Selected Element(s)";
// buttons
/**
* add button.
*/
protected Button addButton;
/**
* remove button.
*/
protected Button removeButton;
/**
* up button.
*/
protected Button upButton;
/**
* down button.
*/
protected Button downButton;
// listeners for buttons
/**
* listener for the add button.
*/
protected MouseListener addButtonListener = null;
/**
* listener for the delete button.
*/
protected MouseListener deleteButtonListener = null;
/**
* listener for the up button.
*/
protected MouseListener upButtonListener = null;
/**
* listener for the down button.
*/
protected MouseListener downButtonListener = null;
/**
* listener for the items to add the item from the possible table (action on double click).
*/
protected MouseListener addItemListener = null;
/**
* listener for the items to remove the item from the selectedElement table (action on double click).
*/
protected MouseListener removeItemListener = null;
/**
* listener for the text control that do action when Carriage Return is pressed.
*/
protected KeyTextListener keyTextListener = null;
// tables that displays elements selected or available
/**
* table for possible elements.
*/
protected Table possibleElementsTable;
/**
* table for selected elements.
*/
protected Table selectedElementsTable;
/**
* Tabler viewer associated to the Table of selected elements.
*/
protected TableViewer selectedElementsTableViewer;
/**
* Tabler viewer associated to the Table of possible elements.
*/
protected TableViewer possibleElementsTableViewer;
/**
* label provider for the table viewers.
*/
protected LabelProvider labelProvider;
/**
* {@link DecoratedContentProposalProvider} for the assisted text area.
*/
protected DecoratedContentProposalProvider decoratedContentProposalProvider;
/**
* List of selected elements.
*/
protected ElementList selectedElementList = new ElementList();
/**
* List of possible elements.
*/
protected ElementList possibleElementList = new ElementList();
/**
* Text control to select elements from possible element list.
*/
protected Text possibleElementsText;
// label ubove tables
/**
* Label ubove possible elements table.
*/
protected Label possibleElementsLabel;
/**
* Label ubove possible elements table.
*/
protected Label selectedElementsLabel;
/**
* The Constant IMG_UP_ARROW.
*/
private static final Image IMG_UP_ARROW = ImageManager.IMG_UP;
/**
* The Constant IMG_DOWN_ARROW.
*/
private static final Image IMG_DOWN_ARROW = ImageManager.IMG_DOWN;
/**
* The Constant IMG_LEFT_ARROW.
*/
private static final Image IMG_LEFT_ARROW = ImageManager.IMG_LEFT;
/**
* The Constant IMG_RIGHT_ARROW.
*/
private static final Image IMG_RIGHT_ARROW = ImageManager.IMG_RIGHT;
/**
* value that will be available after dialog is closed.
*/
protected Object value = null;
/**
* Creates a new instance of this class.
*
* @param parentShell
* the parent shell for this dialog
* @param selectedText
* the selected text
* @param possibleText
* the possible text
*/
public ChooseSetAssistedDialog(Shell parentShell, String possibleText, String selectedText) {
super(parentShell);
// add the resize ability to the window
setShellStyle(SWT.RESIZE | super.getShellStyle());
// set the text for labels ubove elements lists
if(possibleText != null) {
this.possibleText = possibleText; //set possible Text
}
if(selectedText != null) {
this.selectedText = selectedText;//set selected Label
}
// create listeners
this.addButtonListener = new AddButtonListener();
this.deleteButtonListener = new RemoveButtonListener();
this.upButtonListener = new UpButtonListener();
this.downButtonListener = new DownButtonListener();
this.addItemListener = new AddItemListener();
this.removeItemListener = new RemoveItemListener();
this.keyTextListener = new KeyTextListener();
}
/*
* (non-Javadoc)
*
* @see com.cea.papyrus.ui.dialogs.ChooseSetDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
*/
/**
* Creates the buttons for button bar.
*
* @param parent
* the parent
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
// remove default button = OK (enter pressed)
createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, false);
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
/**
* Creates the dialog area.
*
* @param parent
* the parent
*
* @return the control
*/
@Override
protected Control createDialogArea(Composite parent) {
//place all composites
Composite comp = (Composite)super.createDialogArea(parent);
FormLayout layout = new FormLayout();
comp.setLayout(layout);
// create elements and layout them
createElements(comp);
setLayoutData();
// add listenersS
addButtonListeners();
// set fonts for elements that require fonts
setFonts();
// set table viewers
setTableViewers();
installContentAssistantProvider();
return comp;
}
/**
* Sets the table viewers.
*/
private void setTableViewers() {
possibleElementsTableViewer = new TableViewer(possibleElementsTable);
possibleElementsTableViewer.setLabelProvider(getLabelProvider());
possibleElementsTableViewer.setContentProvider(new PossibleElementsContentProvider());
possibleElementsTableViewer.setInput(possibleElementList);
selectedElementsTableViewer = new TableViewer(selectedElementsTable);
selectedElementsTableViewer.setLabelProvider(getLabelProvider());
selectedElementsTableViewer.setContentProvider(new SelectedElementsContentProvider());
selectedElementsTableViewer.setInput(selectedElementList);
}
/**
* Create elements in the dialog.
*
* @param comp
* the parent composite
*/
private void createElements(Composite comp) {
// buttons
addButton = new Button(comp, SWT.CENTER);
addButton.setImage(IMG_RIGHT_ARROW);
removeButton = new Button(comp, SWT.CENTER);
removeButton.setImage(IMG_LEFT_ARROW);
upButton = new Button(comp, SWT.CENTER);
upButton.setImage(IMG_UP_ARROW);
downButton = new Button(comp, SWT.CENTER);
downButton.setImage(IMG_DOWN_ARROW);
// texts
possibleElementsLabel = new Label(comp, SWT.CENTER);
possibleElementsLabel.setText(possibleText);
selectedElementsLabel = new Label(comp, SWT.CENTER);
selectedElementsLabel.setText(selectedText);
// lists
possibleElementsTable = new Table(comp, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
possibleElementsTable.addMouseListener(addItemListener);
selectedElementsTable = new Table(comp, SWT.MULTI | SWT.V_SCROLL | SWT.BORDER);
selectedElementsTable.addMouseListener(removeItemListener);
possibleElementsText = new Text(comp, SWT.BORDER);
possibleElementsText.addKeyListener(keyTextListener);
}
/**
* Apply Font to elements that display text.
*/
private void setFonts() {
// FontData[] fontdata={new FontData("Arial", 9, SWT.NORMAL)};
selectedElementsLabel.setFont(JFaceResources.getDialogFont());
selectedElementsTable.setFont(JFaceResources.getDialogFont());
possibleElementsLabel.setFont(JFaceResources.getDialogFont());
possibleElementsTable.setFont(JFaceResources.getDialogFont());
}
/**
* Sets the layout data.
*/
private void setLayoutData() {
// set data to the left elements: possible elements
// Label: possible elements title
FormData data;
data = new FormData();
data.top = new FormAttachment(0, ITabbedPropertyConstants.VSPACE);
data.left = new FormAttachment(0, ITabbedPropertyConstants.HSPACE);
possibleElementsLabel.setLayoutData(data);
// buttons
// add button
data = new FormData();
data.top = new FormAttachment(40, 0);
data.right = new FormAttachment(50, -(ITabbedPropertyConstants.HSPACE) / 2);
addButton.setLayoutData(data);
// right button
data = new FormData();
data.top = new FormAttachment(addButton, ITabbedPropertyConstants.VSPACE, SWT.BOTTOM);
data.right = new FormAttachment(50, -(ITabbedPropertyConstants.HSPACE) / 2);
removeButton.setLayoutData(data);
// text assist field
data = new FormData();
data.left = new FormAttachment(0, ITabbedPropertyConstants.HSPACE);
data.right = new FormAttachment(addButton, -ITabbedPropertyConstants.HSPACE);
data.bottom = new FormAttachment(100, -ITabbedPropertyConstants.VSPACE);
possibleElementsText.setLayoutData(data);
// List: possible elements list
data = new FormData();
data.height = 200;
data.width = 300;
data.top = new FormAttachment(possibleElementsLabel, ITabbedPropertyConstants.VSPACE);
data.left = new FormAttachment(0, ITabbedPropertyConstants.HSPACE);
data.bottom = new FormAttachment(possibleElementsText, -ITabbedPropertyConstants.VSPACE);
data.right = new FormAttachment(addButton, -ITabbedPropertyConstants.HSPACE);
possibleElementsTable.setLayoutData(data);
// Right part
// Label: selected elements title
data = new FormData();
data.top = new FormAttachment(0, ITabbedPropertyConstants.HSPACE);
data.left = new FormAttachment(addButton, ITabbedPropertyConstants.HSPACE);
selectedElementsLabel.setLayoutData(data);
// Label: selected elements list
data = new FormData();
data.left = new FormAttachment(addButton, ITabbedPropertyConstants.HSPACE);
data.top = new FormAttachment(selectedElementsLabel, ITabbedPropertyConstants.VSPACE);
data.right = new FormAttachment(upButton, -ITabbedPropertyConstants.HSPACE);
data.bottom = new FormAttachment(100, -ITabbedPropertyConstants.VSPACE);
selectedElementsTable.setLayoutData(data);
// up button
data = new FormData();
data.top = new FormAttachment(40, 0);
data.right = new FormAttachment(100, -ITabbedPropertyConstants.HSPACE);
upButton.setLayoutData(data);
// down button
data = new FormData();
data.top = new FormAttachment(upButton, ITabbedPropertyConstants.HSPACE, SWT.BOTTOM);
data.right = new FormAttachment(100, -ITabbedPropertyConstants.HSPACE);
downButton.setLayoutData(data);
}
/**
* Sets the focus.
*/
public void setFocus() {
possibleElementsText.setFocus();
}
/**
* Add listeners to buttons.
*/
private void addButtonListeners() {
addButton.addMouseListener(addButtonListener);
removeButton.addMouseListener(deleteButtonListener);
upButton.addMouseListener(upButtonListener);
downButton.addMouseListener(downButtonListener);
}
/**
* Install content assistant provider.
*/
protected void installContentAssistantProvider() {
KeyStroke keyStroke = null;
char[] autoActivationCharacters = null;
int autoActivationDelay = 500;
ContentProposalAdapter adapter = new ContentProposalAdapter(possibleElementsText, new TextContentAdapter(), getContentProposalProvider(), keyStroke, autoActivationCharacters);
adapter.setAutoActivationDelay(autoActivationDelay);
// filter proposals as keys are pressed and proposals popup is present
adapter.setFilterStyle(ContentProposalAdapter.FILTER_CUMULATIVE);
// replace all text
adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE);
//this listener is activated when a stereotype item in popup menu is selected and
//the popup menu is closed. It is used to add the selected stereotype in to the right hand side part
//of the dialog, so that uers can economize one key hit.
//cf. proposalAccepted() operation in KeyTextListener
adapter.addContentProposalListener(keyTextListener);
}
/*
* (non-Javadoc)
*
* @see com.cea.papyrus.ui.dialogs.IChooseDialog#getValue()
*/
/**
* Gets the value.
*
* @return the value
*/
public Object getValue() {
return value;
}
/**
* Behavior for the add button.
*/
protected void runActionAdd() {
IStructuredSelection selection = (IStructuredSelection)possibleElementsTableViewer.getSelection();
Iterator it = selection.iterator();
while(it.hasNext()) {
runActionAdd(it.next());
}
}
/**
* adds the element to the list of selected elements and remove it from the
* list of possible elements.
*
* @param element
* the element to add to the selected elements list
*/
public void runActionAdd(Object element) {
// remove to possible list
possibleElementList.removeElement(element);
// add to selected list
selectedElementList.addElement(element);
}
/**
* Behavior for the delete button.
*/
protected void runActionRemove() {
IStructuredSelection selection = (IStructuredSelection)selectedElementsTableViewer.getSelection();
Iterator it = selection.iterator();
while(it.hasNext()) {
runActionRemove(it.next());
}
}
/**
* adds the element to the list of possible elements and remove it from the
* list of selected elements.
*
* @param element
* the element to remove from the selected elements list
*/
protected void runActionRemove(Object element) {
// remove to selected list
selectedElementList.removeElement(element);
// add to possible list
possibleElementList.addElement(element);
}
/**
* Behavior for the up button.
*/
protected void runActionUp() {
IStructuredSelection selection = (IStructuredSelection)selectedElementsTableViewer.getSelection();
Iterator it = selection.iterator();
while(it.hasNext()) {
runActionUp(it.next());
}
}
/**
* Moves the given element up in the selected element list.
*
* @param element
* the element to move
*/
protected void runActionUp(Object element) {
selectedElementList.moveElementUp(element);
}
/**
* Behavior for the bottom button.
*/
protected void runActionDown() {
IStructuredSelection selection = (IStructuredSelection)selectedElementsTableViewer.getSelection();
Iterator it = selection.iterator();
while(it.hasNext()) {
runActionDown(it.next());
}
}
/**
* Moves the given element down in the selected element list.
*
* @param element
* the element to move
*/
protected void runActionDown(Object element) {
selectedElementList.moveElementDown(element);
}
/**
* Behavior when item is double clicked in the possible element list.
*
* @param item
* the item
*/
protected void runAddItem(TableItem item) {
if(item != null) {
runActionAdd(item.getData());
}
}
/**
* Behavior when item is double clicked in the selected element list.
*
* @param item
* the item
*/
protected void runRemoveItem(TableItem item) {
if(item != null) {
runActionRemove(item.getData());
}
}
/**
* adds the element to the selected element list, given its name.
*
* @param name
* the name of the element to add
*/
protected void runAddElement(String name) {
}
/**
* Returns the default label provider.
*
* @return the default label provider
*/
protected ILabelProvider getLabelProvider() {
if(labelProvider == null) {
labelProvider = new LabelProvider();
}
return labelProvider;
}
/**
* Returns the default content proposal provider which is added to the Text
* area (Singleton pattern).
*
* @return the content proposal provider which is added to the Text area
*/
protected IContentProposalProvider getContentProposalProvider() {
if(decoratedContentProposalProvider == null) {
decoratedContentProposalProvider = new DecoratedContentProposalProvider();
}
return decoratedContentProposalProvider;
}
/**
* Checks if the element is selectable or not.
*
* @param text
* the text
*
* @return <code>true</code> if the element is selectable
*/
protected boolean isSelectableElement(String text) {
return false;
}
/**
* Returns the list of selected elements.
*
* @return the list of selected elements
*/
public ArrayList getSelectedElements() {
return selectedElementList.getElements();
}
///////////////////////////////////////////////////////////////////////////
// Inner classes: listener for the buttons and items of the list
///////////////////////////////////////////////////////////////////////////
/**
* listener of the button to add an element from possiblelist into selectedList.
*
* @author Patrick Tessier
*/
protected class AddButtonListener implements MouseListener {
/**
* The Constructor.
*/
public AddButtonListener() {
}
/**
* Mouse double click.
*
* @param e
* the e
*/
public void mouseDoubleClick(MouseEvent e) {
}
/**
* Mouse down.
*
* @param e
* the e
*/
public void mouseDown(MouseEvent e) {
}
/**
* Mouse up.
*
* @param e
* the e
*/
public void mouseUp(MouseEvent e) {
runActionAdd();
}
};
/**
* Listener of the button to move an element from selectedList into possiblelist.
*
* @author Patrick Tessier
*/
protected class RemoveButtonListener implements MouseListener {
/**
* The Constructor.
*/
public RemoveButtonListener() {
}
/**
* Mouse double click.
*
* @param e
* the e
*/
public void mouseDoubleClick(MouseEvent e) {
}
/**
* Mouse down.
*
* @param e
* the e
*/
public void mouseDown(MouseEvent e) {
}
/**
* Mouse up.
*
* @param e
* the e
*/
public void mouseUp(MouseEvent e) {
runActionRemove();
}
};
/**
* listener of the button to move up an element.
*
* @author Patrick Tessier
*/
protected class UpButtonListener implements MouseListener {
/**
* The Constructor.
*/
public UpButtonListener() {
}
/**
* Mouse double click.
*
* @param e
* the e
*/
public void mouseDoubleClick(MouseEvent e) {
}
/**
* Mouse down.
*
* @param e
* the e
*/
public void mouseDown(MouseEvent e) {
}
/**
* Mouse up.
*
* @param e
* the e
*/
public void mouseUp(MouseEvent e) {
runActionUp();
}
};
/**
* listener of the button to move down an element.
*
* @author Patrick Tessier
*/
protected class DownButtonListener implements MouseListener {
/**
* The Constructor.
*/
public DownButtonListener() {
}
/**
* Mouse double click.
*
* @param e
* the e
*/
public void mouseDoubleClick(MouseEvent e) {
}
/**
* Mouse down.
*
* @param e
* the e
*/
public void mouseDown(MouseEvent e) {
}
/**
* Mouse up.
*
* @param e
* the e
*/
public void mouseUp(MouseEvent e) {
runActionDown();
}
};
/**
* listener to add an item from the table.
*
* @author Remi Schnekenburger
*/
protected class AddItemListener implements MouseListener {
/**
* The Constructor.
*/
public AddItemListener() {
}
/**
* Mouse double click.
*
* @param e
* the e
*/
public void mouseDoubleClick(MouseEvent e) {
runAddItem(getItem(e));
}
/**
* Mouse down.
*
* @param e
* the e
*/
public void mouseDown(MouseEvent e) {
}
/**
* Mouse up.
*
* @param e
* the e
*/
public void mouseUp(MouseEvent e) {
}
};
/**
* listener to remove an item from the table.
*
* @author Remi Schnekenburger
*/
protected class RemoveItemListener implements MouseListener {
/**
* The Constructor.
*/
public RemoveItemListener() {
}
/**
* Mouse double click.
*
* @param e
* the e
*/
public void mouseDoubleClick(MouseEvent e) {
runRemoveItem(getItem(e));
}
/**
* Mouse down.
*
* @param e
* the e
*/
public void mouseDown(MouseEvent e) {
}
/**
* Mouse up.
*
* @param e
* the e
*/
public void mouseUp(MouseEvent e) {
}
};
/**
* Listener for the {@link Text} area. On "Carriage Return"key event, tries
* to add the element entered in the text area in the selected element list
* and clear the Text area.
*
* @author Remi Schnekenburger
*/
protected class KeyTextListener implements KeyListener, IContentProposalListener {
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.events.KeyListener#keyPressed(org.eclipse.swt.events.KeyEvent)
*/
/**
* Key pressed.
*
* @param e
* the e
*/
public void keyPressed(KeyEvent e) {
// if "enter" pressed and text is valid, add element to selected elements
if(e.keyCode == SWT.CR) {
if(isSelectableElement(possibleElementsText.getText())) {
runAddElement(possibleElementsText.getText());
possibleElementsText.setText("");
}
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events.KeyEvent)
*/
/**
* Key released.
*
* @param e
* the e
*/
public void keyReleased(KeyEvent e) {
// do nothing
}
/**
* {@inheritDoc}
*/
public void proposalAccepted(IContentProposal proposal) {
if(isSelectableElement(proposal.getContent())) {
runAddElement(proposal.getContent());
}
}
}
/**
* Returns the item on which a mouse event happened.
*
* @param event
* the mouse event that happened on the item
*
* @return the retrieved item
*/
protected TableItem getItem(MouseEvent event) {
TableItem[] items = ((Table)event.getSource()).getSelection();
if(items.length > 0) {
return items[0];
}
return null;
}
///////////////////////////////////////////////////////////////////////////
// CONTENT PROPOSALS
///////////////////////////////////////////////////////////////////////////
/**
* The Class DecoratedContentProposal.
*/
protected class DecoratedContentProposal implements IContentProposal, Comparable<DecoratedContentProposal> {
/**
* The label provider.
*/
protected LabelProvider labelProvider;
/**
* The element.
*/
protected Object element;
/**
* Default Constructor.
*
* @param element
* the element
* @param labelProvider
* the {@link LabelProvider} to decorate text
*/
public DecoratedContentProposal(Object element, LabelProvider labelProvider) {
this.labelProvider = labelProvider;
this.element = element;
}
/**
* Gets the content.
*
* @return the content
*/
public String getContent() {
return labelProvider.getText(element);
}
/**
* Gets the cursor position.
*
* @return the cursor position
*/
public int getCursorPosition() {
return labelProvider.getText(element).length();
}
/**
* Gets the description.
*
* @return the description
*/
public String getDescription() {
return null;
}
/**
* Gets the label.
*
* @return the label
*/
public String getLabel() {
return labelProvider.getText(element);
}
/**
* Gets the image.
*
* @return the image
*/
public Image getImage() {
return labelProvider.getImage(element);
}
/**
* Compare to.
*
* @param o
* the o
*
* @return the int
*/
public int compareTo(DecoratedContentProposal o) {
return this.getLabel().compareTo(o.getLabel());
}
}
/**
* Base class to propose content with a label and an image.
* NOTA: quick asssist processor does not actually support decorated
* proposals. Should be implemented...
*
* @author Remi Schnekenburger
*/
protected class DecoratedContentProposalProvider implements IContentProposalProvider {
/**
* Gets the proposals.
*
* @param contents
* the contents
* @param position
* the position
*
* @return the proposals
*/
public DecoratedContentProposal[] getProposals(String contents, int position) {
// give all proposals for possible elements.
return new DecoratedContentProposal[0];
}
}
/**
* Content provider for the possible elements list.
*/
class PossibleElementsContentProvider implements IStructuredContentProvider, IListViewer {
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
/**
* Input changed.
*
* @param newInput
* the new input
* @param oldInput
* the old input
* @param v
* the v
*/
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
if(newInput != null) {
((ElementList)newInput).addChangeListener(this);
}
if(oldInput != null) {
((ElementList)oldInput).removeChangeListener(this);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
/**
* Dispose.
*/
public void dispose() {
possibleElementList.removeChangeListener(this);
}
// Return the tasks as an array of Objects
/**
* Gets the elements.
*
* @param parent
* the parent
*
* @return the elements
*/
public Object[] getElements(Object parent) {
return possibleElementList.getElements().toArray();
}
/*
* (non-Javadoc)
*
* @see com.cea.papyrus.ui.dialogs.IListViewer#addElement(java.lang.Object)
*/
/**
* Adds the element.
*
* @param element
* the element
*/
public void addElement(Object element) {
possibleElementsTableViewer.add(element);
}
/*
* (non-Javadoc)
*
* @see com.cea.papyrus.ui.dialogs.IListViewer#removeElement(java.lang.Object)
*/
/**
* Removes the element.
*
* @param element
* the element
*/
public void removeElement(Object element) {
possibleElementsTableViewer.remove(element);
}
/*
* (non-Javadoc)
*
* @see com.cea.papyrus.ui.dialogs.IListViewer#updateElement(java.lang.Object)
*/
/**
* Update element.
*
* @param element
* the element
*/
public void updateElement(Object element) {
possibleElementsTableViewer.refresh();
}
}
/**
* Content provider for the selected elements list.
*/
class SelectedElementsContentProvider implements IStructuredContentProvider, IListViewer {
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
*/
/**
* Input changed.
*
* @param newInput
* the new input
* @param oldInput
* the old input
* @param v
* the v
*/
public void inputChanged(Viewer v, Object oldInput, Object newInput) {
if(newInput != null) {
((ElementList)newInput).addChangeListener(this);
}
if(oldInput != null) {
((ElementList)oldInput).removeChangeListener(this);
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.IContentProvider#dispose()
*/
/**
* Dispose.
*/
public void dispose() {
selectedElementList.removeChangeListener(this);
}
// Return the tasks as an array of Objects
/**
* Gets the elements.
*
* @param parent
* the parent
*
* @return the elements
*/
public Object[] getElements(Object parent) {
return selectedElementList.getElements().toArray();
}
/*
* (non-Javadoc)
*
* @see com.cea.papyrus.ui.dialogs.IListViewer#addElement(java.lang.Object)
*/
/**
* Adds the element.
*
* @param element
* the element
*/
public void addElement(Object element) {
selectedElementsTableViewer.add(element);
}
/*
* (non-Javadoc)
*
* @see com.cea.papyrus.ui.dialogs.IListViewer#removeElement(java.lang.Object)
*/
/**
* Removes the element.
*
* @param element
* the element
*/
public void removeElement(Object element) {
selectedElementsTableViewer.remove(element);
}
/*
* (non-Javadoc)
*
* @see com.cea.papyrus.ui.dialogs.IListViewer#updateElement(java.lang.Object)
*/
/**
* Update element.
*
* @param element
* the element
*/
public void updateElement(Object element) {
selectedElementsTableViewer.refresh();
}
}
/**
* Long running class to set input.
*
* @see WorkspaceModifyOperation
*/
private class InputOperation implements IRunnableWithProgress {
/**
*
*
* @param monitor
*
* @throws CoreException
* @throws InterruptedException
* @throws InvocationTargetException
*/
protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
// should run in a separate process
possibleElementsTableViewer = new TableViewer(possibleElementsTable);
possibleElementsTableViewer.setLabelProvider(getLabelProvider());
possibleElementsTableViewer.setContentProvider(new PossibleElementsContentProvider());
possibleElementsTableViewer.setInput(possibleElementList);
selectedElementsTableViewer = new TableViewer(selectedElementsTable);
selectedElementsTableViewer.setLabelProvider(getLabelProvider());
selectedElementsTableViewer.setContentProvider(new SelectedElementsContentProvider());
selectedElementsTableViewer.setInput(selectedElementList);
}
/**
* The <code>WorkspaceModifyOperation</code> implementation of this <code>IRunnableWithProgress</code> method initiates a batch of changes by
* invoking the <code>execute</code> method as a workspace runnable
* (<code>IWorkspaceRunnable</code>).
*
* @param monitor
*
* @throws InterruptedException
* @throws InvocationTargetException
*/
public synchronized final void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
final InvocationTargetException[] iteHolder = new InvocationTargetException[1];
try {
IWorkspaceRunnable workspaceRunnable = new IWorkspaceRunnable() {
public void run(IProgressMonitor pm) throws CoreException {
try {
execute(pm);
} catch (InvocationTargetException e) {
// Pass it outside the workspace runnable
iteHolder[0] = e;
} catch (InterruptedException e) {
// Re-throw as OperationCanceledException, which will be
// caught and re-thrown as InterruptedException below.
throw new OperationCanceledException(e.getMessage());
}
// CoreException and OperationCanceledException are propagated
}
};
ResourcesPlugin.getWorkspace().run(workspaceRunnable, monitor);
} catch (CoreException e) {
throw new InvocationTargetException(e);
} catch (OperationCanceledException e) {
throw new InterruptedException(e.getMessage());
}
// Re-throw the InvocationTargetException, if any occurred
if(iteHolder[0] != null) {
throw iteHolder[0];
}
}
}
}