| 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); |
| } |
| } |
| |
| } |