Tried to add sorting to wxTreeCtrl

minor fixes to radiobutton


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1233 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
1998-12-18 10:19:07 +00:00
parent ddcc5f5bc6
commit 0659e7ee61
7 changed files with 199 additions and 110 deletions

View File

@@ -6,7 +6,7 @@
#elif defined(__WXMOTIF__) #elif defined(__WXMOTIF__)
#include "wx/generic/dirdlgg.h" #include "wx/generic/dirdlgg.h"
#elif defined(__WXGTK__) #elif defined(__WXGTK__)
#include "wx/gtk/dirdlg.h" #include "wx/generic/dirdlgg.h"
#elif defined(__WXQT__) #elif defined(__WXQT__)
#include "wx/qt/dirdlg.h" #include "wx/qt/dirdlg.h"
#elif defined(__WXMAC__) #elif defined(__WXMAC__)

View File

@@ -58,51 +58,19 @@
//#include "wx/checkbox.h" //#include "wx/checkbox.h"
#include "wx/treectrl.h" #include "wx/treectrl.h"
//-----------------------------------------------------------------------------
// data
//-----------------------------------------------------------------------------
WXDLLEXPORT_DATA(extern const char*) wxFileSelectorPromptStr; WXDLLEXPORT_DATA(extern const char*) wxFileSelectorPromptStr;
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// wxDirItemData // classes
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
class wxDirItemData : public wxTreeItemData class wxDirItemData;
{ class wxDirCtrl;
public: class wxDirDialog;
wxDirItemData(wxString& path, wxString& name);
~wxDirItemData();
bool HasSubDirs();
wxString *m_path, *m_name;
bool m_isHidden;
bool m_hasSubDirs;
};
//-----------------------------------------------------------------------------
// wxDirCtrl
//-----------------------------------------------------------------------------
class wxDirCtrl: public wxTreeCtrl
{
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( const wxTreeEvent &event );
void OnCollapseItem( const wxTreeEvent &event );
void ShowHidden( const bool yesno );
DECLARE_EVENT_TABLE()
protected:
void CreateItems(const wxTreeItemId &parent);
void SetupSections(void);
wxArrayString m_paths, m_names;
};
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// wxDirDialog // wxDirDialog

View File

@@ -56,6 +56,34 @@ static char * icon1_xpm[] = {
" ", " ",
" "}; " "};
/* XPM */
static char * icon2_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 */
" ",
" @@@@@ ",
" @$$$$$@ ",
" @$#+#+#$@@@@@@ ",
" @$+#+#+$$$$$$@.",
" @$#+#+#+#+#+#@.",
"@@@@@@@@@@@@@#@.",
"@$$$$$$$$$$@@+@.",
"@$#+#+#+#+##.@@.",
" @$#+#+#+#+#+.@.",
" @$+#+#+#+#+#.@.",
" @$+#+#+#+##@..",
" @@@@@@@@@@@@@.",
" .............",
" ",
" "};
static const int ID_DIRCTRL = 1000; static const int ID_DIRCTRL = 1000;
static const int ID_TEXTCTRL = 1001; static const int ID_TEXTCTRL = 1001;
@@ -68,6 +96,50 @@ static const int ID_NEW = 1004;
// wxDirItemData // 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
{
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( const wxTreeEvent &event );
void OnCollapseItem( const 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
//-----------------------------------------------------------------------------
wxDirItemData::wxDirItemData(wxString& path, wxString& name) wxDirItemData::wxDirItemData(wxString& path, wxString& name)
{ {
m_path = new wxString(path); m_path = new wxString(path);
@@ -117,6 +189,7 @@ wxDirCtrl::wxDirCtrl(wxWindow *parent, const wxWindowID id, const wxString &WXUN
{ {
m_imageListNormal = new wxImageList(16, 16, TRUE); m_imageListNormal = new wxImageList(16, 16, TRUE);
m_imageListNormal->Add(wxICON(icon1)); m_imageListNormal->Add(wxICON(icon1));
m_imageListNormal->Add(wxICON(icon2));
SetImageList(m_imageListNormal); SetImageList(m_imageListNormal);
m_showHidden = FALSE; m_showHidden = FALSE;
@@ -157,7 +230,7 @@ void wxDirCtrl::CreateItems(const wxTreeItemId &parent)
for (unsigned int i=0; i<m_paths.Count(); i++) for (unsigned int i=0; i<m_paths.Count(); i++)
{ {
dir_item = new wxDirItemData(m_paths[i],m_names[i]); dir_item = new wxDirItemData(m_paths[i],m_names[i]);
id = AppendItem( parent, m_names[i], 0, -1, dir_item); id = AppendItem( parent, m_names[i], 0, 1, dir_item);
if (dir_item->m_hasSubDirs) SetItemHasChildren(id); if (dir_item->m_hasSubDirs) SetItemHasChildren(id);
} }
} }

View File

@@ -28,6 +28,7 @@
#include "wx/dynarray.h" #include "wx/dynarray.h"
#include "wx/dcclient.h" #include "wx/dcclient.h"
#include "wx/imaglist.h" #include "wx/imaglist.h"
#include "wx/msgdlg.h"
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// array types // array types
@@ -873,40 +874,40 @@ void wxTreeCtrl::SelectItem(const wxTreeItemId& itemId)
void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item) void wxTreeCtrl::EnsureVisible(const wxTreeItemId& item)
{ {
wxGenericTreeItem *gitem = item.m_pItem; wxGenericTreeItem *gitem = item.m_pItem;
int item_y = gitem->GetY(); int item_y = gitem->GetY();
int start_x = 0; int start_x = 0;
int start_y = 0; int start_y = 0;
ViewStart( &start_x, &start_y ); ViewStart( &start_x, &start_y );
start_y *= 10; start_y *= 10;
if (item_y < start_y+3) if (item_y < start_y+3)
{ {
int x = 0; int x = 0;
int y = 0; int y = 0;
m_anchor->GetSize( x, y ); m_anchor->GetSize( x, y );
y += 2*m_lineHeight; y += 2*m_lineHeight;
int x_pos = GetScrollPos( wxHORIZONTAL ); int x_pos = GetScrollPos( wxHORIZONTAL );
SetScrollbars( 10, 10, x/10, y/10, x_pos, item_y/10 ); SetScrollbars( 10, 10, x/10, y/10, x_pos, item_y/10 );
return; return;
} }
int w = 0; int w = 0;
int h = 0; int h = 0;
GetClientSize( &w, &h ); GetClientSize( &w, &h );
if (item_y > start_y+h-26) if (item_y > start_y+h-26)
{ {
int x = 0; int x = 0;
int y = 0; int y = 0;
m_anchor->GetSize( x, y ); m_anchor->GetSize( x, y );
y += 2*m_lineHeight; y += 2*m_lineHeight;
int x_pos = GetScrollPos( wxHORIZONTAL ); int x_pos = GetScrollPos( wxHORIZONTAL );
SetScrollbars( 10, 10, x/10, y/10, x_pos, (item_y-h+30)/10 ); SetScrollbars( 10, 10, x/10, y/10, x_pos, (item_y-h+30)/10 );
return; return;
} }
} }
void wxTreeCtrl::ScrollTo(const wxTreeItemId& WXUNUSED(item)) void wxTreeCtrl::ScrollTo(const wxTreeItemId& WXUNUSED(item))
@@ -919,25 +920,52 @@ wxTextCtrl *wxTreeCtrl::EditLabel( const wxTreeItemId& WXUNUSED(item),
{ {
wxFAIL_MSG("not implemented"); wxFAIL_MSG("not implemented");
return NULL; return (wxTextCtrl*)NULL;
} }
wxTextCtrl *wxTreeCtrl::GetEditControl() const wxTextCtrl *wxTreeCtrl::GetEditControl() const
{ {
wxFAIL_MSG("not implemented"); wxFAIL_MSG("not implemented");
return NULL; return (wxTextCtrl*)NULL;
} }
void wxTreeCtrl::EndEditLabel(const wxTreeItemId& WXUNUSED(item), bool WXUNUSED(discardChanges)) void wxTreeCtrl::EndEditLabel(const wxTreeItemId& WXUNUSED(item), bool WXUNUSED(discardChanges))
{ {
wxFAIL_MSG("not implemented"); wxFAIL_MSG("not implemented");
} }
void wxTreeCtrl::SortChildren( const wxTreeItemId& WXUNUSED(item), wxTreeItemCmpFunc tree_ctrl_compare_func_2;
wxTreeItemCmpFunc *WXUNUSED(cmpFunction))
int tree_ctrl_compare_func_1( wxGenericTreeItem **line1, wxGenericTreeItem **line2 )
{ {
wxFAIL_MSG("not implemented"); if (tree_ctrl_compare_func_2 == NULL)
{
return strcmp( (*line1)->GetText(), (*line2)->GetText() );
}
else
{
wxTreeItemData *data1 = (*line1)->GetData();
wxTreeItemData *data2 = (*line2)->GetData();
return tree_ctrl_compare_func_2( data1, data2 );
}
}
void wxTreeCtrl::SortChildren( const wxTreeItemId& item,
wxTreeItemCmpFunc *cmpFunction)
{
wxGenericTreeItem *gitem = item.m_pItem;
if (!gitem) return;
if (cmpFunction == NULL)
tree_ctrl_compare_func_2 = NULL;
else
tree_ctrl_compare_func_2 = *cmpFunction;
gitem->GetChildren().Sort( *tree_ctrl_compare_func_1 );
m_dirty = TRUE;
} }
wxImageList *wxTreeCtrl::GetImageList() const wxImageList *wxTreeCtrl::GetImageList() const
@@ -963,22 +991,23 @@ void wxTreeCtrl::SetStateImageList(wxImageList *imageList)
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// helpers // helpers
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void wxTreeCtrl::AdjustMyScrollbars() void wxTreeCtrl::AdjustMyScrollbars()
{ {
if (m_anchor) if (m_anchor)
{ {
int x = 0; int x = 0;
int y = 0; int y = 0;
m_anchor->GetSize( x, y ); m_anchor->GetSize( x, y );
y += 2*m_lineHeight; y += 2*m_lineHeight;
int x_pos = GetScrollPos( wxHORIZONTAL ); int x_pos = GetScrollPos( wxHORIZONTAL );
int y_pos = GetScrollPos( wxVERTICAL ); int y_pos = GetScrollPos( wxVERTICAL );
SetScrollbars( 10, 10, x/10, y/10, x_pos, y_pos ); SetScrollbars( 10, 10, x/10, y/10, x_pos, y_pos );
} }
else else
{ {
SetScrollbars( 0, 0, 0, 0 ); SetScrollbars( 0, 0, 0, 0 );
} }
} }
void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc) void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
@@ -1012,7 +1041,12 @@ void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
int image_h = 0; int image_h = 0;
int image_w = 0; int image_w = 0;
if (item->GetImage() != -1) if ((item->IsExpanded()) && (item->GetSelectedImage() != -1))
{
m_imageListNormal->GetSize( item->GetSelectedImage(), image_w, image_h );
image_w += 4;
}
else if (item->GetImage() != -1)
{ {
m_imageListNormal->GetSize( item->GetImage(), image_w, image_h ); m_imageListNormal->GetSize( item->GetImage(), image_w, image_h );
image_w += 4; image_w += 4;
@@ -1020,7 +1054,15 @@ void wxTreeCtrl::PaintItem(wxGenericTreeItem *item, wxDC& dc)
dc.DrawRectangle( item->GetX()-2, item->GetY()-2, image_w+text_w+4, text_h+4 ); dc.DrawRectangle( item->GetX()-2, item->GetY()-2, image_w+text_w+4, text_h+4 );
if (item->GetImage() != -1) if ((item->IsExpanded()) && (item->GetSelectedImage() != -1))
{
dc.SetClippingRegion( item->GetX(), item->GetY(), image_w-2, text_h );
m_imageListNormal->Draw( item->GetSelectedImage(), dc,
item->GetX(), item->GetY()-1,
wxIMAGELIST_DRAW_TRANSPARENT );
dc.DestroyClippingRegion();
}
else if (item->GetImage() != -1)
{ {
dc.SetClippingRegion( item->GetX(), item->GetY(), image_w-2, text_h ); dc.SetClippingRegion( item->GetX(), item->GetY(), image_w-2, text_h );
m_imageListNormal->Draw( item->GetImage(), dc, m_imageListNormal->Draw( item->GetImage(), dc,
@@ -1131,33 +1173,33 @@ void wxTreeCtrl::PaintLevel( wxGenericTreeItem *item, wxDC &dc, int level, int &
void wxTreeCtrl::OnPaint( wxPaintEvent &WXUNUSED(event) ) void wxTreeCtrl::OnPaint( wxPaintEvent &WXUNUSED(event) )
{ {
if ( !m_anchor ) if ( !m_anchor )
return; return;
wxPaintDC dc(this); wxPaintDC dc(this);
PrepareDC( dc ); PrepareDC( dc );
dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT ) ); dc.SetFont( wxSystemSettings::GetSystemFont( wxSYS_SYSTEM_FONT ) );
dc.SetPen( m_dottedPen ); dc.SetPen( m_dottedPen );
m_lineHeight = (int)(dc.GetCharHeight() + 4); m_lineHeight = (int)(dc.GetCharHeight() + 4);
int y = m_lineHeight / 2 + 2; int y = m_lineHeight / 2 + 2;
PaintLevel( m_anchor, dc, 0, y ); PaintLevel( m_anchor, dc, 0, y );
} }
void wxTreeCtrl::OnSetFocus( wxFocusEvent &WXUNUSED(event) ) void wxTreeCtrl::OnSetFocus( wxFocusEvent &WXUNUSED(event) )
{ {
m_hasFocus = TRUE; m_hasFocus = TRUE;
if ( m_current ) if ( m_current )
RefreshLine( m_current ); RefreshLine( m_current );
} }
void wxTreeCtrl::OnKillFocus( wxFocusEvent &WXUNUSED(event) ) void wxTreeCtrl::OnKillFocus( wxFocusEvent &WXUNUSED(event) )
{ {
m_hasFocus = FALSE; m_hasFocus = FALSE;
if ( m_current ) if ( m_current )
RefreshLine( m_current ); RefreshLine( m_current );
} }
void wxTreeCtrl::OnChar( wxKeyEvent &event ) void wxTreeCtrl::OnChar( wxKeyEvent &event )

View File

@@ -89,7 +89,6 @@ LIB_CPP_SRC=\
gtk/dcscreen.cpp \ gtk/dcscreen.cpp \
gtk/dnd.cpp \ gtk/dnd.cpp \
gtk/dialog.cpp \ gtk/dialog.cpp \
gtk/dirdlg.cpp \
gtk/filedlg.cpp \ gtk/filedlg.cpp \
gtk/font.cpp \ gtk/font.cpp \
gtk/frame.cpp \ gtk/frame.cpp \
@@ -122,6 +121,7 @@ LIB_CPP_SRC=\
\ \
generic/choicdgg.cpp \ generic/choicdgg.cpp \
generic/colrdlgg.cpp \ generic/colrdlgg.cpp \
generic/dirdlgg.cpp \
generic/fontdlgg.cpp \ generic/fontdlgg.cpp \
generic/gridg.cpp \ generic/gridg.cpp \
generic/imaglist.cpp \ generic/imaglist.cpp \

View File

@@ -108,6 +108,9 @@ void wxRadioButton::SetValue( bool val )
{ {
wxCHECK_RET( m_widget != NULL, "invalid radiobutton" ); wxCHECK_RET( m_widget != NULL, "invalid radiobutton" );
if ( val == GetValue() )
return;
m_blockFirstEvent = TRUE; m_blockFirstEvent = TRUE;
if (val) if (val)

View File

@@ -108,6 +108,9 @@ void wxRadioButton::SetValue( bool val )
{ {
wxCHECK_RET( m_widget != NULL, "invalid radiobutton" ); wxCHECK_RET( m_widget != NULL, "invalid radiobutton" );
if ( val == GetValue() )
return;
m_blockFirstEvent = TRUE; m_blockFirstEvent = TRUE;
if (val) if (val)