| /******************************************************************************* |
| * Copyright (c) 2005 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.bpel.common.ui.tray; |
| |
| import org.eclipse.bpel.common.ui.decorator.EditPartMarkerDecorator; |
| import org.eclipse.bpel.common.ui.layouts.AlignedFlowLayout; |
| import org.eclipse.draw2d.AbstractLayout; |
| import org.eclipse.draw2d.IFigure; |
| import org.eclipse.draw2d.ImageFigure; |
| import org.eclipse.draw2d.Label; |
| import org.eclipse.draw2d.MarginBorder; |
| import org.eclipse.draw2d.ScrollPane; |
| import org.eclipse.draw2d.ToolbarLayout; |
| import org.eclipse.draw2d.geometry.Dimension; |
| import org.eclipse.draw2d.geometry.Insets; |
| import org.eclipse.draw2d.geometry.Rectangle; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.gef.EditPolicy; |
| import org.eclipse.gef.GraphicalEditPart; |
| import org.eclipse.gef.Handle; |
| import org.eclipse.gef.handles.HandleBounds; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| |
| |
| /** |
| * Main EditPart for the Tray. |
| */ |
| public class MainTrayEditPart extends TrayContainerEditPart { |
| |
| /** |
| * |
| */ |
| public static final int SCROLL_STEP = 20; |
| |
| protected class MainTrayTitleFigure extends SelectionBorderFigure implements HandleBounds { |
| /** |
| * |
| */ |
| public MainTrayTitleFigure() { |
| super(); |
| setOpaque(true); |
| AlignedFlowLayout titleLayout = new AlignedFlowLayout(); |
| titleLayout.setHorizontal(true); |
| titleLayout.setHorizontalSpacing(2); |
| titleLayout.setVerticalAlignment(AlignedFlowLayout.ALIGN_CENTER); |
| titleLayout.setHorizontalAlignment(AlignedFlowLayout.ALIGN_CENTER); |
| setLayoutManager(titleLayout); |
| setBorder(new MarginBorder(new Insets(3))); |
| } |
| /** |
| * @see org.eclipse.gef.handles.HandleBounds#getHandleBounds() |
| */ |
| public Rectangle getHandleBounds() { |
| return getClientArea(); |
| } |
| } |
| |
| protected class MainTraySelectionEditPolicy extends TraySelectionEditPolicy { |
| @Override |
| protected Handle createHandle(GraphicalEditPart owner) { |
| return new TraySelectionHandle(owner, mainTrayTitleFigure); |
| } |
| } |
| |
| /** |
| * Figure that implements scrolling. |
| */ |
| public class MainTrayContainerFigure extends TrayContainerFigure { |
| |
| protected class MainTrayContainerFigureLayout extends AbstractLayout { |
| @Override |
| protected Dimension calculatePreferredSize(IFigure container, int wHint, int hHint) { |
| if (titleFigure == null || childrenScrollPane == null) return new Dimension(wHint, hHint); |
| Dimension titleSize = titleFigure.getPreferredSize(wHint, hHint); |
| Dimension scrollPaneSize = childrenScrollPane.getPreferredSize(wHint, hHint); |
| int width = Math.max(titleSize.width, scrollPaneSize.width); |
| return new Dimension(width, container.getSize().height); |
| } |
| /** |
| * @see org.eclipse.draw2d.LayoutManager#layout(org.eclipse.draw2d.IFigure) |
| */ |
| public void layout(IFigure container) { |
| if (titleFigure == null || childrenScrollPane == null) return; |
| Rectangle area = container.getClientArea().getCopy(); |
| Dimension size = titleFigure.getPreferredSize(); |
| titleFigure.setBounds(new Rectangle(area.x, area.y, area.width, size.height)); |
| area.y += size.height; |
| int height = area.height - size.height; |
| childrenScrollPane.setBounds(new Rectangle(area.x, area.y, area.width, height)); |
| } |
| |
| /** |
| * @see org.eclipse.draw2d.AbstractLayout#getMinimumSize(org.eclipse.draw2d.IFigure, int, int) |
| */ |
| @Override |
| public Dimension getMinimumSize(IFigure container, int wHint, int hHint) { |
| Dimension result = getPreferredSize(container, wHint, hHint); |
| result.width = 80; // magic number |
| return result; |
| } |
| } |
| |
| protected ScrollPane childrenScrollPane; |
| |
| /** |
| * |
| */ |
| public MainTrayContainerFigure() { |
| super(); |
| setLayoutManager(new MainTrayContainerFigureLayout()); |
| } |
| |
| /** |
| * @see org.eclipse.bpel.common.ui.tray.TrayContainerEditPart.TrayContainerFigure#setChildrenFigure(org.eclipse.draw2d.IFigure) |
| */ |
| @Override |
| public void setChildrenFigure(IFigure target) { |
| if (childrenScrollPane == null) { |
| childrenScrollPane = createScrollpane(); |
| add(childrenScrollPane); |
| } |
| childrenFigure = target; |
| childrenScrollPane.setContents(target); |
| } |
| protected ScrollPane createScrollpane() { |
| ScrollPane scrollpane = new ScrollPane(); |
| scrollpane.getViewport().setContentsTracksWidth(true); |
| scrollpane.getViewport().setContentsTracksHeight(true); |
| scrollpane.setMinimumSize(new Dimension(0, 0)); |
| scrollpane.setHorizontalScrollBarVisibility(ScrollPane.NEVER); |
| scrollpane.setVerticalScrollBar(new TrayScrollBar()); |
| scrollpane.getVerticalScrollBar().setStepIncrement(SCROLL_STEP); |
| scrollpane.setLayoutManager(new TrayScrollPaneLayout()); |
| return scrollpane; |
| } |
| |
| /** |
| * @return the scroll pane. |
| */ |
| public ScrollPane getChildrenScrollPane() { |
| return childrenScrollPane; |
| } |
| } |
| |
| protected EditPartMarkerDecorator decorator; |
| protected Label nameLabel; |
| protected MainTrayTitleFigure mainTrayTitleFigure; |
| |
| /** |
| * |
| */ |
| public MainTrayEditPart() { |
| super(); |
| } |
| |
| @Override |
| protected IFigure createTitleFigure() { |
| mainTrayTitleFigure = new MainTrayTitleFigure(); |
| mainTrayTitleFigure.add(new ImageFigure(getLabelProvider().getImage(getModel()))); |
| nameLabel = new Label(getLabelProvider().getText(getModel())); |
| mainTrayTitleFigure.add(nameLabel); |
| decorator = createEditPartMarkerDecorator(); |
| return decorator.createFigure(mainTrayTitleFigure); |
| } |
| |
| protected EditPartMarkerDecorator createEditPartMarkerDecorator ( ) { |
| return new TrayMarkerDecorator((EObject)getModel(), new ToolbarLayout()); |
| } |
| |
| @Override |
| protected TrayContainerFigure createMainFigure() { |
| return new MainTrayContainerFigure(); |
| } |
| |
| @Override |
| protected void refreshVisuals() { |
| super.refreshVisuals(); |
| nameLabel.setText(getLabelProvider().getText(getModel())); |
| decorator.refresh(); |
| } |
| |
| @Override |
| protected void createEditPolicies() { |
| // Show selection handles |
| MainTraySelectionEditPolicy selectionEditPolicy = new MainTraySelectionEditPolicy(); |
| selectionEditPolicy.setDragAllowed(false); |
| installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, selectionEditPolicy); |
| } |
| |
| /** |
| * @see org.eclipse.bpel.common.ui.tray.TrayEditPart#getDirectEditLabel() |
| */ |
| @Override |
| public Label getDirectEditLabel() { |
| return nameLabel; |
| } |
| |
| /** |
| * Returns a model object if one is available or null. |
| */ |
| protected Object getModelObjectFromSelection(ISelection target) { |
| if (target instanceof IStructuredSelection) { |
| IStructuredSelection selection = (IStructuredSelection)target; |
| Object element = selection.getFirstElement(); |
| if (element != null) { |
| return (element instanceof EditPart) ? ((EditPart)element).getModel() : element; |
| } |
| } |
| return null; |
| } |
| } |