/* ****************************************************************************** * 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 java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; import java.util.TreeSet; import org.eclipse.draw2d.Cursors; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.LayoutManager; import org.eclipse.draw2d.geometry.Point; import org.eclipse.swt.graphics.Cursor; import org.xmind.core.Core; import org.xmind.core.ILegend; import org.xmind.core.event.CoreEvent; import org.xmind.core.event.ICoreEventRegister; import org.xmind.core.util.IMarkerRefCounter; import org.xmind.gef.GEF; import org.xmind.gef.part.IPart; import org.xmind.gef.part.IRequestHandler; import org.xmind.ui.internal.decorators.LegendDecorator; import org.xmind.ui.internal.figures.LegendFigure; import org.xmind.ui.internal.layouts.LegendLayout; import org.xmind.ui.mindmap.ILegendItemPart; import org.xmind.ui.mindmap.ILegendPart; import org.xmind.ui.mindmap.ISheetPart; import org.xmind.ui.mindmap.ITitleTextPart; import org.xmind.ui.mindmap.MindMapUI; import org.xmind.ui.util.MindMapUtils; public class LegendPart extends MindMapPartBase implements ILegendPart { private ITitleTextPart title = null; private List<ILegendItemPart> items = null; private LegendSeparatorPart separator = null; private ChildSorter sorter = new ChildSorter(this); private Point prefPosition = null; public LegendPart() { setDecorator(LegendDecorator.getInstance()); } protected IFigure createFigure() { return new LegendFigure(); } public ILegend getLegend() { return (ILegend) super.getRealModel(); } public ISheetPart getOwnedSheet() { if (getParent() instanceof ISheetPart) return (ISheetPart) getParent(); return null; } public void setParent(IPart parent) { if (getParent() instanceof SheetPart) { SheetPart sheet = (SheetPart) getParent(); if (sheet.getLegend() == this) { sheet.setLegend(null); } } super.setParent(parent); if (getParent() instanceof SheetPart) { SheetPart sheet = (SheetPart) getParent(); sheet.setLegend(this); } } public ITitleTextPart getTitle() { return title; } public void setTitle(ITitleTextPart title) { this.title = title; } public List<ILegendItemPart> getItems() { if (items == null) items = new ArrayList<ILegendItemPart>(); return items; } public void addItem(ILegendItemPart item) { getItems().add(item); sorter.sort(getItems()); } public void removeItem(ILegendItemPart item) { getItems().remove(item); sorter.sort(getItems()); } public LegendSeparatorPart getSeparator() { return separator; } public void setSeparator(LegendSeparatorPart separator) { this.separator = separator; } @SuppressWarnings("unchecked") public Object getAdapter(Class adapter) { if (adapter.isAssignableFrom(ILegend.class)) return getLegend(); if (adapter == LegendSeparatorPart.class) return separator; if (adapter == ITitleTextPart.class || adapter == LegendTitleTextPart.class) return title; return super.getAdapter(adapter); } protected LayoutManager createLayoutManager() { return new LegendLayout(this); } protected Object[] getModelChildren(Object model) { List<Object> list = new ArrayList<Object>(); ILegend legend = getLegend(); list.add(new ViewerModel(LegendTitleTextPart.class, legend)); list.add(new ViewerModel(LegendSeparatorPart.class, legend)); Collection<String> markerIds = getAllMarkers(legend); if (markerIds != null && !markerIds.isEmpty()) { Set<LegendItem> items = new TreeSet<LegendItem>(); for (String markerId : markerIds) { items.add(new LegendItem(legend, markerId)); } list.addAll(items); } return list.toArray(); } private Collection<String> getAllMarkers(ILegend legend) { IMarkerRefCounter counter = (IMarkerRefCounter) legend.getOwnedSheet() .getAdapter(IMarkerRefCounter.class); if (counter != null) { return counter.getCountedRefs(); } return null; } protected void declareEditPolicies(IRequestHandler reqHandler) { super.declareEditPolicies(reqHandler); reqHandler.installEditPolicy(GEF.ROLE_MOVABLE, MindMapUI.POLICY_LEGEND_MOVABLE); } protected void registerCoreEvents(Object source, ICoreEventRegister register) { super.registerCoreEvents(source, register); register.register(Core.Position); register.register(Core.MarkerDescription); Object counter = getLegend().getOwnedSheet().getAdapter( IMarkerRefCounter.class); if (counter != null) { register.setNextSourceFrom(counter); register.register(Core.ResourceRefs); } } public void handleCoreEvent(CoreEvent event) { String type = event.getType(); if (Core.Position.equals(type)) { setPreferredPosition(MindMapUtils.toGraphicalPosition(getLegend() .getPosition())); } else if (Core.MarkerDescription.equals(type)) { String markerId = (String) event.getTarget(); if (markerId != null) { ILegendItemPart item = findItem(markerId); if (item != null) { item.refresh(); } } } else if (Core.ResourceRefs.equals(type)) { refresh(); } else { super.handleCoreEvent(event); } } private ILegendItemPart findItem(String markerId) { for (ILegendItemPart item : getItems()) { if (markerId.equals(item.getMarkerId())) return item; } return null; } protected void updateChildren() { super.updateChildren(); for (ILegendItemPart item : getItems()) { item.update(); } } public Point getPreferredPosition() { return prefPosition; } public void setPreferredPosition(Point point) { this.prefPosition = point; getFigure().revalidate(); } public IPart findAt(Point position) { IPart ret = super.findAt(position); if (ret != null) { if (ret == title || ret == separator) return this; } return ret; } public Cursor getCursor(Point pos) { return Cursors.HAND; } }