/* * Copyright (c) 2006, 2007 Borland Software Corporation. * 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: * Richard Gronback (Borland) - initial API and implementation */ package org.eclipse.gmf.examples.mindmap.rcp.edit.parts; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Label; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.Request; import org.eclipse.gef.RequestConstants; import org.eclipse.gef.TreeEditPart; import org.eclipse.gef.commands.Command; import org.eclipse.gef.editparts.AbstractGraphicalEditPart; import org.eclipse.gef.tools.DirectEditManager; import org.eclipse.gmf.examples.mindmap.MindmapPackage; import org.eclipse.gmf.examples.mindmap.rcp.edit.policies.ThreadItemComponentEditPolicy; import org.eclipse.gmf.examples.mindmap.rcp.part.MindmapDiagramEditorPlugin; import org.eclipse.gmf.examples.mindmap.rcp.part.MindmapDiagramEditorUtil; import org.eclipse.gmf.runtime.lite.edit.parts.labels.ILabelController; import org.eclipse.gmf.runtime.lite.edit.parts.labels.ILabelTextDisplayer; import org.eclipse.gmf.runtime.lite.edit.parts.labels.MessageFormatLabelTextDisplayer; import org.eclipse.gmf.runtime.lite.edit.parts.tree.BaseTreeEditPart; import org.eclipse.gmf.runtime.lite.edit.parts.update.IExternallyUpdatableEditPart; import org.eclipse.gmf.runtime.lite.edit.parts.update.IUpdatableEditPart; import org.eclipse.gmf.runtime.lite.edit.parts.update.RefreshersRegistry; import org.eclipse.gmf.runtime.lite.edit.parts.update.TransactionalUpdateManager; import org.eclipse.gmf.runtime.lite.edit.parts.update.UpdaterUtil; import org.eclipse.gmf.runtime.lite.edit.policies.LabelDirectEditPolicy; import org.eclipse.gmf.runtime.lite.services.LabelCellEditorLocator; import org.eclipse.gmf.runtime.notation.FontStyle; import org.eclipse.gmf.runtime.notation.Node; import org.eclipse.gmf.runtime.notation.NotationPackage; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Widget; /** * @generated */ public class ThreadItemEditPart extends AbstractGraphicalEditPart implements IUpdatableEditPart, IExternallyUpdatableEditPart, ILabelController { /** * @generated */ public static final int VISUAL_ID = 3002; /** * @generated */ public ThreadItemEditPart(View model) { assert model instanceof Node; setModel(model); } /** * @generated */ public Node getDiagramNode() { return (Node) getModel(); } /** * @generated */ protected void registerModel() { super.registerModel(); View view = (View) getModel(); if (view != null && view.isSetElement() && view.getElement() != null) { getViewer().getEditPartRegistry().put(view.getElement(), this); } } /** * @generated */ protected void unregisterModel() { super.unregisterModel(); View view = (View) getModel(); if (view != null && view.isSetElement() && view.getElement() != null && getViewer().getEditPartRegistry().get(view.getElement()) == this) { getViewer().getEditPartRegistry().remove(view.getElement()); } } /** * @generated */ protected void createEditPolicies() { installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new LabelDirectEditPolicy()); installEditPolicy(EditPolicy.COMPONENT_ROLE, new ThreadItemComponentEditPolicy()); } /** * @generated */ public void performRequest(Request req) { if (RequestConstants.REQ_OPEN.equals(req.getType())) { Command command = getCommand(req); if (command != null && command.canExecute()) { getViewer().getEditDomain().getCommandStack().execute(command); } return; } if (RequestConstants.REQ_DIRECT_EDIT.equals(req.getType()) && understandsRequest(req)) { performDirectEdit(); return; } super.performRequest(req); } /** * @generated */ protected List getModelChildren() { return Collections.EMPTY_LIST; } /** * @generated */ protected List getModelSourceConnections() { return Collections.EMPTY_LIST; } /** * @generated */ protected List getModelTargetConnections() { return Collections.EMPTY_LIST; } /** * @generated */ public Object getAdapter(Class key) { if (TreeEditPart.class == key) { return getTreeEditPartAdapter(); } return super.getAdapter(key); } /** * @generated */ private TreeEditPartAdapter myTreeEditPartAdapter; /** * @generated */ private TreeEditPartAdapter getTreeEditPartAdapter() { if (myTreeEditPartAdapter == null) { myTreeEditPartAdapter = new TreeEditPartAdapter(); } return myTreeEditPartAdapter; } /** * @generated */ public void activate() { super.activate(); addExternalRefresher(getLabelRefresher()); getTransactionalUpdateManager().addUpdatableEditPart( getDiagramNode().getElement(), this); } /** * @generated */ public void deactivate() { getTransactionalUpdateManager().removeUpdatableEditPart( getDiagramNode().getElement(), this); removeExternalRefresher(getLabelRefresher()); super.deactivate(); } /** * @generated */ private TransactionalUpdateManager getTransactionalUpdateManager() { return (TransactionalUpdateManager) getViewer().getProperty( TransactionalUpdateManager.class.getName()); } /** * @generated */ private RefreshersRegistry myRefreshersRegistry; /** * @generated */ public Refresher getRefresher(EStructuralFeature feature, Notification msg) { if (myRefreshersRegistry == null) { createRefreshers(); } return myRefreshersRegistry.getRefresher(feature, msg); } /** * @generated */ private void createRefreshers() { myRefreshersRegistry = new RefreshersRegistry(); Refresher visibilityRefresher = new IExternallyUpdatableEditPart.ExternalRefresher() { public void refresh() { if (!isActive()) { return; } refreshVisibility(); } public boolean isAffectingEvent(Notification msg) { if (NotationPackage.eINSTANCE.getView_Visible() == msg .getFeature()) { return msg.getNotifier() == getDiagramNode(); } return false; } }; myRefreshersRegistry.add(NotationPackage.eINSTANCE.getView_Visible(), visibilityRefresher); Refresher fontRefresher = new IExternallyUpdatableEditPart.ExternalRefresher() { public void refresh() { if (!isActive()) { return; } refreshFont(); } public boolean isAffectingEvent(Notification msg) { if (NotationPackage.eINSTANCE.getFontStyle() .getEStructuralFeatures().contains(msg.getFeature())) { return true; } if (NotationPackage.eINSTANCE.getView_Styles() == msg .getFeature()) { return UpdaterUtil.affects(msg, NotationPackage.eINSTANCE .getFontStyle()); } return false; } }; myRefreshersRegistry.add(NotationPackage.eINSTANCE .getFontStyle_FontHeight(), fontRefresher); myRefreshersRegistry.add(NotationPackage.eINSTANCE .getFontStyle_FontName(), fontRefresher); myRefreshersRegistry.add(NotationPackage.eINSTANCE.getFontStyle_Bold(), fontRefresher); myRefreshersRegistry.add(NotationPackage.eINSTANCE .getFontStyle_Italic(), fontRefresher); myRefreshersRegistry.add(NotationPackage.eINSTANCE.getView_Styles(), fontRefresher); Refresher fontColorRefresher = new Refresher() { public void refresh() { if (!isActive()) { return; } refreshFontColor(); } public boolean isAffectingEvent(Notification msg) { if (NotationPackage.eINSTANCE.getFontStyle_FontColor() == msg .getFeature()) { return true; } if (NotationPackage.eINSTANCE.getView_Styles() == msg .getFeature()) { return UpdaterUtil.affects(msg, NotationPackage.eINSTANCE .getFontStyle()); } return false; } }; myRefreshersRegistry.add(NotationPackage.eINSTANCE .getFontStyle_FontColor(), fontColorRefresher); } /** * @generated */ protected void refreshVisibility() { boolean isVisible = getDiagramNode().isVisible(); boolean wasVisible = getFigure().isVisible(); if (isVisible == wasVisible) { return; } if (!isVisible && (getSelected() != SELECTED_NONE)) { getViewer().deselect(this); } getFigure().setVisible(isVisible); getFigure().revalidate(); } /** * @generated */ protected void refreshFont() { FontStyle style = (FontStyle) getDiagramNode().getStyle( NotationPackage.eINSTANCE.getFontStyle()); Font toDispose = createdFont; if (style != null) { String fontName = style.getFontName(); int fontHeight = style.getFontHeight(); int fontStyle = SWT.NORMAL; if (style.isBold()) { fontStyle |= SWT.BOLD; } if (style.isItalic()) { fontStyle |= SWT.ITALIC; } Font currentFont = getFigure().getFont(); if (currentFont != null) { FontData currentFontData = currentFont.getFontData()[0]; if (currentFontData.getName().equals(fontName) && currentFontData.getHeight() == fontHeight && currentFontData.getStyle() == fontStyle) { return; } } createdFont = new Font(null, fontName, fontHeight, fontStyle); getFigure().setFont(createdFont); } else { //revert to the default font getFigure().setFont(getViewer().getControl().getFont()); createdFont = null; } if (toDispose != null) { toDispose.dispose(); } } /** * The font (created by {@link #refreshFont()}) currently assigned to the label (unless the default font is assigned). * Whenever another non-default font is assigned to it, it is safe to dispose the previous one. * @generated */ private Font createdFont; /** * @generated */ protected void refreshFontColor() { FontStyle style = (FontStyle) getDiagramNode().getStyle( NotationPackage.eINSTANCE.getFontStyle()); Color toDispose = createdFontColor; if (style != null) { int fontColor = style.getFontColor(); int red = fontColor & 0x000000FF; int green = (fontColor & 0x0000FF00) >> 8; int blue = (fontColor & 0x00FF0000) >> 16; Color currentColor = getFigure().getForegroundColor(); if (currentColor != null && currentColor.getRed() == red && currentColor.getGreen() == green && currentColor.getBlue() == blue) { return; } createdFontColor = new Color(null, red, green, blue); getFigure().setForegroundColor(createdFontColor); } else { getFigure().setForegroundColor( getViewer().getControl().getForeground()); createdFontColor = null; } if (toDispose != null) { toDispose.dispose(); } } /** * The color (created by {@link #refreshFontColor()}) currently assigned to the label. * Whenever another color is assigned to it, it is safe to dispose the previous one. * @generated */ private Color createdFontColor; /** * @generated */ protected void refreshLabel() { getLabel().setText(getLabelText()); getLabel().setIcon(getLabelIcon()); } /** * @generated */ private IExternallyUpdatableEditPart.ExternalRefresher labelRefresher; /** * @generated */ protected IExternallyUpdatableEditPart.ExternalRefresher getLabelRefresher() { if (labelRefresher == null && getDiagramNode() != null) { labelRefresher = new ILabelController.ExternalRefresherAdapter( this, getDiagramNode().getElement()); } return labelRefresher; } /** * @generated */ protected void refreshVisuals() { super.refreshVisuals(); refreshVisibility(); refreshLabel(); refreshFont(); refreshFontColor(); } /** * @generated */ private Collection externalRefreshers = new ArrayList(); /** * @generated */ public Collection getExternalRefreshers() { return externalRefreshers; } /** * @generated */ public void addExternalRefresher( IExternallyUpdatableEditPart.ExternalRefresher externalRefresher) { if (externalRefresher != null && !externalRefreshers.contains(externalRefresher)) { externalRefreshers.add(externalRefresher); } } /** * @generated */ public void removeExternalRefresher( IExternallyUpdatableEditPart.ExternalRefresher externalRefresher) { externalRefreshers.remove(externalRefresher); } /** * @generated */ private DirectEditManager manager; /** * @generated */ protected DirectEditManager getManager() { if (manager == null) { manager = new DirectEditManager(this, TextCellEditor.class, new LabelCellEditorLocator(getViewer(), getLabel())) { protected void initCellEditor() { getCellEditor().setValue( getLabelTextDisplayer().getEditText( getDiagramNode().getElement())); } }; } return manager; } /** * @generated */ protected void performDirectEdit() { if (MindmapDiagramEditorUtil.isReadOnly(getDiagramNode().getElement()) || MindmapDiagramEditorUtil.isReadOnly(getDiagramNode())) { return; } if (getLabelTextDisplayer() == null) { return; } getManager().show(); } /** * @generated */ public static final ILabelTextDisplayer LABEL_DISPLAYER = createLabelTextDisplayer(); /** * @generated */ public ILabelTextDisplayer getLabelTextDisplayer() { return LABEL_DISPLAYER; } /** * @generated */ private static ILabelTextDisplayer createLabelTextDisplayer() { return new MessageFormatLabelTextDisplayer(null, null, null, new EAttribute[] { MindmapPackage.eINSTANCE .getThreadItem_Body() }); } /** * @generated */ private String defaultText; /** * @generated */ public void setLabelText(String text) { if (text == null || text.length() == 0) { text = defaultText; } getLabel().setText(text); } /** * @generated */ protected String getLabelText() { if (getLabelTextDisplayer() == null) { return defaultText; } EObject element = getDiagramNode().getElement(); if (element == null) { return defaultText; } String result = getLabelTextDisplayer().getDisplayText(element); if (result == null || result.length() == 0) { return defaultText; } return result; } /** * @generated */ protected Image getLabelIcon() { return null; } /** * @generated */ protected IFigure createFigure() { Label label = createLabel(); defaultText = label.getText(); return label; } /** * @generated */ protected Label createLabel() { return new Label(); } /** * @generated */ public Label getLabel() { return (Label) getFigure(); } /** * @generated */ private class TreeEditPartAdapter extends BaseTreeEditPart { /** * @generated */ public TreeEditPartAdapter() { super(getDiagramNode(), MindmapDiagramEditorPlugin.getInstance() .getItemProvidersAdapterFactory()); } /** * @generated */ protected void createEditPolicies() { installEditPolicy(EditPolicy.COMPONENT_ROLE, new ThreadItemComponentEditPolicy()); installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new LabelDirectEditPolicy()); } /** * @generated */ public void setWidget(Widget widget) { if (widget == null) { myTreeEditPartAdapter = null; } super.setWidget(widget); } /** * @generated */ protected ILabelTextDisplayer createLabelTextDisplayer() { return ThreadItemEditPart.this.getLabelTextDisplayer(); } /** * @generated */ protected Image getImage() { return ThreadItemEditPart.this.getLabelIcon(); } /** * @generated */ protected List getModelChildren() { return Collections.EMPTY_LIST; } } }