blob: 5869be83b59f0df2a4440b9883d962190371291b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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;
}
}