Merge
authorlana
Thu, 02 Jun 2011 13:36:29 -0700
changeset 9767 5d1929da3a7e
parent 9762 9bf4761e857c (current diff)
parent 9766 bf57566e576d (diff)
child 9770 f1a229ed5910
Merge
--- a/jdk/src/share/classes/java/awt/Toolkit.java	Thu Jun 02 13:35:47 2011 -0700
+++ b/jdk/src/share/classes/java/awt/Toolkit.java	Thu Jun 02 13:36:29 2011 -0700
@@ -1857,7 +1857,7 @@
 
     /**
      * Adds the specified property change listener for the named desktop
-     * property. When a {@link PropertyChangeListenerProxy} object is added,
+     * property. When a {@link java.beans.PropertyChangeListenerProxy} object is added,
      * its property name is ignored, and the wrapped listener is added.
      * If {@code name} is {@code null} or {@code pcl} is {@code null},
      * no exception is thrown and no action is performed.
@@ -1874,7 +1874,7 @@
 
     /**
      * Removes the specified property change listener for the named
-     * desktop property. When a {@link PropertyChangeListenerProxy} object
+     * desktop property. When a {@link java.beans.PropertyChangeListenerProxy} object
      * is removed, its property name is ignored, and
      * the wrapped listener is removed.
      * If {@code name} is {@code null} or {@code pcl} is {@code null},
@@ -1893,11 +1893,11 @@
     /**
      * Returns an array of all the property change listeners
      * registered on this toolkit. The returned array
-     * contains {@code PropertyChangeListenerProxy} objects
+     * contains {@link java.beans.PropertyChangeListenerProxy} objects
      * that associate listeners with the names of desktop properties.
      *
-     * @return all of this toolkit's {@ code PropertyChangeListener}
-     *         objects wrapped in {@code PropertyChangeListenerProxy} objects
+     * @return all of this toolkit's {@link PropertyChangeListener}
+     *         objects wrapped in {@code java.beans.PropertyChangeListenerProxy} objects
      *         or an empty array  if no listeners are added
      *
      * @see PropertyChangeSupport#getPropertyChangeListeners()
--- a/jdk/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java	Thu Jun 02 13:35:47 2011 -0700
+++ b/jdk/src/solaris/classes/sun/awt/X11/GtkFileDialogPeer.java	Thu Jun 02 13:36:29 2011 -0700
@@ -29,8 +29,6 @@
 import java.awt.peer.FileDialogPeer;
 import java.io.File;
 import java.io.FilenameFilter;
-import javax.swing.SwingUtilities;
-import javax.swing.SwingWorker;
 import sun.awt.AWTAccessor;
 
 /**
@@ -107,9 +105,7 @@
             if (b) {
                 Thread t = new Thread() {
                     public void run() {
-                        GtkFileDialogPeer.this.run(fd.getTitle(), fd.getMode(),
-                                   fd.getDirectory(), fd.getFile(), fd.getFilenameFilter(), fd.isMultipleMode(),
-                                   fd.getX(), fd.getY());
+                        showNativeDialog();
                         fd.setVisible(false);
                     }
                 };
@@ -146,4 +142,30 @@
         // We do not implement this method because we
         // have delegated to FileDialog#setFilenameFilter
     }
+
+    private void showNativeDialog() {
+        String dirname = fd.getDirectory();
+        // File path has a priority against directory path.
+        String filename = fd.getFile();
+        if (filename != null) {
+            final File file = new File(filename);
+            if (fd.getMode() == FileDialog.LOAD
+                && dirname != null
+                && file.getParent() == null) {
+                // File path for gtk_file_chooser_set_filename.
+                filename = dirname + (dirname.endsWith(File.separator) ? "" :
+                                              File.separator) + filename;
+            }
+            if (fd.getMode() == FileDialog.SAVE && file.getParent() != null) {
+                // Filename for gtk_file_chooser_set_current_name.
+                filename = file.getName();
+                // Directory path for gtk_file_chooser_set_current_folder.
+                dirname = file.getParent();
+            }
+        }
+        GtkFileDialogPeer.this.run(fd.getTitle(), fd.getMode(), dirname,
+                                   filename, fd.getFilenameFilter(),
+                                   fd.isMultipleMode(), fd.getX(), fd.getY());
+    }
+
 }
--- a/jdk/src/windows/native/sun/windows/awt_Component.cpp	Thu Jun 02 13:35:47 2011 -0700
+++ b/jdk/src/windows/native/sun/windows/awt_Component.cpp	Thu Jun 02 13:36:29 2011 -0700
@@ -3715,7 +3715,10 @@
             SetCandidateWindow(iCandType, x-rc.left, y-rc.top);
     }
     if (m_bitsCandType != 0) {
-        ::DefWindowProc(GetHWnd(), WM_IME_NOTIFY, IMN_OPENCANDIDATE, m_bitsCandType);
+        HWND proxy = GetProxyFocusOwner();
+        // REMIND: is there any chance GetProxyFocusOwner() returns NULL here?
+        ::DefWindowProc((proxy != NULL) ? proxy : GetHWnd(),
+                        WM_IME_NOTIFY, IMN_OPENCANDIDATE, m_bitsCandType);
     }
 }
 
--- a/jdk/src/windows/native/sun/windows/awt_Object.cpp	Thu Jun 02 13:35:47 2011 -0700
+++ b/jdk/src/windows/native/sun/windows/awt_Object.cpp	Thu Jun 02 13:36:29 2011 -0700
@@ -69,9 +69,12 @@
 
     CriticalSection::Lock l(AwtToolkit::GetInstance().GetSyncCS());
 
+    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
+    jobject selfGlobalRef = env->NewGlobalRef(self);
+
     // value 0 of lParam means that we should not attempt to enter the
     // SyncCall critical section, as it was entered someshere earlier
-    AwtToolkit::GetInstance().SendMessage(WM_AWT_DISPOSE, (WPARAM)self, (LPARAM)0);
+    AwtToolkit::GetInstance().SendMessage(WM_AWT_DISPOSE, (WPARAM)selfGlobalRef, (LPARAM)0);
 
     CATCH_BAD_ALLOC;
 }
--- a/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp	Thu Jun 02 13:35:47 2011 -0700
+++ b/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp	Thu Jun 02 13:36:29 2011 -0700
@@ -741,7 +741,9 @@
           }
           if (canDispose) {
               if(wParam != NULL) {
-                  AwtObject *o = (AwtObject *) JNI_GET_PDATA((jobject)wParam);
+                  jobject self = (jobject)wParam;
+                  AwtObject *o = (AwtObject *) JNI_GET_PDATA(self);
+                  env->DeleteGlobalRef(self);
                   if(o != NULL && theAwtObjectList.Remove(o)) {
                       o->Dispose();
                   }