*/
class wxbTreeItemData : public wxTreeItemData {
public:
- wxbTreeItemData(wxString path, wxString name, int marked);
- wxbTreeItemData(wxString path, wxString name, wxString marked);
+ wxbTreeItemData(wxString path, wxString name, int marked, long listid = -1);
+ wxbTreeItemData(wxString path, wxString name, wxString marked, long listid = -1);
~wxbTreeItemData();
wxString GetPath();
wxString GetName();
- //wxbTreeItemData* GetChild(wxString dirname);
+
int GetMarked();
void SetMarked(int marked);
void SetMarked(wxString marked);
+
+ long GetListId();
static int GetMarkedStatus(wxString file);
private:
wxString* path; /* Full path */
wxString* name; /* File name */
int marked; /* 0 - Not Marked, 1 - Marked, 2 - Some file under is marked */
+ long listid; /* list ID : >-1 if this data is in the list (and/or on the tree) */
};
-wxbTreeItemData::wxbTreeItemData(wxString path, wxString name, int marked): wxTreeItemData() {
+wxbTreeItemData::wxbTreeItemData(wxString path, wxString name, int marked, long listid): wxTreeItemData() {
this->path = new wxString(path);
this->name = new wxString(name);
this->marked = marked;
+ this->listid = listid;
}
-wxbTreeItemData::wxbTreeItemData(wxString path, wxString name, wxString marked): wxTreeItemData() {
+wxbTreeItemData::wxbTreeItemData(wxString path, wxString name, wxString marked, long listid): wxTreeItemData() {
this->path = new wxString(path);
this->name = new wxString(name);
SetMarked(marked);
+ this->listid = listid;
}
wxbTreeItemData::~wxbTreeItemData() {
this->marked = marked;
}
+long wxbTreeItemData::GetListId() {
+ return listid;
+}
+
wxString wxbTreeItemData::GetPath() {
return *path;
}
EVT_TREE_SEL_CHANGING(TreeCtrl, wxbRestorePanel::OnTreeChanging)
EVT_TREE_SEL_CHANGED(TreeCtrl, wxbRestorePanel::OnTreeChanged)
EVT_TREE_ITEM_EXPANDING(TreeCtrl, wxbRestorePanel::OnTreeExpanding)
- EVT_TREE_ITEM_RIGHT_CLICK(TreeCtrl, wxbRestorePanel::OnTreeRightClicked)
- EVT_LIST_ITEM_RIGHT_CLICK(ListCtrl, wxbRestorePanel::OnListRightClicked)
EVT_LIST_ITEM_ACTIVATED(ListCtrl, wxbRestorePanel::OnListActivated)
+
+ EVT_TREE_MARKED_EVENT(wxID_ANY, wxbRestorePanel::OnTreeMarked)
+ EVT_LIST_ITEM_RIGHT_CLICK(ListCtrl, wxbRestorePanel::OnListRightClicked)
+
EVT_CHOICE(ClientChoice, wxbRestorePanel::OnClientChoiceChanged)
END_EVENT_TABLE()
wxFlexGridSizer *secondSizer = new wxFlexGridSizer(1, 2, 10, 10);
- tree = new wxTreeCtrl(this, TreeCtrl, wxDefaultPosition, wxSize(250, 10));
+ tree = new wxbTreeCtrl(this, TreeCtrl, wxDefaultPosition, wxSize(200,50));
secondSizer->Add(tree, 1, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxEXPAND, 10);
tree->SetImageList(imagelist);
if (file == NULL)
return;
+ wxTreeItemId treeid;
+
if (file[8].GetChar(file[8].Length()-1) == '/') {
wxString itemStr;
long cookie;
- wxTreeItemId currentChild = tree->GetFirstChild(currentTreeItem, cookie);
+ treeid = tree->GetFirstChild(currentTreeItem, cookie);
bool updated = false;
- while (currentChild.IsOk()) {
- itemStr = tree->GetItemText(currentChild);
+ while (treeid.IsOk()) {
+ itemStr = tree->GetItemText(treeid);
if (file[8] == itemStr) {
int stat = wxbTreeItemData::GetMarkedStatus(file[6]);
- if (static_cast<wxbTreeItemData*>(tree->GetItemData(currentChild))->GetMarked() != stat) {
- tree->SetItemImage(currentChild, stat, wxTreeItemIcon_Normal);
- tree->SetItemImage(currentChild, stat, wxTreeItemIcon_Selected);
- static_cast<wxbTreeItemData*>(tree->GetItemData(currentChild))->SetMarked(file[6]);
+ if (static_cast<wxbTreeItemData*>(tree->GetItemData(treeid))->GetMarked() != stat) {
+ tree->SetItemImage(treeid, stat, wxTreeItemIcon_Normal);
+ tree->SetItemImage(treeid, stat, wxTreeItemIcon_Selected);
+ static_cast<wxbTreeItemData*>(tree->GetItemData(treeid))->SetMarked(file[6]);
}
updated = true;
break;
}
- currentChild = tree->GetNextChild(currentTreeItem, cookie);
+ treeid = tree->GetNextChild(currentTreeItem, cookie);
}
if (!updated) {
int img = wxbTreeItemData::GetMarkedStatus(file[6]);
- tree->AppendItem(currentTreeItem, file[8], img, img, new wxbTreeItemData(file[7], file[8], file[6]));
+ treeid = tree->AppendItem(currentTreeItem, file[8], img, img, new wxbTreeItemData(file[7], file[8], file[6]));
}
}
if (updatelist) {
long ind = list->InsertItem(list->GetItemCount(), wxbTreeItemData::GetMarkedStatus(file[6]));
- long data = (long)(new wxbTreeItemData(file[7], file[8], file[6]));
- list->SetItemData(ind, data);
+ wxbTreeItemData* data = new wxbTreeItemData(file[7], file[8], file[6], ind);
+ data->SetId(treeid);
+ list->SetItemData(ind, (long)data);
list->SetItem(ind, 1, file[8]); // filename
list->SetItem(ind, 2, file[4]); //Size
list->SetItem(ind, 3, file[5]); //date
WaitForEnd(wxString("cd ") << dir << "\n");
WaitForEnd(wxString((itemdata->GetMarked() == 1) ? "unmark " : "mark ") << file << "\n");
- if ((dir == "/") && (file == "*")) {
+ /*if ((dir == "/") && (file == "*")) {
itemdata->SetMarked((itemdata->GetMarked() == 1) ? 0 : 1);
- }
+ }*/
- if (listitem != -1) {
- treeitem = tree->GetSelection();
+ if (listitem == -1) { /* tree item state changed */
+ SetTreeItemState(treeitem, (itemdata->GetMarked() == 1) ? 0 : 1);
+ /*treeitem = tree->GetSelection();
UpdateTree(treeitem, true);
- treeitem = tree->GetItemParent(treeitem);
+ treeitem = tree->GetItemParent(treeitem);*/
}
else {
- UpdateTree(treeitem, (tree->GetSelection() == treeitem));
- treeitem = tree->GetItemParent(treeitem);
+ SetListItemState(listitem, (itemdata->GetMarked() == 1) ? 0 : 1);
+ /*UpdateTree(treeitem, (tree->GetSelection() == treeitem));
+ treeitem = tree->GetItemParent(treeitem);*/
}
- while (treeitem.IsOk()) {
+ /*while (treeitem.IsOk()) {
WaitForList(treeitem, false);
treeitem = tree->GetItemParent(treeitem);
- }
-
- /* Update root marked status */
- treeitem = tree->GetRootItem();
- long cookie;
- wxTreeItemId currentChild = tree->GetFirstChild(treeitem, cookie);
-
- bool onechildmarked = false;
- bool onechildunmarked = false;
-
- while (currentChild.IsOk()) {
- itemdata = (wxbTreeItemData*)tree->GetItemData(currentChild);
- switch (itemdata->GetMarked()) {
- case 0:
- onechildunmarked = true;
- break;
- case 1:
- onechildmarked = true;
- break;
- case 2:
- onechildmarked = true;
- onechildunmarked = true;
- break;
- }
-
- if (onechildmarked && onechildunmarked) {
- break;
- }
-
- currentChild = tree->GetNextChild(treeitem, cookie);
- }
-
- itemdata = (wxbTreeItemData*)tree->GetItemData(treeitem);
- if (onechildmarked && onechildunmarked) {
- itemdata->SetMarked(2);
- tree->SetItemImage(treeitem, 2, wxTreeItemIcon_Normal);
- tree->SetItemImage(treeitem, 2, wxTreeItemIcon_Selected);
- }
- else if (onechildmarked) {
- itemdata->SetMarked(1);
- tree->SetItemImage(treeitem, 1, wxTreeItemIcon_Normal);
- tree->SetItemImage(treeitem, 1, wxTreeItemIcon_Selected);
- }
- else {
- itemdata->SetMarked(0);
- tree->SetItemImage(treeitem, 0, wxTreeItemIcon_Normal);
- tree->SetItemImage(treeitem, 0, wxTreeItemIcon_Selected);
- }
+ }*/
}
}
return ret;
}
-/* Update a tree item, and all its childs. */
-void wxbRestorePanel::UpdateTree(wxTreeItemId item, bool updatelist) {
- WaitForList(item, updatelist);
+/* Sets a list item state, and update its parents and children if it is a directory */
+void wxbRestorePanel::SetListItemState(long listitem, int newstate) {
+ wxbTreeItemData* itemdata = (wxbTreeItemData*)list->GetItemData(listitem);
+
+ wxTreeItemId treeitem;
+
+ itemdata->SetMarked(newstate);
+ list->SetItemImage(listitem, newstate, 0); /* TODO: Find what these ints are for */
+ list->SetItemImage(listitem, newstate, 1);
+
+ if ((treeitem = itemdata->GetId()).IsOk()) {
+ SetTreeItemState(treeitem, newstate);
+ }
+ else {
+ UpdateTreeItemState(tree->GetSelection());
+ }
+}
- /* Updated all child which are not collapsed */
+/* Sets a tree item state, and update its children, parents and list (if necessary) */
+void wxbRestorePanel::SetTreeItemState(wxTreeItemId item, int newstate) {
long cookie;
wxTreeItemId currentChild = tree->GetFirstChild(item, cookie);
+ bool onechildmarked = false;
+ bool onechildunmarked = false;
+
+ wxbTreeItemData* itemdata;
+
+ while (currentChild.IsOk()) {
+ itemdata = (wxbTreeItemData*)tree->GetItemData(currentChild);
+ int state = itemdata->GetMarked();
+
+ if (state != newstate) {
+ itemdata->SetMarked(newstate);
+ tree->SetItemImage(currentChild, newstate, wxTreeItemIcon_Normal);
+ tree->SetItemImage(currentChild, newstate, wxTreeItemIcon_Selected);
+ }
+
+ currentChild = tree->GetNextChild(item, cookie);
+ }
+
+ itemdata = (wxbTreeItemData*)tree->GetItemData(item);
+ itemdata->SetMarked(newstate);
+ tree->SetItemImage(item, newstate, wxTreeItemIcon_Normal);
+ tree->SetItemImage(item, newstate, wxTreeItemIcon_Selected);
+ tree->Refresh();
+
+ if (tree->GetSelection() == item) {
+ for (long i = 0; i < list->GetItemCount(); i++) {
+ list->SetItemImage(i, newstate, 0); /* TODO: Find what these ints are for */
+ list->SetItemImage(i, newstate, 1);
+ }
+ }
+
+ UpdateTreeItemState(tree->GetParent(item));
+}
+
+/* Update a tree item state, and its parents' state */
+void wxbRestorePanel::UpdateTreeItemState(wxTreeItemId item) {
+ if (!item.IsOk()) {
+ return;
+ }
+
+ int state = 0;
+
+ long cookie;
+ wxTreeItemId currentChild = tree->GetFirstChild(item, cookie);
+
+ bool onechildmarked = false;
+ bool onechildunmarked = false;
+
+ while (currentChild.IsOk()) {
+ state = ((wxbTreeItemData*)tree->GetItemData(currentChild))->GetMarked();
+ switch (state) {
+ case 0:
+ onechildunmarked = true;
+ break;
+ case 1:
+ onechildmarked = true;
+ break;
+ case 2:
+ onechildmarked = true;
+ onechildunmarked = true;
+ break;
+ }
+
+ if (onechildmarked && onechildunmarked) {
+ break;
+ }
+
+ currentChild = tree->GetNextChild(item, cookie);
+ }
+
+ if (tree->GetSelection() == item) {
+ for (long i = 0; i < list->GetItemCount(); i++) {
+ state = ((wxbTreeItemData*)list->GetItemData(i))->GetMarked();
+
+ switch (state) {
+ case 0:
+ onechildunmarked = true;
+ break;
+ case 1:
+ onechildmarked = true;
+ break;
+ case 2:
+ onechildmarked = true;
+ onechildunmarked = true;
+ break;
+ }
+
+ if (onechildmarked && onechildunmarked) {
+ break;
+ }
+ }
+ }
+
+ state = 0;
+
+ if (onechildmarked && onechildunmarked) {
+ state = 2;
+ }
+ else if (onechildmarked) {
+ state = 1;
+ }
+ else if (onechildunmarked) {
+ state = 0;
+ }
+ else { // no child, don't change anything
+ UpdateTreeItemState(tree->GetParent(item));
+ return;
+ }
+
+ wxbTreeItemData* itemdata = (wxbTreeItemData*)tree->GetItemData(item);
+
+ itemdata->SetMarked(state);
+ tree->SetItemImage(item, state, wxTreeItemIcon_Normal);
+ tree->SetItemImage(item, state, wxTreeItemIcon_Selected);
+
+ UpdateTreeItemState(tree->GetParent(item));
+}
+
+/*
+ * Refresh a tree item, and all its childs,
+ * by asking the director for new lists
+ */
+void wxbRestorePanel::RefreshTree(wxTreeItemId item) {
+/* WaitForList(item, updatelist);
+
+ /* Update all child which are not collapsed */
+/* long cookie;
+ wxTreeItemId currentChild = tree->GetFirstChild(item, cookie);
+
while (currentChild.IsOk()) {
if (tree->IsExpanded(currentChild))
UpdateTree(currentChild, false);
currentChild = tree->GetNextChild(item, cookie);
- }
+ }*/
}
/*----------------------------------------------------------------------------
working = false;
}
-void wxbRestorePanel::OnTreeRightClicked(wxTreeEvent& event) {
+void wxbRestorePanel::OnTreeMarked(wxbTreeMarkedEvent& event) {
+ //wxbMainFrame::GetInstance()->Print(wxString("MARKED\n"), CS_DEBUG);
if (working) {
- event.Skip();
+ //event.Skip();
return;
}
working = true;
CmdMark(event.GetItem(), -1);
- event.Skip();
+ //event.Skip();
tree->Refresh();
working = false;
}
}
working = false;
}
+
--- /dev/null
+/*
+ *
+ * Custom tree control, which send "tree marked" events when the user right-
+ * click on a item, or double-click on a mark.
+ *
+ * Nicolas Boichat, April 2004
+ *
+ */
+/*
+ Copyright (C) 2004 Kern Sibbald and John Walker
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "wxbtreectrl.h"
+
+#include "csprint.h"
+#include "wxbmainframe.h"
+
+BEGIN_EVENT_TABLE(wxbTreeCtrl, wxTreeCtrl)
+ EVT_LEFT_DCLICK(wxbTreeCtrl::OnDoubleClicked)
+ EVT_RIGHT_DOWN(wxbTreeCtrl::OnRightClicked)
+END_EVENT_TABLE()
+
+DEFINE_LOCAL_EVENT_TYPE(wxbTREE_MARKED_EVENT)
+
+wxbTreeCtrl::wxbTreeCtrl(
+ wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size):
+ wxTreeCtrl(parent, id, pos, size) {
+ marked = false;
+}
+
+wxbTreeCtrl::~wxbTreeCtrl() {}
+
+/*
+ * Send mark event if the user double-clicked on the icon.
+ */
+void wxbTreeCtrl::OnDoubleClicked(wxMouseEvent& event) {
+ int flags;
+ wxTreeItemId treeid = HitTest(event.GetPosition(), flags);
+ if ((flags & wxTREE_HITTEST_ONITEMICON) && (treeid.IsOk())) {
+ wxbTreeMarkedEvent evt(GetId(), treeid);
+
+ GetParent()->GetEventHandler()->ProcessEvent(evt);
+
+ //No Skip : we don't want this item to be collapsed or expanded
+ }
+ else {
+ event.Skip();
+ }
+}
+
+/*
+ * Send mark event if the user right clicked on an item.
+ */
+void wxbTreeCtrl::OnRightClicked(wxMouseEvent& event) {
+ int flags;
+ wxTreeItemId treeid = HitTest(event.GetPosition(), flags);
+ if (treeid.IsOk()) {
+ wxbTreeMarkedEvent evt(GetId(), treeid);
+
+ bool res = GetParent()->GetEventHandler()->ProcessEvent(evt);
+ }
+ event.Skip();
+}
+
+/* Customized tree event, used for marking events */
+
+wxbTreeMarkedEvent::wxbTreeMarkedEvent(int id, wxTreeItemId& item): wxEvent(id, wxbTREE_MARKED_EVENT) {
+ this->item = item;
+}
+
+wxbTreeMarkedEvent::~wxbTreeMarkedEvent() {}
+
+wxbTreeMarkedEvent::wxbTreeMarkedEvent(const wxbTreeMarkedEvent& te): wxEvent(te) {
+ this->item = te.item;
+}
+
+wxEvent *wxbTreeMarkedEvent::Clone() const {
+ return new wxbTreeMarkedEvent(*(this));
+}
+
+wxTreeItemId wxbTreeMarkedEvent::GetItem() {
+ return item;
+}