blob: b122e2b14cb6332fcf71290003b26f7622549cbd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2007 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
* Kiryl Kazakevich, Intel - bug 88359
*******************************************************************************/
package org.eclipse.ui.internal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.util.Geometry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.accessibility.AccessibleAdapter;
import org.eclipse.swt.accessibility.AccessibleEvent;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Cursor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPreferenceConstants;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.dnd.AbstractDropTarget;
import org.eclipse.ui.internal.dnd.DragUtil;
import org.eclipse.ui.internal.dnd.IDragOverListener;
import org.eclipse.ui.internal.dnd.IDropTarget;
import org.eclipse.ui.internal.layout.CellData;
import org.eclipse.ui.internal.layout.CellLayout;
import org.eclipse.ui.internal.layout.IWindowTrim;
import org.eclipse.ui.internal.layout.LayoutUtil;
import org.eclipse.ui.internal.layout.Row;
import org.eclipse.ui.internal.util.PrefUtil;
import org.eclipse.ui.presentations.PresentationUtil;
import org.osgi.framework.Bundle;
/**
* Represents the fast view bar.
*
* <p>The set of fastviews are obtained from the WorkbenchWindow that
* is passed into the constructor. The set of fastviews may be refreshed to
* match the state of the perspective by calling the update(...) method.</p>
*
* @see org.eclipse.ui.internal.FastViewPane
*/
public class FastViewBar implements IWindowTrim {
public static String FASTVIEWBAR_ID = "org.eclise.ui.internal.FastViewBar"; //$NON-NLS-1$
private ToolBarManager fastViewBar;
private MenuManager fastViewBarMenuManager;
private MenuManager showViewMenuMgr;
private FastViewBarContextMenuContribution contextContributionItem;
private WorkbenchWindow window;
private IViewReference selection;
// "New Fast View" 'Button' fields
private MenuManager newFastViewMenuMgr;
private Composite fvbComposite;
private ToolBar menuTB;
private ToolItem menuItem;
private CellData toolBarData;
private static final int HIDDEN_WIDTH = 5;
private int oldLength = 0;
private ViewDropTarget dropTarget;
private Listener dragListener = new Listener() {
public void handleEvent(Event event) {
Point position = DragUtil.getEventLoc(event);
IViewReference ref = getViewAt(position);
if (ref == null) {
startDraggingFastViewBar(position, false);
} else {
startDraggingFastView(ref, position, false);
}
}
};
// Map of string view IDs onto Booleans (true iff horizontally aligned)
private Map viewOrientation = new HashMap();
private Listener addMenuListener = new Listener() {
public void handleEvent(Event event) {
Point loc = new Point(event.x, event.y);
if (event.type == SWT.MenuDetect) {
showAddFastViewPopup(loc);
}
}
};
private Listener menuListener = new Listener() {
public void handleEvent(Event event) {
Point loc = new Point(event.x, event.y);
if (event.type == SWT.MenuDetect) {
showFastViewBarPopup(loc);
}
}
};
private int fCurrentSide = SWT.DEFAULT;
private boolean hasNewFastViewDisabled = false;
class ViewDropTarget extends AbstractDropTarget {
List panes;
ToolItem position;
/**
* @param panesToDrop the list of ViewPanes to drop at the given position
*/
public ViewDropTarget(List panesToDrop, ToolItem position) {
setTarget(panesToDrop, position);
}
public void setTarget(List panesToDrop, ToolItem position) {
panes = panesToDrop;
this.position = position;
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.dnd.IDropTarget#drop()
*/
public void drop() {
IViewReference view = getViewFor(position);
Iterator iter = panes.iterator();
while (iter.hasNext()) {
ViewPane pane = (ViewPane) iter.next();
IViewReference ref = pane.getViewReference();
getPerspective().getFastViewManager().addViewReference(FASTVIEWBAR_ID, getIndex(view), ref, true);
// getPage().addFastView(pane.getViewReference());
// getPage().getActivePerspective().moveFastView(
// pane.getViewReference(), view);
}
update(true);
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.dnd.IDropTarget#getCursor()
*/
public Cursor getCursor() {
return DragCursors.getCursor(DragCursors.FASTVIEW);
}
public Rectangle getSnapRectangle() {
if (position == null) {
// As long as the toolbar is not empty, highlight the place
// where this view will appear (we
// may have compressed it to save space when empty, so the actual
// icon location may not be over the toolbar when it is empty)
if (getToolBar().getItemCount() > 0) {
return getLocationOfNextIcon();
}
// If the toolbar is empty, highlight the entire toolbar
return DragUtil.getDisplayBounds(getControl());
}
return Geometry.toDisplay(getToolBar(), position.getBounds());
}
}
/**
* Constructs a new fast view bar for the given workbench window.
*
* @param theWindow
*/
public FastViewBar(WorkbenchWindow theWindow) {
window = theWindow;
hasNewFastViewDisabled = PrefUtil.getAPIPreferenceStore().getBoolean(
IWorkbenchPreferenceConstants.DISABLE_NEW_FAST_VIEW);
// Construct the context menu for the fast view bar area
fastViewBarMenuManager = new MenuManager();
contextContributionItem = new FastViewBarContextMenuContribution(this);
fastViewBarMenuManager.add(contextContributionItem);
if (!hasNewFastViewDisabled) {
// Add "New Fast View" submenu
showViewMenuMgr = new MenuManager(WorkbenchMessages.FastViewBar_show_view, "showView"); //$NON-NLS-1$
IContributionItem showViewMenu = new ShowViewMenu(window, ShowViewMenu.class.getName(), true);
showViewMenuMgr.add(showViewMenu);
fastViewBarMenuManager.add(showViewMenuMgr);
// Construct the context menu for the "New Fast View" 'button'
newFastViewMenuMgr = new MenuManager(WorkbenchMessages.FastViewBar_show_view, "showView"); //$NON-NLS-1$
showViewMenu = new ShowViewMenu(window, ShowViewMenu.class.getName(), true);
newFastViewMenuMgr.add(showViewMenu);
}
}
/**
* Returns the platform's idea of where the fast view bar should be docked in a fresh
* workspace. This value is meaningless after a workspace has been setup, since the
* fast view bar state is then persisted in the workbench. This preference is just
* used for applications that want the initial docking location to be somewhere other
* than bottom.
* @return the initial side to dock on
*/
public static int getInitialSide() {
String loc = PrefUtil.getAPIPreferenceStore().getString(
IWorkbenchPreferenceConstants.INITIAL_FAST_VIEW_BAR_LOCATION);
if (IWorkbenchPreferenceConstants.BOTTOM.equals(loc)) {
return SWT.BOTTOM;
}
if (IWorkbenchPreferenceConstants.LEFT.equals(loc)) {
return SWT.LEFT;
}
if (IWorkbenchPreferenceConstants.RIGHT.equals(loc)) {
return SWT.RIGHT;
}
Bundle bundle = Platform.getBundle(PlatformUI.PLUGIN_ID);
if (bundle != null) {
IStatus status = new Status(
IStatus.WARNING,
PlatformUI.PLUGIN_ID,
IStatus.WARNING,
"Invalid value for " //$NON-NLS-1$
+ PlatformUI.PLUGIN_ID
+ "/" //$NON-NLS-1$
+ IWorkbenchPreferenceConstants.INITIAL_FAST_VIEW_BAR_LOCATION
+ " preference. Value \"" + loc //$NON-NLS-1$
+ "\" should be one of \"" //$NON-NLS-1$
+ IWorkbenchPreferenceConstants.LEFT + "\", \"" //$NON-NLS-1$
+ IWorkbenchPreferenceConstants.BOTTOM
+ "\", or \"" //$NON-NLS-1$
+ IWorkbenchPreferenceConstants.RIGHT + "\".", null); //$NON-NLS-1$
Platform.getLog(bundle).log(status);
}
// use bottom as the default-default
return SWT.BOTTOM;
}
public void setOrientation(IViewReference refToSet, int newState) {
if (newState == getOrientation(refToSet)) {
return;
}
viewOrientation.put(refToSet.getId(), new Integer(newState));
Perspective persp = getPerspective();
if (persp != null) {
IViewReference ref = persp.getActiveFastView();
if (ref != null) {
persp.setActiveFastView(null);
}
persp.setActiveFastView(refToSet);
}
}
/**
* Returns the active workbench page or null if none
*/
private WorkbenchPage getPage() {
if (window == null) {
return null;
}
return window.getActiveWorkbenchPage();
}
/**
* Returns the current perspective or null if none
*/
private Perspective getPerspective() {
WorkbenchPage page = getPage();
if (page == null) {
return null;
}
return page.getActivePerspective();
}
/**
* Creates the underlying SWT fvbComposite for the fast view bar. Will add exactly
* one new fvbComposite to the given composite. Makes no assumptions about the layout
* being used in the parent composite.
*
* @param parent enclosing SWT composite
*/
public void createControl(Composite parent) {
fvbComposite = new Composite(parent, SWT.NONE) {
public Point computeSize(int wHint, int hHint, boolean changed) {
Point size = super.computeSize(wHint, hHint, changed);
if (Geometry.isHorizontal(getSide())) {
if (size.y < TrimUtil.TRIM_DEFAULT_HEIGHT) {
size.y = TrimUtil.TRIM_DEFAULT_HEIGHT;
}
} else {
if (size.x < TrimUtil.TRIM_DEFAULT_HEIGHT) {
size.x = TrimUtil.TRIM_DEFAULT_HEIGHT;
}
}
return size;
}};
String tip = WorkbenchMessages.FastViewBar_0;
fvbComposite.setToolTipText(tip);
fvbComposite.addListener(SWT.MenuDetect, menuListener);
PresentationUtil.addDragListener(fvbComposite, dragListener);
createChildControls();
}
/**
* Create the contents of the fast view bar. The top-level fvbComposite (created by createControl) is a
* composite that is created once over the lifetime of the fast view bar. This method creates the
* rest of the widgetry inside that composite. The controls created by this method will be
* destroyed and recreated if the fast view bar is docked to a different side of the window.
*/
protected void createChildControls() {
int newSide = getSide();
int orientation = Geometry.isHorizontal(newSide) ? SWT.HORIZONTAL
: SWT.VERTICAL;
// Create a ControlLayout apropriate for the new orientation
CellLayout controlLayout;
if (Geometry.isHorizontal(newSide)) {
controlLayout = new CellLayout(0)
.setMargins(0, 0)
.setDefaultRow(Row.growing())
.setDefaultColumn(Row.fixed())
.setColumn(1, Row.growing());
} else {
controlLayout = new CellLayout(1)
.setMargins(0, 3)
.setDefaultColumn(Row.growing())
.setDefaultRow(Row.fixed())
.setRow(1, Row.growing());
}
// Set up the composite for the new orientation
fvbComposite.setLayout(controlLayout);
if (!hasNewFastViewDisabled) {
// Create a toolbar to show an 'Add FastView' menu 'button'
menuTB = new ToolBar(fvbComposite, SWT.FLAT | orientation);
// Construct an item to act as a 'menu button' (a la the PerspectiveSwitcher)
menuItem = new ToolItem(menuTB, SWT.PUSH, 0);
Image tbImage = WorkbenchImages.getImage(IWorkbenchGraphicConstants.IMG_ETOOL_NEW_FASTVIEW);
menuItem.setImage(tbImage);
final String menuTip = WorkbenchMessages.FastViewBar_0;
menuItem.setToolTipText(menuTip);
//new ToolItem(menuTB, SWT.SEPARATOR, 1);
menuTB.getAccessible().addAccessibleListener(new AccessibleAdapter() {
public void getName(AccessibleEvent e) {
e.result = menuTip;
}
});
// Now that the ToolBar is populated calculate its size...
Point size = menuTB.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
menuTB.setBounds(0, 0, size.x, size.y);
// Bring up the 'Add Fast View' menu on a left -or- right button click
// Right click (context menu)
menuItem.addListener(SWT.MenuDetect, addMenuListener);
menuTB.addListener(SWT.MenuDetect, addMenuListener);
// Left Click...
menuItem.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
Rectangle bb = DragUtil.getDisplayBounds(menuTB);
showAddFastViewPopup(new Point(bb.x,bb.y+bb.height));
}
public void widgetDefaultSelected(SelectionEvent e) {
}
});
// try to get the layout correct...
toolBarData = new CellData();
toolBarData.align(SWT.FILL, SWT.FILL);
menuTB.setLayoutData(toolBarData);
}
// Construct the ToolBar containing the 'Fast' views
fastViewBar = new ToolBarManager(SWT.FLAT | SWT.WRAP | orientation);
fastViewBar.add(new ShowFastViewContribution(window));
fastViewBar.createControl(fvbComposite);
getToolBar().addListener(SWT.MenuDetect, menuListener);
IDragOverListener fastViewDragTarget = new IDragOverListener() {
public IDropTarget drag(Control currentControl,
Object draggedObject, Point position,
Rectangle dragRectangle) {
ToolItem targetItem = getToolItem(position);
if (draggedObject instanceof ViewPane) {
ViewPane pane = (ViewPane) draggedObject;
// Can't drag views between windows
if (pane.getWorkbenchWindow() != window) {
return null;
}
List newList = new ArrayList(1);
newList.add(draggedObject);
return createDropTarget(newList, targetItem);
}
if (draggedObject instanceof ViewStack) {
ViewStack folder = (ViewStack) draggedObject;
if (folder.getWorkbenchWindow() != window) {
return null;
}
List viewList = new ArrayList(folder.getItemCount());
LayoutPart[] children = folder.getChildren();
for (int idx = 0; idx < children.length; idx++) {
if (!(children[idx] instanceof PartPlaceholder)) {
viewList.add(children[idx]);
}
}
return createDropTarget(viewList, targetItem);
}
return null;
}
};
toolBarData = new CellData();
toolBarData.align(SWT.FILL, SWT.FILL);
getToolBar().setLayoutData(toolBarData);
PresentationUtil.addDragListener(getToolBar(), dragListener);
DragUtil.addDragTarget(getControl(), fastViewDragTarget);
update(true);
}
/**
* Creates and returns a drop target with the given properties. To save object allocation,
* the same instance is saved and reused wherever possible.
*
* @param targetItem
* @param viewList
* @since 3.1
*/
private IDropTarget createDropTarget(List viewList, ToolItem targetItem) {
if (dropTarget == null) {
dropTarget = new ViewDropTarget(viewList, targetItem);
} else {
dropTarget.setTarget(viewList, targetItem);
}
return dropTarget;
}
/**
* Begins dragging a particular fast view
*
* @param ref
* @param position
*/
protected void startDraggingFastView(IViewReference ref, Point position,
boolean usingKeyboard) {
ViewPane pane = (ViewPane) ((WorkbenchPartReference) ref).getPane();
ToolItem item = itemFor(pane.getViewReference());
Rectangle dragRect = Geometry.toDisplay(getToolBar(), item.getBounds());
startDrag(((WorkbenchPartReference) ref).getPane(), dragRect, position,
usingKeyboard);
}
private void startDrag(Object toDrag, Rectangle dragRect, Point position,
boolean usingKeyboard) {
Perspective persp = getPerspective();
WorkbenchPage page = getPage();
IViewReference oldFastView = null;
if (persp != null) {
oldFastView = persp.getActiveFastView();
if (page != null) {
page.hideFastView();
}
}
if (page.isZoomed()) {
page.zoomOut();
}
boolean success = DragUtil.performDrag(toDrag, dragRect, position,
!usingKeyboard);
// If the drag was cancelled, reopen the old fast view
if (!success && oldFastView != null && page != null) {
page.toggleFastView(oldFastView);
}
}
/**
* Begins dragging the fast view bar
*
* @param position initial mouse position
* @param usingKeyboard true iff the bar is being dragged using the keyboard
*/
protected void startDraggingFastViewBar(Point position,
boolean usingKeyboard) {
Rectangle dragRect = DragUtil.getDisplayBounds(fvbComposite);
startDrag(this, dragRect, position, usingKeyboard);
}
/**
* Returns the toolbar for the fastview bar.
*/
private ToolBar getToolBar() {
return fastViewBar.getControl();
}
private IViewReference getViewFor(ToolItem item) {
if (item == null) {
return null;
}
return (IViewReference) item
.getData(ShowFastViewContribution.FAST_VIEW);
}
/**
* Returns the view at the given position, or null if none
*
* @param position to test, in display coordinates
* @return the view at the given position or null if none
*/
private IViewReference getViewAt(Point position) {
return getViewFor(getToolItem(position));
}
/**
* Returns the toolbar item at the given position, in display coordinates
* @param position
*/
private ToolItem getToolItem(Point position) {
ToolBar toolbar = getToolBar();
Point local = toolbar.toControl(position);
return toolbar.getItem(local);
}
/**
* Shows the popup menu for an item in the fast view bar.
*/
private void showFastViewBarPopup(Point pt) {
// Get the tool item under the mouse.
ToolBar toolBar = getToolBar();
Menu menu = fastViewBarMenuManager.createContextMenu(toolBar);
IViewReference selectedView = getViewAt(pt);
contextContributionItem.setTarget(selectedView);
menu.setLocation(pt.x, pt.y);
menu.setVisible(true);
}
/**
* Shows the popup menu for an item in the fast view bar.
*/
private void showAddFastViewPopup(Point pt) {
Menu menu = newFastViewMenuMgr.createContextMenu(menuTB);
menu.setLocation(pt.x, pt.y);
menu.setVisible(true);
}
public int getOrientation(IViewReference ref) {
return isHorizontal(ref) ? SWT.HORIZONTAL : SWT.VERTICAL;
}
/**
* Returns the underlying SWT fvbComposite for the fast view bar, or null if
* createControl has not yet been invoked. The caller must not make any
* assumptions about the type of Control that is returned.
*
* @return the underlying SWT fvbComposite for the fast view bar
*/
public Control getControl() {
return fvbComposite;
}
public void dispose() {
fastViewBarMenuManager.dispose();
disposeChildControls();
}
protected void disposeChildControls() {
fastViewBar.dispose();
fastViewBar = null;
if (menuItem != null) {
menuItem.dispose();
menuTB.dispose();
}
oldLength = 0;
}
/**
* Refreshes the contents to match the fast views in the window's
* current perspective.
*
* @param force
*/
public void update(boolean force) {
fastViewBar.update(force);
ToolItem[] items = fastViewBar.getControl().getItems();
updateLayoutData();
for (int idx = 0; idx < items.length; idx++) {
IViewReference view = getViewFor(items[idx]);
viewOrientation.put(view.getId(), new Integer(
isHorizontal(view) ? SWT.HORIZONTAL : SWT.VERTICAL));
}
// Resize the FVB to its new size
fvbComposite.setSize(fvbComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
}
private void updateLayoutData() {
ToolItem[] items = fastViewBar.getControl().getItems();
boolean isHorizontal = Geometry.isHorizontal(getSide());
boolean shouldExpand = items.length > 0;
Point hint = new Point(32, shouldExpand ? SWT.DEFAULT : HIDDEN_WIDTH);
if (!isHorizontal) {
Geometry.flipXY(hint);
}
if (shouldExpand) {
toolBarData.setHint(CellData.MINIMUM, hint);
} else {
toolBarData.setHint(CellData.OVERRIDE, hint);
}
if (items.length != oldLength) {
LayoutUtil.resize(fvbComposite);
oldLength = items.length;
}
}
/**
* Returns the currently selected fastview
*
* @return the currently selected fastview or null if none
*/
public IViewReference getSelection() {
return selection;
}
/**
* Sets the currently selected fastview.
*
* @param selected the currently selected fastview, or null if none
*/
public void setSelection(IViewReference selected) {
ToolItem[] items = fastViewBar.getControl().getItems();
for (int i = 0; i < items.length; i++) {
ToolItem item = items[i];
item.setSelection(getView(item) == selected);
}
selection = selected;
}
/**
* Returns the view associated with the given toolbar item
*
* @param item
*/
private IViewReference getView(ToolItem item) {
return (IViewReference) item
.getData(ShowFastViewContribution.FAST_VIEW);
}
private int getIndex(IViewReference toFind) {
ToolItem[] items = fastViewBar.getControl().getItems();
for (int i = 0; i < items.length; i++) {
if (items[i].getData(ShowFastViewContribution.FAST_VIEW) == toFind) {
return i;
}
}
return items.length;
}
private ToolItem getItem(int idx) {
ToolItem[] items = fastViewBar.getControl().getItems();
if (idx >= items.length) {
return null;
}
return items[idx];
}
/**
* Returns the toolbar item associated with the given view
*
* @param toFind
*/
private ToolItem itemFor(IViewReference toFind) {
return getItem(getIndex(toFind));
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.IWindowTrim#getValidSides()
*/
public int getValidSides() {
return SWT.TOP | SWT.LEFT | SWT.RIGHT | SWT.BOTTOM;
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.IWindowTrim#docked(int)
*/
public void dock(int side) {
fCurrentSide = side;
disposeChildControls();
createChildControls();
}
/**
* Get the current side.
* @return SWT.BOTTOM or SWT.RIGHT or SWT.LEFT
*/
public int getSide() {
if (fCurrentSide==SWT.DEFAULT) {
fCurrentSide = getInitialSide();
}
return fCurrentSide;
}
private boolean isHorizontal(IViewReference ref) {
Integer orientation = (Integer) viewOrientation.get(ref.getId());
boolean horizontalBar = Geometry.isHorizontal(getSide());
boolean horizontal = horizontalBar;
if (orientation != null) {
horizontal = orientation.intValue() == SWT.HORIZONTAL;
} else {
horizontal = false;
}
return horizontal;
}
/**
* @param ref
*/
public int getViewSide(IViewReference ref) {
boolean horizontal = isHorizontal(ref);
if (horizontal) {
return (getSide() == SWT.BOTTOM) ? SWT.BOTTOM : SWT.TOP;
}
return (getSide() == SWT.RIGHT) ? SWT.RIGHT : SWT.LEFT;
}
public void saveState(IMemento memento) {
memento.putInteger(IWorkbenchConstants.TAG_FAST_VIEW_SIDE, getSide());
Iterator iter = viewOrientation.keySet().iterator();
while (iter.hasNext()) {
String next = (String) iter.next();
IMemento orientation = memento
.createChild(IWorkbenchConstants.TAG_FAST_VIEW_ORIENTATION);
orientation.putString(IWorkbenchConstants.TAG_VIEW, next);
orientation.putInteger(IWorkbenchConstants.TAG_POSITION,
((Integer) viewOrientation.get(next)).intValue());
}
}
/**
* Returns the approximate location where the next fastview icon
* will be drawn (display coordinates)
*/
public Rectangle getLocationOfNextIcon() {
ToolBar control = getToolBar();
Rectangle result = control.getBounds();
Point size = control.computeSize(SWT.DEFAULT, SWT.DEFAULT, false);
result.height = size.y;
result.width = size.x;
boolean horizontal = Geometry.isHorizontal(getSide());
if (control.getItemCount() == 0) {
Geometry.setDimension(result, horizontal, 0);
}
int hoverSide = horizontal ? SWT.RIGHT : SWT.BOTTOM;
result = Geometry.getExtrudedEdge(result, -Geometry.getDimension(
result, !horizontal), hoverSide);
return Geometry.toDisplay(control.getParent(), result);
}
public void restoreState(IMemento memento) {
Integer bigInt;
bigInt = memento.getInteger(IWorkbenchConstants.TAG_FAST_VIEW_SIDE);
if (bigInt != null) {
dock(bigInt.intValue());
}
IMemento[] orientations = memento
.getChildren(IWorkbenchConstants.TAG_FAST_VIEW_ORIENTATION);
for (int i = 0; i < orientations.length; i++) {
IMemento next = orientations[i];
viewOrientation.put(next.getString(IWorkbenchConstants.TAG_VIEW),
next.getInteger(IWorkbenchConstants.TAG_POSITION));
}
}
public WorkbenchWindow getWindow() {
return window;
}
public void restoreView(IViewReference selectedView) {
if (selectedView != null) {
WorkbenchPage page = window.getActiveWorkbenchPage();
if (page != null) {
int idx = getIndex(selectedView);
ToolItem item = getItem(idx);
Rectangle bounds = item.getBounds();
Rectangle startBounds = Geometry.toDisplay(item
.getParent(), bounds);
Perspective persp = getPerspective();
if (persp != null) {
persp.getFastViewManager().removeViewReference(selectedView, true, true);
}
IWorkbenchPart toActivate = selectedView
.getPart(true);
if (toActivate != null) {
page.activate(toActivate);
}
ViewPane pane = (ViewPane) ((WorkbenchPartReference) selectedView)
.getPane();
RectangleAnimation animation = new RectangleAnimation(
window.getShell(), startBounds, pane
.getParentBounds());
animation.schedule();
}
}
}
/**
* @return The list of all view references in the stack
*/
public List getViewRefs() {
List refs = new ArrayList(fastViewBar.getControl().getItemCount());
ToolItem[] items = fastViewBar.getControl().getItems();
for (int i = 0; i < items.length; i++) {
Object data = items[i].getData(ShowFastViewContribution.FAST_VIEW);
if (data != null)
refs.add(data);
}
return refs;
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.IWindowTrim#isCloseable()
*/
public boolean isCloseable() {
return false;
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.IWindowTrim#handleClose()
*/
public void handleClose() {
// nothing to do...
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.IWindowTrim#getId()
*/
public String getId() {
return "org.eclise.ui.internal.FastViewBar"; //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.eclipse.ui.internal.IWindowTrim#getDisplayName()
*/
public String getDisplayName() {
return WorkbenchMessages.TrimCommon_FastView_TrimName;
}
/**
* Returns the context menu contribution item. This is for
* internal UI testing only.
*
* @return the context menu contribution item
* @since 3.1.1
*/
public FastViewBarContextMenuContribution testContextMenu() {
return contextContributionItem;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWindowTrim#getWidthHint()
*/
public int getWidthHint() {
return SWT.DEFAULT;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWindowTrim#getHeightHint()
*/
public int getHeightHint() {
return SWT.DEFAULT;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWindowTrim#isResizeable()
*/
public boolean isResizeable() {
return false;
}
}