diff -r 85266cc22c7f -r 35baca0e7a2e 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 Shell((Display) null). * @@ -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); + } +} +}