Merge with 2ad3c504ee5d73982c0ef23336276dc1fc9e165f
[pithos] / src / gr / ebs / gss / client / tree / FolderSubtree.java
1 /*
2  * Copyright 2008, 2009 Electronic Business Systems Ltd.
3  *
4  * This file is part of GSS.
5  *
6  * GSS is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * GSS is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with GSS.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 package gr.ebs.gss.client.tree;
20
21 import gr.ebs.gss.client.GSS;
22 import gr.ebs.gss.client.PopupTree;
23 import gr.ebs.gss.client.Folders.Images;
24 import gr.ebs.gss.client.dnd.DnDTreeItem;
25 import gr.ebs.gss.client.rest.GetCommand;
26 import gr.ebs.gss.client.rest.MultipleGetCommand;
27 import gr.ebs.gss.client.rest.resource.FolderResource;
28 import gr.ebs.gss.client.rest.resource.UserResource;
29
30 import java.util.List;
31
32 import com.google.gwt.core.client.GWT;
33 import com.google.gwt.user.client.DeferredCommand;
34 import com.google.gwt.user.client.IncrementalCommand;
35 import com.google.gwt.user.client.ui.TreeItem;
36 import com.google.gwt.user.client.ui.Widget;
37
38 /**
39  * @author kman
40  */
41 public class FolderSubtree extends Subtree {
42
43         /**
44          * A constant that denotes the completion of an IncrementalCommand.
45          */
46         public static final boolean DONE = false;
47
48         private DnDTreeItem rootItem;
49
50         public FolderSubtree(PopupTree aTree, final Images _images) {
51                 super(aTree, _images);
52                 aTree.clear();
53                 DeferredCommand.addCommand(new IncrementalCommand() {
54
55                         @Override
56                         public boolean execute() {
57                                 return fetchRootFolder();
58                         }
59                 });
60         }
61
62         public boolean fetchRootFolder() {
63                 UserResource userResource = GSS.get().getCurrentUserResource();
64                 if (userResource == null)
65                         return !DONE;
66
67                 final String path = userResource.getFilesPath();
68                 GetCommand<FolderResource> gf = new GetCommand<FolderResource>(FolderResource.class, path, null) {
69
70                         @Override
71                         public void onComplete() {
72                                 FolderResource rootResource = getResult();
73                                 Widget rootItemWidget = imageItemHTML(images.home(), rootResource.getName());
74                                 rootItemWidget.getElement().setId("tree.homeFolder");
75                                 rootItem = new DnDTreeItem(rootItemWidget, false,tree,true);
76                                 rootItem.setUserObject(rootResource);
77                                 tree.clear();
78                                 tree.addItem(rootItem);
79                                 rootItem.doDroppable();
80                                 GSS.get().getFolders().select(rootItem);
81                                 updateSubFoldersLazily(rootItem, rootResource.getFolders(), images.folderYellow(), images.sharedFolder());
82                                 rootItem.setState(true);
83                         }
84
85                         @Override
86                         public void onError(Throwable t) {
87                                 GWT.log("Error fetching root folder", t);
88                                 GSS.get().displayError("Unable to fetch root folder");
89                                 if(rootItem != null){
90                                         rootItem = new DnDTreeItem(imageItemHTML(images.home(), "ERROR"), false,tree);
91                                         tree.clear();
92                                         tree.addItem(rootItem);
93                                 }
94                         }
95
96                 };
97                 DeferredCommand.addCommand(gf);
98                 return DONE;
99         }
100
101         public void updateSubfolders(final DnDTreeItem folderItem) {
102                 if (folderItem.getFolderResource() == null) {
103                         GWT.log("folder resource is null", null);
104                         return;
105                 }
106                 updateNodes(folderItem);
107         }
108
109         private void updateNodes(final DnDTreeItem folderItem) {
110                 String parentName = "";
111                 if (folderItem.getParentItem() != null)
112                         parentName = ((DnDTreeItem) folderItem.getParentItem()).getFolderResource().getName() + "->";
113                 parentName = parentName + folderItem.getFolderResource().getName();
114                 MultipleGetCommand<FolderResource> gf = new MultipleGetCommand<FolderResource>(FolderResource.class,
115                                         folderItem.getFolderResource().getSubfolderPaths().toArray(new String[] {}), folderItem.getFolderResource().getCache()) {
116
117                         @Override
118                         public void onComplete() {
119                                 List<FolderResource> res = getResult();
120                                 folderItem.getFolderResource().setFolders(res);
121                                 updateSubFoldersLazily(folderItem, res, images.folderYellow(), images.sharedFolder());
122                                 for (int i = 0; i < folderItem.getChildCount(); i++) {
123                                         DnDTreeItem anItem = (DnDTreeItem) folderItem.getChild(i);
124                                         updateSubFoldersLazily(anItem, anItem.getFolderResource().getFolders(), images.folderYellow(), images.sharedFolder());
125                                         anItem.setState(false);
126                                 }
127                         }
128
129                         @Override
130                         public void onError(Throwable t) {
131                                 GSS.get().displayError("Unable to fetch subfolders");
132                                 GWT.log("Unable to fetch subfolders", t);
133                         }
134
135                         @Override
136                         public void onError(String p, Throwable throwable) {
137                                 GWT.log("Path:"+p, throwable);
138                         }
139
140                 };
141                 DeferredCommand.addCommand(gf);
142         }
143
144         public void updateFolderAndSubfolders(final DnDTreeItem folderItem) {
145                 final String path = folderItem.getFolderResource().getUri();
146                 GetCommand<FolderResource> gf = new GetCommand<FolderResource>(FolderResource.class, path, folderItem.getFolderResource()) {
147
148                         @Override
149                         public void onComplete() {
150                                 FolderResource rootResource = getResult();
151                                 if (!folderItem.equals(rootItem)) {
152                                         folderItem.undoDraggable();
153                                         if(rootResource.isShared()||rootResource.isReadForAll())
154                                                 folderItem.updateWidget(imageItemHTML(images.sharedFolder(), rootResource.getName()));
155                                         else
156                                                 folderItem.updateWidget(imageItemHTML(images.folderYellow(), rootResource.getName()));
157                                         folderItem.setUserObject(rootResource);
158                                         folderItem.doDraggable();
159                                 } else{
160                                         folderItem.undoDroppable();
161                                         folderItem.setUserObject(rootResource);
162                                         folderItem.updateWidget(imageItemHTML(images.home(), rootResource.getName()));
163                                         folderItem.doDroppable();
164                                 }
165                                 updateSubfolders(folderItem);
166                         }
167
168                         @Override
169                         public void onError(Throwable t) {
170                                 GWT.log("Error fetching folder", t);
171                                 GSS.get().displayError("Unable to fetch folder:" + folderItem.getFolderResource().getName());
172                         }
173                 };
174                 DeferredCommand.addCommand(gf);
175         }
176
177         /**
178          * Retrieve the rootItem.
179          *
180          * @return the rootItem
181          */
182         public TreeItem getRootItem() {
183                 return rootItem;
184         }
185
186 }