blob: ca6c6da00730017a3c1f097b2d39f852858cae42 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 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.presentations;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.util.Geometry;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.ISizeProvider;
/**
* This represents an object that can supply trim around a IPresentablePart.
* Clients can implement subclasses to provide the appearance for editor workbooks,
* view folders, fast views, and detached windows.
* <p>
* StackPresentations do not store any persistent state and cannot
* directly make changes to the workbench. They are given an IStackPresentationSite
* reference on creation, which allows them to send events and requests to the workbench.
* However, the workbench is free to ignore these requests. The workbench will call one
* of the public methods on StackPresentation when (and if) the presentation is expected to
* change state.
* </p>
* <p>
* For example, if the user clicks a button that is intended to close a part, the
* StackPresentation will send a close request to its site, but should not assume
* that the part has been closed until the workbench responds with a call
* <code>StackPresentation.remove</code>.
* </p>
*
* @since 3.0
*/
public abstract class StackPresentation implements ISizeProvider {
/**
* Inactive state. This is the default state for deselected presentations.
*/
public static final int AS_INACTIVE = 0;
/**
* Activation state indicating that one of the parts in the presentation currently has focus
*/
public static final int AS_ACTIVE_FOCUS = 1;
/**
* Activation state indicating that none of the parts in the presentation have focus, but
* one of the parts is being used as the context for global menus and toolbars
*/
public static final int AS_ACTIVE_NOFOCUS = 2;
/**
* The presentation site.
*/
private IStackPresentationSite site;
/**
* Constructs a new stack presentation with the given site.
*
* @param stackSite the stack site
*/
protected StackPresentation(IStackPresentationSite stackSite) {
Assert.isNotNull(stackSite);
site = stackSite;
}
/**
* Returns the presentation site (not null).
* @return IStackPresentationSite
*/
protected IStackPresentationSite getSite() {
return site;
}
/**
* Sets the bounding rectangle for this presentation.
*
* @param bounds new bounding rectangle (not null)
*/
public abstract void setBounds(Rectangle bounds);
/**
* Returns the minimum size for this stack. The stack is prevented
* from being resized smaller than this amount, and this is used as
* the default size for the stack when it is minimized. Typically,
* this is the amount of space required to fit the minimize, close,
* and maximize buttons and one tab.
*
* @return the minimum size for this stack (not null)
*
* @deprecated replaced by computePreferredSize
*/
public Point computeMinimumSize() {
return new Point(0,0);
}
/*
* @see ISizeProvider#getSizeFlags(boolean)
*/
public int getSizeFlags(boolean width) {
boolean hasMaximumSize = getSite().getState() == IStackPresentationSite.STATE_MINIMIZED;
return SWT.MIN | (hasMaximumSize ? SWT.MAX : 0);
}
/*
* @see ISizeProvider#computePreferredSize(boolean, int, int, int)
*/
public int computePreferredSize(boolean width, int availableParallel, int availablePerpendicular, int preferredResult) {
int minSize = Geometry.getCoordinate(computeMinimumSize(), width);
if (getSite().getState() == IStackPresentationSite.STATE_MINIMIZED || preferredResult < minSize) {
return minSize;
}
return preferredResult;
}
/**
* Disposes all SWT resources being used by the stack. This is the
* last method that will be invoked on the stack.
*/
public abstract void dispose();
/**
* This is invoked to notify the presentation that its activation
* state has changed. StackPresentations can have three possible activation
* states (see the AS_* constants above)
*
* @param newState one of AS_INACTIVE, AS_ACTIVE, or AS_ACTIVE_NOFOCUS
*/
public abstract void setActive(int newState);
/**
* This causes the presentation to become visible or invisible.
* When a presentation is invisible, it must not respond to user
* input or modify its parts. For example, a presentations will
* be made invisible if it belongs to a perspective and the user
* switches to another perspective.
*
* @param isVisible the state to set visibility to
*
* @since 3.0
*/
public abstract void setVisible(boolean isVisible);
/**
* Sets the state of the presentation. That is, notifies the presentation
* that is has been minimized, maximized, or restored. Note that this method
* is the only way that a presentation is allowed to change its state.
* <p>
* If a presentation wishes to minimize itself, it must call setState
* on its associated IStackPresentationSite. If the site chooses to respond
* to the state change, it will call this method at the correct time.
* The presentation should not call this method directly.
* </p>
*
* @param state one of the IStackPresentationSite.STATE_* constants.
*/
public abstract void setState(int state);
/**
* Returns the control for this presentation
*
* @return the control for this presentation (not null)
*/
public abstract Control getControl();
/**
* Adds the given part to the stack. The presentation is free to determine
* where the part should be inserted. If the part is being inserted as the
* result of a drag/drop operation, it will be given a cookie
* identifying the drop location. Has no effect if an identical part is
* already in the presentation.
*
* @param newPart the new part to add (not null)
* @param cookie an identifier for a drop location, or null. When the presentation
* attaches a cookie to a StackDropResult, that cookie is passed back into
* addPart when a part is actually dropped in that location.
*/
public abstract void addPart(IPresentablePart newPart, Object cookie);
/**
* Removes the given part from the stack.
*
* @param oldPart the part to remove (not null)
*/
public abstract void removePart(IPresentablePart oldPart);
/**
* Moves a part to a new location as the result of a drag/drop
* operation within this presentation.
*
* @param toMove a part that already belongs to this presentation
* @param cookie a drop cookie returned by <code>StackPresentation#dragOver</code>
* @since 3.1
*/
public void movePart(IPresentablePart toMove, Object cookie) {
removePart(toMove);
addPart(toMove, cookie);
if (getSite().getSelectedPart() == toMove) {
selectPart(toMove);
toMove.setFocus();
}
}
/**
* Brings the specified part to the foreground. This should not affect
* the current focus.
*
* @param toSelect the new active part (not null)
*/
public abstract void selectPart(IPresentablePart toSelect);
/**
* This method is invoked whenever a part is dragged over the stack's control.
* It returns a StackDropResult if and only if the part may be dropped in this
* location.
*
* @param currentControl the control being dragged over
* @param location cursor location (display coordinates)
* @return a StackDropResult or null if the presentation does not have
* a drop target in this location.
*/
public abstract StackDropResult dragOver(Control currentControl,
Point location);
/**
* Instructs the presentation to display the system menu
*
*/
public abstract void showSystemMenu();
/**
* Instructs the presentation to display the pane menu
*/
public abstract void showPaneMenu();
/**
* Instructs the presentation to display a list of all parts in the stack, and
* allow the user to change the selection using the keyboard.
*/
public void showPartList() {
}
/**
* Saves the state of this presentation to the given memento.
*
* @param context object that can be used to generate unique IDs for IPresentableParts (this
* may be a temporary object - the presentation should not keep any references to it)
* @param memento memento where the data will be saved
*/
public void saveState(IPresentationSerializer context, IMemento memento) {
}
/**
* Restores the state of this presentation to a previously saved state.
*
* @param context object that can be used to find IPresentableParts given string IDs (this
* may be a temporary object - the presentation should not keep any references to it)
* @param memento memento where the data will be saved
*/
public void restoreState(IPresentationSerializer context, IMemento memento) {
}
/**
* Returns the tab-key traversal order for the given <code>IPresentablePart</code>.
*
* @param part the part
* @return the tab-key traversal order
*/
public abstract Control[] getTabList(IPresentablePart part);
}