--- bookmarks_dialog.cpp 2015-12-08 12:25:54.592336187 -0500 +++ bookmarks_dialog_new.cpp 2015-12-08 12:24:50.788353133 -0500 @@ -47,6 +47,16 @@ return ShowModal(); } +int find(wxString a, vector b){ + for(int x = 0; x < b.size(); x++){ + if(b[x].name == a){ + return x; + } + } + return -1; +} + + void CNewBookmarkDialog::OnOK(wxCommandEvent&) { bool const global = xrc_call(*this, "ID_TYPE_GLOBAL", &wxRadioButton::GetValue); @@ -160,6 +170,7 @@ CXmlFile file(wxGetApp().GetSettingsFile(_T("bookmarks"))); auto element = file.Load(); + if (!element) { wxMessageBoxEx(file.GetError(), _("Error loading xml file"), wxICON_ERROR); @@ -167,6 +178,7 @@ } for (auto bookmark = element.child("Bookmark"); bookmark; bookmark = bookmark.next_sibling("Bookmark")) { + wxString Cate; wxString name; wxString local_dir; wxString remote_dir_raw; @@ -194,10 +206,30 @@ bool const comparison = GetTextElementBool(bookmark, "DirectoryComparison"); CBookmarkItemData *data = new CBookmarkItemData(local_dir, remote_dir, sync, comparison); - m_pTree->AppendItem(m_bookmarks_global, name, 1, 1, data); + + //================================================================================= + Cate = GetTextElement(bookmark, "Category"); + if (Cate.empty()){ + m_pTree->AppendItem(m_bookmarks_global, name, 1, 1, data); + } + else{ + if(find(Cate, cate_list) == -1){ + Category temp; + temp.name = Cate; + temp.cate = m_pTree->AppendItem(m_bookmarks_global, _(Cate), 0, 0); + + cate_list.push_back(temp); + m_pTree->SortChildren(cate_list[cate_list.size()-1].cate); + + } + m_pTree->AppendItem(cate_list[find(Cate, cate_list)].cate, name, 1, 1, data); + } + //=================================================================================== + } m_pTree->SortChildren(m_bookmarks_global); + m_pTree->Connect(wxEVT_CONTEXT_MENU, wxCommandEventHandler(CBookmarksDialog::OnMenu), NULL, this); } void CBookmarksDialog::LoadSiteSpecificBookmarks() @@ -226,6 +258,7 @@ m_pTree->SortChildren(m_bookmarks_site); } + int CBookmarksDialog::Run() { if (!Load(m_parent, _T("ID_BOOKMARKS"))) @@ -248,6 +281,8 @@ m_bookmarks_global = m_pTree->AppendItem(root, _("Global bookmarks"), 0, 0); LoadGlobalBookmarks(); m_pTree->Expand(m_bookmarks_global); + + if (m_server) { m_bookmarks_site = m_pTree->AppendItem(root, _("Site-specific bookmarks"), 0, 0); LoadSiteSpecificBookmarks(); @@ -295,24 +330,44 @@ bookmark = element.child("Bookmark"); } } - +//------------------------------------------------------------------------------------------------------------------------------------------------------------------ wxTreeItemIdValue cookie; for (wxTreeItemId child = m_pTree->GetFirstChild(m_bookmarks_global, cookie); child.IsOk(); child = m_pTree->GetNextChild(m_bookmarks_global, cookie)) { - CBookmarkItemData *data = (CBookmarkItemData *)m_pTree->GetItemData(child); - wxASSERT(data); - - auto bookmark = element.append_child("Bookmark"); - AddTextElement(bookmark, "Name", m_pTree->GetItemText(child)); - if (!data->m_local_dir.empty()) - AddTextElement(bookmark, "LocalDir", data->m_local_dir); - if (!data->m_remote_dir.empty()) - AddTextElement(bookmark, "RemoteDir", data->m_remote_dir.GetSafePath()); - if (data->m_sync) - AddTextElementRaw(bookmark, "SyncBrowsing", "1"); - if (data->m_comparison) - AddTextElementRaw(bookmark, "DirectoryComparison", "1"); + if(m_pTree->ItemHasChildren(child)){ + wxTreeItemIdValue cookie2; + for (wxTreeItemId grandchild = m_pTree->GetFirstChild(child, cookie2); grandchild.IsOk(); grandchild = m_pTree->GetNextChild(child, cookie2)){ + CBookmarkItemData *data = (CBookmarkItemData *)m_pTree->GetItemData(grandchild); + wxASSERT(data); + + auto bookmark = element.append_child("Bookmark"); + AddTextElement(bookmark, "Name", m_pTree->GetItemText(grandchild)); + if (!data->m_local_dir.empty()) + AddTextElement(bookmark, "LocalDir", data->m_local_dir); + if (!data->m_remote_dir.empty()) + AddTextElement(bookmark, "RemoteDir", data->m_remote_dir.GetSafePath()); + if (data->m_sync) + AddTextElementRaw(bookmark, "SyncBrowsing", "1"); + if (data->m_comparison) + AddTextElementRaw(bookmark, "DirectoryComparison", "1"); + AddTextElement(bookmark, "Category", m_pTree->GetItemText(child)); + } + }else{ + CBookmarkItemData *data = (CBookmarkItemData *)m_pTree->GetItemData(child); + wxASSERT(data); + + auto bookmark = element.append_child("Bookmark"); + AddTextElement(bookmark, "Name", m_pTree->GetItemText(child)); + if (!data->m_local_dir.empty()) + AddTextElement(bookmark, "LocalDir", data->m_local_dir); + if (!data->m_remote_dir.empty()) + AddTextElement(bookmark, "RemoteDir", data->m_remote_dir.GetSafePath()); + if (data->m_sync) + AddTextElementRaw(bookmark, "SyncBrowsing", "1"); + if (data->m_comparison) + AddTextElementRaw(bookmark, "DirectoryComparison", "1"); + } } - +//------------------------------------------------------------------------------------------------------------------------------------------------------------- if (!file.Save(false)) { wxString msg = wxString::Format(_("Could not write \"%s\", the global bookmarks could no be saved: %s"), file.GetFileName(), file.GetError()); wxMessageBoxEx(msg, _("Error writing xml file"), wxICON_ERROR); @@ -336,13 +391,144 @@ return; } } +//========================================================== +void CBookmarksDialog::saveCategory(wxCommandEvent&) { + UpdateBookmark(); + CInterProcessMutex mutex(MUTEX_GLOBALBOOKMARKS); + + wxTreeItemId item = m_pTree->GetSelection(); + CBookmarkItemData *data = (CBookmarkItemData *)m_pTree->GetItemData(item); + CBookmarkItemData *ldata = new CBookmarkItemData(data->m_local_dir, data->m_remote_dir, data->m_sync,data->m_comparison); + wxString name = m_pTree->GetItemText(item); + + + wxTextEntryDialog dlg(this,"Enter Category Name"); + wxString Cate; + if(dlg.ShowModal() == wxID_OK){ + + wxTreeItemId parent = m_pTree->GetItemParent(item); + + m_is_deleting = true; + m_pTree->Delete(item); + m_pTree->SelectItem(parent); + m_is_deleting = false; + if(!m_pTree->ItemHasChildren(parent) && (item != m_bookmarks_global || item != m_bookmarks_site)){ + m_pTree->Delete(parent); + } + + Cate = dlg.GetValue(); + + if(find(Cate, cate_list) == -1){ + Category temp; + temp.name = Cate; + temp.cate = m_pTree->AppendItem(m_bookmarks_global, _(Cate), 0, 0); + + cate_list.push_back(temp); + m_pTree->SortChildren(cate_list[cate_list.size()-1].cate); + + } + m_pTree->AppendItem(cate_list[find(Cate, cate_list)].cate, name, 1, 1, ldata); + } +} + +void CBookmarksDialog::MoveCategory(wxCommandEvent& event) { + + UpdateBookmark(); + CInterProcessMutex mutex(MUTEX_GLOBALBOOKMARKS); + + wxTreeItemId item = m_pTree->GetSelection(); + CBookmarkItemData *data = (CBookmarkItemData *)m_pTree->GetItemData(item); + CBookmarkItemData *ldata = new CBookmarkItemData(data->m_local_dir, data->m_remote_dir, data->m_sync,data->m_comparison); + wxString name = m_pTree->GetItemText(item); + + + wxTreeItemId parent = m_pTree->GetItemParent(item); + wxString pname = m_pTree->GetItemText(parent); + + m_is_deleting = true; + m_pTree->Delete(item); + m_pTree->SelectItem(parent); + m_is_deleting = false; + if(!m_pTree->ItemHasChildren(parent) && (item != m_bookmarks_global || item != m_bookmarks_site)){ + cate_list.erase(cate_list.begin() + (find(pname, cate_list))); + m_pTree->Delete(parent); + } + + m_pTree->AppendItem(cate_list[event.GetId()].cate, name, 1, 1, ldata); +} + +void CBookmarksDialog::Uncategorize(wxCommandEvent&) { + + UpdateBookmark(); + CInterProcessMutex mutex(MUTEX_GLOBALBOOKMARKS); + + wxTreeItemId item = m_pTree->GetSelection(); + CBookmarkItemData *data = (CBookmarkItemData *)m_pTree->GetItemData(item); + CBookmarkItemData *ldata = new CBookmarkItemData(data->m_local_dir, data->m_remote_dir, data->m_sync,data->m_comparison); + wxString name = m_pTree->GetItemText(item); + + + //---------------- + wxTreeItemId parent = m_pTree->GetItemParent(item); + wxString pname = m_pTree->GetItemText(parent); + m_is_deleting = true; + m_pTree->Delete(item); + m_pTree->SelectItem(parent); + m_is_deleting = false; + if(!m_pTree->ItemHasChildren(parent) && (item != m_bookmarks_global || item != m_bookmarks_site)){ + cate_list.erase(cate_list.begin() + (find(pname, cate_list))); + m_pTree->Delete(parent); + } + //-------------------- + m_pTree->AppendItem(m_bookmarks_global, name, 1, 1, ldata); +} + +void CBookmarksDialog::OnMenu(wxCommandEvent&) { + + wxTreeItemId item = m_pTree->GetSelection(); + wxString name = m_pTree->GetItemText(item); + + if(!(find(name, cate_list) != -1 || item == m_bookmarks_global || item == m_bookmarks_site)){ + + ctmu = new wxMenu; + ctmu->Append(1999, wxT("New Category")); + ctmu->AppendSeparator(); + Move = new wxMenu; + + for(int x = 0; x < cate_list.size();x++){ + Move->Append(x , cate_list[x].name); + + Connect(x, wxEVT_COMMAND_MENU_SELECTED, + wxCommandEventHandler(CBookmarksDialog::MoveCategory)); + } + + ctmu->AppendSubMenu(Move, wxT("Move to ...")); + ctmu->AppendSeparator(); + ctmu->Append(2000,wxT("Uncategorize")); + + Connect(1999, wxEVT_COMMAND_MENU_SELECTED, + wxCommandEventHandler(CBookmarksDialog::saveCategory)); + + Connect(2000, wxEVT_COMMAND_MENU_SELECTED, + wxCommandEventHandler(CBookmarksDialog::Uncategorize)); + + if(m_pTree->GetItemParent(item) == m_bookmarks_global){ + ctmu->Enable(2000,false); + } + wxWindow::PopupMenu(ctmu); + } +} + +//========================================================================== void CBookmarksDialog::OnOK(wxCommandEvent&) { if (!Verify()) return; + UpdateBookmark(); + SaveGlobalBookmarks(); SaveSiteSpecificBookmarks(); @@ -577,11 +763,15 @@ return; wxTreeItemId parent = m_pTree->GetItemParent(item); - + wxString pname = m_pTree->GetItemText(parent); m_is_deleting = true; m_pTree->Delete(item); m_pTree->SelectItem(parent); m_is_deleting = false; + if(!m_pTree->ItemHasChildren(parent) && (item != m_bookmarks_global || item != m_bookmarks_site)){ + cate_list.erase(cate_list.begin() + (find(pname, cate_list))); + m_pTree->Delete(parent); + } } void CBookmarksDialog::OnCopy(wxCommandEvent&)