package org.keplerproject.ldt.ui.editors; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.texteditor.IDocumentProvider; import org.eclipse.ui.views.contentoutline.ContentOutlinePage; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; import org.keplerproject.ldt.ui.LDTUIPlugin; import org.keplerproject.ldt.ui.editors.outline.LuaOutlineContentProvider; import org.keplerproject.ldt.ui.editors.outline.LuaOutlineLabelProvider; import org.keplerproject.ldt.ui.editors.outline.LuaOutlineContentProvider.FunctionDefinition; public class LuaOutlinePage extends ContentOutlinePage implements IContentOutlinePage { LuaEditor fTargetEditor; IAction fSortByName; /** * Provide a viewer comparator that sorts items based on their offset * locations in the document. This allows items to be listed in their * order of appearance in the file. */ class DocumentOffsetComparator extends ViewerComparator { public int compare(Viewer viewer, Object arg0, Object arg1) { if(!(arg0 instanceof FunctionDefinition) || !(arg1 instanceof FunctionDefinition)) { return super.compare(viewer, arg0, arg1); } FunctionDefinition fd0 = (FunctionDefinition)arg0; FunctionDefinition fd1 = (FunctionDefinition)arg1; return fd0.getCharacterOffset() - fd1.getCharacterOffset(); } public boolean isSorterProperty(Object element, String property) { if(LuaOutlineContentProvider.OFFSET_PROPERTY.equals(property)) { return true; } return false; } } public LuaOutlinePage(IDocumentProvider documentProvider, LuaEditor luaEditor) { super(); setInput(luaEditor); } public void setInput(LuaEditor luaEditor) { fTargetEditor = (LuaEditor)luaEditor; TreeViewer viewer = getTreeViewer(); if(viewer != null) { viewer.setInput(fTargetEditor); } } public void createControl(Composite parent) { createActions(); super.createControl(parent); TreeViewer viewer = getTreeViewer(); viewer.setLabelProvider(new LuaOutlineLabelProvider()); viewer.setContentProvider(new LuaOutlineContentProvider()); viewer.setInput(fTargetEditor); viewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { setEditorPosition(); } }); addActions(); updateSortingStyle(); } protected void createActions() { String SORT_ICON_PATH = "icons/sort.gif"; fSortByName = new Action("Sort") { public void run() { updateSortingStyle(); } }; fSortByName.setChecked(false); fSortByName.setImageDescriptor(LDTUIPlugin.getImageDescriptor(SORT_ICON_PATH)); } protected void addActions() { IToolBarManager manager = getSite().getActionBars().getToolBarManager(); manager.add(fSortByName); } protected void updateSortingStyle() { TreeViewer viewer = getTreeViewer(); if(viewer == null) { return; } if(fSortByName.isChecked()) { viewer.setComparator(new ViewerComparator()); } else { viewer.setComparator(new DocumentOffsetComparator()); } } protected void setEditorPosition() { IStructuredSelection ss = (IStructuredSelection)getSelection(); if(ss == null || ss.isEmpty()) { return; } Object item = ss.getFirstElement(); if(!(item instanceof FunctionDefinition)) { return; } FunctionDefinition fd = (FunctionDefinition)item; TextSelection ts = new TextSelection(fd.getCharacterOffset(), fd.getCharacterEndOffset() - fd.getCharacterOffset()); ISelectionProvider provider = fTargetEditor.getSelectionProvider(); if(provider != null) { provider.setSelection(ts); } } }