#include "state4.xpm"
#include "state5.xpm"
+#include "unchecked.xpm"
+#include "checked.xpm"
+
#ifndef __WXMSW__
#include "../sample.xpm"
#endif
+static const int NUM_CHILDREN_PER_LEVEL = 5;
+static const int NUM_LEVELS = 2;
+
// verify that the item is ok and insult the user if it is not
#define CHECK_ITEM( item ) if ( !item.IsOk() ) { \
wxMessageBox(wxT("Please select some item first!"), \
MENU_LINK(SetImageSize)
MENU_LINK(CollapseAndReset)
MENU_LINK(EnsureVisible)
+ MENU_LINK(SetFocus)
MENU_LINK(AddItem)
MENU_LINK(InsertItem)
MENU_LINK(IncIndent)
#endif // wxHAS_LAST_VISIBLE
MENU_LINK(ShowNextVisible)
MENU_LINK(ShowPrevVisible)
+ MENU_LINK(ShowParent)
+ MENU_LINK(ShowPrevSibling)
+ MENU_LINK(ShowNextSibling)
#undef MENU_LINK
END_EVENT_TABLE()
tree_menu->Append(TreeTest_SortRev, wxT("Sort in reversed order"));
tree_menu->AppendSeparator();
tree_menu->Append(TreeTest_EnsureVisible, wxT("Make the last item &visible"));
+ tree_menu->Append(TreeTest_SetFocus, wxT("Set &focus to the tree"));
tree_menu->AppendSeparator();
tree_menu->Append(TreeTest_IncIndent, wxT("Add 5 points to indentation\tAlt-I"));
tree_menu->Append(TreeTest_DecIndent, wxT("Reduce indentation by 5 points\tAlt-R"));
#endif // wxHAS_LAST_VISIBLE
item_menu->Append(TreeTest_ShowNextVisible, wxT("Show &next visible"));
item_menu->Append(TreeTest_ShowPrevVisible, wxT("Show &previous visible"));
+ item_menu->AppendSeparator();
+ item_menu->Append(TreeTest_ShowParent, "Show pa&rent");
+ item_menu->Append(TreeTest_ShowPrevSibling, "Show &previous sibling");
+ item_menu->Append(TreeTest_ShowNextSibling, "Show &next sibling");
#ifndef NO_MULTIPLE_SELECTION
item_menu->AppendSeparator();
void MyFrame::OnRecreate(wxCommandEvent& event)
{
OnDeleteAll(event);
- m_treeCtrl->AddTestItemsToTree(5, 2);
+ m_treeCtrl->AddTestItemsToTree(NUM_CHILDREN_PER_LEVEL, NUM_LEVELS);
}
void MyFrame::OnSetImageSize(wxCommandEvent& WXUNUSED(event))
m_treeCtrl->SetAlternateStates(!alternateStates);
m_treeCtrl->CreateStateImageList();
+
+ // normal states < alternate states
+ // so we must reset broken states
+ if ( alternateStates )
+ m_treeCtrl->ResetBrokenStateImages();
}
void MyFrame::OnToggleButtons(wxCommandEvent& WXUNUSED(event))
m_treeCtrl->DoEnsureVisible();
}
+void MyFrame::OnSetFocus(wxCommandEvent& WXUNUSED(event))
+{
+ m_treeCtrl->SetFocus();
+}
+
void MyFrame::OnInsertItem(wxCommandEvent& WXUNUSED(event))
{
int image = wxGetApp().ShowImages() ? MyTreeCtrl::TreeCtrlIcon_File : -1;
label, m_treeCtrl->GetItemText(item));
}
-void MyFrame::DoShowNextOrPrev(TreeFunc1_t pfn, const wxString& label)
+void MyFrame::DoShowRelativeItem(TreeFunc1_t pfn, const wxString& label)
{
wxTreeItemId item = m_treeCtrl->GetSelection();
CHECK_ITEM( item );
- if ( !m_treeCtrl->IsVisible(item) )
+ if ((pfn == (TreeFunc1_t) &wxTreeCtrl::GetPrevVisible
+ || pfn == (TreeFunc1_t) &wxTreeCtrl::GetNextVisible)
+ && !m_treeCtrl->IsVisible(item))
{
wxLogMessage("The selected item must be visible.");
return;
}
- item = (m_treeCtrl->*pfn)(item);
+ wxTreeItemId new_item = (m_treeCtrl->*pfn)(item);
- if ( !item.IsOk() )
+ if ( !new_item.IsOk() )
wxLogMessage("There is no %s item", label);
else
wxLogMessage("The %s item is \"%s\"",
- label, m_treeCtrl->GetItemText(item));
+ label, m_treeCtrl->GetItemText(new_item));
}
void MyFrame::OnSetFgColour(wxCommandEvent& WXUNUSED(event))
CreateStateImageList();
// Add some items to the tree
- AddTestItemsToTree(5, 2);
+ AddTestItemsToTree(NUM_CHILDREN_PER_LEVEL, NUM_LEVELS);
}
void MyTreeCtrl::CreateImageList(int size)
}
else
{
- int width = ::GetSystemMetrics(SM_CXMENUCHECK),
- height = ::GetSystemMetrics(SM_CYMENUCHECK);
-
- // make an state checkbox image list
+ wxIcon icons[2];
+ icons[0] = wxIcon(unchecked_xpm);
+ icons[1] = wxIcon(checked_xpm);
+
+ int width = icons[0].GetWidth(),
+ height = icons[0].GetHeight();
+
+ // Make an state image list containing small icons
states = new wxImageList(width, height, true);
- wxBitmap checkBmp(width, height);
- wxRect rect (0, 0, width, height);
-
- wxRendererNative& renderer = wxRendererNative::Get();
-
- // create no checked image
- {
- // first create bitmap in a memory DC
- wxMemoryDC memDC(checkBmp);
- // then draw a check mark into it
- renderer.DrawCheckBox(this, memDC, rect, 0);
- } // select checkBmp out of memDC
-
- states->Add(checkBmp);
-
- // create checked image
- {
- wxMemoryDC memDC(checkBmp);
- renderer.DrawCheckBox(this, memDC, rect, wxCONTROL_CHECKED);
- }
-
- states->Add(checkBmp);
+ for ( size_t i = 0; i < WXSIZEOF(icons); i++ )
+ states->Add(icons[i]);
}
AssignStateImageList(states);
SetItemTextColour(id, *wxBLUE);
id = GetNextChild(rootId, cookie);
- id = GetNextChild(rootId, cookie);
- SetItemTextColour(id, *wxRED);
- SetItemBackgroundColour(id, *wxLIGHT_GREY);
+ if ( id )
+ id = GetNextChild(rootId, cookie);
+ if ( id )
+ {
+ SetItemTextColour(id, *wxRED);
+ SetItemBackgroundColour(id, *wxLIGHT_GREY);
+ }
}
void MyTreeCtrl::GetItemsRecursively(const wxTreeItemId& idParent,
}
}
+void MyTreeCtrl::DoResetBrokenStateImages(const wxTreeItemId& idParent,
+ wxTreeItemIdValue cookie, int state)
+{
+ wxTreeItemId id;
+
+ if ( !cookie )
+ id = GetFirstChild(idParent, cookie);
+ else
+ id = GetNextChild(idParent, cookie);
+
+ if ( !id.IsOk() )
+ return;
+
+ int curState = GetItemState(id);
+ if ( curState != wxTREE_ITEMSTATE_NONE && curState > state )
+ SetItemState(id, state);
+
+ if (ItemHasChildren(id))
+ DoResetBrokenStateImages(id, 0, state);
+
+ DoResetBrokenStateImages(idParent, cookie, state);
+}
+
void MyTreeCtrl::LogEvent(const wxChar *name, const wxTreeEvent& event)
{
wxTreeItemId item = event.GetItem();
wxPoint pt = event.GetPosition();
wxLogMessage(wxT("OnContextMenu at screen coords (%i, %i)"), pt.x, pt.y);
+
+ event.Skip();
}
void MyTreeCtrl::ShowMenu(wxTreeItemId id, const wxPoint& pt)