void wxGenericFileDialog::OnOk( wxCommandEvent &WXUNUSED(event) ) { wxArrayString selectedFiles; m_filectrl->GetFilenames(selectedFiles); if (selectedFiles.Count() == 0) return; const wxString& path = selectedFiles[0]; if (selectedFiles.Count() == 1) { SetPath(path); } // check that the file [doesn't] exist if necessary if ( HasFdFlag(wxFD_SAVE) && HasFdFlag(wxFD_OVERWRITE_PROMPT) && wxFileExists(path) ) { if ( wxMessageBox ( wxString::Format ( _("File '%s' already exists, do you really want to overwrite it?"), path ), _("Confirm"), wxYES_NO ) != wxYES) return; } else if ( HasFdFlag(wxFD_OPEN) && HasFdFlag(wxFD_FILE_MUST_EXIST) && !wxFileExists(path) ) { wxMessageBox(_("Please choose an existing file."), _("Error"), wxOK | wxICON_ERROR ); return; } EndModal(wxID_OK); }
void wxFileDialog::SetFilename(const wxString& name) { if (!gtk_check_version(2,4,0)) { if (HasFdFlag(wxFD_SAVE)) gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(m_widget), wxGTK_CONV(name)); else SetPath(wxFileName(GetDirectory(), name).GetFullPath()); } else wxGenericFileDialog::SetFilename( name ); }
void wxFileDialog::SetFilename(const wxString& name) { if (HasFdFlag(wxFD_SAVE)) { gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(m_widget), wxGTK_CONV(name)); m_fileName = name; } else { wxString path( GetDirectory() ); if (path.empty()) { // SetPath() fires an assert if fed other than filepaths return; } SetPath(wxFileName(path, name).GetFullPath()); m_fileName = name; } }
bool wxGenericFileDialog::Create( wxWindow *parent, const wxString& message, const wxString& defaultDir, const wxString& defaultFile, const wxString& wildCard, long style, const wxPoint& pos, const wxSize& sz, const wxString& name, bool bypassGenericImpl ) { m_bypassGenericImpl = bypassGenericImpl; parent = GetParentForModalDialog(parent, style); if (!wxFileDialogBase::Create(parent, message, defaultDir, defaultFile, wildCard, style, pos, sz, name)) { return false; } if (m_bypassGenericImpl) return true; if (!wxDialog::Create( parent, wxID_ANY, message, pos, sz, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | style, name )) { return false; } #if wxUSE_CONFIG if (wxConfig::Get(false)) { wxConfig::Get()->Read(wxT("/wxWindows/wxFileDialog/ViewStyle"), &ms_lastViewStyle); wxConfig::Get()->Read(wxT("/wxWindows/wxFileDialog/ShowHidden"), &ms_lastShowHidden); } #endif if ((m_dir.empty()) || (m_dir == wxT("."))) { m_dir = wxGetCwd(); if (m_dir.empty()) m_dir = wxFILE_SEP_PATH; } const size_t len = m_dir.length(); if ((len > 1) && (wxEndsWithPathSeparator(m_dir))) m_dir.Remove( len-1, 1 ); m_filterExtension = wxEmptyString; // layout const bool is_pda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); wxBoxSizer *mainsizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer *buttonsizer = new wxBoxSizer( wxHORIZONTAL ); AddBitmapButton( ID_LIST_MODE, wxART_LIST_VIEW, _("View files as a list view"), buttonsizer ); AddBitmapButton( ID_REPORT_MODE, wxART_REPORT_VIEW, _("View files as a detailed view"), buttonsizer ); buttonsizer->Add( 30, 5, 1 ); m_upDirButton = AddBitmapButton( ID_UP_DIR, wxART_GO_DIR_UP, _("Go to parent directory"), buttonsizer ); #ifndef __DOS__ // VS: Home directory is meaningless in MS-DOS... AddBitmapButton( ID_HOME_DIR, wxART_GO_HOME, _("Go to home directory"), buttonsizer ); buttonsizer->Add( 20, 20 ); #endif //!__DOS__ m_newDirButton = AddBitmapButton( ID_NEW_DIR, wxART_NEW_DIR, _("Create new directory"), buttonsizer ); if (is_pda) mainsizer->Add( buttonsizer, wxSizerFlags().Expand() ); else mainsizer->Add( buttonsizer, wxSizerFlags().Expand() .Border( wxLEFT | wxRIGHT | wxTOP ) ); long style2 = 0; if ( HasFdFlag(wxFD_MULTIPLE) ) style2 |= wxFC_MULTIPLE; m_filectrl = new wxGenericFileCtrl( this, ID_FILE_CTRL, m_dir, defaultFile, wildCard, style2, wxDefaultPosition, wxSize(540,200) ); m_filectrl->ShowHidden( ms_lastShowHidden ); if (ms_lastViewStyle == wxLC_LIST) { m_filectrl->ChangeToListMode(); } else if (ms_lastViewStyle == wxLC_REPORT) { m_filectrl->ChangeToReportMode(); } mainsizer->Add(m_filectrl, wxSizerFlags(1).Expand().HorzBorder()); wxSizer *bsizer = CreateButtonSizer(wxOK | wxCANCEL); if ( bsizer ) { if (is_pda) mainsizer->Add(bsizer, wxSizerFlags().Expand().Border()); else mainsizer->Add(bsizer, wxSizerFlags().Expand().DoubleBorder()); } SetSizer( mainsizer ); if (!is_pda) { mainsizer->SetSizeHints( this ); Centre( wxBOTH ); } return true; }
int wxFileDialog::ShowModal() { HWND hWnd = 0; if (m_parent) hWnd = (HWND) m_parent->GetHWND(); if (!hWnd && wxTheApp->GetTopWindow()) hWnd = (HWND) wxTheApp->GetTopWindow()->GetHWND(); static wxChar fileNameBuffer [ wxMAXPATH ]; // the file-name wxChar titleBuffer [ wxMAXFILE+1+wxMAXEXT ]; // the file-name, without path *fileNameBuffer = wxT('\0'); *titleBuffer = wxT('\0'); long msw_flags = OFN_HIDEREADONLY; if ( HasFdFlag(wxFD_FILE_MUST_EXIST) ) msw_flags |= OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; /* If the window has been moved the programmer is probably trying to center or position it. Thus we set the callback or hook function so that we can actually adjust the position. Without moving or centering the dlg, it will just stay in the upper left of the frame, it does not center automatically. */ if (m_bMovedWindow || HasExtraControlCreator()) // we need these flags. { msw_flags |= OFN_EXPLORER|OFN_ENABLEHOOK; #ifndef __WXWINCE__ msw_flags |= OFN_ENABLESIZING; #endif } if ( HasFdFlag(wxFD_MULTIPLE) ) { // OFN_EXPLORER must always be specified with OFN_ALLOWMULTISELECT msw_flags |= OFN_EXPLORER | OFN_ALLOWMULTISELECT; } // if wxFD_CHANGE_DIR flag is not given we shouldn't change the CWD which the // standard dialog does by default (notice that under NT it does it anyhow, // OFN_NOCHANGEDIR or not, see below) if ( !HasFdFlag(wxFD_CHANGE_DIR) ) { msw_flags |= OFN_NOCHANGEDIR; } if ( HasFdFlag(wxFD_OVERWRITE_PROMPT) ) { msw_flags |= OFN_OVERWRITEPROMPT; } wxOPENFILENAME of; wxZeroMemory(of); of.lStructSize = gs_ofStructSize; of.hwndOwner = hWnd; of.lpstrTitle = m_message.wx_str(); of.lpstrFileTitle = titleBuffer; of.nMaxFileTitle = wxMAXFILE + 1 + wxMAXEXT; #ifndef __WXWINCE__ GlobalPtr hgbl; if ( HasExtraControlCreator() ) { msw_flags |= OFN_ENABLETEMPLATEHANDLE; hgbl.Init(256, GMEM_ZEROINIT); GlobalPtrLock hgblLock(hgbl); LPDLGTEMPLATE lpdt = static_cast<LPDLGTEMPLATE>(hgblLock.Get()); // Define a dialog box. lpdt->style = DS_CONTROL | WS_CHILD | WS_CLIPSIBLINGS; lpdt->cdit = 0; // Number of controls lpdt->x = 0; lpdt->y = 0; // convert the size of the extra controls to the dialog units const wxSize extraSize = GetExtraControlSize(); const LONG baseUnits = ::GetDialogBaseUnits(); lpdt->cx = ::MulDiv(extraSize.x, 4, LOWORD(baseUnits)); lpdt->cy = ::MulDiv(extraSize.y, 8, HIWORD(baseUnits)); // after the DLGTEMPLATE there are 3 additional WORDs for dialog menu, // class and title, all three set to zeros. of.hInstance = (HINSTANCE)lpdt; } #endif // __WXWINCE__ // Convert forward slashes to backslashes (file selector doesn't like // forward slashes) and also squeeze multiple consecutive slashes into one // as it doesn't like two backslashes in a row neither wxString dir; size_t i, len = m_dir.length(); dir.reserve(len); for ( i = 0; i < len; i++ ) { wxChar ch = m_dir[i]; switch ( ch ) { case wxT('/'): // convert to backslash ch = wxT('\\'); // fall through case wxT('\\'): while ( i < len - 1 ) { wxChar chNext = m_dir[i + 1]; if ( chNext != wxT('\\') && chNext != wxT('/') ) break; // ignore the next one, unless it is at the start of a UNC path if (i > 0) i++; else break; } // fall through default: // normal char dir += ch; } } of.lpstrInitialDir = dir.c_str(); of.Flags = msw_flags; of.lpfnHook = wxFileDialogHookFunction; of.lCustData = (LPARAM)this; wxArrayString wildDescriptions, wildFilters; size_t items = wxParseCommonDialogsFilter(m_wildCard, wildDescriptions, wildFilters); wxASSERT_MSG( items > 0 , wxT("empty wildcard list") ); wxString filterBuffer; for (i = 0; i < items ; i++) { filterBuffer += wildDescriptions[i]; filterBuffer += wxT("|"); filterBuffer += wildFilters[i]; filterBuffer += wxT("|"); } // Replace | with \0 for (i = 0; i < filterBuffer.length(); i++ ) { if ( filterBuffer.GetChar(i) == wxT('|') ) { filterBuffer[i] = wxT('\0'); } } of.lpstrFilter = (LPTSTR)filterBuffer.wx_str(); of.nFilterIndex = m_filterIndex + 1; //=== Setting defaultFileName >>========================================= wxStrlcpy(fileNameBuffer, m_fileName.c_str(), WXSIZEOF(fileNameBuffer)); of.lpstrFile = fileNameBuffer; // holds returned filename of.nMaxFile = wxMAXPATH; // we must set the default extension because otherwise Windows would check // for the existing of a wrong file with wxFD_OVERWRITE_PROMPT (i.e. if the // user types "foo" and the default extension is ".bar" we should force it // to check for "foo.bar" existence and not "foo") wxString defextBuffer; // we need it to be alive until GetSaveFileName()! if (HasFdFlag(wxFD_SAVE)) { const wxChar* extension = filterBuffer.wx_str(); int maxFilter = (int)(of.nFilterIndex*2L) - 1; for( int i = 0; i < maxFilter; i++ ) // get extension extension = extension + wxStrlen( extension ) + 1; // use dummy name a to avoid assert in AppendExtension defextBuffer = AppendExtension(wxT("a"), extension); if (defextBuffer.StartsWith(wxT("a."))) { defextBuffer = defextBuffer.Mid(2); // remove "a." of.lpstrDefExt = defextBuffer.c_str(); } } // store off before the standard windows dialog can possibly change it const wxString cwdOrig = wxGetCwd(); //== Execute FileDialog >>================================================= if ( !ShowCommFileDialog(&of, m_windowStyle) ) return wxID_CANCEL; // GetOpenFileName will always change the current working directory on // (according to MSDN) "Windows NT 4.0/2000/XP" because the flag // OFN_NOCHANGEDIR has no effect. If the user did not specify // wxFD_CHANGE_DIR let's restore the current working directory to what it // was before the dialog was shown. if ( msw_flags & OFN_NOCHANGEDIR ) { wxSetWorkingDirectory(cwdOrig); } m_fileNames.Empty(); if ( ( HasFdFlag(wxFD_MULTIPLE) ) && #if defined(OFN_EXPLORER) ( fileNameBuffer[of.nFileOffset-1] == wxT('\0') ) #else ( fileNameBuffer[of.nFileOffset-1] == wxT(' ') ) #endif // OFN_EXPLORER ) { #if defined(OFN_EXPLORER) m_dir = fileNameBuffer; i = of.nFileOffset; m_fileName = &fileNameBuffer[i]; m_fileNames.Add(m_fileName); i += m_fileName.length() + 1; while (fileNameBuffer[i] != wxT('\0')) { m_fileNames.Add(&fileNameBuffer[i]); i += wxStrlen(&fileNameBuffer[i]) + 1; } #else wxStringTokenizer toke(fileNameBuffer, wxT(" \t\r\n")); m_dir = toke.GetNextToken(); m_fileName = toke.GetNextToken(); m_fileNames.Add(m_fileName); while (toke.HasMoreTokens()) m_fileNames.Add(toke.GetNextToken()); #endif // OFN_EXPLORER wxString dir(m_dir); if ( m_dir.Last() != wxT('\\') ) dir += wxT('\\'); m_path = dir + m_fileName; m_filterIndex = (int)of.nFilterIndex - 1; } else { //=== Adding the correct extension >>================================= m_filterIndex = (int)of.nFilterIndex - 1; if ( !of.nFileExtension || (of.nFileExtension && fileNameBuffer[of.nFileExtension] == wxT('\0')) ) { // User has typed a filename without an extension: const wxChar* extension = filterBuffer.wx_str(); int maxFilter = (int)(of.nFilterIndex*2L) - 1; for( int i = 0; i < maxFilter; i++ ) // get extension extension = extension + wxStrlen( extension ) + 1; m_fileName = AppendExtension(fileNameBuffer, extension); wxStrlcpy(fileNameBuffer, m_fileName.c_str(), WXSIZEOF(fileNameBuffer)); } m_path = fileNameBuffer; m_fileName = wxFileNameFromPath(fileNameBuffer); m_fileNames.Add(m_fileName); m_dir = wxPathOnly(fileNameBuffer); } return wxID_OK; }
int wxFileDialog::ShowModal() { WX_HOOK_MODAL_DIALOG(); m_paths.Empty(); m_fileNames.Empty(); OSErr err; NavDialogCreationOptions dialogCreateOptions; // set default options ::NavGetDefaultDialogCreationOptions(&dialogCreateOptions); // this was always unset in the old code dialogCreateOptions.optionFlags &= ~kNavSelectDefaultLocation; wxCFStringRef message(m_message, GetFont().GetEncoding()); dialogCreateOptions.windowTitle = message; wxCFStringRef defaultFileName(m_fileName, GetFont().GetEncoding()); dialogCreateOptions.saveFileName = defaultFileName; NavDialogRef dialog; NavObjectFilterUPP navFilterUPP = NULL; OpenUserDataRec myData( this ); dialogCreateOptions.popupExtension = myData.GetMenuItems(); if (HasFdFlag(wxFD_SAVE)) { dialogCreateOptions.optionFlags |= kNavDontAutoTranslate; dialogCreateOptions.optionFlags |= kNavDontAddTranslateItems; if (dialogCreateOptions.popupExtension == NULL) dialogCreateOptions.optionFlags |= kNavNoTypePopup; // The extension is important if ( dialogCreateOptions.popupExtension == NULL || CFArrayGetCount(dialogCreateOptions.popupExtension)<2) dialogCreateOptions.optionFlags |= kNavPreserveSaveFileExtension; if (!(m_windowStyle & wxFD_OVERWRITE_PROMPT)) dialogCreateOptions.optionFlags |= kNavDontConfirmReplacement; err = ::NavCreatePutFileDialog( &dialogCreateOptions, kNavGenericSignature, // Suppresses the 'Default' (top) menu item kNavGenericSignature, sStandardNavEventFilter, &myData, // for defaultLocation &dialog ); } else { // let the user select bundles/programs in dialogs dialogCreateOptions.optionFlags |= kNavSupportPackages; navFilterUPP = NewNavObjectFilterUPP(CrossPlatformFilterCallback); err = ::NavCreateGetFileDialog( &dialogCreateOptions, NULL, // NavTypeListHandle sStandardNavEventFilter, NULL, // NavPreviewUPP navFilterUPP, (void *) &myData, // inClientData &dialog ); } SetupExtraControls(NavDialogGetWindow(dialog)); if (err == noErr) { wxDialog::OSXBeginModalDialog(); err = ::NavDialogRun(dialog); wxDialog::OSXEndModalDialog(); } // clean up filter related data, etc. if (navFilterUPP) ::DisposeNavObjectFilterUPP(navFilterUPP); if (err != noErr) { ::NavDialogDispose(dialog); return wxID_CANCEL; } NavReplyRecord navReply; err = ::NavDialogGetReply(dialog, &navReply); if (err == noErr && navReply.validRecord) { AEKeyword theKeyword; DescType actualType; Size actualSize; FSRef theFSRef; wxString thePath ; long count; m_filterIndex = myData.GetCurrentFilter(); ::AECountItems( &navReply.selection, &count ); for (long i = 1; i <= count; ++i) { err = ::AEGetNthPtr( &(navReply.selection), i, typeFSRef, &theKeyword, &actualType, &theFSRef, sizeof(theFSRef), &actualSize ); if (err != noErr) break; if (HasFdFlag(wxFD_SAVE)) thePath = wxMacFSRefToPath( &theFSRef, navReply.saveFileName ); else thePath = wxMacFSRefToPath( &theFSRef ); if (!thePath) { ::NavDisposeReply(&navReply); ::NavDialogDispose(dialog); return wxID_CANCEL; } m_path = thePath; m_paths.Add(m_path); m_fileName = wxFileNameFromPath(m_path); m_fileNames.Add(m_fileName); } // set these to the first hit m_path = m_paths[0]; m_fileName = wxFileNameFromPath(m_path); m_dir = wxPathOnly(m_path); } UnsubclassWin(); ::NavDisposeReply(&navReply); ::NavDialogDispose(dialog); return (err == noErr) ? wxID_OK : wxID_CANCEL; }
int wxFileDialog::ShowModal() { HWND hWnd = 0; if (m_parent) hWnd = (HWND) m_parent->GetHWND(); if (!hWnd && wxTheApp->GetTopWindow()) hWnd = (HWND) wxTheApp->GetTopWindow()->GetHWND(); static wxChar fileNameBuffer [ wxMAXPATH ]; // the file-name wxChar titleBuffer [ wxMAXFILE+1+wxMAXEXT ]; // the file-name, without path *fileNameBuffer = wxT('\0'); *titleBuffer = wxT('\0'); #if WXWIN_COMPATIBILITY_2_4 long msw_flags = 0; if ( HasFdFlag(wxHIDE_READONLY) || HasFdFlag(wxFD_SAVE) ) msw_flags |= OFN_HIDEREADONLY; #else long msw_flags = OFN_HIDEREADONLY; #endif if ( HasFdFlag(wxFD_FILE_MUST_EXIST) ) msw_flags |= OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; /* If the window has been moved the programmer is probably trying to center or position it. Thus we set the callback or hook function so that we can actually adjust the position. Without moving or centering the dlg, it will just stay in the upper left of the frame, it does not center automatically. */ if (m_bMovedWindow) // we need these flags. { msw_flags |= OFN_EXPLORER|OFN_ENABLEHOOK; #ifndef __WXWINCE__ msw_flags |= OFN_ENABLESIZING; #endif } if ( HasFdFlag(wxFD_MULTIPLE) ) { // OFN_EXPLORER must always be specified with OFN_ALLOWMULTISELECT msw_flags |= OFN_EXPLORER | OFN_ALLOWMULTISELECT; } // if wxFD_CHANGE_DIR flag is not given we shouldn't change the CWD which the // standard dialog does by default (notice that under NT it does it anyhow, // OFN_NOCHANGEDIR or not, see below) if ( !HasFdFlag(wxFD_CHANGE_DIR) ) { msw_flags |= OFN_NOCHANGEDIR; } if ( HasFdFlag(wxFD_OVERWRITE_PROMPT) ) { msw_flags |= OFN_OVERWRITEPROMPT; } wxOPENFILENAME of; wxZeroMemory(of); of.lStructSize = gs_ofStructSize; of.hwndOwner = hWnd; of.lpstrTitle = WXSTRINGCAST m_message; of.lpstrFileTitle = titleBuffer; of.nMaxFileTitle = wxMAXFILE + 1 + wxMAXEXT; // Convert forward slashes to backslashes (file selector doesn't like // forward slashes) and also squeeze multiple consecutive slashes into one // as it doesn't like two backslashes in a row neither wxString dir; size_t i, len = m_dir.length(); dir.reserve(len); for ( i = 0; i < len; i++ ) { wxChar ch = m_dir[i]; switch ( ch ) { case _T('/'): // convert to backslash ch = _T('\\'); // fall through case _T('\\'): while ( i < len - 1 ) { wxChar chNext = m_dir[i + 1]; if ( chNext != _T('\\') && chNext != _T('/') ) break; // ignore the next one, unless it is at the start of a UNC path if (i > 0) i++; else break; } // fall through default: // normal char dir += ch; } } of.lpstrInitialDir = dir.c_str(); of.Flags = msw_flags; of.lpfnHook = wxFileDialogHookFunction; wxArrayString wildDescriptions, wildFilters; size_t items = wxParseCommonDialogsFilter(m_wildCard, wildDescriptions, wildFilters); wxASSERT_MSG( items > 0 , _T("empty wildcard list") ); wxString filterBuffer; for (i = 0; i < items ; i++) { filterBuffer += wildDescriptions[i]; filterBuffer += wxT("|"); filterBuffer += wildFilters[i]; filterBuffer += wxT("|"); } // Replace | with \0 for (i = 0; i < filterBuffer.length(); i++ ) { if ( filterBuffer.GetChar(i) == wxT('|') ) { filterBuffer[i] = wxT('\0'); } } of.lpstrFilter = (LPTSTR)filterBuffer.c_str(); of.nFilterIndex = m_filterIndex + 1; //=== Setting defaultFileName >>========================================= wxStrncpy( fileNameBuffer, (const wxChar *)m_fileName, wxMAXPATH-1 ); fileNameBuffer[ wxMAXPATH-1 ] = wxT('\0'); of.lpstrFile = fileNameBuffer; // holds returned filename of.nMaxFile = wxMAXPATH; // we must set the default extension because otherwise Windows would check // for the existing of a wrong file with wxFD_OVERWRITE_PROMPT (i.e. if the // user types "foo" and the default extension is ".bar" we should force it // to check for "foo.bar" existence and not "foo") wxString defextBuffer; // we need it to be alive until GetSaveFileName()! if (HasFdFlag(wxFD_SAVE)) { const wxChar* extension = filterBuffer; int maxFilter = (int)(of.nFilterIndex*2L) - 1; for( int i = 0; i < maxFilter; i++ ) // get extension extension = extension + wxStrlen( extension ) + 1; // use dummy name a to avoid assert in AppendExtension defextBuffer = AppendExtension(wxT("a"), extension); if (defextBuffer.StartsWith(wxT("a."))) { defextBuffer = defextBuffer.Mid(2); // remove "a." of.lpstrDefExt = defextBuffer.c_str(); } } // store off before the standard windows dialog can possibly change it const wxString cwdOrig = wxGetCwd(); //== Execute FileDialog >>================================================= DWORD errCode; bool success = DoShowCommFileDialog(&of, m_windowStyle, &errCode); #ifdef wxTRY_SMALLER_OPENFILENAME // the system might be too old to support the new version file dialog // boxes, try with the old size if ( !success && errCode == CDERR_STRUCTSIZE && of.lStructSize != wxOPENFILENAME_V4_SIZE ) { of.lStructSize = wxOPENFILENAME_V4_SIZE; success = DoShowCommFileDialog(&of, m_windowStyle, &errCode); if ( success || !errCode ) { // use this struct size for subsequent dialogs gs_ofStructSize = of.lStructSize; } } #endif // wxTRY_SMALLER_OPENFILENAME if ( success ) { // GetOpenFileName will always change the current working directory on // (according to MSDN) "Windows NT 4.0/2000/XP" because the flag // OFN_NOCHANGEDIR has no effect. If the user did not specify // wxFD_CHANGE_DIR let's restore the current working directory to what it // was before the dialog was shown. if ( msw_flags & OFN_NOCHANGEDIR ) { wxSetWorkingDirectory(cwdOrig); } m_fileNames.Empty(); if ( ( HasFdFlag(wxFD_MULTIPLE) ) && #if defined(OFN_EXPLORER) ( fileNameBuffer[of.nFileOffset-1] == wxT('\0') ) #else ( fileNameBuffer[of.nFileOffset-1] == wxT(' ') ) #endif // OFN_EXPLORER ) { #if defined(OFN_EXPLORER) m_dir = fileNameBuffer; i = of.nFileOffset; m_fileName = &fileNameBuffer[i]; m_fileNames.Add(m_fileName); i += m_fileName.length() + 1; while (fileNameBuffer[i] != wxT('\0')) { m_fileNames.Add(&fileNameBuffer[i]); i += wxStrlen(&fileNameBuffer[i]) + 1; } #else wxStringTokenizer toke(fileNameBuffer, _T(" \t\r\n")); m_dir = toke.GetNextToken(); m_fileName = toke.GetNextToken(); m_fileNames.Add(m_fileName); while (toke.HasMoreTokens()) m_fileNames.Add(toke.GetNextToken()); #endif // OFN_EXPLORER wxString dir(m_dir); if ( m_dir.Last() != _T('\\') ) dir += _T('\\'); m_path = dir + m_fileName; m_filterIndex = (int)of.nFilterIndex - 1; } else { //=== Adding the correct extension >>================================= m_filterIndex = (int)of.nFilterIndex - 1; if ( !of.nFileExtension || (of.nFileExtension && fileNameBuffer[of.nFileExtension] == wxT('\0')) ) { // User has typed a filename without an extension: const wxChar* extension = filterBuffer; int maxFilter = (int)(of.nFilterIndex*2L) - 1; for( int i = 0; i < maxFilter; i++ ) // get extension extension = extension + wxStrlen( extension ) + 1; m_fileName = AppendExtension(fileNameBuffer, extension); wxStrncpy(fileNameBuffer, m_fileName.c_str(), wxMin(m_fileName.length(), wxMAXPATH-1)); fileNameBuffer[wxMin(m_fileName.length(), wxMAXPATH-1)] = wxT('\0'); } m_path = fileNameBuffer; m_fileName = wxFileNameFromPath(fileNameBuffer); m_fileNames.Add(m_fileName); m_dir = wxPathOnly(fileNameBuffer); } } #ifdef __WXDEBUG__ else { // common dialog failed - why? if ( errCode != 0 ) { // this msg is only for developers so don't translate it wxLogError(wxT("Common dialog failed with error code %0lx."), errCode); } //else: it was just cancelled } #endif // __WXDEBUG__ return success ? wxID_OK : wxID_CANCEL; }
int wxFileDialog::ShowModal() { OSErr err; NavDialogCreationOptions dialogCreateOptions; // set default options ::NavGetDefaultDialogCreationOptions(&dialogCreateOptions); // this was always unset in the old code dialogCreateOptions.optionFlags &= ~kNavSelectDefaultLocation; wxCFStringRef message(m_message, GetFont().GetEncoding()); dialogCreateOptions.windowTitle = message; wxCFStringRef defaultFileName(m_fileName, GetFont().GetEncoding()); dialogCreateOptions.saveFileName = defaultFileName; NavDialogRef dialog; NavObjectFilterUPP navFilterUPP = NULL; OpenUserDataRec myData; myData.defaultLocation = m_dir; MakeUserDataRec(&myData , m_wildCard); myData.currentfilter = m_filterIndex; size_t numFilters = myData.extensions.GetCount(); if (numFilters) { CFMutableArrayRef popup = CFArrayCreateMutable( kCFAllocatorDefault , numFilters , &kCFTypeArrayCallBacks ) ; dialogCreateOptions.popupExtension = popup ; myData.menuitems = dialogCreateOptions.popupExtension ; for ( size_t i = 0 ; i < numFilters ; ++i ) { CFArrayAppendValue( popup , (CFStringRef) wxCFStringRef( myData.name[i] , GetFont().GetEncoding() ) ) ; } } if (HasFdFlag(wxFD_SAVE)) { myData.saveMode = true; dialogCreateOptions.optionFlags |= kNavDontAutoTranslate; dialogCreateOptions.optionFlags |= kNavDontAddTranslateItems; if (!numFilters) dialogCreateOptions.optionFlags |= kNavNoTypePopup; // The extension is important if (numFilters < 2) dialogCreateOptions.optionFlags |= kNavPreserveSaveFileExtension; if (!(m_windowStyle & wxFD_OVERWRITE_PROMPT)) dialogCreateOptions.optionFlags |= kNavDontConfirmReplacement; err = ::NavCreatePutFileDialog( &dialogCreateOptions, kNavGenericSignature, // Suppresses the 'Default' (top) menu item kNavGenericSignature, sStandardNavEventFilter, &myData, // for defaultLocation &dialog ); } else { // let the user select bundles/programs in dialogs dialogCreateOptions.optionFlags |= kNavSupportPackages; navFilterUPP = NewNavObjectFilterUPP(CrossPlatformFilterCallback); err = ::NavCreateGetFileDialog( &dialogCreateOptions, NULL, // NavTypeListHandle sStandardNavEventFilter, NULL, // NavPreviewUPP navFilterUPP, (void *) &myData, // inClientData &dialog ); } if (err == noErr) err = ::NavDialogRun(dialog); // clean up filter related data, etc. if (navFilterUPP) ::DisposeNavObjectFilterUPP(navFilterUPP); if (err != noErr) { ::NavDialogDispose(dialog); return wxID_CANCEL; } NavReplyRecord navReply; err = ::NavDialogGetReply(dialog, &navReply); if (err == noErr && navReply.validRecord) { AEKeyword theKeyword; DescType actualType; Size actualSize; FSRef theFSRef; wxString thePath ; long count; m_filterIndex = myData.currentfilter; ::AECountItems( &navReply.selection, &count ); for (long i = 1; i <= count; ++i) { err = ::AEGetNthPtr( &(navReply.selection), i, typeFSRef, &theKeyword, &actualType, &theFSRef, sizeof(theFSRef), &actualSize ); if (err != noErr) break; if (HasFdFlag(wxFD_SAVE)) thePath = wxMacFSRefToPath( &theFSRef, navReply.saveFileName ); else thePath = wxMacFSRefToPath( &theFSRef ); if (!thePath) { ::NavDisposeReply(&navReply); ::NavDialogDispose(dialog); return wxID_CANCEL; } m_path = thePath; m_paths.Add(m_path); m_fileName = wxFileNameFromPath(m_path); m_fileNames.Add(m_fileName); } // set these to the first hit m_path = m_paths[0]; m_fileName = wxFileNameFromPath(m_path); m_dir = wxPathOnly(m_path); } ::NavDisposeReply(&navReply); ::NavDialogDispose(dialog); return (err == noErr) ? wxID_OK : wxID_CANCEL; }
bool wxGenericFileDialog::Create( wxWindow *parent, const wxString& message, const wxString& defaultDir, const wxString& defaultFile, const wxString& wildCard, long style, const wxPoint& pos, const wxSize& sz, const wxString& name, bool bypassGenericImpl ) { m_bypassGenericImpl = bypassGenericImpl; if (!wxFileDialogBase::Create(parent, message, defaultDir, defaultFile, wildCard, style, pos, sz, name)) { return false; } if (m_bypassGenericImpl) return true; if (!wxDialog::Create( parent, wxID_ANY, message, pos, sz, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | style, name )) { return false; } ignoreChanges = true; #if wxUSE_CONFIG if (wxConfig::Get(false)) { wxConfig::Get()->Read(wxT("/wxWindows/wxFileDialog/ViewStyle"), &ms_lastViewStyle); wxConfig::Get()->Read(wxT("/wxWindows/wxFileDialog/ShowHidden"), &ms_lastShowHidden); } #endif if ((m_dir.empty()) || (m_dir == wxT("."))) { m_dir = wxGetCwd(); if (m_dir.empty()) m_dir = wxFILE_SEP_PATH; } size_t len = m_dir.length(); if ((len > 1) && (wxEndsWithPathSeparator(m_dir))) m_dir.Remove( len-1, 1 ); m_path = m_dir; m_path += wxFILE_SEP_PATH; m_path += defaultFile; m_filterExtension = wxEmptyString; // layout bool is_pda = (wxSystemSettings::GetScreenType() <= wxSYS_SCREEN_PDA); wxBoxSizer *mainsizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer *buttonsizer = new wxBoxSizer( wxHORIZONTAL ); wxBitmapButton *but; but = new wxBitmapButton(this, ID_LIST_MODE, wxArtProvider::GetBitmap(wxART_LIST_VIEW, wxART_BUTTON)); #if wxUSE_TOOLTIPS but->SetToolTip( _("View files as a list view") ); #endif buttonsizer->Add( but, 0, wxALL, 5 ); but = new wxBitmapButton(this, ID_REPORT_MODE, wxArtProvider::GetBitmap(wxART_REPORT_VIEW, wxART_BUTTON)); #if wxUSE_TOOLTIPS but->SetToolTip( _("View files as a detailed view") ); #endif buttonsizer->Add( but, 0, wxALL, 5 ); buttonsizer->Add( 30, 5, 1 ); m_upDirButton = new wxBitmapButton(this, ID_UP_DIR, wxArtProvider::GetBitmap(wxART_GO_DIR_UP, wxART_BUTTON)); #if wxUSE_TOOLTIPS m_upDirButton->SetToolTip( _("Go to parent directory") ); #endif buttonsizer->Add( m_upDirButton, 0, wxALL, 5 ); #ifndef __DOS__ // VS: Home directory is meaningless in MS-DOS... but = new wxBitmapButton(this, ID_PARENT_DIR, wxArtProvider::GetBitmap(wxART_GO_HOME, wxART_BUTTON)); #if wxUSE_TOOLTIPS but->SetToolTip( _("Go to home directory") ); #endif buttonsizer->Add( but, 0, wxALL, 5); buttonsizer->Add( 20, 20 ); #endif //!__DOS__ m_newDirButton = new wxBitmapButton(this, ID_NEW_DIR, wxArtProvider::GetBitmap(wxART_NEW_DIR, wxART_BUTTON)); #if wxUSE_TOOLTIPS m_newDirButton->SetToolTip( _("Create new directory") ); #endif buttonsizer->Add( m_newDirButton, 0, wxALL, 5 ); if (is_pda) mainsizer->Add( buttonsizer, 0, wxALL | wxEXPAND, 0 ); else mainsizer->Add( buttonsizer, 0, wxALL | wxEXPAND, 5 ); wxBoxSizer *staticsizer = new wxBoxSizer( wxHORIZONTAL ); if (is_pda) staticsizer->Add( new wxStaticText( this, wxID_ANY, _("Current directory:") ), 0, wxRIGHT, 10 ); m_static = new wxStaticText( this, wxID_ANY, m_dir ); staticsizer->Add( m_static, 1 ); mainsizer->Add( staticsizer, 0, wxEXPAND | wxLEFT|wxRIGHT|wxBOTTOM, 10 ); long style2 = ms_lastViewStyle; if ( !HasFdFlag(wxFD_MULTIPLE) ) style2 |= wxLC_SINGLE_SEL; #ifdef __WXWINCE__ style2 |= wxSIMPLE_BORDER; #else style2 |= wxSUNKEN_BORDER; #endif m_list = new wxFileCtrl( this, ID_LIST_CTRL, wxEmptyString, ms_lastShowHidden, wxDefaultPosition, wxSize(540,200), style2); m_text = new wxTextCtrl(this, ID_TEXT, m_fileName, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER); m_choice = new wxChoice(this, ID_CHOICE); if (is_pda) { // PDAs have a different screen layout mainsizer->Add(m_list, wxSizerFlags(1).Expand().HorzBorder()); wxBoxSizer *textsizer = new wxBoxSizer(wxHORIZONTAL); textsizer->Add(m_text, wxSizerFlags(1).Centre().Border()); mainsizer->Add(textsizer, wxSizerFlags().Expand()); m_check = NULL; textsizer->Add(m_choice, wxSizerFlags(1).Centre().Border()); wxSizer *bsizer = CreateButtonSizer(wxOK | wxCANCEL); if ( bsizer ) mainsizer->Add(bsizer, wxSizerFlags().Expand().Border()); } else // !is_pda { mainsizer->Add(m_list, wxSizerFlags(1).Expand().DoubleHorzBorder()); wxBoxSizer *textsizer = new wxBoxSizer(wxHORIZONTAL); textsizer->Add(m_text, wxSizerFlags(1).Centre(). DoubleBorder(wxLEFT | wxRIGHT | wxTOP)); textsizer->Add(new wxButton(this, wxID_OK), wxSizerFlags().Centre(). DoubleBorder(wxLEFT | wxRIGHT | wxTOP)); mainsizer->Add(textsizer, wxSizerFlags().Expand()); wxSizerFlags flagsCentre; flagsCentre.Centre().DoubleBorder(); wxBoxSizer *choicesizer = new wxBoxSizer(wxHORIZONTAL); choicesizer->Add(m_choice, wxSizerFlags(flagsCentre).Proportion(1)); m_check = new wxCheckBox(this, ID_CHECK, _("Show &hidden files")); m_check->SetValue(ms_lastShowHidden); choicesizer->Add(m_check, flagsCentre); choicesizer->Add(new wxButton(this, wxID_CANCEL), flagsCentre); mainsizer->Add(choicesizer, wxSizerFlags().Expand()); } SetWildcard(wildCard); SetAutoLayout( true ); SetSizer( mainsizer ); if (!is_pda) { mainsizer->Fit( this ); mainsizer->SetSizeHints( this ); Centre( wxBOTH ); } m_text->SetFocus(); ignoreChanges = false; return true; }
void wxGenericFileDialog::HandleAction( const wxString &fn ) { if (ignoreChanges) return; wxString filename( fn ); if (filename.empty()) { #ifdef __WXWINCE__ EndModal(wxID_CANCEL); #endif return; } if (filename == wxT(".")) return; wxString dir = m_list->GetDir(); // "some/place/" means they want to chdir not try to load "place" bool want_dir = filename.Last() == wxFILE_SEP_PATH; if (want_dir) filename = filename.RemoveLast(); if (filename == wxT("..")) { ignoreChanges = true; m_list->GoToParentDir(); m_list->SetFocus(); UpdateControls(); ignoreChanges = false; return; } #ifdef __UNIX__ if (filename == wxT("~")) { ignoreChanges = true; m_list->GoToHomeDir(); m_list->SetFocus(); UpdateControls(); ignoreChanges = false; return; } if (filename.BeforeFirst(wxT('/')) == wxT("~")) { filename = wxString(wxGetUserHome()) + filename.Remove(0, 1); } #endif // __UNIX__ if (!HasFdFlag(wxFD_SAVE)) { if ((filename.Find(wxT('*')) != wxNOT_FOUND) || (filename.Find(wxT('?')) != wxNOT_FOUND)) { if (filename.Find(wxFILE_SEP_PATH) != wxNOT_FOUND) { wxMessageBox(_("Illegal file specification."), _("Error"), wxOK | wxICON_ERROR ); return; } m_list->SetWild( filename ); return; } } if (!IsTopMostDir(dir)) dir += wxFILE_SEP_PATH; if (!wxIsAbsolutePath(filename)) { dir += filename; filename = dir; } if (wxDirExists(filename)) { ignoreChanges = true; m_list->GoToDir( filename ); UpdateControls(); ignoreChanges = false; return; } // they really wanted a dir, but it doesn't exist if (want_dir) { wxMessageBox(_("Directory doesn't exist."), _("Error"), wxOK | wxICON_ERROR ); return; } // append the default extension to the filename if it doesn't have any // // VZ: the logic of testing for !wxFileExists() only for the open file // dialog is not entirely clear to me, why don't we allow saving to a // file without extension as well? if ( !HasFdFlag(wxFD_OPEN) || !wxFileExists(filename) ) { filename = AppendExtension(filename, m_filterExtension); } // check that the file [doesn't] exist if necessary if ( HasFdFlag(wxFD_SAVE) && HasFdFlag(wxFD_OVERWRITE_PROMPT) && wxFileExists( filename ) ) { wxString msg; msg.Printf( _("File '%s' already exists, do you really want to overwrite it?"), filename.c_str() ); if (wxMessageBox(msg, _("Confirm"), wxYES_NO) != wxYES) return; } else if ( HasFdFlag(wxFD_OPEN) && HasFdFlag(wxFD_FILE_MUST_EXIST) && !wxFileExists(filename) ) { wxMessageBox(_("Please choose an existing file."), _("Error"), wxOK | wxICON_ERROR ); return; } SetPath( filename ); // change to the directory where the user went if asked if ( HasFdFlag(wxFD_CHANGE_DIR) ) { wxString cwd; wxSplitPath(filename, &cwd, NULL, NULL); if ( cwd != wxGetCwd() ) { wxSetWorkingDirectory(cwd); } } EndModal(wxID_OK); }
bool wxFileDialogBase::Create(wxWindow *parent, const wxString& message, const wxString& defaultDir, const wxString& defaultFile, const wxString& wildCard, long style, const wxPoint& WXUNUSED(pos), const wxSize& WXUNUSED(sz), const wxString& WXUNUSED(name)) { m_message = message; m_dir = defaultDir; m_fileName = defaultFile; m_wildCard = wildCard; m_parent = parent; m_windowStyle = style; m_filterIndex = 0; if (!HasFdFlag(wxFD_OPEN) && !HasFdFlag(wxFD_SAVE)) m_windowStyle |= wxFD_OPEN; // wxFD_OPEN is the default // check that the styles are not contradictory wxASSERT_MSG( !(HasFdFlag(wxFD_SAVE) && HasFdFlag(wxFD_OPEN)), _T("can't specify both wxFD_SAVE and wxFD_OPEN at once") ); wxASSERT_MSG( !HasFdFlag(wxFD_SAVE) || (!HasFdFlag(wxFD_MULTIPLE) && !HasFdFlag(wxFD_FILE_MUST_EXIST)), _T("wxFD_MULTIPLE or wxFD_FILE_MUST_EXIST can't be used with wxFD_SAVE" ) ); wxASSERT_MSG( !HasFdFlag(wxFD_OPEN) || !HasFdFlag(wxFD_OVERWRITE_PROMPT), _T("wxFD_OVERWRITE_PROMPT can't be used with wxFD_OPEN") ); if ( wildCard.empty() || wildCard == wxFileSelectorDefaultWildcardStr ) { m_wildCard = wxString::Format(_("All files (%s)|%s"), wxFileSelectorDefaultWildcardStr, wxFileSelectorDefaultWildcardStr); } else // have wild card { // convert m_wildCard from "*.bar" to "bar files (*.bar)|*.bar" if ( m_wildCard.Find(wxT('|')) == wxNOT_FOUND ) { wxString::size_type nDot = m_wildCard.find(_T("*.")); if ( nDot != wxString::npos ) nDot++; else nDot = 0; m_wildCard = wxString::Format ( _("%s files (%s)|%s"), wildCard.c_str() + nDot, wildCard.c_str(), wildCard.c_str() ); } } return true; }
void wxGenericFileDialog::CreateDefaultControls(wxWindow *parent, const wxString& wildCard, bool is_pda) { // layout wxBoxSizer *mainsizer = new wxBoxSizer( wxVERTICAL ); wxBoxSizer *buttonsizer = new wxBoxSizer( wxHORIZONTAL ); wxBitmapButton *but; but = new wxBitmapButton(parent, ID_LIST_MODE, wxArtProvider::GetBitmap(wxART_LIST_VIEW, wxART_BUTTON)); #if wxUSE_TOOLTIPS but->SetToolTip( _("View files as a list view") ); #endif buttonsizer->Add( but, 0, wxALL, 5 ); but = new wxBitmapButton(parent, ID_REPORT_MODE, wxArtProvider::GetBitmap(wxART_REPORT_VIEW, wxART_BUTTON)); #if wxUSE_TOOLTIPS but->SetToolTip( _("View files as a detailed view") ); #endif buttonsizer->Add( but, 0, wxALL, 5 ); buttonsizer->Add( 30, 5, 1 ); m_upDirButton = new wxBitmapButton(parent, ID_UP_DIR, wxArtProvider::GetBitmap(wxART_GO_DIR_UP, wxART_BUTTON)); #if wxUSE_TOOLTIPS m_upDirButton->SetToolTip( _("Go to parent directory") ); #endif buttonsizer->Add( m_upDirButton, 0, wxALL, 5 ); #ifndef __DOS__ // VS: Home directory is meaningless in MS-DOS... but = new wxBitmapButton(parent, ID_PARENT_DIR, wxArtProvider::GetBitmap(wxART_GO_HOME, wxART_BUTTON)); #if wxUSE_TOOLTIPS but->SetToolTip( _("Go to home directory") ); #endif buttonsizer->Add( but, 0, wxALL, 5); buttonsizer->Add( 20, 20 ); #endif //!__DOS__ m_newDirButton = new wxBitmapButton(parent, ID_NEW_DIR, wxArtProvider::GetBitmap(wxART_NEW_DIR, wxART_BUTTON)); #if wxUSE_TOOLTIPS m_newDirButton->SetToolTip( _("Create new directory") ); #endif buttonsizer->Add( m_newDirButton, 0, wxALL, 5 ); if (is_pda) mainsizer->Add( buttonsizer, 0, wxALL | wxEXPAND, 0 ); else mainsizer->Add( buttonsizer, 0, wxALL | wxEXPAND, 5 ); wxBoxSizer *staticsizer = new wxBoxSizer( wxHORIZONTAL ); if (is_pda) staticsizer->Add( new wxStaticText( parent, wxID_ANY, _("Current directory:") ), 0, wxRIGHT, 10 ); m_static = new wxStaticText( parent, wxID_ANY, m_dir ); staticsizer->Add( m_static, 1 ); mainsizer->Add( staticsizer, 0, wxEXPAND | wxLEFT|wxRIGHT|wxBOTTOM, 10 ); long style2 = ms_lastViewStyle; if ( !HasFdFlag(wxFD_MULTIPLE) ) style2 |= wxLC_SINGLE_SEL; #ifdef __WXWINCE__ style2 |= wxSIMPLE_BORDER; #else style2 |= wxSUNKEN_BORDER; #endif #ifdef __WXGTK__ m_list = new wxFileCtrl( parent, ID_LIST_CTRL, wxEmptyString, wxEmptyString, wxFileSelectorDefaultWildcardStr, style2, wxDefaultPosition, wxSize(540,200)); #else m_list = new wxFileCtrl( parent, ID_LIST_CTRL, wxEmptyString, ms_lastShowHidden, wxDefaultPosition, wxSize(540,200), style2); #endif m_text = new wxTextCtrl(parent, ID_TEXT, m_fileName, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER); m_choice = new wxChoice(parent, ID_CHOICE); if (is_pda) { // PDAs have a different screen layout mainsizer->Add(m_list, wxSizerFlags(1).Expand().HorzBorder()); wxBoxSizer *textsizer = new wxBoxSizer(wxHORIZONTAL); textsizer->Add(m_text, wxSizerFlags(1).Centre().Border()); mainsizer->Add(textsizer, wxSizerFlags().Expand()); m_check = NULL; textsizer->Add(m_choice, wxSizerFlags(1).Centre().Border()); wxSizer *bsizer = CreateButtonSizer(wxOK | wxCANCEL); if ( bsizer ) mainsizer->Add(bsizer, wxSizerFlags().Expand().Border()); } else // !is_pda { mainsizer->Add(m_list, wxSizerFlags(1).Expand().DoubleHorzBorder()); wxBoxSizer *textsizer = new wxBoxSizer(wxHORIZONTAL); textsizer->Add(m_text, wxSizerFlags(1).Centre(). DoubleBorder(wxLEFT | wxRIGHT | wxTOP)); textsizer->Add(new wxButton(parent, wxID_OK), wxSizerFlags().Centre(). DoubleBorder(wxLEFT | wxRIGHT | wxTOP)); mainsizer->Add(textsizer, wxSizerFlags().Expand()); wxSizerFlags flagsCentre; flagsCentre.Centre().DoubleBorder(); wxBoxSizer *choicesizer = new wxBoxSizer(wxHORIZONTAL); choicesizer->Add(m_choice, wxSizerFlags(flagsCentre).Proportion(1)); m_check = new wxCheckBox(parent, ID_CHECK, _("Show &hidden files")); m_check->SetValue(ms_lastShowHidden); choicesizer->Add(m_check, flagsCentre); choicesizer->Add(new wxButton(parent, wxID_CANCEL), flagsCentre); mainsizer->Add(choicesizer, wxSizerFlags().Expand()); } SetWildcard(wildCard); parent->SetAutoLayout( true ); parent->SetSizer( mainsizer ); if (!is_pda) { mainsizer->Fit( parent ); mainsizer->SetSizeHints( parent ); } }