/* * 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() ); }; };