summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSilenio Quarti <silenio>2010-08-06 18:47:47 +0000
committerSilenio Quarti <silenio>2010-08-06 18:47:47 +0000
commite956d28ff98c29a9acf3a2fde3ef728ddeea9135 (patch)
tree64a762bf3f9595a13e9ac123647d5798232d25b5
parent79fb86353cc11f71a3677202ea46d8db813272a3 (diff)
downloadeclipse.platform.swt-e956d28ff98c29a9acf3a2fde3ef728ddeea9135.tar.gz
eclipse.platform.swt-e956d28ff98c29a9acf3a2fde3ef728ddeea9135.tar.xz
eclipse.platform.swt-e956d28ff98c29a9acf3a2fde3ef728ddeea9135.zip
Bug 313740 - Unable to select any window when JFace warning dialog and file browse dialog are both open (back port to 3.6.x)
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/carbon/library/os.c12
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/carbon/library/os_stats.c5
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/carbon/library/os_stats.h1
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT PI/carbon/org/eclipse/swt/internal/carbon/OS.java2
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/DirectoryDialog.java3
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/FileDialog.java3
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Shell.java39
7 files changed, 63 insertions, 2 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/library/os.c b/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/library/os.c
index 26a8230fad..08d6923798 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/library/os.c
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/library/os.c
@@ -10053,6 +10053,18 @@ JNIEXPORT jint JNICALL OS_NATIVE(NavDialogGetUserAction)
}
#endif
+#ifndef NO_NavDialogGetWindow
+JNIEXPORT jint JNICALL OS_NATIVE(NavDialogGetWindow)
+ (JNIEnv *env, jclass that, jint arg0)
+{
+ jint rc = 0;
+ OS_NATIVE_ENTER(env, that, NavDialogGetWindow_FUNC);
+ rc = (jint)NavDialogGetWindow((NavDialogRef)arg0);
+ OS_NATIVE_EXIT(env, that, NavDialogGetWindow_FUNC);
+ return rc;
+}
+#endif
+
#ifndef NO_NavDialogRun
JNIEXPORT jint JNICALL OS_NATIVE(NavDialogRun)
(JNIEnv *env, jclass that, jint arg0)
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/library/os_stats.c b/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/library/os_stats.c
index 00e8dbd63f..3bc62d6d91 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/library/os_stats.c
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/library/os_stats.c
@@ -14,8 +14,8 @@
#ifdef NATIVE_STATS
-int OS_nativeFunctionCount = 1012;
-int OS_nativeFunctionCallCount[1012];
+int OS_nativeFunctionCount = 1013;
+int OS_nativeFunctionCallCount[1013];
char * OS_nativeFunctionNames[] = {
"AECoerceDesc",
"AECountItems",
@@ -714,6 +714,7 @@ char * OS_nativeFunctionNames[] = {
"NavDialogGetReply",
"NavDialogGetSaveFileName",
"NavDialogGetUserAction",
+ "NavDialogGetWindow",
"NavDialogRun",
"NavDialogSetFilterTypeIdentifiers",
"NavDialogSetSaveFileName",
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/library/os_stats.h b/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/library/os_stats.h
index 9f84601740..8bc2379672 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/library/os_stats.h
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/library/os_stats.h
@@ -722,6 +722,7 @@ typedef enum {
NavDialogGetReply_FUNC,
NavDialogGetSaveFileName_FUNC,
NavDialogGetUserAction_FUNC,
+ NavDialogGetWindow_FUNC,
NavDialogRun_FUNC,
NavDialogSetFilterTypeIdentifiers_FUNC,
NavDialogSetSaveFileName_FUNC,
diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/org/eclipse/swt/internal/carbon/OS.java b/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/org/eclipse/swt/internal/carbon/OS.java
index 491a14e5a9..84c7722390 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/org/eclipse/swt/internal/carbon/OS.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT PI/carbon/org/eclipse/swt/internal/carbon/OS.java
@@ -4088,6 +4088,8 @@ public static final native void NavDialogDispose(int dialogHandle);
public static final native int NavDialogGetSaveFileName(int dialogHandle);
/** @param dialogHandle cast=(NavDialogRef) */
public static final native int NavDialogGetUserAction(int dialogHandle);
+/** @param dialog cast=(NavDialogRef) */
+public static final native int NavDialogGetWindow(int dialog);
/** @param dialogHandle cast=(NavDialogRef) */
public static final native int NavDialogRun(int dialogHandle);
/**
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/DirectoryDialog.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/DirectoryDialog.java
index 4a4b280708..6ffb960ee7 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/DirectoryDialog.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/DirectoryDialog.java
@@ -35,6 +35,7 @@ import org.eclipse.swt.*;
* @noextend This class is not intended to be subclassed by clients.
*/
public class DirectoryDialog extends Dialog {
+ int dialog;
String message = "", filterPath = "";
/**
@@ -163,9 +164,11 @@ public String open () {
}
}
Display display = parent != null ? parent.getDisplay() : Display.getCurrent();
+ dialog = outDialog[0];
display.setModalDialog(this);
OS.NavDialogRun (outDialog [0]);
display.setModalDialog(null);
+ dialog = 0;
if (OS.NavDialogGetUserAction (outDialog [0]) == OS.kNavUserActionChoose) {
NavReplyRecord record = new NavReplyRecord ();
OS.NavDialogGetReply (outDialog [0], record);
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/FileDialog.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/FileDialog.java
index 9dfd562f89..b3d4ee6461 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/FileDialog.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/FileDialog.java
@@ -37,6 +37,7 @@ import org.eclipse.swt.internal.carbon.*;
* @noextend This class is not intended to be subclassed by clients.
*/
public class FileDialog extends Dialog {
+ int dialog;
String [] filterNames = new String [0];
String [] filterExtensions = new String [0];
String [] fileNames = new String[0];
@@ -362,9 +363,11 @@ public String open () {
OS.NavCustomControl (outDialog [0], OS.kNavCtlSelectCustomType, spec);
}
Display display = parent != null ? parent.getDisplay() : Display.getCurrent();
+ dialog = outDialog[0];
display.setModalDialog(this);
OS.NavDialogRun (outDialog [0]);
display.setModalDialog(null);
+ dialog = 0;
int action = OS.NavDialogGetUserAction (outDialog [0]);
switch (action) {
case OS.kNavUserActionOpen:
diff --git a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Shell.java b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Shell.java
index 8d3b89ede7..14f4e98399 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Shell.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT/carbon/org/eclipse/swt/widgets/Shell.java
@@ -641,6 +641,7 @@ void deregister () {
}
void destroyWidget () {
+ setWindowModal (display.getModalDialog (), false, true);
int theWindow = shellHandle;
/*
* Bug in the Macintosh. Under certain circumstances, yet to
@@ -1914,6 +1915,42 @@ public void setVisible (boolean visible) {
setWindowVisible (visible);
}
+void setWindowModal (Dialog dialog, boolean modal, boolean destroy) {
+ if (dialog == null) return;
+ if ((style & (SWT.APPLICATION_MODAL | SWT.SYSTEM_MODAL | SWT.PRIMARY_MODAL)) == 0) return;
+ if (isDisposed()) return;
+ /*
+ * Bug in Carbon. For some reason, when a modal shell is opened while a file dialog is showing, neither
+ * window can be dismissed. The fix is to temporarily change the modality of the file dialog and put the
+ * modal shell in the same group of the file dialog.
+ */
+ int dialogHandle = 0;
+ if (dialog instanceof FileDialog) dialogHandle = ((FileDialog)dialog).dialog;
+ if (dialog instanceof DirectoryDialog) dialogHandle = ((DirectoryDialog)dialog).dialog;
+ if (dialogHandle == 0) return;
+ if (modal) {
+ OS.SetWindowModality (OS.NavDialogGetWindow (dialogHandle), OS.kWindowModalityNone, 0);
+ int windowClass = (style & SWT.TITLE) != 0 ? OS.kMovableModalWindowClass : OS.kModalWindowClass;
+ OS.SetWindowGroup (shellHandle, OS.GetWindowGroupOfClass (windowClass));
+ OS.SelectWindow (shellHandle);
+ } else {
+ if (!destroy) {
+ int parentGroup;
+ if ((style & SWT.ON_TOP) != 0) {
+ parentGroup = OS.GetWindowGroupOfClass (OS.kFloatingWindowClass);
+ } else {
+ if (parent != null) {
+ parentGroup = parent.getShell ().windowGroup;
+ } else {
+ parentGroup = OS.GetWindowGroupOfClass (OS.kDocumentWindowClass);
+ }
+ }
+ OS.SetWindowGroup (shellHandle, parentGroup);
+ }
+ OS.SetWindowModality (OS.NavDialogGetWindow (dialogHandle), OS.kWindowModalityAppModal, 0);
+ }
+}
+
void setWindowVisible (boolean visible) {
if (OS.IsWindowVisible (shellHandle) == visible) return;
if (visible) {
@@ -1933,6 +1970,7 @@ void setWindowVisible (boolean visible) {
OS.SetWindowModality (shellHandle, inModalKind, inUnavailableWindow);
if (inUnavailableWindow != 0) OS.CollapseWindow (inUnavailableWindow, false);
}
+ setWindowModal(display.getModalDialog(), true, false);
int topHandle = topHandle ();
OS.SetControlVisibility (topHandle, true, false);
int [] scope = new int [1];
@@ -1985,6 +2023,7 @@ void setWindowVisible (boolean visible) {
}
}
} else {
+ setWindowModal(display.getModalDialog(), false, false);
/*
* Bug in the Macintosh. Under certain circumstances, yet to
* be determined, calling HideWindow() and then DisposeWindow()