| /******************************************************************************* |
| * Copyright (c) 2000, 2006 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 org.eclipse.ui.views.framelist; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| import org.eclipse.core.runtime.IAdaptable; |
| import org.eclipse.jface.viewers.AbstractTreeViewer; |
| import org.eclipse.jface.viewers.ILabelProvider; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.ui.IElementFactory; |
| import org.eclipse.ui.IMemento; |
| import org.eclipse.ui.IPersistableElement; |
| import org.eclipse.ui.PlatformUI; |
| |
| /** |
| * Frame for tree viewers. This capture the viewer's input element, selection, |
| * and expanded elements. |
| */ |
| public class TreeFrame extends Frame { |
| private static final String TAG_SELECTION = "selection"; //$NON-NLS-1$ |
| |
| private static final String TAG_EXPANDED = "expanded"; //$NON-NLS-1$ |
| |
| private static final String TAG_ELEMENT = "element"; //$NON-NLS-1$ |
| |
| private static final String TAG_FRAME_INPUT = "frameInput"; //$NON-NLS-1$ |
| |
| private static final String TAG_FACTORY_ID = "factoryID"; //$NON-NLS-1$ |
| |
| private AbstractTreeViewer viewer; |
| |
| private Object input; |
| |
| private ISelection selection; |
| |
| private Object[] expandedElements; |
| |
| /** |
| * Constructs a frame for the specified tree viewer. |
| * The frame's input, name and tool tip text are not set. |
| * |
| * @param viewer the tree viewer |
| */ |
| public TreeFrame(AbstractTreeViewer viewer) { |
| this.viewer = viewer; |
| } |
| |
| /** |
| * Constructs a frame for the specified tree viewer. |
| * The frame's input element is set to the specified input element. |
| * The frame's name and tool tip text are set to the text for the input |
| * element, as provided by the viewer's label provider. |
| * |
| * @param viewer the tree viewer |
| * @param input the input element |
| */ |
| public TreeFrame(AbstractTreeViewer viewer, Object input) { |
| this(viewer); |
| setInput(input); |
| ILabelProvider provider = (ILabelProvider) viewer.getLabelProvider(); |
| String name = provider.getText(input); |
| if(name == null) { |
| name = "";//$NON-NLS-1$ |
| } |
| setName(name); |
| setToolTipText(name); |
| } |
| |
| /** |
| * Returns the expanded elements. |
| * |
| * @return the expanded elements |
| */ |
| public Object[] getExpandedElements() { |
| return expandedElements; |
| } |
| |
| /** |
| * Returns the input element. |
| * |
| * @return the input element |
| */ |
| public Object getInput() { |
| return input; |
| } |
| |
| /** |
| * Returns the selection. |
| * |
| * @return the selection |
| */ |
| public ISelection getSelection() { |
| return selection; |
| } |
| |
| /** |
| * Returns the tree viewer. |
| * |
| * @return the tree viewer |
| */ |
| public AbstractTreeViewer getViewer() { |
| return viewer; |
| } |
| |
| /** |
| * Restore IPersistableElements from the specified memento. |
| * |
| * @param memento memento to restore elements from |
| * @return list of restored elements. May be empty. |
| */ |
| private List restoreElements(IMemento memento) { |
| IMemento[] elementMem = memento.getChildren(TAG_ELEMENT); |
| List elements = new ArrayList(elementMem.length); |
| |
| for (int i = 0; i < elementMem.length; i++) { |
| String factoryID = elementMem[i].getString(TAG_FACTORY_ID); |
| if (factoryID != null) { |
| IElementFactory factory = PlatformUI.getWorkbench() |
| .getElementFactory(factoryID); |
| if (factory != null) { |
| elements.add(factory.createElement(elementMem[i])); |
| } |
| } |
| } |
| return elements; |
| } |
| |
| /** |
| * Restore the frame from the specified memento. |
| * |
| * @param memento memento to restore frame from |
| */ |
| public void restoreState(IMemento memento) { |
| IMemento childMem = memento.getChild(TAG_FRAME_INPUT); |
| |
| if (childMem == null) { |
| return; |
| } |
| |
| String factoryID = childMem.getString(TAG_FACTORY_ID); |
| IAdaptable frameInput = null; |
| if (factoryID != null) { |
| IElementFactory factory = PlatformUI.getWorkbench() |
| .getElementFactory(factoryID); |
| if (factory != null) { |
| frameInput = factory.createElement(childMem); |
| } |
| } |
| if (frameInput != null) { |
| input = frameInput; |
| } |
| IMemento expandedMem = memento.getChild(TAG_EXPANDED); |
| if (expandedMem != null) { |
| List elements = restoreElements(expandedMem); |
| expandedElements = elements.toArray(new Object[elements.size()]); |
| } else { |
| expandedElements = new Object[0]; |
| } |
| IMemento selectionMem = memento.getChild(TAG_SELECTION); |
| if (selectionMem != null) { |
| List elements = restoreElements(selectionMem); |
| selection = new StructuredSelection(elements); |
| } else { |
| selection = StructuredSelection.EMPTY; |
| } |
| } |
| |
| /** |
| * Save the specified elements to the given memento. |
| * The elements have to be adaptable to IPersistableElement. |
| * |
| * @param elements elements to persist |
| * @param memento memento to persist elements in |
| */ |
| private void saveElements(Object[] elements, IMemento memento) { |
| for (int i = 0; i < elements.length; i++) { |
| if (elements[i] instanceof IAdaptable) { |
| IPersistableElement persistable = (IPersistableElement) ((IAdaptable) elements[i]) |
| .getAdapter(IPersistableElement.class); |
| if (persistable != null) { |
| IMemento elementMem = memento.createChild(TAG_ELEMENT); |
| elementMem.putString(TAG_FACTORY_ID, persistable |
| .getFactoryId()); |
| persistable.saveState(elementMem); |
| } |
| } |
| } |
| } |
| |
| /** |
| * Save the frame state in the given memento. |
| * |
| * @param memento memento to persist the frame state in. |
| */ |
| public void saveState(IMemento memento) { |
| if (!(input instanceof IAdaptable)) { |
| return; |
| } |
| |
| IPersistableElement persistable = (IPersistableElement) ((IAdaptable) input) |
| .getAdapter(IPersistableElement.class); |
| if (persistable != null) { |
| IMemento frameMemento = memento.createChild(TAG_FRAME_INPUT); |
| |
| frameMemento.putString(TAG_FACTORY_ID, persistable.getFactoryId()); |
| persistable.saveState(frameMemento); |
| |
| if (expandedElements.length > 0) { |
| IMemento expandedMem = memento.createChild(TAG_EXPANDED); |
| saveElements(expandedElements, expandedMem); |
| } |
| // always IStructuredSelection since we only deal with tree viewers |
| if (selection instanceof IStructuredSelection) { |
| Object[] elements = ((IStructuredSelection) selection) |
| .toArray(); |
| if (elements.length > 0) { |
| IMemento selectionMem = memento.createChild(TAG_SELECTION); |
| saveElements(elements, selectionMem); |
| } |
| } |
| } |
| } |
| |
| /** |
| * Sets the input element. |
| * |
| * @param input the input element |
| */ |
| public void setInput(Object input) { |
| this.input = input; |
| } |
| |
| /** |
| * Sets the expanded elements. |
| * |
| * @param expandedElements the expanded elements |
| */ |
| public void setExpandedElements(Object[] expandedElements) { |
| this.expandedElements = expandedElements; |
| } |
| |
| /** |
| * Sets the selection. |
| * |
| * @param selection the selection |
| */ |
| public void setSelection(ISelection selection) { |
| this.selection = selection; |
| } |
| } |