/* ******************************************************************************
* Copyright (c) 2006-2012 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.ui.internal.mindmap;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.xmind.core.ITopic;
import org.xmind.core.marker.IMarker;
import org.xmind.core.marker.IMarkerRef;
import org.xmind.gef.GEF;
import org.xmind.gef.IViewer;
import org.xmind.gef.draw2d.SizeableImageFigure;
import org.xmind.gef.part.IPart;
import org.xmind.gef.part.IRequestHandler;
import org.xmind.gef.policy.NullEditPolicy;
import org.xmind.gef.service.IFeedback;
import org.xmind.gef.service.IImageRegistryService;
import org.xmind.ui.mindmap.IMarkerPart;
import org.xmind.ui.mindmap.ISelectionFeedbackHelper;
import org.xmind.ui.mindmap.ITopicPart;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.util.MarkerImageDescriptor;
public class MarkerPart extends MindMapPartBase implements IMarkerPart {
private ImageDescriptor imgDesc = null;
private Image image = null;
private boolean imageCreatable = true;
private boolean imageNeedsDispose = false;
public MarkerPart() {
setDecorator(MarkerDecorator.getInstance());
}
@SuppressWarnings("unchecked")
@Override
public Object getAdapter(Class adapter) {
if (adapter.isAssignableFrom(IMarkerRef.class))
return getMarkerRef();
if (adapter.isAssignableFrom(IMarker.class))
return getMarker();
if (adapter.isAssignableFrom(ITopic.class))
return getTopic();
if (adapter == Image.class)
return getImage();
return super.getAdapter(adapter);
}
protected IFigure createFigure() {
return new SizeableImageFigure();
}
public IMarkerRef getMarkerRef() {
return (IMarkerRef) super.getRealModel();
}
protected void register() {
registerModel(getMarkerRef());
super.register();
}
protected void unregister() {
super.unregister();
unregisterModel(getMarkerRef());
}
public IMarker getMarker() {
IMarkerRef markerRef = getMarkerRef();
return markerRef == null ? null : markerRef.getMarker();
}
public ITopic getTopic() {
return getMarkerRef().getParent();
}
public ITopicPart getTopicPart() {
if (getParent() instanceof ITopicPart)
return (ITopicPart) getParent();
return null;
}
public void setParent(IPart parent) {
if (getParent() instanceof TopicPart) {
((TopicPart) getParent()).removeMarker(this);
}
super.setParent(parent);
if (getParent() instanceof TopicPart) {
((TopicPart) getParent()).addMarker(this);
}
}
public Image getImage() {
if (image == null && imageCreatable) {
image = createImage();
}
return image;
}
private Image createImage() {
IViewer viewer = getSite().getViewer();
if (viewer != null) {
IImageRegistryService service = (IImageRegistryService) viewer
.getService(IImageRegistryService.class);
if (service != null) {
return service.getImage(getImageDescriptor(), false, this);
}
}
imageNeedsDispose = true;
return getImageDescriptor().createImage(false, Display.getCurrent());
}
protected void onDeactivated() {
imageCreatable = false;
IViewer viewer = getSite().getViewer();
if (viewer != null) {
IImageRegistryService service = (IImageRegistryService) viewer
.getService(IImageRegistryService.class);
if (service != null) {
service.decreaseRef(getImageDescriptor(), this);
}
}
if (image != null && imageNeedsDispose) {
image.dispose();
image = null;
}
super.onDeactivated();
}
private ImageDescriptor getImageDescriptor() {
if (imgDesc == null) {
imgDesc = MarkerImageDescriptor.createFromMarkerRef(getMarkerRef());
}
return imgDesc;
}
/*
* (non-Javadoc)
*
* @see
* org.xmind.gef.part.GraphicalEditPart#containsPoint(org.eclipse.draw2d
* .geometry.Point)
*/
@Override
public boolean containsPoint(Point position) {
return super.containsPoint(position);
}
@Override
protected void updateView() {
updateToolTip();
super.updateView();
}
public IFigure findTooltipAt(Point position) {
if (containsPoint(position)) {
IFigure toolTip = getFigure().getToolTip();
if (toolTip != null)
return toolTip;
return new Label(getMarkerRef().getDescription());
}
return null;
}
protected void declareEditPolicies(IRequestHandler reqHandler) {
super.declareEditPolicies(reqHandler);
reqHandler.installEditPolicy(GEF.ROLE_SELECTABLE,
NullEditPolicy.getInstance());
reqHandler.installEditPolicy(GEF.ROLE_DELETABLE,
MindMapUI.POLICY_DELETABLE);
reqHandler.installEditPolicy(GEF.ROLE_MOVABLE,
MindMapUI.POLICY_MARKER_MOVABLE);
}
protected IFeedback createFeedback() {
return new SimpleSelectionFeedback(this);
}
protected ISelectionFeedbackHelper createSelectionFeedbackHelper() {
return new SelectionFeedbackHelper();
}
}