blob: 1514f34a290f5dccb00a919bcfaf9d34f41a629d [file] [log] [blame]
package org.eclipse.ui.internal;
/************************************************************************
Copyright (c) 2000, 2003 IBM Corporation and others.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Common Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v10.html
Contributors:
IBM - Initial implementation
************************************************************************/
import java.io.IOException;
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.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
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.Sash;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IPerspectiveFactory;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.XMLMemento;
import org.eclipse.ui.internal.registry.ActionSetRegistry;
import org.eclipse.ui.internal.registry.IActionSetDescriptor;
import org.eclipse.ui.internal.registry.IViewRegistry;
import org.eclipse.ui.internal.registry.PerspectiveDescriptor;
import org.eclipse.ui.internal.registry.PerspectiveExtensionReader;
import org.eclipse.ui.internal.registry.PerspectiveRegistry;
/**
* The ViewManager is a factory for workbench views.
*/
public class Perspective
{
private PerspectiveDescriptor descriptor;
protected WorkbenchPage page;
protected LayoutPart editorArea;
private PartPlaceholder editorHolder;
private ViewFactory viewFactory;
private ArrayList visibleActionSets;
private ArrayList alwaysOnActionSets;
private ArrayList alwaysOffActionSets;
private ArrayList newWizardActionIds;
private ArrayList showViewActionIds;
private ArrayList perspectiveActionIds;
private ArrayList fastViews;
private ArrayList showInPartIds;
private IViewReference activeFastView;
private IViewReference previousActiveFastView;
private IMemento memento;
protected PerspectivePresentation presentation;
final static private String VERSION_STRING = "0.016";//$NON-NLS-1$
// fields used by fast view resizing via a sash
private static final int SASH_SIZE = 3;
private static final int FASTVIEW_HIDE_STEPS = 5;
private static final long FASTVIEW_HIDE_MIN_DURATION = 50;
private static final long FASTVIEW_HIDE_MAX_DURATION = 250;
private static final RGB RGB_COLOR1 = new RGB(132, 130, 132);
private static final RGB RGB_COLOR2 = new RGB(143, 141, 138);
private static final RGB RGB_COLOR3 = new RGB(171, 168, 165);
private Color borderColor1;
private Color borderColor2;
private Color borderColor3;
private Map mapFastViewToWidthRatio = new HashMap();
private Sash fastViewSash;
private CoolBarLayout toolBarLayout;
//Number of open editors before reusing. If < 0, use the
//user preference settings.
private int reuseEditors = -1;
// resize listener to update fast view height and width when
// window resized.
Listener resizeListener = new Listener() {
public void handleEvent(Event event) {
if (event.type == SWT.Resize && activeFastView != null) {
ViewPane pane = getPane(activeFastView);
if (pane.isZoomed() == false) {
Rectangle bounds = pane.getBounds();
bounds.height = Math.max(0, getClientComposite().getSize().y);
float ratio = getFastViewWidthRatio(pane.getID());
bounds.width = Math.max(0, (int)((float)(getClientComposite().getSize().x) * ratio));
pane.setBounds(bounds);
fastViewSash.setBounds(bounds.width - SASH_SIZE, bounds.y, SASH_SIZE, bounds.height - SASH_SIZE);
fastViewSash.moveAbove(null);
}
}
}
};
private PaintListener paintListener = new PaintListener() {
public void paintControl(PaintEvent event) {
if (borderColor1 == null) borderColor1 = WorkbenchColors.getColor(RGB_COLOR1);
if (borderColor2 == null) borderColor2 = WorkbenchColors.getColor(RGB_COLOR2);
if (borderColor3 == null) borderColor3 = WorkbenchColors.getColor(RGB_COLOR3);
Point size = fastViewSash.getSize();
Rectangle d = new Rectangle(0, 0, size.x, size.y);
GC gc = event.gc;
gc.setForeground(borderColor1);
gc.drawLine(d.x, d.y, d.x, d.y + d.height);
gc.setForeground(borderColor2);
gc.drawLine(d.x + 1, d.y + 1, d.x + 1, d.y + d.height);
gc.setForeground(borderColor3);
gc.drawLine(d.x + 2, d.y + 2, d.x + 2, d.y + d.height);
}
};
private SelectionAdapter selectionListener = new SelectionAdapter () {
public void widgetSelected(SelectionEvent e) {
if (e.detail == SWT.DRAG && activeFastView != null)
checkDragLimit(e);
if (e.detail != SWT.DRAG && activeFastView != null) {
ViewPane pane = getPane(activeFastView);
Rectangle bounds = pane.getBounds();
bounds.width = Math.max(0, e.x - bounds.x);
pane.setBounds(bounds);
Float newRatio = new Float((float)bounds.width/(float)getClientComposite().getSize().x);
mapFastViewToWidthRatio.put(pane.getID(), newRatio);
updateFastViewSashBounds(bounds);
fastViewSash.moveAbove(null);
}
}
};
private String oldPartID = null;
private boolean shouldHideEditorsOnActivate = false;
/**
* ViewManager constructor comment.
*/
public Perspective(PerspectiveDescriptor desc, WorkbenchPage page)
throws WorkbenchException
{
this(page);
descriptor = desc;
if(desc != null)
createPresentation(desc);
}
/**
* ViewManager constructor comment.
*/
protected Perspective(WorkbenchPage page) throws WorkbenchException {
this.page = page;
this.editorArea = page.getEditorPresentation().getLayoutPart();
this.viewFactory = page.getViewFactory();
visibleActionSets = new ArrayList(2);
alwaysOnActionSets = new ArrayList(2);
alwaysOffActionSets = new ArrayList(2);
fastViews = new ArrayList(2);
}
/**
* Sets the fast view attribute.
* Note: The page is expected to update action bars.
*/
public void addFastView(IViewReference ref) {
ViewPane pane = (ViewPane)((WorkbenchPartReference)ref).getPane();
if (!isFastView(ref)) {
// Only remove the part from the presentation if it
// is actually in the presentation.
if (presentation.hasPlaceholder(pane.getID()) ||
pane.getContainer() != null)
presentation.removePart(pane);
// We are drag-enabling the pane because it has been disabled
// when it was removed from the perspective presentation.
presentation.enableDrag(pane);
fastViews.add(ref);
pane.setFast(true);
Control ctrl = pane.getControl();
if (ctrl != null)
ctrl.setEnabled(false); // Remove focus support.
}
}
/**
* Moves a part forward in the Z order of a perspective so it is visible.
*
* @param part the part to bring to move forward
* @return true if the part was brought to top, false if not.
*/
public boolean bringToTop(IViewReference ref) {
if (isFastView(ref)) {
setActiveFastView(ref);
return true;
} else {
return presentation.bringPartToTop(getPane(ref));
}
}
/**
* Returns true if a view can close.
*/
public boolean canCloseView(IViewPart view) {
return true;
}
/**
* Prevents the user from making a fast view too narrow or too wide.
*/
private void checkDragLimit(SelectionEvent event) {
if (event.x < ((float)getClientComposite().getSize().x * IPageLayout.RATIO_MIN))
event.x = (int)((float)getClientComposite().getSize().x * IPageLayout.RATIO_MIN);
if (event.x > ((float)getClientComposite().getSize().x * IPageLayout.RATIO_MAX))
event.x = (int)((float)getClientComposite().getSize().x * IPageLayout.RATIO_MAX);
}
/**
* Returns whether a view exists within the perspective.
*/
public boolean containsView(IViewPart view) {
String id = view.getSite().getId();
IViewReference ref = findView(id);
if(ref == null)
return false;
return (view == ref.getPart(false));
}
/**
* Create the initial list of action sets.
*/
private void createInitialActionSets(List stringList) {
ActionSetRegistry reg = WorkbenchPlugin.getDefault().getActionSetRegistry();
Iterator iter = stringList.iterator();
while (iter.hasNext()) {
String id = (String)iter.next();
IActionSetDescriptor desc = reg.findActionSet(id);
if (desc != null)
visibleActionSets.add(desc);
else
WorkbenchPlugin.log("Unable to find Action Set: " + id);//$NON-NLS-1$
}
}
/**
* Create a presentation for a perspective.
*/
private void createPresentation(PerspectiveDescriptor persp)
throws WorkbenchException
{
if (persp.hasCustomDefinition()) {
loadCustomPersp(persp);
} else {
loadPredefinedPersp(persp);
}
}
/**
* Dispose the perspective and all views contained within.
*/
public void dispose() {
// Get rid of presentation.
if(presentation == null)
return;
presentation.deactivate();
presentation.disposeSashes();
// Release each view.
IViewReference refs[] = getViewReferences();
for (int i = 0,length = refs.length; i < length; i ++) {
getViewFactory().releaseView(refs[i].getId());
}
// Dispose of the sash too...
if (fastViewSash != null) {
fastViewSash.dispose();
fastViewSash = null;
}
mapFastViewToWidthRatio.clear();
}
/**
* See IWorkbenchPage@findView.
*/
public IViewReference findView(String id) {
IViewReference refs[] = getViewReferences();
for (int i = 0; i < refs.length; i ++) {
IViewReference ref = refs[i];
if (id.equals(ref.getId()))
return ref;
}
return null;
}
/**
* Returns an array of the visible action sets.
*/
public IActionSetDescriptor[] getActionSets() {
int size = visibleActionSets.size();
IActionSetDescriptor [] array = new IActionSetDescriptor[size];
for (int i = 0; i < size; i ++) {
array[i] = (IActionSetDescriptor)visibleActionSets.get(i);
}
return array;
}
/**
* Returns the window's client composite widget
* which views and editor area will be parented.
*/
private Composite getClientComposite() {
return page.getClientComposite();
}
/**
* Returns the perspective.
*/
public IPerspectiveDescriptor getDesc() {
return descriptor;
}
/**
* Returns the bounds of the given fast view.
*/
/*package*/ Rectangle getFastViewBounds(IViewReference ref) {
// Copy the bounds of the page composite
Rectangle bounds = page.getClientComposite().getBounds();
// get the width ratio of the fast view
float ratio = getFastViewWidthRatio(ref.getId());
// Compute the actual width of the fast view.
bounds.width = (int)(ratio*(float)getClientComposite().getSize().x);
return bounds;
}
/**
* Returns the docked views.
*/
public IViewReference [] getFastViews() {
IViewReference array[] = new IViewReference[fastViews.size()];
fastViews.toArray(array);
return array;
}
/**
* Returns the new wizard actions the page.
* This is List of Strings.
*/
public ArrayList getNewWizardActionIds() {
return newWizardActionIds;
}
/**
* Returns the pane for a view reference.
*/
private ViewPane getPane(IViewReference ref) {
return (ViewPane)((WorkbenchPartReference)ref).getPane();
}
/**
* Returns the perspective actions for this page.
* This is List of Strings.
*/
public ArrayList getPerspectiveActionIds() {
return perspectiveActionIds;
}
/**
* Returns the presentation.
*/
public PerspectivePresentation getPresentation() {
return presentation;
}
/**
* Retrieves the ratio for the fast view with the given ID. If
* the ratio is not known, the default ratio for the view is returned.
*/
private float getFastViewWidthRatio(String id) {
Float f = (Float)mapFastViewToWidthRatio.get(id);
if (f != null) {
return f.floatValue();
} else {
IViewRegistry reg = WorkbenchPlugin.getDefault().getViewRegistry();
float ratio = reg.find(id).getFastViewWidthRatio();
mapFastViewToWidthRatio.put(id, new Float(ratio));
return ratio;
}
}
/**
* Returns the ids of the parts to list in the Show In... dialog.
* This is a List of Strings.
*/
public ArrayList getShowInPartIds() {
return showInPartIds;
}
/**
* Returns the ids of the views to list in the Show View shortcuts.
* This is a List of Strings.
*/
public ArrayList getShowViewActionIds() {
return showViewActionIds;
}
/**
* Returns the toolbar layout for this perspective.
*/
public CoolBarLayout getToolBarLayout() {
return toolBarLayout;
}
/**
* Returns the last active fast view.
*/
/*package*/ IViewReference getPreviousActiveFastView() {
return previousActiveFastView;
}
/**
* Returns the view factory.
*/
private ViewFactory getViewFactory() {
return viewFactory;
}
/**
* Open the tracker to allow the user to move
* the specified part using keyboard.
*/
public void openTracker(ViewPane pane) {
presentation.openTracker(pane);
}
/**
* See IWorkbenchPage.
*/
public IViewReference [] getViewReferences() {
// Get normal views.
if(presentation == null)
return new IViewReference[0];
List panes = new ArrayList(5);
presentation.collectViewPanes(panes);
IViewReference [] resultArray = new IViewReference[panes.size() + fastViews.size()];
// Copy fast views.
int nView = 0;
for (int i = 0; i < fastViews.size(); i++) {
resultArray[nView] = (IViewReference)fastViews.get(i);
++ nView;
}
// Copy normal views.
for (int i = 0; i < panes.size(); i ++) {
ViewPane pane = (ViewPane)panes.get(i);
resultArray[nView] = pane.getViewReference();
++ nView;
}
return resultArray;
}
/**
* @see IWorkbenchPage
* Note: The page is expected to update action bars.
*/
public void hideActionSet(String id) {
ActionSetRegistry reg = WorkbenchPlugin.getDefault().getActionSetRegistry();
IActionSetDescriptor desc = reg.findActionSet(id);
if (alwaysOnActionSets.contains(desc))
return;
if (desc != null)
visibleActionSets.remove(desc);
}
/**
* Hide the editor area if visible
*/
protected void hideEditorArea() {
if (!isEditorAreaVisible())
return;
// Replace the editor area with a placeholder so we
// know where to put it back on show editor area request.
editorHolder = new PartPlaceholder(editorArea.getID());
presentation.getLayout().replace(editorArea, editorHolder);
// Disable the entire editor area so if an editor had
// keyboard focus it will let it go.
if (editorArea.getControl() != null)
editorArea.getControl().setEnabled(false);
setEditorAreaVisible(false);
}
/**
* Hides a fast view. The view shrinks equally <code>steps</code> times
* before disappearing completely.
*/
private void hideFastView(IViewReference ref, int steps) {
setFastViewIconSelection(ref, false);
// Get pane.
ViewPane pane = getPane(ref);
// Hide the right side sash first
if (fastViewSash != null)
fastViewSash.setBounds(0, 0, 0, 0);
Control ctrl = pane.getControl();
if(steps != 0) {
// Slide it off screen.
Rectangle bounds = pane.getBounds();
int increment = bounds.width / steps;
// Record the longest we can go before cancelling the animation,
// and the minimum time we will allow each step to take.
// Note: We always do at least one step of the animation.
long endTime = System.currentTimeMillis() + FASTVIEW_HIDE_MAX_DURATION;
long minStepTime = FASTVIEW_HIDE_MIN_DURATION / steps;
for (int i = 0; i <= bounds.width - 2; i += increment) {
long time = System.currentTimeMillis();
ctrl.setLocation(-i, bounds.y);
ctrl.getParent().update();
long afterTime = System.currentTimeMillis();
if (afterTime >= endTime) {
// Took too long. Just exit the loop.
break;
}
long stepDuration = afterTime - time;
if (stepDuration < minStepTime) {
// Note: This doesn't take into account the overhead of doing
// the loop and these calculations, so the total delay is
// always slightly more than "minStepTime".
try {
Thread.sleep (minStepTime - stepDuration);
} catch (InterruptedException ex) {
// Do nothing.
}
}
}
}
// Hide it completely.
pane.setVisible(false);
pane.setFastViewSash(null);
ctrl.setEnabled(false); // Remove focus support.
}
/**
* Hides the fast view sash for zooming in a fast view.
*/
void hideFastViewSash() {
if (fastViewSash != null)
fastViewSash.setBounds(0, 0, 0, 0);
}
public boolean hideView(IViewReference ref) {
// If the view is locked just return.
ViewPane pane = getPane(ref);
// Remove the view from the current presentation.
if (isFastView(ref)) {
fastViews.remove(ref);
pane.setFast(false); //force an update of the toolbar
if (activeFastView == ref)
setActiveFastView(null);
pane.getControl().setEnabled(true);
} else {
presentation.removePart(pane);
}
// Dispose view if ref count == 0.
getViewFactory().releaseView(ref.getId());
return true;
}
/*
* Return whether the editor area is visible or not.
*/
protected boolean isEditorAreaVisible() {
return editorHolder == null;
}
/**
* Returns true if a view is fast.
*/
public boolean isFastView(IViewReference ref) {
return fastViews.contains(ref);
}
/**
* Creates a new presentation from a persistence file.
* Note: This method should not modify the current state of the perspective.
*/
private void loadCustomPersp(PerspectiveDescriptor persp)
{
//get the layout from the registry
PerspectiveRegistry perspRegistry = (PerspectiveRegistry) WorkbenchPlugin.getDefault().getPerspectiveRegistry();
try {
IMemento memento = perspRegistry.getCustomPersp(persp.getId());
// Restore the layout state.
MultiStatus status = new MultiStatus(
PlatformUI.PLUGIN_ID,IStatus.OK,
WorkbenchMessages.format("Perspective.unableToRestorePerspective",new String[]{persp.getLabel()}),
null);
status.merge(restoreState(memento));
status.merge(restoreState());
if(status.getSeverity() != IStatus.OK) {
unableToOpenPerspective(persp,status);
}
} catch (IOException e) {
unableToOpenPerspective(persp,null);
} catch (WorkbenchException e) {
unableToOpenPerspective(persp,e.getStatus());
}
}
private void unableToOpenPerspective(PerspectiveDescriptor persp,IStatus status) {
PerspectiveRegistry perspRegistry = (PerspectiveRegistry) WorkbenchPlugin.getDefault().getPerspectiveRegistry();
perspRegistry.deletePerspective(persp);
String title = WorkbenchMessages.getString("Perspective.problemRestoringTitle"); //$NON-NLS-1$
String msg = WorkbenchMessages.getString("Perspective.errorReadingState"); //$NON-NLS-1$
if(status == null) {
MessageDialog.openError((Shell)null,title,msg);
} else {
ErrorDialog.openError((Shell)null,title,msg,status);
}
}
/**
* Create a presentation for a perspective.
* Note: This method should not modify the current state of the perspective.
*/
private void loadPredefinedPersp(
PerspectiveDescriptor persp)
throws WorkbenchException
{
// Create layout engine.
IPerspectiveFactory factory = null;
try {
factory = persp.createFactory();
} catch (CoreException e) {
throw new WorkbenchException(WorkbenchMessages.format("Perspective.unableToLoad", new Object[] {persp.getId()})); //$NON-NLS-1$
}
// Create layout factory.
RootLayoutContainer container = new RootLayoutContainer(page);
PageLayout layout = new PageLayout(container, getViewFactory(), editorArea);
// Run layout engine.
factory.createInitialLayout(layout);
PerspectiveExtensionReader extender = new PerspectiveExtensionReader();
extender.extendLayout(descriptor.getId(), layout);
// Retrieve fast view width ratios stored in the page layout.
mapFastViewToWidthRatio.putAll(layout.getFastViewToWidthRatioMap());
// Create action sets.
createInitialActionSets(layout.getActionSets());
alwaysOnActionSets.addAll(visibleActionSets);
newWizardActionIds = layout.getNewWizardActionIds();
showViewActionIds = layout.getShowViewActionIds();
perspectiveActionIds = layout.getPerspectiveActionIds();
showInPartIds = layout.getShowInPartIds();
// Create fast views
fastViews = layout.getFastViews();
// Create presentation.
presentation = new PerspectivePresentation(page, container);
// Hide editor area if requested by factory
if (!layout.isEditorAreaVisible())
hideEditorArea();
}
/**
* activate.
*/
protected void onActivate() {
// Update editor area state.
if (editorArea.getControl() != null) {
if (isEditorAreaVisible()) {
// Enable the editor area now that it will be made
// visible and can accept keyboard focus again.
editorArea.getControl().setEnabled(true);
setEditorAreaVisible(true);
} else {
// Disable the entire editor area so if an editor had
// keyboard focus it will let it go.
editorArea.getControl().setEnabled(false);
setEditorAreaVisible(false);
}
}
// Update fast views.
// Make sure the control for the fastviews are create so they can
// be activated.
for (int i = 0; i < fastViews.size(); i++){
ViewPane pane = getPane((IViewReference)fastViews.get(i));
if(pane != null) {
Control ctrl = pane.getControl();
if (ctrl == null) {
pane.createControl(getClientComposite());
ctrl = pane.getControl();
}
presentation.enableDrag(pane);
ctrl.setEnabled(false); // Remove focus support.
}
}
setAllPinsVisible(true);
presentation.activate(getClientComposite());
getClientComposite().addListener(SWT.Resize, resizeListener);
if (shouldHideEditorsOnActivate) {
// We do this here to ensure that createPartControl is called on the top editor
// before it is hidden. See bug 20166.
hideEditorArea();
shouldHideEditorsOnActivate = false;
}
}
/**
* deactivate.
*/
protected void onDeactivate() {
getClientComposite().removeListener(SWT.Resize, resizeListener);
presentation.deactivate();
setActiveFastView(null);
setAllPinsVisible(false);
// Update fast views.
for (int i = 0; i < fastViews.size(); i++){
ViewPane pane = getPane((IViewReference)fastViews.get(i));
if(pane != null) {
presentation.disableDrag(pane);
Control ctrl = pane.getControl();
if (ctrl != null)
ctrl.setEnabled(true); // Add focus support.
}
}
}
/**
* Notifies that a part has been activated.
*/
public void partActivated(IWorkbenchPart activePart) {
// If a fastview is open close it.
if (activeFastView != null && activeFastView.getPart(false) != activePart)
setActiveFastView(null);
}
/**
* The user successfully performed a Show In... action on the specified part.
* Update the list of Show In items accordingly.
*/
public void performedShowIn(String partId) {
// move it to the front of the list;
// check to ensure we're just reordering, not adding
if (showInPartIds.remove(partId)) {
showInPartIds.add(0, partId);
}
}
/**
* Sets the fast view attribute.
* Note: The page is expected to update action bars.
*/
public void removeFastView(IViewReference ref) {
ViewPane pane = getPane(ref);
if (isFastView(ref)) {
if (activeFastView == ref)
setActiveFastView(null);
fastViews.remove(ref);
pane.setFast(false);
Control ctrl = pane.getControl();
if (ctrl != null)
ctrl.setEnabled(true); // Modify focus support.
// We are disabling the pane because it will be enabled when it
// is added to the presentation. When a pane is enabled a drop
// listener is added to it, and we do not want to have multiple
// listeners for a pane
presentation.disableDrag(pane);
presentation.addPart(pane);
}
}
/**
* Fills a presentation with layout data.
* Note: This method should not modify the current state of the perspective.
*/
public IStatus restoreState(IMemento memento) {
MultiStatus result = new MultiStatus(
PlatformUI.PLUGIN_ID,IStatus.OK,
WorkbenchMessages.getString("Perspective.problemsRestoringPerspective"),null);
// Create persp descriptor.
descriptor = new PerspectiveDescriptor(null,null,null);
result.add(descriptor.restoreState(memento));
PerspectiveDescriptor desc = (PerspectiveDescriptor)WorkbenchPlugin
.getDefault().getPerspectiveRegistry().findPerspectiveWithId(descriptor.getId());
if (desc != null)
descriptor = desc;
// Create the toolbar layout.
IMemento layoutMem = memento.getChild(IWorkbenchConstants.TAG_TOOLBAR_LAYOUT);
if (layoutMem != null) {
toolBarLayout = new CoolBarLayout();
boolean success = toolBarLayout.restoreState(layoutMem);
if (!success) toolBarLayout = null;
}
this.memento = memento;
// Add the visible views.
IMemento views[] = memento.getChildren(IWorkbenchConstants.TAG_VIEW);
result.merge(createReferences(views));
memento = memento.getChild(IWorkbenchConstants.TAG_FAST_VIEWS);
if(memento != null) {
views = memento.getChildren(IWorkbenchConstants.TAG_VIEW);
result.merge(createReferences(views));
}
return result;
}
private IStatus createReferences(IMemento views[]) {
MultiStatus result = new MultiStatus(
PlatformUI.PLUGIN_ID,IStatus.OK,
WorkbenchMessages.getString("Perspective.problemsRestoringViews"),null);
for (int x = 0; x < views.length; x ++) {
// Get the view details.
IMemento childMem = views[x];
String viewID = childMem.getString(IWorkbenchConstants.TAG_ID);
// Create and open the view.
try {
if(!"true".equals(childMem.getString(IWorkbenchConstants.TAG_REMOVED)))
viewFactory.createView(viewID);
} catch (PartInitException e) {
childMem.putString(IWorkbenchConstants.TAG_REMOVED,"true");
result.add(new Status(IStatus.ERROR,PlatformUI.PLUGIN_ID,0,e.getMessage(),e));
}
}
return result;
}
/**
* Fills a presentation with layout data.
* Note: This method should not modify the current state of the perspective.
*/
public IStatus restoreState() {
if(this.memento == null)
return new Status(IStatus.OK,PlatformUI.PLUGIN_ID,0,"",null);
MultiStatus result = new MultiStatus(
PlatformUI.PLUGIN_ID,IStatus.OK,
WorkbenchMessages.getString("Perspective.problemsRestoringPerspective"),null);
IMemento memento = this.memento;
this.memento = null;
IMemento boundsMem = memento.getChild(IWorkbenchConstants.TAG_WINDOW);
if(boundsMem != null) {
Rectangle r = new Rectangle(0,0,0,0);
r.x = boundsMem.getInteger(IWorkbenchConstants.TAG_X).intValue();
r.y = boundsMem.getInteger(IWorkbenchConstants.TAG_Y).intValue();
r.height = boundsMem.getInteger(IWorkbenchConstants.TAG_HEIGHT).intValue();
r.width = boundsMem.getInteger(IWorkbenchConstants.TAG_WIDTH).intValue();
if(page.getWorkbenchWindow().getPages().length == 0) {
page.getWorkbenchWindow().getShell().setBounds(r);
}
}
// Create an empty presentation..
RootLayoutContainer mainLayout = new RootLayoutContainer(page);
PerspectivePresentation pres = new PerspectivePresentation(page, mainLayout);
// Read the layout.
result.merge(pres.restoreState(memento.getChild(IWorkbenchConstants.TAG_LAYOUT)));
// Add the editor workbook. Do not hide it now.
pres.replacePlaceholderWithPart(editorArea);
// Add the visible views.
IMemento [] views = memento.getChildren(IWorkbenchConstants.TAG_VIEW);
for (int x = 0; x < views.length; x ++) {
// Get the view details.
IMemento childMem = views[x];
String viewID = childMem.getString(IWorkbenchConstants.TAG_ID);
// Create and open the view.
WorkbenchPartReference ref = (WorkbenchPartReference)viewFactory.getView(viewID);
if(ref == null) {
WorkbenchPlugin.log("Could not create view: '" + viewID + "'."); //$NON-NLS-1$
result.add(new Status(
Status.ERROR,PlatformUI.PLUGIN_ID,0,
WorkbenchMessages.format("Perspective.couldNotFind", new String[]{viewID}), //$NON-NLS-1$
null));
continue;
}
if(ref.getPane() == null) {
ref.setPane(new ViewPane((IViewReference)ref,page));
}
page.addPart(ref);
if(pres.willPartBeVisible(ref.getId())) {
IStatus restoreStatus = viewFactory.restoreView((IViewReference)ref);
result.add(restoreStatus);
if(restoreStatus.getSeverity() == IStatus.OK) {
IViewPart view = (IViewPart)ref.getPart(true);
if(view != null) {
ViewSite site = (ViewSite)view.getSite();
ViewPane pane = (ViewPane)site.getPane();
pres.replacePlaceholderWithPart(pane);
}
} else {
page.removePart(ref);
}
} else {
pres.replacePlaceholderWithPart(ref.getPane());
}
}
// Load the fast views
IMemento fastViewsMem = memento.getChild(IWorkbenchConstants.TAG_FAST_VIEWS);
if(fastViewsMem != null) {
views = fastViewsMem.getChildren(IWorkbenchConstants.TAG_VIEW);
for (int x = 0; x < views.length; x ++) {
// Get the view details.
IMemento childMem = views[x];
String viewID = childMem.getString(IWorkbenchConstants.TAG_ID);
Float ratio = childMem.getFloat(IWorkbenchConstants.TAG_RATIO);
if (ratio == null) {
Integer viewWidth = childMem.getInteger(IWorkbenchConstants.TAG_WIDTH);
if (viewWidth == null)
ratio = new Float(IPageLayout.DEFAULT_FASTVIEW_RATIO);
else
ratio = new Float((float)viewWidth.intValue() / (float)getClientComposite().getSize().x);
}
mapFastViewToWidthRatio.put(viewID, ratio);
IViewReference ref = viewFactory.getView(viewID);
if(ref == null) {
WorkbenchPlugin.log("Could not create view: '" + viewID + "'."); //$NON-NLS-1$
result.add(new Status(
Status.ERROR,PlatformUI.PLUGIN_ID,0,
WorkbenchMessages.format("Perspective.couldNotFind", new String[]{viewID}), //$NON-NLS-1$
null));
continue;
}
page.addPart(ref);
fastViews.add(ref);
}
}
// Load the action sets.
IMemento [] actions = memento.getChildren(IWorkbenchConstants.TAG_ACTION_SET);
ArrayList actionsArray = new ArrayList(actions.length);
for (int x = 0; x < actions.length; x ++) {
String actionSetID = actions[x].getString(IWorkbenchConstants.TAG_ID);
actionsArray.add(actionSetID);
}
createInitialActionSets(actionsArray);
// Load the always on action sets.
actions = memento.getChildren(IWorkbenchConstants.TAG_ALWAYS_ON_ACTION_SET);
for (int x = 0; x < actions.length; x ++) {
String actionSetID = actions[x].getString(IWorkbenchConstants.TAG_ID);
IActionSetDescriptor d =
WorkbenchPlugin.getDefault().getActionSetRegistry().findActionSet(actionSetID);
if (d != null)
alwaysOnActionSets.add(d);
}
// Load the always off action sets.
actions = memento.getChildren(IWorkbenchConstants.TAG_ALWAYS_OFF_ACTION_SET);
for (int x = 0; x < actions.length; x ++) {
String actionSetID = actions[x].getString(IWorkbenchConstants.TAG_ID);
IActionSetDescriptor d =
WorkbenchPlugin.getDefault().getActionSetRegistry().findActionSet(actionSetID);
if (d != null)
alwaysOffActionSets.add(d);
}
// Load "show view actions".
actions = memento.getChildren(IWorkbenchConstants.TAG_SHOW_VIEW_ACTION);
showViewActionIds = new ArrayList(actions.length);
for (int x = 0; x < actions.length; x ++) {
String id = actions[x].getString(IWorkbenchConstants.TAG_ID);
showViewActionIds.add(id);
}
// Load "show in parts".
actions = memento.getChildren(IWorkbenchConstants.TAG_SHOW_IN_PART);
showInPartIds = new ArrayList(actions.length);
for (int x = 0; x < actions.length; x ++) {
String id = actions[x].getString(IWorkbenchConstants.TAG_ID);
if (id != null) {
showInPartIds.add(id);
}
}
// Load "new wizard actions".
actions = memento.getChildren(IWorkbenchConstants.TAG_NEW_WIZARD_ACTION);
newWizardActionIds = new ArrayList(actions.length);
for (int x = 0; x < actions.length; x ++) {
String id = actions[x].getString(IWorkbenchConstants.TAG_ID);
newWizardActionIds.add(id);
}
// Load "perspective actions".
actions = memento.getChildren(IWorkbenchConstants.TAG_PERSPECTIVE_ACTION);
perspectiveActionIds = new ArrayList(actions.length);
for (int x = 0; x < actions.length; x ++) {
String id = actions[x].getString(IWorkbenchConstants.TAG_ID);
perspectiveActionIds.add(id);
}
// Save presentation.
presentation = pres;
// Hide the editor area if needed. Need to wait for the
// presentation to be fully setup first.
Integer areaVisible = memento.getInteger(IWorkbenchConstants.TAG_AREA_VISIBLE);
// Rather than hiding the editors now we must wait until after their controls
// are created. This ensures that if an editor is instantiated, createPartControl
// is also called. See bug 20166.
shouldHideEditorsOnActivate = (areaVisible != null && areaVisible.intValue() == 0);
return result;
}
/**
* Save the layout.
*/
public void saveDesc() {
saveDescAs(descriptor);
}
/**
* Save the layout.
*/
public void saveDescAs(IPerspectiveDescriptor desc) {
PerspectiveDescriptor realDesc = (PerspectiveDescriptor)desc;
//get the layout from the registry
PerspectiveRegistry perspRegistry = (PerspectiveRegistry) WorkbenchPlugin.getDefault().getPerspectiveRegistry();
// Capture the layout state.
XMLMemento memento = XMLMemento.createWriteRoot("perspective");//$NON-NLS-1$
IStatus status = saveState(memento, realDesc, false);
if(status.getSeverity() == IStatus.ERROR) {
ErrorDialog.openError((Shell)null,
WorkbenchMessages.getString("Perspective.problemSavingTitle"), //$NON-NLS-1$
WorkbenchMessages.getString("Perspective.problemSavingMessage"), //$NON-NLS-1$
status);
return;
}
//save it to the preference store
try {
perspRegistry.saveCustomPersp(realDesc, memento);
descriptor = realDesc;
} catch (IOException e) {
perspRegistry.deletePerspective(realDesc);
MessageDialog.openError((Shell)null,
WorkbenchMessages.getString("Perspective.problemSavingTitle"), //$NON-NLS-1$
WorkbenchMessages.getString("Perspective.problemSavingMessage")); //$NON-NLS-1$
}
}
/**
* Save the layout.
*/
public IStatus saveState(IMemento memento) {
MultiStatus result = new MultiStatus(
PlatformUI.PLUGIN_ID,IStatus.OK,
WorkbenchMessages.getString("Perspective.problemsSavingPerspective"),null);
result.merge(saveState(memento, descriptor, true));
return result;
}
/**
* Save the layout.
*/
private IStatus saveState(IMemento memento, PerspectiveDescriptor p,
boolean saveInnerViewState)
{
MultiStatus result = new MultiStatus(
PlatformUI.PLUGIN_ID,IStatus.OK,
WorkbenchMessages.getString("Perspective.problemsSavingPerspective"),null);
if(this.memento != null) {
memento.putMemento(this.memento);
return result;
}
// Save the version number.
memento.putString(IWorkbenchConstants.TAG_VERSION, VERSION_STRING);
result.add(p.saveState(memento));
if(!saveInnerViewState) {
Rectangle bounds = page.getWorkbenchWindow().getShell().getBounds();
IMemento boundsMem = memento.createChild(IWorkbenchConstants.TAG_WINDOW);
boundsMem.putInteger(IWorkbenchConstants.TAG_X,bounds.x);
boundsMem.putInteger(IWorkbenchConstants.TAG_Y,bounds.y);
boundsMem.putInteger(IWorkbenchConstants.TAG_HEIGHT,bounds.height);
boundsMem.putInteger(IWorkbenchConstants.TAG_WIDTH,bounds.width);
}
// Save the visible action sets.
Iterator enum = visibleActionSets.iterator();
while (enum.hasNext()) {
IActionSetDescriptor desc = (IActionSetDescriptor)enum.next();
IMemento child = memento.createChild(IWorkbenchConstants.TAG_ACTION_SET);
child.putString(IWorkbenchConstants.TAG_ID, desc.getId());
}
// Save the "always on" action sets.
enum = alwaysOnActionSets.iterator();
while (enum.hasNext()) {
IActionSetDescriptor desc = (IActionSetDescriptor)enum.next();
IMemento child = memento.createChild(IWorkbenchConstants.TAG_ALWAYS_ON_ACTION_SET);
child.putString(IWorkbenchConstants.TAG_ID, desc.getId());
}
// Save the "always off" action sets.
enum = alwaysOffActionSets.iterator();
while (enum.hasNext()) {
IActionSetDescriptor desc = (IActionSetDescriptor)enum.next();
IMemento child = memento.createChild(IWorkbenchConstants.TAG_ALWAYS_OFF_ACTION_SET);
child.putString(IWorkbenchConstants.TAG_ID, desc.getId());
}
// Save "show view actions"
enum = showViewActionIds.iterator();
while (enum.hasNext()) {
String str = (String)enum.next();
IMemento child = memento.createChild(IWorkbenchConstants.TAG_SHOW_VIEW_ACTION);
child.putString(IWorkbenchConstants.TAG_ID, str);
}
// Save "show in parts"
enum = showInPartIds.iterator();
while (enum.hasNext()) {
String str = (String)enum.next();
IMemento child = memento.createChild(IWorkbenchConstants.TAG_SHOW_IN_PART);
child.putString(IWorkbenchConstants.TAG_ID, str);
}
// Save "new wizard actions".
enum = newWizardActionIds.iterator();
while (enum.hasNext()) {
String str = (String)enum.next();
IMemento child = memento.createChild(IWorkbenchConstants.TAG_NEW_WIZARD_ACTION);
child.putString(IWorkbenchConstants.TAG_ID, str);
}
// Save "perspective actions".
enum = perspectiveActionIds.iterator();
while (enum.hasNext()) {
String str = (String)enum.next();
IMemento child = memento.createChild(IWorkbenchConstants.TAG_PERSPECTIVE_ACTION);
child.putString(IWorkbenchConstants.TAG_ID, str);
}
// Get visible views.
List viewPanes = new ArrayList(5);
presentation.collectViewPanes(viewPanes);
// Save the views.
enum = viewPanes.iterator();
int errors = 0;
while (enum.hasNext()) {
ViewPane pane = (ViewPane)enum.next();
IViewReference ref = pane.getViewReference();
IMemento viewMemento = memento.createChild(IWorkbenchConstants.TAG_VIEW);
viewMemento.putString(IWorkbenchConstants.TAG_ID, ref.getId());
}
if(fastViews.size() > 0) {
IMemento childMem = memento.createChild(IWorkbenchConstants.TAG_FAST_VIEWS);
enum = fastViews.iterator();
while (enum.hasNext()) {
IViewReference ref = (IViewReference)enum.next();
IMemento viewMemento = childMem.createChild(IWorkbenchConstants.TAG_VIEW);
String id = ref.getId();
viewMemento.putString(IWorkbenchConstants.TAG_ID, id);
float ratio = getFastViewWidthRatio(id);
viewMemento.putFloat(IWorkbenchConstants.TAG_RATIO, ratio);
}
}
if(errors > 0) {
String message = WorkbenchMessages.getString("Perspective.multipleErrors"); //$NON-NLS-1$
if(errors == 1)
message = WorkbenchMessages.getString("Perspective.oneError"); //$NON-NLS-1$
MessageDialog.openError(null, WorkbenchMessages.getString("Error"), message); //$NON-NLS-1$
}
// Save the layout.
IMemento childMem = memento.createChild(IWorkbenchConstants.TAG_LAYOUT);
result.add(presentation.saveState(childMem));
// Save the toolbar layout.
if (toolBarLayout != null) {
childMem = memento.createChild(IWorkbenchConstants.TAG_TOOLBAR_LAYOUT);
result.add(toolBarLayout.saveState(childMem));
}
// Save the editor visibility state
if (isEditorAreaVisible())
memento.putInteger(IWorkbenchConstants.TAG_AREA_VISIBLE, 1);
else
memento.putInteger(IWorkbenchConstants.TAG_AREA_VISIBLE, 0);
return result;
}
/**
* Sets the visible action sets.
* Note: The page is expected to update action bars.
*/
public void setActionSets(IActionSetDescriptor[] newArray) {
// We assume that changes to action set visibilty should be remembered
// and not reversed as parts are activated.
ArrayList turnedOff = (ArrayList)visibleActionSets.clone();
for (int i = 0; i < newArray.length; i++) {
IActionSetDescriptor desc = newArray[i];
turnedOff.remove(desc);
if (!visibleActionSets.contains(desc)) {
// make sure this always stays visible
alwaysOnActionSets.add(desc);
alwaysOffActionSets.remove(desc);
}
}
for (int i = 0; i < turnedOff.size(); i++) {
IActionSetDescriptor desc = (IActionSetDescriptor)turnedOff.get(i);
// make sure this always stays hidden
alwaysOnActionSets.remove(desc);
alwaysOffActionSets.add(desc);
}
visibleActionSets.clear();
int newSize = newArray.length;
for (int i = 0; i < newSize; i ++) {
visibleActionSets.add(newArray[i]);
}
}
/**
* Return the active fast view or null if there are no
* fast views or if there are all minimized.
*/
public IViewReference getActiveFastView() {
return activeFastView;
}
/**
* Sets the active fast view. If a different fast view is already open,
* it shrinks equally <code>steps</code> times before disappearing
* completely. Then, <code>view</code> becomes active and is shown.
*/
/*package*/ void setActiveFastView(IViewReference ref, int steps) {
if (activeFastView == ref)
return;
if (activeFastView != null)
previousActiveFastView = activeFastView;
if (activeFastView != null) {
ViewPane pane = getPane(activeFastView);
if (pane.isZoomed()) {
presentation.zoomOut();
}
hideFastView(activeFastView, steps);
}
activeFastView = ref;
if (activeFastView != null) {
showFastView(activeFastView);
}
}
/**
* Sets the active fast view.
*/
/*package*/ void setActiveFastView(IViewReference ref) {
setActiveFastView(ref, FASTVIEW_HIDE_STEPS);
}
/**
* Sets the visibility of all fast view pins.
*/
private void setAllPinsVisible(boolean visible) {
Iterator iter = fastViews.iterator();
while (iter.hasNext()) {
ViewPane pane = getPane((IViewReference)iter.next());
if(pane != null)
pane.setFast(visible);
}
}
/**
* Sets the selection for the shortcut bar icon representing the givevn fast view.
*/
private void setFastViewIconSelection(IViewReference ref, boolean selected) {
WorkbenchWindow window = (WorkbenchWindow)page.getWorkbenchWindow();
ToolBar bar = window.getShortcutBar().getControl();
ToolItem[] items = bar.getItems();
for(int i=0; i<items.length; i++) {
if (items[i].getData(ShowFastViewContribution.FAST_VIEW) == ref) {
items[i].setSelection(selected);
}
}
}
/**
* Sets the new wizard actions for the page.
* This is List of Strings.
*/
public void setNewWizardActionIds(ArrayList newList ) {
newWizardActionIds = newList;
}
/**
* Sets the perspective actions for this page.
* This is List of Strings.
*/
public void setPerspectiveActionIds(ArrayList list) {
perspectiveActionIds = list;
}
/**
* Sets the ids of the parts to list in the Show In... prompter.
* This is a List of Strings.
*/
public void setShowInPartIds(ArrayList list) {
showInPartIds = list;
}
/**
* Sets the ids of the views to list in the Show View shortcuts.
* This is a List of Strings.
*/
public void setShowViewActionIds(ArrayList list) {
showViewActionIds = list;
}
/**
* Sets the toolbar layout for this perspective.
*/
public void setToolBarLayout(CoolBarLayout layout) {
toolBarLayout = layout;
}
/**
* @see IWorkbenchPage
* Note: The page is expected to update action bars.
*/
public void showActionSet(String id) {
ActionSetRegistry reg = WorkbenchPlugin.getDefault().getActionSetRegistry();
IActionSetDescriptor desc = reg.findActionSet(id);
if (alwaysOffActionSets.contains(desc))
return;
if (desc != null && !visibleActionSets.contains(desc))
visibleActionSets.add(desc);
}
/**
* Show the editor area if not visible
*/
protected void showEditorArea() {
if (isEditorAreaVisible())
return;
// Enable the editor area now that it will be made
// visible and can accept keyboard focus again.
if (editorArea.getControl() != null)
editorArea.getControl().setEnabled(true);
setEditorAreaVisible(true);
// Replace the part holder with the editor area.
presentation.getLayout().replace(editorHolder, editorArea);
editorHolder = null;
}
private void setEditorAreaVisible(boolean visible) {
ArrayList workbooks = ((EditorArea)editorArea).getEditorWorkbooks();
for (Iterator iter = workbooks.iterator(); iter.hasNext();) {
EditorWorkbook workbook = (EditorWorkbook) iter.next();
workbook.setVisible(visible);
EditorPane pane = workbook.getVisibleEditor();
if(pane != null)
pane.setVisible(visible);
}
editorArea.setVisible(visible);
}
/**
* Shows a fast view.
*/
void showFastView(IViewReference ref) {
// Make sure the part is restored.
if(ref.getPart(true) == null)
return;
ViewPane pane = getPane(ref);
// Create the control first
Control ctrl = pane.getControl();
if(ctrl == null) {
pane.createControl(getClientComposite());
ctrl = pane.getControl();
}
// Show pane fast.
ctrl.setEnabled(true); // Add focus support.
Composite parent = ctrl.getParent();
Rectangle bounds = getFastViewBounds(ref);
pane.setVisible(true);
pane.setBounds(bounds);
pane.moveAbove(null);
pane.setFocus();
// Show the Sash to enable right side resize
if (fastViewSash == null) {
fastViewSash = new Sash(parent, SWT.VERTICAL);
fastViewSash.addPaintListener(paintListener);
fastViewSash.addFocusListener(new FocusListener() {
public void focusGained(FocusEvent e) {
fastViewSash.removePaintListener(paintListener);
}
public void focusLost(FocusEvent e) {
fastViewSash.addPaintListener(paintListener);
}
});
fastViewSash.addSelectionListener(selectionListener);
}
pane.setFastViewSash(fastViewSash);
updateFastViewSashBounds(bounds);
fastViewSash.moveAbove(null);
setFastViewIconSelection(ref, true);
}
public void updateFastViewSashBounds(Rectangle partBounds) {
fastViewSash.setBounds(partBounds.x + partBounds.width - 1, partBounds.y + 1, SASH_SIZE, partBounds.height - 2);
}
/**
* See IWorkbenchPage.
*/
public IViewPart showView(String viewID)
throws PartInitException
{
ViewFactory factory = getViewFactory();
IViewReference ref = factory.createView(viewID);
IViewPart part = (IViewPart)ref.getPart(false);
if(part == null) {
IStatus status = factory.restoreView(ref);
if(status.getSeverity() == IStatus.ERROR) {
if(status.getException() instanceof PartInitException)
throw (PartInitException)status.getException();
else
throw new PartInitException(status);
} else { //No error so the part has been created
part = (IViewPart)ref.getPart(false);
}
}
ViewSite site = (ViewSite)part.getSite();
ViewPane pane = (ViewPane)site.getPane();
IPreferenceStore store = WorkbenchPlugin.getDefault().getPreferenceStore();
int openViewMode = store.getInt(IPreferenceConstants.OPEN_VIEW_MODE);
if (presentation.hasPlaceholder(viewID)) {
presentation.addPart(pane);
} else if (openViewMode == IPreferenceConstants.OVM_EMBED) {
presentation.addPart(pane);
/*
* Detached window no longer supported - remove when confirmed
*
* } else if (openViewMode == IPreferenceConstants.OVM_FLOAT && presentation.canDetach()) {
* presentation.addDetachedPart(pane);
*/
} else {
showFastView(ref);
addFastView(ref);
//Refresh the part as there might have been an error when showing
}
return part;
}
/**
* Toggles the visibility of a fast view. If the view is active it
* is deactivated. Otherwise, it is activated.
*/
public void toggleFastView(IViewReference ref) {
if (ref == activeFastView) {
setActiveFastView(null);
} else {
setActiveFastView(ref);
}
}
/**
* Returns the oldPartID.
* @return String
*/
public String getOldPartID() {
return oldPartID;
}
/**
* Sets the oldPartID.
* @param oldPartID The oldPartID to set
*/
public void setOldPartID(String oldPartID) {
this.oldPartID = oldPartID;
}
/**
* Method moveFastView. Moves draggedView to the position above
* destinationView. If placeAtEnd is true, add view to the end. Otherwise,
* either place above destination view, or at the beginning if the
* destinationView is null
* @param draggedView
* @param destinationView
* @param useDestination
*/
/*package*/ void moveFastView(IViewReference draggedView, IViewReference destinationView, boolean placeAtEnd) {
//PR 6988
//do nothing if views are the same
if (draggedView == destinationView)
return;
//move the view
fastViews.remove(draggedView);
//determine where to place the view
if (placeAtEnd) {//add it to the end
fastViews.add(draggedView);
} else {
if (destinationView == null) //add it to the beginning
fastViews.add(0, draggedView);
else
fastViews.add(fastViews.indexOf(destinationView), draggedView);
}
}
}