javauis/eswt_qt/org.eclipse.swt/Eclipse SWT/qt/org/eclipse/swt/widgets/Shell.java
--- 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);
+ }
+}
+}