package org.xmind.ui.internal.outline; import java.net.URL; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.LocalResourceManager; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeColumn; import org.xmind.core.ISheet; import org.xmind.core.ITopic; import org.xmind.core.marker.IMarker; import org.xmind.core.marker.IMarkerGroup; import org.xmind.core.marker.IMarkerSheet; import org.xmind.ui.internal.MindMapMessages; import org.xmind.ui.internal.MindMapUIPlugin; import org.xmind.ui.internal.outline.resource.IAZResource; import org.xmind.ui.internal.outline.resource.IAssigneeResource; import org.xmind.ui.internal.outline.resource.ILabelResource; import org.xmind.ui.internal.outline.resource.IMarkerResource; import org.xmind.ui.internal.outline.resource.IOutlineResource; import org.xmind.ui.internal.outline.resource.ITaskDateResource; import org.xmind.ui.mindmap.IMindMapImages; import org.xmind.ui.mindmap.IWorkbookRef; import org.xmind.ui.mindmap.MindMapUI; import org.xmind.ui.util.MarkerImageDescriptor; public class OutlineViewer extends TreeViewer { public static final String VIEWERTYPE_SINGLECOLUMN = "singleColumn"; //$NON-NLS-1$ public static final String VIEWERTYPE_MULITCOLUMN = "multiColumn"; //$NON-NLS-1$ private class OutlineContentProvider implements ITreeContentProvider { public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { if (newInput instanceof ITaskDateResource) { int taskDateType = ((ITaskDateResource) newInput) .getTaskDateResourceType(); Tree tree = getTree(); if (tree != null && !tree.isDisposed()) { TreeColumn column = tree.getColumn(1); if (column != null && !column.isDisposed()) if (taskDateType == OutlineIndexModelPart.OUTLINE_TYPE_BY_STARTDATE) { column.setText( MindMapMessages.OutlineViewer_StartDate_col); } else if (taskDateType == OutlineIndexModelPart.OUTLINE_TYPE_BY_ENDDATE) column.setText( MindMapMessages.OutlineViewer_EndData_col); } } } public Object[] getElements(Object inputElement) { if (inputElement instanceof ITaskDateResource) { return ((ITaskDateResource) inputElement) .getAllTopicsForTaskDate().toArray(); } if (inputElement instanceof IOutlineResource) { IOutlineResource input = (IOutlineResource) inputElement; return new Object[] { input.getSource() }; } return null; } public Object[] getChildren(Object parentElement) { Object input = getInput(); if (input instanceof IMarkerResource) { IMarkerResource resource = (IMarkerResource) input; return getChildrenForMarkerResource(resource, parentElement); } else if (input instanceof ILabelResource) { ILabelResource resource = (ILabelResource) input; return getChildrenForLabelResource(resource, parentElement); } else if (input instanceof IAssigneeResource) { return getChildrenForAssigneeResource((IAssigneeResource) input, parentElement); } else if (input instanceof ITaskDateResource) { return null; } else if (input instanceof IAZResource) { if (parentElement instanceof IWorkbookRef || parentElement instanceof ISheet) return ((IAZResource) input).getTopics().toArray(); } return null; } public Object getParent(Object element) { Object input = getInput(); if (input instanceof IMarkerResource) { IMarkerResource resource = (IMarkerResource) input; return getParentForMarkerResource(resource, element); } else if (input instanceof ILabelResource) { ILabelResource resource = (ILabelResource) input; return getParentForLabelResource(resource, element); } else if (input instanceof IAssigneeResource) { return getParentForAssigneeResource((IAssigneeResource) input, element); } else if (input instanceof ITaskDateResource) { return null; } else if (input instanceof IAZResource) { if (element instanceof ITopic) return ((IAZResource) input).getSource(); } return null; } public boolean hasChildren(Object element) { Object input = getInput(); if (input instanceof IMarkerResource) { return (element instanceof IWorkbookRef) || (element instanceof ISheet) || (element instanceof IMarkerGroup) || (element instanceof IMarker); } else if (input instanceof ILabelResource) { return (element instanceof IWorkbookRef) || (element instanceof ISheet) || (element instanceof String); } else if (input instanceof IAssigneeResource) { return (element instanceof IWorkbookRef) || (element instanceof ISheet) || (element instanceof String); } else if (input instanceof IAZResource) { return (element instanceof IWorkbookRef) || (element instanceof ISheet); } return false; } private Object[] getChildrenForMarkerResource(IMarkerResource resource, Object parentElement) { Set<String> ids = resource.getMarkerIds(); if (parentElement instanceof IMarkerGroup) { Set<IMarker> childrenIds = new HashSet<IMarker>(); for (String id : ids) { IMarker marker = resource.getMarker(id); if (marker.getParent() == parentElement) { childrenIds.add(marker); } } return childrenIds.toArray(); } else if (parentElement instanceof IMarker) { return resource.getTopics(((IMarker) parentElement).getId()) .toArray(); } else if ((parentElement instanceof IWorkbookRef) || (parentElement instanceof ISheet)) { Set<IMarkerGroup> group = new HashSet<IMarkerGroup>(); for (String markerId : ids) { IMarker marker = resource.getMarker(markerId); group.add(marker.getParent()); } return group.toArray(); } return null; } private Object[] getChildrenForLabelResource(ILabelResource resource, Object parentElement) { if (parentElement instanceof IWorkbookRef || parentElement instanceof ISheet) { return resource.getLabels().toArray(); } else if (parentElement instanceof String) { return resource.getTopics((String) parentElement).toArray(); } return null; } private Object[] getChildrenForAssigneeResource( IAssigneeResource resource, Object parentElement) { if (parentElement instanceof IWorkbookRef || parentElement instanceof ISheet) { return resource.getAssignees().toArray(); } else if (parentElement instanceof String) { return resource.getTopics((String) parentElement).toArray(); } return null; } private Object getParentForMarkerResource(IMarkerResource resource, Object element) { if (element instanceof IMarkerGroup) { return resource.getSource(); } else if (element instanceof IMarker) { return ((IMarker) element).getParent(); } else if (element instanceof ITopic) { Set<String> ids = resource.getMarkerIds(); for (String markerId : ids) { if (resource.getTopics(markerId).contains(element)) { IMarker marker = resource.getMarker(markerId); return marker; } } } return null; } private Object getParentForLabelResource(ILabelResource resource, Object element) { if (element instanceof String) { return resource.getSource(); } else if (element instanceof ITopic) { Set<String> labels = resource.getLabels(); for (String lab : labels) { if (resource.getTopics(lab).contains(element)) return lab; } } return null; } private Object getParentForAssigneeResource(IAssigneeResource resource, Object element) { if (element instanceof String) { return resource.getSource(); } else if (element instanceof ITopic) { Set<String> assignees = resource.getAssignees(); for (String assignee : assignees) { if (resource.getTopics(assignee).contains(element)) return assignee; } } return null; } } private class OutlineLabelProvider extends LabelProvider { public String getText(Object element) { if (element instanceof IWorkbookRef) { return ((IWorkbookRef) element).getName(); } else if (element instanceof ISheet) { return ((ISheet) element).getTitleText(); } else if (element instanceof IMarkerGroup) { return ((IMarkerGroup) element).getName(); } else if (element instanceof IMarker) { return ((IMarker) element).getName(); } else if (element instanceof ITopic) { return ((ITopic) element).getTitleText(); } else if (element instanceof String) { return (String) element; } return super.getText(element); } public Image getImage(Object element) { if (element instanceof IWorkbookRef) { ImageDescriptor imageDescriptor = MindMapUI.getImages() .get(IMindMapImages.WORKBOOK, true); return localResourceManager.createImage(imageDescriptor); } else if (element instanceof ISheet) { return localResourceManager.createImage( MindMapUI.getImages().get(IMindMapImages.SHEET, true)); } else if (element instanceof ITopic) { // return localResourceManager.createImage(MindMapUI.getImages() // .getTopicIcon((ITopic) element, true)); } else if (element instanceof IMarker) { ImageDescriptor imageDescriptor = MarkerImageDescriptor .createFromMarker((IMarker) element); return localResourceManager.createImage(imageDescriptor); } Object input = getInput(); if (input instanceof ILabelResource) { if (element instanceof String) return localResourceManager.createImage(MindMapUI .getImages().get(IMindMapImages.LABEL, true)); } else if (input instanceof IAssigneeResource) { if (element instanceof String) { URL url = FileLocator.find( Platform.getBundle(MindMapUIPlugin.PLUGIN_ID), new Path("$nl$/icons/assignee.gif"), null); //$NON-NLS-1$ return localResourceManager .createImage(ImageDescriptor.createFromURL(url)); } } return super.getImage(element); } } private class OutlineViewerSorter extends ViewerComparator { public int category(Object element) { if (element instanceof IWorkbookRef || element instanceof ISheet) return 1; else if (element instanceof IMarkerGroup) return 2; else if (element instanceof IMarker) return 4; else if (element instanceof String) return 8; else if (element instanceof ITopic) return 16; return super.category(element); } public int compare(Viewer viewer, Object e1, Object e2) { Object input = getInput(); if (input instanceof ITaskDateResource) { ITaskDateResource resource = (ITaskDateResource) input; if (e1 instanceof ITopic && e2 instanceof ITopic) { String pTaskDate = resource.getTaskDate((ITopic) e1); String qTaskDate = resource.getTaskDate((ITopic) e2); int compareDate = super.compare(viewer, pTaskDate, qTaskDate); return compareDate == 0 ? super.compare(viewer, e1, e2) : compareDate; } } if (input instanceof IAZResource) { if (e1 instanceof ITopic && e2 instanceof ITopic) { if (((IAZResource) input).isPositiveSequence()) return super.compare(viewer, e1, e2); else return super.compare(viewer, e2, e1); } } if (e1 instanceof IMarkerGroup && e2 instanceof IMarkerGroup) { IMarkerSheet pSheet = ((IMarkerGroup) e1).getOwnedSheet(); IMarkerSheet qSheet = ((IMarkerGroup) e2).getOwnedSheet(); if (pSheet == qSheet) { List<IMarkerGroup> markerGroups = pSheet.getMarkerGroups(); return markerGroups.indexOf(e1) - markerGroups.indexOf(e2); } else { if (MindMapUI.getResourceManager() .getSystemMarkerSheet() == pSheet) return -10000; else return 10000; } } else if (e1 instanceof IMarker && e2 instanceof IMarker) { IMarkerGroup pMarkerGroup = ((IMarker) e1).getParent(); IMarkerGroup qMarkerGroup = ((IMarker) e2).getParent(); if (pMarkerGroup == qMarkerGroup && pMarkerGroup != null) { List<IMarker> markers = pMarkerGroup.getMarkers(); return markers.indexOf(e1) - markers.indexOf(e2); } } return super.compare(viewer, e1, e2); } } private String viewerType; private LocalResourceManager localResourceManager; public OutlineViewer(Composite parent, String viewerType) { super(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION); this.viewerType = viewerType; localResourceManager = new LocalResourceManager( JFaceResources.getResources(), parent); initViewer(viewerType); } private void initViewer(String viewerType) { setContentProvider(new OutlineContentProvider()); setLabelProvider(new OutlineLabelProvider()); setComparator(new OutlineViewerSorter()); if (VIEWERTYPE_MULITCOLUMN.equals(viewerType)) { getTree().setHeaderVisible(true); TreeViewerColumn taskColumn = new TreeViewerColumn(this, SWT.LEFT); taskColumn.getColumn() .setText(MindMapMessages.OutlineViewer_Task_col); taskColumn.getColumn().setWidth(200); taskColumn.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { Object input = getInput(); if (input instanceof ITaskDateResource) { if (element instanceof ITopic) { return ((ITopic) element).getTitleText(); } } return null; } }); TreeViewerColumn dateColumn = new TreeViewerColumn(this, SWT.LEFT); dateColumn.getColumn().setWidth(200); dateColumn.setLabelProvider(new ColumnLabelProvider() { @Override public String getText(Object element) { Object input = getInput(); if (input instanceof ITaskDateResource) { if (element instanceof ITopic) { return ((ITaskDateResource) input) .getTaskDate((ITopic) element); } } return null; } }); } } public String getViewerType() { return viewerType; } public void setFocus() { Control control = getControl(); if (control != null && !control.isDisposed()) control.setFocus(); } }