javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Shell.java
changeset 49 35baca0e7a2e
parent 35 85266cc22c7f
child 72 1f0034e370aa
--- a/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Shell.java	Fri Jun 11 13:33:44 2010 +0300
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Shell.java	Tue Jul 06 20:36:19 2010 +0300
@@ -12,11 +12,14 @@
  *******************************************************************************/
 package org.eclipse.swt.widgets;
 
+import java.util.Vector;
+
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ShellListener;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.internal.qt.OS;
+import org.eclipse.swt.internal.qt.SymbianWindowVisibilityListener;
 import org.eclipse.swt.internal.qt.WidgetState;
 import org.eclipse.swt.internal.qt.graphics.WindowSurface;
 
@@ -141,6 +144,16 @@
 WindowSurface windowSurface;
 
 /**
+ * When QMainWindow/QDialog visibility is changed, Qt may send a resize event.
+ * eSWT application may have a Shell.setVisible() call in Shell's resize event
+ * handler, which would cause an infinite loop. To prevent this suppress resize
+ * events when Shell visibility is being changed.
+ */
+boolean suppressResizeEvent;
+
+private Vector winVisibilityListeners = new Vector();
+
+/**
  * Constructs a new instance of this class. This is equivalent
  * to calling <code>Shell((Display) null)</code>.
  *
@@ -467,11 +480,15 @@
     Point size =  computeSize(area.width, area.height, true);
     size.x -= windowFrameTrim() * 2;
     size.y -= windowTitleTrim() + windowFrameTrim();
+    
+    // These values will be returned if the size is queried before the Shell
+    // is made visible (and they are not set again). 
+    OS.QWidget_resize(topHandle, size.x, size.y);
+    
     if(OS.windowServer == OS.WS_SYMBIAN_S60 && parent == null) {
         setRestoreState(OS.QT_WINDOWMAXIMIZED, false);
-    } else {
-        OS.QWidget_resize(topHandle, size.x, size.y);
     }
+
     return size;
 }
 
@@ -991,7 +1008,15 @@
     }
     
     // This shell
-    super.setVisible(visible);
+    try {
+        if (visible) {
+            suppressResizeEvent = true;
+        }
+        super.setVisible(visible);
+    } finally {
+        suppressResizeEvent = false;
+    }
+    
     if(isDisposed()) return;
         
     // Dialog shells. 
@@ -1128,10 +1153,22 @@
     return true;
 }
 
+void qt_swt_event_symbianWindowHide() {
+    notifySymbianWindowVisibilityChange(false);
+}
+
+void qt_swt_event_symbianWindowShow() {
+    notifySymbianWindowVisibilityChange(true);
+}
+
 public Rectangle internal_getDefaultBounds() {
     return defBounds;
 }
 
+void qt_swt_event_widgetResized_pp(int widgetHandle, int oldWidth, int oldHeight, int width, int height, boolean sendResizeEvent) {
+    super.qt_swt_event_widgetResized_pp(widgetHandle, oldWidth, oldHeight, width, height, !suppressResizeEvent);
+}
+
 WindowSurface getWindowSurface() {
 	checkWidget();
 	// Only top level shells have window surface
@@ -1144,4 +1181,21 @@
 	return windowSurface;
 }
 
+void addSymbianWindowVisibilityListener_pp(SymbianWindowVisibilityListener listener) {
+    if (!winVisibilityListeners.contains(listener))
+        winVisibilityListeners.addElement(listener);
 }
+
+void removeSymbianWindowVisibilityListener_pp(SymbianWindowVisibilityListener listener) {
+    if (winVisibilityListeners.contains(listener))
+        winVisibilityListeners.removeElement(listener);
+}
+
+void notifySymbianWindowVisibilityChange(boolean visible) {
+    int count = winVisibilityListeners.size();
+    for (int i = 0; i < count; i++) {
+        SymbianWindowVisibilityListener listener = (SymbianWindowVisibilityListener)(winVisibilityListeners.elementAt(i));
+        listener.handleSymbianWindowVisibilityChange(this, visible);
+    }
+}
+}