]> git.saurik.com Git - wxWidgets.git/commitdiff
fixed subtle SetDirectory bug re-introduced by latest changes (explained in comment...
authorVáclav Slavík <vslavik@fastmail.fm>
Sun, 28 Nov 2004 10:49:01 +0000 (10:49 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Sun, 28 Nov 2004 10:49:01 +0000 (10:49 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30806 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gtk/filedlg.h
include/wx/gtk1/filedlg.h
src/gtk/filedlg.cpp
src/gtk1/filedlg.cpp

index 31c9992dcec09a7a2bfd7f1b3399c913f8004b19..70e26820cf6356f2c9ff7714a4f79751b2ba55f3 100644 (file)
@@ -43,8 +43,11 @@ public:
     virtual void SetFilename(const wxString& name);
     virtual void SetWildcard(const wxString& wildCard);
     virtual void SetFilterIndex(int filterIndex);
-            void UpdateFromDialog();
+
+    void UpdateFromDialog();
 private:
+    void UpdateDialog();
+    
     DECLARE_DYNAMIC_CLASS(wxFileDialog)
 };
 
index 31c9992dcec09a7a2bfd7f1b3399c913f8004b19..70e26820cf6356f2c9ff7714a4f79751b2ba55f3 100644 (file)
@@ -43,8 +43,11 @@ public:
     virtual void SetFilename(const wxString& name);
     virtual void SetWildcard(const wxString& wildCard);
     virtual void SetFilterIndex(int filterIndex);
-            void UpdateFromDialog();
+
+    void UpdateFromDialog();
 private:
+    void UpdateDialog();
+    
     DECLARE_DYNAMIC_CLASS(wxFileDialog)
 };
 
index f7eb5eeffbf7795df9230bbaa4a3ab452d5763ae..6234348501f40c3bde166d27efa0f4a03b99b6a8 100644 (file)
@@ -239,21 +239,7 @@ void wxFileDialog::SetPath(const wxString& path)
     m_path = fn.GetFullPath();
     m_dir = fn.GetPath();
     m_fileName = fn.GetFullName();
-    
-    gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(m_widget),
-                                            wxGTK_CONV(m_dir));
-                                            
-    gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget),
-                                      wxGTK_CONV(m_path));
-                                      
-    // pre-fill the filename when saving, too (there's no text entry
-    // control when opening a file, so it doesn't make sense to
-    // do this in when opening files):
-    if (GetWindowStyle() & wxSAVE)
-    {
-        gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(m_widget),
-                                              wxGTK_CONV(m_fileName));
-    }
+    UpdateDialog();
 }
 
 void wxFileDialog::SetDirectory(const wxString& dir)
@@ -261,29 +247,56 @@ void wxFileDialog::SetDirectory(const wxString& dir)
     if (wxDirExists(dir))
     {
         m_dir = dir;
-        gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(m_widget),
-                                            wxGTK_CONV(m_dir));
-        wxFileName fn(m_dir,m_fileName);
-        m_path = fn.GetFullPath();
+        m_path = wxFileName(m_dir, m_fileName).GetFullPath();
+        UpdateDialog();
     }
 }
 
 void wxFileDialog::SetFilename(const wxString& name)
 {
     m_fileName = name;
-    wxFileName fn(m_dir,m_fileName);
-    m_path = fn.GetFullPath();
-    
-    gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget),
-                                      wxGTK_CONV(m_path));
+    m_path = wxFileName(m_dir, m_fileName).GetFullPath();
+    UpdateDialog();
+}
 
-    // pre-fill the filename when saving, too (there's no text entry
-    // control when opening a file, so it doesn't make sense to
-    // do this in when opening files):
-    if (GetWindowStyle() & wxSAVE)
+void wxFileDialog::UpdateDialog()
+{
+    // set currently selected directory to match the path:
+    if (!m_dir.empty() && wxDirExists(m_dir))
     {
-        gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(m_widget),
+        // NB: This is important -- if we set directory only and not the path,
+        //     then dialog will still remember old path set using previous
+        //     call to gtk_chooser_set_filename. If the previous directory
+        //     was a subdirectory of the directory we want to select now,
+        //     the dialog would still contain directory selector controls
+        //     for the subdirectory (with the parent directory selected),
+        //     instead of showing only the parent directory as expected.
+        //     This way, we force GtkFileChooser to really change the
+        //     directory. Finally, it doesn't have to be done if filename
+        //     is not empty because of the code that sets the filename below.
+        if (m_fileName.empty())
+            gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget),
+                                          wxGTK_CONV(m_dir));
+        
+        gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(m_widget),
+                                            wxGTK_CONV(m_dir));
+    }
+    
+    // if the user set only the directory (e.g. by calling SetDirectory)
+    // and not the default filename, then we don't want to set the filename:
+    if (!m_fileName.empty())
+    {
+        gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget),
+                                      wxGTK_CONV(m_path));
+                                          
+        // pre-fill the filename when saving, too (there's no text entry
+        // control when opening a file, so it doesn't make sense to
+        // do this when opening files):
+        if (GetWindowStyle() & wxSAVE)
+        {
+            gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(m_widget),
                                               wxGTK_CONV(m_fileName));
+        }
     }
 }
 
index f7eb5eeffbf7795df9230bbaa4a3ab452d5763ae..6234348501f40c3bde166d27efa0f4a03b99b6a8 100644 (file)
@@ -239,21 +239,7 @@ void wxFileDialog::SetPath(const wxString& path)
     m_path = fn.GetFullPath();
     m_dir = fn.GetPath();
     m_fileName = fn.GetFullName();
-    
-    gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(m_widget),
-                                            wxGTK_CONV(m_dir));
-                                            
-    gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget),
-                                      wxGTK_CONV(m_path));
-                                      
-    // pre-fill the filename when saving, too (there's no text entry
-    // control when opening a file, so it doesn't make sense to
-    // do this in when opening files):
-    if (GetWindowStyle() & wxSAVE)
-    {
-        gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(m_widget),
-                                              wxGTK_CONV(m_fileName));
-    }
+    UpdateDialog();
 }
 
 void wxFileDialog::SetDirectory(const wxString& dir)
@@ -261,29 +247,56 @@ void wxFileDialog::SetDirectory(const wxString& dir)
     if (wxDirExists(dir))
     {
         m_dir = dir;
-        gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(m_widget),
-                                            wxGTK_CONV(m_dir));
-        wxFileName fn(m_dir,m_fileName);
-        m_path = fn.GetFullPath();
+        m_path = wxFileName(m_dir, m_fileName).GetFullPath();
+        UpdateDialog();
     }
 }
 
 void wxFileDialog::SetFilename(const wxString& name)
 {
     m_fileName = name;
-    wxFileName fn(m_dir,m_fileName);
-    m_path = fn.GetFullPath();
-    
-    gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget),
-                                      wxGTK_CONV(m_path));
+    m_path = wxFileName(m_dir, m_fileName).GetFullPath();
+    UpdateDialog();
+}
 
-    // pre-fill the filename when saving, too (there's no text entry
-    // control when opening a file, so it doesn't make sense to
-    // do this in when opening files):
-    if (GetWindowStyle() & wxSAVE)
+void wxFileDialog::UpdateDialog()
+{
+    // set currently selected directory to match the path:
+    if (!m_dir.empty() && wxDirExists(m_dir))
     {
-        gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(m_widget),
+        // NB: This is important -- if we set directory only and not the path,
+        //     then dialog will still remember old path set using previous
+        //     call to gtk_chooser_set_filename. If the previous directory
+        //     was a subdirectory of the directory we want to select now,
+        //     the dialog would still contain directory selector controls
+        //     for the subdirectory (with the parent directory selected),
+        //     instead of showing only the parent directory as expected.
+        //     This way, we force GtkFileChooser to really change the
+        //     directory. Finally, it doesn't have to be done if filename
+        //     is not empty because of the code that sets the filename below.
+        if (m_fileName.empty())
+            gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget),
+                                          wxGTK_CONV(m_dir));
+        
+        gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(m_widget),
+                                            wxGTK_CONV(m_dir));
+    }
+    
+    // if the user set only the directory (e.g. by calling SetDirectory)
+    // and not the default filename, then we don't want to set the filename:
+    if (!m_fileName.empty())
+    {
+        gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(m_widget),
+                                      wxGTK_CONV(m_path));
+                                          
+        // pre-fill the filename when saving, too (there's no text entry
+        // control when opening a file, so it doesn't make sense to
+        // do this when opening files):
+        if (GetWindowStyle() & wxSAVE)
+        {
+            gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(m_widget),
                                               wxGTK_CONV(m_fileName));
+        }
     }
 }