aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Norbye <tnorbye@google.com>2012-06-08 13:20:17 -0700
committerandroid code review <noreply-gerritcodereview@google.com>2012-06-08 13:20:18 -0700
commit815b5fb9bfc0de66816a96c58bc907f7ee0d3bcd (patch)
tree44a9966ed3239968c3eb0cb00116c98df57dda3e
parenta1e71a9bf5972363e8c234d2cace82dc95b4a7f2 (diff)
parent7b4c80f986586d7cb52876949e0a299ff4d5ef61 (diff)
downloadsdk-815b5fb9bfc0de66816a96c58bc907f7ee0d3bcd.zip
sdk-815b5fb9bfc0de66816a96c58bc907f7ee0d3bcd.tar.gz
sdk-815b5fb9bfc0de66816a96c58bc907f7ee0d3bcd.tar.bz2
Merge "Fix layout window coordinator for Eclipse 4.2"
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutCanvas.java35
-rw-r--r--eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/LayoutWindowCoordinator.java75
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