2 Copyright (C) 2004 Kern Sibbald and John Walker
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 #include "wxbrestorepanel.h"
21 #include "wxbmainframe.h"
25 #include <wx/choice.h>
26 #include <wx/datetime.h>
28 #include "unmarked.xpm"
30 #include "partmarked.xpm"
32 /* A macro named Yield is defined under MinGW */
36 * Class which is stored in the tree and in the list to keep informations
39 class wxbTreeItemData : public wxTreeItemData {
41 wxbTreeItemData(wxString path, wxString name, int marked, long listid = -1);
42 wxbTreeItemData(wxString path, wxString name, wxString marked, long listid = -1);
48 void SetMarked(int marked);
49 void SetMarked(wxString marked);
53 static int GetMarkedStatus(wxString file);
55 wxString* path; /* Full path */
56 wxString* name; /* File name */
57 int marked; /* 0 - Not Marked, 1 - Marked, 2 - Some file under is marked */
58 long listid; /* list ID : >-1 if this data is in the list (and/or on the tree) */
61 wxbTreeItemData::wxbTreeItemData(wxString path, wxString name, int marked, long listid): wxTreeItemData() {
62 this->path = new wxString(path);
63 this->name = new wxString(name);
64 this->marked = marked;
65 this->listid = listid;
68 wxbTreeItemData::wxbTreeItemData(wxString path, wxString name, wxString marked, long listid): wxTreeItemData() {
69 this->path = new wxString(path);
70 this->name = new wxString(name);
72 this->listid = listid;
75 wxbTreeItemData::~wxbTreeItemData() {
80 int wxbTreeItemData::GetMarked() {
84 void wxbTreeItemData::SetMarked(wxString marked) {
88 else if (marked == "+") {
96 void wxbTreeItemData::SetMarked(int marked) {
97 this->marked = marked;
100 long wxbTreeItemData::GetListId() {
104 wxString wxbTreeItemData::GetPath() {
108 wxString wxbTreeItemData::GetName() {
112 /*wxbTreeItemData* wxbTreeItemData::GetChild(wxString dirname) {
113 int marked = GetMarkedStatus(dirname);
114 return new wxbTreeItemData(path + (marked ? dirname.Mid(1) : dirname), marked);
117 int wxbTreeItemData::GetMarkedStatus(wxString file) {
118 if (file.Length() == 0)
121 switch (file.GetChar(0)) {
131 // ----------------------------------------------------------------------------
132 // event tables and other macros for wxWindows
133 // ----------------------------------------------------------------------------
143 BEGIN_EVENT_TABLE(wxbRestorePanel, wxPanel)
144 EVT_BUTTON(RestoreStart, wxbRestorePanel::OnStart)
145 EVT_TREE_SEL_CHANGING(TreeCtrl, wxbRestorePanel::OnTreeChanging)
146 EVT_TREE_SEL_CHANGED(TreeCtrl, wxbRestorePanel::OnTreeChanged)
147 EVT_TREE_ITEM_EXPANDING(TreeCtrl, wxbRestorePanel::OnTreeExpanding)
148 EVT_LIST_ITEM_ACTIVATED(ListCtrl, wxbRestorePanel::OnListActivated)
150 EVT_TREE_MARKED_EVENT(wxID_ANY, wxbRestorePanel::OnTreeMarked)
151 EVT_LIST_MARKED_EVENT(wxID_ANY, wxbRestorePanel::OnListMarked)
153 EVT_CHOICE(ClientChoice, wxbRestorePanel::OnClientChoiceChanged)
157 * wxbRestorePanel constructor
159 wxbRestorePanel::wxbRestorePanel(wxWindow* parent): wxbPanel(parent) {
160 imagelist = new wxImageList(16, 16, TRUE, 3);
161 imagelist->Add(wxIcon(unmarked_xpm));
162 imagelist->Add(wxIcon(marked_xpm));
163 imagelist->Add(wxIcon(partmarked_xpm));
165 wxFlexGridSizer *sizer = new wxFlexGridSizer(3, 1, 10, 10);
166 sizer->AddGrowableCol(0);
167 sizer->AddGrowableRow(1);
169 wxBoxSizer *firstSizer = new wxBoxSizer(wxHORIZONTAL);
171 start = new wxButton(this, RestoreStart, "Enter restore mode", wxDefaultPosition, wxSize(150, 30));
172 firstSizer->Add(start, 1, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 10);
174 wxString* elist = new wxString[1];
176 clientChoice = new wxChoice(this, ClientChoice, wxDefaultPosition, wxSize(150, 30), 0, elist);
177 firstSizer->Add(clientChoice, 1, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 10);
179 jobChoice = new wxChoice(this, -1, wxDefaultPosition, wxSize(150, 30), 0, elist);
180 firstSizer->Add(jobChoice, 1, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 10);
182 sizer->Add(firstSizer, 1, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL, 10);
184 wxFlexGridSizer *secondSizer = new wxFlexGridSizer(1, 2, 10, 10);
186 tree = new wxbTreeCtrl(this, TreeCtrl, wxDefaultPosition, wxSize(200,50));
187 secondSizer->Add(tree, 1, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxEXPAND, 10);
189 tree->SetImageList(imagelist);
191 list = new wxbListCtrl(this, ListCtrl, wxDefaultPosition, wxDefaultSize);
192 secondSizer->Add(list, 1, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL | wxEXPAND, 10);
194 list->SetImageList(imagelist, wxIMAGE_LIST_SMALL);
197 info.SetMask(wxLIST_MASK_TEXT | wxLIST_MASK_FORMAT);
199 info.SetAlign(wxLIST_FORMAT_CENTER);
200 list->InsertColumn(0, info);
202 info.SetText("Filename");
203 info.SetAlign(wxLIST_FORMAT_LEFT);
204 list->InsertColumn(1, info);
206 info.SetText("Size");
207 info.SetAlign(wxLIST_FORMAT_RIGHT);
208 list->InsertColumn(2, info);
210 info.SetText("Date");
211 info.SetAlign(wxLIST_FORMAT_LEFT);
212 list->InsertColumn(3, info);
214 info.SetText("Perm.");
215 info.SetAlign(wxLIST_FORMAT_LEFT);
216 list->InsertColumn(4, info);
218 info.SetText("User");
219 info.SetAlign(wxLIST_FORMAT_RIGHT);
220 list->InsertColumn(5, info);
222 info.SetText("Group");
223 info.SetAlign(wxLIST_FORMAT_RIGHT);
224 list->InsertColumn(6, info);
226 secondSizer->AddGrowableCol(1);
227 secondSizer->AddGrowableRow(0);
229 sizer->Add(secondSizer, 1, wxEXPAND, 10);
231 gauge = new wxGauge(this, -1, 1, wxDefaultPosition, wxSize(200,20));
233 sizer->Add(gauge, 1, wxEXPAND, 5);
235 gauge->Enable(false);
238 sizer->SetSizeHints(this);
242 jobChoice->Enable(false);
244 for (int i = 0; i < 7; i++) {
245 list->SetColumnWidth(i, 70);
252 * wxbRestorePanel destructor
254 wxbRestorePanel::~wxbRestorePanel() {
258 /*----------------------------------------------------------------------------
259 wxbPanel overloadings
260 ----------------------------------------------------------------------------*/
262 wxString wxbRestorePanel::GetTitle() {
266 void wxbRestorePanel::EnablePanel(bool enable) {
268 if (status == disabled) {
269 SetStatus(activable);
277 /*----------------------------------------------------------------------------
278 Commands called by events handler
279 ----------------------------------------------------------------------------*/
281 /* The main button has been clicked */
282 void wxbRestorePanel::CmdStart() {
283 if (status == activable) {
284 wxbTableParser* tableparser = CreateAndWaitForParser("list clients\n");
286 clientChoice->Clear();
287 for (unsigned int i = 0; i < tableparser->size(); i++) {
289 (*tableparser)[i][0].ToLong(j);
290 clientChoice->Append((*tableparser)[i][1], (void*)j);
297 else if (status == entered) {
298 if (jobChoice->GetStringSelection().Length() < 1) {
299 wxbMainFrame::GetInstance()->SetStatusText("Please select a client.");
302 WaitForEnd("restore\n");
304 WaitForEnd(wxString() << jobChoice->GetStringSelection() << "\n");
305 WaitForEnd(wxString() << *((long*)clientChoice->GetClientData(clientChoice->GetSelection())) << "\n");
306 WaitForEnd("unmark *\n");
308 wxTreeItemId root = tree->AddRoot(clientChoice->GetStringSelection(), -1, -1, new wxbTreeItemData("/", clientChoice->GetStringSelection(), 0));
310 UpdateTreeItem(root, true);
311 wxbMainFrame::GetInstance()->SetStatusText("Right click on a file or on a directory, or double-click on its mark to add it to the restore list.");
314 else if (status == choosing) {
315 SetStatus(restoring);
317 wxbMainFrame::GetInstance()->SetStatusText("Restoring, please wait...");
320 wxbDataTokenizer* dt;
322 dt = WaitForEnd("estimate\n", true);
326 for (unsigned int i = 0; i < dt->GetCount(); i++) {
327 /* 15847 total files; 1 marked to be restored; 1,034 bytes. */
328 if ((j = (*dt)[i].Find(" marked to be restored;")) > -1) {
329 k = (*dt)[i].Find("; ");
330 (*dt)[i].Mid(k+2, j).ToLong(&totfilemessages);
337 dt = WaitForEnd("done\n", true);
339 for (unsigned int i = 0; i < dt->GetCount(); i++) {
340 if ((j = (*dt)[i].Find(" files selected to be restored.")) > -1) {
341 (*dt)[i].Mid(0, j).ToLong(&totfilemessages);
345 if ((j = (*dt)[i].Find(" file selected to be restored.")) > -1) {
346 (*dt)[i].Mid(0, j).ToLong(&totfilemessages);
353 if (totfilemessages == 0) {
354 wxbMainFrame::GetInstance()->Print("Restore failed : no file selected.\n", CS_DEBUG);
355 wxbMainFrame::GetInstance()->SetStatusText("Restore failed : no file selected.");
363 gauge->SetRange(totfilemessages);
365 wxString cmd = "list jobid=";
367 wxbTableParser* tableparser = CreateAndWaitForParser("list jobs\n");
368 /* TODO (#1#): Check more carefully which job we just have run. */
369 cmd << (*tableparser)[tableparser->size()-1][0] << "\n";
376 tableparser = CreateAndWaitForParser(cmd);
377 if ((*tableparser)[0][7] != "C") {
382 dt = WaitForEnd("messages\n", true);
384 for (unsigned int i = 0; i < dt->GetCount(); i++) {
385 wxStringTokenizer tkz((*dt)[i], " ", wxTOKEN_STRTOK);
389 // Date Time name: perm ? user grp size date time
390 //04-Apr-2004 17:19 Tom-fd: -rwx------ 1 nicolas None 514967 2004-03-20 20:03:42 filename
392 if (datetime.ParseDate(tkz.GetNextToken()) != NULL) { // Date
393 if (datetime.ParseTime(tkz.GetNextToken()) != NULL) { // Time
394 if (tkz.GetNextToken().Last() == ':') { // name:
395 tkz.GetNextToken(); // perm
396 tkz.GetNextToken(); // ?
397 tkz.GetNextToken(); // user
398 tkz.GetNextToken(); // grp
399 tkz.GetNextToken(); // size
400 if (datetime.ParseDate(tkz.GetNextToken()) != NULL) { //date
401 if (datetime.ParseTime(tkz.GetNextToken()) != NULL) { //time
403 //wxbMainFrame::GetInstance()->Print(wxString("(") << filemessages << ")", CS_DEBUG);
404 gauge->SetValue(filemessages);
414 wxbMainFrame::GetInstance()->SetStatusText(wxString("Restoring, please wait (") << filemessages << " of " << totfilemessages << " files done)...");
416 time_t start = wxDateTime::Now().GetTicks();
417 while (((wxDateTime::Now().GetTicks())-start) < 3) {
422 WaitForEnd("messages\n");
424 gauge->SetValue(totfilemessages);
426 if ((*tableparser)[0][7] == "T") {
427 wxbMainFrame::GetInstance()->Print("Restore done successfully.\n", CS_DEBUG);
428 wxbMainFrame::GetInstance()->SetStatusText("Restore done successfully.");
431 wxbMainFrame::GetInstance()->Print("Restore failed, please look at messages.\n", CS_DEBUG);
432 wxbMainFrame::GetInstance()->SetStatusText("Restore failed, please look at messages in console.");
439 /* List jobs for a specified client */
440 void wxbRestorePanel::CmdListJobs() {
441 if (status == entered) {
443 WaitForEnd("query\n");
445 wxbTableParser* tableparser = CreateAndWaitForParser(clientChoice->GetString(clientChoice->GetSelection()) + "\n");
447 for (int i = tableparser->size()-1; i > -1; i--) {
448 wxString str = (*tableparser)[i][3];
451 if ( ( (chr = datetime.ParseDate(str.GetData()) ) != NULL ) && ( datetime.ParseTime(++chr) != NULL ) ) {
452 datetime = datetime.GetTicks() + 1;
453 //wxbMainFrame::GetInstance()->Print(wxString("-") << datetime.Format("%Y-%m-%d %H:%M:%S"), CS_DEBUG);
454 jobChoice->Append(datetime.Format("%Y-%m-%d %H:%M:%S"));
457 jobChoice->Append("Invalid");
463 jobChoice->SetSelection(0);
467 /* List files and directories for a specified tree item */
468 void wxbRestorePanel::CmdList(wxTreeItemId item) {
469 if (status == choosing) {
470 list->DeleteAllItems();
475 UpdateTreeItem(item, (tree->GetSelection() == item));
477 if (list->GetItemCount() > 1) {
478 int firstwidth = list->GetSize().GetWidth();
479 for (int i = 2; i < 7; i++) {
480 list->SetColumnWidth(i, wxLIST_AUTOSIZE);
481 firstwidth -= list->GetColumnWidth(i);
484 list->SetColumnWidth(0, 18);
486 list->SetColumnWidth(1, wxLIST_AUTOSIZE);
487 if (list->GetColumnWidth(1) < firstwidth) {
488 list->SetColumnWidth(1, firstwidth-20);
494 /* Mark a treeitem (directory) or a listitem (file or directory) */
495 void wxbRestorePanel::CmdMark(wxTreeItemId treeitem, long listitem) {
496 if (status == choosing) {
497 wxbTreeItemData* itemdata = NULL;
498 if (listitem != -1) {
499 itemdata = (wxbTreeItemData*)list->GetItemData(listitem);
501 else if (treeitem.IsOk()) {
502 itemdata = (wxbTreeItemData*)tree->GetItemData(treeitem);
508 if (itemdata == NULL) //Should never happen
511 wxString dir = itemdata->GetPath();
515 if (dir.GetChar(dir.Length()-1) == '/') {
519 int i = dir.Find('/', TRUE);
524 else { /* first dir below root */
526 dir = dir.Mid(0, i+1);
534 WaitForEnd(wxString("cd ") << dir << "\n");
535 WaitForEnd(wxString((itemdata->GetMarked() == 1) ? "unmark " : "mark ") << file << "\n");
537 /* TODO: Check commands results */
539 /*if ((dir == "/") && (file == "*")) {
540 itemdata->SetMarked((itemdata->GetMarked() == 1) ? 0 : 1);
543 if (listitem == -1) { /* tree item state changed */
544 SetTreeItemState(treeitem, (itemdata->GetMarked() == 1) ? 0 : 1);
545 /*treeitem = tree->GetSelection();
546 UpdateTree(treeitem, true);
547 treeitem = tree->GetItemParent(treeitem);*/
550 SetListItemState(listitem, (itemdata->GetMarked() == 1) ? 0 : 1);
551 /*UpdateTree(treeitem, (tree->GetSelection() == treeitem));
552 treeitem = tree->GetItemParent(treeitem);*/
555 /*while (treeitem.IsOk()) {
556 WaitForList(treeitem, false);
557 treeitem = tree->GetItemParent(treeitem);
562 /*----------------------------------------------------------------------------
564 ----------------------------------------------------------------------------*/
566 /* Parse a table in tableParser */
567 wxbTableParser* wxbRestorePanel::CreateAndWaitForParser(wxString cmd) {
568 wxbTableParser* tableParser = new wxbTableParser();
570 wxbMainFrame::GetInstance()->Send(cmd);
572 //time_t base = wxDateTime::Now().GetTicks();
573 while (!tableParser->hasFinished()) {
574 //innerThread->Yield();
576 //if (base+15 < wxDateTime::Now().GetTicks()) break;
581 /* Run a command, and waits until result is fully received. */
582 wxbDataTokenizer* wxbRestorePanel::WaitForEnd(wxString cmd, bool keepresults) {
583 wxbDataTokenizer* datatokenizer = new wxbDataTokenizer();
585 wxbMainFrame::GetInstance()->Send(cmd);
587 //wxbMainFrame::GetInstance()->Print("(<WFE)", CS_DEBUG);
589 //time_t base = wxDateTime::Now().GetTicks();
590 while (!datatokenizer->hasFinished()) {
591 //innerThread->Yield();
593 //if (base+15 < wxDateTime::Now().GetTicks()) break;
596 //wxbMainFrame::GetInstance()->Print("(>WFE)", CS_DEBUG);
599 return datatokenizer;
602 delete datatokenizer;
607 /* Run a dir command, and waits until result is fully received. */
608 void wxbRestorePanel::UpdateTreeItem(wxTreeItemId item, bool updatelist) {
609 // this->updatelist = updatelist;
610 currentTreeItem = item;
612 wxbDataTokenizer* dt;
614 dt = WaitForEnd(wxString("cd \"") <<
615 static_cast<wxbTreeItemData*>(tree->GetItemData(currentTreeItem))
616 ->GetPath() << "\"\n", false);
618 /* TODO: check command result */
625 list->DeleteAllItems();
626 dt = WaitForEnd("dir\n", true);
630 for (unsigned int i = 0; i < dt->GetCount(); i++) {
633 if (str.Find("cwd is:") == 0) { // Sometimes cd command result "infiltrate" into listings.
639 wxString* file = ParseList(str);
646 if (file[8].GetChar(file[8].Length()-1) == '/') {
650 treeid = tree->GetFirstChild(currentTreeItem, cookie);
652 bool updated = false;
654 while (treeid.IsOk()) {
655 itemStr = tree->GetItemText(treeid);
656 if (file[8] == itemStr) {
657 int stat = wxbTreeItemData::GetMarkedStatus(file[6]);
658 if (static_cast<wxbTreeItemData*>(tree->GetItemData(treeid))->GetMarked() != stat) {
659 tree->SetItemImage(treeid, stat, wxTreeItemIcon_Normal);
660 tree->SetItemImage(treeid, stat, wxTreeItemIcon_Selected);
661 static_cast<wxbTreeItemData*>(tree->GetItemData(treeid))->SetMarked(file[6]);
666 treeid = tree->GetNextChild(currentTreeItem, cookie);
670 int img = wxbTreeItemData::GetMarkedStatus(file[6]);
671 treeid = tree->AppendItem(currentTreeItem, file[8], img, img, new wxbTreeItemData(file[7], file[8], file[6]));
676 long ind = list->InsertItem(list->GetItemCount(), wxbTreeItemData::GetMarkedStatus(file[6]));
677 wxbTreeItemData* data = new wxbTreeItemData(file[7], file[8], file[6], ind);
679 list->SetItemData(ind, (long)data);
680 list->SetItem(ind, 1, file[8]); // filename
681 list->SetItem(ind, 2, file[4]); //Size
682 list->SetItem(ind, 3, file[5]); //date
683 list->SetItem(ind, 4, file[0]); //perm
684 list->SetItem(ind, 5, file[2]); //user
685 list->SetItem(ind, 6, file[3]); //grp
697 /* Parse dir command results. */
698 wxString* wxbRestorePanel::ParseList(wxString line) {
699 //drwx------ 11 1003 42949672 0 2001-07-30 16:45:14 *filename
700 //+ 10 ++ 4++ 10 ++ 8 ++ 8 + + 19 + *+ ->
701 //0 10 14 24 32 42 62
703 if (line.Length() < 63)
706 wxString* ret = new wxString[9];
708 ret[0] = line.Mid(0, 10).Trim();
709 ret[1] = line.Mid(10, 4).Trim();
710 ret[2] = line.Mid(14, 10).Trim();
711 ret[3] = line.Mid(24, 8).Trim();
712 ret[4] = line.Mid(32, 8).Trim();
713 ret[5] = line.Mid(42, 19).Trim();
714 ret[6] = line.Mid(62, 1);
715 ret[7] = line.Mid(63).Trim();
717 if (ret[6] == " ") ret[6] = "";
719 if (ret[7].GetChar(ret[7].Length()-1) == '/') {
722 ret[8] = ret[7].Mid(ret[8].Find('/', true)+1);
725 ret[8] = ret[7].Mid(ret[7].Find('/', true)+1);
731 /* Sets a list item state, and update its parents and children if it is a directory */
732 void wxbRestorePanel::SetListItemState(long listitem, int newstate) {
733 wxbTreeItemData* itemdata = (wxbTreeItemData*)list->GetItemData(listitem);
735 wxTreeItemId treeitem;
737 itemdata->SetMarked(newstate);
738 list->SetItemImage(listitem, newstate, 0); /* TODO: Find what these ints are for */
739 list->SetItemImage(listitem, newstate, 1);
741 if ((treeitem = itemdata->GetId()).IsOk()) {
742 SetTreeItemState(treeitem, newstate);
745 UpdateTreeItemState(tree->GetSelection());
749 /* Sets a tree item state, and update its children, parents and list (if necessary) */
750 void wxbRestorePanel::SetTreeItemState(wxTreeItemId item, int newstate) {
752 wxTreeItemId currentChild = tree->GetFirstChild(item, cookie);
754 wxbTreeItemData* itemdata;
756 while (currentChild.IsOk()) {
757 itemdata = (wxbTreeItemData*)tree->GetItemData(currentChild);
758 int state = itemdata->GetMarked();
760 if (state != newstate) {
761 itemdata->SetMarked(newstate);
762 tree->SetItemImage(currentChild, newstate, wxTreeItemIcon_Normal);
763 tree->SetItemImage(currentChild, newstate, wxTreeItemIcon_Selected);
766 currentChild = tree->GetNextChild(item, cookie);
769 itemdata = (wxbTreeItemData*)tree->GetItemData(item);
770 itemdata->SetMarked(newstate);
771 tree->SetItemImage(item, newstate, wxTreeItemIcon_Normal);
772 tree->SetItemImage(item, newstate, wxTreeItemIcon_Selected);
775 if (tree->GetSelection() == item) {
776 for (long i = 0; i < list->GetItemCount(); i++) {
777 list->SetItemImage(i, newstate, 0); /* TODO: Find what these ints are for */
778 list->SetItemImage(i, newstate, 1);
782 UpdateTreeItemState(tree->GetParent(item));
785 /* Update a tree item state, and its parents' state */
786 void wxbRestorePanel::UpdateTreeItemState(wxTreeItemId item) {
794 wxTreeItemId currentChild = tree->GetFirstChild(item, cookie);
796 bool onechildmarked = false;
797 bool onechildunmarked = false;
799 while (currentChild.IsOk()) {
800 state = ((wxbTreeItemData*)tree->GetItemData(currentChild))->GetMarked();
803 onechildunmarked = true;
806 onechildmarked = true;
809 onechildmarked = true;
810 onechildunmarked = true;
814 if (onechildmarked && onechildunmarked) {
818 currentChild = tree->GetNextChild(item, cookie);
821 if (tree->GetSelection() == item) {
822 for (long i = 0; i < list->GetItemCount(); i++) {
823 state = ((wxbTreeItemData*)list->GetItemData(i))->GetMarked();
827 onechildunmarked = true;
830 onechildmarked = true;
833 onechildmarked = true;
834 onechildunmarked = true;
838 if (onechildmarked && onechildunmarked) {
846 if (onechildmarked && onechildunmarked) {
849 else if (onechildmarked) {
852 else if (onechildunmarked) {
855 else { // no child, don't change anything
856 UpdateTreeItemState(tree->GetParent(item));
860 wxbTreeItemData* itemdata = (wxbTreeItemData*)tree->GetItemData(item);
862 itemdata->SetMarked(state);
863 tree->SetItemImage(item, state, wxTreeItemIcon_Normal);
864 tree->SetItemImage(item, state, wxTreeItemIcon_Selected);
866 UpdateTreeItemState(tree->GetParent(item));
870 * Refresh a tree item, and all its childs,
871 * by asking the director for new lists
873 void wxbRestorePanel::RefreshTree(wxTreeItemId item) {
874 /* UpdateTreeItem(item, updatelist);*/
876 /* Update all child which are not collapsed */
878 wxTreeItemId currentChild = tree->GetFirstChild(item, cookie);
880 while (currentChild.IsOk()) {
881 if (tree->IsExpanded(currentChild))
882 UpdateTree(currentChild, false);
884 currentChild = tree->GetNextChild(item, cookie);
888 /*----------------------------------------------------------------------------
890 ----------------------------------------------------------------------------*/
892 /* Set current status by enabling/disabling components */
893 void wxbRestorePanel::SetStatus(status_enum newstatus) {
896 start->SetLabel("Enter restore mode");
897 start->Enable(false);
898 clientChoice->Enable(false);
899 jobChoice->Enable(false);
902 gauge->Enable(false);
905 tree->DeleteAllItems();
906 list->DeleteAllItems();
907 clientChoice->Clear();
909 wxbMainFrame::GetInstance()->EnablePanels();
910 newstatus = activable;
912 start->SetLabel("Enter restore mode");
914 clientChoice->Enable(false);
915 jobChoice->Enable(false);
918 gauge->Enable(false);
921 wxbMainFrame::GetInstance()->DisablePanels(this);
923 start->SetLabel("Choose files to restore");
924 clientChoice->Enable(true);
925 jobChoice->Enable(true);
933 start->SetLabel("Restore");
934 clientChoice->Enable(false);
935 jobChoice->Enable(false);
941 start->SetLabel("Restoring...");
944 start->Enable(false);
945 clientChoice->Enable(false);
946 jobChoice->Enable(false);
955 /*----------------------------------------------------------------------------
957 ----------------------------------------------------------------------------*/
959 void wxbRestorePanel::OnClientChoiceChanged(wxCommandEvent& event) {
964 clientChoice->Enable(false);
966 clientChoice->Enable(true);
967 jobChoice->Refresh();
971 void wxbRestorePanel::OnStart(wxEvent& WXUNUSED(event)) {
980 void wxbRestorePanel::OnTreeChanging(wxTreeEvent& event) {
986 void wxbRestorePanel::OnTreeExpanding(wxTreeEvent& event) {
992 //CmdList(event.GetItem());
993 if (tree->GetSelection() != event.GetItem()) {
994 tree->SelectItem(event.GetItem());
999 void wxbRestorePanel::OnTreeChanged(wxTreeEvent& event) {
1005 CmdList(event.GetItem());
1009 void wxbRestorePanel::OnTreeMarked(wxbTreeMarkedEvent& event) {
1015 CmdMark(event.GetItem(), -1);
1021 void wxbRestorePanel::OnListMarked(wxbListMarkedEvent& event) {
1027 //long item = event.GetId();
1028 long item = list->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED);
1029 CmdMark(wxTreeItemId(), item);
1035 void wxbRestorePanel::OnListActivated(wxListEvent& event) {
1041 long item = list->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED);
1043 wxbTreeItemData* itemdata = (wxbTreeItemData*)list->GetItemData(item);
1044 wxString name = itemdata->GetName();
1051 if (name.GetChar(name.Length()-1) == '/') {
1052 wxTreeItemId currentChild = tree->GetFirstChild(currentTreeItem, cookie);
1054 while (currentChild.IsOk()) {
1055 wxString name2 = tree->GetItemText(currentChild);
1056 if (name2 == name) {
1057 //tree->UnselectAll();
1059 tree->Expand(currentTreeItem);
1060 tree->SelectItem(currentChild);
1064 currentChild = tree->GetNextChild(currentTreeItem, cookie);