blob: ee0100ceb25385d735c84516593ffd7937eae6d4 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}