52 #include <wx/treectrl.h>
53 #include <wx/wupdlock.h>
65 wxTreeItemData* data = treeCtrl.GetItemData(compacted_node);
69 auto parent_folder =
dynamic_cast<PT::CProjectFolder*
>(treeCtrl.GetItemData(treeCtrl.GetItemParent(compacted_node)));
72 auto folder_data = folder->
GetData();
73 auto total = folder_data->SetItems().size();
76 for (
auto& it : folder_data->SetItems()) {
79 objects::CProjectItem& prj_item = *it;
83 parent_folder->AppendChildItem(treeCtrl, *new_item);
85 if (++
cnt % 3000 == 0 && sb_srv) {
86 str.Printf(
wxT(
"Expanding project items (%d out of %d)"),
cnt, total);
92 treeCtrl.Delete(compacted_node);
101 objects::CProjectFolder& folder = *
GetData();
106 wxTreeItemIcon_Normal);
109 wxTreeItemIcon_Expanded);
111 const objects::CFolderInfo&
info = folder.GetInfo();
115 bool is_open =
info.IsSetOpen() ?
info.GetOpen() :
false;
117 if (folder.CanGetFolders()) {
119 objects::CProjectFolder& sub_folder = **it;
126 if (folder.CanGetItems()) {
128 wxTreeItemId collapsed_node;
130 objects::CProjectItem& prj_item = **it;
137 if (count >= 2500 && collapsed_node.IsOk() ==
false) {
138 auto prj_folder =
Ref(
new objects::CProjectFolder);
140 prj_folder->SetInfo().SetTitle(
"");
142 while (++it != folder.SetItems().end()) {
143 objects::CProjectItem& prj_item = **it;
146 prj_folder->AddChildItem(prj_item);
149 prj_folder->SetParentFolder(&folder);
153 s.Printf(
wxT(
"Double-click to show %d additional items"),
cnt);
172 if (folder.CanGetItems()) {
174 if (!(*it)->IsEnabled())
194 objects::CProjectFolder& folder = *
GetData();
195 folder.SetInfo().SetOpen(treeCtrl.IsExpanded(
m_TreeItemId));
210 if (
info.CanGetComment()) {
211 descr =
info.GetComment();
214 if (
info.CanGetAnnot()) {
216 if ((**it).IsComment()) {
219 descr += (*it)->GetComment();
230 if(dlg.ShowModal() == wxID_OK) {
235 info.SetAnnot().clear();
237 list<string> comment;
240 ITERATE (list<string>, it, comment) {
242 if (it == comment.begin())
243 info.SetComment(*it);
246 annot->SetComment(*it);
247 info.SetAnnot().push_back(annot);
262 if (!project)
return;
268 objects::CProjectFolder& parent_folder = *
GetData();
273 new_folder->SetInfo().SetTitle(
"New Folder");
274 new_folder->SetInfo().SetComment(
"");
275 new_folder->SetInfo().SetOpen(
true);
279 parent_folder.AddChildFolder(*new_folder);
281 const objects::CFolderInfo&
info = new_folder->GetInfo();
293 parent_folder.SetInfo().SetOpen(
true);
296 doc->SetDirty (
true);
304 if (!project)
return false;
308 if (!doc)
return false;
310 objects::CProjectFolder& folder = *
GetData();
312 objects::CProjectFolder* parent_folder = 0;
315 parent_folder = parent->
GetData();
318 bool readonly = (parent_folder ==
NULL);
321 doc->SetDirty (
true);
337 if (event.IsEditCancelled())
343 if (!project)
return false;
347 if (!doc)
return false;
349 objects::CProjectFolder& pr_folder = *
GetData();
352 string oldName = pr_folder.GetInfo().GetTitle();
353 if (oldName == new_name)
356 objects::CProjectFolder* parent_folder = 0;
359 parent_folder = parent->
GetData();
365 if (!validator.
IsValid(new_name, err)) {
369 pr_folder.SetInfo().SetTitle(new_name);
372 doc->SetDirty (
true);
387 vector<objects::CProjectItem*> projItems;
389 projItems.push_back(&*it);
391 if (!projItems.empty())
393 doc.SetData().RemoveProjectFolder(folder.GetId());
400 if (!project)
return false;
403 if (!parent)
return false;
407 if (!doc)
return false;
411 doc->SetDirty (
true);
413 treeCtrl.Delete(toDelete);
433 if (!project)
return false;
440 new_item->SetLabel(item.GetLabel());
441 new_item->SetDescr().assign(item.GetDescr().begin(), item.GetDescr().end());
444 new_item->SetObject(*obj);
446 if (!item.IsEnabled())
447 new_item->SetDisabled(
true);
455 objects::CFolderInfo&
info = new_folder->SetInfo();
456 info.SetTitle(folder.GetInfo().GetTitle());
457 info.SetComment(folder.GetInfo().GetComment());
460 dstFolder.AddChildFolder(*new_folder);
462 vector<objects::CProjectItem*> items;
465 doc.AddItem(*
i, *new_folder);
471 ITERATE(objects::CProjectFolder::TFolders, it, folder.GetFolders()) {
477 CGBDocument& dst, objects::CProjectFolder& dstFolder,
bool cut)
479 if (src.GetId() == dst.GetId()) {
480 if (srcFolder.GetId() == dstFolder.GetId()) {
481 string err =
"Cannot paste folder \"" + srcFolder.GetInfo().GetTitle() +
"\" on itself.";
485 if (srcFolder.FindChildFolderById(dstFolder.GetId())) {
486 string err =
"Cannot paste folder \"" + srcFolder.GetInfo().GetTitle();
487 err +=
"\". Destination folder is a child of the source folder.";
493 if (src.GetId() == dst.GetId() && cut) {
495 if (!
f)
return false;
496 dstFolder.AddChildFolder(*
f);
508 if (items.empty())
return false;
511 if (!project)
return false;
515 if (!doc)
return false;
517 objects::CProjectFolder& folder = *
GetData();
519 bool modified =
false;
528 if (!srcProject)
continue;
532 if (!srcDoc)
continue;
540 srcDoc->SetDirty(
true);
541 modProjects.
insert(srcProject);
551 objects::CProjectItem* projItem = srcItem.
GetData();
553 if (srcDoc == doc && move) {
554 int itemId = projItem->GetId();
555 objects::CProjectFolder* srcFolder = srcDoc->SetData().FindProjectItemFolder(itemId);
556 if (srcFolder && &folder != srcFolder) {
557 folder.AddChildItem(*projItem);
558 srcFolder->RemoveChildItem(itemId);
564 doc->AddItem(*new_item, folder);
565 if (new_item->IsEnabled())
569 toDelete[srcDoc].push_back(projItem);
570 modProjects.
insert(srcProject);
579 ITERATE(TDocItems, it, toDelete) {
580 it->first->RemoveProjectItems(it->second);
581 it->first->SetDirty(
true);
588 folder.SetInfo().SetOpen(
true);
591 doc->SetDirty (
true);
592 modProjects.
insert(project);
596 if (*it) (*it)->UpdateLabel(treeCtrl);
610 if (!project)
return;
621 objects::CProjectFolder& folder = *
GetData();
627 vector<wxTreeItemId> toDelete;
631 if (!item.
GetData()->IsEnabled())
632 toDelete.push_back((*it).GetTreeItemId());
635 ITERATE(vector<wxTreeItemId>, it, toDelete)
636 treeCtrl.Delete(*it);
638 if (!folder.CanGetItems())
642 objects::CProjectFolder::TItems::iterator it2 = items.begin();
644 for (
CChildIterator it(treeCtrl, *
this); it && it2 != items.end(); ++it) {
653 for (; it2 != items.end(); ++it2) {
654 objects::CProjectItem& prjItem = **it2;
665 if (!project)
return;
667 objects::CProjectFolder& folder = *
GetData();
675 if (!folder.CanGetItems())
679 objects::CProjectFolder::TItems::iterator it2 = items.begin();
681 while (it2 != items.end() && !(*it2)->IsEnabled())
686 for (; it && it2 != items.end(); ++it) {
693 while (it2 != items.end() && !(*it2)->IsEnabled())
699 vector<wxTreeItemId> toDelete;
703 toDelete.push_back((*it).GetTreeItemId());
706 ITERATE(vector<wxTreeItemId>, it, toDelete)
707 treeCtrl.Delete(*it);
709 for (; it2 != items.end();) {
710 objects::CProjectItem& prjItem = **it2;
717 while (it2 != items.end() && !(*it2)->IsEnabled())
User-defined methods of the data storage class.
User-defined methods of the data storage class.
virtual void SetRegistryPath(const string &path)
void SetDescr(wxString value)
wxString GetFolderName() const
wxString GetDescr() const
void SetReadOnly(bool value)
void SetNameValidator(IFNameValidator *validator)
void SetFolderName(wxString value)
virtual bool IsValid(const string &name, string &err)
bool RemoveProjectItems(const vector< objects::CProjectItem * > &items)
void AttachProjectItems(const vector< objects::CProjectItem * > &items)
void AttachProjectItem(objects::CProjectItem *item)
Base class for all serializable objects.
Template class for iteration on objects of class C.
Interface for testing cancellation request in a long lasting operation.
virtual int GetType() const =0
void InsertChildItem(wxTreeCtrl &treeCtrl, CItem &ch_item, size_t pos)
void AppendChildItem(wxTreeCtrl &treeCtrl, CItem &ch_item)
wxTreeItemId GetTreeItemId() const
wxTreeItemId m_TreeItemId
CItem * GetParent(wxTreeCtrl &treeCtrl) const
static CPTIcons & GetInstance()
int GetImageIndex(EIcon icon) const
virtual void DoNewFolder(wxTreeCtrl &treeCtrl)
virtual void BeginLabelEdit(wxTreeCtrl &treeCtrl, wxTreeEvent &event)
virtual bool CanDoRemove(wxTreeCtrl &treeCtrl) const
virtual bool DoProperties(wxTreeCtrl &treeCtrl)
void Initialize(wxTreeCtrl &treeCtrl, CGBDocument &doc)
void UpdateProjectItems(wxTreeCtrl &treeCtrl, CGBDocument &doc)
virtual bool CanPaste(wxTreeCtrl &treeCtrl) const
void ExpandCompacted(wxTreeCtrl &treeCtrl, wxTreeItemId &compacted_node, CGBDocument &doc, IStatusBarService *sb_srv, ICanceled *cancel)
void UpdateDisabledItems(wxTreeCtrl &treeCtrl)
CProjectFolder(const TParent::TDataType &data)
size_t CountDisabledItems(wxTreeCtrl &treeCtrl)
virtual void OnItemExpandedCollapsed(wxTreeCtrl &treeCtrl)
virtual bool CanCopyToClipboard(wxTreeCtrl &treeCtrl) const
virtual bool CanCutToClipboard(wxTreeCtrl &treeCtrl) const
void SetCompacted(bool compacted=true)
virtual bool DoRemove(wxTreeCtrl &treeCtrl)
virtual bool EndLabelEdit(wxTreeCtrl &treeCtrl, wxTreeEvent &event)
virtual bool Paste(wxTreeCtrl &treeCtrl, PT::TItems &items, bool move)
void Initialize(wxTreeCtrl &treeCtrl, CGBDocument &doc)
void UpdateLabel(wxTreeCtrl &treeCtrl)
void UpdateHiddenItems(wxTreeCtrl &treeCtrl)
void SetData(const TData &data)
const TData & GetData() const
iterator_bool insert(const value_type &val)
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
#define NON_CONST_ITERATE(Type, Var, Cont)
Non constant version of ITERATE macro.
virtual void SetStatusMessage(const string &msg)=0
void NcbiErrorBox(const string &message, const string &title="Error")
specialized Message Box function for reporting critical errors
CRef< C > Ref(C *object)
Helper functions to get CRef<> and CConstRef<> objects.
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
virtual bool IsCanceled(void) const =0
static list< string > & Split(const CTempString str, const CTempString delim, list< string > &arr, TSplitFlags flags=0, vector< SIZE_TYPE > *token_pos=NULL)
Split a string using specified delimiters.
@ fSplit_Tokenize
All delimiters are merged and trimmed, to get non-empty tokens only.
@ eCurrent
Use current time. See also CCurrentTime.
CProject * GetProject(wxTreeCtrl &treeCtrl, const CItem &item)
bool sm_HideDisabledItems
double f(double x_, const double &y_)
static bool s_PasteProjectFolder(CGBDocument &src, objects::CProjectFolder &srcFolder, CGBDocument &dst, objects::CProjectFolder &dstFolder, bool cut)
static size_t s_CountDisabledItems(objects::CProjectFolder &folder)
static bool s_DeleteFolder(CGBDocument &doc, objects::CProjectFolder &folder)
static void s_ProjectFolderClone(const objects::CProjectFolder &folder, CGBDocument &doc, objects::CProjectFolder &dstFolder)
static bool s_EditFolder(objects::CFolderInfo &info, const string &title, string reg_path, bool readonly, IFNameValidator &validator)
static CRef< objects::CProjectItem > s_ProjectItemClone(const objects::CProjectItem &item)
static const char * kDlgRegPath
static const char * str(char *buf, int n)
wxString ToWxString(const string &s)
string ToStdString(const wxString &s)