package org.xmind.ui.tools; import java.util.ArrayList; import java.util.List; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Layer; import org.eclipse.draw2d.RectangleFigure; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Insets; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.LocalResourceManager; import org.eclipse.jface.resource.ResourceManager; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.IColorProvider; import org.eclipse.jface.viewers.IFontProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.xmind.gef.GEF; import org.xmind.gef.IGraphicalViewer; import org.xmind.gef.IViewer; import org.xmind.gef.Request; import org.xmind.gef.draw2d.ITextFigure; import org.xmind.gef.draw2d.SimpleRectangleFigure; import org.xmind.gef.draw2d.SizeableImageFigure; import org.xmind.gef.event.MouseDragEvent; import org.xmind.gef.part.IPart; import org.xmind.gef.util.Properties; import org.xmind.ui.gallery.FrameFigure; import org.xmind.ui.gallery.FramePart; import org.xmind.ui.gallery.GalleryViewer; import org.xmind.ui.gallery.IDecorationContext; import org.xmind.ui.gallery.ILabelDecorator; import org.xmind.ui.gallery.ShadowedLayer; import org.xmind.ui.resources.ColorUtils; public class GalleryMoveTool extends DummyMoveTool { public static final String PARAM_INSERT_TARGET = "insertTarget"; //$NON-NLS-1$ public static final String PARAM_INSERT_POSITION = "insertPosition"; //$NON-NLS-1$ private static final int DELTA = 5; private Layer layer; private SimpleRectangleFigure cover; private IFigure placeholder; private boolean horizontalLayout; private IPart relativePart; /** * true is for before, false for after. */ private boolean beforeOrAfter; private ResourceManager resources; @Override protected void start() { resources = new LocalResourceManager(JFaceResources.getResources(), getTargetViewer().getControl()); super.start(); horizontalLayout = getTargetViewer().getProperties() .getBoolean(GalleryViewer.HorizontalLayout, false); Layer contentCover = getContentCover(); cover = new SimpleRectangleFigure( contentCover.getBounds().getShrinked(2, 2)); cover.setBackgroundColor(ColorConstants.gray); cover.setSubAlpha(0x33); contentCover.add(cover); } private Layer getContentCover() { FramePart framePart = getFramePart(); FrameFigure frameFigure = framePart.getFigure(); return frameFigure.getContentCover(); } protected FramePart getFramePart() { return (FramePart) getSource(); } @Override protected void end() { horizontalLayout = false; getContentCover().remove(cover); cover = null; layer.remove(placeholder); placeholder = null; super.end(); } private RectangleFigure createPlaceholder() { RectangleFigure placeholder = new RectangleFigure(); placeholder.setFill(true); // placeholder.setOutline(true); placeholder.setForegroundColor( (Color) resources.get(ColorUtils.toDescriptor("#a3a3a3"))); //$NON-NLS-1$ placeholder.setBackgroundColor( (Color) resources.get(ColorUtils.toDescriptor("#a3a3a3"))); //$NON-NLS-1$ placeholder.setLineWidth(4); return placeholder; } @Override protected IFigure createDummy() { IGraphicalViewer viewer = getTargetViewer(); layer = viewer.getLayer(GEF.LAYER_PRESENTATION); if (layer != null) { FrameFigure dummyFrameFigure = new FrameFigure() { @Override public void paint(Graphics graphics) { graphics.setAlpha(0x4c); super.paint(graphics); } }; decorate(dummyFrameFigure); dummyFrameFigure.setBounds(getFramePart().getFigure().getBounds()); layer.add(dummyFrameFigure); placeholder = createPlaceholder(); layer.add(placeholder); return dummyFrameFigure; } return null; } private void decorate(FrameFigure dummyFrameFigure) { Object model = getFramePart().getModel(); IViewer viewer = getTargetViewer(); Properties properties = viewer.getProperties(); IBaseLabelProvider labelProvider = viewer .getAdapter(IBaseLabelProvider.class); boolean hideTitle = properties.getBoolean(GalleryViewer.HideTitle, false); dummyFrameFigure.setHideTitle(hideTitle); boolean flat = properties.getBoolean(GalleryViewer.FlatFrames, false); dummyFrameFigure.setFlat(flat); dummyFrameFigure.setContentSize( (Dimension) properties.get(GalleryViewer.FrameContentSize)); int titlePlacement = properties.getInteger(GalleryViewer.TitlePlacement, GalleryViewer.TITLE_TOP.intValue()); dummyFrameFigure.setTitlePlacement(titlePlacement); if (!hideTitle) { decorateTitle(dummyFrameFigure.getTitle(), model, labelProvider); } boolean useCustomDecorator = properties .getBoolean(GalleryViewer.CustomContentPaneDecorator, false); if (useCustomDecorator && labelProvider instanceof ILabelDecorator) { IDecorationContext context = viewer instanceof IDecorationContext ? (IDecorationContext) viewer : null; ((ILabelDecorator) labelProvider).decorateFigure( dummyFrameFigure.getContentPane(), model, context); } ShadowedLayer layer = dummyFrameFigure.getContentPane(); layer.setBorderWidth( properties.getInteger(GalleryViewer.ContentPaneBorderWidth, 1)); Object color = properties.get(GalleryViewer.ContentPaneBorderColor); if (color != null && color instanceof Color) { layer.setBorderAlpha(0xff); layer.setBorderColor((Color) color); } layer.setLayoutManager( getFramePart().getFigure().getContentPane().getLayoutManager()); Image image = getImage(model, labelProvider); SizeableImageFigure imageFigure = new SizeableImageFigure(); decorateImage(imageFigure, image, properties); dummyFrameFigure.getContentPane().add(imageFigure); } private Image getImage(Object element, IBaseLabelProvider labelProvider) { if (labelProvider instanceof ILabelProvider) return ((ILabelProvider) labelProvider).getImage(element); return null; } protected void decorateImage(SizeableImageFigure imageFigure, Image image, Properties properties) { imageFigure.setImage(image); boolean stretched = properties.getBoolean(GalleryViewer.ImageStretched, false); boolean constained = properties .getBoolean(GalleryViewer.ImageConstrained, false); imageFigure.setConstrained(constained); imageFigure.setStretched(stretched); Insets margins = (Insets) properties .get(GalleryViewer.ContentPaneMargins); imageFigure.setMargins(margins); } private String getText(Object element, IBaseLabelProvider labelProvider) { if (labelProvider instanceof ILabelProvider) return ((ILabelProvider) labelProvider).getText(element); return null; } protected void decorateTitle(ITextFigure titleFigure, Object model, IBaseLabelProvider labelProvider) { String text = getText(model, labelProvider); if (text == null) text = ""; //$NON-NLS-1$ titleFigure.setText(text); if (labelProvider instanceof IFontProvider) { IFontProvider fontProvider = (IFontProvider) labelProvider; titleFigure.setFont(fontProvider.getFont(model)); } if (labelProvider instanceof IColorProvider) { IColorProvider colorProvider = (IColorProvider) labelProvider; titleFigure.setForegroundColor(colorProvider.getForeground(model)); titleFigure.setBackgroundColor(colorProvider.getBackground(model)); } } @Override protected void onMoving(Point currentPos, MouseDragEvent me) { super.onMoving(currentPos, me); IGraphicalViewer viewer = getTargetViewer(); MouseEvent swtEvent = me.getCurrentSWTEvent(); IPart framePart = viewer.findPart(swtEvent.x, swtEvent.y); if (framePart instanceof FramePart) { this.relativePart = framePart; FrameFigure frameFigure = ((FramePart) framePart).getFigure(); Rectangle bounds = frameFigure.getBounds(); int lineWidth = 2; if (horizontalLayout) { Rectangle leftRect = bounds.getResized(-bounds.width / 2, 0); if (leftRect.contains(currentPos)) { placeholder.setBounds( new Rectangle(bounds.x - 1, bounds.y - DELTA, lineWidth, bounds.height + DELTA * 2)); beforeOrAfter = true; } else { placeholder.setBounds(new Rectangle( bounds.x + bounds.width + 2, bounds.y - DELTA, lineWidth, bounds.height + DELTA * 2)); beforeOrAfter = false; } } else { Rectangle upRect = bounds.getResized(0, -bounds.height / 2); if (upRect.contains(currentPos)) { placeholder.setBounds(new Rectangle(bounds.x - DELTA, bounds.y - 1, bounds.width + DELTA * 2, lineWidth)); beforeOrAfter = true; } else { placeholder.setBounds(new Rectangle(bounds.x - DELTA, bounds.y + bounds.height + 2, bounds.width + DELTA * 2, lineWidth)); beforeOrAfter = false; } } } } @Override protected Request createRequest() { Request request = new Request(GEF.REQ_MOVETO); request.setDomain(getDomain()); request.setViewer(getTargetViewer()); //both target and source are moved parts List<IPart> parts = new ArrayList<IPart>(); for (IPart p : getSelectedParts(getTargetViewer())) { if (p.hasRole(GEF.ROLE_MOVABLE)) { parts.add(p); } } request.setTargets(parts); request.setPrimaryTarget(getSource()); request.setParameter(GEF.PARAM_POSITION, getCursorPosition()); request.setParameter(GEF.PARAM_PARENT, getFramePart().getParent()); request.setParameter(GalleryMoveTool.PARAM_INSERT_TARGET, relativePart); request.setParameter(GalleryMoveTool.PARAM_INSERT_POSITION, beforeOrAfter); return request; } }