/******************************************************************************* * Copyright (c) 2003, 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.gef.internal.ui.rulers; import java.util.List; import org.eclipse.swt.accessibility.AccessibleEvent; import org.eclipse.draw2d.IFigure; import org.eclipse.gef.AccessibleEditPart; import org.eclipse.gef.DragTracker; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.GraphicalViewer; import org.eclipse.gef.LayerConstants; import org.eclipse.gef.Request; import org.eclipse.gef.editparts.AbstractGraphicalEditPart; import org.eclipse.gef.editparts.LayerManager; import org.eclipse.gef.editparts.ZoomManager; import org.eclipse.gef.editpolicies.SelectionEditPolicy; import org.eclipse.gef.internal.GEFMessages; import org.eclipse.gef.requests.SelectionRequest; import org.eclipse.gef.rulers.RulerChangeListener; import org.eclipse.gef.rulers.RulerProvider; /** * @author Pratik Shah * @since 3.0 */ public class RulerEditPart extends AbstractGraphicalEditPart { protected GraphicalViewer diagramViewer; private AccessibleEditPart accPart; private RulerProvider rulerProvider; private boolean horizontal; private RulerChangeListener listener = new RulerChangeListener.Stub() { public void notifyGuideReparented(Object guide) { handleGuideReparented(guide); } public void notifyUnitsChanged(int newUnit) { handleUnitsChanged(newUnit); } }; public RulerEditPart(Object model) { setModel(model); } /* (non-Javadoc) * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#activate() */ public void activate() { getRulerProvider().addRulerChangeListener(listener); getRulerFigure().setZoomManager(getZoomManager()); super.activate(); } /* (non-Javadoc) * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies() */ protected void createEditPolicies() { /* * @TODO:Pratik the right way of creating guides and figuring out the target * edit part is by installing an edit policy with container role. talk to randy about * how this should work. would isMove() in GuideEditPart's drag tracker still have to * return true all the time? */ // installEditPolicy(EditPolicy.CONTAINER_ROLE, ); installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new RulerSelectionPolicy()); } /* (non-Javadoc) * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure() */ protected IFigure createFigure() { RulerFigure ruler = new RulerFigure(isHorizontal(), getRulerProvider().getUnit()); if (ruler.getUnit() == RulerProvider.UNIT_PIXELS) ruler.setInterval(100, 2); return ruler; } /* (non-Javadoc) * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#deactivate() */ public void deactivate() { super.deactivate(); getRulerProvider().removeRulerChangeListener(listener); rulerProvider = null; getRulerFigure().setZoomManager(null); } protected AccessibleEditPart getAccessibleEditPart() { if (accPart == null) accPart = new AccessibleGraphicalEditPart() { public void getName(AccessibleEvent e) { e.result = isHorizontal() ? GEFMessages.Ruler_Horizontal_Label : GEFMessages.Ruler_Vertical_Label; } public void getDescription(AccessibleEvent e) { e.result = GEFMessages.Ruler_Desc; } }; return accPart; } /** * Returns the GraphicalViewer associated with the diagram. * * @return graphical viewer associated with the diagram. */ protected GraphicalViewer getDiagramViewer() { return diagramViewer; } /* (non-Javadoc) * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getDragTracker(org.eclipse.gef.Request) */ public DragTracker getDragTracker(Request request) { if (request.getType().equals(REQ_SELECTION) && ((SelectionRequest)request).getLastButtonPressed() != 1) { return null; } return new RulerDragTracker(this); } public IFigure getGuideLayer() { LayerManager lm = (LayerManager)diagramViewer .getEditPartRegistry() .get(LayerManager.ID); if (lm != null) return lm.getLayer(LayerConstants.GUIDE_LAYER); return null; } /* (non-Javadoc) * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren() */ protected List getModelChildren() { return getRulerProvider().getGuides(); } protected RulerFigure getRulerFigure() { return (RulerFigure)getFigure(); } public RulerProvider getRulerProvider() { return rulerProvider; } /* (non-Javadoc) * @see org.eclipse.gef.EditPart#getTargetEditPart(org.eclipse.gef.Request) */ public EditPart getTargetEditPart(Request request) { if (request.getType().equals(REQ_MOVE)) { return this; } else { return super.getTargetEditPart(request); } } public ZoomManager getZoomManager() { return (ZoomManager)diagramViewer.getProperty(ZoomManager.class.toString()); } public void handleGuideReparented(Object guide) { refreshChildren(); EditPart guidePart = (EditPart)getViewer().getEditPartRegistry().get(guide); if (guidePart != null) { getViewer().select(guidePart); } } public void handleUnitsChanged(int newUnit) { getRulerFigure().setUnit(newUnit); if (newUnit == RulerProvider.UNIT_PIXELS) getRulerFigure().setInterval(100, 2); else getRulerFigure().setInterval(0, 0); } public boolean isHorizontal() { return horizontal; } public void setParent(EditPart parent) { super.setParent(parent); if (getParent() != null && diagramViewer == null) { diagramViewer = (GraphicalViewer)getViewer() .getProperty(GraphicalViewer.class.toString()); RulerProvider hProvider = (RulerProvider)diagramViewer .getProperty(RulerProvider.PROPERTY_HORIZONTAL_RULER); if (hProvider != null && hProvider.getRuler() == getModel()) { rulerProvider = hProvider; horizontal = true; } else { rulerProvider = (RulerProvider)diagramViewer .getProperty(RulerProvider.PROPERTY_VERTICAL_RULER); } } } public static class RulerSelectionPolicy extends SelectionEditPolicy { protected void hideFocus() { ((RulerFigure)getHostFigure()).setDrawFocus(false); } protected void hideSelection() { ((RulerFigure)getHostFigure()).setDrawFocus(false); } protected void showFocus() { ((RulerFigure)getHostFigure()).setDrawFocus(true); } protected void showSelection() { ((RulerFigure)getHostFigure()).setDrawFocus(true); } } }