From: John L. <jr...@us...> - 2007-11-29 23:35:58
|
Update of /cvsroot/wxlua/wxLua/modules/wxluadebug/src In directory sc8-pr-cvs9.sourceforge.net:/tmp/cvs-serv29041/wxLua/modules/wxluadebug/src Modified Files: wxlstack.cpp Log Message: Made the wxLuaStackDialog much nicer, faster, search in all cols, collapse and expand child tables. Index: wxlstack.cpp =================================================================== RCS file: /cvsroot/wxlua/wxLua/modules/wxluadebug/src/wxlstack.cpp,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** wxlstack.cpp 17 Nov 2007 00:15:07 -0000 1.17 --- wxlstack.cpp 29 Nov 2007 23:35:53 -0000 1.18 *************** *** 22,25 **** --- 22,27 ---- #include "wx/listctrl.h" #include "wx/splitter.h" + #include "wx/progdlg.h" + #include "wx/clipbrd.h" #include "wxluadebug/include/wxlstack.h" *************** *** 48,59 **** IMPLEMENT_ABSTRACT_CLASS(wxLuaStackDialog, wxDialog) BEGIN_EVENT_TABLE(wxLuaStackDialog, wxDialog) EVT_CHOICE( ID_WXLUA_STACK_CHOICE, wxLuaStackDialog::OnSelectStack) ! EVT_BUTTON( ID_WXLUA_STACK_EXPAND_BUTTON, wxLuaStackDialog::OnExpandButton) EVT_TEXT_ENTER( ID_WXLUA_STACK_FIND_COMBO, wxLuaStackDialog::OnFind) EVT_BUTTON( ID_WXLUA_STACK_FINDNEXT_BUTTON, wxLuaStackDialog::OnFind) EVT_BUTTON( ID_WXLUA_STACK_FINDPREV_BUTTON, wxLuaStackDialog::OnFind) EVT_TREE_ITEM_COLLAPSED(ID_WXLUA_STACK_TREECTRL, wxLuaStackDialog::OnTreeItem) --- 50,67 ---- IMPLEMENT_ABSTRACT_CLASS(wxLuaStackDialog, wxDialog) + wxSize wxLuaStackDialog::m_defaultSize(500, 300); + BEGIN_EVENT_TABLE(wxLuaStackDialog, wxDialog) EVT_CHOICE( ID_WXLUA_STACK_CHOICE, wxLuaStackDialog::OnSelectStack) ! EVT_BUTTON( ID_WXLUA_STACK_COLLAPSE_BUTTON, wxLuaStackDialog::OnExpandButton) ! EVT_BUTTON( ID_WXLUA_STACK_EXPAND_BUTTON, wxLuaStackDialog::OnExpandButton) ! ! EVT_MENU( wxID_ANY, wxLuaStackDialog::OnMenu) EVT_TEXT_ENTER( ID_WXLUA_STACK_FIND_COMBO, wxLuaStackDialog::OnFind) EVT_BUTTON( ID_WXLUA_STACK_FINDNEXT_BUTTON, wxLuaStackDialog::OnFind) EVT_BUTTON( ID_WXLUA_STACK_FINDPREV_BUTTON, wxLuaStackDialog::OnFind) + EVT_BUTTON( ID_WXLUA_STACK_FINDMENU_BUTTON, wxLuaStackDialog::OnFind) EVT_TREE_ITEM_COLLAPSED(ID_WXLUA_STACK_TREECTRL, wxLuaStackDialog::OnTreeItem) *************** *** 63,66 **** --- 71,75 ---- EVT_LIST_ITEM_SELECTED( ID_WXLUA_STACK_LISTCTRL, wxLuaStackDialog::OnListItemActivated) EVT_LIST_ITEM_ACTIVATED( ID_WXLUA_STACK_LISTCTRL, wxLuaStackDialog::OnListItemActivated) + EVT_LIST_ITEM_RIGHT_CLICK( ID_WXLUA_STACK_LISTCTRL, wxLuaStackDialog::OnListRightClick) EVT_LIST_DELETE_ITEM( ID_WXLUA_STACK_LISTCTRL, wxLuaStackDialog::OnListItemDeleted) EVT_LIST_DELETE_ALL_ITEMS( ID_WXLUA_STACK_LISTCTRL, wxLuaStackDialog::OnListAllItemsDeleted) *************** *** 71,80 **** m_listCtrl = NULL; m_treeCtrl = NULL; m_stackChoice = NULL; m_stack_sel = -1; m_findComboBox = NULL; ! m_findCaseCheckBox = NULL; m_imageList = NULL; } --- 80,93 ---- m_listCtrl = NULL; m_treeCtrl = NULL; + m_listMenu = NULL; m_stackChoice = NULL; m_stack_sel = -1; m_findComboBox = NULL; ! m_findMenu = NULL; m_imageList = NULL; + + m_show_dup_expand_msg = true; + m_batch_count = 0; } *************** *** 82,89 **** wxWindow* parent, wxWindowID id, const wxString& title, ! const wxPoint& pos, const wxSize& size) { m_wxlState = wxlState; if (!wxDialog::Create(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE | wxDIALOG_MODAL | wxMAXIMIZE_BOX | wxRESIZE_BORDER)) --- 95,105 ---- wxWindow* parent, wxWindowID id, const wxString& title, ! const wxPoint& pos, const wxSize& size_) { m_wxlState = wxlState; + wxSize size(size_); + if (size == wxDefaultSize) size = m_defaultSize; + if (!wxDialog::Create(parent, id, title, pos, size, wxDEFAULT_DIALOG_STYLE | wxDIALOG_MODAL | wxMAXIMIZE_BOX | wxRESIZE_BORDER)) *************** *** 140,148 **** wxDefaultPosition, wxDefaultSize, 0, NULL, 0, wxDefaultValidator ); // help GCC find which fn to call ! m_stackChoice->SetToolTip(wxT("Select Lua stack to display.")); ! wxButton* expandButton = new wxButton(panel, ID_WXLUA_STACK_EXPAND_BUTTON, ! wxT("Expand Item")); ! expandButton->SetToolTip(wxT("Expand all item's children (may take awhile)")); // ----------------------------------------------------------------------- --- 156,168 ---- wxDefaultPosition, wxDefaultSize, 0, NULL, 0, wxDefaultValidator ); // help GCC find which fn to call ! m_stackChoice->SetToolTip(wxT("Select Lua stack frame to display.")); ! wxBitmapButton* expandButton = new wxBitmapButton(panel, ID_WXLUA_STACK_EXPAND_BUTTON, ! wxArtProvider::GetBitmap(wxART_ADD_BOOKMARK, wxART_BUTTON)); ! expandButton->SetToolTip(wxT("Expand selected item's children (may take awhile)")); ! ! wxBitmapButton* collapseButton = new wxBitmapButton(panel, ID_WXLUA_STACK_COLLAPSE_BUTTON, ! wxArtProvider::GetBitmap(wxART_DEL_BOOKMARK, wxART_BUTTON)); ! collapseButton->SetToolTip(wxT("Collapse selected item's children (may take awhile)")); // ----------------------------------------------------------------------- *************** *** 153,157 **** wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN | wxTE_PROCESS_ENTER); ! m_findComboBox->SetToolTip(wxT("Enter variable name or table key to find")); wxBitmapButton* findPrev = new wxBitmapButton( panel, ID_WXLUA_STACK_FINDPREV_BUTTON, --- 173,177 ---- wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN | wxTE_PROCESS_ENTER); ! m_findComboBox->SetToolTip(wxT("Enter string to find")); wxBitmapButton* findPrev = new wxBitmapButton( panel, ID_WXLUA_STACK_FINDPREV_BUTTON, *************** *** 162,169 **** findNext->SetToolTip(wxT("Find next instance")); ! m_findCaseCheckBox = new wxCheckBox(panel, ID_WXLUA_STACK_FINDCASE_CHECKBOX, ! wxT("Match case")); ! m_findCaseCheckBox->SetValue(true); ! m_findCaseCheckBox->SetToolTip(wxT("Match case when finding")); // ----------------------------------------------------------------------- --- 182,200 ---- findNext->SetToolTip(wxT("Find next instance")); ! wxBitmapButton* findMenuButton = new wxBitmapButton(panel, ID_WXLUA_STACK_FINDMENU_BUTTON, ! wxArtProvider::GetBitmap(wxART_HELP_SETTINGS, wxART_BUTTON)); ! findMenuButton->SetToolTip(wxT("Select find options")); ! ! m_findMenu = new wxMenu(wxT("Find Options"), 0); ! m_findMenu->Append(ID_WXLUA_STACK_FINDMENU_CASE, wxT("&Case sensitive"), wxT("Case sensitive searching"), wxITEM_CHECK); ! m_findMenu->AppendSeparator(); ! m_findMenu->Append(ID_WXLUA_STACK_FINDMENU_ALL, wxT("Search everywhere"), wxT("Search in all columns"), wxITEM_CHECK); ! m_findMenu->Append(ID_WXLUA_STACK_FINDMENU_NAME, wxT("Search names"), wxT("Search in name column"), wxITEM_CHECK); ! m_findMenu->Append(ID_WXLUA_STACK_FINDMENU_LEVEL, wxT("Search level"), wxT("Search in level column"), wxITEM_CHECK); ! m_findMenu->Append(ID_WXLUA_STACK_FINDMENU_KEYTYPE, wxT("Search key type"), wxT("Search in key type column"), wxITEM_CHECK); ! m_findMenu->Append(ID_WXLUA_STACK_FINDMENU_VALUETYPE, wxT("Search value type"), wxT("Search in value type column"), wxITEM_CHECK); ! m_findMenu->Append(ID_WXLUA_STACK_FINDMENU_VALUE, wxT("Search values"), wxT("Search in value column"), wxITEM_CHECK); ! ! m_findMenu->Check(ID_WXLUA_STACK_FINDMENU_NAME, true); // ----------------------------------------------------------------------- *************** *** 174,180 **** topSizer->Add(stackText, wxSizerFlags().Expand().Border().Align(wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL)); ! wxFlexGridSizer* stackSizer = new wxFlexGridSizer(2, 1); stackSizer->AddGrowableCol(0); stackSizer->Add(m_stackChoice, wxSizerFlags().Expand().Border()); stackSizer->Add(expandButton, wxSizerFlags().Border()); topSizer->Add(stackSizer, wxSizerFlags().Expand()); --- 205,212 ---- topSizer->Add(stackText, wxSizerFlags().Expand().Border().Align(wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL)); ! wxFlexGridSizer* stackSizer = new wxFlexGridSizer(3, 1); stackSizer->AddGrowableCol(0); stackSizer->Add(m_stackChoice, wxSizerFlags().Expand().Border()); + stackSizer->Add(collapseButton, wxSizerFlags().Border()); stackSizer->Add(expandButton, wxSizerFlags().Border()); topSizer->Add(stackSizer, wxSizerFlags().Expand()); *************** *** 187,191 **** findSizer->Add(findPrev, wxSizerFlags().Expand().Border()); findSizer->Add(findNext, wxSizerFlags().Expand().Border()); ! findSizer->Add(m_findCaseCheckBox, wxSizerFlags().Expand().Border()); topSizer->Add(findSizer, wxSizerFlags().Expand()); --- 219,224 ---- findSizer->Add(findPrev, wxSizerFlags().Expand().Border()); findSizer->Add(findNext, wxSizerFlags().Expand().Border()); ! ! findSizer->Add(findMenuButton, wxSizerFlags().Expand().Border()); topSizer->Add(findSizer, wxSizerFlags().Expand()); *************** *** 227,233 **** m_listCtrl->SetColumnWidth(3, txt_width); // ----------------------------------------------------------------------- ! m_splitterWin->SplitVertically(m_treeCtrl, m_listCtrl, 200); // use sizers to layout the windows in the panel of the dialog --- 260,273 ---- m_listCtrl->SetColumnWidth(3, txt_width); + m_listMenu = new wxMenu(wxEmptyString, 0); + m_listMenu->Append(ID_WXLUA_STACK_LISTMENU_COPY0, wxT("Copy name"), wxT("Copy name to clipboard"), wxITEM_NORMAL); + m_listMenu->Append(ID_WXLUA_STACK_LISTMENU_COPY1, wxT("Copy level"), wxT("Copy level to clipboard"), wxITEM_NORMAL); + m_listMenu->Append(ID_WXLUA_STACK_LISTMENU_COPY2, wxT("Copy key type"), wxT("Copy key type to clipboard"), wxITEM_NORMAL); + m_listMenu->Append(ID_WXLUA_STACK_LISTMENU_COPY3, wxT("Copy value type"), wxT("Copy value type to clipboard"), wxITEM_NORMAL); + m_listMenu->Append(ID_WXLUA_STACK_LISTMENU_COPY4, wxT("Copy value"), wxT("Copy value to clipboard"), wxITEM_NORMAL); + // ----------------------------------------------------------------------- ! m_splitterWin->SplitVertically(m_treeCtrl, m_listCtrl, 160); // use sizers to layout the windows in the panel of the dialog *************** *** 235,242 **** rootSizer->Add(topSizer, 0, wxEXPAND|wxBOTTOM, 5); rootSizer->Add(m_splitterWin, 1, wxEXPAND); ! rootSizer->SetMinSize(450, 400); panel->SetSizer(rootSizer); rootSizer->SetSizeHints(this); EnumerateStack(); --- 275,284 ---- rootSizer->Add(topSizer, 0, wxEXPAND|wxBOTTOM, 5); rootSizer->Add(m_splitterWin, 1, wxEXPAND); ! rootSizer->SetMinSize(200, 150); panel->SetSizer(rootSizer); rootSizer->SetSizeHints(this); + SetSize(size); // force last good/known size + EnumerateStack(); *************** *** 246,252 **** --- 288,300 ---- wxLuaStackDialog::~wxLuaStackDialog() { + if (!IsFullScreen() && !IsIconized() && !IsMaximized()) + m_defaultSize = GetSize(); + RemoveAllLuaReferences(); DeleteAllListItemData(); + delete m_listMenu; + delete m_findMenu; + if (m_listCtrl) m_listCtrl->SetImageList(NULL, wxIMAGE_LIST_SMALL); if (m_treeCtrl) m_treeCtrl->SetImageList(NULL); *************** *** 439,445 **** wxCHECK_RET(lc_item_ <= m_listCtrl->GetItemCount(), wxT("Attempting to add list item past end")); ! if (debugData.GetCount() == 0) ! return; ! else { wxTreeItemId treeId; --- 487,491 ---- wxCHECK_RET(lc_item_ <= m_listCtrl->GetItemCount(), wxT("Attempting to add list item past end")); ! if (debugData.GetCount() > 0) { wxTreeItemId treeId; *************** *** 476,479 **** --- 522,527 ---- m_treeCtrl->SetItemHasChildren(treeId); + BeginBatch(); + size_t n, count = debugData.GetCount(); long lc_item = lc_item_; *************** *** 523,533 **** } // NOTE : The MSW treectrl will expand and immediately collapse a node if you call Expand() // from within a handler, don't do anything and it works... #if !defined(WXLUA_STACK_MSWTREE) // Cannot expand hidden root, nor can you check it ! if (treeId && ! ((treeId != m_treeCtrl->GetRootItem()) || ((m_treeCtrl->GetWindowStyle() & wxTR_HIDE_ROOT) == 0)) && ! !m_treeCtrl->IsExpanded(treeId)) m_treeCtrl->Expand(treeId); #endif //!defined(WXLUA_STACK_MSWTREE) --- 571,582 ---- } + EndBatch(); + // NOTE : The MSW treectrl will expand and immediately collapse a node if you call Expand() // from within a handler, don't do anything and it works... #if !defined(WXLUA_STACK_MSWTREE) // Cannot expand hidden root, nor can you check it ! if (treeId && !m_treeCtrl->IsExpanded(treeId) && ! ((treeId != m_treeCtrl->GetRootItem()) || ((m_treeCtrl->GetWindowStyle() & wxTR_HIDE_ROOT) == 0))) m_treeCtrl->Expand(treeId); #endif //!defined(WXLUA_STACK_MSWTREE) *************** *** 560,563 **** --- 609,637 ---- } + + void wxLuaStackDialog::BeginBatch() + { + if (m_batch_count == 0) + { + m_listCtrl->Freeze(); + m_treeCtrl->Freeze(); + } + + m_batch_count++; + } + + void wxLuaStackDialog::EndBatch() + { + if (m_batch_count == 1) + { + m_listCtrl->Thaw(); + m_treeCtrl->Thaw(); + } + + if (m_batch_count > 0) + m_batch_count--; + } + + wxTreeItemId wxLuaStackDialog::FindTreeItemId(const wxTreeItemId& id_, wxLuaStackListData* stkListData) const { *************** *** 601,652 **** } ! void wxLuaStackDialog::OnExpandButton(wxCommandEvent &event) { ! wxBusyCursor wait; long start_item = m_listCtrl->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); // they must select an item if (start_item < 0) return; - int level = -1; - int level_count = 1; ! while (level_count > 0) ! { ! level_count = 0; ! for (long i = start_item; i < m_listCtrl->GetItemCount(); ++i) ! { ! wxString s(m_listCtrl->GetItemText(i)); ! if (s.Find(wxT("--> _G")) == wxNOT_FOUND) ! { ! int cur_level = (s.BeforeLast(wxT('>')).Length() + 1) / 3; ! if (level < 0) ! { ! // initialze level 1st time through and don't recheck first item ! level = cur_level; ! start_item = i+1; ! } ! else if (cur_level <= level) ! { ! // we've left the start item, all done ! level_count = 0; ! break; ! } ! if (cur_level == level) ! { ! level_count++; ! ExpandItem(i, false); ! } ! } ! else if (i == start_item) // we never expand global _G ! return; ! } ! if (level_count > 0) ! level++; ! } } --- 675,744 ---- } ! void wxLuaStackDialog::DoExpandCollapse(const wxTreeItemId& item, bool expand, wxProgressDialog* dlg, long& counter) { ! if (counter < 0) // allows for immediate exit, see below ! return; ! ! if (dlg && (counter % 20 == 0)) ! { ! wxString msg; ! if (expand) ! msg.Printf(wxT("Expanding nodes : %ld"), counter); ! else ! msg.Printf(wxT("Collapsing nodes : %ld"), counter); ! ! if (!dlg->Pulse(msg)) ! { ! counter = -1; ! return; ! } ! } ! ! if (expand) ! m_treeCtrl->Expand(item); + // then (recursively) expand all the children + wxTreeItemIdValue cookie; + for ( wxTreeItemId idCurr = m_treeCtrl->GetFirstChild(item, cookie); + idCurr.IsOk(); + idCurr = m_treeCtrl->GetNextChild(item, cookie) ) + { + DoExpandCollapse(idCurr, expand, dlg, ++counter); + } + + if (!expand) + m_treeCtrl->Collapse(item); + } + + + void wxLuaStackDialog::OnExpandButton(wxCommandEvent &event) + { long start_item = m_listCtrl->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); // they must select an item if (start_item < 0) return; ! wxLuaStackListData* stkListData = (wxLuaStackListData*)m_listCtrl->GetItemData(start_item); ! wxTreeItemId treeId = stkListData->m_treeId; ! bool expand = event.GetId() == ID_WXLUA_STACK_EXPAND_BUTTON; ! wxString caption; ! if (expand) ! caption = wxT("wxLua Stack Expanding node"); ! else ! caption = wxT("wxLua Stack Collapsing node"); ! wxProgressDialog dlg(caption, wxEmptyString, 100, this, ! wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_CAN_ABORT); ! m_show_dup_expand_msg = false; ! BeginBatch(); ! ! long counter = 0; ! DoExpandCollapse(treeId, expand, &dlg, counter); ! ! EndBatch(); ! m_show_dup_expand_msg = true; } *************** *** 669,674 **** --- 761,841 ---- } + void wxLuaStackDialog::OnMenu(wxCommandEvent& event) + { + int id = event.GetId(); + bool checked = event.IsChecked(); + + if (id == ID_WXLUA_STACK_FINDMENU_ALL) + { + m_findMenu->Check(ID_WXLUA_STACK_FINDMENU_NAME, checked); + m_findMenu->Check(ID_WXLUA_STACK_FINDMENU_LEVEL, checked); + m_findMenu->Check(ID_WXLUA_STACK_FINDMENU_KEYTYPE, checked); + m_findMenu->Check(ID_WXLUA_STACK_FINDMENU_VALUETYPE, checked); + m_findMenu->Check(ID_WXLUA_STACK_FINDMENU_VALUE, checked); + } + else if ((id >= ID_WXLUA_STACK_FINDMENU_NAME) && (id <= ID_WXLUA_STACK_FINDMENU_VALUE)) + { + bool are_checked = m_findMenu->IsChecked(ID_WXLUA_STACK_FINDMENU_NAME) && + m_findMenu->IsChecked(ID_WXLUA_STACK_FINDMENU_LEVEL) && + m_findMenu->IsChecked(ID_WXLUA_STACK_FINDMENU_KEYTYPE) && + m_findMenu->IsChecked(ID_WXLUA_STACK_FINDMENU_VALUETYPE) && + m_findMenu->IsChecked(ID_WXLUA_STACK_FINDMENU_VALUE); + + if (m_findMenu->IsChecked(ID_WXLUA_STACK_FINDMENU_ALL) != checked) + m_findMenu->Check(ID_WXLUA_STACK_FINDMENU_ALL, are_checked); + } + else if ((id >= ID_WXLUA_STACK_LISTMENU_COPY0) && (id <= ID_WXLUA_STACK_LISTMENU_COPY4)) + { + long list_item = m_listCtrl->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); + // they must select an item + if (list_item >= 0) + { + wxListItem li; + li.SetId(list_item); + li.SetMask(wxLIST_MASK_TEXT); + li.SetColumn(id - ID_WXLUA_STACK_LISTMENU_COPY0); + m_listCtrl->GetItem(li); + + if (wxTheClipboard->Open()) + { + // This data objects are held by the clipboard, + // so do not delete them in the app. + wxTheClipboard->SetData( new wxTextDataObject(li.GetText()) ); + wxTheClipboard->Close(); + } + } + } + } + void wxLuaStackDialog::OnFind(wxCommandEvent &event) { + if (event.GetId() == ID_WXLUA_STACK_FINDMENU_BUTTON) + { + wxWindow* button = ((wxWindow*)event.GetEventObject()); + wxSize s(button->GetSize()); + button->PopupMenu(m_findMenu, 0, s.GetHeight()); + + return; + } + + // Remaining events we handle are for finding + + bool find_col[5] = { + m_findMenu->IsChecked(ID_WXLUA_STACK_FINDMENU_NAME), + m_findMenu->IsChecked(ID_WXLUA_STACK_FINDMENU_LEVEL), + m_findMenu->IsChecked(ID_WXLUA_STACK_FINDMENU_KEYTYPE), + m_findMenu->IsChecked(ID_WXLUA_STACK_FINDMENU_VALUETYPE), + m_findMenu->IsChecked(ID_WXLUA_STACK_FINDMENU_VALUE), + }; + + // Send warning instead of silently doing nothing + if (!find_col[0] && !find_col[1] && !find_col[2] && !find_col[3] && !find_col[4]) + { + wxMessageBox(wxT("Please select the columns to search with the find options button"), + wxT("wxLua Stack Find Error"), + wxOK|wxICON_EXCLAMATION|wxCENTRE, this); + return; + } + wxString findStr = m_findComboBox->GetValue(); if (findStr.IsEmpty()) *************** *** 678,685 **** wxLuaPrependComboBoxString(findStr, 10, m_findComboBox); ! bool match_case = m_findCaseCheckBox->IsChecked(); if (!match_case) findStr = findStr.Lower(); ! long direction = event.GetId() == ID_WXLUA_STACK_FINDPREV_BUTTON ? -1 : 1; long list_count = m_listCtrl->GetItemCount(); --- 845,852 ---- wxLuaPrependComboBoxString(findStr, 10, m_findComboBox); ! bool match_case = m_findMenu->IsChecked(ID_WXLUA_STACK_FINDMENU_CASE); if (!match_case) findStr = findStr.Lower(); ! long direction = (event.GetId() == ID_WXLUA_STACK_FINDPREV_BUTTON) ? -1 : 1; long list_count = m_listCtrl->GetItemCount(); *************** *** 688,695 **** int wrap_count = 0; // start at current item and wrap back around ! while (wrap_count < 2) { long i = 0; ! bool found = false; if (wrap_count == 0) --- 855,864 ---- int wrap_count = 0; // start at current item and wrap back around ! bool found = false; ! ! while ((wrap_count < 2) && !found) { long i = 0; ! found = false; if (wrap_count == 0) *************** *** 714,732 **** } ! for ( ; (i >= 0) && (i < list_count); i = i + direction) { ! if ((match_case && (m_listCtrl->GetItemText(i).Find(findStr) != wxNOT_FOUND)) || ! (!match_case && (m_listCtrl->GetItemText(i).Lower().Find(findStr) != wxNOT_FOUND))) { ! m_listCtrl->SetItemState(i, wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED); ! m_listCtrl->SetItemState(i, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED); ! m_listCtrl->EnsureVisible(i); ! found = true; ! break; } } wrap_count++; - if (found) break; } } --- 883,913 ---- } ! for ( ; (i >= 0) && (i < list_count) && !found; i = i + direction) { ! wxListItem li; ! li.SetId(i); ! li.SetMask(wxLIST_MASK_TEXT); ! ! for (int col = 0; (col < 5) && !found; col++) { ! if (!find_col[col]) continue; ! ! li.SetColumn(col); ! m_listCtrl->GetItem(li); ! wxString txt(li.GetText()); ! ! if ((match_case && (txt.Find(findStr) != wxNOT_FOUND)) || ! (!match_case && (txt.Lower().Find(findStr) != wxNOT_FOUND))) ! { ! m_listCtrl->SetItemState(i, wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED); ! m_listCtrl->SetItemState(i, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED); ! m_listCtrl->EnsureVisible(i); ! found = true; ! break; ! } } } wrap_count++; } } *************** *** 757,769 **** if (list_item < 0) return; // not an item that we can do anything with ! if (event.GetEventType() == wxEVT_COMMAND_TREE_ITEM_EXPANDED) { ExpandItem(list_item); } ! else if (event.GetEventType() == wxEVT_COMMAND_TREE_ITEM_COLLAPSED) { CollapseItem(list_item); } ! else if (event.GetEventType() == wxEVT_COMMAND_TREE_SEL_CHANGED) { m_listCtrl->SetItemState(list_item, wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED); --- 938,952 ---- if (list_item < 0) return; // not an item that we can do anything with ! int evt_type = event.GetEventType(); ! ! if (evt_type == wxEVT_COMMAND_TREE_ITEM_EXPANDED) { ExpandItem(list_item); } ! else if (evt_type == wxEVT_COMMAND_TREE_ITEM_COLLAPSED) { CollapseItem(list_item); } ! else if (evt_type == wxEVT_COMMAND_TREE_SEL_CHANGED) { m_listCtrl->SetItemState(list_item, wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED); *************** *** 810,814 **** } ! bool wxLuaStackDialog::ExpandItem(long lc_item, bool show_err_msg) { wxCHECK_MSG((lc_item >= 0) && (lc_item < m_listCtrl->GetItemCount()), false, --- 993,1005 ---- } ! void wxLuaStackDialog::OnListRightClick(wxListEvent &event) // FIXME for easy debugging of mem addresses ! { ! event.Skip(); ! ! if (event.GetIndex() >= 0) ! m_listCtrl->PopupMenu(m_listMenu); ! } ! ! bool wxLuaStackDialog::ExpandItem(long lc_item) { wxCHECK_MSG((lc_item >= 0) && (lc_item < m_listCtrl->GetItemCount()), false, *************** *** 821,825 **** wxCHECK_MSG(stkListData != NULL, false, wxT("Invalid wxLuaStack data")); wxLuaDebugItem* debugItem = stkListData->GetDebugItem(); ! wxCHECK_MSG((debugItem != NULL), false, wxT("Invalid debug item")); int nRef = debugItem->GetReference(); --- 1012,1016 ---- wxCHECK_MSG(stkListData != NULL, false, wxT("Invalid wxLuaStack data")); wxLuaDebugItem* debugItem = stkListData->GetDebugItem(); ! wxCHECK_MSG(debugItem != NULL, false, wxT("Invalid debug item")); int nRef = debugItem->GetReference(); *************** *** 833,836 **** --- 1024,1032 ---- m_listCtrl->SetItemImage(lc_item, IMG_TABLE_OPEN); + wxString val(debugItem->GetValue()); + long vkey = 0; + wxCHECK_MSG(val.BeforeFirst(wxT(' ')).ToLong(&vkey, 16), false, wxT("Invalid table item")); + m_expandedItems[vkey] = (long)stkListData; + FillTableEntry(lc_item, stkListData->m_childrenDebugData); expanded = true; *************** *** 841,847 **** if (debugItem->GetValueType() == WXLUAARG_Table) { ! wxString val = debugItem->GetValue(); ! int n, count = m_listCtrl->GetItemCount(); for (n = 0; n < count; n++) { --- 1037,1063 ---- if (debugItem->GetValueType() == WXLUAARG_Table) { ! wxString val(debugItem->GetValue()); ! long vkey = 0; ! wxCHECK_MSG(val.BeforeFirst(wxT(' ')).ToLong(&vkey, 16), false, wxT("Invalid table item")); ! if (m_expandedItems[vkey]) ! { ! if (m_show_dup_expand_msg) ! { ! wxMessageBox(wxT("Cannot expand linked tables,\nplease see the already expanded table."), ! wxT("wxLua Stack"), wxOK | wxCENTRE, this); ! ! long n = m_listCtrl->FindItem(0, (long)m_expandedItems[vkey]); ! ! m_listCtrl->SetItemState(n, wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED); ! m_listCtrl->SetItemState(n, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED); ! m_listCtrl->EnsureVisible(n); ! } ! ! return false; ! } ! ! /* ! long n, count = m_listCtrl->GetItemCount(); for (n = 0; n < count; n++) { *************** *** 850,861 **** wxLuaDebugItem* debugItem_n = stkListData_n->GetDebugItem(); ! if (debugItem_n && (debugItem_n != debugItem) && (debugItem_n->GetValue() == val) && ! debugItem_n->GetFlagBit(WXLUA_DEBUGITEM_EXPANDED)) { ! if (show_err_msg) { wxMessageBox(wxT("Cannot expand linked tables,\nplease see the already expanded table."), ! wxT("wxLua Stack"), ! wxOK | wxCENTRE, this); m_listCtrl->SetItemState(n, wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED); --- 1066,1077 ---- wxLuaDebugItem* debugItem_n = stkListData_n->GetDebugItem(); ! if (debugItem_n && (debugItem_n != debugItem) && ! debugItem_n->GetFlagBit(WXLUA_DEBUGITEM_EXPANDED) && ! (debugItem_n->GetValue() == val)) { ! if (m_show_dup_expand_msg) { wxMessageBox(wxT("Cannot expand linked tables,\nplease see the already expanded table."), ! wxT("wxLua Stack"), wxOK | wxCENTRE, this); m_listCtrl->SetItemState(n, wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED); *************** *** 867,870 **** --- 1083,1087 ---- } } + */ } *************** *** 907,910 **** --- 1124,1132 ---- m_listCtrl->SetItemImage(lc_item, IMG_TABLE_OPEN); + wxString val(debugItem->GetValue()); + long vkey = 0; + wxCHECK_MSG(val.BeforeFirst(wxT(' ')).ToLong(&vkey, 16), false, wxT("Invalid table item")); + m_expandedItems[vkey] = (long)stkListData; + int nIndex = debugItem->GetIndex() + 1; EnumerateTable(nRef, nIndex, lc_item); *************** *** 930,933 **** --- 1152,1157 ---- wxLuaDebugData childData = stkListData->m_childrenDebugData; + BeginBatch(); + // Collapse the item, remove children if (debugItem->GetFlagBit(WXLUA_DEBUGITEM_EXPANDED)) *************** *** 935,939 **** if (childData.Ok()) { ! for (int n = 0; n < m_listCtrl->GetItemCount(); n++) { wxLuaStackListData* stkListData_n = (wxLuaStackListData*)m_listCtrl->GetItemData(n); --- 1159,1165 ---- if (childData.Ok()) { ! long n, count = m_listCtrl->GetItemCount(); ! ! for (n = lc_item+1; n < count; n++) { wxLuaStackListData* stkListData_n = (wxLuaStackListData*)m_listCtrl->GetItemData(n); *************** *** 953,957 **** m_listCtrl->DeleteItem(n); ! n = (n > 2) ? (n - 2) : -1; } } --- 1179,1184 ---- m_listCtrl->DeleteItem(n); ! n = (n > 2) ? (n - 2) : -1; // back up and try again ! count = m_listCtrl->GetItemCount(); } } *************** *** 966,971 **** --- 1193,1205 ---- debugItem->SetFlagBit(WXLUA_DEBUGITEM_EXPANDED, false); m_listCtrl->SetItemImage(lc_item, IMG_TABLE); + + wxString val(debugItem->GetValue()); + long vkey = 0; + wxCHECK_MSG(val.BeforeFirst(wxT(' ')).ToLong(&vkey, 16), false, wxT("Invalid table item")); + m_expandedItems.erase(vkey); } + EndBatch(); + return collapsed; } *************** *** 976,979 **** --- 1210,1218 ---- wxCHECK_RET(stkListData != NULL, wxT("wxLuaStackDialog::OnItemDeleted not handled")); + wxString val(stkListData->GetDebugItem()->GetValue()); + long vkey = 0; + val.BeforeFirst(wxT(' ')).ToLong(&vkey, 16); + m_expandedItems.erase(vkey); + // make sure that we don't forget any items... if (stkListData->m_treeId) *************** *** 986,991 **** void wxLuaStackDialog::OnListAllItemsDeleted(wxListEvent &event) { ! void RemoveAllLuaReferences(); ! void DeleteAllListItemData(); event.Skip(); } --- 1225,1231 ---- void wxLuaStackDialog::OnListAllItemsDeleted(wxListEvent &event) { ! RemoveAllLuaReferences(); ! DeleteAllListItemData(); ! m_expandedItems.clear(); event.Skip(); } *************** *** 993,997 **** void wxLuaStackDialog::DeleteAllListItemData() { ! int i, count = m_listCtrl->GetItemCount(); for (i = 0; i < count; i++) { --- 1233,1239 ---- void wxLuaStackDialog::DeleteAllListItemData() { ! m_expandedItems.clear(); ! ! long i, count = m_listCtrl->GetItemCount(); for (i = 0; i < count; i++) { *************** *** 1008,1018 **** if (!m_wxlState.Ok()) return; // doesn't have to be ok - // try first to remove the refs in the listctrl (sanity check really) - // make sure that we reset their data's ref to LUA_NOREF too. - int i; /* ! // Remove the references using the listctrl data itself for (i = 0; i < m_listCtrl->GetItemCount(); ++i) { --- 1250,1260 ---- if (!m_wxlState.Ok()) return; // doesn't have to be ok int i; /* ! // try first to remove the refs in the listctrl (sanity check really) ! // make sure that we reset their data's ref to LUA_NOREF too. ! ! // Remove the references using the listctrl data itself for (i = 0; i < m_listCtrl->GetItemCount(); ++i) { |