#include "wx/icon.h"
#include "wx/settings.h"
#include "wx/msgdlg.h"
- #include "wx/cmndata.h"
#include "wx/choice.h"
#include "wx/textctrl.h"
#include "wx/layout.h"
// wxGenericDirCtrl
//-----------------------------------------------------------------------------
-
-#if wxUSE_EXTENDED_RTTI
-WX_DEFINE_FLAGS( wxGenericDirCtrlStyle )
-
-wxBEGIN_FLAGS( wxGenericDirCtrlStyle )
- // new style border flags, we put them first to
- // use them for streaming out
- wxFLAGS_MEMBER(wxBORDER_SIMPLE)
- wxFLAGS_MEMBER(wxBORDER_SUNKEN)
- wxFLAGS_MEMBER(wxBORDER_DOUBLE)
- wxFLAGS_MEMBER(wxBORDER_RAISED)
- wxFLAGS_MEMBER(wxBORDER_STATIC)
- wxFLAGS_MEMBER(wxBORDER_NONE)
-
- // old style border flags
- wxFLAGS_MEMBER(wxSIMPLE_BORDER)
- wxFLAGS_MEMBER(wxSUNKEN_BORDER)
- wxFLAGS_MEMBER(wxDOUBLE_BORDER)
- wxFLAGS_MEMBER(wxRAISED_BORDER)
- wxFLAGS_MEMBER(wxSTATIC_BORDER)
- wxFLAGS_MEMBER(wxBORDER)
-
- // standard window styles
- wxFLAGS_MEMBER(wxTAB_TRAVERSAL)
- wxFLAGS_MEMBER(wxCLIP_CHILDREN)
- wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW)
- wxFLAGS_MEMBER(wxWANTS_CHARS)
- wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE)
- wxFLAGS_MEMBER(wxALWAYS_SHOW_SB )
- wxFLAGS_MEMBER(wxVSCROLL)
- wxFLAGS_MEMBER(wxHSCROLL)
-
- wxFLAGS_MEMBER(wxDIRCTRL_DIR_ONLY)
- wxFLAGS_MEMBER(wxDIRCTRL_3D_INTERNAL)
- wxFLAGS_MEMBER(wxDIRCTRL_SELECT_FIRST)
- wxFLAGS_MEMBER(wxDIRCTRL_MULTIPLE)
-
-wxEND_FLAGS( wxGenericDirCtrlStyle )
-
-IMPLEMENT_DYNAMIC_CLASS_XTI(wxGenericDirCtrl, wxControl,"wx/dirctrl.h")
-
-wxBEGIN_PROPERTIES_TABLE(wxGenericDirCtrl)
- wxHIDE_PROPERTY( Children )
- wxPROPERTY( DefaultPath , wxString , SetDefaultPath , GetDefaultPath , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
- wxPROPERTY( Filter , wxString , SetFilter , GetFilter , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group") )
- wxPROPERTY( DefaultFilter , int , SetFilterIndex, GetFilterIndex, EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group") )
- wxPROPERTY_FLAGS( WindowStyle, wxGenericDirCtrlStyle, long, SetWindowStyleFlag, GetWindowStyleFlag, EMPTY_MACROVALUE , 0, wxT("Helpstring"), wxT("group") )
-wxEND_PROPERTIES_TABLE()
-
-wxBEGIN_HANDLERS_TABLE(wxGenericDirCtrl)
-wxEND_HANDLERS_TABLE()
-
-wxCONSTRUCTOR_8( wxGenericDirCtrl , wxWindow* , Parent , wxWindowID , Id , wxString , DefaultPath ,
- wxPoint , Position , wxSize , Size , long , WindowStyle , wxString , Filter , int , DefaultFilter )
-#else
-IMPLEMENT_DYNAMIC_CLASS(wxGenericDirCtrl, wxControl)
-#endif
-
BEGIN_EVENT_TABLE(wxGenericDirCtrl, wxControl)
EVT_TREE_ITEM_EXPANDING (wxID_TREECTRL, wxGenericDirCtrl::OnExpandItem)
EVT_TREE_ITEM_COLLAPSED (wxID_TREECTRL, wxGenericDirCtrl::OnCollapseItem)
// ctor when wxTR_HIDE_ROOT was specified
if (!m_rootId.IsOk())
-
m_rootId = m_treeCtrl->GetRootItem();
ExpandDir(parentId);
- if ( m_treeCtrl->GetChildrenCount(parentId, false) == 0 )
- {
- m_treeCtrl->SetItemHasChildren(parentId, false);
- }
}
void wxGenericDirCtrl::OnCollapseItem(wxTreeEvent &event )
m_treeCtrl->Thaw();
}
-void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId)
+void wxGenericDirCtrl::PopulateNode(wxTreeItemId parentId)
{
wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(parentId);
filenames.Sort(wxDirCtrlStringCompareFunction);
}
+ // Now we really know whether we have any children so tell the tree control
+ // about it.
+ m_treeCtrl->SetItemHasChildren(parentId, !dirs.empty() || !filenames.empty());
+
// Add the sorted dirs
size_t i;
for (i = 0; i < dirs.GetCount(); i++)
// assume that it does have children by default as it can take a long
// time to really check for this (think remote drives...)
//
- // and if we're wrong, we'll correct it later in OnExpandItem() if
+ // and if we're wrong, we'll correct the icon later if
// the user really tries to open this item
m_treeCtrl->SetItemHasChildren(id);
}
}
}
+void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId)
+{
+ // ExpandDir() will not actually expand the tree node, just populate it
+ PopulateNode(parentId);
+}
+
void wxGenericDirCtrl::ReCreateTree()
{
CollapseDir(m_treeCtrl->GetRootItem());
wxString wxGenericDirCtrl::GetPath() const
{
+ // Allow calling GetPath() in multiple selection from OnSelFilter
+ if (m_treeCtrl->HasFlag(wxTR_MULTIPLE))
+ {
+ wxArrayTreeItemIds items;
+ m_treeCtrl->GetSelections(items);
+ if (items.size() > 0)
+ {
+ // return first string only
+ wxTreeItemId id = items[0];
+ wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id);
+ return data->m_path;
+ }
+
+ return wxEmptyString;
+ }
+
wxTreeItemId id = m_treeCtrl->GetSelection();
if (id)
{
{
int sel = GetSelection();
- wxString currentPath = m_dirCtrl->GetPath();
+ if (m_dirCtrl->HasFlag(wxDIRCTRL_MULTIPLE))
+ {
+ wxArrayString paths;
+ m_dirCtrl->GetPaths(paths);
- m_dirCtrl->SetFilterIndex(sel);
+ m_dirCtrl->SetFilterIndex(sel);
- // If the filter has changed, the view is out of date, so
- // collapse the tree.
- m_dirCtrl->ReCreateTree();
+ // If the filter has changed, the view is out of date, so
+ // collapse the tree.
+ m_dirCtrl->ReCreateTree();
- // Try to restore the selection, or at least the directory
- m_dirCtrl->ExpandPath(currentPath);
+ // Expand and select the previously selected paths
+ for (unsigned int i = 0; i < paths.GetCount(); i++)
+ {
+ m_dirCtrl->ExpandPath(paths.Item(i));
+ }
+ }
+ else
+ {
+ wxString currentPath = m_dirCtrl->GetPath();
+
+ m_dirCtrl->SetFilterIndex(sel);
+ m_dirCtrl->ReCreateTree();
+
+ // Try to restore the selection, or at least the directory
+ m_dirCtrl->ExpandPath(currentPath);
+ }
}
void wxDirFilterListCtrl::FillFilterList(const wxString& filter, int defaultFilter)