From 0b8558681e8c69b749f64b891111f5ea72c04550 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Wed, 18 Aug 1999 11:40:40 +0000 Subject: [PATCH] Whole lot of stuff for new wxFileDialog git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3410 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/generic/filedlgg.h | 19 +- include/wx/generic/find.xpm | 99 -------- include/wx/generic/folder.xpm | 48 ---- include/wx/generic/home.xpm | 28 +++ include/wx/generic/list.xpm | 45 ---- include/wx/generic/listview.xpm | 30 +++ include/wx/generic/repview.xpm | 31 +++ include/wx/generic/txt.xpm | 53 ---- include/wx/listctrl.h | 15 ++ src/generic/filedlgg.cpp | 426 +++++++++++++++----------------- src/generic/listctrl.cpp | 226 +++++++++++------ 11 files changed, 451 insertions(+), 569 deletions(-) delete mode 100644 include/wx/generic/find.xpm delete mode 100644 include/wx/generic/folder.xpm create mode 100644 include/wx/generic/home.xpm delete mode 100644 include/wx/generic/list.xpm create mode 100644 include/wx/generic/listview.xpm create mode 100644 include/wx/generic/repview.xpm delete mode 100644 include/wx/generic/txt.xpm diff --git a/include/wx/generic/filedlgg.h b/include/wx/generic/filedlgg.h index 04f081b6bf..f3724ad09d 100644 --- a/include/wx/generic/filedlgg.h +++ b/include/wx/generic/filedlgg.h @@ -21,8 +21,6 @@ #include "wx/dialog.h" #include "wx/checkbox.h" #include "wx/listctrl.h" -#include "wx/button.h" -#include "wx/validate.h" #include "wx/textctrl.h" #include "wx/choice.h" @@ -72,9 +70,8 @@ public: bool IsLink(); bool IsExe(); long GetSize(); - bool NewNameIsLegal( const wxString &s ); - bool Rename( const wxString &s ); void MakeItem( wxListItem &item ); + void SetNewName( const wxString &name, const wxString &fname ); private: DECLARE_DYNAMIC_CLASS(wxFileData); @@ -89,10 +86,12 @@ class wxFileCtrl : public wxListCtrl private: wxString m_dirName; bool m_showHidden; + wxString m_wild; public: wxFileCtrl(); - wxFileCtrl( wxWindow *win, const wxWindowID id, const wxString &dirName, + wxFileCtrl( wxWindow *win, const wxWindowID id, + const wxString &dirName, const wxString &wild, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize, const long style = wxLC_LIST, const wxValidator &validator = wxDefaultValidator, const wxString &name = _T("filelist") ); @@ -100,20 +99,16 @@ public: void ChangeToReportMode(); void ChangeToIconMode(); void ShowHidden( bool show = TRUE ); + long Add( wxFileData *fd, wxListItem &item ); void Update(); virtual void StatusbarText( char *WXUNUSED(text) ) {}; - int FillList( wxStringList &list ); - void DeleteFiles(); - void CopyFiles( char *dest ); - void MoveFiles( char *dest ); - void RenameFile(); void MakeDir(); void GoToParentDir(); void GoToHomeDir(); void GoToDir( const wxString &dir ); + void SetWild( const wxString &wild ); void GetDir( wxString &dir ); void OnListDeleteItem( wxListEvent &event ); - void OnListKeyDown( wxListEvent &event ); void OnListEndLabelEdit( wxListEvent &event ); private: @@ -158,10 +153,10 @@ public: void OnActivated( wxListEvent &event ); void OnList( wxCommandEvent &event ); void OnReport( wxCommandEvent &event ); - void OnIcon( wxCommandEvent &event ); void OnUp( wxCommandEvent &event ); void OnHome( wxCommandEvent &event ); void OnListOk( wxCommandEvent &event ); + void OnNew( wxCommandEvent &event ); protected: wxString m_message; diff --git a/include/wx/generic/find.xpm b/include/wx/generic/find.xpm deleted file mode 100644 index 82e5ccbf61..0000000000 --- a/include/wx/generic/find.xpm +++ /dev/null @@ -1,99 +0,0 @@ -/* XPM */ -static char * find_xpm[] = { -"32 32 64 1", -" s background c None", -". c black", -"X c #FFFFFBEEFFFF", -"o c #AEBAAAAAAEBA", -"O c #4924618579E7", -"+ c #AEBA8A286185", -"@ c #BEFB8A2871C6", -"# c #71C682078617", -"$ c #4924410330C2", -"% c #492451446185", -"& c #49243CF338E3", -"* c #EFBEAAAA8E38", -"= c #AEBA71C66185", -"- c #9E79820769A6", -"; c #5144410338E3", -": c #514434D338E3", -"> c #D75CA28971C6", -", c #514430C230C2", -"< c #618541034103", -"1 c #BEFB8A286185", -"2 c #B6DA7DF75965", -"3 c #410338E330C2", -"4 c #514441034103", -"5 c #AEBA9A696185", -"6 c #9E7971C65144", -"7 c #9E7971C66185", -"8 c #DF7DAEBA9E79", -"9 c #38E338E330C2", -"0 c #410330C22081", -"q c #A69961855144", -"w c #618549244924", -"e c #30C230C22081", -"r c #38E32CB230C2", -"t c #8E3851445144", -"y c #28A228A230C2", -"u c #79E759654924", -"i c #A69969A65965", -"p c #8E3861855144", -"a c #71C661854103", -"s c #208120812081", -"d c #596538E330C2", -"f c #8E3871C65144", -"g c #71C651445144", -"h c #186118611861", -"j c #8E3861854103", -"k c #71C651444103", -"l c #71C641034103", -"z c #514451445144", -"x c #5144514430C2", -"c c #104010401040", -"v c #410330C230C2", -"b c #30C220812081", -"n c #618551444103", -"m c #79E779E779E7", -"M c #6185410330C2", -"N c #38E330C22081", -"B c #6185514430C2", -"V c #38E324922081", -"C c #514400000000", -"Z c #E79DD34CD75C", -"A c #C71BC71BBEFB", -"S c #8E387DF769A6", -"D c #208128A228A2", -"F c #30C238E34103", -" ........ XXXo ", -" ..O......O..Xoo+@ ", -" .#..$.###%..&.@+*X=- ", -" ...;;;.%$:;;;...XX>XXXo ", -" ...$$,$+XXX.##<#..o111@2 ", -" .&.34&+XXoo5.XX#%.$.@@5*X=6 ", -" ..3378X+@@++@@++@@..XX>XXoo+2 ", -".9.0qXXX2++12+XXX.X.w.XXo11@@1 ", -"..erX66==66=11111.o1..1111*XX>>t", -"..yuXi76678X+@2++@@+..:+XXX>+ppa", -"..sdXpppXX=++@=++=8X..w+fqppupge", -"..h=76.....pganknwBMz ", -"XM.w.h..Xb0,*6..v..CC.kklkB<<;m ", -"ZMzX#..;......9..N.rC...lBM c #8E3886178617", -", c #410341038E38", -" ", -" .X ", -" Xoo. ", -" O.Xo ", -" ++ +X@O#o ", -" +$$++ +$$%%#o ", -" +$$$$$+$$$@%#o& ", -" +$$$$$+$$$$O%#o$&& ", -" +$$$$$+$$$$$@##o$$$&+ ", -" +$$**$+$$$$$$%O#o$$$$$& ", -" +$$$$$+$$**$$+@%#o$$$$$$=", -" +$$**$+$$$$$*&$O%-o$$$$$-+", -" +$$$$$+$$**$$+$$@%o;+$$$*+;", -" +$$**$+$$$$$*+$$$O##o$+$*+;+", -" +$$$$$+$$**$$+$$$$@#oo$$++;+ ", -" +$$**$+$$$$$*+$$$$$%%#;$$$$++ ", -" +$$$$$+$$**$$+$$*-$$%#oo$$$$$$*", -"+$$$$$+$$$$$*+$$$$$*-O##;$$$$$-+", -"*:X$$+oo+$$$+$$**$$$$%%;o$$$$*+;", -"+;-:X$$+oo:&$$$$$**$$ooo;$$$*+;+", -" +;*:X$$*+$$**$$$$*-X%o$$$*+;+ ", -" +;**++$$$$$**$$$$.#o$$*+;+ ", -" +*+$$=:$$$$*-$$$##$>Xo+ ", -" +$$$$$:*$$$$-*$;X-+-+ ", -" *+$$$$$$$:*$$$$$;,+;& ", -" +*:+$$$$$$$*:$$$=+;+ ", -" +;o:+$$$$$$$$$*+;+ ", -" +;o:+$$$$$$*+;+ ", -" +;o:+$$$*+;+ ", -" +;o:+*+;+ ", -" +;-+;+ ", -" +;+ "}; diff --git a/include/wx/listctrl.h b/include/wx/listctrl.h index 087e5d1c2a..0c39419727 100644 --- a/include/wx/listctrl.h +++ b/include/wx/listctrl.h @@ -38,6 +38,21 @@ public: wxPoint m_pointDrag; wxListItem m_item; + + inline int GetCode() { return m_code; } + inline long GetIndex() { return m_itemIndex; } + inline long GetOldIndex() { return m_oldItemIndex; } + inline long GetItem() { return m_itemIndex; } + inline long GetOldItem() { return m_oldItemIndex; } + inline int GetColumn() { return m_col; } + inline bool Cancelled() { return m_cancelled; } + inline wxPoint GetPoint() { return m_pointDrag; } + inline const wxString &GetLabel() const { return m_item.m_text; } + inline const wxString &GetText() const { return m_item.m_text; } + inline int GetImage() { return m_item.m_image; } + inline long GetData() { return m_item.m_data; } + inline long GetMask() { return m_item.m_mask; } + inline const wxListItem &GetItem() const { return m_item; } private: DECLARE_DYNAMIC_CLASS(wxListEvent) diff --git a/src/generic/filedlgg.cpp b/src/generic/filedlgg.cpp index ad39eb36b6..3001f96271 100644 --- a/src/generic/filedlgg.cpp +++ b/src/generic/filedlgg.cpp @@ -25,12 +25,12 @@ #endif #include "wx/filedlg.h" -#include "wx/dnd.h" #include "wx/debug.h" #include "wx/log.h" #include "wx/intl.h" #include "wx/msgdlg.h" #include "wx/sizer.h" +#include "wx/bmpbuttn.h" #include "sys/types.h" #include "sys/stat.h" @@ -39,10 +39,38 @@ #include "grp.h" #include "time.h" -#include "wx/generic/folder.xpm" -#include "wx/generic/txt.xpm" -#include "wx/generic/list.xpm" -#include "wx/generic/find.xpm" +#include "wx/generic/home.xpm" +#include "wx/generic/listview.xpm" +#include "wx/generic/repview.xpm" + +/* XPM */ +static char * folder_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", +/* pixels */ +" ", +" @@@@@ ", +" @#+#+#@ ", +" @#+#+#+#@@@@@@ ", +" @$$$$$$$$$$$$@.", +" @$#+#+#+#+#+#@.", +" @$+#+#+#+#+#+@.", +" @$#+#+#+#+#+#@.", +" @$+#+#+#+#+#+@.", +" @$#+#+#+#+#+#@.", +" @$+#+#+#+#+#+@.", +" @$#+#+#+#+#+#@.", +" @@@@@@@@@@@@@@.", +" ..............", +" ", +" "}; //----------------------------------------------------------------------------- // wxFileData @@ -54,7 +82,7 @@ wxFileData::wxFileData( const wxString &name, const wxString &fname ) { m_name = name; m_fileName = fname; - + struct stat buff; stat( m_fileName.GetData(), &buff ); struct stat lbuff; @@ -177,26 +205,10 @@ long wxFileData::GetSize() return m_size; } -bool wxFileData::NewNameIsLegal( const wxString &s ) -{ - wxString fileName = wxPathOnly( m_fileName ); - fileName += _T("/"); - fileName += s; - return (!wxFileExists( fileName )); -} - -bool wxFileData::Rename( const wxString &s ) +void wxFileData::SetNewName( const wxString &name, const wxString &fname ) { - wxString fileName = wxPathOnly( m_fileName ); - fileName += _T("/"); - fileName += s; - bool ret = wxRenameFile( m_fileName, fileName ); - if (ret) - { - m_fileName = fileName; - m_name = s; - } - return ret; + m_name = name; + m_fileName = fname; } void wxFileData::MakeItem( wxListItem &item ) @@ -205,6 +217,7 @@ void wxFileData::MakeItem( wxListItem &item ) item.m_colour = wxBLACK; if (IsExe()) item.m_colour = wxRED; if (IsDir()) item.m_colour = wxBLUE; + if (IsDir()) item.m_image = 0; else item.m_image = -1; if (IsLink()) { wxColour *dg = wxTheColourDatabase->FindColour( "MEDIUM GREY" ); @@ -220,6 +233,8 @@ void wxFileData::MakeItem( wxListItem &item ) IMPLEMENT_DYNAMIC_CLASS(wxFileCtrl,wxListCtrl); BEGIN_EVENT_TABLE(wxFileCtrl,wxListCtrl) + EVT_LIST_DELETE_ITEM(-1, wxFileCtrl::OnListDeleteItem) + EVT_LIST_END_LABEL_EDIT(-1, wxFileCtrl::OnListEndLabelEdit) END_EVENT_TABLE() wxFileCtrl::wxFileCtrl() @@ -228,25 +243,20 @@ wxFileCtrl::wxFileCtrl() m_showHidden = FALSE; } -wxFileCtrl::wxFileCtrl( wxWindow *win, wxWindowID id, const wxString &dirName, +wxFileCtrl::wxFileCtrl( wxWindow *win, wxWindowID id, + const wxString &dirName, const wxString &wild, const wxPoint &pos, const wxSize &size, long style, const wxValidator &validator, const wxString &name ) : wxListCtrl( win, id, pos, size, style, validator, name ) { - SetItemSpacing( 40 ); - wxImageList *imageList = new wxImageList( 30, 30 ); + wxImageList *imageList = new wxImageList( 16, 16 ); imageList->Add( wxBitmap( folder_xpm ) ); - imageList->Add( wxBitmap( txt_xpm ) ); - imageList->Add( wxBitmap( list_xpm ) ); - imageList->Add( wxBitmap( find_xpm ) ); - - SetImageList( imageList, wxIMAGE_LIST_NORMAL ); - + SetImageList( imageList, wxIMAGE_LIST_SMALL ); + m_dirName = dirName; + m_wild = wild; m_showHidden = FALSE; Update(); - -// SetDropTarget( new wxFileDropTarget() ); } void wxFileCtrl::ChangeToListMode() @@ -277,11 +287,31 @@ int ListCompare( const long data1, const long data2, const long WXUNUSED(data) ) { wxFileData *fd1 = (wxFileData*)data1 ; wxFileData *fd2 = (wxFileData*)data2 ; + if (fd1->GetName() == _T("..")) return -1; + if (fd2->GetName() == _T("..")) return 1; if (fd1->IsDir() && !fd2->IsDir()) return -1; if (fd2->IsDir() && !fd1->IsDir()) return 1; return strcmp( fd1->GetName(), fd2->GetName() ); } +long wxFileCtrl::Add( wxFileData *fd, wxListItem &item ) +{ + long ret = -1; + item.m_mask = wxLIST_MASK_TEXT + wxLIST_MASK_DATA + wxLIST_MASK_IMAGE; + fd->MakeItem( item ); + long my_style = GetWindowStyleFlag(); + if (my_style & wxLC_REPORT) + { + ret = InsertItem( item ); + for (int i = 1; i < 5; i++) SetItem( item.m_itemId, i, fd->GetEntry( i) ); + } + else if (my_style & wxLC_LIST) + { + ret = InsertItem( item ); + } + return ret; +} + void wxFileCtrl::Update() { ClearAll(); @@ -296,35 +326,28 @@ void wxFileCtrl::Update() } wxFileData *fd = (wxFileData *) NULL; wxListItem item; - item.m_mask = wxLIST_MASK_TEXT + wxLIST_MASK_DATA; - if (my_style & wxLC_ICON) item.m_mask += wxLIST_MASK_IMAGE; item.m_itemId = 0; item.m_col = 0; - wxString s; - wxString res = m_dirName + _T("/*"); + + if (m_dirName != _T("/")) + { + wxString p( wxPathOnly(m_dirName) ); + if (p.IsEmpty()) p = _T("/"); + fd = new wxFileData( _T(".."), p ); + Add( fd, item ); + item.m_itemId++; + } + + wxString res = m_dirName + _T("/") + m_wild; wxString f( wxFindFirstFile( res.GetData(), 0 ) ); while (!f.IsEmpty()) { res = wxFileNameFromPath( f ); fd = new wxFileData( res, f ); - s = fd->GetName(); - if (m_showHidden || (s[0] != '.')) + wxString s = fd->GetName(); + if (m_showHidden || (s[0] != _T('.'))) { - fd->MakeItem( item ); - if (my_style & wxLC_REPORT) - { - InsertItem( item ); - for (int i = 1; i < 5; i++) SetItem( item.m_itemId, i, fd->GetEntry( i) ); - } - else if (my_style & wxLC_LIST) - { - InsertItem( item ); - } - else if (my_style & wxLC_ICON) - { - if (fd->IsDir()) item.m_image = 0; else item.m_image = 1; - InsertItem( item ); - } + Add( fd, item ); item.m_itemId++; } f = wxFindNextFile(); @@ -332,112 +355,72 @@ void wxFileCtrl::Update() SortItems( ListCompare, 0 ); } -int wxFileCtrl::FillList( wxStringList &list ) +void wxFileCtrl::SetWild( const wxString &wild ) { - long index = -1; - int count = 0; - wxString s; - for (;;) + m_wild = wild; + Update(); +} + +void wxFileCtrl::MakeDir() +{ + wxString new_name( _T("NewName") ); + wxString path( m_dirName ); + path += _T( "/" ); + path += new_name; + if (wxFileExists(path)) { - index = GetNextItem( index, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED ); - if (index == -1) break; - wxListItem item; - item.m_itemId = index; - GetItem( item ); - wxFileData *fd = (wxFileData*)item.m_data; - list.Add( fd->GetFullName() ); - index++; - count++; + // try NewName0, NewName1 etc. + int i = 0; + do { + new_name = _("NewName"); + wxString num; + num.Printf( _T("%d"), i ); + new_name += num; + + path = m_dirName; + path += _T("/"); + path += new_name; + i++; + } while (wxFileExists(path)); } - if (count == 0) + + wxLogNull log; + if (!wxMkdir(path)) { - index = GetNextItem( -1, wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED ); - if (index == -1) return 0; - wxListItem item; - item.m_itemId = index; - GetItem( item ); - wxFileData *fd = (wxFileData*)item.m_data; - list.Add( fd->GetFullName() ); - count = 1; + wxMessageDialog dialog(this, _("Operation not permitted."), _("Error"), wxOK | wxICON_ERROR ); + dialog.ShowModal(); + return; } - return count; -} - -void wxFileCtrl::DeleteFiles() -{ -/* - wxStringList list; - int count = FillList( list ); - if (count > 0) - { - wxString s = "Delete "; - s += wxIntToString( count ); - s += " selected file"; - if (count > 1) s += "s"; - s += " or director"; - if (count > 1) s += "ies?"; else s+= "y?"; - if (wxYES == wxMessageBox( s, "Delete", wxYES_NO )) - wxDeleteStatusDia( NULL, &list ); - }; -*/ -} -void wxFileCtrl::CopyFiles( char *WXUNUSED(dest) ) -{ -/* - wxStringList list; - int count = FillList( list ); - wxString s = dest; - int ret = 0; // 0 = nix, 1 = copy, 2 = move - wxCopyMoveDia( (wxFrame*)GetParent(), count, &ret, &s ); - if (ret == 1) - wxCopyStatusDia( NULL, s, &list ); -*/ -} - -void wxFileCtrl::MoveFiles( char *WXUNUSED(dest) ) -{ -} - -void wxFileCtrl::RenameFile() -{ -} - -void wxFileCtrl::MakeDir() -{ -/* - wxString s = wxGetTextFromUser( "Enter new directory name:", "Make directory" ); - if (s.IsNull()) return; - if (s == "") return; - if ((s == ".") || (s == "..")) - { - wxMessageBox( "This was obviously an invalid directory name.", "Go away." ); - return; - }; - wxString dir; - GetDir( dir ); - dir += "/"; - dir += s; - if (wxFileExists( dir )) - { - wxMessageBox( "Filename exists already. Cannot create directoy.", "Make directory" ); - return; - }; - wxMkdir( dir ); - Update(); -*/ + wxFileData *fd = new wxFileData( new_name, path ); + wxListItem item; + item.m_itemId = 0; + item.m_col = 0; + int id = Add( fd, item ); + + if (id != -1) + { + SortItems( ListCompare, 0 ); + id = FindItem( 0, (long)fd ); + EnsureVisible( id ); + EditLabel( id ); + } } void wxFileCtrl::GoToParentDir() { - wxString s = m_dirName; - int pos = s.Last( _T('/') ); - if ((pos >= 0) && (s != _T("/"))) + if (m_dirName != _T("/")) { - s.Remove( pos, s.Length()-pos ); - if (s.Length() == 0) s = _T("/"); - m_dirName = s; + wxString fname( wxFileNameFromPath(m_dirName) ); + m_dirName = wxPathOnly( m_dirName ); + if (m_dirName.IsEmpty()) m_dirName = _T("/"); Update(); + int id = FindItem( 0, fname ); + if (id != -1) + { + SetItemState( id, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED ); + EnsureVisible( id ); + } } } @@ -459,107 +442,74 @@ void wxFileCtrl::GetDir( wxString &dir ) dir = m_dirName; } -/* -void wxFileCtrl::OnDropFiles( int WXUNUSED(n), char **WXUNUSED(data), int WXUNUSED(x), int WXUNUSED(y) ) -{ - wxString destDir; - wxPoint pt( x, y ); - int flag = wxLIST_HITTEST_ONITEM; - long hit = HitTest( pt, flag ); - if (hit > -1) - { - wxListItem li; - li.m_itemId = hit; - GetItem( li ); - wxFileData *fd = (wxFileData*)li.m_data; - if (fd->IsDir()) fd->GetFullName( destDir ); - }; - if (destDir.IsNull()) destDir = m_dirName; - int ret = 0; // 0 = nix, 1 = copy, 2 = move - wxCopyMoveDia( (wxFrame*)GetParent(), n, &ret, &destDir ); - if (ret == 1) - { - wxStringList slist; - for (int i = 0; i < n; i++) slist.Add( data[i] ); - wxCopyStatusDia( NULL, destDir.GetData(), &slist ); - Update(); - }; -}; -*/ - void wxFileCtrl::OnListDeleteItem( wxListEvent &event ) { wxFileData *fd = (wxFileData*)event.m_item.m_data; delete fd; } -void wxFileCtrl::OnListKeyDown( wxListEvent &event ) +void wxFileCtrl::OnListEndLabelEdit( wxListEvent &event ) { wxFileData *fd = (wxFileData*)event.m_item.m_data; - if (fd->IsDir()) + wxASSERT( fd ); + + if ((event.GetLabel().IsEmpty()) || + (event.GetLabel() == _(".")) || + (event.GetLabel() == _("..")) || + (event.GetLabel().First( _T("/") ) != wxNOT_FOUND)) { - m_dirName = fd->GetFullName(); - Update(); - Refresh(); - return; + wxMessageDialog dialog(this, _("Illegal directory name."), _("Error"), wxOK | wxICON_ERROR ); + dialog.ShowModal(); + event.Veto(); + return; } - if (fd->IsExe()) + + wxString new_name( wxPathOnly( fd->GetFullName() ) ); + new_name += _T("/"); + new_name += event.GetLabel(); + + wxLogNull log; + + if (wxFileExists(new_name)) { - wxExecute( fd->GetFullName() ); - return; + wxMessageDialog dialog(this, _("File name exists already."), _("Error"), wxOK | wxICON_ERROR ); + dialog.ShowModal(); + event.Veto(); } -} - -void wxFileCtrl::OnListEndLabelEdit( wxListEvent &event ) -{ - wxFileData *fd = (wxFileData*)event.m_item.m_data; - wxString newName = event.m_item.m_text; - if (fd->NewNameIsLegal( newName )) + + if (wxRenameFile(fd->GetFullName(),new_name)) { - if (fd->Rename( newName )) - { - Update(); - } - else - { - wxString s = _("Could not rename file to "); - s += newName; - s += "."; - wxMessageBox( s, _("File dialog"), wxOK ); - } + fd->SetNewName( new_name, event.GetLabel() ); + SetItemState( event.GetItem(), wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED ); + EnsureVisible( event.GetItem() ); } else { - wxString s = "File name "; - s += newName; - s += " exists already or is invalid.\n"; - s += "Could not rename file."; - wxMessageBox( s, _("File dialog"), wxOK ); + wxMessageDialog dialog(this, _("Operation not permitted."), _("Error"), wxOK | wxICON_ERROR ); + dialog.ShowModal(); + event.Veto(); } - return; } //----------------------------------------------------------------------------- // wxFileDialog //----------------------------------------------------------------------------- -/* **** */ - #define ID_LIST_CTRL 5010 #define ID_LIST_MODE 5000 #define ID_REPORT_MODE 5001 -#define ID_ICON_MODE 5002 #define ID_UP_DIR 5005 #define ID_PARENT_DIR 5006 +#define ID_NEW_DIR 5007 IMPLEMENT_DYNAMIC_CLASS(wxFileDialog,wxDialog) BEGIN_EVENT_TABLE(wxFileDialog,wxDialog) EVT_BUTTON(ID_LIST_MODE, wxFileDialog::OnList) EVT_BUTTON(ID_REPORT_MODE, wxFileDialog::OnReport) - EVT_BUTTON(ID_ICON_MODE, wxFileDialog::OnIcon) EVT_BUTTON(ID_UP_DIR, wxFileDialog::OnUp) EVT_BUTTON(ID_PARENT_DIR, wxFileDialog::OnHome) + EVT_BUTTON(ID_NEW_DIR, wxFileDialog::OnNew) EVT_BUTTON(wxID_OK, wxFileDialog::OnListOk) EVT_LIST_ITEM_SELECTED(ID_LIST_CTRL, wxFileDialog::OnSelected) EVT_LIST_ITEM_ACTIVATED(ID_LIST_CTRL, wxFileDialog::OnActivated) @@ -591,22 +541,21 @@ wxFileDialog::wxFileDialog(wxWindow *parent, wxBoxSizer *buttonsizer = new wxBoxSizer( wxHORIZONTAL ); - buttonsizer->Add( new wxButton( this, ID_LIST_MODE, "List" ), 0, wxALL, 5 ); - buttonsizer->Add( new wxButton( this, ID_REPORT_MODE, "Report" ), 0, wxALL, 5 ); - buttonsizer->Add( new wxButton( this, ID_ICON_MODE, "Icon" ), 0, wxALL, 5 ); - buttonsizer->Add( 30, 5 ); + buttonsizer->Add( new wxBitmapButton( this, ID_LIST_MODE, wxBitmap( listview_xpm ) ), 0, wxALL, 5 ); + buttonsizer->Add( new wxBitmapButton( this, ID_REPORT_MODE, wxBitmap( repview_xpm ) ), 0, wxALL, 5 ); + buttonsizer->Add( 30, 5, 1 ); buttonsizer->Add( new wxButton( this, ID_UP_DIR, "Up" ), 0, wxALL, 5 ); - buttonsizer->Add( new wxButton( this, ID_PARENT_DIR, "Home" ), 0, wxALL, 5 ); - buttonsizer->Add( new wxButton( this, -1, "New..." ), 0, wxALL, 5 ); - mainsizer->Add( buttonsizer, 0, wxALL | wxALIGN_RIGHT, 5 ); + buttonsizer->Add( new wxBitmapButton( this, ID_PARENT_DIR, wxBitmap(home_xpm) ), 0, wxALL, 5 ); + buttonsizer->Add( new wxButton( this, ID_NEW_DIR, "New..." ), 0, wxALL, 5 ); + mainsizer->Add( buttonsizer, 0, wxALL | wxEXPAND, 5 ); - m_list = new wxFileCtrl( this, ID_LIST_CTRL, "/", wxDefaultPosition, wxSize(200,180), + m_list = new wxFileCtrl( this, ID_LIST_CTRL, m_dir, "*", wxDefaultPosition, wxSize(450,180), wxLC_LIST | wxSUNKEN_BORDER | wxLC_SINGLE_SEL ); - mainsizer->Add( m_list, 1, wxEXPAND | wxALL, 10 ); + mainsizer->Add( m_list, 1, wxEXPAND | wxLEFT|wxRIGHT, 10 ); wxBoxSizer *textsizer = new wxBoxSizer( wxHORIZONTAL ); m_text = new wxTextCtrl( this, -1, m_fileName ); - textsizer->Add( m_text, 1, wxCENTER|wxALL, 10 ); + textsizer->Add( m_text, 1, wxCENTER | wxLEFT|wxRIGHT|wxTOP, 10 ); textsizer->Add( new wxButton( this, wxID_OK, _("OK") ), 0, wxCENTER | wxLEFT|wxRIGHT|wxTOP, 10 ); mainsizer->Add( textsizer, 0, wxEXPAND ); @@ -625,6 +574,8 @@ wxFileDialog::wxFileDialog(wxWindow *parent, Centre( wxBOTH ); + m_list->SetFocus(); + wxEndBusyCursor(); } @@ -647,7 +598,14 @@ void wxFileDialog::OnListOk( wxCommandEvent &event ) m_list->GetDir( dir ); if (filename.IsEmpty()) return; - dir += _T("/"); + if (filename == _T("..")) + { + m_list->GoToParentDir(); + m_list->SetFocus(); + return; + } + + if (dir != _T("/")) dir += _T("/"); dir += filename; filename = dir; @@ -687,26 +645,30 @@ void wxFileDialog::OnListOk( wxCommandEvent &event ) void wxFileDialog::OnList( wxCommandEvent &WXUNUSED(event) ) { m_list->ChangeToListMode(); + m_list->SetFocus(); } void wxFileDialog::OnReport( wxCommandEvent &WXUNUSED(event) ) { m_list->ChangeToReportMode(); -} - -void wxFileDialog::OnIcon( wxCommandEvent &WXUNUSED(event) ) -{ - m_list->ChangeToIconMode(); + m_list->SetFocus(); } void wxFileDialog::OnUp( wxCommandEvent &WXUNUSED(event) ) { m_list->GoToParentDir(); + m_list->SetFocus(); } void wxFileDialog::OnHome( wxCommandEvent &WXUNUSED(event) ) { m_list->GoToHomeDir(); + m_list->SetFocus(); +} + +void wxFileDialog::OnNew( wxCommandEvent &WXUNUSED(event) ) +{ + m_list->MakeDir(); } void wxFileDialog::SetPath( const wxString& path ) diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 8b9aaee667..cded1af243 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -142,6 +142,7 @@ void wxListItemData::GetItem( wxListItem &info ) info.m_text = m_text; info.m_image = m_image; info.m_data = m_data; + info.m_colour = m_colour; } wxColour *wxListItemData::GetColour() @@ -301,6 +302,14 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing ) dc->GetTextExtent( s, &lw, &lh ); m_bound_all.width = lw; m_bound_all.height = lh; + if (item->HasImage()) + { + int w = 0; + int h = 0; + m_owner->GetImageSize( item->GetImage(), w, h ); + m_bound_all.width += 4 + w; + if (h > m_bound_all.height) m_bound_all.height = h; + } } break; } @@ -315,10 +324,9 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing ) wxString s; item->GetText( s ); if (s.IsNull()) s = "H"; - long lw,lh; - dc->GetTextExtent( s, &lw, &lh ); + long lh; + dc->GetTextExtent( s, (long*) NULL, &lh ); item->SetSize( item->GetWidth(), lh ); - m_bound_all.width += lw; m_bound_all.height = lh; node = node->Next(); } @@ -329,85 +337,125 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing ) void wxListLineData::SetPosition( wxDC *dc, int x, int y, int window_width ) { - m_bound_all.x = x; - m_bound_all.y = y; - switch (m_mode) - { - case wxLC_ICON: - { - AssignRect( m_bound_icon, 0, 0, 0, 0 ); - AssignRect( m_bound_label, 0, 0, 0, 0 ); - AssignRect( m_bound_hilight, m_bound_all ); - wxNode *node = m_items.First(); - if (node) - { - wxListItemData *item = (wxListItemData*)node->Data(); - if (item->HasImage()) + m_bound_all.x = x; + m_bound_all.y = y; + switch (m_mode) + { + case wxLC_ICON: { - wxListItemData *item = (wxListItemData*)node->Data(); - int w = 0; - int h = 0; - m_owner->GetImageSize( item->GetImage(), w, h ); - m_bound_icon.x = m_bound_all.x + (m_spacing/2) - (w/2); - m_bound_icon.y = m_bound_all.y + m_spacing - h - 5; - m_bound_icon.width = w; - m_bound_icon.height = h; - if (!item->HasText()) - { - AssignRect( m_bound_hilight, m_bound_icon ); - m_bound_hilight.x -= 5; - m_bound_hilight.y -= 5; - m_bound_hilight.width += 9; - m_bound_hilight.height += 9; - } + AssignRect( m_bound_icon, 0, 0, 0, 0 ); + AssignRect( m_bound_label, 0, 0, 0, 0 ); + AssignRect( m_bound_hilight, m_bound_all ); + wxNode *node = m_items.First(); + if (node) + { + wxListItemData *item = (wxListItemData*)node->Data(); + if (item->HasImage()) + { + wxListItemData *item = (wxListItemData*)node->Data(); + int w = 0; + int h = 0; + m_owner->GetImageSize( item->GetImage(), w, h ); + m_bound_icon.x = m_bound_all.x + (m_spacing/2) - (w/2); + m_bound_icon.y = m_bound_all.y + m_spacing - h - 5; + m_bound_icon.width = w; + m_bound_icon.height = h; + if (!item->HasText()) + { + AssignRect( m_bound_hilight, m_bound_icon ); + m_bound_hilight.x -= 5; + m_bound_hilight.y -= 5; + m_bound_hilight.width += 9; + m_bound_hilight.height += 9; + } + } + if (item->HasText()) + { + wxString s; + item->GetText( s ); + long lw,lh; + dc->GetTextExtent( s, &lw, &lh ); + if (m_bound_all.width > m_spacing) + m_bound_label.x = m_bound_all.x; + else + m_bound_label.x = m_bound_all.x + (m_spacing/2) - lw/2; + m_bound_label.y = m_bound_all.y + m_bound_all.height - lh; + m_bound_label.width = lw; + m_bound_label.height = lh; + AssignRect( m_bound_hilight, m_bound_label ); + m_bound_hilight.x -= 2; + m_bound_hilight.y -= 2; + m_bound_hilight.width += 4; + m_bound_hilight.height += 4; + } + } + break; } - if (item->HasText()) + case wxLC_LIST: { - wxString s; - item->GetText( s ); - long lw,lh; - dc->GetTextExtent( s, &lw, &lh ); - if (m_bound_all.width > m_spacing) - m_bound_label.x = m_bound_all.x; - else - m_bound_label.x = m_bound_all.x + (m_spacing/2) - lw/2; - m_bound_label.y = m_bound_all.y + m_bound_all.height - lh; - m_bound_label.width = lw; - m_bound_label.height = lh; - AssignRect( m_bound_hilight, m_bound_label ); - m_bound_hilight.x -= 2; - m_bound_hilight.y -= 2; - m_bound_hilight.width += 4; - m_bound_hilight.height += 4; + AssignRect( m_bound_label, m_bound_all ); + m_bound_all.x -= 2; + m_bound_all.y -= 2; + m_bound_all.width += 4; + m_bound_all.height += 3; + AssignRect( m_bound_hilight, m_bound_all ); + AssignRect( m_bound_icon, 0, 0, 0, 0 ); + wxNode *node = m_items.First(); + if (node) + { + wxListItemData *item = (wxListItemData*)node->Data(); + if (item->HasImage()) + { + m_bound_icon.x = m_bound_all.x + 2; + m_bound_icon.y = m_bound_all.y + 2; + int w; + int h; + m_owner->GetImageSize( item->GetImage(), w, h ); + m_bound_icon.width = w; + m_bound_icon.height = h; + m_bound_label.x += 4 + w; + m_bound_label.width -= 4 + w; + } + } + break; + } + case wxLC_REPORT: + { + long lw,lh; + dc->GetTextExtent( "H", &lw, &lh ); + m_bound_all.x = 0; + m_bound_all.y -= 0; + m_bound_all.height = lh+3; + m_bound_all.width = window_width; + AssignRect( m_bound_hilight, m_bound_all ); + AssignRect( m_bound_label, m_bound_all ); + AssignRect( m_bound_icon, 0, 0, 0, 0 ); + wxNode *node = m_items.First(); + if (node) + { + wxListItemData *item = (wxListItemData*)node->Data(); + wxString s; + item->GetText( s ); + if (s.IsEmpty()) s = _T("H"); + long lw,lh; + dc->GetTextExtent( s, &lw, &lh ); + m_bound_label.width = lw; + m_bound_label.height = lh; + if (item->HasImage()) + { + m_bound_icon.x = m_bound_all.x + 2; + m_bound_icon.y = m_bound_all.y + 2; + int w; + int h; + m_owner->GetImageSize( item->GetImage(), w, h ); + m_bound_icon.width = w; + m_bound_icon.height = h; + m_bound_label.x += 4 + w; + } + } + break; } - } - break; - } - case wxLC_LIST: - { - AssignRect( m_bound_label, m_bound_all ); - m_bound_all.x -= 2; - m_bound_all.y -= 2; - m_bound_all.width += 4; - m_bound_all.height += 3; - AssignRect( m_bound_hilight, m_bound_all ); - AssignRect( m_bound_icon, 0, 0, 0, 0 ); - break; - } - case wxLC_REPORT: - { - long lw,lh; - dc->GetTextExtent( "H", &lw, &lh ); - m_bound_all.x = 0; - m_bound_all.y -= 0; - m_bound_all.height = lh+3; - m_bound_all.width = window_width; - AssignRect( m_bound_hilight, m_bound_all ); - AssignRect( m_bound_label, 0, 0, 0 ,0 ); - AssignRect( m_bound_icon, 0, 0, 0, 0 ); - break; } - } } void wxListLineData::SetColumnPosition( int index, int x ) @@ -1171,7 +1219,7 @@ void wxListMainWindow::EditLabel( long item ) int w = 0; int h = 0; m_currentEdit->GetLabelExtent( x, y, w, h ); - + wxClientDC dc(this); PrepareDC( dc ); x = dc.LogicalToDeviceX( x ); @@ -1204,6 +1252,7 @@ void wxListMainWindow::OnRenameAccept() info.m_mask = wxLIST_MASK_TEXT; info.m_itemId = le.m_itemIndex; info.m_text = m_renameRes; + info.m_colour = le.m_item.m_colour; SetItem( info ); } @@ -1213,7 +1262,7 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event ) if (!m_current) return; if (m_dirty) return; - if ( !(event.Dragging() || event.ButtonDown() || event.LeftUp()) ) return; + if ( !(event.Dragging() || event.ButtonDown() || event.LeftUp() || event.ButtonDClick()) ) return; wxClientDC dc(this); PrepareDC(dc); @@ -1633,6 +1682,10 @@ void wxListMainWindow::DrawImage( int index, wxDC *dc, int x, int y ) { m_small_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT ); } + if ((m_mode & wxLC_LIST) && (m_small_image_list)) + { + m_small_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT ); + } if ((m_mode & wxLC_REPORT) && (m_small_image_list)) { m_small_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT ); @@ -1652,6 +1705,11 @@ void wxListMainWindow::GetImageSize( int index, int &width, int &height ) m_small_image_list->GetSize( index, width, height ); return; } + if ((m_mode & wxLC_LIST) && (m_small_image_list)) + { + m_small_image_list->GetSize( index, width, height ); + return; + } if ((m_mode & wxLC_REPORT) && (m_small_image_list)) { m_small_image_list->GetSize( index, width, height ); @@ -2081,9 +2139,12 @@ void wxListMainWindow::CalculatePositions() int x = 5; // painting is done at x-2 int y = 5; // painting is done at y-2 int maxWidth = 0; + m_visibleLines = 0; + int m_currentVisibleLines = 0; wxNode *node = m_lines.First(); while (node) { + m_currentVisibleLines++; wxListLineData *line = (wxListLineData*)node->Data(); line->CalculateSize( &dc, iconSpacing ); line->SetPosition( &dc, x, y, clientWidth ); @@ -2092,6 +2153,9 @@ void wxListMainWindow::CalculatePositions() y += lineSpacing; if (y+lineSpacing-6 >= clientHeight) // -6 for earlier "line breaking" { + if (m_currentVisibleLines > m_visibleLines) + m_visibleLines = m_currentVisibleLines; + m_currentVisibleLines = 0; y = 5; x += maxWidth+6; entireWidth += maxWidth+6; @@ -2102,12 +2166,14 @@ void wxListMainWindow::CalculatePositions() if ((tries == 0) && (entireWidth > clientWidth)) { clientHeight -= 15; // scrollbar height + m_visibleLines = 0; + m_currentVisibleLines = 0; break; } if (!node) tries = 1; // everything fits, no second try required } } - m_visibleLines = (clientHeight+6) / (lineSpacing); // +6 for earlier "line breaking" +// m_visibleLines = (5+clientHeight+6) / (lineSpacing); // +6 for earlier "line breaking" int scroll_pos = GetScrollPos( wxHORIZONTAL ); SetScrollbars( m_xScroll, m_yScroll, (entireWidth+15) / m_xScroll, 0, scroll_pos, 0, TRUE ); -- 2.45.2