#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"
#include "wx/osx/private.h" // includes mac headers
#endif
-#ifdef __WXMSW__
+#ifdef __WINDOWS__
#include <windows.h>
#include "wx/msw/winundef.h"
#include "wx/volume.h"
#include <ctype.h>
#endif
-#endif
+#endif // __WINDOWS__
#if defined(__OS2__) || defined(__DOS__)
#ifdef __OS2__
bool wxIsDriveAvailable(const wxString& dirName);
+// ----------------------------------------------------------------------------
+// events
+// ----------------------------------------------------------------------------
+
+wxDEFINE_EVENT( wxEVT_DIRCTRL_CHANGED, wxTreeEvent );
+
// ----------------------------------------------------------------------------
// wxGetAvailableDrives, for WINDOWS, DOS, OS2, MAC, UNIX (returns "/")
// ----------------------------------------------------------------------------
}
}
-#elif defined(__UNIX__) || defined(__WXPALMOS__)
+#elif defined(__UNIX__)
paths.Add(wxT("/"));
names.Add(wxT("/"));
icon_ids.Add(wxFileIconsTable::computer);
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
#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
// 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)
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_SIZE (wxGenericDirCtrl::OnSize)
END_EVENT_TABLE()
}
bool wxGenericDirCtrl::Create(wxWindow *parent,
- const wxWindowID id,
+ const wxWindowID treeid,
const wxString& dir,
const wxPoint& pos,
const wxSize& size,
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));
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;
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 )
{
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()
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 ) );
}
}
+void wxGenericDirCtrl::OnTreeSelChange(wxTreeEvent &event)
+{
+ wxTreeEvent changedEvent(wxEVT_DIRCTRL_CHANGED, 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::OnExpandItem(wxTreeEvent &event)
{
wxTreeItemId parentId = event.GetItem();
// 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 )
{
wxTreeItemId child;
- wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(parentId);
+ wxDirItemData *data = GetItemData(parentId);
if (!data->m_isExpanded)
return;
m_treeCtrl->Thaw();
}
-void wxGenericDirCtrl::ExpandDir(wxTreeItemId parentId)
+void wxGenericDirCtrl::PopulateNode(wxTreeItemId parentId)
{
- wxDirItemData *data = (wxDirItemData *) m_treeCtrl->GetItemData(parentId);
+ wxDirItemData *data = GetItemData(parentId);
if (data->m_isExpanded)
return;
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++)
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
// 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);
+ m_treeCtrl->SetItemHasChildren(treeid);
}
// Add the sorted filenames
}
}
+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());
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())
{
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);
bool selectedChild = false;
while (childId.IsOk())
{
- data = (wxDirItemData*) m_treeCtrl->GetItemData(childId);
+ data = GetItemData(childId);
if (data && data->m_path != wxEmptyString && !data->m_isDir)
{
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() )
return true;
}
+wxDirItemData* wxGenericDirCtrl::GetItemData(wxTreeItemId itemId)
+{
+ return static_cast<wxDirItemData*>(m_treeCtrl->GetItemData(itemId));
+}
+
+wxString wxGenericDirCtrl::GetPath(wxTreeItemId itemId) const
+{
+ const wxDirItemData*
+ data = static_cast<wxDirItemData*>(m_treeCtrl->GetItemData(itemId));
+
+ return data->m_path;
+}
wxString wxGenericDirCtrl::GetPath() const
{
- wxTreeItemId id = m_treeCtrl->GetSelection();
- if (id)
+ // Allow calling GetPath() in multiple selection from OnSelFilter
+ if (m_treeCtrl->HasFlag(wxTR_MULTIPLE))
{
- wxDirItemData* data = (wxDirItemData*) m_treeCtrl->GetItemData(id);
- return data->m_path;
+ wxArrayTreeItemIds items;
+ m_treeCtrl->GetSelections(items);
+ if (items.size() > 0)
+ {
+ // return first string only
+ wxTreeItemId treeid = items[0];
+ return GetPath(treeid);
+ }
+
+ return wxEmptyString;
+ }
+
+ wxTreeItemId treeid = m_treeCtrl->GetSelection();
+ if (treeid)
+ {
+ return GetPath(treeid);
}
else
return wxEmptyString;
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
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);
}
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);
}
}
// 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;
wxString dirName(data->m_path);
-#if defined(__WXMSW__) || defined(__OS2__)
+#if defined(__WINDOWS__) || defined(__OS2__)
if (dirName.Last() == ':')
dirName += wxString(wxFILE_SEP_PATH);
#endif
{
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)
{
END_EVENT_TABLE()
bool wxDirFilterListCtrl::Create(wxGenericDirCtrl* parent,
- const wxWindowID id,
+ const wxWindowID treeid,
const wxPoint& pos,
const wxSize& size,
long style)
: 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()
{
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)
#ifndef __WXGTK20__
/* Computer (c) Julian Smart */
-static const char * file_icons_tbl_computer_xpm[] = {
+static const char* const file_icons_tbl_computer_xpm[] = {
/* columns rows colors chars-per-pixel */
"16 16 42 1",
"r c #4E7FD0",
bool OnInit() { wxTheFileIconsTable = new wxFileIconsTable; return true; }
void OnExit()
{
- if (wxTheFileIconsTable)
- {
- delete wxTheFileIconsTable;
- wxTheFileIconsTable = NULL;
- }
+ wxDELETE(wxTheFileIconsTable);
}
};
class wxFileIconEntry : public wxObject
{
public:
- wxFileIconEntry(int i) { id = i; }
+ wxFileIconEntry(int i) { iconid = i; }
- int id;
+ int iconid;
};
wxFileIconsTable::wxFileIconsTable()
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
if (!extension.empty())
{
wxFileIconEntry *entry = (wxFileIconEntry*) m_HashTable->Get(extension);
- if (entry) return (entry -> id);
+ if (entry) return (entry -> iconid);
}
wxFileType *ft = (mime.empty()) ?
delete ft;
- if ( !ic.Ok() )
+ if ( !ic.IsOk() )
{
int newid = file;
m_HashTable->Put(extension, new wxFileIconEntry(newid));
wxBitmap bmp;
bmp.CopyFromIcon(ic);
- if ( !bmp.Ok() )
+ if ( !bmp.IsOk() )
{
int newid = file;
m_HashTable->Put(extension, new wxFileIconEntry(newid));
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();
}
#endif // wxUSE_IMAGE
- m_HashTable->Put(extension, new wxFileIconEntry(id));
- return id;
+ m_HashTable->Put(extension, new wxFileIconEntry(treeid));
+ return treeid;
#else // !wxUSE_MIMETYPE