void MyFrame::LogDialog(wxCommandEvent& event)
{
wxLogMessage("This is some message - everything is ok so far.");
- wxLogMessage("Another message...");
+ wxLogMessage("Another message...\n... this one is on multiple lines");
wxLogWarning("And then something went wrong!");
// if we have this wxYield() here, everything breaks under GTK
wxYield();
wxLogError("Intermediary error handler decided to abort.");
- wxLogError("The top level caller detected an error.");
+ wxLogError("The top level caller detected an unrecoverable error.");
+
wxLog::FlushActive();
wxLogMessage("And this is the same dialog but with only one message.");
dc.SetPen(wxPen(m_owner->m_colourForeground, 1, wxSOLID));
dc.SetBrush(*wxTRANSPARENT_BRUSH);
- for ( size_t n = 0; n < WXSIZEOF(rasterOperations); n++ )
+ size_t n;
+ for ( n = 0; n < WXSIZEOF(rasterOperations); n++ )
{
wxCoord x = 20 + 150*(n%4),
y = 20 + 100*(n/4);
// now some filled rectangles
dc.SetBrush(wxBrush(m_owner->m_colourForeground, wxSOLID));
- for ( size_t n = 0; n < WXSIZEOF(rasterOperations); n++ )
+ for ( n = 0; n < WXSIZEOF(rasterOperations); n++ )
{
wxCoord x = 20 + 150*(n%4),
y = 500 + 100*(n/4);
void OnMenuTest();
// operations
+ void Refresh();
void DeleteSelected();
void ShowProperties();
void CreateNewKey(const wxString& strName);
void OnExpand (wxCommandEvent& event);
void OnCollapse(wxCommandEvent& event);
void OnToggle (wxCommandEvent& event);
+ void OnRefresh (wxCommandEvent& event);
void OnDelete (wxCommandEvent& event);
void OnNewKey (wxCommandEvent& event);
Menu_Expand,
Menu_Collapse,
Menu_Toggle,
+ Menu_Refresh,
Menu_New,
Menu_NewKey,
Menu_NewText,
EVT_MENU(Menu_Expand, RegFrame::OnExpand)
EVT_MENU(Menu_Collapse, RegFrame::OnCollapse)
EVT_MENU(Menu_Toggle, RegFrame::OnToggle)
+ EVT_MENU(Menu_Refresh, RegFrame::OnRefresh)
EVT_MENU(Menu_Delete, RegFrame::OnDelete)
EVT_MENU(Menu_NewKey, RegFrame::OnNewKey)
EVT_MENU(Menu_NewText, RegFrame::OnNewText)
pMenuReg->Append(Menu_Collapse, "&Collapse", "Collapse current key");
pMenuReg->Append(Menu_Toggle, "&Toggle", "Toggle current key");
pMenuReg->AppendSeparator();
+ pMenuReg->Append(Menu_Refresh, "&Refresh", "Refresh the subtree");
+ pMenuReg->AppendSeparator();
pMenuReg->Append(Menu_Info, "&Properties","Information about current selection");
return pMenuReg;
// create the status line
// ----------------------
- int aWidths[2];
- aWidths[0] = 200;
- aWidths[1] = -1;
CreateStatusBar(2);
- SetStatusWidths(2, aWidths);
}
RegFrame::~RegFrame()
m_treeCtrl->ExpandItem(m_treeCtrl->GetSelection(), wxTREE_EXPAND_TOGGLE);
}
+void RegFrame::OnRefresh(wxCommandEvent& event)
+{
+ m_treeCtrl->Refresh();
+}
+
void RegFrame::OnDelete(wxCommandEvent& event)
{
m_treeCtrl->DeleteSelected();
{
int iFlags;
long lId = HitTest(wxPoint(event.GetX(), event.GetY()), iFlags);
- if ( !(iFlags & wxTREE_HITTEST_ONITEMLABEL) ) {
- // take the currently selected item if click not on item
- lId = GetSelection();
- }
- else {
+ if ( iFlags & wxTREE_HITTEST_ONITEMLABEL ) {
+ // select the item first
SelectItem(lId);
}
+ //else: take the currently selected item if click not on item
PopupMenu(m_pMenuPopup, event.GetX(), event.GetY());
}
bool isKey = src->IsKey();
if ( (isKey && (src == dst)) ||
- (!isKey && (src->Parent() == dst)) ) {
+ (!isKey && (dst->Parent() == src)) ) {
wxLogStatus("Can't copy something on itself");
return;
bool ok;
if ( isKey ) {
wxRegKey& key = src->Key();
- ok = key.Copy(dst->Key());
+ wxRegKey keyDst(dst->Key(), src->m_strName);
+ ok = keyDst.Create(FALSE);
+ if ( !ok ) {
+ wxLogError("Key '%s' already exists");
+ }
+ else {
+ ok = key.Copy(keyDst);
+ }
if ( ok && dstExpanded ) {
dst->OnCollapse();
dst->OnExpand();
wxRegKey& key = src->Parent()->Key();
ok = key.CopyValue(src->m_strName, dst->Key());
if ( ok && !m_copyOnDrop ) {
- // we move it, so delete the old one
+ // we moved it, so delete the old one
ok = key.DeleteValue(src->m_strName);
if ( ok ) {
// reexpand the key
void RegTreeCtrl::TreeNode::Refresh()
{
- if ( m_pTree->IsExpanded(Id()) )
- {
+ if ( !IsKey() )
+ return;
+
+ if ( m_pTree->IsExpanded(Id()) ) {
m_pTree->Collapse(Id());
+ OnCollapse();
m_pTree->SetItemHasChildren(Id());
m_pTree->Expand(Id());
+ OnExpand();
+ }
+ else {
+ // just allow it to be expanded
+ m_pTree->SetItemHasChildren(Id());
}
}
return pCurrent->IsKey();
}
+
+void RegTreeCtrl::Refresh()
+{
+ long lId = GetSelection();
+ if ( !lId )
+ return;
+
+ TreeNode *pNode = (TreeNode *)GetItemData(lId);
+
+ wxCHECK_RET( pNode != NULL, "tree item without data?" );
+
+ pNode->Refresh();
+}
+
BEGIN_EVENT_TABLE(MyTreeCtrl, wxTreeCtrl)
EVT_TREE_BEGIN_DRAG(TreeTest_Ctrl, MyTreeCtrl::OnBeginDrag)
EVT_TREE_BEGIN_RDRAG(TreeTest_Ctrl, MyTreeCtrl::OnBeginRDrag)
+ EVT_TREE_END_DRAG(TreeTest_Ctrl, MyTreeCtrl::OnEndDrag)
EVT_TREE_BEGIN_LABEL_EDIT(TreeTest_Ctrl, MyTreeCtrl::OnBeginLabelEdit)
EVT_TREE_END_LABEL_EDIT(TreeTest_Ctrl, MyTreeCtrl::OnEndLabelEdit)
EVT_TREE_DELETE_ITEM(TreeTest_Ctrl, MyTreeCtrl::OnDeleteItem)
wxLogMessage(#name); \
}
-TREE_EVENT_HANDLER(OnBeginDrag)
TREE_EVENT_HANDLER(OnBeginRDrag)
TREE_EVENT_HANDLER(OnDeleteItem)
TREE_EVENT_HANDLER(OnGetInfo)
#undef TREE_EVENT_HANDLER
+void MyTreeCtrl::OnBeginDrag(wxTreeEvent& event)
+{
+ // need to explicitly allow drag
+ if ( event.GetItem() != GetRootItem() )
+ {
+ m_draggedItem = event.GetItem();
+
+ wxLogMessage("OnBeginDrag: started dragging %s",
+ GetItemText(m_draggedItem).c_str());
+
+ event.Allow();
+ }
+ else
+ {
+ wxLogMessage("OnBeginDrag: this item can't be dragged.");
+ }
+}
+
+void MyTreeCtrl::OnEndDrag(wxTreeEvent& event)
+{
+ wxTreeItemId itemSrc = m_draggedItem,
+ itemDst = event.GetItem();
+ m_draggedItem = 0;
+
+ // where to copy the item?
+ if ( itemDst.IsOk() && !ItemHasChildren(itemDst) )
+ {
+ // copy to the parent then
+ itemDst = GetParent(itemDst);
+ }
+
+ if ( !itemDst.IsOk() )
+ {
+ wxLogMessage("OnEndDrag: can't drop here.");
+
+ return;
+ }
+
+ wxString text = GetItemText(itemSrc);
+ wxLogMessage("OnEndDrag: '%s' copied to '%s'.",
+ text.c_str(), GetItemText(itemDst).c_str());
+
+ // just do append here - we could also insert it just before/after the item
+ // on which it was dropped, but this requires slightly more work... we also
+ // completely ignore the client data and icon of the old item but could
+ // copy them as well.
+ //
+ // Finally, we only copy one item here but we might copy the entire tree if
+ // we were dragging a folder.
+ AppendItem(itemDst, text);
+}
+
void MyTreeCtrl::OnBeginLabelEdit(wxTreeEvent& event)
{
wxLogMessage("OnBeginLabelEdit");
void OnBeginDrag(wxTreeEvent& event);
void OnBeginRDrag(wxTreeEvent& event);
+ void OnEndDrag(wxTreeEvent& event);
void OnBeginLabelEdit(wxTreeEvent& event);
void OnEndLabelEdit(wxTreeEvent& event);
void OnDeleteItem(wxTreeEvent& event);
size_t folder);
wxImageList *m_imageListNormal;
- bool m_reverseSort; // flag for OnCompareItems
- wxTreeItemId m_lastItem; // for OnEnsureVisible()
+ bool m_reverseSort; // flag for OnCompareItems
+ wxTreeItemId m_lastItem, // for OnEnsureVisible()
+ m_draggedItem; // item being dragged right now
// NB: due to an ugly wxMSW hack you _must_ use DECLARE_DYNAMIC_CLASS()
// if you want your overloaded OnCompareItems() to be called.