/***************************************************************************** * 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.properties.profile.ui.compositesformodel; import org.eclipse.gef.commands.CommandStack; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.papyrus.uml.profile.ImageManager; import org.eclipse.papyrus.uml.profile.tree.ProfileElementTreeViewer; import org.eclipse.papyrus.uml.profile.tree.PropertyValueTreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CLabel; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; 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.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory; import org.eclipse.uml2.uml.Element; /** * Base class for a complex section composite. This composite has a label, a * tree that describes a tree structure, and four buttons on the side of the * table to add an element into the tree, remove selected element(s), move up * or down the selected element. * * @author Remi SCHNEKENBURGER */ public abstract class DecoratedTreeComposite extends Composite implements ISectionComposite { // child composites for the table composite // /** main composite of this complex composite */ // protected Composite composite; /** * Label above the table. */ protected CLabel label; /** * Table that displays a property for the current element. */ protected Tree tree; /** * The tree viewer. */ protected TreeViewer treeViewer; /** * Button that adds an element. */ protected Button addButton; /** * Button that removes an element. */ protected Button removeButton; /** * button that moves the element up. */ protected Button upButton; /** * button that moves the element down. */ protected Button downButton; // listeners for buttons /** * Listener for the add button. */ protected MouseListener addButtonlistener; /** * Listener for the delete button. */ protected MouseListener removeButtonlistener; /** * Listener for the up button. */ protected MouseListener upButtonlistener; /** * Listener for the down button. */ protected MouseListener downButtonlistener; /** * */ protected Listener treeListener; /** * Element selected in the Papyrus modeler. */ protected Element element; // Construction parameters for the composite /** * text of the label. */ protected String name; /** * returns the element that is selected in Papyrus tool, for which * properties are displayed in the property section. * * @return the element */ public Element getElement() { return element; } /** * Sets the element that holds property displyed in property section. * * @param element * the element to set */ public void setElement(Element element) { this.element = element; } /** * Constructor. * * @param style * @param isStereotypeTree * @param name * text of the Label on the top left of this composite * @param parent */ public DecoratedTreeComposite(Composite parent, int style, String name, boolean isStereotypeTree) { super(parent, style); this.name = name; this.setLayout(new FormLayout()); this.addButtonlistener = new AddButtonlistener(); this.removeButtonlistener = new RemoveButtonlistener(); this.upButtonlistener = new UpButtonlistener(); this.downButtonlistener = new DownButtonlistener(); if(isStereotypeTree) { treeViewer = new ProfileElementTreeViewer(this); } else { // Property tree treeViewer = new PropertyValueTreeViewer(this); } } /* * (non-Javadoc) * * @see com.cea.papyrus.ui.composites.ISectionComposite#createContent(org.eclipse.swt.widgets.Composite, * org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory) */ /** * * * @param factory * @param parent * * @return */ public Composite createContent(Composite parent, TabbedPropertySheetWidgetFactory factory) { FormData data; ///////////////////////////////////////////////////////////////////////////// // Create and place button vertically on the left side // Button : Add Element // Button Delete Element removeButton = factory.createButton(this, "", SWT.PUSH); removeButton.setVisible(true); removeButton.setImage(ImageManager.IMG_DELETE); removeButton.setToolTipText("Delete selected element(s)"); data = new FormData(); data.top = new FormAttachment(0, 0); data.right = new FormAttachment(100, -ITabbedPropertyConstants.HSPACE); removeButton.setLayoutData(data); removeButton.addMouseListener(removeButtonlistener); addButton = factory.createButton(this, "", SWT.PUSH); addButton.setVisible(true); addButton.setImage(ImageManager.IMG_ADD); addButton.setToolTipText("Add a new element"); data = new FormData(); data.top = new FormAttachment(0, 0); data.right = new FormAttachment(removeButton, -ITabbedPropertyConstants.HSPACE); addButton.setLayoutData(data); addButton.addMouseListener(addButtonlistener); // Button Up upButton = factory.createButton(this, "", SWT.PUSH); upButton.setVisible(true); upButton.setImage(ImageManager.IMG_UP); upButton.setToolTipText("Up"); data = new FormData(); data.top = new FormAttachment(0, 0); data.right = new FormAttachment(addButton, -ITabbedPropertyConstants.HSPACE); upButton.setLayoutData(data); upButton.addMouseListener(upButtonlistener); // Button Down downButton = factory.createButton(this, "", SWT.PUSH); downButton.setVisible(true); downButton.setImage(ImageManager.IMG_DOWN); downButton.setToolTipText("Down"); data = new FormData(); data.top = new FormAttachment(0, 0); data.right = new FormAttachment(upButton, -ITabbedPropertyConstants.HSPACE); downButton.setLayoutData(data); downButton.addMouseListener(downButtonlistener); // Create label label = factory.createCLabel(this, name + ":", SWT.NONE); label.setLayout(new FormLayout()); data = new FormData(); data.left = new FormAttachment(0, ITabbedPropertyConstants.HSPACE); data.right = new FormAttachment(downButton, -ITabbedPropertyConstants.HSPACE - 30); data.top = new FormAttachment(0, 0); label.setLayoutData(data); ///////////////////////////////////////////////////////////////////////////// // Create and place Table tree = treeViewer.getTree(); tree.setLayout(new FormLayout()); tree.setVisible(true); tree.addListener(SWT.MouseDoubleClick, treeListener = new EditItemListener()); data = new FormData(); data.top = new FormAttachment(addButton, ITabbedPropertyConstants.VSPACE); data.left = new FormAttachment(0, ITabbedPropertyConstants.HSPACE); data.right = new FormAttachment(100, -ITabbedPropertyConstants.HSPACE); data.bottom = new FormAttachment(100, -ITabbedPropertyConstants.VSPACE); tree.setLayoutData(data); return this; } /* * (non-Javadoc) * * @see com.cea.papyrus.ui.composites.ISectionComposite#refresh() */ /** * */ public void refresh() { } // /** // * Sets the layout data to the main composite of this complex element // * @param data the new LayoutData // */ // public void setLayoutData(Object data) { // composite.setLayoutData(data); // } // // public Composite getMainComposite() { // return composite; // } /** * Returns the CommmandStack of the current editor. * * @return the CommmandStack of the current editor */ public CommandStack getCommandStack() { if(getActiveEditor() != null) { return (CommandStack)getActiveEditor().getAdapter(CommandStack.class); } return null; } /** * Returns the current Editor. * * @return the current editor */ public IEditorPart getActiveEditor() { return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); } /** * action executed when the add button is pressed. */ public void addButtonPressed() { } /** * action executed when the remove button is pressed. */ public abstract void removeButtonPressed(); /** * action executed when the up button is pressed. */ public abstract void upButtonPressed(); /** * action executed when the down button is pressed. */ public abstract void downButtonPressed(); /** * action executed when a table item is edited. * * @param item */ public abstract void editItem(TreeItem item); /** * Listener for the Add Button * Specific behavior is implemented in {@link DecoratedTreeComposite#addButtonPressed()}. * * @author Remi SCHNEKENBURGER */ private class AddButtonlistener implements MouseListener { /** * * * @param e */ public void mouseDoubleClick(MouseEvent e) { // do nothing } /** * * * @param e */ public void mouseDown(MouseEvent e) { // do nothing } /** * * * @param e */ public void mouseUp(MouseEvent e) { addButtonPressed(); refresh(); } } /** * Listener for the Remove Button * Specific behavior is implemented in {@link DecoratedTreeComposite#removeButtonPressed()}. * * @author Remi SCHNEKENBURGER */ private class RemoveButtonlistener implements MouseListener { /** * * * @param e */ public void mouseDoubleClick(MouseEvent e) { // do nothing } /** * * * @param e */ public void mouseDown(MouseEvent e) { // do nothing } /** * * * @param e */ public void mouseUp(MouseEvent e) { removeButtonPressed(); refresh(); } } /** * Listener for the Up Button * Specific behavior is implemented in {@link DecoratedTreeComposite#upButtonPressed()}. * * @author Remi SCHNEKENBURGER */ private class UpButtonlistener implements MouseListener { /** * * * @param e */ public void mouseDoubleClick(MouseEvent e) { // do nothing } /** * * * @param e */ public void mouseDown(MouseEvent e) { // do nothing } /** * * * @param e */ public void mouseUp(MouseEvent e) { TreeItem[] treeItems = tree.getSelection(); upButtonPressed(); refresh(); // Keep selection tree.setSelection(treeItems); } } /** * Listener for the Down Button * Specific behavior is implemented in {@link DecoratedTreeComposite#downButtonPressed()}. * * @author Remi SCHNEKENBURGER */ private class DownButtonlistener implements MouseListener { /** * * * @param e */ public void mouseDoubleClick(MouseEvent e) { // do nothing } /** * * * @param e */ public void mouseDown(MouseEvent e) { // do nothing } /** * * * @param e */ public void mouseUp(MouseEvent e) { TreeItem[] treeItems = tree.getSelection(); downButtonPressed(); refresh(); // Keep selection tree.setSelection(treeItems); } } /** * */ private class EditItemListener implements Listener { /** * * * @param event */ public void handleEvent(Event event) { if(tree.getSelection().length > 0) { TreeItem item = tree.getSelection()[0]; editItem(item); } } } /** * Dipose listeners. */ public void disposeListeners() { if(addButton != null && !addButton.isDisposed()) addButton.removeMouseListener(addButtonlistener); if(removeButton != null && !removeButton.isDisposed()) removeButton.removeMouseListener(removeButtonlistener); if(upButton != null && !upButton.isDisposed()) upButton.removeMouseListener(upButtonlistener); if(downButton != null && !downButton.isDisposed()) downButton.removeMouseListener(downButtonlistener); if(tree != null && !tree.isDisposed()) tree.removeListener(SWT.MouseDoubleClick, treeListener); } }