X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/081d8d96db3bfe4dc490a6244b17184366846738..8a28cd66a63ce30c75173e10948e9d49d366d218:/src/generic/dirctrlg.cpp?ds=sidebyside diff --git a/src/generic/dirctrlg.cpp b/src/generic/dirctrlg.cpp index 24073aeeae..d0860a624e 100644 --- a/src/generic/dirctrlg.cpp +++ b/src/generic/dirctrlg.cpp @@ -55,7 +55,7 @@ #include "wx/osx/private.h" // includes mac headers #endif -#ifdef __WXMSW__ +#ifdef __WINDOWS__ #include #include "wx/msw/winundef.h" #include "wx/volume.h" @@ -71,7 +71,7 @@ #include #endif -#endif +#endif // __WINDOWS__ #if defined(__OS2__) || defined(__DOS__) #ifdef __OS2__ @@ -102,6 +102,13 @@ extern WXDLLEXPORT_DATA(const char) wxFileSelectorDefaultWildcardStr[]; bool wxIsDriveAvailable(const wxString& dirName); +// ---------------------------------------------------------------------------- +// events +// ---------------------------------------------------------------------------- + +wxDEFINE_EVENT( wxEVT_DIRCTRL_SELECTIONCHANGED, wxTreeEvent ); +wxDEFINE_EVENT( wxEVT_DIRCTRL_FILEACTIVATED, wxTreeEvent ); + // ---------------------------------------------------------------------------- // wxGetAvailableDrives, for WINDOWS, DOS, OS2, MAC, UNIX (returns "/") // ---------------------------------------------------------------------------- @@ -250,7 +257,7 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI } } -#elif defined(__UNIX__) || defined(__WXPALMOS__) +#elif defined(__UNIX__) paths.Add(wxT("/")); names.Add(wxT("/")); icon_ids.Add(wxFileIconsTable::computer); @@ -270,7 +277,7 @@ size_t wxGetAvailableDrives(wxArrayString &paths, wxArrayString &names, wxArrayI bool wxIsDriveAvailable(const wxString& dirName) { - // FIXME_MGL - this method leads to hang up under Watcom for some reason + // FIXME: this method leads to hang up under Watcom for some reason #ifdef __WATCOMC__ wxUnusedVar(dirName); #else @@ -310,7 +317,7 @@ int setdrive(int WXUNUSED_IN_WINCE(drive)) #else newdrive[2] = wxT('\0'); #endif -#if defined(__WXMSW__) +#if defined(__WINDOWS__) if (::SetCurrentDirectory(newdrive)) #else // VA doesn't know what LPSTR is and has its own set @@ -441,6 +448,8 @@ BEGIN_EVENT_TABLE(wxGenericDirCtrl, wxControl) EVT_TREE_ITEM_COLLAPSED (wxID_TREECTRL, wxGenericDirCtrl::OnCollapseItem) EVT_TREE_BEGIN_LABEL_EDIT (wxID_TREECTRL, wxGenericDirCtrl::OnBeginEditItem) EVT_TREE_END_LABEL_EDIT (wxID_TREECTRL, wxGenericDirCtrl::OnEndEditItem) + EVT_TREE_SEL_CHANGED (wxID_TREECTRL, wxGenericDirCtrl::OnTreeSelChange) + EVT_TREE_ITEM_ACTIVATED (wxID_TREECTRL, wxGenericDirCtrl::OnItemActivated) EVT_SIZE (wxGenericDirCtrl::OnSize) END_EVENT_TABLE() @@ -470,7 +479,7 @@ void wxGenericDirCtrl::ExpandRoot() } bool wxGenericDirCtrl::Create(wxWindow *parent, - const wxWindowID id, + const wxWindowID treeid, const wxString& dir, const wxPoint& pos, const wxSize& size, @@ -479,7 +488,7 @@ bool wxGenericDirCtrl::Create(wxWindow *parent, int defaultFilter, const wxString& name) { - if (!wxControl::Create(parent, id, pos, size, style, wxDefaultValidator, name)) + if (!wxControl::Create(parent, treeid, pos, size, style, wxDefaultValidator, name)) return false; SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE)); @@ -511,7 +520,7 @@ bool wxGenericDirCtrl::Create(wxWindow *parent, m_treeCtrl = CreateTreeCtrl(this, wxID_TREECTRL, wxPoint(0,0), GetClientSize(), treeStyle); - if (!filter.empty()) + if (!filter.empty() && (style & wxDIRCTRL_SHOW_FILTERS)) m_filterListCtrl = new wxDirFilterListCtrl(this, wxID_FILTERLISTCTRL); m_defaultPath = dir; @@ -562,9 +571,9 @@ void wxGenericDirCtrl::Init() m_filterListCtrl = NULL; } -wxTreeCtrl* wxGenericDirCtrl::CreateTreeCtrl(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long treeStyle) +wxTreeCtrl* wxGenericDirCtrl::CreateTreeCtrl(wxWindow *parent, wxWindowID treeid, const wxPoint& pos, const wxSize& size, long treeStyle) { - return new wxTreeCtrl(parent, id, pos, size, treeStyle); + return new wxTreeCtrl(parent, treeid, pos, size, treeStyle); } void wxGenericDirCtrl::ShowHidden( bool show ) @@ -597,11 +606,11 @@ wxGenericDirCtrl::AddSection(const wxString& path, const wxString& name, int ima { wxDirItemData *dir_item = new wxDirItemData(path,name,true); - wxTreeItemId id = AppendItem( m_rootId, name, imageId, -1, dir_item); + wxTreeItemId treeid = AppendItem( m_rootId, name, imageId, -1, dir_item); - m_treeCtrl->SetItemHasChildren(id); + m_treeCtrl->SetItemHasChildren(treeid); - return id; + return treeid; } void wxGenericDirCtrl::SetupSections() @@ -665,8 +674,8 @@ void wxGenericDirCtrl::OnEndEditItem(wxTreeEvent &event) return; } - wxTreeItemId id = event.GetItem(); - wxDirItemData *data = (wxDirItemData*)m_treeCtrl->GetItemData( id ); + wxTreeItemId treeid = event.GetItem(); + wxDirItemData *data = GetItemData( treeid ); wxASSERT( data ); wxString new_name( wxPathOnly( data->m_path ) ); @@ -694,6 +703,46 @@ void wxGenericDirCtrl::OnEndEditItem(wxTreeEvent &event) } } +void wxGenericDirCtrl::OnTreeSelChange(wxTreeEvent &event) +{ + wxTreeEvent changedEvent(wxEVT_DIRCTRL_SELECTIONCHANGED, GetId()); + + changedEvent.SetEventObject(this); + changedEvent.SetItem(event.GetItem()); + changedEvent.SetClientObject(m_treeCtrl->GetItemData(event.GetItem())); + + if (GetEventHandler()->SafelyProcessEvent(changedEvent) && !changedEvent.IsAllowed()) + event.Veto(); + else + event.Skip(); +} + +void wxGenericDirCtrl::OnItemActivated(wxTreeEvent &event) +{ + wxTreeItemId treeid = event.GetItem(); + const wxDirItemData *data = GetItemData(treeid); + + if (data->m_isDir) + { + // is dir + event.Skip(); + } + else + { + // is file + wxTreeEvent changedEvent(wxEVT_DIRCTRL_FILEACTIVATED, GetId()); + + changedEvent.SetEventObject(this); + changedEvent.SetItem(treeid); + changedEvent.SetClientObject(m_treeCtrl->GetItemData(treeid)); + + if (GetEventHandler()->SafelyProcessEvent(changedEvent) && !changedEvent.IsAllowed()) + event.Veto(); + else + event.Skip(); + } +} + void wxGenericDirCtrl::OnExpandItem(wxTreeEvent &event) { wxTreeItemId parentId = event.GetItem(); @@ -716,7 +765,7 @@ void wxGenericDirCtrl::CollapseDir(wxTreeItemId parentId) { wxTreeItemId child; - wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(parentId); + wxDirItemData *data = GetItemData(parentId); if (!data->m_isExpanded) return; @@ -731,7 +780,7 @@ void wxGenericDirCtrl::CollapseDir(wxTreeItemId parentId) void wxGenericDirCtrl::PopulateNode(wxTreeItemId parentId) { - wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(parentId); + wxDirItemData *data = GetItemData(parentId); if (data->m_isExpanded) return; @@ -843,9 +892,9 @@ void wxGenericDirCtrl::PopulateNode(wxTreeItemId parentId) path += eachFilename; wxDirItemData *dir_item = new wxDirItemData(path,eachFilename,true); - wxTreeItemId id = AppendItem( parentId, eachFilename, + wxTreeItemId treeid = AppendItem( parentId, eachFilename, wxFileIconsTable::folder, -1, dir_item); - m_treeCtrl->SetItemImage( id, wxFileIconsTable::folder_open, + m_treeCtrl->SetItemImage( treeid, wxFileIconsTable::folder_open, wxTreeItemIcon_Expanded ); // assume that it does have children by default as it can take a long @@ -853,7 +902,7 @@ void wxGenericDirCtrl::PopulateNode(wxTreeItemId parentId) // // and if we're wrong, we'll correct the icon later if // the user really tries to open this item - m_treeCtrl->SetItemHasChildren(id); + m_treeCtrl->SetItemHasChildren(treeid); } // Add the sorted filenames @@ -922,7 +971,7 @@ wxTreeItemId wxGenericDirCtrl::FindChild(wxTreeItemId parentId, const wxString& wxTreeItemId childId = m_treeCtrl->GetFirstChild(parentId, cookie); while (childId.IsOk()) { - wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(childId); + wxDirItemData* data = GetItemData(childId); if (data && !data->m_path.empty()) { @@ -960,20 +1009,20 @@ wxTreeItemId wxGenericDirCtrl::FindChild(wxTreeItemId parentId, const wxString& bool wxGenericDirCtrl::ExpandPath(const wxString& path) { bool done = false; - wxTreeItemId id = FindChild(m_rootId, path, done); - wxTreeItemId lastId = id; // The last non-zero id - while (id.IsOk() && !done) + wxTreeItemId treeid = FindChild(m_rootId, path, done); + wxTreeItemId lastId = treeid; // The last non-zero treeid + while (treeid.IsOk() && !done) { - ExpandDir(id); + ExpandDir(treeid); - id = FindChild(id, path, done); - if (id.IsOk()) - lastId = id; + treeid = FindChild(treeid, path, done); + if (treeid.IsOk()) + lastId = treeid; } if (!lastId.IsOk()) return false; - wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(lastId); + wxDirItemData *data = GetItemData(lastId); if (data->m_isDir) { m_treeCtrl->Expand(lastId); @@ -986,7 +1035,7 @@ bool wxGenericDirCtrl::ExpandPath(const wxString& path) bool selectedChild = false; while (childId.IsOk()) { - data = (wxDirItemData*) m_treeCtrl->GetItemData(childId); + data = GetItemData(childId); if (data && data->m_path != wxEmptyString && !data->m_isDir) { @@ -1016,17 +1065,17 @@ bool wxGenericDirCtrl::ExpandPath(const wxString& path) bool wxGenericDirCtrl::CollapsePath(const wxString& path) { bool done = false; - wxTreeItemId id = FindChild(m_rootId, path, done); - wxTreeItemId lastId = id; // The last non-zero id + wxTreeItemId treeid = FindChild(m_rootId, path, done); + wxTreeItemId lastId = treeid; // The last non-zero treeid - while ( id.IsOk() && !done ) + while ( treeid.IsOk() && !done ) { - CollapseDir(id); + CollapseDir(treeid); - id = FindChild(id, path, done); + treeid = FindChild(treeid, path, done); - if ( id.IsOk() ) - lastId = id; + if ( treeid.IsOk() ) + lastId = treeid; } if ( !lastId.IsOk() ) @@ -1038,6 +1087,18 @@ bool wxGenericDirCtrl::CollapsePath(const wxString& path) return true; } +wxDirItemData* wxGenericDirCtrl::GetItemData(wxTreeItemId itemId) +{ + return static_cast(m_treeCtrl->GetItemData(itemId)); +} + +wxString wxGenericDirCtrl::GetPath(wxTreeItemId itemId) const +{ + const wxDirItemData* + data = static_cast(m_treeCtrl->GetItemData(itemId)); + + return data->m_path; +} wxString wxGenericDirCtrl::GetPath() const { @@ -1049,19 +1110,17 @@ wxString wxGenericDirCtrl::GetPath() const if (items.size() > 0) { // return first string only - wxTreeItemId id = items[0]; - wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id); - return data->m_path; + wxTreeItemId treeid = items[0]; + return GetPath(treeid); } return wxEmptyString; } - wxTreeItemId id = m_treeCtrl->GetSelection(); - if (id) + wxTreeItemId treeid = m_treeCtrl->GetSelection(); + if (treeid) { - wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id); - return data->m_path; + return GetPath(treeid); } else return wxEmptyString; @@ -1075,18 +1134,17 @@ void wxGenericDirCtrl::GetPaths(wxArrayString& paths) const m_treeCtrl->GetSelections(items); for ( unsigned n = 0; n < items.size(); n++ ) { - wxTreeItemId id = items[n]; - wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id); - paths.Add(data->m_path); + wxTreeItemId treeid = items[n]; + paths.push_back(GetPath(treeid)); } } wxString wxGenericDirCtrl::GetFilePath() const { - wxTreeItemId id = m_treeCtrl->GetSelection(); - if (id) + wxTreeItemId treeid = m_treeCtrl->GetSelection(); + if (treeid) { - wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id); + wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(treeid); if (data->m_isDir) return wxEmptyString; else @@ -1104,8 +1162,8 @@ void wxGenericDirCtrl::GetFilePaths(wxArrayString& paths) const m_treeCtrl->GetSelections(items); for ( unsigned n = 0; n < items.size(); n++ ) { - wxTreeItemId id = items[n]; - wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id); + wxTreeItemId treeid = items[n]; + wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(treeid); if ( !data->m_isDir ) paths.Add(data->m_path); } @@ -1121,20 +1179,20 @@ void wxGenericDirCtrl::SetPath(const wxString& path) void wxGenericDirCtrl::SelectPath(const wxString& path, bool select) { bool done = false; - wxTreeItemId id = FindChild(m_rootId, path, done); - wxTreeItemId lastId = id; // The last non-zero id - while ( id.IsOk() && !done ) + wxTreeItemId treeid = FindChild(m_rootId, path, done); + wxTreeItemId lastId = treeid; // The last non-zero treeid + while ( treeid.IsOk() && !done ) { - id = FindChild(id, path, done); - if ( id.IsOk() ) - lastId = id; + treeid = FindChild(treeid, path, done); + if ( treeid.IsOk() ) + lastId = treeid; } if ( !lastId.IsOk() ) return; if ( done ) { - m_treeCtrl->SelectItem(id, select); + m_treeCtrl->SelectItem(treeid, select); } } @@ -1157,9 +1215,9 @@ void wxGenericDirCtrl::UnselectAll() // Not used #if 0 -void wxGenericDirCtrl::FindChildFiles(wxTreeItemId id, int dirFlags, wxArrayString& filenames) +void wxGenericDirCtrl::FindChildFiles(wxTreeItemId treeid, int dirFlags, wxArrayString& filenames) { - wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(id); + wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(treeid); // This may take a longish time. Go to busy cursor wxBusyCursor busy; @@ -1170,7 +1228,7 @@ void wxGenericDirCtrl::FindChildFiles(wxTreeItemId id, int dirFlags, wxArrayStri wxString dirName(data->m_path); -#if defined(__WXMSW__) || defined(__OS2__) +#if defined(__WINDOWS__) || defined(__OS2__) if (dirName.Last() == ':') dirName += wxString(wxFILE_SEP_PATH); #endif @@ -1217,7 +1275,7 @@ void wxGenericDirCtrl::SetFilter(const wxString& filter) { m_filter = filter; - if (!filter.empty() && !m_filterListCtrl) + if (!filter.empty() && !m_filterListCtrl && HasFlag(wxDIRCTRL_SHOW_FILTERS)) m_filterListCtrl = new wxDirFilterListCtrl(this, wxID_FILTERLISTCTRL); else if (filter.empty() && m_filterListCtrl) { @@ -1315,7 +1373,7 @@ BEGIN_EVENT_TABLE(wxDirFilterListCtrl, wxChoice) END_EVENT_TABLE() bool wxDirFilterListCtrl::Create(wxGenericDirCtrl* parent, - const wxWindowID id, + const wxWindowID treeid, const wxPoint& pos, const wxSize& size, long style) @@ -1329,7 +1387,7 @@ bool wxDirFilterListCtrl::Create(wxGenericDirCtrl* parent, : wxBORDER_NONE; } - return wxChoice::Create(parent, id, pos, size, 0, NULL, style); + return wxChoice::Create(parent, treeid, pos, size, 0, NULL, style); } void wxDirFilterListCtrl::Init() @@ -1484,9 +1542,9 @@ IMPLEMENT_DYNAMIC_CLASS(wxFileIconsTableModule, wxModule) class wxFileIconEntry : public wxObject { public: - wxFileIconEntry(int i) { id = i; } + wxFileIconEntry(int i) { iconid = i; } - int id; + int iconid; }; wxFileIconsTable::wxFileIconsTable() @@ -1572,7 +1630,7 @@ wxImageList *wxFileIconsTable::GetSmallImageList() return m_smallImageList; } -#if wxUSE_MIMETYPE && wxUSE_IMAGE && (!defined(__WXMSW__) || wxUSE_WXDIB) +#if wxUSE_MIMETYPE && wxUSE_IMAGE && (!defined(__WINDOWS__) || wxUSE_WXDIB) // VS: we don't need this function w/o wxMimeTypesManager because we'll only have // one icon and we won't resize it @@ -1688,7 +1746,7 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) if (!extension.empty()) { wxFileIconEntry *entry = (wxFileIconEntry*) m_HashTable->Get(extension); - if (entry) return (entry -> id); + if (entry) return (entry -> iconid); } wxFileType *ft = (mime.empty()) ? @@ -1708,7 +1766,7 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) delete ft; - if ( !ic.Ok() ) + if ( !ic.IsOk() ) { int newid = file; m_HashTable->Put(extension, new wxFileIconEntry(newid)); @@ -1718,7 +1776,7 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) wxBitmap bmp; bmp.CopyFromIcon(ic); - if ( !bmp.Ok() ) + if ( !bmp.IsOk() ) { int newid = file; m_HashTable->Put(extension, new wxFileIconEntry(newid)); @@ -1727,12 +1785,12 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) const unsigned int size = 16; - int id = m_smallImageList->GetImageCount(); + int treeid = m_smallImageList->GetImageCount(); if ((bmp.GetWidth() == (int) size) && (bmp.GetHeight() == (int) size)) { m_smallImageList->Add(bmp); } -#if wxUSE_IMAGE && (!defined(__WXMSW__) || wxUSE_WXDIB) +#if wxUSE_IMAGE && (!defined(__WINDOWS__) || wxUSE_WXDIB) else { wxImage img = bmp.ConvertToImage(); @@ -1745,8 +1803,8 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) } #endif // wxUSE_IMAGE - m_HashTable->Put(extension, new wxFileIconEntry(id)); - return id; + m_HashTable->Put(extension, new wxFileIconEntry(treeid)); + return treeid; #else // !wxUSE_MIMETYPE