Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 21666 Details for
Bug 58003
[DetachedViews] Detached view behavior and accessibility
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
demo patch for workbench (has bugs)
58003_workbench_patch.txt (text/plain), 46.75 KB, created by
Stefan Xenos
on 2005-05-24 16:10:06 EDT
(
hide
)
Description:
demo patch for workbench (has bugs)
Filename:
MIME Type:
Creator:
Stefan Xenos
Created:
2005-05-24 16:10:06 EDT
Size:
46.75 KB
patch
obsolete
>Index: Eclipse UI/org/eclipse/ui/internal/DetachedWindow.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/DetachedWindow.java,v >retrieving revision 1.32 >diff -u -r1.32 DetachedWindow.java >--- Eclipse UI/org/eclipse/ui/internal/DetachedWindow.java 2 May 2005 23:31:03 -0000 1.32 >+++ Eclipse UI/org/eclipse/ui/internal/DetachedWindow.java 24 May 2005 19:25:03 -0000 >@@ -33,19 +33,31 @@ > import org.eclipse.swt.widgets.Monitor; > import org.eclipse.swt.widgets.Shell; > import org.eclipse.ui.IMemento; >+import org.eclipse.ui.IPropertyListener; > import org.eclipse.ui.IWorkbenchPage; >+import org.eclipse.ui.IWorkbenchPartConstants; >+import org.eclipse.ui.IWorkbenchPartReference; > import org.eclipse.ui.contexts.IContextService; >+import org.eclipse.ui.internal.dnd.DragUtil; >+import org.eclipse.ui.internal.dnd.IDragOverListener; >+import org.eclipse.ui.internal.dnd.IDropTarget; > import org.eclipse.ui.internal.presentations.PresentationFactoryUtil; >+import org.eclipse.ui.internal.presentations.defaultpresentation.DetachedViewPresentationFactory; >+import org.eclipse.ui.presentations.AbstractPresentationFactory; >+import org.eclipse.ui.presentations.WorkbenchPresentationFactory; > >-public class DetachedWindow { >+ >+/** >+ * TODO: Drag from detached to fast view bar back to detached causes NPE >+ * >+ * @since 3.1 >+ */ >+public class DetachedWindow implements IDragOverListener { > > private PartStack folder; > > private WorkbenchPage page; >- >- //Keep the state of a DetachedWindow when switching perspectives. >- private String title; >- >+ > private Rectangle bounds = new Rectangle(0,0,0,0); > > private Shell s; >@@ -64,6 +76,24 @@ > folder.setBounds(shell.getClientArea()); > } > }; >+ >+ private IPropertyListener propertyListener = new IPropertyListener() { >+ public void propertyChanged(Object source, int propId) { >+ if (propId == PartStack.PROP_SELECTION) { >+ activePartChanged(getPartReference(folder.getSelection())); >+ } >+ } >+ }; >+ >+ private IWorkbenchPartReference activePart; >+ >+ private IPropertyListener partPropertyListener = new IPropertyListener() { >+ public void propertyChanged(Object source, int propId) { >+ if (propId == IWorkbenchPartConstants.PROP_TITLE) { >+ updateTitle(); >+ } >+ } >+ }; > > /** > * Create a new FloatingWindow. >@@ -73,7 +103,55 @@ > //setShellStyle( //SWT.CLOSE | SWT.MIN | SWT.MAX | > //SWT.RESIZE | getDefaultOrientation()); > this.page = workbenchPage; >- folder = new ViewStack(page, false, PresentationFactoryUtil.ROLE_VIEW); >+ >+ // Ugly hack: if we're using the default presentation, change the appearance >+ // of detached views. Really, each presentation should be able to provide an >+ // alternate appearance for detached views >+ AbstractPresentationFactory defaultFactory = ((WorkbenchWindow)page >+ .getWorkbenchWindow()).getWindowConfigurer() >+ .getPresentationFactory(); >+ >+ AbstractPresentationFactory factory = null; >+ >+ if (defaultFactory.getClass() == WorkbenchPresentationFactory.class) { >+ factory = new DetachedViewPresentationFactory(); >+ } >+ >+ folder = new ViewStack(page, false, PresentationFactoryUtil.ROLE_VIEW, factory); >+ folder.addListener(propertyListener); >+ } >+ >+ protected void activePartChanged(IWorkbenchPartReference partReference) { >+ if (activePart == partReference) { >+ return; >+ } >+ >+ if (activePart != null) { >+ activePart.removePropertyListener(partPropertyListener); >+ } >+ activePart = partReference; >+ if (partReference != null) { >+ partReference.addPropertyListener(partPropertyListener); >+ } >+ updateTitle(); >+ } >+ >+ private void updateTitle() { >+ if (activePart != null) { >+ s.setText(activePart.getTitle()); >+ s.setImage(activePart.getTitleImage()); >+ } else { >+ s.setImage(null); >+ } >+ } >+ >+ private static IWorkbenchPartReference getPartReference(PartPane pane) { >+ >+ if (pane == null) { >+ return null; >+ } >+ >+ return pane.getPartReference(); > } > > public Shell getShell() { >@@ -83,6 +161,7 @@ > public void create() { > s = ((WorkbenchWindow)page.getWorkbenchWindow()).getDetachedWindowPool().allocateShell(shellListener); > s.setData(this); >+ DragUtil.addDragTarget(s, this); > hideViewsOnClose = true; > if (bounds.isEmpty()) { > Point center = Geometry.centerPoint(page.getWorkbenchWindow().getShell().getBounds()); >@@ -144,10 +223,9 @@ > if (folder != null) > folder.dispose(); > >-// Shell s = getShell(); > if (s != null) { > s.removeListener(SWT.Resize, resizeListener); >- title = s.getText(); >+ DragUtil.removeDragTarget(s, this); > bounds = s.getBounds(); > > // Unregister this detached view as a window (for key bindings). >@@ -163,6 +241,26 @@ > return true; > } > >+ /* (non-Javadoc) >+ * @see org.eclipse.ui.internal.dnd.IDragOverListener#drag(org.eclipse.swt.widgets.Control, java.lang.Object, org.eclipse.swt.graphics.Point, org.eclipse.swt.graphics.Rectangle) >+ */ >+ public IDropTarget drag(Control currentControl, Object draggedObject, >+ Point position, Rectangle dragRectangle) { >+ >+ if (!(draggedObject instanceof LayoutPart)) { >+ return null; >+ } >+ >+ final LayoutPart sourcePart = (LayoutPart) draggedObject; >+ >+ if (sourcePart.getWorkbenchWindow() != page.getWorkbenchWindow()) { >+ return null; >+ } >+ >+ IDropTarget target = folder.getDropTarget(draggedObject, position); >+ return target; >+ } >+ > /** > * Answer a list of the view panes. > */ >@@ -179,8 +277,7 @@ > * This method will be called to initialize the given Shell's layout > */ > protected void configureShell(Shell shell) { >- if (title != null) >- shell.setText(title); >+ updateTitle(); > shell.addListener(SWT.Resize, resizeListener); > > // Register this detached view as a window (for key bindings). >@@ -226,9 +323,6 @@ > * @see IPersistablePart > */ > public void restoreState(IMemento memento) { >- // Read the title. >- title = memento.getString(IWorkbenchConstants.TAG_TITLE); >- > // Read the bounds. > Integer bigInt; > bigInt = memento.getInteger(IWorkbenchConstants.TAG_X); >@@ -244,7 +338,6 @@ > // Set the bounds. > bounds = new Rectangle(x, y, width, height); > if (getShell() != null) { >- getShell().setText(title); > getShell().setBounds(bounds); > } > >@@ -259,11 +352,8 @@ > */ > public void saveState(IMemento memento) { > if (getShell() != null) { >- title = getShell().getText(); > bounds = getShell().getBounds(); > } >- // Save the title. >- memento.putString(IWorkbenchConstants.TAG_TITLE, title); > > // Save the bounds. > memento.putInteger(IWorkbenchConstants.TAG_X, bounds.x); >Index: Eclipse UI/org/eclipse/ui/internal/PageLayout.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/PageLayout.java,v >retrieving revision 1.38 >diff -u -r1.38 PageLayout.java >--- Eclipse UI/org/eclipse/ui/internal/PageLayout.java 3 May 2005 02:34:38 -0000 1.38 >+++ Eclipse UI/org/eclipse/ui/internal/PageLayout.java 24 May 2005 19:25:04 -0000 >@@ -365,7 +365,7 @@ > } > > ViewStack newFolder = new ViewStack(rootLayoutContainer.page, >- true, appearance); >+ true, appearance, null); > newFolder.add(newPart); > setFolderPart(viewId, newFolder); > addPart(newFolder, viewId, relationship, ratio, refId); >Index: Eclipse UI/org/eclipse/ui/internal/PartSashContainer.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/PartSashContainer.java,v >retrieving revision 1.41 >diff -u -r1.41 PartSashContainer.java >--- Eclipse UI/org/eclipse/ui/internal/PartSashContainer.java 25 Feb 2005 20:52:12 -0000 1.41 >+++ Eclipse UI/org/eclipse/ui/internal/PartSashContainer.java 24 May 2005 19:25:04 -0000 >@@ -1125,11 +1125,15 @@ > targetPart); > } > >- setVisiblePart(visiblePart.getContainer(), visiblePart); >+ if (visiblePart != null) { >+ setVisiblePart(visiblePart.getContainer(), visiblePart); >+ } > > getControl().setRedraw(true); >- >- visiblePart.setFocus(); >+ >+ if (visiblePart != null) { >+ visiblePart.setFocus(); >+ } > } > > /** >Index: Eclipse UI/org/eclipse/ui/internal/PartStack.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/PartStack.java,v >retrieving revision 1.50 >diff -u -r1.50 PartStack.java >--- Eclipse UI/org/eclipse/ui/internal/PartStack.java 16 May 2005 16:26:55 -0000 1.50 >+++ Eclipse UI/org/eclipse/ui/internal/PartStack.java 24 May 2005 19:25:04 -0000 >@@ -21,6 +21,7 @@ > import org.eclipse.jface.action.IMenuManager; > import org.eclipse.jface.util.Assert; > import org.eclipse.jface.util.Geometry; >+import org.eclipse.jface.util.ListenerList; > import org.eclipse.swt.graphics.Cursor; > import org.eclipse.swt.graphics.Point; > import org.eclipse.swt.graphics.Rectangle; >@@ -29,6 +30,7 @@ > import org.eclipse.swt.widgets.Display; > import org.eclipse.ui.IMemento; > import org.eclipse.ui.IPersistable; >+import org.eclipse.ui.IPropertyListener; > import org.eclipse.ui.IWorkbenchPartReference; > import org.eclipse.ui.PlatformUI; > import org.eclipse.ui.XMLMemento; >@@ -53,6 +55,8 @@ > */ > public abstract class PartStack extends LayoutPart implements ILayoutContainer { > >+ public static final int PROP_SELECTION = 0x42; >+ > private List children = new ArrayList(3); > > protected int appearance = PresentationFactoryUtil.ROLE_VIEW; >@@ -207,6 +211,14 @@ > private static final PartStackDropResult dropResult = new PartStackDropResult(); > > private boolean isMinimized; >+ >+ private ListenerList listeners = new ListenerList(); >+ >+ /** >+ * Custom presentation factory to use for this stack, or null to >+ * use the default >+ */ >+ private AbstractPresentationFactory factory; > > protected abstract boolean isMoveable(IPresentablePart part); > >@@ -228,16 +240,40 @@ > m.add(item); > } > } >- >+ > /** > * Creates a new PartStack, given a constant determining which presentation to use > * > * @param appearance one of the PresentationFactoryUtil.ROLE_* constants > */ > public PartStack(int appearance) { >+ this(appearance, null); >+ } >+ >+ /** >+ * Creates a new part stack that uses the given custom presentation factory >+ * @param appearance >+ * @param factory custom factory to use (or null to use the default) >+ */ >+ public PartStack(int appearance, AbstractPresentationFactory factory) { > super("PartStack"); //$NON-NLS-1$ > > this.appearance = appearance; >+ this.factory = factory; >+ } >+ >+ /** >+ * Adds a property listener to this stack. The listener will receive a PROP_SELECTION >+ * event whenever the result of getSelection changes >+ * >+ * @param listener >+ */ >+ public void addListener(IPropertyListener listener) { >+ listeners.add(listener); >+ } >+ >+ public void removeListener(IPropertyListener listener) { >+ listeners.remove(listener); > } > > protected final boolean isStandalone() { >@@ -465,13 +501,16 @@ > } > > protected AbstractPresentationFactory getFactory() { >- AbstractPresentationFactory factory = ((WorkbenchWindow) getPage() >+ >+ if (factory != null) { >+ return factory; >+ } >+ >+ return ((WorkbenchWindow) getPage() > .getWorkbenchWindow()).getWindowConfigurer() > .getPresentationFactory(); >- >- return factory; > } >- >+ > public void createControl(Composite parent) { > if (!isDisposed()) { > return; >@@ -509,11 +548,16 @@ > return null; > } > >- final StackDropResult dropResult = getPresentation().dragOver( >+ StackDropResult dropResult = getPresentation().dragOver( > getControl(), position); > > if (dropResult == null) { >- return null; >+ Rectangle displayBounds = DragUtil.getDisplayBounds(getControl()); >+ if (displayBounds.contains(position)) { >+ dropResult = new StackDropResult(displayBounds, null); >+ } else { >+ return null; >+ } > } > > return createDropTarget(pane, dropResult); >@@ -602,6 +646,7 @@ > > presentationCurrent = null; > current = null; >+ fireInternalPropertyChange(PROP_SELECTION); > } > > public void findSashes(LayoutPart part, PartPane.Sashes sashes) { >@@ -1067,6 +1112,7 @@ > > // Update the return value of getVisiblePart > current = requestedCurrent; >+ fireInternalPropertyChange(PROP_SELECTION); > } > } > >@@ -1340,4 +1386,11 @@ > public IMemento getSavedPresentationState() { > return savedPresentationState; > } >+ >+ private void fireInternalPropertyChange(int id) { >+ Object listeners[] = this.listeners.getListeners(); >+ for (int i = 0; i < listeners.length; i++) { >+ ((IPropertyListener) listeners[i]).propertyChanged(this, id); >+ } >+ } > } >Index: Eclipse UI/org/eclipse/ui/internal/ViewStack.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/ViewStack.java,v >retrieving revision 1.11 >diff -u -r1.11 ViewStack.java >--- Eclipse UI/org/eclipse/ui/internal/ViewStack.java 18 Apr 2005 21:15:23 -0000 1.11 >+++ Eclipse UI/org/eclipse/ui/internal/ViewStack.java 24 May 2005 19:25:04 -0000 >@@ -18,6 +18,7 @@ > import org.eclipse.ui.internal.presentations.SystemMenuFastView; > import org.eclipse.ui.internal.presentations.SystemMenuSize; > import org.eclipse.ui.internal.presentations.UpdatingActionContributionItem; >+import org.eclipse.ui.presentations.AbstractPresentationFactory; > import org.eclipse.ui.presentations.IPresentablePart; > > /** >@@ -59,12 +60,12 @@ > } > > public ViewStack(WorkbenchPage page, boolean allowsStateChanges) { >- this(page, allowsStateChanges, PresentationFactoryUtil.ROLE_VIEW); >+ this(page, allowsStateChanges, PresentationFactoryUtil.ROLE_VIEW, null); > } > > public ViewStack(WorkbenchPage page, boolean allowsStateChanges, >- int appearance) { >- super(appearance); >+ int appearance, AbstractPresentationFactory factory) { >+ super(appearance, factory); > > this.page = page; > setID(this.toString()); >Index: Eclipse UI/org/eclipse/ui/internal/WorkbenchWindow.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchWindow.java,v >retrieving revision 1.284 >diff -u -r1.284 WorkbenchWindow.java >--- Eclipse UI/org/eclipse/ui/internal/WorkbenchWindow.java 19 May 2005 20:19:25 -0000 1.284 >+++ Eclipse UI/org/eclipse/ui/internal/WorkbenchWindow.java 24 May 2005 19:25:04 -0000 >@@ -840,7 +840,7 @@ > protected void configureShell(Shell shell) { > super.configureShell(shell); > >- detachedWindowShells = new ShellPool(shell, SWT.RESIZE | getDefaultOrientation()); >+ detachedWindowShells = new ShellPool(shell, SWT.SHELL_TRIM | SWT.TOOL | SWT.TITLE | SWT.MIN | SWT.MAX | SWT.RESIZE | getDefaultOrientation()); > > String title = getWindowConfigurer().basicGetTitle(); > if (title != null) { >Index: Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DefaultTabFolder.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DefaultTabFolder.java,v >retrieving revision 1.14 >diff -u -r1.14 DefaultTabFolder.java >--- Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DefaultTabFolder.java 19 May 2005 09:34:23 -0000 1.14 >+++ Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DefaultTabFolder.java 24 May 2005 19:25:04 -0000 >@@ -11,7 +11,9 @@ > package org.eclipse.ui.internal.presentations.defaultpresentation; > > import org.eclipse.jface.util.Assert; >+import org.eclipse.jface.util.Geometry; > import org.eclipse.swt.SWT; >+import org.eclipse.swt.custom.CTabFolder; > import org.eclipse.swt.custom.CTabFolderEvent; > import org.eclipse.swt.custom.CTabItem; > import org.eclipse.swt.events.MouseAdapter; >@@ -176,7 +178,7 @@ > * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#add(int) > */ > public AbstractTabItem add(int index, int flags) { >- DefaultTabItem result = new DefaultTabItem(this, index, flags); >+ DefaultTabItem result = new DefaultTabItem((CTabFolder)getFolder().getControl(), index, flags); > > result.getWidget().setData(result); > >@@ -253,7 +255,7 @@ > * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#getTabArea() > */ > public Rectangle getTabArea() { >- return paneFolder.getTitleArea(); >+ return Geometry.toDisplay(paneFolder.getControl().getParent(), paneFolder.getTitleArea()); > } > > /** >Index: Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DefaultTabItem.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DefaultTabItem.java,v >retrieving revision 1.7 >diff -u -r1.7 DefaultTabItem.java >--- Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DefaultTabItem.java 4 May 2005 15:23:40 -0000 1.7 >+++ Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DefaultTabItem.java 24 May 2005 19:25:04 -0000 >@@ -13,6 +13,8 @@ > import java.text.MessageFormat; > > import org.eclipse.jface.resource.FontRegistry; >+import org.eclipse.jface.util.Geometry; >+import org.eclipse.swt.custom.CTabFolder; > import org.eclipse.swt.custom.CTabItem; > import org.eclipse.swt.graphics.Font; > import org.eclipse.swt.graphics.Rectangle; >@@ -36,8 +38,8 @@ > private String shortName = Util.ZERO_LENGTH_STRING; > private String longName = Util.ZERO_LENGTH_STRING; > >- public DefaultTabItem(DefaultTabFolder parent, int index, int flags) { >- super(parent.getFolder().createItem(flags, index)); >+ public DefaultTabItem(CTabFolder parent, int index, int flags) { >+ super(new CTabItem(parent, flags, index)); > updateFont(); > } > >@@ -45,7 +47,7 @@ > * @see org.eclipse.ui.internal.presentations.util.AbstractTabItem#getBounds() > */ > public Rectangle getBounds() { >- return getItem().getBounds(); >+ return Geometry.toDisplay(getItem().getParent(), getItem().getBounds()); > } > > public CTabItem getItem() { >Index: Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/NativeTabFolder.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/NativeTabFolder.java,v >retrieving revision 1.5 >diff -u -r1.5 NativeTabFolder.java >--- Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/NativeTabFolder.java 5 May 2005 19:05:03 -0000 1.5 >+++ Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/NativeTabFolder.java 24 May 2005 19:25:05 -0000 >@@ -70,7 +70,7 @@ > } > > }; >- >+ > public NativeTabFolder(Composite parent) { > control = new TabFolder(parent, SWT.BOTTOM); > control.addListener(SWT.Selection, selectionListener); >@@ -219,7 +219,7 @@ > bounds.y = 0; > Geometry.expand(bounds, 0, 0, - (clientArea.height + clientArea.y), 0); > >- return bounds; >+ return Geometry.toDisplay(control.getParent(), bounds); > } > > /* (non-Javadoc) >Index: Eclipse UI/org/eclipse/ui/internal/presentations/util/AbstractTabFolder.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/presentations/util/AbstractTabFolder.java,v >retrieving revision 1.8 >diff -u -r1.8 AbstractTabFolder.java >--- Eclipse UI/org/eclipse/ui/internal/presentations/util/AbstractTabFolder.java 4 May 2005 15:23:40 -0000 1.8 >+++ Eclipse UI/org/eclipse/ui/internal/presentations/util/AbstractTabFolder.java 24 May 2005 19:25:05 -0000 >@@ -311,13 +311,29 @@ > } > } > >+ protected void detachListeners(Control theControl, boolean recursive) { >+ theControl.removeListener(SWT.MenuDetect, menuListener); >+ theControl.removeMouseListener(mouseListener); >+ PresentationUtil.removeDragListener(theControl, dragListener); >+ >+ if (recursive && theControl instanceof Composite) { >+ Composite composite = (Composite) theControl; >+ Control[] children = composite.getChildren(); >+ >+ for (int i = 0; i < children.length; i++) { >+ Control control = children[i]; >+ >+ detachListeners(control, recursive); >+ } >+ } >+ } >+ > protected void handleContextMenu(Point displayPos, Event e) { > if (isOnBorder(displayPos)) { > return; > } >- >- Point localPos = getControl().toControl(displayPos); >- AbstractTabItem tab = getItem(localPos); >+ >+ AbstractTabItem tab = getItem(displayPos); > > fireEvent(TabFolderEvent.EVENT_SYSTEM_MENU, tab, displayPos); > } >@@ -339,13 +355,12 @@ > } > > protected void handleDragStarted(Point displayPos, Event e) { >- Point localPos = getControl().toControl(displayPos); >- >+ > if (isOnBorder(displayPos)) { > return; > } > >- AbstractTabItem tab = getItem(localPos); >+ AbstractTabItem tab = getItem(displayPos); > fireEvent(TabFolderEvent.EVENT_DRAG_START, tab, displayPos); > } > >Index: Eclipse UI/org/eclipse/ui/internal/presentations/util/PresentablePartFolder.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/presentations/util/PresentablePartFolder.java,v >retrieving revision 1.7 >diff -u -r1.7 PresentablePartFolder.java >--- Eclipse UI/org/eclipse/ui/internal/presentations/util/PresentablePartFolder.java 4 May 2005 15:23:40 -0000 1.7 >+++ Eclipse UI/org/eclipse/ui/internal/presentations/util/PresentablePartFolder.java 24 May 2005 19:25:05 -0000 >@@ -58,6 +58,9 @@ > } > > public void controlResized(ControlEvent e) { >+ if (e.widget == contentProxy) { >+ layoutContent(); >+ } > } > > }; >Index: Eclipse UI/org/eclipse/ui/internal/presentations/util/ProxyControl.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/presentations/util/ProxyControl.java,v >retrieving revision 1.6 >diff -u -r1.6 ProxyControl.java >--- Eclipse UI/org/eclipse/ui/internal/presentations/util/ProxyControl.java 4 May 2005 15:23:40 -0000 1.6 >+++ Eclipse UI/org/eclipse/ui/internal/presentations/util/ProxyControl.java 24 May 2005 19:25:05 -0000 >@@ -23,7 +23,6 @@ > import org.eclipse.swt.widgets.Event; > import org.eclipse.swt.widgets.Layout; > import org.eclipse.swt.widgets.Listener; >-import org.eclipse.ui.internal.dnd.DragUtil; > import org.eclipse.ui.internal.dnd.SwtUtil; > import org.eclipse.ui.internal.layout.SizeCache; > >@@ -111,8 +110,8 @@ > > public void handleEvent(Event event) { > if (target != null) { >- visible = control.getVisible(); >- target.setVisible(visible); >+// visible = control.getVisible(); >+// target.setVisible(visible); > } > } > >@@ -129,9 +128,9 @@ > } > > public void controlResized(ControlEvent e) { >- //if (e.widget == control) { >- // ProxyControl.this.layout(); >- //} >+ if (e.widget == control) { >+ //ProxyControl.this.layout(); >+ } > } > > }; >@@ -252,8 +251,8 @@ > Rectangle displayBounds = Geometry.toDisplay(control.getParent(), control.getBounds()); > > // Clip the bounds of the target so that it doesn't go outside the dummy control's parent >- Rectangle clippingRegion = DragUtil.getDisplayBounds(control.getParent()); >- displayBounds = displayBounds.intersection(clippingRegion); >+ //Rectangle clippingRegion = DragUtil.getDisplayBounds(control.getParent()); >+ //displayBounds = displayBounds.intersection(clippingRegion); > > // Compute the bounds of the target, in the local coordinate system of its parent > Rectangle targetBounds = Geometry.toControl(getTarget().getParent(), displayBounds); >Index: Eclipse UI/org/eclipse/ui/internal/presentations/util/ReplaceDragHandler.java >=================================================================== >RCS file: /home/eclipse/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/presentations/util/ReplaceDragHandler.java,v >retrieving revision 1.7 >diff -u -r1.7 ReplaceDragHandler.java >--- Eclipse UI/org/eclipse/ui/internal/presentations/util/ReplaceDragHandler.java 4 May 2005 15:23:40 -0000 1.7 >+++ Eclipse UI/org/eclipse/ui/internal/presentations/util/ReplaceDragHandler.java 24 May 2005 19:25:05 -0000 >@@ -43,9 +43,9 @@ > int dragStart) { > > // Determine which tab we're currently dragging over >- Point localPos = tabFolder.getControl().toControl(location); >+ //Point localPos = tabFolder.getControl().toControl(location); > >- AbstractTabItem tabUnderPointer = tabFolder.getItem(localPos); >+ AbstractTabItem tabUnderPointer = tabFolder.getItem(location); > > // This drop target only deals with tabs... if we're not dragging over > // a tab, exit. >@@ -54,7 +54,7 @@ > > // If we're dragging over the title area, treat this as a drop in the last > // tab position. >- if (titleArea.contains(localPos)) { >+ if (titleArea.contains(location)) { > int dragOverIndex = tabFolder.getItemCount(); > AbstractTabItem lastTab = tabFolder.getItem(dragOverIndex - 1); > >@@ -72,17 +72,16 @@ > if (dragStart >= 0) { > dragOverIndex--; > >- return new StackDropResult(Geometry.toDisplay(tabFolder >- .getControl(), lastTabBounds), new Integer( >+ return new StackDropResult(lastTabBounds, new Integer( > dragOverIndex)); > } > > // Make the drag-over rectangle look like a tab at the end of the tab region. > // We don't actually know how wide the tab will be when it's dropped, so just > // make it 3 times wider than it is tall. >- Rectangle dropRectangle = Geometry.toDisplay(tabFolder >- .getControl(), titleArea); >+ Rectangle dropRectangle = titleArea; > >+ dropRectangle.x = lastTabBounds.x + lastTabBounds.width; > dropRectangle.width = 3 * dropRectangle.height; > return new StackDropResult(dropRectangle, new Integer( > dragOverIndex)); >@@ -110,8 +109,7 @@ > return null; > } > >- return new StackDropResult(Geometry.toDisplay(tabFolder.getControl(), >- tabUnderPointer.getBounds()), new DragCookie(tabFolder >+ return new StackDropResult(tabBounds, new DragCookie(tabFolder > .indexOf(tabUnderPointer))); > } > >Index: Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DetachedViewPresentationFactory.java >=================================================================== >RCS file: Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DetachedViewPresentationFactory.java >diff -N Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DetachedViewPresentationFactory.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DetachedViewPresentationFactory.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,35 @@ >+/******************************************************************************* >+ * Copyright (c) 2004 IBM Corporation and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * IBM Corporation - initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.ui.internal.presentations.defaultpresentation; >+ >+import org.eclipse.swt.widgets.Composite; >+import org.eclipse.ui.internal.presentations.util.StandardViewSystemMenu; >+import org.eclipse.ui.internal.presentations.util.TabbedStackPresentation; >+import org.eclipse.ui.presentations.IStackPresentationSite; >+import org.eclipse.ui.presentations.StackPresentation; >+import org.eclipse.ui.presentations.WorkbenchPresentationFactory; >+ >+/** >+ * @since 3.1 >+ */ >+public class DetachedViewPresentationFactory extends WorkbenchPresentationFactory { >+ >+ /* >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.ui.presentations.AbstractPresentationFactory >+ */ >+ public StackPresentation createViewPresentation(Composite parent, >+ IStackPresentationSite site) { >+ return new TabbedStackPresentation(site, new DetachedViewTabFolder(parent), new StandardViewSystemMenu(site)); >+ } >+ >+} >Index: Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DetachedViewTabFolder.java >=================================================================== >RCS file: Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DetachedViewTabFolder.java >diff -N Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DetachedViewTabFolder.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DetachedViewTabFolder.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,410 @@ >+/******************************************************************************* >+ * Copyright (c) 2004 IBM Corporation and others. >+ * All rights reserved. This program and the accompanying materials >+ * are made available under the terms of the Eclipse Public License v1.0 >+ * which accompanies this distribution, and is available at >+ * http://www.eclipse.org/legal/epl-v10.html >+ * >+ * Contributors: >+ * IBM Corporation - initial API and implementation >+ *******************************************************************************/ >+package org.eclipse.ui.internal.presentations.defaultpresentation; >+ >+import org.eclipse.jface.util.Geometry; >+import org.eclipse.swt.SWT; >+import org.eclipse.swt.custom.CTabFolder; >+import org.eclipse.swt.custom.CTabFolder2Adapter; >+import org.eclipse.swt.custom.CTabFolderEvent; >+import org.eclipse.swt.custom.CTabItem; >+import org.eclipse.swt.custom.ViewForm; >+import org.eclipse.swt.events.DisposeEvent; >+import org.eclipse.swt.events.DisposeListener; >+import org.eclipse.swt.events.MouseAdapter; >+import org.eclipse.swt.events.MouseEvent; >+import org.eclipse.swt.graphics.Cursor; >+import org.eclipse.swt.graphics.Image; >+import org.eclipse.swt.graphics.Point; >+import org.eclipse.swt.graphics.Rectangle; >+import org.eclipse.swt.widgets.Composite; >+import org.eclipse.swt.widgets.Control; >+import org.eclipse.swt.widgets.Event; >+import org.eclipse.swt.widgets.Listener; >+import org.eclipse.swt.widgets.ToolBar; >+import org.eclipse.swt.widgets.ToolItem; >+import org.eclipse.swt.widgets.Widget; >+import org.eclipse.ui.IPropertyListener; >+import org.eclipse.ui.internal.IWorkbenchGraphicConstants; >+import org.eclipse.ui.internal.WorkbenchImages; >+import org.eclipse.ui.internal.WorkbenchMessages; >+import org.eclipse.ui.internal.dnd.DragUtil; >+import org.eclipse.ui.internal.layout.CellLayout; >+import org.eclipse.ui.internal.layout.LayoutUtil; >+import org.eclipse.ui.internal.layout.Row; >+import org.eclipse.ui.internal.layout.SizeCache; >+import org.eclipse.ui.internal.presentations.util.AbstractTabFolder; >+import org.eclipse.ui.internal.presentations.util.AbstractTabItem; >+import org.eclipse.ui.internal.presentations.util.PartInfo; >+import org.eclipse.ui.internal.presentations.util.ProxyControl; >+import org.eclipse.ui.internal.presentations.util.TabFolderEvent; >+import org.eclipse.ui.internal.util.Util; >+ >+/** >+ * >+ * >+ * >+ * @since 3.1 >+ */ >+public class DetachedViewTabFolder extends AbstractTabFolder { >+ >+ private Composite control; >+ private CTabFolder folder; >+ private Control viewToolBar; >+ private ViewForm viewForm; >+ private ProxyControl toolbarProxy; >+ private Composite topLeftControl; >+ private SizeCache toolbarCache; >+ private Cursor dragCursor; >+ >+ private static final String FULL_TITLE = "part_title"; //$NON-NLS-1$ >+ >+ // CTabFolder listener >+ private CTabFolder2Adapter expandListener = new CTabFolder2Adapter() { >+ /* >+ * (non-Javadoc) >+ * >+ * @see org.eclipse.swt.custom.CTabFolder2Adapter#close(org.eclipse.swt.custom.CTabFolderEvent) >+ */ >+ public void close(CTabFolderEvent event) { >+ event.doit = false; >+ fireEvent(TabFolderEvent.EVENT_CLOSE, getTab(event.item)); >+ } >+ >+ public void showList(CTabFolderEvent event) { >+ event.doit = false; >+ fireEvent(TabFolderEvent.EVENT_SHOW_LIST); >+ } >+ >+ }; >+ >+ >+ private Listener selectionListener = new Listener() { >+ public void handleEvent(Event e) { >+ fireEvent(TabFolderEvent.EVENT_TAB_SELECTED, getTab(e.item)); >+ } >+ }; >+ >+ private IPropertyListener systemToolbarListener = new IPropertyListener() { >+ >+ public void propertyChanged(Object source, int propId) { >+ Point location; >+ >+ if (propId == TabFolderEvent.EVENT_PANE_MENU) { >+ location = getPaneMenuLocation(); >+ } else { >+ location = new Point(0,0); >+ } >+ >+ fireEvent(propId, getSelection(), location); >+ } >+ >+ }; >+ >+ private DisposeListener tabDisposeListener = new DisposeListener() { >+ public void widgetDisposed(DisposeEvent e) >+ { >+ if (e.widget == control) { >+ disposed(); >+ } >+ } >+ }; >+ >+ public DetachedViewTabFolder(Composite parent) { >+ control = new Composite(parent, SWT.NONE); >+ control.addDisposeListener(tabDisposeListener); >+ CellLayout layout = new CellLayout(1) >+ .setDefaultRow(Row.fixed()) >+ .setDefaultColumn(Row.growing()) >+ .setRow(0, Row.growing()) >+ .setSpacing(0, 0) >+ .setMargins(0, 0); >+ control.setLayout(layout); >+ dragCursor = parent.getDisplay().getSystemCursor(SWT.CURSOR_SIZEALL); >+ >+ viewForm = new ViewForm(control, SWT.FLAT); >+ attachListeners(viewForm, false); >+ >+ topLeftControl = new Composite(viewForm, SWT.NONE); >+ topLeftControl.setLayout(new CellLayout(0).setDefaultColumn(Row.fixed()).setSpacing(0,0).setMargins(0,0)); >+ topLeftControl.setCursor(dragCursor); >+ attachListeners(topLeftControl, false); >+ toolbarProxy = new ProxyControl(topLeftControl); >+ viewForm.setTopLeft(topLeftControl); >+ >+ toolbarCache = new SizeCache(); >+ >+ folder = new CTabFolder(control, SWT.BOTTOM); >+ folder.setMinimizeVisible(false); >+ folder.setMaximizeVisible(false); >+ folder.setUnselectedCloseVisible(true); >+ folder.setUnselectedImageVisible(true); >+ folder.addListener(SWT.Selection, selectionListener); >+ folder.addCTabFolder2Listener(expandListener); >+ attachListeners(folder, false); >+ >+ // Initialize view menu dropdown >+ { >+ ToolBar actualToolBar = new ToolBar(viewForm, SWT.FLAT | SWT.NO_BACKGROUND); >+ viewToolBar = actualToolBar; >+ >+ ToolItem pullDownButton = new ToolItem(actualToolBar, SWT.PUSH); >+ Image hoverImage = WorkbenchImages >+ .getImage(IWorkbenchGraphicConstants.IMG_LCL_RENDERED_VIEW_MENU); >+ pullDownButton.setDisabledImage(hoverImage); >+ pullDownButton.setImage(hoverImage); >+ pullDownButton.setToolTipText(WorkbenchMessages.Menu); >+ actualToolBar.addMouseListener(new MouseAdapter() { >+ public void mouseDown(MouseEvent e) { >+ fireEvent(TabFolderEvent.EVENT_PANE_MENU, getSelection(), getPaneMenuLocation()); >+ } >+ }); >+ } >+ >+ viewForm.setTopRight(viewToolBar); >+ } >+ >+ protected void disposed() { >+ >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#computeSize(int, int) >+ */ >+ public Point computeSize(int widthHint, int heightHint) { >+ return new Point(50, 50); >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#add(int) >+ */ >+ public AbstractTabItem add(int index, int flags) { >+ DetachedViewTabItem item = new DetachedViewTabItem(this, index, flags); >+ item.getWidget().setData(item); >+ item.getWidget().addDisposeListener(tabDisposeListener); >+ >+ if (folder.getItemCount() == 2) { >+ layout(true); >+ } >+ >+ return item; >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#layout(boolean) >+ */ >+ public void layout(boolean flushCache) { >+ >+ Rectangle oldBounds = viewForm.getBounds(); >+ >+ CellLayout layout = (CellLayout)control.getLayout(); >+ if (folder.getItemCount() < 2) { >+ layout.setRow(1, Row.fixed(0)); >+ } else { >+ layout.setRow(1, Row.fixed(folder.getTabHeight() + 2)); >+ } >+ >+ super.layout(flushCache); >+ >+ control.layout(flushCache); >+ >+ Rectangle newBounds = viewForm.getBounds(); >+ >+ if (Util.equals(oldBounds, newBounds)) { >+ viewForm.layout(flushCache); >+ } >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#getClientArea() >+ */ >+ public Rectangle getClientArea() { >+ Control content = viewForm.getContent(); >+ >+ if (content == null) { >+ return new Rectangle(0,0,0,0); >+ } >+ >+ return Geometry.toControl(control, DragUtil.getDisplayBounds(content)); >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#getItems() >+ */ >+ public AbstractTabItem[] getItems() { >+ CTabItem[] items = folder.getItems(); >+ >+ AbstractTabItem[] result = new AbstractTabItem[items.length]; >+ >+ for (int i = 0; i < result.length; i++) { >+ result[i] = getTab(items[i]); >+ } >+ >+ return result; >+ } >+ >+ /** >+ * @param item >+ * @return >+ * @since 3.1 >+ */ >+ private AbstractTabItem getTab(Widget item) { >+ return (AbstractTabItem)item.getData(); >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#setSelection(org.eclipse.ui.internal.presentations.util.Widget) >+ */ >+ public void setSelection(AbstractTabItem toSelect) { >+ if (toSelect == null) { >+ return; >+ } >+ >+ DetachedViewTabItem tab = (DetachedViewTabItem) toSelect; >+ folder.setSelection((CTabItem)tab.getWidget()); >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#setSelectedInfo(org.eclipse.ui.internal.presentations.util.PartInfo) >+ */ >+ public void setSelectedInfo(PartInfo info) { >+ } >+ /* (non-Javadoc) >+ * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#getToolbarParent() >+ */ >+ public Composite getToolbarParent() { >+ return viewForm; >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#getTabArea() >+ */ >+ public Rectangle getTabArea() { >+ return Geometry.toDisplay(folder.getParent(), folder.getBounds()); >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#setToolbar(org.eclipse.swt.widgets.Control) >+ */ >+ public void setToolbar(Control toolbarControl) { >+ >+ if (toolbarControl == getToolbar()) { >+ return; >+ } >+ >+ if (toolbarControl != null) { >+ toolbarCache.setControl(toolbarControl); >+ toolbarProxy.setTarget(toolbarCache); >+ LayoutUtil.resize(toolbarProxy.getControl()); >+ >+ toolbarProxy.layout(); >+ //toolbarControl.moveAbove(null); >+// if (!toolbarControl.getVisible()) { >+// System.out.println("not visible"); //$NON-NLS-1$ >+// } >+// >+// >+// Rectangle rect = DragUtil.getDisplayBounds(toolbarControl); >+// Rectangle proxyRect = DragUtil.getDisplayBounds(toolbarProxy.getControl()); >+// if (!proxyRect.equals(rect)) { >+// System.out.println("wrong bounds"); //$NON-NLS-1$ >+// } >+ } else { >+ toolbarCache.setControl(null); >+ toolbarProxy.setTarget(null); >+ } >+ >+ super.setToolbar(toolbarControl); >+ } >+ >+ public Control getControl() { >+ return control; >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#isOnBorder(org.eclipse.swt.graphics.Point) >+ */ >+ public boolean isOnBorder(Point globalPos) { >+ Point localPos = getControl().toControl(globalPos); >+ >+ Rectangle clientArea = getClientArea(); >+ return localPos.y > clientArea.y && localPos.y < clientArea.y + clientArea.height; >+ } >+ >+ public AbstractTabItem getSelection() { >+ CTabItem sel = folder.getSelection(); >+ >+ if (sel == null) { >+ return null; >+ } >+ >+ return getTab(sel); >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#getContentParent() >+ */ >+ public Composite getContentParent() { >+ return viewForm; >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.ui.internal.presentations.util.AbstractTabFolder#setContent(org.eclipse.swt.widgets.Control) >+ */ >+ public void setContent(Control newContent) { >+ viewForm.setContent(newContent); >+ } >+ >+ /** >+ * @return >+ * @since 3.1 >+ */ >+ public CTabFolder getTabFolder() { >+ return folder; >+ } >+ >+ protected void handleDragStarted(Point displayPos, Event e) { >+ if (isOnBorder(displayPos)) { >+ return; >+ } >+ >+ AbstractTabItem tab = null; >+ >+ if (DragUtil.getDisplayBounds(viewForm).contains(displayPos)) { >+ tab = getSelection(); >+ } else { >+ tab = getItem(displayPos); >+ } >+ >+ fireEvent(TabFolderEvent.EVENT_DRAG_START, tab, displayPos); >+ } >+ >+ public Point getPaneMenuLocation() { >+ Point toolbarSize = viewToolBar.getSize(); >+ >+ return viewToolBar.toDisplay(0,toolbarSize.y); >+ } >+ >+ public void enablePaneMenu(boolean enabled) { >+ if (enabled) { >+ viewToolBar.setVisible(true); >+ } else { >+ viewToolBar.setVisible(false); >+ } >+ } >+ >+ public void itemRemoved() { >+ if (folder.getItemCount() == 1 && !control.isDisposed() && !viewForm.isDisposed()) { >+ layout(true); >+ } >+ } >+ >+} >Index: Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DetachedViewTabItem.java >=================================================================== >RCS file: Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DetachedViewTabItem.java >diff -N Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DetachedViewTabItem.java >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ Eclipse UI/org/eclipse/ui/internal/presentations/defaultpresentation/DetachedViewTabItem.java 1 Jan 1970 00:00:00 -0000 >@@ -0,0 +1,19 @@ >+package org.eclipse.ui.internal.presentations.defaultpresentation; >+ >+ >+public class DetachedViewTabItem extends DefaultTabItem { >+ >+ private DetachedViewTabFolder folder; >+ >+ public DetachedViewTabItem(DetachedViewTabFolder folder, int index, int flags) { >+ super(folder.getTabFolder(), index, flags); >+ >+ this.folder = folder; >+ } >+ >+ public void dispose() { >+ super.dispose(); >+ >+ folder.itemRemoved(); >+ } >+}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 58003
: 21666