/******************************************************************************* * Copyright (c) 2011 Sebastian Benz. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Sebastian Benz - initial API and implementation ******************************************************************************/ package de.sebastianbenz.task.ui.views; import static org.eclipse.emf.ecore.util.EcoreUtil.getURI; import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IMemento; import org.eclipse.ui.IViewSite; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; import org.eclipse.xtext.ui.editor.IURIEditorOpener; import com.google.inject.Inject; import de.sebastianbenz.task.ui.contentassist.TextProposalProvider; public class TodoView extends ViewPart { /** * The ID of the view as specified by the extension. */ public static final String ID = "de.sebastianbenz.task.ui.views.TodoView"; private TreeViewer viewer; // private static class ContentSorter extends ViewerSorter { // @Override // public int compare(Viewer viewer, Object e1, Object e2) { // if (!(e1 instanceof Content)) { // return super.compare(viewer, e1, e2); // } // if (!(e2 instanceof Content)) { // return super.compare(viewer, e1, e2); // } // return ((Content) e1).getValue().compareTo( // ((Content) e2).getValue()); // } // } @Inject private TodoViewLabelProvider labelProvider; @Inject private ContentProvider contentProvider; @Inject private TextProposalProvider proposalProvider; @Inject private QueryBasedFilter queryBasedViewFilter; @Inject private GlobalStateManager globalState; private Text queryText; // private Action actionCollapseAll; // // private Action actionSort; private Action openInEditor; @Inject private IURIEditorOpener editorOpener; @Inject private TreeState treeState; // private DrillDownAdapter drillDownAdapter; private IMemento memento; @Override public void createPartControl(Composite parent) { globalState.init(); GridLayout layout = new GridLayout(); layout.numColumns = 1; parent.setLayout(layout); configureQueryField(parent); configureTree(parent); configureActions(); PlatformUI .getWorkbench() .getHelpSystem() .setHelp(viewer.getControl(), "de.sebastianbenz.task.ui.viewer"); restoreState(); } private void restoreState() { if (memento == null) { return; } viewer.setExpandedElements(treeState.restoreExpandedElements(memento, globalState)); queryText.setText(treeState.restoreQuery(memento)); } @Override public void init(IViewSite site, IMemento memento) throws PartInitException { super.init(site, memento); this.memento = memento; } @Override public void saveState(IMemento memento) { super.saveState(memento); treeState.saveExpandedElements(viewer.getExpandedElements(), memento); treeState.saveQuery(queryText.getText(), memento); } protected void configureQueryField(Composite parent) { queryText = new Text(parent, SWT.SINGLE | SWT.BORDER | SWT.ICON_SEARCH | SWT.SEARCH | SWT.ICON_CANCEL); GridData gridData = new GridData(SWT.LEFT, SWT.TOP, true, false); gridData.horizontalAlignment = GridData.FILL; queryText.setLayoutData(gridData); queryText.setToolTipText("Enter a query..."); queryText.setSelection(0, queryText.getText().length()); queryText.addModifyListener(queryBasedViewFilter); proposalProvider.configure(queryText); } protected void configureTree(Composite parent) { viewer = new TreeViewer(parent); GridData gridData = new GridData(SWT.LEFT, SWT.TOP, true, true); gridData.horizontalAlignment = GridData.FILL; gridData.verticalAlignment = GridData.FILL; viewer.getTree().setLayoutData(gridData); viewer.setAutoExpandLevel(1); //viewer.setSorter(new ContentSorter()); viewer.setLabelProvider(labelProvider); contentProvider.init(globalState); viewer.setContentProvider(contentProvider); viewer.setUseHashlookup(true); viewer.setFilters(new ViewerFilter[] { queryBasedViewFilter }); // drillDownAdapter = new DrillDownAdapter(viewer); viewer.setInput(globalState.getRoot()); } protected void configureActions() { makeActions(); IActionBars bars = ((IViewSite) getSite()).getActionBars(); fillLocalPullDown(bars.getMenuManager()); fillLocalToolBar(bars.getToolBarManager()); hookDoubleClickAction(); } private void fillLocalPullDown(IMenuManager manager) { // manager.add(actionCollapseAll); // manager.add(new Separator()); // manager.add(actionSort); } private void fillLocalToolBar(IToolBarManager manager) { // manager.add(actionCollapseAll); // manager.add(actionSort); // manager.add(new Separator()); // drillDownAdapter.addNavigationActions(manager); } private void makeActions() { // actionCollapseAll = createActionCollapseAll(); // actionCollapseAll.setText("Collapse all"); // actionCollapseAll.setImageDescriptor(image("collapseall.gif")); // // actionSort = createActionSort(); // actionSort.setText("Sort"); // actionSort.setImageDescriptor(image("sort.gif")); openInEditor = createActionJumpToElement(); } // private ImageDescriptor image(String string) { // String pluginId = TaskActivator.getInstance().getBundle() // .getSymbolicName(); // return TaskActivator.imageDescriptorFromPlugin(pluginId, "icons/" // + string); // } // // private Action createActionCollapseAll() { // return new Action() { // @Override // public void run() { // viewer.collapseAll(); // } // }; // } // // private Action createActionSort() { // return new Action("Sort", IAction.AS_CHECK_BOX) { // @Override // public void run() { // // if (isChecked()) { // viewer.setSorter(new ContentSorter()); // } else { // viewer.setSorter(null); // } // viewer.refresh(); // } // }; // } private Action createActionJumpToElement() { return new Action() { @Override public void run() { ISelection selection = viewer.getSelection(); Object obj = ((IStructuredSelection) selection) .getFirstElement(); if (obj instanceof EObject) { editorOpener.open(getURI((EObject) obj), true); } } }; } private void hookDoubleClickAction() { viewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { openInEditor.run(); } }); } public TreeViewer getTreeViewer() { return viewer; } /** * Passing the focus request to the viewer's control. */ public void setFocus() { queryText.setFocus(); } public GlobalStateManager getGlobaState() { return globalState; } @Override public void dispose() { super.dispose(); globalState.dispose(); } public void setQuery(String query) { String currentText = queryText.getText(); if(currentText != null && !currentText.trim().equals(query.trim())){ queryText.setText(query); } } }