1. finished porting wxDir/FileDialog to MS-DOS
2. added code to dynamically enable/disable controls in wxFileDialog depending on which actions are permitted at the moment (e.g. you can't click the 'Up' button if you're at / directory git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13494 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -317,7 +317,7 @@ static const char * icon8_xpm[] = {
|
|||||||
|
|
||||||
#if defined(__DOS__)
|
#if defined(__DOS__)
|
||||||
|
|
||||||
static bool wxIsDriveAvailable(const wxString dirName)
|
bool wxIsDriveAvailable(const wxString& dirName)
|
||||||
{
|
{
|
||||||
if ( dirName.Len() == 3 && dirName[1u] == wxT(':') )
|
if ( dirName.Len() == 3 && dirName[1u] == wxT(':') )
|
||||||
{
|
{
|
||||||
@@ -363,7 +363,7 @@ int setdrive(int drive)
|
|||||||
#endif // !GNUWIN32
|
#endif // !GNUWIN32
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool wxIsDriveAvailable(const wxString dirName)
|
bool wxIsDriveAvailable(const wxString& dirName)
|
||||||
{
|
{
|
||||||
#ifdef __WIN32__
|
#ifdef __WIN32__
|
||||||
UINT errorMode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
|
UINT errorMode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
|
||||||
|
@@ -86,20 +86,6 @@
|
|||||||
|
|
||||||
class wxFileData : public wxObject
|
class wxFileData : public wxObject
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
wxString m_name;
|
|
||||||
wxString m_fileName;
|
|
||||||
long m_size;
|
|
||||||
int m_hour;
|
|
||||||
int m_minute;
|
|
||||||
int m_year;
|
|
||||||
int m_month;
|
|
||||||
int m_day;
|
|
||||||
wxString m_permissions;
|
|
||||||
bool m_isDir;
|
|
||||||
bool m_isLink;
|
|
||||||
bool m_isExe;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
wxFileData() { }
|
wxFileData() { }
|
||||||
wxFileData( const wxString &name, const wxString &fname );
|
wxFileData( const wxString &name, const wxString &fname );
|
||||||
@@ -115,6 +101,19 @@ public:
|
|||||||
void SetNewName( const wxString &name, const wxString &fname );
|
void SetNewName( const wxString &name, const wxString &fname );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
wxString m_name;
|
||||||
|
wxString m_fileName;
|
||||||
|
long m_size;
|
||||||
|
int m_hour;
|
||||||
|
int m_minute;
|
||||||
|
int m_year;
|
||||||
|
int m_month;
|
||||||
|
int m_day;
|
||||||
|
wxString m_permissions;
|
||||||
|
bool m_isDir;
|
||||||
|
bool m_isLink;
|
||||||
|
bool m_isExe;
|
||||||
|
|
||||||
DECLARE_DYNAMIC_CLASS(wxFileData);
|
DECLARE_DYNAMIC_CLASS(wxFileData);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -124,11 +123,6 @@ private:
|
|||||||
|
|
||||||
class wxFileCtrl : public wxListCtrl
|
class wxFileCtrl : public wxListCtrl
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
wxString m_dirName;
|
|
||||||
bool m_showHidden;
|
|
||||||
wxString m_wild;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
wxFileCtrl();
|
wxFileCtrl();
|
||||||
wxFileCtrl( wxWindow *win,
|
wxFileCtrl( wxWindow *win,
|
||||||
@@ -156,8 +150,21 @@ public:
|
|||||||
void OnListDeleteItem( wxListEvent &event );
|
void OnListDeleteItem( wxListEvent &event );
|
||||||
void OnListDeleteAllItems( wxListEvent &event );
|
void OnListDeleteAllItems( wxListEvent &event );
|
||||||
void OnListEndLabelEdit( wxListEvent &event );
|
void OnListEndLabelEdit( wxListEvent &event );
|
||||||
|
|
||||||
|
// Associate commonly used UI controls with wxFileCtrl so that they can be
|
||||||
|
// disabled when they cannot be used (e.g. can't go to parent directory
|
||||||
|
// if wxFileCtrl already is in the root dir):
|
||||||
|
void SetGoToParentControl(wxWindow *ctrl) { m_goToParentControl = ctrl; }
|
||||||
|
void SetNewDirControl(wxWindow *ctrl) { m_newDirControl = ctrl; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
wxString m_dirName;
|
||||||
|
bool m_showHidden;
|
||||||
|
wxString m_wild;
|
||||||
|
|
||||||
|
wxWindow *m_goToParentControl;
|
||||||
|
wxWindow *m_newDirControl;
|
||||||
|
|
||||||
DECLARE_DYNAMIC_CLASS(wxFileCtrl);
|
DECLARE_DYNAMIC_CLASS(wxFileCtrl);
|
||||||
DECLARE_EVENT_TABLE()
|
DECLARE_EVENT_TABLE()
|
||||||
};
|
};
|
||||||
@@ -383,6 +390,10 @@ int ListCompare( long data1, long data2, long WXUNUSED(data) )
|
|||||||
#define IsTopMostDir(dir) (dir.IsEmpty())
|
#define IsTopMostDir(dir) (dir.IsEmpty())
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(__DOS__) || defined(__WINDOWS__)
|
||||||
|
extern bool wxIsDriveAvailable(const wxString& dirName);
|
||||||
|
#endif
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// wxFileData
|
// wxFileData
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@@ -393,9 +404,21 @@ wxFileData::wxFileData( const wxString &name, const wxString &fname )
|
|||||||
{
|
{
|
||||||
m_name = name;
|
m_name = name;
|
||||||
m_fileName = fname;
|
m_fileName = fname;
|
||||||
|
|
||||||
|
#if defined(__DOS__) || defined(__WINDOWS__)
|
||||||
|
// VS: In case the file is root directory of a volume (e.g. "C:"),
|
||||||
|
// we don't want it stat()ed, since the drive may not be in:
|
||||||
|
if (name.length() == 2 && name[1u] == wxT(':'))
|
||||||
|
{
|
||||||
|
m_isDir = TRUE;
|
||||||
|
m_isExe = m_isLink = FALSE;
|
||||||
|
m_size = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
struct stat buff;
|
struct stat buff;
|
||||||
stat( m_fileName.fn_str(), &buff );
|
wxStat( m_fileName.fn_str(), &buff );
|
||||||
|
|
||||||
#if defined(__UNIX__) && (!defined( __EMX__ ) && !defined(__VMS))
|
#if defined(__UNIX__) && (!defined( __EMX__ ) && !defined(__VMS))
|
||||||
struct stat lbuff;
|
struct stat lbuff;
|
||||||
@@ -548,7 +571,7 @@ void wxFileData::MakeItem( wxListItem &item )
|
|||||||
else if (IsExe())
|
else if (IsExe())
|
||||||
item.m_image = FI_EXECUTABLE;
|
item.m_image = FI_EXECUTABLE;
|
||||||
else if (m_name.Find(wxT('.')) != wxNOT_FOUND)
|
else if (m_name.Find(wxT('.')) != wxNOT_FOUND)
|
||||||
item.m_image = g_IconsTable -> GetIconID(m_name.AfterLast(wxT('.')));
|
item.m_image = g_IconsTable->GetIconID(m_name.AfterLast(wxT('.')));
|
||||||
else
|
else
|
||||||
item.m_image = FI_UNKNOWN;
|
item.m_image = FI_UNKNOWN;
|
||||||
|
|
||||||
@@ -592,10 +615,12 @@ wxFileCtrl::wxFileCtrl(wxWindow *win, wxWindowID id,
|
|||||||
{
|
{
|
||||||
if (! g_IconsTable)
|
if (! g_IconsTable)
|
||||||
g_IconsTable = new wxFileIconsTable;
|
g_IconsTable = new wxFileIconsTable;
|
||||||
wxImageList *imageList = g_IconsTable -> GetImageList();
|
wxImageList *imageList = g_IconsTable->GetImageList();
|
||||||
|
|
||||||
SetImageList( imageList, wxIMAGE_LIST_SMALL );
|
SetImageList( imageList, wxIMAGE_LIST_SMALL );
|
||||||
|
|
||||||
|
m_goToParentControl = m_newDirControl = NULL;
|
||||||
|
|
||||||
m_dirName = dirName;
|
m_dirName = dirName;
|
||||||
m_wild = wild;
|
m_wild = wild;
|
||||||
m_showHidden = FALSE;
|
m_showHidden = FALSE;
|
||||||
@@ -652,6 +677,8 @@ long wxFileCtrl::Add( wxFileData *fd, wxListItem &item )
|
|||||||
|
|
||||||
void wxFileCtrl::Update()
|
void wxFileCtrl::Update()
|
||||||
{
|
{
|
||||||
|
wxBusyCursor bcur; // this may take a while...
|
||||||
|
|
||||||
long my_style = GetWindowStyleFlag();
|
long my_style = GetWindowStyleFlag();
|
||||||
int name_col_width = 0;
|
int name_col_width = 0;
|
||||||
if (my_style & wxLC_REPORT)
|
if (my_style & wxLC_REPORT)
|
||||||
@@ -678,15 +705,21 @@ void wxFileCtrl::Update()
|
|||||||
item.m_col = 0;
|
item.m_col = 0;
|
||||||
|
|
||||||
#if defined(__DOS__) || defined(__WINDOWS__)
|
#if defined(__DOS__) || defined(__WINDOWS__)
|
||||||
if ( m_dirName.IsEmpty() )
|
if ( IsTopMostDir(m_dirName) )
|
||||||
{
|
{
|
||||||
// Pseudo-directory with all available drives listed...
|
// Pseudo-directory with all available drives listed...
|
||||||
fd = new wxFileData( wxT("C:"), "C:" );
|
for (int drive = 1; drive <= 26; drive++)
|
||||||
Add( fd, item );
|
{
|
||||||
item.m_itemId++;
|
wxString path;
|
||||||
fd = new wxFileData( wxT("D:"), "D:" );
|
path.Printf(wxT("%c:\\"), (char)(drive + 'A' - 1));
|
||||||
Add( fd, item );
|
if ( wxIsDriveAvailable(path) )
|
||||||
item.m_itemId++;
|
{
|
||||||
|
path.RemoveLast();
|
||||||
|
fd = new wxFileData(path, path);
|
||||||
|
Add(fd, item);
|
||||||
|
item.m_itemId++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@@ -754,6 +787,14 @@ void wxFileCtrl::Update()
|
|||||||
SetColumnWidth(2, wxLIST_AUTOSIZE);
|
SetColumnWidth(2, wxLIST_AUTOSIZE);
|
||||||
SetColumnWidth(3, wxLIST_AUTOSIZE);
|
SetColumnWidth(3, wxLIST_AUTOSIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Finally, enable/disable context-dependent controls:
|
||||||
|
if ( m_goToParentControl )
|
||||||
|
m_goToParentControl->Enable(!IsTopMostDir(m_dirName));
|
||||||
|
#if defined(__DOS__) || defined(__WINDOWS__)
|
||||||
|
if ( m_newDirControl )
|
||||||
|
m_newDirControl->Enable(!IsTopMostDir(m_dirName));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxFileCtrl::SetWild( const wxString &wild )
|
void wxFileCtrl::SetWild( const wxString &wild )
|
||||||
@@ -959,7 +1000,7 @@ wxFileDialog::wxFileDialog(wxWindow *parent,
|
|||||||
const wxPoint& pos ) :
|
const wxPoint& pos ) :
|
||||||
wxDialog( parent, -1, message, pos, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER )
|
wxDialog( parent, -1, message, pos, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER )
|
||||||
{
|
{
|
||||||
wxBeginBusyCursor();
|
wxBusyCursor bcur;
|
||||||
|
|
||||||
if (wxConfig::Get(FALSE))
|
if (wxConfig::Get(FALSE))
|
||||||
{
|
{
|
||||||
@@ -1039,13 +1080,14 @@ wxFileDialog::wxFileDialog(wxWindow *parent,
|
|||||||
|
|
||||||
buttonsizer->Add( 30, 5, 1 );
|
buttonsizer->Add( 30, 5, 1 );
|
||||||
|
|
||||||
but = new wxBitmapButton( this, ID_UP_DIR, wxBitmap( dir_up_xpm ) );
|
wxWindow *butDirUp =
|
||||||
|
new wxBitmapButton( this, ID_UP_DIR, wxBitmap( dir_up_xpm ) );
|
||||||
#if wxUSE_TOOLTIPS
|
#if wxUSE_TOOLTIPS
|
||||||
but->SetToolTip( _("Go to parent directory") );
|
butDirUp->SetToolTip( _("Go to parent directory") );
|
||||||
#endif
|
#endif
|
||||||
buttonsizer->Add( but, 0, wxALL, 5 );
|
buttonsizer->Add( butDirUp, 0, wxALL, 5 );
|
||||||
|
|
||||||
#ifndef __DOS__ // VS: Home directory is senseless in MS-DOS...
|
#ifndef __DOS__ // VS: Home directory is meaningless in MS-DOS...
|
||||||
but = new wxBitmapButton( this, ID_PARENT_DIR, wxBitmap(home_xpm) );
|
but = new wxBitmapButton( this, ID_PARENT_DIR, wxBitmap(home_xpm) );
|
||||||
#if wxUSE_TOOLTIPS
|
#if wxUSE_TOOLTIPS
|
||||||
but->SetToolTip( _("Go to home directory") );
|
but->SetToolTip( _("Go to home directory") );
|
||||||
@@ -1055,11 +1097,12 @@ wxFileDialog::wxFileDialog(wxWindow *parent,
|
|||||||
buttonsizer->Add( 20, 20 );
|
buttonsizer->Add( 20, 20 );
|
||||||
#endif //!__DOS__
|
#endif //!__DOS__
|
||||||
|
|
||||||
but = new wxBitmapButton( this, ID_NEW_DIR, wxBitmap(new_dir_xpm) );
|
wxWindow *butNewDir =
|
||||||
|
new wxBitmapButton( this, ID_NEW_DIR, wxBitmap(new_dir_xpm) );
|
||||||
#if wxUSE_TOOLTIPS
|
#if wxUSE_TOOLTIPS
|
||||||
but->SetToolTip( _("Create new directory") );
|
butNewDir->SetToolTip( _("Create new directory") );
|
||||||
#endif
|
#endif
|
||||||
buttonsizer->Add( but, 0, wxALL, 5 );
|
buttonsizer->Add( butNewDir, 0, wxALL, 5 );
|
||||||
|
|
||||||
mainsizer->Add( buttonsizer, 0, wxALL | wxEXPAND, 5 );
|
mainsizer->Add( buttonsizer, 0, wxALL | wxEXPAND, 5 );
|
||||||
|
|
||||||
@@ -1075,7 +1118,10 @@ wxFileDialog::wxFileDialog(wxWindow *parent,
|
|||||||
else
|
else
|
||||||
m_list = new wxFileCtrl( this, ID_LIST_CTRL, m_dir, firstWild, wxDefaultPosition,
|
m_list = new wxFileCtrl( this, ID_LIST_CTRL, m_dir, firstWild, wxDefaultPosition,
|
||||||
wxSize(540,200), s_lastViewStyle | wxSUNKEN_BORDER | wxLC_SINGLE_SEL );
|
wxSize(540,200), s_lastViewStyle | wxSUNKEN_BORDER | wxLC_SINGLE_SEL );
|
||||||
m_list -> ShowHidden(s_lastShowHidden);
|
m_list->ShowHidden(s_lastShowHidden);
|
||||||
|
m_list->SetNewDirControl(butNewDir);
|
||||||
|
m_list->SetGoToParentControl(butDirUp);
|
||||||
|
|
||||||
mainsizer->Add( m_list, 1, wxEXPAND | wxLEFT|wxRIGHT, 10 );
|
mainsizer->Add( m_list, 1, wxEXPAND | wxLEFT|wxRIGHT, 10 );
|
||||||
|
|
||||||
wxBoxSizer *textsizer = new wxBoxSizer( wxHORIZONTAL );
|
wxBoxSizer *textsizer = new wxBoxSizer( wxHORIZONTAL );
|
||||||
@@ -1116,8 +1162,6 @@ wxFileDialog::wxFileDialog(wxWindow *parent,
|
|||||||
else
|
else
|
||||||
*/
|
*/
|
||||||
m_text->SetFocus();
|
m_text->SetFocus();
|
||||||
|
|
||||||
wxEndBusyCursor();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wxFileDialog::~wxFileDialog()
|
wxFileDialog::~wxFileDialog()
|
||||||
|
Reference in New Issue
Block a user