]>
git.saurik.com Git - wxWidgets.git/blob - src/generic/dirdlgg.cpp
f88a9d63ef1b1022c892d16427ac07e2e173faed
   1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxDirDialog 
   4 // Author:      Harm van der Heijden, Robert Roebling & Julian Smart 
   8 // Copyright:   (c) Harm van der Heijden, Robert Roebling, Julian Smart 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) 
  13 #pragma implementation "dirdlgg.h" 
  17 // For compilers that support precompilation, includes "wx.h". 
  18 #include "wx/wxprec.h" 
  29     #include "wx/textctrl.h" 
  30     #include "wx/button.h" 
  31     #include "wx/checkbox.h" 
  35     #include "wx/msgdlg.h" 
  38 #include "wx/statline.h" 
  39 #include "wx/dirctrl.h" 
  40 #include "wx/generic/dirdlgg.h" 
  41 #include "wx/artprov.h" 
  42 #include "wx/bmpbuttn.h" 
  44 // ---------------------------------------------------------------------------- 
  46 // ---------------------------------------------------------------------------- 
  48 static const int ID_DIRCTRL 
= 1000; 
  49 static const int ID_TEXTCTRL 
= 1001; 
  50 static const int ID_NEW 
= 1004; 
  51 static const int ID_SHOW_HIDDEN 
= 1005; 
  52 static const int ID_GO_HOME 
= 1006; 
  54 // --------------------------------------------------------------------------- 
  56 // --------------------------------------------------------------------------- 
  58 /* Macro for avoiding #ifdefs when value have to be different depending on size of 
  59    device we display on - take it from something like wxDesktopPolicy in the future 
  62 #if defined(__SMARTPHONE__) 
  63     #define wxLARGESMALL(large,small) small 
  65     #define wxLARGESMALL(large,small) large 
  68 //----------------------------------------------------------------------------- 
  70 //----------------------------------------------------------------------------- 
  72 IMPLEMENT_DYNAMIC_CLASS(wxGenericDirDialog
, wxDialog
) 
  74 BEGIN_EVENT_TABLE(wxGenericDirDialog
, wxDialog
) 
  75     EVT_CLOSE                (wxGenericDirDialog::OnCloseWindow
) 
  76     EVT_BUTTON               (wxID_OK
,        wxGenericDirDialog::OnOK
) 
  77     EVT_BUTTON               (ID_NEW
,         wxGenericDirDialog::OnNew
) 
  78     EVT_BUTTON               (ID_GO_HOME
,     wxGenericDirDialog::OnGoHome
) 
  79     EVT_TREE_KEY_DOWN        (wxID_ANY
,       wxGenericDirDialog::OnTreeKeyDown
) 
  80     EVT_TREE_SEL_CHANGED     (wxID_ANY
,       wxGenericDirDialog::OnTreeSelected
) 
  81     EVT_TEXT_ENTER           (ID_TEXTCTRL
,    wxGenericDirDialog::OnOK
) 
  82     EVT_CHECKBOX             (ID_SHOW_HIDDEN
, wxGenericDirDialog::OnShowHidden
) 
  85 wxGenericDirDialog::wxGenericDirDialog(wxWindow
* parent
, const wxString
& title
, 
  86                                        const wxString
& defaultPath
, long style
, 
  87                                        const wxPoint
& pos
, const wxSize
& sz
, 
  88                                        const wxString
& name
): 
  89                 wxDialog(parent
, ID_DIRCTRL
, title
, pos
, sz
, style
, name
) 
  94     if (m_path 
== wxT("~")) 
  95         wxGetHomeDir(&m_path
); 
  96     if (m_path 
== wxT(".")) 
  99     wxBoxSizer 
*topsizer 
= new wxBoxSizer( wxVERTICAL 
); 
 101     // smart phones does not support or do not waste space for wxButtons 
 102 #if defined(__SMARTPHONE__) 
 104     wxMenu 
*dirMenu 
= new wxMenu
; 
 105     dirMenu
->Append(ID_GO_HOME
, _("Home")); 
 107     if (style 
& wxDD_NEW_DIR_BUTTON
) 
 109         dirMenu
->Append(ID_NEW
, _("New directory")); 
 112     dirMenu
->AppendCheckItem(ID_SHOW_HIDDEN
, _("Show hidden directories")); 
 113     dirMenu
->AppendSeparator(); 
 114     dirMenu
->Append(wxID_CANCEL
, _("Cancel")); 
 116     SetRightMenu(wxID_ANY
, _("Options"), dirMenu
); 
 120     // 0) 'New' and 'Home' Buttons 
 121     wxSizer
* buttonsizer 
= new wxBoxSizer( wxHORIZONTAL 
); 
 123     // VS: 'Home directory' concept is unknown to MS-DOS 
 124 #if !defined(__DOS__) 
 125     wxBitmapButton
* homeButton 
= 
 126         new wxBitmapButton(this, ID_GO_HOME
, 
 127                            wxArtProvider::GetBitmap(wxART_GO_HOME
, wxART_BUTTON
)); 
 128     buttonsizer
->Add( homeButton
, 0, wxLEFT
|wxRIGHT
, 10 ); 
 131     // I'm not convinced we need a New button, and we tend to get annoying 
 132     // accidental-editing with label editing enabled. 
 133     if (style 
& wxDD_NEW_DIR_BUTTON
) 
 135         wxBitmapButton
* newButton 
= 
 136             new wxBitmapButton(this, ID_NEW
, 
 137                             wxArtProvider::GetBitmap(wxART_NEW_DIR
, wxART_BUTTON
)); 
 138         buttonsizer
->Add( newButton
, 0, wxRIGHT
, 10 ); 
 140         newButton
->SetToolTip(_("Create new directory")); 
 145     homeButton
->SetToolTip(_("Go to home directory")); 
 148     topsizer
->Add( buttonsizer
, 0, wxTOP 
| wxALIGN_RIGHT
, 10 ); 
 150 #endif // __SMARTPHONE__/!__SMARTPHONE__ 
 153     m_dirCtrl 
= NULL
; // this is necessary, event handler called from 
 154                       // wxGenericDirCtrl would crash otherwise! 
 155     long dirStyle 
= wxDIRCTRL_DIR_ONLY 
| wxDEFAULT_CONTROL_BORDER
; 
 158     if (style 
& wxDD_NEW_DIR_BUTTON
) 
 160         // Only under Windows do we need the wxTR_EDIT_LABEL tree control style 
 161         // before we can call EditLabel (required for "New directory") 
 162         dirStyle 
|= wxDIRCTRL_EDIT_LABELS
; 
 166     m_dirCtrl 
= new wxGenericDirCtrl(this, ID_DIRCTRL
, 
 167                                      m_path
, wxDefaultPosition
, 
 171     topsizer
->Add( m_dirCtrl
, 1, wxTOP
|wxLEFT
|wxRIGHT 
| wxEXPAND
, wxLARGESMALL(10,0) ); 
 173 #ifndef __SMARTPHONE__ 
 174     // Make the an option depending on a flag? 
 175     wxCheckBox
* check 
= new wxCheckBox( this, ID_SHOW_HIDDEN
, _("Show hidden directories") ); 
 176     topsizer
->Add( check
, 0, wxLEFT
|wxRIGHT
|wxTOP 
| wxALIGN_RIGHT
, 10 ); 
 177 #endif // !__SMARTPHONE__ 
 180     m_input 
= new wxTextCtrl( this, ID_TEXTCTRL
, m_path
, wxDefaultPosition 
); 
 181     topsizer
->Add( m_input
, 0, wxTOP
|wxLEFT
|wxRIGHT 
| wxEXPAND
, wxLARGESMALL(10,0) ); 
 183 #ifndef __SMARTPHONE__ 
 187     topsizer
->Add( new wxStaticLine( this, wxID_ANY 
), 0, wxEXPAND 
| wxLEFT
|wxRIGHT
|wxTOP
, 10 ); 
 191     topsizer
->Add( CreateButtonSizer( wxOK
|wxCANCEL 
), 0, wxEXPAND 
| wxALL
, 10 ); 
 193 #endif // !__SMARTPHONE__ 
 197     SetAutoLayout( true ); 
 198     SetSizer( topsizer 
); 
 200 #if !defined(__SMARTPHONE__) && !defined(__POCKETPC__) 
 201     topsizer
->SetSizeHints( this ); 
 202     topsizer
->Fit( this ); 
 208 void wxGenericDirDialog::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
)) 
 210     EndModal(wxID_CANCEL
); 
 213 void wxGenericDirDialog::OnOK(wxCommandEvent
& WXUNUSED(event
)) 
 215     m_path 
= m_input
->GetValue(); 
 216     // Does the path exist? (User may have typed anything in m_input) 
 217     if (wxDirExists(m_path
)) { 
 218         // OK, path exists, we're done. 
 222     // Interact with user, find out if the dir is a typo or to be created 
 224     msg
.Printf(_("The directory '%s' does not exist\nCreate it now?"), 
 226     wxMessageDialog 
dialog(this, msg
, _("Directory does not exist"), 
 227                            wxYES_NO 
| wxICON_WARNING
); 
 229     if ( dialog
.ShowModal() == wxID_YES 
) { 
 230         // Okay, let's make it 
 232         if (wxMkdir(m_path
)) { 
 233             // The new dir was created okay. 
 239             msg
.Printf(_("Failed to create directory '%s'\n(Do you have the required permissions?)"), 
 241             wxMessageDialog 
errmsg(this, msg
, _("Error creating directory"), wxOK 
| wxICON_ERROR
); 
 243             // We still don't have a valid dir. Back to the main dialog. 
 246     // User has answered NO to create dir. 
 249 void wxGenericDirDialog::SetPath(const wxString
& path
) 
 251     m_dirCtrl
->SetPath(path
); 
 255 wxString 
wxGenericDirDialog::GetPath(void) const 
 260 int wxGenericDirDialog::ShowModal() 
 262     m_input
->SetValue( m_path 
); 
 263     return wxDialog::ShowModal(); 
 266 void wxGenericDirDialog::OnTreeSelected( wxTreeEvent 
&event 
) 
 271     wxTreeItemId item 
= event
.GetItem(); 
 273     wxDirItemData 
*data 
= NULL
; 
 276         data 
= (wxDirItemData
*)m_dirCtrl
->GetTreeCtrl()->GetItemData(item
); 
 279        m_input
->SetValue( data
->m_path 
); 
 282 void wxGenericDirDialog::OnTreeKeyDown( wxTreeEvent 
&WXUNUSED(event
) ) 
 287     wxDirItemData 
*data 
= (wxDirItemData
*)m_dirCtrl
->GetTreeCtrl()->GetItemData(m_dirCtrl
->GetTreeCtrl()->GetSelection()); 
 289         m_input
->SetValue( data
->m_path 
); 
 292 void wxGenericDirDialog::OnShowHidden( wxCommandEvent
& event 
) 
 297     m_dirCtrl
->ShowHidden( event
.GetInt() != 0 ); 
 300 void wxGenericDirDialog::OnNew( wxCommandEvent
& WXUNUSED(event
) ) 
 302     wxTreeItemId id 
= m_dirCtrl
->GetTreeCtrl()->GetSelection(); 
 303     if ((id 
== m_dirCtrl
->GetTreeCtrl()->GetRootItem()) || 
 304         (m_dirCtrl
->GetTreeCtrl()->GetItemParent(id
) == m_dirCtrl
->GetTreeCtrl()->GetRootItem())) 
 306         wxMessageDialog 
msg(this, _("You cannot add a new directory to this section."), 
 307                             _("Create directory"), wxOK 
| wxICON_INFORMATION 
); 
 312     wxTreeItemId parent 
= id 
; // m_dirCtrl->GetTreeCtrl()->GetItemParent( id ); 
 313     wxDirItemData 
*data 
= (wxDirItemData
*)m_dirCtrl
->GetTreeCtrl()->GetItemData( parent 
); 
 316     wxString 
new_name( _("NewName") ); 
 317     wxString 
path( data
->m_path 
); 
 318     if (!wxEndsWithPathSeparator(path
)) 
 319         path 
+= wxFILE_SEP_PATH
; 
 321     if (wxDirExists(path
)) 
 323         // try NewName0, NewName1 etc. 
 326             new_name 
= _("NewName"); 
 328             num
.Printf( wxT("%d"), i 
); 
 332             if (!wxEndsWithPathSeparator(path
)) 
 333                 path 
+= wxFILE_SEP_PATH
; 
 336         } while (wxDirExists(path
)); 
 342         wxMessageDialog 
dialog(this, _("Operation not permitted."), _("Error"), wxOK 
| wxICON_ERROR 
); 
 347     wxDirItemData 
*new_data 
= new wxDirItemData( path
, new_name
, true ); 
 349     // TODO: THIS CODE DOESN'T WORK YET. We need to avoid duplication of the first child 
 351     wxTreeItemId new_id 
= m_dirCtrl
->GetTreeCtrl()->AppendItem( parent
, new_name
, 0, 0, new_data 
); 
 352     m_dirCtrl
->GetTreeCtrl()->EnsureVisible( new_id 
); 
 353     m_dirCtrl
->GetTreeCtrl()->EditLabel( new_id 
); 
 356 void wxGenericDirDialog::OnGoHome(wxCommandEvent
& WXUNUSED(event
)) 
 358     SetPath(wxGetUserHome()); 
 361 #endif // wxUSE_DIRDLG