/* ****************************************************************************** * 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.List; import org.xmind.core.ILegend; import org.xmind.core.marker.IMarker; import org.xmind.core.marker.IMarkerGroup; import org.xmind.core.marker.IMarkerSheet; public class LegendItem extends ViewerModel implements Comparable<LegendItem> { private String markerId; private IMarker marker; public LegendItem(ILegend legend, String markerId) { super(LegendItemPart.class, legend); this.markerId = markerId; } public ILegend getLegend() { return (ILegend) getRealModel(); } public String getMarkerId() { return markerId; } public IMarker getMarker() { if (marker == null) { marker = getLegend().getOwnedWorkbook().getMarkerSheet() .findMarker(markerId); } return marker; } public String getDescription() { return getLegend().getMarkerDescription(markerId); } public int compareTo(LegendItem that) { if (!this.getLegend().equals(that.getLegend())) return 1000; IMarker m1 = this.getMarker(); IMarker m2 = that.getMarker(); if (m2 == null) return -1; if (m1 == null) return 1; IMarkerSheet s1 = m1.getOwnedSheet(); IMarkerSheet s2 = m2.getOwnedSheet(); if (s2 == null) return -100; if (s1 == null) return 100; if (!s1.equals(s2)) { if (isAncestorMarkerSheet(s1, s2)) return -100; return 100; } IMarkerGroup g1 = m1.getParent(); IMarkerGroup g2 = m2.getParent(); if (g2 == null) return -10; if (g1 == null) return 10; if (!g1.equals(g2)) { List<IMarkerGroup> groups = s1.getMarkerGroups(); int index1 = groups.indexOf(g1); int index2 = groups.indexOf(g2); if (index2 == -1) return -50; if (index1 == -1) return 50; return index1 - index2; } List<IMarker> markers = g1.getMarkers(); int index1 = markers.indexOf(m1); int index2 = markers.indexOf(m2); if (index2 == -1) return -10; if (index1 == -1) return 10; return index1 - index2; } private boolean isAncestorMarkerSheet(IMarkerSheet s1, IMarkerSheet s2) { IMarkerSheet p = s2.getParentSheet(); while (p != null) { if (s1.equals(p)) return true; p = p.getParentSheet(); } return false; } public boolean equals(Object obj) { if (obj == this) return true; if (obj == null || !(obj instanceof LegendItem)) return false; LegendItem that = (LegendItem) obj; return super.equals(obj) && this.markerId.equals(that.markerId); } }