| /****************************************************************************** |
| * Copyright (c) 2002, 2009 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.gmf.runtime.diagram.ui.editparts; |
| |
| import org.eclipse.draw2d.Border; |
| import org.eclipse.draw2d.IFigure; |
| import org.eclipse.draw2d.LineBorder; |
| import org.eclipse.draw2d.ScrollPane; |
| import org.eclipse.emf.common.notify.Notification; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.gef.ExposeHelper; |
| import org.eclipse.gef.editparts.ViewportExposeHelper; |
| import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil; |
| import org.eclipse.gmf.runtime.diagram.ui.figures.ResizableCompartmentFigure; |
| import org.eclipse.gmf.runtime.diagram.ui.internal.properties.Properties; |
| import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramColorRegistry; |
| import org.eclipse.gmf.runtime.notation.DrawerStyle; |
| import org.eclipse.gmf.runtime.notation.FillStyle; |
| import org.eclipse.gmf.runtime.notation.NotationPackage; |
| import org.eclipse.gmf.runtime.notation.Ratio; |
| import org.eclipse.gmf.runtime.notation.TitleStyle; |
| import org.eclipse.gmf.runtime.notation.View; |
| import org.eclipse.swt.graphics.Color; |
| import org.eclipse.swt.graphics.FontData; |
| |
| /** |
| * An editpart for controlling generic resizable compartment views |
| * The compartment can be collapsed, hidden, resized, or given a title |
| * |
| * @author melaasar |
| */ |
| public abstract class ResizableCompartmentEditPart |
| extends CompartmentEditPart implements IResizableCompartmentEditPart { |
| |
| /** |
| * Constructs a new resizable editpart |
| * |
| * @param model The resizable compartment view |
| */ |
| public ResizableCompartmentEditPart(EObject model) { |
| super(model); |
| } |
| |
| /** |
| * This method helps in children navigation by scrolling the compartment |
| * until the child is visible in the viewport |
| * |
| * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class) |
| */ |
| public Object getAdapter(Class key) { |
| if (key == ExposeHelper.class) { |
| ViewportExposeHelper helper = new ViewportExposeHelper(this); |
| return helper; |
| } |
| return super.getAdapter(key); |
| } |
| |
| /** |
| * @see org.eclipse.gef.editparts.AbstractEditPart#refreshVisuals() |
| */ |
| protected void refreshVisuals() { |
| super.refreshVisuals(); |
| refreshFont(); |
| refreshFontColor(); |
| refreshShowCompartmentTitle(); |
| refreshCollapsed(); |
| refreshRatio(); |
| refreshLineWidth(); |
| refreshLineType(); |
| refreshBackgroundColor(); |
| } |
| |
| /** |
| * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure() |
| */ |
| protected IFigure createFigure() { |
| return new ResizableCompartmentFigure(getCompartmentName(), getMapMode()); |
| } |
| |
| /** |
| * @return The compartment's figure |
| */ |
| public ResizableCompartmentFigure getCompartmentFigure() { |
| return (ResizableCompartmentFigure) getFigure(); |
| } |
| |
| /** |
| * @see org.eclipse.gef.GraphicalEditPart#getContentPane() |
| */ |
| public IFigure getContentPane() { |
| if (getCompartmentFigure()!=null){ |
| |
| return getCompartmentFigure().getContentPane(); |
| } else { |
| return null; |
| } |
| } |
| |
| /* |
| * (non-Javadoc) |
| * @see org.eclipse.gmf.runtime.diagram.ui.editparts.IResizableCompartmentEditPart#getCompartmentName() |
| */ |
| public String getCompartmentName() { |
| return new String(); |
| } |
| |
| /** |
| * Handles the following properties: <BR> |
| * <UL> |
| * <LI>{@link NotationPackage.eINSTANCE.getRatio_Value()} calls {@link #refreshRatio()} |
| * <LI>{@link NotationPackage.eINSTANCE.getDrawerStyle_Collapsed()} calls {@link #refreshCollapsed()} |
| * <LI>{@link NotationPackage.eINSTANCE.getTitleStyle_ShowTitle()} calls {@link #refreshShowCompartmentTitle()} |
| * <UL> |
| * <BR> |
| * All other properties are forwarded to the parent class for processing. |
| * @param evt a property change event. |
| * @see org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart#handlePropertyChangeEvent(java.beans.PropertyChangeEvent) |
| */ |
| protected void handleNotificationEvent(Notification event ) { |
| Object feature = event.getFeature(); |
| if (NotationPackage.eINSTANCE.getRatio_Value().equals(feature) |
| || event.getOldValue()instanceof Ratio |
| || event.getNewValue() instanceof Ratio) |
| refreshRatio(); |
| else if (NotationPackage.eINSTANCE.getDrawerStyle_Collapsed().equals(feature)){ |
| setCollapsed(event.getNewBooleanValue(), true); |
| this.getFigure().revalidate(); |
| } else if (NotationPackage.eINSTANCE.getTitleStyle_ShowTitle().equals(feature)) |
| setShowCompartmentTitle(event.getNewBooleanValue()); |
| else if (NotationPackage.eINSTANCE.getFontStyle_FontColor().equals(feature)){ |
| Integer c = (Integer) event.getNewValue(); |
| setFontColor(DiagramColorRegistry.getInstance().getColor(c)); |
| } |
| else if (NotationPackage.eINSTANCE.getFontStyle_FontHeight().equals(feature) || |
| NotationPackage.eINSTANCE.getFontStyle_FontName().equals(feature) || |
| NotationPackage.eINSTANCE.getFontStyle_Bold().equals(feature) || |
| NotationPackage.eINSTANCE.getFontStyle_Italic().equals(feature)) { |
| refreshFont(); |
| } else if (NotationPackage.eINSTANCE.getLineStyle_LineWidth().equals(feature)){ |
| refreshLineWidth(); |
| } else if (NotationPackage.eINSTANCE.getLineTypeStyle_LineType().equals(feature)) { |
| refreshLineType(); |
| } else if (NotationPackage.eINSTANCE.getFillStyle_Gradient().equals(feature) || |
| NotationPackage.eINSTANCE.getFillStyle_FillColor().equals(feature)) { |
| refreshBackgroundColor(); |
| } else |
| super.handleNotificationEvent(event); |
| } |
| |
| /** |
| * Refreshes the compartment ratio property |
| */ |
| protected void refreshRatio() { |
| if (ViewUtil.isPropertySupported((View)getModel(), Properties.ID_RATIO)) |
| setRatio((Double)getStructuralFeatureValue(NotationPackage.eINSTANCE.getRatio_Value())); |
| else |
| setRatio(new Double(-1)); |
| } |
| |
| /** |
| * Refreshes the compartment's collapsed state |
| */ |
| protected void refreshCollapsed() { |
| DrawerStyle style = (DrawerStyle) ((View)getModel()).getStyle(NotationPackage.eINSTANCE.getDrawerStyle()); |
| if (style != null) |
| setCollapsed(style.isCollapsed(), false); |
| } |
| |
| /** |
| * Refreshes the compartment title visibility |
| */ |
| protected void refreshShowCompartmentTitle() { |
| TitleStyle style = (TitleStyle) ((View)getModel()).getStyle(NotationPackage.eINSTANCE.getTitleStyle()); |
| if (style != null) |
| setShowCompartmentTitle(style.isShowTitle()); |
| } |
| |
| /** |
| * Sets the collapse state of the compartment figure, considering the passed |
| * animate flag while doing so |
| * @param collapsed the collapsed state |
| * @param animate the animate flag |
| */ |
| protected void setCollapsed(boolean collapsed, boolean animate) { |
| if (getCompartmentFigure()!=null) { |
| if (collapsed) { |
| if (animate) |
| getCompartmentFigure().collapse(); |
| else |
| getCompartmentFigure().setCollapsed(); |
| } |
| else { |
| if (animate) |
| getCompartmentFigure().expand(); |
| else |
| getCompartmentFigure().setExpanded(); |
| } |
| } |
| } |
| |
| /** |
| * Sets the ratio of the resizable compartment |
| * @param ratio |
| */ |
| protected void setRatio(Double ratio) { |
| ((IGraphicalEditPart) getParent()).setLayoutConstraint( |
| this, |
| getFigure(), |
| ratio); |
| } |
| |
| /** |
| * Sets the visibility of the compartment title |
| * @param showCompartmentTitle |
| */ |
| protected void setShowCompartmentTitle(boolean showCompartmentTitle) { |
| if (getCompartmentFigure()!=null) |
| getCompartmentFigure().setTitleVisibility(showCompartmentTitle); |
| } |
| |
| /** |
| * @see org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart#setFont(org.eclipse.swt.graphics.FontData) |
| */ |
| protected void setFont(FontData fontData) { |
| if (getCompartmentFigure()!=null) |
| fontData.setHeight(fontData.getHeight()-1); |
| super.setFont(fontData); |
| } |
| |
| /** |
| * @see org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart#setFontColor(org.eclipse.swt.graphics.Color) |
| */ |
| protected void setFontColor(Color color) { |
| if (getCompartmentFigure()!=null) |
| getCompartmentFigure().setFontColor(color); |
| } |
| |
| /** |
| * Sets the line width for the shape's border |
| * @see org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart#setLineWidth(int) |
| */ |
| protected void setLineWidth(int width) { |
| if (width < 0) { |
| width = 1; |
| } |
| Border border = getFigure().getBorder(); |
| if (border instanceof LineBorder) { |
| ((LineBorder) border).setWidth(getMapMode().DPtoLP(width)); |
| getFigure().revalidate(); |
| } |
| } |
| |
| /** |
| * Sets the line type for the shape's border |
| * @see org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart#setLineType(int) |
| */ |
| protected void setLineType(int type) { |
| Border border = getFigure().getBorder(); |
| if (border instanceof LineBorder) { |
| ((LineBorder) border).setStyle(type); |
| } |
| } |
| |
| /** |
| * @see org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart#addNotationalListeners() |
| */ |
| protected void addNotationalListeners() { |
| super.addNotationalListeners(); |
| addListenerFilter("PrimaryView", this, getPrimaryView()); //$NON-NLS-1$ |
| } |
| |
| /** |
| * @see org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart#removeNotationalListeners() |
| */ |
| protected void removeNotationalListeners() { |
| super.removeNotationalListeners(); |
| removeListenerFilter("PrimaryView"); //$NON-NLS-1$ |
| } |
| |
| /* onl |
| * @see org.eclipse.gef.EditPart#isSelectable() |
| */ |
| public boolean isSelectable() { |
| |
| if ( super.isSelectable()){ |
| return (!(getParent() instanceof ResizableCompartmentEditPart)); |
| |
| } |
| return false; |
| } |
| |
| /** |
| * This method refreshes background color of scroll bars (when they are |
| * present). Actually, scroll bars inherit background color from their parent shape, |
| * but in case of gradient we want to set the background to the second color |
| * of gradient. |
| * |
| * @see org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart#refreshBackgroundColor() |
| */ |
| protected void refreshBackgroundColor() { |
| if (getPrimaryView() == null) { |
| return; |
| } |
| FillStyle style = (FillStyle)getPrimaryView().getStyle(NotationPackage.Literals.FILL_STYLE); |
| ScrollPane scrollPane = getCompartmentFigure().getScrollPane(); |
| if (style != null && scrollPane != null) { |
| Color color = null; |
| if (style.getGradient() == null) { |
| color = DiagramColorRegistry.getInstance().getColor(Integer.valueOf(style.getFillColor())); |
| } else { |
| color = DiagramColorRegistry.getInstance().getColor(Integer.valueOf(style.getGradient().getGradientColor2())); |
| } |
| if (color != null) { |
| scrollPane.setBackgroundColor(color); |
| } |
| } |
| } |
| } |