]> git.saurik.com Git - wxWidgets.git/blobdiff - user/wxFile/dirctrl.cpp
Initial revision
[wxWidgets.git] / user / wxFile / dirctrl.cpp
diff --git a/user/wxFile/dirctrl.cpp b/user/wxFile/dirctrl.cpp
new file mode 100644 (file)
index 0000000..54cc5b6
--- /dev/null
@@ -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() );
+  };
+};
+