Java tutorial
/******************************************************************************* * Copyright (c) 2000, 2011 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package com.siteview.mde.internal.ui.editor; import com.siteview.mde.internal.core.monitor.ImportObject; import java.util.ArrayList; import org.eclipse.jface.viewers.*; import com.siteview.mde.core.*; import com.siteview.mde.internal.core.text.IDocumentElementNode; import com.siteview.mde.internal.ui.MDEPlugin; import com.siteview.mde.internal.ui.MDEPluginImages; import com.siteview.mde.internal.ui.elements.DefaultContentProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.*; import org.eclipse.ui.forms.editor.IFormPage; public class FormOutlinePage extends MDEOutlinePage implements IModelChangedListener, ISortableContentOutlinePage { private boolean fStale; private ViewerComparator fViewerComparator; private boolean fSorted; public class BasicContentProvider extends DefaultContentProvider implements ITreeContentProvider { public Object[] getElements(Object obj) { return getPages(); } public Object[] getChildren(Object obj) { return FormOutlinePage.this.getChildren(obj); } public boolean hasChildren(Object obj) { return getChildren(obj).length > 0; } public Object getParent(Object obj) { return null; } } public class BasicLabelProvider extends LabelProvider { private ILabelProvider fWrappedLabelProvider; public BasicLabelProvider(ILabelProvider ilp) { fWrappedLabelProvider = ilp; } public String getText(Object obj) { if (obj instanceof IFormPage) return ((IFormPage) obj).getTitle(); return fWrappedLabelProvider.getText(obj); } public Image getImage(Object obj) { if (obj instanceof IFormPage) return MDEPlugin.getDefault().getLabelProvider().get(MDEPluginImages.DESC_PAGE_OBJ); return fWrappedLabelProvider.getImage(obj); } } public class BasicComparator extends ViewerComparator { /* (non-Javadoc) * @see org.eclipse.jface.viewers.ViewerSorter#category(java.lang.Object) */ public int category(Object element) { Object[] pages = getPages(); for (int i = 0; i < pages.length; i++) { if (pages[i] == element) { return i; } } return Integer.MAX_VALUE; } } protected TreeViewer fTreeViewer; protected boolean fEditorSelection = false; protected boolean fOutlineSelection = false; public FormOutlinePage(MDEFormEditor editor) { super(editor); } public ITreeContentProvider createContentProvider() { return new BasicContentProvider(); } public ViewerComparator createOutlineSorter() { return new BasicComparator(); } public void createControl(Composite parent) { Tree widget = new Tree(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); fTreeViewer = new TreeViewer(widget); fTreeViewer.addSelectionChangedListener(this); fTreeViewer.setContentProvider(createContentProvider()); fTreeViewer.setLabelProvider(createLabelProvider()); fViewerComparator = createOutlineSorter(); if (fSorted) fTreeViewer.setComparator(fViewerComparator); else fTreeViewer.setComparator(null); fTreeViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS); fTreeViewer.setUseHashlookup(true); fTreeViewer.setInput(fEditor); IBaseModel model = fEditor.getAggregateModel(); if (model instanceof IModelChangeProvider) ((IModelChangeProvider) model).addModelChangedListener(this); } public ILabelProvider createLabelProvider() { return new BasicLabelProvider(MDEPlugin.getDefault().getLabelProvider()); } public void dispose() { IBaseModel model = fEditor.getAggregateModel(); if (model instanceof IModelChangeProvider) ((IModelChangeProvider) model).removeModelChangedListener(this); super.dispose(); } public Control getControl() { return fTreeViewer != null ? fTreeViewer.getControl() : null; } private Object[] getPages() { ArrayList formPages = new ArrayList(); IFormPage[] pages = fEditor.getPages(); for (int i = 0; i < pages.length; i++) { if (pages[i].isEditor() == false) formPages.add(pages[i]); } return formPages.toArray(); } public void modelChanged(IModelChangedEvent event) { IFormPage page = fEditor.getActivePageInstance(); fStale = true; if (page.isEditor() == false) refresh(); } public void refresh() { if (fStale) { final Control control = getControl(); if (control == null || control.isDisposed()) return; control.getDisplay().asyncExec(new Runnable() { public void run() { if (!fTreeViewer.getControl().isDisposed()) { fTreeViewer.refresh(); fTreeViewer.expandAll(); fStale = false; } } }); } } protected String getParentPageId(Object item) { if (item instanceof IFormPage) return ((IFormPage) item).getId(); return null; } protected Object[] getChildren(Object parent) { return new Object[0]; } public void selectionChanged(Object item) { IFormPage page = fEditor.getActivePageInstance(); String id = getParentPageId(item); IFormPage newPage = null; if (id != null && (page == null || !page.getId().equals(id))) newPage = fEditor.setActivePage(id); IFormPage revealPage = newPage != null ? newPage : page; if (revealPage != null && !(item instanceof IFormPage)) revealPage.selectReveal(item); } public void selectionChanged(SelectionChangedEvent event) { if (fEditorSelection) return; fOutlineSelection = true; try { ISelection selection = event.getSelection(); if (selection.isEmpty() == false && selection instanceof IStructuredSelection) { IStructuredSelection ssel = (IStructuredSelection) selection; Object item = ssel.getFirstElement(); selectionChanged(item); } fireSelectionChanged(selection); } finally { fOutlineSelection = false; } } public void setFocus() { if (fTreeViewer != null) fTreeViewer.getTree().setFocus(); } public ISelection getSelection() { if (fTreeViewer == null) return StructuredSelection.EMPTY; return fTreeViewer.getSelection(); } public void sort(boolean sorting) { fSorted = sorting; if (fTreeViewer != null) if (sorting) fTreeViewer.setComparator(fViewerComparator); else fTreeViewer.setComparator(null); } /* * (non-Javadoc) Method declared on ISelectionProvider. */ public void setSelection(ISelection selection) { if (fOutlineSelection) return; fEditorSelection = true; try { if (fTreeViewer == null) return; if (selection != null && !selection.isEmpty() && selection instanceof IStructuredSelection) { Object item = ((IStructuredSelection) selection).getFirstElement(); if (item instanceof ImportObject) { selection = new StructuredSelection(((ImportObject) item).getImport()); } if (item instanceof IDocumentElementNode) { while (null == fTreeViewer.testFindItem(item)) { item = ((IDocumentElementNode) item).getParentNode(); if (item == null) { break; } selection = new StructuredSelection(item); } } } fTreeViewer.setSelection(selection); } finally { fEditorSelection = false; } } protected TreeViewer getTreeViewer() { return fTreeViewer; } }