diff options
author | Tor Norbye <tnorbye@google.com> | 2012-06-08 13:20:17 -0700 |
---|---|---|
committer | android code review <noreply-gerritcodereview@google.com> | 2012-06-08 13:20:18 -0700 |
commit | 815b5fb9bfc0de66816a96c58bc907f7ee0d3bcd (patch) | |
tree | 44a9966ed3239968c3eb0cb00116c98df57dda3e | |
parent | a1e71a9bf5972363e8c234d2cace82dc95b4a7f2 (diff) | |
parent | 7b4c80f986586d7cb52876949e0a299ff4d5ef61 (diff) | |
download | sdk-815b5fb9bfc0de66816a96c58bc907f7ee0d3bcd.zip sdk-815b5fb9bfc0de66816a96c58bc907f7ee0d3bcd.tar.gz sdk-815b5fb9bfc0de66816a96c58bc907f7ee0d3bcd.tar.bz2 |
Merge "Fix layout window coordinator for Eclipse 4.2"
2 files changed, 96 insertions, 14 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java index 371852c..1e1813f 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java @@ -287,11 +287,25 @@ public class LayoutCanvas extends Canvas { public void controlResized(ControlEvent e) { super.controlResized(e); - mHScale.setClientSize(getClientArea().width); - mVScale.setClientSize(getClientArea().height); + // Check editor state: + LayoutWindowCoordinator coordinator = LayoutWindowCoordinator.get(); + if (coordinator != null) { + IEditorSite editorSite = getEditorDelegate().getEditor().getEditorSite(); + coordinator.syncMaximizedState(editorSite.getPage()); + } + + Rectangle clientArea = getClientArea(); + mHScale.setClientSize(clientArea.width); + mVScale.setClientSize(clientArea.height); // Update the zoom level in the canvas when you toggle the zoom - getDisplay().asyncExec(mZoomCheck); + if (coordinator != null) { + mZoomCheck.run(); + } else { + // During startup, delay updates which can trigger further layout + getDisplay().asyncExec(mZoomCheck); + + } } }); @@ -329,14 +343,15 @@ public class LayoutCanvas extends Canvas { return; } - IEditorPart editor = getEditorDelegate().getEditor(); - IWorkbenchPage page = editor.getSite().getPage(); - Boolean zoomed = page.isPageZoomed(); - if (mWasZoomed != zoomed) { - if (mWasZoomed != null) { - setFitScale(true /*onlyZoomOut*/); + LayoutWindowCoordinator coordinator = LayoutWindowCoordinator.get(); + if (coordinator != null) { + Boolean zoomed = coordinator.isEditorMaximized(); + if (mWasZoomed != zoomed) { + if (mWasZoomed != null) { + setFitScale(true /*onlyZoomOut*/); + } + mWasZoomed = zoomed; } - mWasZoomed = zoomed; } } }; diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutWindowCoordinator.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutWindowCoordinator.java index 6a6f564..a0672c6 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutWindowCoordinator.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutWindowCoordinator.java @@ -16,10 +16,12 @@ package com.android.ide.eclipse.adt.internal.editors.layout.gle2; import com.android.annotations.NonNull; +import com.android.annotations.Nullable; import com.android.ide.eclipse.adt.internal.editors.AndroidXmlEditor; import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate; import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IPartListener2; import org.eclipse.ui.IPartService; import org.eclipse.ui.IViewReference; @@ -73,13 +75,19 @@ public class LayoutWindowCoordinator implements IPartListener2 { */ private boolean mInitialized; + /** Singleton reference */ + private static LayoutWindowCoordinator sSingleton; + /** * Start the coordinator * * @param window the associated window */ public static void start(@NonNull IWorkbenchWindow window) { + assert sSingleton == null; + LayoutWindowCoordinator coordinator = new LayoutWindowCoordinator(window); + sSingleton = coordinator; IPartService service = window.getPartService(); if (service != null) { @@ -88,7 +96,27 @@ public class LayoutWindowCoordinator implements IPartListener2 { } } - private LayoutWindowCoordinator(IWorkbenchWindow window) { + /** + * Returns the coordinator. This method will return null if it is called before + * {@link #start} has been called, and non null after. + * + * @return the coordinator + */ + @Nullable + public static LayoutWindowCoordinator get() { + return sSingleton; + } + + /** + * Returns true if the main editor window is maximized + * + * @return true if the main editor window is maximized + */ + public boolean isEditorMaximized() { + return mEditorMaximized; + } + + private LayoutWindowCoordinator(@NonNull IWorkbenchWindow window) { mWindow = window; initialize(); @@ -122,8 +150,9 @@ public class LayoutWindowCoordinator implements IPartListener2 { mOutlineOpen = true; } } - mEditorMaximized = activePage.isPageZoomed(); - syncActive(); + if (!syncMaximizedState(activePage)) { + syncActive(); + } } static IViewReference findPropertySheetView(IWorkbenchPage activePage) { @@ -135,6 +164,43 @@ public class LayoutWindowCoordinator implements IPartListener2 { } /** + * Checks the maximized state of the page and updates internal state if + * necessary. + * <p> + * This is used in Eclipse 4.x, where the {@link IPartListener2} does not + * fire {@link IPartListener2#partHidden(IWorkbenchPartReference)} when the + * editor is maximized anymore (see issue + * https://bugs.eclipse.org/bugs/show_bug.cgi?id=382120 for details). + * Instead, the layout editor listens for resize events, and upon resize it + * looks up the part state and calls this method to ensure that the right + * maximized state is known to the layout coordinator. + * + * @param page the active workbench page + * @return true if the state changed, false otherwise + */ + public boolean syncMaximizedState(IWorkbenchPage page) { + boolean maximized = isPageZoomed(page); + if (mEditorMaximized != maximized) { + mEditorMaximized = maximized; + syncActive(); + return true; + } + return false; + } + + private boolean isPageZoomed(IWorkbenchPage page) { + IWorkbenchPartReference reference = page.getActivePartReference(); + if (reference != null && reference instanceof IEditorReference) { + int state = page.getPartState(reference); + boolean maximized = (state & IWorkbenchPage.STATE_MAXIMIZED) != 0; + return maximized; + } + + // If the active reference isn't the editor, then the editor can't be maximized + return false; + } + + /** * Syncs the given editor's view state such that the property sheet and or * outline are shown or hidden according to the visibility of the global * outline and property sheet views. @@ -258,8 +324,9 @@ public class LayoutWindowCoordinator implements IPartListener2 { } } + boolean wasMaximized = mEditorMaximized; mEditorMaximized = visibleCount <= 1; - if (mEditorMaximized) { + if (mEditorMaximized && !wasMaximized) { // Only consider -maximizing- the window to be occasion for handling // a "property sheet closed" event as a "show outline. // And in fact we may want to remove it once you re-expose things |