#include "wx/intl.h"
#include "wx/log.h"
#include "wx/msgdlg.h"
+ #include "wx/bmpbuttn.h"
#endif
#include "wx/statline.h"
#include "wx/dirctrl.h"
#include "wx/generic/dirdlgg.h"
#include "wx/artprov.h"
-#include "wx/bmpbuttn.h"
+#include "wx/menu.h"
// ----------------------------------------------------------------------------
// constants
static const int ID_SHOW_HIDDEN = 1005;
static const int ID_GO_HOME = 1006;
-// ---------------------------------------------------------------------------
-// macros
-// ---------------------------------------------------------------------------
-
-/* Macro for avoiding #ifdefs when value have to be different depending on size of
- device we display on - take it from something like wxDesktopPolicy in the future
- */
-
-#if defined(__SMARTPHONE__)
- #define wxLARGESMALL(large,small) small
-#else
- #define wxLARGESMALL(large,small) large
-#endif
-
//-----------------------------------------------------------------------------
// wxGenericDirDialog
//-----------------------------------------------------------------------------
wxGenericDirDialog::wxGenericDirDialog(wxWindow* parent, const wxString& title,
const wxString& defaultPath, long style,
const wxPoint& pos, const wxSize& sz,
- const wxString& name):
- wxDialog(parent, ID_DIRCTRL, title, pos, sz, style, name)
+ const wxString& name)
+{
+ Create(parent, title, defaultPath, style, pos, sz, name);
+}
+
+bool wxGenericDirDialog::Create(wxWindow* parent,
+ const wxString& title,
+ const wxString& defaultPath, long style,
+ const wxPoint& pos,
+ const wxSize& sz,
+ const wxString& name)
{
wxBusyCursor cursor;
+ parent = GetParentForModalDialog(parent);
+
+ if (!wxDirDialogBase::Create(parent, title, defaultPath, style, pos, sz, name))
+ return false;
+
m_path = defaultPath;
if (m_path == wxT("~"))
wxGetHomeDir(&m_path);
wxMenu *dirMenu = new wxMenu;
dirMenu->Append(ID_GO_HOME, _("Home"));
- if (style & wxDD_NEW_DIR_BUTTON)
+ if (!HasFlag(wxDD_DIR_MUST_EXIST))
{
dirMenu->Append(ID_NEW, _("New directory"));
}
// I'm not convinced we need a New button, and we tend to get annoying
// accidental-editing with label editing enabled.
- if (style & wxDD_NEW_DIR_BUTTON)
+ if (!HasFlag(wxDD_DIR_MUST_EXIST))
{
wxBitmapButton* newButton =
new wxBitmapButton(this, ID_NEW,
long dirStyle = wxDIRCTRL_DIR_ONLY | wxDEFAULT_CONTROL_BORDER;
#ifdef __WXMSW__
- if (style & wxDD_NEW_DIR_BUTTON)
+ if (!HasFlag(wxDD_DIR_MUST_EXIST))
{
// Only under Windows do we need the wxTR_EDIT_LABEL tree control style
// before we can call EditLabel (required for "New directory")
wxSize(300, 200),
dirStyle);
- topsizer->Add( m_dirCtrl, 1, wxTOP|wxLEFT|wxRIGHT | wxEXPAND, wxLARGESMALL(10,0) );
+ wxSizerFlags flagsBorder2;
+ flagsBorder2.DoubleBorder(wxTOP | wxLEFT | wxRIGHT);
+
+ topsizer->Add(m_dirCtrl, wxSizerFlags(flagsBorder2).Proportion(1).Expand());
#ifndef __SMARTPHONE__
// Make the an option depending on a flag?
- wxCheckBox* check = new wxCheckBox( this, ID_SHOW_HIDDEN, _("Show hidden directories") );
- topsizer->Add( check, 0, wxLEFT|wxRIGHT|wxTOP | wxALIGN_RIGHT, 10 );
+ wxCheckBox *
+ check = new wxCheckBox(this, ID_SHOW_HIDDEN, _("Show &hidden directories"));
+ topsizer->Add(check, wxSizerFlags(flagsBorder2).Right());
#endif // !__SMARTPHONE__
// 2) text ctrl
m_input = new wxTextCtrl( this, ID_TEXTCTRL, m_path, wxDefaultPosition );
- topsizer->Add( m_input, 0, wxTOP|wxLEFT|wxRIGHT | wxEXPAND, wxLARGESMALL(10,0) );
+ topsizer->Add(m_input, wxSizerFlags(flagsBorder2).Expand());
// 3) buttons if any
- wxSizer *buttonSizer = CreateButtonSizer( wxOK|wxCANCEL , true, wxLARGESMALL(10,0) );
- if(buttonSizer->GetChildren().GetCount() > 0 )
+ wxSizer *buttonSizer = CreateSeparatedButtonSizer(wxOK | wxCANCEL);
+ if ( buttonSizer )
{
- topsizer->Add( buttonSizer, 0, wxEXPAND | wxALL, wxLARGESMALL(10,0) );
- }
- else
- {
- topsizer->AddSpacer( wxLARGESMALL(10,0) );
- delete buttonSizer;
+ topsizer->Add(buttonSizer, wxSizerFlags().Expand().DoubleBorder());
}
#ifdef __SMARTPHONE__
- // overwrite menu achieved with earlier CreateButtonSizer() call
+ // overwrite menu set by CreateSeparatedButtonSizer() call above
SetRightMenu(wxID_ANY, _("Options"), dirMenu);
#endif
SetAutoLayout( true );
SetSizer( topsizer );
-#if !defined(__SMARTPHONE__) && !defined(__POCKETPC__)
topsizer->SetSizeHints( this );
topsizer->Fit( this );
Centre( wxBOTH );
-#endif
+
+ return true;
+}
+
+void wxGenericDirDialog::EndModal(int retCode)
+{
+ // before proceeding, change the current working directory if user asked so
+ if (retCode == wxID_OK && HasFlag(wxDD_CHANGE_DIR))
+ wxSetWorkingDirectory(m_path);
+
+ wxDialog::EndModal(retCode);
}
void wxGenericDirDialog::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
void wxGenericDirDialog::OnOK(wxCommandEvent& WXUNUSED(event))
{
m_path = m_input->GetValue();
+
// Does the path exist? (User may have typed anything in m_input)
- if (wxDirExists(m_path)) {
+ if (wxDirExists(m_path))
+ {
// OK, path exists, we're done.
EndModal(wxID_OK);
return;
}
+
// Interact with user, find out if the dir is a typo or to be created
wxString msg;
msg.Printf(_("The directory '%s' does not exist\nCreate it now?"),
wxMessageDialog dialog(this, msg, _("Directory does not exist"),
wxYES_NO | wxICON_WARNING);
- if ( dialog.ShowModal() == wxID_YES ) {
+ if ( dialog.ShowModal() == wxID_YES )
+ {
// Okay, let's make it
wxLogNull log;
- if (wxMkdir(m_path)) {
+ if (wxMkdir(m_path))
+ {
// The new dir was created okay.
EndModal(wxID_OK);
return;
}
- else {
+ else
+ {
// Trouble...
msg.Printf(_("Failed to create directory '%s'\n(Do you have the required permissions?)"),
m_path.c_str());