From dc6c62a931cd31cff4bd7c621301d443a41dee5c Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Sun, 15 Aug 1999 15:18:54 +0000 Subject: [PATCH] Added and corrected a few more html makefiles, Corrected wrong buffer size in menu code, Turned wxDirDlgg from functional to cool, Found a few esoteric bugs in wxListCtrl and wxTreeCtrl on the way git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3387 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- Makefile.in | 28 +- configure.in | 3 + distrib/msw/tmake/unx.t | 26 +- include/wx/generic/dirdlgg.h | 76 ++++- samples/dialogs/Makefile.in | 2 +- samples/html/printing/Makefile.in | 3 +- samples/html/virtual/.cvsignore | 1 - samples/html/virtual/Makefile.am | 9 - samples/html/virtual/Makefile.in | 23 ++ samples/html/widget/.cvsignore | 1 - samples/html/widget/Makefile.am | 9 - samples/html/widget/Makefile.in | 23 ++ samples/html/zip/.cvsignore | 1 - samples/html/zip/Makefile.am | 9 - samples/html/zip/Makefile.in | 23 ++ src/generic/choicdgg.cpp | 5 +- src/generic/dirdlgg.cpp | 479 ++++++++++++++++-------------- src/generic/listctrl.cpp | 10 + src/generic/treectrl.cpp | 25 +- src/gtk/menu.cpp | 2 +- src/gtk1/menu.cpp | 2 +- 21 files changed, 452 insertions(+), 308 deletions(-) delete mode 100644 samples/html/virtual/Makefile.am create mode 100644 samples/html/virtual/Makefile.in delete mode 100644 samples/html/widget/Makefile.am create mode 100644 samples/html/widget/Makefile.in delete mode 100644 samples/html/zip/Makefile.am create mode 100644 samples/html/zip/Makefile.in diff --git a/Makefile.in b/Makefile.in index c74ae9c87a..ad0e8f9ce3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,6 +1,6 @@ # -# This file was automatically generated by tmake at 11:55, 1999/08/14 +# This file was automatically generated by tmake at 20:13, 1999/08/14 # DO NOT CHANGE THIS FILE, YOUR CHANGES WILL BE LOST! CHANGE UNX.T! # @@ -1197,19 +1197,19 @@ REQUIRED_DIRS = ./lib ./src ./src/common ./src/gtk ./src/motif ./src/msw \ all: $(REQUIRED_DIRS) $(OBJECTS) @WX_TARGET_LIBRARY@ @WX_CREATE_LINKS@ $(REQUIRED_DIRS): $(WXDIR)/include/wx/defs.h $(WXDIR)/include/wx/object.h $(WXDIR)/include/wx/setup.h - mkdir -p ./lib - mkdir -p ./src - mkdir -p ./src/common - mkdir -p ./src/msw - mkdir -p ./src/gtk - mkdir -p ./src/motif - mkdir -p ./src/motif/xmcombo - mkdir -p ./src/generic - mkdir -p ./src/unix - mkdir -p ./src/html - mkdir -p ./src/png - mkdir -p ./src/jpeg - mkdir -p ./src/zlib + @mkdir -p ./lib + @mkdir -p ./src + @mkdir -p ./src/common + @mkdir -p ./src/msw + @mkdir -p ./src/gtk + @mkdir -p ./src/motif + @mkdir -p ./src/motif/xmcombo + @mkdir -p ./src/generic + @mkdir -p ./src/unix + @mkdir -p ./src/html + @mkdir -p ./src/png + @mkdir -p ./src/jpeg + @mkdir -p ./src/zlib @WX_LIBRARY_NAME_STATIC@: $(OBJECTS) $(AR) $(AROPTIONS) ./lib/$@ $(OBJECTS) diff --git a/configure.in b/configure.in index 13fdd3092c..664487763a 100644 --- a/configure.in +++ b/configure.in @@ -2733,6 +2733,9 @@ AC_OUTPUT([ samples/html/help/Makefile samples/html/printing/Makefile samples/html/test/Makefile + samples/html/zip/Makefile + samples/html/virtual/Makefile + samples/html/widget/Makefile utils/Makefile utils/wxMMedia2/Makefile utils/wxMMedia2/lib/Makefile diff --git a/distrib/msw/tmake/unx.t b/distrib/msw/tmake/unx.t index 312eef8eee..4293522b84 100644 --- a/distrib/msw/tmake/unx.t +++ b/distrib/msw/tmake/unx.t @@ -403,19 +403,19 @@ REQUIRED_DIRS = ./lib ./src ./src/common ./src/gtk ./src/motif ./src/msw \ all: $(REQUIRED_DIRS) $(OBJECTS) @WX_TARGET_LIBRARY@ @WX_CREATE_LINKS@ $(REQUIRED_DIRS): $(WXDIR)/include/wx/defs.h $(WXDIR)/include/wx/object.h $(WXDIR)/include/wx/setup.h - mkdir -p ./lib - mkdir -p ./src - mkdir -p ./src/common - mkdir -p ./src/msw - mkdir -p ./src/gtk - mkdir -p ./src/motif - mkdir -p ./src/motif/xmcombo - mkdir -p ./src/generic - mkdir -p ./src/unix - mkdir -p ./src/html - mkdir -p ./src/png - mkdir -p ./src/jpeg - mkdir -p ./src/zlib + @mkdir -p ./lib + @mkdir -p ./src + @mkdir -p ./src/common + @mkdir -p ./src/msw + @mkdir -p ./src/gtk + @mkdir -p ./src/motif + @mkdir -p ./src/motif/xmcombo + @mkdir -p ./src/generic + @mkdir -p ./src/unix + @mkdir -p ./src/html + @mkdir -p ./src/png + @mkdir -p ./src/jpeg + @mkdir -p ./src/zlib @WX_LIBRARY_NAME_STATIC@: $(OBJECTS) $(AR) $(AROPTIONS) ./lib/$@ $(OBJECTS) diff --git a/include/wx/generic/dirdlgg.h b/include/wx/generic/dirdlgg.h index 675bf147b1..f42f9bffac 100644 --- a/include/wx/generic/dirdlgg.h +++ b/include/wx/generic/dirdlgg.h @@ -76,14 +76,62 @@ class wxDirItemData; class wxDirCtrl; class wxDirDialog; +//----------------------------------------------------------------------------- +// wxDirItemData +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxDirItemData : public wxTreeItemData +{ +public: + wxDirItemData(wxString& path, wxString& name); + ~wxDirItemData(); + bool HasSubDirs(); + void SetNewDirName( wxString path ); + wxString m_path, m_name; + bool m_isHidden; + bool m_hasSubDirs; +}; + +//----------------------------------------------------------------------------- +// wxDirCtrl +//----------------------------------------------------------------------------- + +class WXDLLEXPORT wxDirCtrl: public wxTreeCtrl +{ +public: + bool m_showHidden; + wxTreeItemId m_rootId; + + wxDirCtrl(); + wxDirCtrl(wxWindow *parent, const wxWindowID id = -1, + const wxString &dir = "/", + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + const long style = wxTR_HAS_BUTTONS, + const wxString& name = "wxTreeCtrl" ); + void ShowHidden( const bool yesno ); + void OnExpandItem(wxTreeEvent &event ); + void OnCollapseItem(wxTreeEvent &event ); + void OnBeginEditItem(wxTreeEvent &event ); + void OnEndEditItem(wxTreeEvent &event ); + +protected: + void CreateItems(const wxTreeItemId &parent); + void SetupSections(); + wxArrayString m_paths, m_names; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxDirCtrl) +}; + //----------------------------------------------------------------------------- // wxDirDialog //----------------------------------------------------------------------------- class WXDLLEXPORT wxDirDialog: public wxDialog { - DECLARE_DYNAMIC_CLASS(wxDirDialog) - public: +public: wxDirDialog(wxWindow *parent, const wxString& message = wxFileSelectorPromptStr, const wxString& defaultPath = wxEmptyString, @@ -100,24 +148,24 @@ class WXDLLEXPORT wxDirDialog: public wxDialog void OnTreeSelected( wxTreeEvent &event ); void OnTreeKeyDown( wxTreeEvent &event ); - void OnSize(wxSizeEvent& event); void OnOK(wxCommandEvent& event); void OnCancel(wxCommandEvent& event); void OnNew(wxCommandEvent& event); // void OnCheck(wxCommandEvent& event); - DECLARE_EVENT_TABLE() - protected: +protected: // implementation - wxString m_message; - long m_dialogStyle; - wxWindow * m_parent; - wxString m_path; - wxDirCtrl *m_dir; - wxTextCtrl *m_input; - // wxCheckBox *m_check; - wxButton *m_ok, *m_cancel, *m_new; - void doSize(); + wxString m_message; + long m_dialogStyle; + wxString m_path; + wxDirCtrl *m_dir; + wxTextCtrl *m_input; + wxCheckBox *m_check; // not yet used + wxButton *m_ok, *m_cancel, *m_new; + +private: + DECLARE_EVENT_TABLE() + DECLARE_DYNAMIC_CLASS(wxDirDialog) }; #endif diff --git a/samples/dialogs/Makefile.in b/samples/dialogs/Makefile.in index 63a8b4ce34..ac0f1c29f5 100644 --- a/samples/dialogs/Makefile.in +++ b/samples/dialogs/Makefile.in @@ -11,7 +11,7 @@ top_srcdir = @top_srcdir@ top_builddir = ../.. -program_dir = samples/samples/dialogs +program_dir = samples/dialogs PROGRAM=dialogs diff --git a/samples/html/printing/Makefile.in b/samples/html/printing/Makefile.in index 133be35a8d..5bd7d8beca 100644 --- a/samples/html/printing/Makefile.in +++ b/samples/html/printing/Makefile.in @@ -11,8 +11,9 @@ top_srcdir = @top_srcdir@ top_builddir = ../../.. +program_dir = samples/html/printing -VPATH = :$(top_srcdir)/samples/html/printing +DATAFILES = test.htm pic.png PROGRAM=printing diff --git a/samples/html/virtual/.cvsignore b/samples/html/virtual/.cvsignore index 70845e08eb..e69de29bb2 100644 --- a/samples/html/virtual/.cvsignore +++ b/samples/html/virtual/.cvsignore @@ -1 +0,0 @@ -Makefile.in diff --git a/samples/html/virtual/Makefile.am b/samples/html/virtual/Makefile.am deleted file mode 100644 index e5fe674b3e..0000000000 --- a/samples/html/virtual/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -AUTOMAKE_OPTIONS = 1.3 no-dependencies - -SUFFIXES = .cpp - -DEFS = @DEFS@ $(TOOLKIT_DEF) $(WXDEBUG_DEFINE) - -noinst_PROGRAMS = virtual - -virtual_SOURCES = virtual.cpp diff --git a/samples/html/virtual/Makefile.in b/samples/html/virtual/Makefile.in new file mode 100644 index 0000000000..0b660a7b83 --- /dev/null +++ b/samples/html/virtual/Makefile.in @@ -0,0 +1,23 @@ +# +# File: Makefile.in +# Author: Julian Smart +# Created: 1998 +# Updated: +# Copyright: (c) 1998 Julian Smart +# +# "%W% %G%" +# +# Makefile for html virtual example (UNIX). + +top_srcdir = @top_srcdir@ +top_builddir = ../../.. +program_dir = samples/html/virtual + +PROGRAM=virtual + +OBJECTS=$(PROGRAM).o + +DATAFILES=start.htm + +include ../../../src/makeprog.env + diff --git a/samples/html/widget/.cvsignore b/samples/html/widget/.cvsignore index 70845e08eb..e69de29bb2 100644 --- a/samples/html/widget/.cvsignore +++ b/samples/html/widget/.cvsignore @@ -1 +0,0 @@ -Makefile.in diff --git a/samples/html/widget/Makefile.am b/samples/html/widget/Makefile.am deleted file mode 100644 index 5e03a4a779..0000000000 --- a/samples/html/widget/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -AUTOMAKE_OPTIONS = 1.3 no-dependencies - -SUFFIXES = .cpp - -DEFS = @DEFS@ $(TOOLKIT_DEF) $(WXDEBUG_DEFINE) - -noinst_PROGRAMS = widget - -widget_SOURCES = widget.cpp diff --git a/samples/html/widget/Makefile.in b/samples/html/widget/Makefile.in new file mode 100644 index 0000000000..1b21882df7 --- /dev/null +++ b/samples/html/widget/Makefile.in @@ -0,0 +1,23 @@ +# +# File: Makefile.in +# Author: Julian Smart +# Created: 1998 +# Updated: +# Copyright: (c) 1998 Julian Smart +# +# "%W% %G%" +# +# Makefile for html widget example (UNIX). + +top_srcdir = @top_srcdir@ +top_builddir = ../../.. +program_dir = samples/html/widget + +PROGRAM=widget + +OBJECTS=$(PROGRAM).o + +DATAFILES=start.htm + +include ../../../src/makeprog.env + diff --git a/samples/html/zip/.cvsignore b/samples/html/zip/.cvsignore index 70845e08eb..e69de29bb2 100644 --- a/samples/html/zip/.cvsignore +++ b/samples/html/zip/.cvsignore @@ -1 +0,0 @@ -Makefile.in diff --git a/samples/html/zip/Makefile.am b/samples/html/zip/Makefile.am deleted file mode 100644 index 814476c5da..0000000000 --- a/samples/html/zip/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -AUTOMAKE_OPTIONS = 1.3 no-dependencies - -SUFFIXES = .cpp - -DEFS = @DEFS@ $(TOOLKIT_DEF) $(WXDEBUG_DEFINE) - -noinst_PROGRAMS = zip - -zip_SOURCES = zip.cpp diff --git a/samples/html/zip/Makefile.in b/samples/html/zip/Makefile.in new file mode 100644 index 0000000000..76297fbd3e --- /dev/null +++ b/samples/html/zip/Makefile.in @@ -0,0 +1,23 @@ +# +# File: Makefile.in +# Author: Julian Smart +# Created: 1998 +# Updated: +# Copyright: (c) 1998 Julian Smart +# +# "%W% %G%" +# +# Makefile for html zip example (UNIX). + +top_srcdir = @top_srcdir@ +top_builddir = ../../.. +program_dir = samples/html/zip + +PROGRAM=zip + +OBJECTS=$(PROGRAM).o + +DATAFILES=pages.zip start.htm + +include ../../../src/makeprog.env + diff --git a/src/generic/choicdgg.cpp b/src/generic/choicdgg.cpp index 608fec4009..5f82eb8ae0 100644 --- a/src/generic/choicdgg.cpp +++ b/src/generic/choicdgg.cpp @@ -264,10 +264,11 @@ bool wxSingleChoiceDialog::Create( wxWindow *WXUNUSED(parent), // 4) buttons topsizer->Add( CreateButtonSizer( wxOK|wxCANCEL ), 0, wxCENTRE | wxALL, 10 ); + SetAutoLayout( TRUE ); + SetSizer( topsizer ); + topsizer->SetSizeHints( this ); topsizer->Fit( this ); - SetSizer( topsizer ); - SetAutoLayout( TRUE ); Centre( wxBOTH ); diff --git a/src/generic/dirdlgg.cpp b/src/generic/dirdlgg.cpp index f43ff6f7b5..02f91965e4 100644 --- a/src/generic/dirdlgg.cpp +++ b/src/generic/dirdlgg.cpp @@ -35,6 +35,12 @@ #include "wx/intl.h" #include "wx/imaglist.h" #include "wx/icon.h" +#include "wx/log.h" +#include "wx/sizer.h" + +#if wxUSE_STATLINE + #include "wx/statline.h" +#endif #include "wx/generic/dirdlgg.h" @@ -112,73 +118,34 @@ static const int ID_NEW = 1004; // wxDirItemData //----------------------------------------------------------------------------- -class wxDirItemData : public wxTreeItemData -{ -public: - wxDirItemData(wxString& path, wxString& name); - ~wxDirItemData(); - bool HasSubDirs(); - wxString *m_path, *m_name; - bool m_isHidden; - bool m_hasSubDirs; -}; - -//----------------------------------------------------------------------------- -// wxDirCtrl -//----------------------------------------------------------------------------- - -class wxDirCtrl: public wxTreeCtrl +wxDirItemData::wxDirItemData(wxString& path, wxString& name) { - DECLARE_DYNAMIC_CLASS(wxDirCtrl) - - public: - bool m_showHidden; - wxTreeItemId m_rootId; - - wxDirCtrl(void); - wxDirCtrl(wxWindow *parent, const wxWindowID id = -1, - const wxString &dir = "/", - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - const long style = wxTR_HAS_BUTTONS, - const wxString& name = "wxTreeCtrl" ); - void OnExpandItem(wxTreeEvent &event ); - void OnCollapseItem(wxTreeEvent &event ); - void ShowHidden( const bool yesno ); - DECLARE_EVENT_TABLE() - protected: - void CreateItems(const wxTreeItemId &parent); - void SetupSections(void); - wxArrayString m_paths, m_names; -}; - -//----------------------------------------------------------------------------- -// wxDirItemData -//----------------------------------------------------------------------------- + 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 + * For FileNameFromPath read LastDirNameInThisPath ;-) */ + // m_isHidden = (bool)(wxFileNameFromPath(*m_path)[0] == '.'); + m_isHidden = FALSE; + m_hasSubDirs = HasSubDirs(); +} -wxDirItemData::wxDirItemData(wxString& path, wxString& name) +wxDirItemData::~wxDirItemData() { - m_path = new wxString(path); - m_name = new wxString(name); - /* 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; - m_hasSubDirs = HasSubDirs(); } -wxDirItemData:: ~wxDirItemData() +void wxDirItemData::SetNewDirName( wxString path ) { - delete m_path; - delete m_name; + m_path = path; + m_name = wxFileNameFromPath( path ); } bool wxDirItemData::HasSubDirs() { - wxString search = *m_path + "/*"; - wxString path = wxFindFirstFile( search, wxDIR ); - return (bool)(!path.IsNull()); + wxString search = m_path + "/*"; + wxLogNull log; + wxString path = wxFindFirstFile( search, wxDIR ); + return (bool)(!path.IsNull()); } //----------------------------------------------------------------------------- @@ -190,12 +157,14 @@ IMPLEMENT_DYNAMIC_CLASS(wxDirCtrl,wxTreeCtrl) BEGIN_EVENT_TABLE(wxDirCtrl,wxTreeCtrl) EVT_TREE_ITEM_EXPANDING (-1, wxDirCtrl::OnExpandItem) EVT_TREE_ITEM_COLLAPSED (-1, wxDirCtrl::OnCollapseItem) + EVT_TREE_BEGIN_LABEL_EDIT (-1, wxDirCtrl::OnBeginEditItem) + EVT_TREE_END_LABEL_EDIT (-1, wxDirCtrl::OnEndEditItem) END_EVENT_TABLE() wxDirCtrl::wxDirCtrl(void) { - m_showHidden = FALSE; -}; + m_showHidden = FALSE; +} wxDirCtrl::wxDirCtrl(wxWindow *parent, const wxWindowID id, const wxString &WXUNUSED(dir), const wxPoint& pos, const wxSize& size, @@ -203,16 +172,16 @@ wxDirCtrl::wxDirCtrl(wxWindow *parent, const wxWindowID id, const wxString &WXUN : wxTreeCtrl( parent, id, pos, size, style, wxDefaultValidator, name ) { - m_imageListNormal = new wxImageList(16, 16, TRUE); - m_imageListNormal->Add(wxICON(icon1)); - m_imageListNormal->Add(wxICON(icon2)); - SetImageList(m_imageListNormal); + m_imageListNormal = new wxImageList(16, 16, TRUE); + m_imageListNormal->Add(wxICON(icon1)); + m_imageListNormal->Add(wxICON(icon2)); + SetImageList(m_imageListNormal); - m_showHidden = FALSE; - m_rootId = AddRoot("Sections"); - SetItemHasChildren(m_rootId); - Expand(m_rootId); // automatically expand first level -}; + m_showHidden = FALSE; + m_rootId = AddRoot( _("Sections") ); + SetItemHasChildren(m_rootId); + Expand(m_rootId); // automatically expand first level +} /* Quick macro. Don't worry, I'll #undef it later */ #define ADD_SECTION(a,b) \ @@ -238,71 +207,133 @@ void wxDirCtrl::SetupSections() void wxDirCtrl::CreateItems(const wxTreeItemId &parent) { - wxTreeItemId id; - wxDirItemData *dir_item; + wxTreeItemId id; + wxDirItemData *dir_item; // wxASSERT(m_paths.Count() == m_names.Count()); ? - for (unsigned int i=0; im_hasSubDirs) SetItemHasChildren(id); - } + for (unsigned int i=0; im_hasSubDirs) SetItemHasChildren(id); + } } -void wxDirCtrl::OnExpandItem(wxTreeEvent &event ) +void wxDirCtrl::OnBeginEditItem(wxTreeEvent &event) { - if (event.GetItem() == m_rootId) - { - SetupSections(); - CreateItems(m_rootId); - return; - }; - - // This may take a longish time. Go to busy cursor - wxBeginBusyCursor(); + // don't rename the main entry "Sections" + if (event.GetItem() == m_rootId) + { + event.Veto(); + return; + } + + // don't rename the individual sections + if (GetParent( event.GetItem() ) == m_rootId) + { + event.Veto(); + return; + } +} - wxDirItemData *data = (wxDirItemData *)GetItemData(event.GetItem()); - wxASSERT(data); +void wxDirCtrl::OnEndEditItem(wxTreeEvent &event) +{ + if ((event.GetLabel().IsEmpty()) || + (event.GetLabel() == _(".")) || + (event.GetLabel() == _("..")) || + (event.GetLabel().First( _T("/") ) != wxNOT_FOUND)) + { + wxMessageDialog dialog(this, _("Illegal directory name."), _("Error"), wxOK | wxICON_ERROR ); + dialog.ShowModal(); + event.Veto(); + return; + } - wxString search,path,filename; + wxTreeItemId id = event.GetItem(); + wxDirItemData *data = (wxDirItemData*)GetItemData( id ); + wxASSERT( data ); + + wxString new_name( wxPathOnly( data->m_path ) ); + new_name += _T("/"); + new_name += event.GetLabel(); + + wxLogNull log; + + if (wxFileExists(new_name)) + { + wxMessageDialog dialog(this, _("File name exists already."), _("Error"), wxOK | wxICON_ERROR ); + 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(); + event.Veto(); + } +} - m_paths.Clear(); - m_names.Clear(); - search = *(data->m_path) + "/*"; - for (path = wxFindFirstFile( search, wxDIR ); !path.IsNull(); - path=wxFindNextFile() ) { - 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); +void wxDirCtrl::OnExpandItem(wxTreeEvent &event) +{ + if (event.GetItem() == m_rootId) + { + SetupSections(); + CreateItems(m_rootId); + return; } - } - CreateItems(event.GetItem()); - wxEndBusyCursor(); - - SortChildren( event.GetItem() ); -}; + // This may take a longish time. Go to busy cursor + 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() ) + { + 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); + } + } + + CreateItems( event.GetItem() ); + SortChildren( event.GetItem() ); + + wxEndBusyCursor(); +} void wxDirCtrl::OnCollapseItem(wxTreeEvent &event ) { - wxTreeItemId child, parent = event.GetItem(); - long cookie; - /* Workaround because DeleteChildren has disapeared (why?) and - * CollapseAndReset doesn't work as advertised (deletes parent too) */ - child = GetFirstChild(parent, cookie); - while (child.IsOk()) { - Delete(child); - /* Not GetNextChild below, because the cookie mechanism can't - * handle disappearing children! */ + wxTreeItemId child, parent = event.GetItem(); + long cookie; + /* Workaround because DeleteChildren has disapeared (why?) and + * CollapseAndReset doesn't work as advertised (deletes parent too) */ child = GetFirstChild(parent, cookie); - } -}; + while (child.IsOk()) + { + Delete(child); + /* Not GetNextChild below, because the cookie mechanism can't + * handle disappearing children! */ + child = GetFirstChild(parent, cookie); + } +} //----------------------------------------------------------------------------- // wxDirDialog @@ -332,110 +363,76 @@ wxDirDialog::wxDirDialog(wxWindow *parent, const wxString& message, wxDialog(parent, -1, message, pos, wxSize(300,300), wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) { - m_message = message; - m_dialogStyle = style; - m_parent = parent; + m_message = message; + m_dialogStyle = style; + m_parent = parent; - m_path = defaultPath; - - m_dir = new wxDirCtrl( this, ID_DIRCTRL, "/", wxDefaultPosition, wxDefaultSize, wxTR_HAS_BUTTONS | wxSUNKEN_BORDER ); - m_input = new wxTextCtrl( this, ID_TEXTCTRL, m_path, wxDefaultPosition ); - // m_check = new wxCheckBox( this, ID_CHECK, _("Show hidden") ); - m_ok = new wxButton( this, ID_OK, _("OK") ); - m_cancel = new wxButton( this, ID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize(75,-1) ); - m_new = new wxButton( this, ID_NEW, _("New...") ); - - // m_check->SetValue(TRUE); - m_ok->SetDefault(); - m_dir->SetFocus(); - - doSize(); -} - -void wxDirDialog::OnSize(wxSizeEvent& WXUNUSED(event)) -{ - doSize(); -} + 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); + topsizer->Add( m_dir, 1, wxTOP|wxLEFT|wxRIGHT | wxEXPAND, 10 ); + + // 2) text ctrl + 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 ); +#endif -void wxDirDialog::doSize() -{ - /* Figure out height of DirCtrl, which is what is left over by - * the textctrl and the buttons. Manually, because I can't seem - * to get the constraints stuff to do this */ - int w,h,h2; - - GetClientSize(&w, &h); - m_input->GetSize(&w,&h2); h -= h2; - m_ok->GetSize(&w, &h2); h -= h2; - //m_check->GetSize(&w, &h2); h -= h2; - h -= 30; - - wxLayoutConstraints *c = new wxLayoutConstraints; - c->left.SameAs (this, wxLeft,5); - c->right.SameAs (this, wxRight,5); - c->height.Absolute (h); - c->top.SameAs (this, wxTop,5); - m_dir->SetConstraints(c); - - c = new wxLayoutConstraints; - c->left.SameAs (this, wxLeft,5); - c->right.SameAs (this, wxRight,5); - c->height.AsIs (); - c->top.Below (m_dir,5); - m_input->SetConstraints(c); - - /* c = new wxLayoutConstraints; - c->left.SameAs (this, wxLeft,5); - c->right.SameAs (this, wxRight,5); - c->height.AsIs (); - c->top.Below (m_input,5); - m_check->SetConstraints(c); */ - - c = new wxLayoutConstraints; - c->width.SameAs (m_cancel, wxWidth); - c->height.AsIs (); - c->top.Below (m_input,10); - c->centreX.PercentOf (this, wxWidth, 20); - m_ok->SetConstraints(c); - - c = new wxLayoutConstraints; - c->width.SameAs (m_cancel, wxWidth); - c->height.AsIs (); - c->top.Below (m_input,10); - c->bottom.SameAs (this, wxBottom, 5); - c->centreX.PercentOf (this, wxWidth, 50); - m_new->SetConstraints(c); - - c = new wxLayoutConstraints; - c->width.AsIs (); - c->height.AsIs (); - c->top.Below (m_input,10); - c->centreX.PercentOf (this, wxWidth, 80); - m_cancel->SetConstraints(c); - - Layout(); + // 4) buttons + wxSizer* buttonsizer = new wxBoxSizer( wxHORIZONTAL ); + m_ok = new wxButton( this, ID_OK, _("OK") ); + buttonsizer->Add( m_ok, 0, wxLEFT|wxRIGHT, 10 ); + m_cancel = new wxButton( this, ID_CANCEL, _("Cancel") ); + 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 ); + + wxEndBusyCursor(); } int wxDirDialog::ShowModal() { - m_input->SetValue( m_path ); - return wxDialog::ShowModal(); + m_input->SetValue( m_path ); + return wxDialog::ShowModal(); } void wxDirDialog::OnTreeSelected( wxTreeEvent &event ) { - wxDirItemData *data = - (wxDirItemData*)m_dir->GetItemData(event.GetItem()); - if (data) - m_input->SetValue( *(data->m_path) ); + wxDirItemData *data = (wxDirItemData*)m_dir->GetItemData(event.GetItem()); + 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) - m_input->SetValue( *(data->m_path) ); + wxDirItemData *data = (wxDirItemData*)m_dir->GetItemData(m_dir->GetSelection()); + if (data) + m_input->SetValue( data->m_path ); }; void wxDirDialog::OnOK( wxCommandEvent& WXUNUSED(event) ) @@ -451,9 +448,10 @@ void wxDirDialog::OnOK( wxCommandEvent& WXUNUSED(event) ) wxString msg( _("The directory ") ); msg = msg + m_path; msg = msg + _("\ndoes not exist\nCreate it now?") ; - wxMessageDialog dialog(this, msg, _("Directory does not exist"), wxYES_NO); + wxMessageDialog dialog(this, msg, _("Directory does not exist"), wxYES_NO | wxICON_WARNING ); if ( dialog.ShowModal() == wxID_YES ) { // Okay, let's make it + wxLogNull log; if (wxMkdir(m_path)) { // The new dir was created okay. EndModal(wxID_OK); @@ -463,7 +461,7 @@ void wxDirDialog::OnOK( wxCommandEvent& WXUNUSED(event) ) // Trouble... msg = _("Failed to create directory ")+m_path+ _("\n(Do you have the required permissions?)"); - wxMessageDialog errmsg(this, msg, _("Error creating directory"), wxOK); + 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. } @@ -478,24 +476,53 @@ void wxDirDialog::OnCancel( wxCommandEvent& WXUNUSED(event) ) void wxDirDialog::OnNew( wxCommandEvent& WXUNUSED(event) ) { - wxTextEntryDialog dialog(this, _("Enter the name of the directory to create"), - _("Create New Directory"), m_input->GetValue(), wxOK|wxCANCEL); + wxTreeItemId id = m_dir->GetSelection(); + 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 ); + msg.ShowModal(); + return; + } - while (dialog.ShowModal() == wxID_OK) - { - // Okay, let's make it - if (wxMkdir(dialog.GetValue())) { - // The new dir was created okay. - m_path = dialog.GetValue(); - return; + wxTreeItemId parent = m_dir->GetParent( id ); + wxDirItemData *data = (wxDirItemData*)m_dir->GetItemData( parent ); + wxASSERT( data ); + + wxString new_name( _T("NewName") ); + wxString path( data->m_path ); + path += _T( "/" ); + 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; + + path = data->m_path; + path += _T( "/" ); + path += new_name; + i++; + } while (wxFileExists(path)); } - wxString msg = _("Failed to create directory ")+dialog.GetValue()+ - _("\n(Do you have the required permissions?)") ; - wxMessageDialog errmsg(this, msg, _("Error creating directory"), wxOK); - errmsg.ShowModal(); - // Show the create dialog again, until user clicks cancel or enters - // a valid dir. - } + + wxLogNull log; + if (!wxMkdir(path)) + { + wxMessageDialog dialog(this, _("Operation not permitted."), _("Error"), wxOK | wxICON_ERROR ); + dialog.ShowModal(); + return; + } + + wxDirItemData *new_data = new wxDirItemData( path, new_name ); + wxTreeItemId new_id = m_dir->AppendItem( parent, new_name, 0, 1, new_data ); + m_dir->EnsureVisible( new_id ); + m_dir->EditLabel( new_id ); } /* diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 65f568eb3b..3d271e0111 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -1159,6 +1159,11 @@ void wxListMainWindow::EditLabel( long item ) if (!le.IsAllowed()) return; + // We have to call this here because the label in + // question might just have been added and no screen + // update taken place. + if (m_dirty) wxYield(); + wxString s; m_currentEdit->GetText( 0, s ); int x = 0; @@ -2189,6 +2194,11 @@ void wxListMainWindow::DeleteEverything( void ) void wxListMainWindow::EnsureVisible( long index ) { + // We have to call this here because the label in + // question might just have been added and no screen + // update taken place. + if (m_dirty) wxYield(); + wxListLineData *oldCurrent = m_current; m_current = (wxListLineData *) NULL; int i = index; diff --git a/src/generic/treectrl.cpp b/src/generic/treectrl.cpp index db95ab3abe..c47906f3e6 100644 --- a/src/generic/treectrl.cpp +++ b/src/generic/treectrl.cpp @@ -1196,11 +1196,16 @@ void wxTreeCtrl::ScrollTo(const wxTreeItemId &item) { if (!item.IsOk()) return; + // We have to call this here because the label in + // question might just have been added and no screen + // update taken place. + if (m_dirty) wxYield(); + wxGenericTreeItem *gitem = item.m_pItem; // now scroll to the item int item_y = gitem->GetY(); - + int start_x = 0; int start_y = 0; ViewStart( &start_x, &start_y ); @@ -1339,10 +1344,10 @@ void wxTreeCtrl::AdjustMyScrollbars() int wxTreeCtrl::GetLineHeight(wxGenericTreeItem *item) const { - if (GetWindowStyleFlag() & wxTR_HAS_VARIABLE_ROW_HEIGHT) - return item->GetHeight(); - else - return m_lineHeight; + if (GetWindowStyleFlag() & wxTR_HAS_VARIABLE_ROW_HEIGHT) + return item->GetHeight(); + else + return m_lineHeight; } void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc) @@ -1778,6 +1783,11 @@ void wxTreeCtrl::OnChar( wxKeyEvent &event ) wxTreeItemId wxTreeCtrl::HitTest(const wxPoint& point, int& flags) { + // We have to call this here because the label in + // question might just have been added and no screen + // update taken place. + if (m_dirty) wxYield(); + wxClientDC dc(this); PrepareDC(dc); long x = dc.DeviceToLogicalX( (long)point.x ); @@ -1808,6 +1818,11 @@ void wxTreeCtrl::Edit( const wxTreeItemId& item ) GetEventHandler()->ProcessEvent( te ); if (!te.IsAllowed()) return; + + // We have to call this here because the label in + // question might just have been added and no screen + // update taken place. + if (m_dirty) wxYield(); wxString s = m_currentEdit->GetText(); int x = m_currentEdit->GetX(); diff --git a/src/gtk/menu.cpp b/src/gtk/menu.cpp index 1fec1d74fc..282c4a3895 100644 --- a/src/gtk/menu.cpp +++ b/src/gtk/menu.cpp @@ -224,7 +224,7 @@ void wxMenuBar::Append( wxMenu *menu, const wxString &title ) wxString buf; buf << _T('/') << str.c_str(); - char *cbuf = new char[buf.Length()]; + char *cbuf = new char[buf.Length()+1]; strcpy(cbuf, buf.mbc_str()); GtkItemFactoryEntry entry; diff --git a/src/gtk1/menu.cpp b/src/gtk1/menu.cpp index 1fec1d74fc..282c4a3895 100644 --- a/src/gtk1/menu.cpp +++ b/src/gtk1/menu.cpp @@ -224,7 +224,7 @@ void wxMenuBar::Append( wxMenu *menu, const wxString &title ) wxString buf; buf << _T('/') << str.c_str(); - char *cbuf = new char[buf.Length()]; + char *cbuf = new char[buf.Length()+1]; strcpy(cbuf, buf.mbc_str()); GtkItemFactoryEntry entry; -- 2.45.2