// Author: Harm van der Heijden and Robert Roebling
// Modified by:
// Created: 12/12/98
+// RCS-ID: $Id$
// Copyright: (c) Harm van der Heijden and Robert Roebling
-// Licence: wxWindows licence
+// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#include "wx/button.h"
#include "wx/layout.h"
#include "wx/msgdlg.h"
+#include "wx/textctrl.h"
#include "wx/textdlg.h"
#include "wx/filefn.h"
#include "wx/cmndata.h"
#include "wx/icon.h"
#include "wx/log.h"
#include "wx/sizer.h"
+#include "wx/tokenzr.h"
+#include "wx/dir.h"
#if wxUSE_STATLINE
#include "wx/statline.h"
#undef GetFirstChild
#endif
+#ifndef __WXMSW__
/* XPM */
static char * icon1_xpm[] = {
/* width height ncolors chars_per_pixel */
"16 16 6 1",
/* colors */
-" s None c None",
-". c #000000",
-"+ c #c0c0c0",
-"@ c #808080",
-"# c #ffff00",
-"$ c #ffffff",
+" s None c None",
+". c #000000",
+"+ c #c0c0c0",
+"@ c #808080",
+"# c #ffff00",
+"$ c #ffffff",
/* pixels */
" ",
" @@@@@ ",
/* width height ncolors chars_per_pixel */
"16 16 6 1",
/* colors */
-" s None c None",
-". c #000000",
-"+ c #c0c0c0",
-"@ c #808080",
-"# c #ffff00",
-"$ c #ffffff",
+" s None c None",
+". c #000000",
+"+ c #c0c0c0",
+"@ c #808080",
+"# c #ffff00",
+"$ c #ffffff",
/* pixels */
" ",
" @@@@@ ",
" ",
" "};
+#endif // !wxMSW
+
static const int ID_DIRCTRL = 1000;
static const int ID_TEXTCTRL = 1001;
static const int ID_OK = 1002;
{
m_path = path;
m_name = name;
- /* Insert logic to detect hidden files here
- * In UnixLand we just check whether the first char is a dot
+ /* Insert logic to detect hidden files here
+ * In UnixLand we just check whether the first char is a dot
* For FileNameFromPath read LastDirNameInThisPath ;-) */
// m_isHidden = (bool)(wxFileNameFromPath(*m_path)[0] == '.');
m_isHidden = FALSE;
bool wxDirItemData::HasSubDirs()
{
- wxString search = m_path + "/*";
- wxLogNull log;
- wxString path = wxFindFirstFile( search, wxDIR );
- return (bool)(!path.IsNull());
+ return wxDir(m_path).HasSubDirs();
}
//-----------------------------------------------------------------------------
m_showHidden = FALSE;
}
-wxDirCtrl::wxDirCtrl(wxWindow *parent, const wxWindowID id, const wxString &WXUNUSED(dir),
- const wxPoint& pos, const wxSize& size,
- const long style, const wxString& name )
- :
- wxTreeCtrl( parent, id, pos, size, style, wxDefaultValidator, name )
+wxDirCtrl::wxDirCtrl(wxWindow *parent,
+ const wxWindowID id,
+ const wxString &WXUNUSED(dir),
+ const wxPoint& pos,
+ const wxSize& size,
+ const long style,
+ const wxString& name )
+ : wxTreeCtrl( parent, id, pos, size, style, wxDefaultValidator, name )
{
+#ifndef __WXMSW__
m_imageListNormal = new wxImageList(16, 16, TRUE);
m_imageListNormal->Add(wxICON(icon1));
m_imageListNormal->Add(wxICON(icon2));
SetImageList(m_imageListNormal);
-
+#endif // !MSW
+
m_showHidden = FALSE;
m_rootId = AddRoot( _("Sections") );
SetItemHasChildren(m_rootId);
#define ADD_SECTION(a,b) \
if (wxPathExists((a))) { m_paths.Add( (a) ); m_names.Add( (b) ); };
-void wxDirCtrl::SetupSections()
+void wxDirCtrl::SetupSections()
{
wxString home;
m_paths.Clear();
m_names.Clear();
- ADD_SECTION(_T("/"), _("The Computer") )
+#ifdef __WXMSW__
+ // better than nothing
+ ADD_SECTION(wxT("c:\\"), _("My Harddisk") )
+#else
+ ADD_SECTION(wxT("/"), _("The Computer") )
wxGetHomeDir(&home);
ADD_SECTION(home, _("My Home") )
- ADD_SECTION(_T("/mnt"), _("Mounted Devices") )
- ADD_SECTION(_T("/usr"), _("User") )
- ADD_SECTION(_T("/usr/local"), _("User Local") )
- ADD_SECTION(_T("/var"), _("Variables") )
- ADD_SECTION(_T("/etc"), _("Etcetera") )
- ADD_SECTION(_T("/tmp"), _("Temporary") )
+ ADD_SECTION(wxT("/mnt"), _("Mounted Devices") )
+ ADD_SECTION(wxT("/usr/local"), _("User Local") )
+ ADD_SECTION(wxT("/usr"), _("User") )
+ ADD_SECTION(wxT("/var"), _("Variables") )
+ ADD_SECTION(wxT("/etc"), _("Etcetera") )
+ ADD_SECTION(wxT("/tmp"), _("Temporary") )
+#endif
}
#undef ADD_SECTION
wxDirItemData *dir_item;
// wxASSERT(m_paths.Count() == m_names.Count()); ?
-
- for (unsigned int i=0; i<m_paths.Count(); i++)
+
+ size_t count = m_paths.GetCount();
+ for ( size_t i=0; i<count; i++)
{
dir_item = new wxDirItemData(m_paths[i],m_names[i]);
- id = AppendItem( parent, m_names[i], 0, 1, dir_item);
+#ifdef __WXMSW__
+ id = AppendItem( parent, m_names[i], -1, -1, dir_item);
+#else
+ id = AppendItem( parent, m_names[i], 0, -1, dir_item);
+ SetItemImage( id, 1, wxTreeItemIcon_Expanded );
+#endif
if (dir_item->m_hasSubDirs) SetItemHasChildren(id);
}
}
event.Veto();
return;
}
-
+
// don't rename the individual sections
if (GetParent( event.GetItem() ) == m_rootId)
{
if ((event.GetLabel().IsEmpty()) ||
(event.GetLabel() == _(".")) ||
(event.GetLabel() == _("..")) ||
- (event.GetLabel().First( _T("/") ) != wxNOT_FOUND))
+ (event.GetLabel().First( wxT("/") ) != wxNOT_FOUND))
{
wxMessageDialog dialog(this, _("Illegal directory name."), _("Error"), wxOK | wxICON_ERROR );
- dialog.ShowModal();
+ dialog.ShowModal();
event.Veto();
- return;
+ return;
}
wxTreeItemId id = event.GetItem();
wxDirItemData *data = (wxDirItemData*)GetItemData( id );
wxASSERT( data );
-
+
wxString new_name( wxPathOnly( data->m_path ) );
- new_name += _T("/");
+ new_name += wxT("/");
new_name += event.GetLabel();
-
+
wxLogNull log;
-
+
if (wxFileExists(new_name))
{
wxMessageDialog dialog(this, _("File name exists already."), _("Error"), wxOK | wxICON_ERROR );
- dialog.ShowModal();
+ dialog.ShowModal();
event.Veto();
}
-
+
if (wxRenameFile(data->m_path,new_name))
{
data->SetNewDirName( new_name );
else
{
wxMessageDialog dialog(this, _("Operation not permitted."), _("Error"), wxOK | wxICON_ERROR );
- dialog.ShowModal();
+ dialog.ShowModal();
event.Veto();
}
}
wxBeginBusyCursor();
wxDirItemData *data = (wxDirItemData *)GetItemData(event.GetItem());
- wxASSERT(data);
-
- wxString search,path,filename;
m_paths.Clear();
m_names.Clear();
- search = data->m_path + "/*";
- for (path = wxFindFirstFile( search, wxDIR ); !path.IsNull();
- path=wxFindNextFile() )
+
+ wxString path = data->m_path;
+
+ wxDir dir(path);
+
+ path += _T('/');
+
+ wxString filename;
+ bool cont = dir.GetFirst(&filename, "", wxDIR_DIRS | wxDIR_HIDDEN);
+ while ( cont )
{
- filename = wxFileNameFromPath( path );
- /* Don't add "." and ".." to the tree. I think wxFindNextFile
- * also checks this, but I don't quite understand what happens
- * there. Also wxFindNextFile seems to swallow hidden dirs */
- if ((filename != ".") && (filename != ".."))
- {
- m_paths.Add(path);
- m_names.Add(filename);
- }
+ m_paths.Add(path + filename);
+ m_names.Add(filename);
+
+ cont = dir.GetNext(&filename);
}
-
+
CreateItems( event.GetItem() );
SortChildren( event.GetItem() );
-
+
wxEndBusyCursor();
}
/* Workaround because DeleteChildren has disapeared (why?) and
* CollapseAndReset doesn't work as advertised (deletes parent too) */
child = GetFirstChild(parent, cookie);
- while (child.IsOk())
+ while (child.IsOk())
{
Delete(child);
- /* Not GetNextChild below, because the cookie mechanism can't
+ /* Not GetNextChild below, because the cookie mechanism can't
* handle disappearing children! */
child = GetFirstChild(parent, cookie);
}
//-----------------------------------------------------------------------------
-#if !USE_SHARED_LIBRARY
-IMPLEMENT_CLASS(wxDirDialog, wxDialog)
-#else
IMPLEMENT_DYNAMIC_CLASS( wxDirDialog, wxDialog )
-#endif
BEGIN_EVENT_TABLE( wxDirDialog, wxDialog )
EVT_TREE_KEY_DOWN (ID_DIRCTRL, wxDirDialog::OnTreeKeyDown)
// EVT_CHECKBOX (ID_CHECK, wxDirDialog::OnCheck)
END_EVENT_TABLE()
-wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message,
- const wxString& defaultPath, long style,
- const wxPoint& pos) :
- wxDialog(parent, -1, message, pos, wxSize(300,300),
- wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
+wxDirDialog::wxDirDialog(wxWindow *parent,
+ const wxString& message,
+ const wxString& defaultPath,
+ long style,
+ const wxPoint& pos)
+ : wxDialog(parent, -1, message, pos, wxSize(300,300),
+ wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
{
m_message = message;
m_dialogStyle = style;
m_parent = parent;
-
+
m_path = defaultPath;
-
+
wxBeginBusyCursor();
-
+
wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
// 1) dir ctrl
- m_dir = new wxDirCtrl( this, ID_DIRCTRL, "/", wxDefaultPosition, wxSize(200,200),
- wxTR_HAS_BUTTONS | wxSUNKEN_BORDER | wxTR_EDIT_LABELS);
+ m_dir = new wxDirCtrl( this, ID_DIRCTRL, _T("/"),
+ wxDefaultPosition,
+ wxSize(200,200),
+ wxTR_HAS_BUTTONS |
+ wxSUNKEN_BORDER |
+ wxTR_EDIT_LABELS );
topsizer->Add( m_dir, 1, wxTOP|wxLEFT|wxRIGHT | wxEXPAND, 10 );
-
+
// 2) text ctrl
- m_input = new wxTextCtrl( this, ID_TEXTCTRL, m_path, wxDefaultPosition );
+ m_input = new wxTextCtrl( this, ID_TEXTCTRL, m_path, wxDefaultPosition );
topsizer->Add( m_input, 0, wxTOP|wxLEFT|wxRIGHT | wxEXPAND, 10 );
-
+
// m_check = new wxCheckBox( this, ID_CHECK, _("Show hidden") );
// m_check->SetValue(TRUE);
-
+
#if wxUSE_STATLINE
// 3) static line
topsizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 );
buttonsizer->Add( m_cancel, 0, wxLEFT|wxRIGHT, 10 );
m_new = new wxButton( this, ID_NEW, _("New...") );
buttonsizer->Add( m_new, 0, wxLEFT|wxRIGHT, 10 );
-
+
topsizer->Add( buttonsizer, 0, wxALL | wxCENTER, 10 );
m_ok->SetDefault();
m_dir->SetFocus();
-
+
SetAutoLayout( TRUE );
SetSizer( topsizer );
-
+
topsizer->SetSizeHints( this );
topsizer->Fit( this );
Centre( wxBOTH );
+ if (m_path == wxT("~"))
+ wxGetHomeDir( &m_path );
+
+ // choose the directory corresponding to defaultPath in the tree
+ // VZ: using wxStringTokenizer is probably unsafe here (escaped slashes
+ // will not be processed correctly...)
+ wxStringTokenizer tk(m_path, wxFILE_SEP_PATH, wxTOKEN_STRTOK);
+
+ wxString path;
+
+ long cookie = 0;
+ // default to root dir
+ wxTreeItemId item = m_dir->GetFirstChild(m_dir->GetRootItem(), cookie);
+
+ if (!m_path.IsEmpty() && (m_path != wxT("/")) && (m_dir->m_paths.Count() > 1))
+ {
+ size_t count = m_dir->m_paths.GetCount();
+ for ( size_t i=1; i<count; i++)
+ {
+ if (m_path.Find( m_dir->m_paths[i] ) == 0)
+ {
+ path = m_dir->m_paths[i];
+
+ for (size_t j = 0; j < i; j++)
+ item = m_dir->GetNextChild(m_dir->GetRootItem(), cookie);
+
+ wxStringTokenizer tk2(path, wxFILE_SEP_PATH, wxTOKEN_STRTOK);
+ for (size_t h = 0; h < tk2.CountTokens(); h++)
+ tk.GetNextToken();
+
+ break;
+ }
+ }
+ }
+ while ( tk.HasMoreTokens() && item.IsOk() )
+ {
+ path << wxFILE_SEP_PATH << tk.GetNextToken();
+
+ m_dir->Expand(item);
+
+ wxTreeItemId child = m_dir->GetFirstChild(item, cookie);
+ while ( child.IsOk() )
+ {
+ wxDirItemData *data = (wxDirItemData*)m_dir->GetItemData(child);
+ if ( data->m_path == path )
+ break;
+
+ child = m_dir->GetNextChild(item, cookie);
+ }
+
+ item = child;
+ }
+
+ if ( item.IsOk() )
+ {
+ m_dir->Expand(item);
+ m_dir->SelectItem(item);
+ m_dir->EnsureVisible(item);
+ }
+
wxEndBusyCursor();
}
void wxDirDialog::OnTreeSelected( wxTreeEvent &event )
{
wxDirItemData *data = (wxDirItemData*)m_dir->GetItemData(event.GetItem());
- if (data)
+ if (data)
m_input->SetValue( data->m_path );
};
void wxDirDialog::OnTreeKeyDown( wxTreeEvent &WXUNUSED(event) )
{
wxDirItemData *data = (wxDirItemData*)m_dir->GetItemData(m_dir->GetSelection());
- if (data)
+ if (data)
m_input->SetValue( data->m_path );
};
else {
// Trouble...
msg = _("Failed to create directory ")+m_path+
- _("\n(Do you have the required permissions?)");
+ _("\n(Do you have the required permissions?)");
wxMessageDialog errmsg(this, msg, _("Error creating directory"), wxOK | wxICON_ERROR);
errmsg.ShowModal();
// We still don't have a valid dir. Back to the main dialog.
if ((id == m_dir->GetRootItem()) ||
(m_dir->GetParent(id) == m_dir->GetRootItem()))
{
- wxMessageDialog msg(this, _("You cannot add a new directory to this section."),
- _("Create directory"), wxOK | wxICON_INFORMATION );
+ wxMessageDialog msg(this, _("You cannot add a new directory to this section."),
+ _("Create directory"), wxOK | wxICON_INFORMATION );
msg.ShowModal();
return;
}
wxTreeItemId parent = m_dir->GetParent( id );
wxDirItemData *data = (wxDirItemData*)m_dir->GetItemData( parent );
wxASSERT( data );
-
- wxString new_name( _T("NewName") );
+
+ wxString new_name( wxT("NewName") );
wxString path( data->m_path );
- path += _T( "/" );
+ path += wxT("/");
path += new_name;
if (wxFileExists(path))
{
// try NewName0, NewName1 etc.
int i = 0;
- do {
- new_name = _T("NewName");
- wxString num;
- num.Printf( "%d", i );
- new_name += num;
-
+ do {
+ new_name = wxT("NewName");
+ wxString num;
+ num.Printf( wxT("%d"), i );
+ new_name += num;
+
path = data->m_path;
- path += _T( "/" );
+ path += wxT("/");
path += new_name;
- i++;
- } while (wxFileExists(path));
+ i++;
+ } while (wxFileExists(path));
}
-
+
wxLogNull log;
- if (!wxMkdir(path))
+ if (!wxMkdir(path))
{
wxMessageDialog dialog(this, _("Operation not permitted."), _("Error"), wxOK | wxICON_ERROR );
- dialog.ShowModal();
+ dialog.ShowModal();
return;
}
}
*/
-#endif
+#endif // wxUSE_DIRDLG