]> git.saurik.com Git - wxWidgets.git/commitdiff
Add wxFileDialog::GetCurrentlySelectedFilename().
authorVadim Zeitlin <vadim@wxwidgets.org>
Fri, 31 May 2013 23:21:27 +0000 (23:21 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Fri, 31 May 2013 23:21:27 +0000 (23:21 +0000)
Also send wxEVT_UPDATE_UI events for the extra controls in wxFileDialog.

The combination of these changes allows extra controls to update their state
depending on the current selection in the dialog. Show a simple example of
doing it in the dialogs sample.

Closes #15235.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74071 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/changes.txt
include/wx/filedlg.h
include/wx/gtk/filedlg.h
include/wx/msw/filedlg.h
interface/wx/filedlg.h
samples/dialogs/dialogs.cpp
src/gtk/filedlg.cpp
src/msw/filedlg.cpp

index 448a54c66c85f3612aa7ac95dc295095e4ad222a..3093cd06b1ebf71bc8b4c8e0d7ef2ab67ae6c4ed 100644 (file)
@@ -669,6 +669,7 @@ All (GUI):
 - Pass menu events to the handler in the associated wxMenuBar.
 - Add wxWindow::BeginRepositioningChildren() and EndRepositioningChildren().
 - Fix wxStyledTextCtrl::SetInsertionPointEnd() (troelsk).
+- Add wxFileDialog::GetCurrentlySelectedFilename() (Carl Godkin).
 
 wxGTK:
 
index e2a6bfd3da74632eaad6d8f183cd87feb5aa5536..01a33015d679ca1b1e93b54bbb63b4c58b2f5e30 100644 (file)
@@ -122,6 +122,9 @@ public:
     virtual wxString GetWildcard() const { return m_wildCard; }
     virtual int GetFilterIndex() const { return m_filterIndex; }
 
+    virtual wxString GetCurrentlySelectedFilename() const
+        { return m_currentlySelectedFilename; }
+
     // this function is called with wxFileDialog as parameter and should
     // create the window containing the extra controls we want to show in it
     typedef wxWindow *(*ExtraControlCreatorFunction)(wxWindow*);
@@ -155,6 +158,13 @@ protected:
     wxString      m_fileName;
     wxString      m_wildCard;
     int           m_filterIndex;
+
+    // Currently selected, but not yet necessarily accepted by the user, file.
+    // This should be updated whenever the selection in the control changes by
+    // the platform-specific code to provide a useful implementation of
+    // GetCurrentlySelectedFilename().
+    wxString      m_currentlySelectedFilename;
+
     wxWindow*     m_extraControl;
 
     // returns true if control is created (if it already exists returns false)
index f22b83669241658b1db38c0538f474c3cd0c4e2f..ececadcf0b249f530810ef2b54b1f2ba258c7b61 100644 (file)
@@ -58,6 +58,9 @@ public:
 
     virtual bool SupportsExtraControl() const { return true; }
 
+    // Implementation only.
+    void GTKSelectionChanged(const wxString& filename);
+
 
 protected:
     // override this from wxTLW since the native
index 4c4ec7499345d1bbcefa239ba2aa6d9f9f2ca0a3..889674199c2acebfa4e56bac4f7e089bd64be24e 100644 (file)
@@ -44,6 +44,9 @@ public:
     // called from the hook procedure on CDN_INITDONE reception
     virtual void MSWOnInitDone(WXHWND hDlg);
 
+    // called from the hook procedure on CDN_SELCHANGE.
+    void MSWOnSelChange(WXHWND hDlg);
+
 protected:
 
 #if !(defined(__SMARTPHONE__) && defined(__WXWINCE__))
index 83648a7fa659a3376fec05d51e9a37a95aeaa295..ac7daba24ac73ad1c778158d9c6c7b2ecc7fb7ac 100644 (file)
@@ -183,6 +183,26 @@ public:
     */
     virtual ~wxFileDialog();
 
+    /**
+        Returns the path of the file currently selected in dialog.
+
+        Notice that this file is not necessarily going to be accepted by the
+        user, so calling this function mostly makes sense from an update UI
+        event handler of a custom file dialog extra control to update its state
+        depending on the currently selected file.
+
+        Currently this function is fully implemented under GTK and MSW and
+        always returns an empty string elsewhere.
+
+        @since 2.9.5
+
+        @return The path of the currently selected file or an empty string if
+            nothing is selected.
+
+        @see SetExtraControlCreator()
+    */
+    virtual wxString GetCurrentlySelectedFilename() const;
+
     /**
         Returns the default directory.
     */
index 11a4bc4388bb1c2b686a0249c59a4902bf2ec5fa..028d755f8972680924b0699e009638a81602e73b 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "wx/apptrait.h"
 #include "wx/datetime.h"
+#include "wx/filename.h"
 #include "wx/image.h"
 #include "wx/bookctrl.h"
 #include "wx/artprov.h"
@@ -1332,14 +1333,34 @@ class MyExtraPanel : public wxPanel
 {
 public:
     MyExtraPanel(wxWindow *parent);
-    void OnCheckBox(wxCommandEvent& event) { m_btn->Enable(event.IsChecked()); }
     wxString GetInfo() const
     {
         return wxString::Format("checkbox value = %d", (int) m_cb->GetValue());
     }
+
 private:
+    void OnCheckBox(wxCommandEvent& event) { m_btn->Enable(event.IsChecked()); }
+    void OnUpdateLabelUI(wxUpdateUIEvent& event)
+    {
+        wxFileDialog* const dialog = wxStaticCast(GetParent(), wxFileDialog);
+        const wxString fn = dialog->GetCurrentlySelectedFilename();
+
+        wxString msg;
+        if ( fn.empty() )
+            msg = "Nothing";
+        else if ( wxFileName::FileExists(fn) )
+            msg = "File";
+        else if ( wxFileName::DirExists(fn) )
+            msg = "Directory";
+        else
+            msg = "Something else";
+
+        event.SetText(msg + " selected");
+    }
+
     wxButton *m_btn;
     wxCheckBox *m_cb;
+    wxStaticText *m_label;
 };
 
 MyExtraPanel::MyExtraPanel(wxWindow *parent)
@@ -1348,12 +1369,20 @@ MyExtraPanel::MyExtraPanel(wxWindow *parent)
     m_btn = new wxButton(this, -1, wxT("Custom Button"));
     m_btn->Enable(false);
     m_cb = new wxCheckBox(this, -1, wxT("Enable Custom Button"));
-    m_cb->Connect(wxID_ANY, wxEVT_CHECKBOX,
+    m_cb->Connect(wxEVT_CHECKBOX,
                   wxCommandEventHandler(MyExtraPanel::OnCheckBox), NULL, this);
+    m_label = new wxStaticText(this, wxID_ANY, "Nothing selected");
+    m_label->Connect(wxEVT_UPDATE_UI,
+                     wxUpdateUIEventHandler(MyExtraPanel::OnUpdateLabelUI),
+                     NULL, this);
+
     wxBoxSizer *sizerTop = new wxBoxSizer(wxHORIZONTAL);
     sizerTop->Add(m_cb, wxSizerFlags().Centre().Border());
     sizerTop->AddStretchSpacer();
-    sizerTop->Add(m_btn, wxSizerFlags().Right().Border());
+    sizerTop->Add(m_btn, wxSizerFlags().Centre().Border());
+    sizerTop->AddStretchSpacer();
+    sizerTop->Add(m_label, wxSizerFlags().Centre().Border());
+
     SetSizerAndFit(sizerTop);
 }
 
index a2f071285489385cfc39fbb7f29fd6e2fd59f46d..6f3b775ada9bf10007833f47d5bde4277197fc5e 100644 (file)
@@ -116,6 +116,15 @@ static void gtk_filedialog_response_callback(GtkWidget *w,
         gtk_filedialog_cancel_callback(w, dialog);
 }
 
+static void gtk_filedialog_selchanged_callback(GtkFileChooser *chooser,
+                                               wxFileDialog *dialog)
+{
+    wxGtkString filename(gtk_file_chooser_get_preview_filename(chooser));
+
+    dialog->GTKSelectionChanged(wxString::FromUTF8(filename));
+}
+
+
 static void gtk_filedialog_update_preview_callback(GtkFileChooser *chooser,
                                                    gpointer user_data)
 {
@@ -249,6 +258,8 @@ bool wxFileDialog::Create(wxWindow *parent, const wxString& message,
     g_signal_connect (m_widget, "response",
         G_CALLBACK (gtk_filedialog_response_callback), this);
 
+    g_signal_connect (m_widget, "selection-changed",
+        G_CALLBACK (gtk_filedialog_selchanged_callback), this);
 
     // deal with extensions/filters
     SetWildcard(wildCard);
@@ -463,4 +474,12 @@ int wxFileDialog::GetFilterIndex() const
     return m_fc.GetFilterIndex();
 }
 
+void wxFileDialog::GTKSelectionChanged(const wxString& filename)
+{
+    m_currentlySelectedFilename = filename;
+
+    if (m_extraControl)
+        m_extraControl->UpdateWindowUI(wxUPDATE_UI_RECURSE);
+}
+
 #endif // wxUSE_FILEDLG
index e1f5287021a7872ad554ca22bcb637c9088e40ab..fd71dc6b9c81a3d1088f2a2dcee775801b28ed62 100644 (file)
@@ -173,13 +173,23 @@ wxFileDialogHookFunction(HWND      hDlg,
 
         case WM_NOTIFY:
             {
-                OFNOTIFY *pNotifyCode = reinterpret_cast<OFNOTIFY *>(lParam);
-                if ( pNotifyCode->hdr.code == CDN_INITDONE )
+                OFNOTIFY* const
+                    pNotifyCode = reinterpret_cast<OFNOTIFY *>(lParam);
+                wxFileDialog* const
+                    dialog = reinterpret_cast<wxFileDialog *>(
+                                    pNotifyCode->lpOFN->lCustData
+                                );
+
+                switch ( pNotifyCode->hdr.code )
                 {
-                    reinterpret_cast<wxFileDialog *>(
-                                        pNotifyCode->lpOFN->lCustData)
-                        ->MSWOnInitDone((WXHWND)hDlg);
-                 }
+                    case CDN_INITDONE:
+                        dialog->MSWOnInitDone((WXHWND)hDlg);
+                        break;
+
+                    case CDN_SELCHANGE:
+                        dialog->MSWOnSelChange((WXHWND)hDlg);
+                        break;
+                }
             }
             break;
 
@@ -323,10 +333,29 @@ void wxFileDialog::MSWOnInitDone(WXHWND hDlg)
         SetPosition(gs_rectDialog.GetPosition());
     }
 
+    // Call selection change handler so that update handler will be
+    // called once with no selection.
+    MSWOnSelChange(hDlg);
+
     // we shouldn't destroy this HWND
     SetHWND(NULL);
 }
 
+void wxFileDialog::MSWOnSelChange(WXHWND hDlg)
+{
+    TCHAR buf[MAX_PATH];
+    LRESULT len = SendMessage(::GetParent(hDlg), CDM_GETFILEPATH,
+                              MAX_PATH, reinterpret_cast<LPARAM>(buf));
+
+    if ( len > 0 )
+        m_currentlySelectedFilename = buf;
+    else
+        m_currentlySelectedFilename.clear();
+
+    if ( m_extraControl )
+        m_extraControl->UpdateWindowUI(wxUPDATE_UI_RECURSE);
+}
+
 // helper used below in ShowCommFileDialog(): style is used to determine
 // whether to show the "Save file" dialog (if it contains wxFD_SAVE bit) or
 // "Open file" one; returns true on success or false on failure in which case