X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1b66e7e5ab419c5f91fc799c50addc42ef36e23b..c801d85f158c4cba50b588807daabdcbd0ed3853:/user/wxFile/dirctrl.cpp diff --git a/user/wxFile/dirctrl.cpp b/user/wxFile/dirctrl.cpp new file mode 100644 index 0000000000..54cc5b683d --- /dev/null +++ b/user/wxFile/dirctrl.cpp @@ -0,0 +1,220 @@ +/* + * Author: Robert Roebling + * + * Copyright: (C) 1997,1998 Robert Roebling + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the wxWindows Licence, which + * you have received with this library (see Licence.htm). + * + */ + +#ifdef __GNUG__ +#pragma implementation "dirctrl.h" +#endif + +#include "dirctrl.h" +#include "wx/gdicmn.h" +#include "wx/utils.h" + +//----------------------------------------------------------------------------- +// wxDirInfo +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxDirInfo,wxObject) + +wxDirInfo::wxDirInfo( const wxString &path ) +{ + m_showHidden = FALSE; + m_path = path; + if (m_path == "/") m_name ="The Computer"; + else + if (m_path == "/home") + { + m_name = "My Home"; + m_path += "/"; + char buf[300]; + wxGetHomeDir( buf ); + m_path = buf; + } + else + if (m_path == "/proc") m_name = "Info Filesystem"; + else + if (m_path == "/mnt") m_name = "Mounted Devices"; + else + if (m_path == "/usr/X11R6") m_name = "User X11"; + else + if (m_path == "/usr") m_name = "User"; + else + if (m_path == "/var") m_name = "Variables"; + else + if (m_path == "/usr/local") m_name = "User local"; + else + if (m_path == "/mnt") m_name = "Mounted Devices"; + else + m_name = wxFileNameFromPath( m_path ); +}; + +wxString wxDirInfo::GetName(void) const +{ + return m_name; +}; + +wxString wxDirInfo::GetPath(void) const +{ + return m_path; +}; + +//----------------------------------------------------------------------------- +// wxDirCtrl +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxDirCtrl,wxTreeCtrl) + +BEGIN_EVENT_TABLE(wxDirCtrl,wxTreeCtrl) + EVT_TREE_ITEM_EXPANDED (-1, wxDirCtrl::OnExpandItem) + EVT_TREE_DELETE_ITEM (-1, wxDirCtrl::OnDeleteItem) + EVT_MOUSE_EVENTS (wxDirCtrl::OnMouse) +END_EVENT_TABLE() + +wxDirCtrl::wxDirCtrl(void) +{ + m_showHidden = FALSE; +}; + +wxDirCtrl::wxDirCtrl(wxWindow *parent, const wxWindowID id, const wxString &dir, + const wxPoint& pos, const wxSize& size, + const long style, const wxString& name ) + : + wxTreeCtrl( parent, id, pos, size, style, name ) +{ + m_showHidden = FALSE; + + wxTreeItem item; + item.m_mask = wxTREE_MASK_TEXT | wxTREE_MASK_CHILDREN | wxTREE_MASK_DATA; + item.m_text = "root."; + item.m_children = 1; + wxDirInfo *info = new wxDirInfo( dir ); + item.m_data = (long)info; + + long root_id = InsertItem( 0, item ); + + info = new wxDirInfo( "/" ); + item.m_text = info->GetName(); + item.m_data = (long)info; + InsertItem( root_id, item ); + + info = new wxDirInfo( "/home" ); + item.m_text = info->GetName(); + item.m_data = (long)info; + InsertItem( root_id, item ); + + info = new wxDirInfo( "/mnt" ); + item.m_text = info->GetName(); + item.m_data = (long)info; + InsertItem( root_id, item ); + + info = new wxDirInfo( "/usr" ); + item.m_text = info->GetName(); + item.m_data = (long)info; + InsertItem( root_id, item ); + + info = new wxDirInfo( "/usr/X11R6" ); + item.m_text = info->GetName(); + item.m_data = (long)info; + InsertItem( root_id, item ); + + info = new wxDirInfo( "/usr/local" ); + item.m_text = info->GetName(); + item.m_data = (long)info; + InsertItem( root_id, item ); + + info = new wxDirInfo( "/var" ); + item.m_text = info->GetName(); + item.m_data = (long)info; + InsertItem( root_id, item ); + + info = new wxDirInfo( "/proc" ); + item.m_text = info->GetName(); + item.m_data = (long)info; + InsertItem( root_id, item ); +}; + +void wxDirCtrl::OnExpandItem( const wxTreeEvent &event ) +{ + wxDirInfo *info = (wxDirInfo *)event.m_item.m_data; + if (!info) return; + + wxArrayString slist; + wxString search,path,filename; + + search = info->GetPath(); + search += "/*"; + + path = wxFindFirstFile( search, wxDIR ); + while (!path.IsNull()) + { + filename = wxFileNameFromPath( path ); + if (m_showHidden || (filename[0] != '.')) + { + if ((filename != ".") && + (filename != "..") && + (path != "/home") && + (path != "/usr/X11R6") && + (path != "/usr/local") && + (path != "/usr") && + (path != "/var") && + (path != "/home") && + (path != "/proc") && + (path != "/mnt") + ) + slist.Add( path ); // ref counting in action ! + }; + path = wxFindNextFile(); + }; + + for (int i = 0; i < slist.Count(); i++) + { + search = slist[i]; + search += "/*"; + path = wxFindFirstFile( search, wxDIR ); + + wxDirInfo *child = new wxDirInfo( slist[i] ); + wxTreeItem item; + item.m_mask = wxTREE_MASK_TEXT | wxTREE_MASK_CHILDREN | wxTREE_MASK_DATA; + item.m_text = child->GetName(); + item.m_children = 0; + if (!path.IsNull()) item.m_children = 1; + item.m_data = (long)child; + InsertItem( event.m_item.m_itemId, item ); + }; +}; + +void wxDirCtrl::OnDeleteItem( const wxTreeEvent &event ) +{ + wxDirInfo *info = (wxDirInfo *)event.m_item.m_data; + if (info) delete info; +}; + +void wxDirCtrl::OnMouse( wxMouseEvent &event ) +{ + event.Skip(TRUE); + + if (event.LeftDown()) + { + m_dragX = event.GetX(); + m_dragY = event.GetY(); + return; + }; + + if (event.Dragging()) + { + if ((abs(m_dragX-event.GetX()) < 2) && + (abs(m_dragY-event.GetY()) < 2)) return; + + wxTextDragSource drag( this ); + drag.SetTextData( "Oh, what a drag." ); + drag.Start( event.GetX(), event.GetY() ); + }; +}; +