filedlgg.cpp
来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C++ 代码 · 共 1,603 行 · 第 1/4 页
CPP
1,603 行
}
void wxGenericFileDialog::DoSetFilterIndex(int filterindex)
{
wxString *str = (wxString*) m_choice->GetClientData( filterindex );
m_list->SetWild( *str );
m_filterIndex = filterindex;
if ( str->Left(2) == wxT("*.") )
{
m_filterExtension = str->Mid(1);
if (m_filterExtension == _T(".*"))
m_filterExtension.clear();
}
else
{
m_filterExtension.clear();
}
}
void wxGenericFileDialog::SetWildcard(const wxString& wildCard)
{
wxFileDialogBase::SetWildcard(wildCard);
wxArrayString wildDescriptions, wildFilters;
const size_t count = wxParseCommonDialogsFilter(m_wildCard,
wildDescriptions,
wildFilters);
wxCHECK_RET( count, wxT("wxFileDialog: bad wildcard string") );
const size_t countOld = m_choice->GetCount();
size_t n;
for ( n = 0; n < countOld; n++ )
{
delete (wxString *)m_choice->GetClientData(n);
}
for ( n = 0; n < count; n++ )
{
m_choice->Append( wildDescriptions[n], new wxString( wildFilters[n] ) );
}
SetFilterIndex( 0 );
}
void wxGenericFileDialog::SetFilterIndex( int filterindex )
{
m_choice->SetSelection( filterindex );
DoSetFilterIndex(filterindex);
}
void wxGenericFileDialog::OnChoiceFilter( wxCommandEvent &event )
{
DoSetFilterIndex((int)event.GetInt());
}
void wxGenericFileDialog::OnCheck( wxCommandEvent &event )
{
m_list->ShowHidden( (ms_lastShowHidden = event.GetInt() != 0) );
}
void wxGenericFileDialog::OnActivated( wxListEvent &event )
{
HandleAction( event.m_item.m_text );
}
void wxGenericFileDialog::OnTextEnter( wxCommandEvent &WXUNUSED(event) )
{
wxCommandEvent cevent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK);
cevent.SetEventObject( this );
GetEventHandler()->ProcessEvent( cevent );
}
void wxGenericFileDialog::OnTextChange( wxCommandEvent &WXUNUSED(event) )
{
if (!ignoreChanges)
{
// Clear selections. Otherwise when the user types in a value they may
// not get the file whose name they typed.
if (m_list->GetSelectedItemCount() > 0)
{
long item = m_list->GetNextItem(-1, wxLIST_NEXT_ALL,
wxLIST_STATE_SELECTED);
while ( item != -1 )
{
m_list->SetItemState(item,0, wxLIST_STATE_SELECTED);
item = m_list->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
}
}
}
}
void wxGenericFileDialog::OnSelected( wxListEvent &event )
{
static bool inSelected = false;
if (inSelected)
return;
inSelected = true;
wxString filename( event.m_item.m_text );
#ifdef __WXWINCE__
// No double-click on most WinCE devices, so do action immediately.
HandleAction( filename );
#else
if (filename == wxT("..")) return;
wxString dir = m_list->GetDir();
if (!IsTopMostDir(dir))
dir += wxFILE_SEP_PATH;
dir += filename;
if (wxDirExists(dir)) return;
ignoreChanges = true;
m_text->SetValue( filename );
ignoreChanges = false;
#endif
inSelected = false;
}
void wxGenericFileDialog::HandleAction( const wxString &fn )
{
if (ignoreChanges)
return;
wxString filename( fn );
wxString dir = m_list->GetDir();
if (filename.empty()) return;
if (filename == wxT(".")) return;
// "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 (!(m_dialogStyle & wxSAVE))
{
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 ( !(m_dialogStyle & wxOPEN) || !wxFileExists(filename) )
{
filename = AppendExtension(filename, m_filterExtension);
}
// check that the file [doesn't] exist if necessary
if ( (m_dialogStyle & wxSAVE) &&
(m_dialogStyle & wxOVERWRITE_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 ( (m_dialogStyle & wxOPEN) &&
(m_dialogStyle & wxFILE_MUST_EXIST) &&
!wxFileExists(filename) )
{
wxMessageBox(_("Please choose an existing file."), _("Error"),
wxOK | wxICON_ERROR );
}
SetPath( filename );
// change to the directory where the user went if asked
if ( m_dialogStyle & wxCHANGE_DIR )
{
wxString cwd;
wxSplitPath(filename, &cwd, NULL, NULL);
if ( cwd != wxGetCwd() )
{
wxSetWorkingDirectory(cwd);
}
}
wxCommandEvent event;
wxDialog::OnOK(event);
}
void wxGenericFileDialog::OnListOk( wxCommandEvent &WXUNUSED(event) )
{
HandleAction( m_text->GetValue() );
}
void wxGenericFileDialog::OnList( wxCommandEvent &WXUNUSED(event) )
{
ignoreChanges = true;
m_list->ChangeToListMode();
ms_lastViewStyle = wxLC_LIST;
m_list->SetFocus();
ignoreChanges = false;
}
void wxGenericFileDialog::OnReport( wxCommandEvent &WXUNUSED(event) )
{
ignoreChanges = true;
m_list->ChangeToReportMode();
ms_lastViewStyle = wxLC_REPORT;
m_list->SetFocus();
ignoreChanges = false;
}
void wxGenericFileDialog::OnUp( wxCommandEvent &WXUNUSED(event) )
{
ignoreChanges = true;
m_list->GoToParentDir();
m_list->SetFocus();
UpdateControls();
ignoreChanges = false;
}
void wxGenericFileDialog::OnHome( wxCommandEvent &WXUNUSED(event) )
{
ignoreChanges = true;
m_list->GoToHomeDir();
m_list->SetFocus();
UpdateControls();
ignoreChanges = false;
}
void wxGenericFileDialog::OnNew( wxCommandEvent &WXUNUSED(event) )
{
ignoreChanges = true;
m_list->MakeDir();
ignoreChanges = false;
}
void wxGenericFileDialog::SetPath( const wxString& path )
{
// not only set the full path but also update filename and dir
m_path = path;
#ifdef __WXWINCE__
if (m_path.empty())
m_path = wxFILE_SEP_PATH;
#endif
if ( !path.empty() )
{
wxString ext;
wxSplitPath(path, &m_dir, &m_fileName, &ext);
if (!ext.empty())
{
m_fileName += wxT(".");
m_fileName += ext;
}
}
}
void wxGenericFileDialog::GetPaths( wxArrayString& paths ) const
{
paths.Empty();
if (m_list->GetSelectedItemCount() == 0)
{
paths.Add( GetPath() );
return;
}
paths.Alloc( m_list->GetSelectedItemCount() );
wxString dir = m_list->GetDir();
#ifdef __UNIX__
if (dir != wxT("/"))
#endif
#ifdef __WXWINCE__
if (dir != wxT("/") && dir != wxT("\\"))
#endif
dir += wxFILE_SEP_PATH;
wxListItem item;
item.m_mask = wxLIST_MASK_TEXT;
item.m_itemId = m_list->GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
while ( item.m_itemId != -1 )
{
m_list->GetItem( item );
paths.Add( dir + item.m_text );
item.m_itemId = m_list->GetNextItem( item.m_itemId,
wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
}
}
void wxGenericFileDialog::GetFilenames(wxArrayString& files) const
{
files.Empty();
if (m_list->GetSelectedItemCount() == 0)
{
files.Add( GetFilename() );
return;
}
files.Alloc( m_list->GetSelectedItemCount() );
wxListItem item;
item.m_mask = wxLIST_MASK_TEXT;
item.m_itemId = m_list->GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
while ( item.m_itemId != -1 )
{
m_list->GetItem( item );
files.Add( item.m_text );
item.m_itemId = m_list->GetNextItem( item.m_itemId,
wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED );
}
}
void wxGenericFileDialog::UpdateControls()
{
wxString dir = m_list->GetDir();
m_static->SetLabel(dir);
bool enable = !IsTopMostDir(dir);
m_upDirButton->Enable(enable);
#if defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__)
m_newDirButton->Enable(enable);
#endif // defined(__DOS__) || defined(__WINDOWS__) || defined(__OS2__)
}
#ifdef USE_GENERIC_FILEDIALOG
IMPLEMENT_DYNAMIC_CLASS(wxFileDialog, wxGenericFileDialog);
#endif // USE_GENERIC_FILEDIALOG
#endif // wxUSE_FILEDLG
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?