blob: dcc067e65c352da6da80596f4dd784637f3e77da [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 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 org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
/**
* Frame source for tree viewers, which uses <code>TreeFrame</code> to capture
* the state of the tree viewer.
*
* @see TreeFrame
*/
public class TreeViewerFrameSource implements IFrameSource {
private AbstractTreeViewer viewer;
/**
* Constructs a new tree viewer frame source for the specified tree viewer.
*
* @param viewer the tree viewer
*/
public TreeViewerFrameSource(AbstractTreeViewer viewer) {
this.viewer = viewer;
}
/**
* Connects this source as a listener on the frame list,
* so that when the current frame changes, the viewer is updated.
*/
public void connectTo(FrameList frameList) {
frameList.addPropertyChangeListener(new IPropertyChangeListener() {
public void propertyChange(PropertyChangeEvent event) {
TreeViewerFrameSource.this.handlePropertyChange(event);
}
});
}
/**
* Returns a new tree frame capturing the specified input element.
*
* @param input the input element
* @return the tree frame
*/
protected TreeFrame createFrame(Object input) {
return new TreeFrame(viewer, input);
}
/**
* Updates the viewer in response to the current frame changing.
*
* @param frame the new value for the current frame
*/
protected void frameChanged(TreeFrame frame) {
viewer.getControl().setRedraw(false);
viewer.setInput(frame.getInput());
viewer.setExpandedElements(frame.getExpandedElements());
viewer.setSelection(frame.getSelection(), true);
viewer.getControl().setRedraw(true);
}
/**
* Returns the current frame.
*
* @param flags a bit-wise OR of the frame source flag constants
* @return the current frame
*/
protected Frame getCurrentFrame(int flags) {
Object input = viewer.getInput();
TreeFrame frame = createFrame(input);
if ((flags & IFrameSource.FULL_CONTEXT) != 0) {
frame.setSelection(viewer.getSelection());
frame.setExpandedElements(viewer.getExpandedElements());
}
return frame;
}
/* (non-Javadoc)
* Method declared on IFrameSource.
*/
public Frame getFrame(int whichFrame, int flags) {
switch (whichFrame) {
case IFrameSource.CURRENT_FRAME:
return getCurrentFrame(flags);
case IFrameSource.PARENT_FRAME:
return getParentFrame(flags);
case IFrameSource.SELECTION_FRAME:
return getSelectionFrame(flags);
default:
return null;
}
}
/**
* Returns the parent frame, or <code>null</code> if there is no parent frame.
*
* @param flags a bit-wise OR of the frame source flag constants
* @return the parent frame, or <code>null</code>
*/
protected Frame getParentFrame(int flags) {
Object input = viewer.getInput();
ITreeContentProvider provider = (ITreeContentProvider) viewer
.getContentProvider();
Object parent = provider.getParent(input);
if (parent == null) {
return null;
} else {
TreeFrame frame = createFrame(parent);
if ((flags & IFrameSource.FULL_CONTEXT) != 0) {
frame.setSelection(viewer.getSelection());
// include current input in expanded set
Object[] expanded = viewer.getExpandedElements();
Object[] newExpanded = new Object[expanded.length + 1];
System.arraycopy(expanded, 0, newExpanded, 0, expanded.length);
newExpanded[newExpanded.length - 1] = input;
frame.setExpandedElements(newExpanded);
}
return frame;
}
}
/**
* Returns the frame for the selection, or <code>null</code> if there is no
* frame for the selection.
*
* @param flags a bit-wise OR of the frame source flag constants
* @return the selection frame, or <code>null</code>
*/
protected Frame getSelectionFrame(int flags) {
IStructuredSelection sel = (IStructuredSelection) viewer.getSelection();
if (sel.size() == 1) {
Object o = sel.getFirstElement();
if (viewer.isExpandable(o)) {
TreeFrame frame = createFrame(o);
if ((flags & IFrameSource.FULL_CONTEXT) != 0) {
frame.setSelection(viewer.getSelection());
frame.setExpandedElements(viewer.getExpandedElements());
}
return frame;
}
}
return null;
}
/**
* Returns the tree viewer.
*
* @return the tree viewer
*/
public AbstractTreeViewer getViewer() {
return viewer;
}
/**
* Handles a property change event from the frame list.
* Calls <code>frameChanged</code> when the current frame changes.
*/
protected void handlePropertyChange(PropertyChangeEvent event) {
if (FrameList.P_CURRENT_FRAME.equals(event.getProperty())) {
frameChanged((TreeFrame) event.getNewValue());
}
}
}