tune dnd for all nodes
[pithos] / src / gr / ebs / gss / client / CellTreeViewModel.java
1 /*
2  * Copyright 2011 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;
20
21 import static com.google.gwt.query.client.GQuery.$;
22 import gr.ebs.gss.client.CellTreeView.Images;
23 import gr.ebs.gss.client.CellTreeView.RefreshHandler;
24 import gr.ebs.gss.client.rest.GetCommand;
25 import gr.ebs.gss.client.rest.MultipleGetCommand;
26 import gr.ebs.gss.client.rest.RestException;
27 import gr.ebs.gss.client.rest.resource.FileResource;
28 import gr.ebs.gss.client.rest.resource.FolderResource;
29 import gr.ebs.gss.client.rest.resource.MyFolderResource;
30 import gr.ebs.gss.client.rest.resource.OtherUserResource;
31 import gr.ebs.gss.client.rest.resource.OthersFolderResource;
32 import gr.ebs.gss.client.rest.resource.OthersResource;
33 import gr.ebs.gss.client.rest.resource.RestResource;
34 import gr.ebs.gss.client.rest.resource.RestResourceWrapper;
35 import gr.ebs.gss.client.rest.resource.SharedFolderResource;
36 import gr.ebs.gss.client.rest.resource.SharedResource;
37 import gr.ebs.gss.client.rest.resource.TrashFolderResource;
38 import gr.ebs.gss.client.rest.resource.TrashResource;
39 import gwtquery.plugins.draggable.client.DragAndDropManager;
40 import gwtquery.plugins.draggable.client.DraggableOptions;
41 import gwtquery.plugins.draggable.client.StopDragException;
42 import gwtquery.plugins.draggable.client.DraggableOptions.CursorAt;
43 import gwtquery.plugins.draggable.client.DraggableOptions.DragFunction;
44 import gwtquery.plugins.draggable.client.DraggableOptions.RevertOption;
45 import gwtquery.plugins.draggable.client.events.DragContext;
46 import gwtquery.plugins.droppable.client.DroppableOptions;
47 import gwtquery.plugins.droppable.client.DroppableOptions.DroppableFunction;
48 import gwtquery.plugins.droppable.client.events.DragAndDropContext;
49 import gwtquery.plugins.droppable.client.gwt.DragAndDropNodeInfo;
50
51 import java.util.ArrayList;
52 import java.util.Arrays;
53 import java.util.HashMap;
54 import java.util.List;
55 import java.util.Map;
56
57 import com.google.gwt.cell.client.AbstractCell;
58 import com.google.gwt.cell.client.Cell;
59 import com.google.gwt.cell.client.ValueUpdater;
60 import com.google.gwt.core.client.GWT;
61 import com.google.gwt.dom.client.Style.Cursor;
62 import com.google.gwt.query.client.plugins.GQueryUi;
63 import com.google.gwt.safehtml.client.SafeHtmlTemplates;
64 import com.google.gwt.safehtml.shared.SafeHtml;
65 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
66 import com.google.gwt.user.client.DeferredCommand;
67 import com.google.gwt.user.client.Window;
68 import com.google.gwt.user.client.ui.AbstractImagePrototype;
69 import com.google.gwt.view.client.AsyncDataProvider;
70 import com.google.gwt.view.client.HasData;
71 import com.google.gwt.view.client.ListDataProvider;
72 import com.google.gwt.view.client.ProvidesKey;
73 import com.google.gwt.view.client.SingleSelectionModel;
74 import com.google.gwt.view.client.TreeViewModel;
75
76
77
78 /**
79  * @author kman
80  *
81  */
82 public class CellTreeViewModel implements TreeViewModel{
83         
84         private final ListDataProvider<RestResource> rootNodes = new ListDataProvider<RestResource>();
85         private Map<String,FolderResource> folderCache=new HashMap<String, FolderResource>();
86         final Images images;
87         SingleSelectionModel<RestResource> selectionModel;
88         Map<String, MyFolderDataProvider> mymap = new HashMap<String, MyFolderDataProvider>();
89         Map<String, MyFolderDataProvider> sharedmap = new HashMap<String, MyFolderDataProvider>();
90         Map<String, MyFolderDataProvider> othersmap = new HashMap<String, MyFolderDataProvider>();
91         static interface Templates extends SafeHtmlTemplates {
92             Templates INSTANCE = GWT.create(Templates.class);
93
94             @Template(" <div id='dragHelper' class='{0}'></div>")
95             SafeHtml outerHelper(String cssClassName);
96           }
97
98         static void configureDragOperation(final DraggableOptions options) {
99
100             // set a custom element as drag helper. The content of the helper will be
101             // set when the drag will start
102             options.setHelper($(Templates.INSTANCE.outerHelper(
103                 "drag").asString()));
104             // opacity of the drag helper
105             options.setOpacity((float) 0.9);
106             // cursor during the drag operation
107             options.setCursor(Cursor.MOVE);
108             // the cell being greater than the helper, force the position of the
109             // helper on the mouse cursor.
110             options.setCursorAt(new CursorAt(10, 10, null, null));
111             // append the helper to the body element
112             options.setAppendTo("body");
113             // set the revert option
114             options.setRevert(RevertOption.ON_INVALID_DROP);
115             options.setOnBeforeDragStart(new DragFunction() {
116                         
117                         @Override
118                         public void f(DragContext context) {
119                                  RestResource value = context.getDraggableData();
120                              if(value instanceof TrashResource || value instanceof SharedResource || value instanceof OthersResource || value instanceof OtherUserResource){
121                                 throw new StopDragException();
122                               }
123                                 
124                         }
125                 });
126             // use a Function to fill the content of the helper
127             // we could also add a DragStartEventHandler on the DragAndDropTreeCell and
128             // DragAndDropCellList.
129             
130             options.setOnDragStart(new DragFunction() {
131               public void f(DragContext context) {
132                 RestResourceWrapper memberInfo = context.getDraggableData();
133                 context.getHelper().setInnerHTML(memberInfo.getName());
134               }
135             });
136
137           }
138
139         /**
140          * 
141          */
142         public CellTreeViewModel(final Images _images,SingleSelectionModel<RestResource> selectionModel ) {
143                 super();
144                 images=_images;
145                 this.selectionModel=selectionModel;
146         }
147         
148         private final Cell<RestResource> departmentCell = new AbstractCell<RestResource>("contextmenu"){
149                 
150                 @Override
151                 public void render(com.google.gwt.cell.client.Cell.Context arg0, RestResource arg1, SafeHtmlBuilder arg2) {
152                         String id = null;
153                         String html = null;
154                         String name = null;
155                         if(arg1 instanceof TrashFolderResource){
156                                 html = AbstractImagePrototype.create(images.folderYellow()).getHTML();
157                                 FolderResource res = ((RestResourceWrapper)arg1).getResource();
158                                 name = res.getName();
159                                 id = res.getParentName() +"."+name;
160                         }
161                         else if(arg1 instanceof RestResourceWrapper){
162                                 FolderResource res = ((RestResourceWrapper)arg1).getResource();
163                                 if(res.isShared())
164                                         html = AbstractImagePrototype.create(images.sharedFolder()).getHTML();
165                                 else if(res.getParentName()==null){
166                                         html = AbstractImagePrototype.create(images.home()).getHTML();
167                                 }
168                                 else
169                                         html = AbstractImagePrototype.create(images.folderYellow()).getHTML();
170                                 name = res.getName();
171                                 if(res.getParentName() != null){                                        
172                                         id = res.getParentName()+"."+name;
173                                 }else{                                  
174                                         id = name;
175                                 }
176                                 
177                         }
178                         else if(arg1 instanceof TrashResource){
179                                 html = AbstractImagePrototype.create(images.trash()).getHTML();
180                                 name="Trash";
181                                 id = name;                              
182                         }
183                         
184                         else if(arg1 instanceof SharedResource){
185                                 html = AbstractImagePrototype.create(images.myShared()).getHTML();
186                                 name = "My Shared";
187                                 id = name;
188                         }
189                         else if(arg1 instanceof OthersResource){
190                                 html = AbstractImagePrototype.create(images.othersShared()).getHTML();
191                                 name = "Other's Shared";
192                                 id = "others";                          
193                         }
194                         else if(arg1 instanceof OtherUserResource){
195                                 html = AbstractImagePrototype.create(images.permUser()).getHTML();
196                                 name = ((OtherUserResource)arg1).getName();
197                                 id = name;
198                         }
199                         arg2.appendHtmlConstant(html);
200                         arg2.appendHtmlConstant("<span id='"+id +"'"+ " class='papala'>");
201                         arg2.appendEscaped(name);
202                         arg2.appendHtmlConstant("</span>");
203                 }
204                 
205                 public void onBrowserEvent(Cell.Context context, com.google.gwt.dom.client.Element parent, RestResource value, com.google.gwt.dom.client.NativeEvent event, com.google.gwt.cell.client.ValueUpdater<RestResource> valueUpdater) {
206                         if(event.getType().equals("contextmenu")){
207                                 selectionModel.setSelected(value, true);
208                                 GSS.get().getTreeView().showPopup(event.getClientX(), event.getClientY());
209                         }
210                 };
211                 
212         };
213         
214         
215         @Override
216         public <T> NodeInfo<?> getNodeInfo(final T value) {
217                 
218                 if(value==null){
219                         DragAndDropNodeInfo n = new DragAndDropNodeInfo<RestResource>(getRootNodes(), departmentCell,
220                                     selectionModel, null);
221                         configureFolderDrop(n);
222                 configureDragOperation(n.getDraggableOptions());
223                         return n;
224                 }
225                 else if (value instanceof MyFolderResource) {
226                 // Second level.
227                         MyFolderDataProvider dataProvider = new MyFolderDataProvider(
228                     ((MyFolderResource) value),MyFolderResource.class);
229                 DragAndDropNodeInfo<RestResource> n =  new DragAndDropNodeInfo<RestResource>(dataProvider, departmentCell,
230                     selectionModel, new ResourceValueUpdater());
231                 
232                 //nodeInfos.put(((MyFolderResource) value).getUri(), n);
233                 mymap.put(((MyFolderResource) value).getUri(), dataProvider);
234                 
235                 // permission cell are not draggable
236                 //n.setCellDroppableOnly();
237                 configureFolderDrop(n);
238                 configureDragOperation(n.getDraggableOptions());
239                 
240                 return n;
241                 }
242                 else if (value instanceof SharedResource) {
243                 // Second level.
244                         MyFolderDataProvider dataProvider = new MyFolderDataProvider(
245                     ((SharedResource) value), SharedFolderResource.class);
246                         sharedmap.put(((SharedResource) value).getUri(), dataProvider);
247                         DragAndDropNodeInfo<RestResource> n = new DragAndDropNodeInfo<RestResource>(dataProvider, departmentCell,
248                     selectionModel, new ResourceValueUpdater());
249                          configureFolderDrop(n);
250                         configureDragOperation(n.getDraggableOptions());
251                         return n;
252                 }
253                 else if (value instanceof TrashResource) {
254                 // Second level.
255                         ListDataProvider<RestResource> trashProvider = new ListDataProvider<RestResource>();
256                         List<RestResource> r = new ArrayList<RestResource>();
257                         for(FolderResource f : GSS.get().getTreeView().getTrash().getFolders()){
258                                 r.add(new TrashFolderResource(f));
259                         }
260                         trashProvider.setList(r);
261                         DragAndDropNodeInfo<RestResource> n = new DragAndDropNodeInfo<RestResource>(trashProvider, departmentCell,
262                     selectionModel, new ResourceValueUpdater());
263                         configureFolderDrop(n);
264                 configureDragOperation(n.getDraggableOptions());
265                         return n;
266                 }
267                 else if (value instanceof OthersResource) {
268                 // Second level.
269                         OthersDataProvider dataProvider = new OthersDataProvider(
270                     ((OthersResource) value), SharedFolderResource.class);
271                 DragAndDropNodeInfo<RestResource> n = new DragAndDropNodeInfo<RestResource>(dataProvider, departmentCell,
272                     selectionModel, null);
273                 configureFolderDrop(n);
274                 configureDragOperation(n.getDraggableOptions());
275                 return n;
276                 }
277                 else if (value instanceof SharedFolderResource) {
278                 // Second level.
279                         MyFolderDataProvider dataProvider = new MyFolderDataProvider(
280                     ((SharedFolderResource) value),SharedFolderResource.class);
281                 DragAndDropNodeInfo<RestResource> n =  new DragAndDropNodeInfo<RestResource>(dataProvider, departmentCell,
282                     selectionModel, new ResourceValueUpdater());
283                 sharedmap.put(((SharedFolderResource) value).getUri(), dataProvider);
284                 configureFolderDrop(n);
285                 configureDragOperation(n.getDraggableOptions());
286                 return n;
287                 }
288                 else if (value instanceof OthersFolderResource) {
289                 // Second level.
290                         MyFolderDataProvider dataProvider = new MyFolderDataProvider(
291                     ((OthersFolderResource) value),OthersFolderResource.class);
292                 DragAndDropNodeInfo<RestResource> n =  new DragAndDropNodeInfo<RestResource>(dataProvider, departmentCell,
293                     selectionModel, new ResourceValueUpdater());
294                 //nodeInfos.put(((OthersFolderResource) value).getUri(), n);
295                 othersmap.put(((SharedFolderResource) value).getUri(), dataProvider);
296                 configureFolderDrop(n);
297                 configureDragOperation(n.getDraggableOptions());
298                 return n;
299                 }
300                 else if (value instanceof OtherUserResource) {
301                 // Second level.
302                         MyFolderDataProvider dataProvider = new MyFolderDataProvider(
303                     ((OtherUserResource) value),OthersFolderResource.class);
304                 DragAndDropNodeInfo<RestResource> n =  new DragAndDropNodeInfo<RestResource>(dataProvider, departmentCell,
305                     selectionModel, new ResourceValueUpdater());
306                 configureFolderDrop(n);
307                 configureDragOperation(n.getDraggableOptions());
308                 return n;
309                 }
310                 // TODO Auto-generated method stub
311                 return null;
312         }
313         
314         private void configureFolderDrop(DragAndDropNodeInfo<RestResource> n){
315                 DroppableOptions options = n.getDroppableOptions();
316         options.setDroppableHoverClass("droppableHover");
317         // use a DroppableFunction here. We can also add a DropHandler in the tree
318         // itself
319         
320         options.setOnOver(new DroppableFunction() {
321                         
322                         @Override
323                         public void f(final DragAndDropContext context) {
324                                 if(context.getDroppableData()!=null && context.getDroppableData() instanceof RestResource){
325
326                                         GSS.get().getTreeView().getUtils().openNodeContainingResource((RestResource) context.getDroppableData(), new RefreshHandler() {
327                                                 
328                                                 @Override
329                                                 public void onRefresh() {
330                                                         
331                                                         DragAndDropManager.getInstance().update(context);//initialize(context, GQueryUi.Event.create(com.google.gwt.user.client.Event.getCurrentEvent()));
332                                                         
333                                                 }
334                                         });
335                                         
336                                 }
337                                 
338                                 
339                                 
340                         }
341                 });
342         options.setOnDrop(new DroppableFunction() {
343
344           public void f(DragAndDropContext context) {
345                   
346                   DnDFolderPopupMenu popup ;
347                   if(context.getDraggableData() instanceof FileResource){
348                           popup = new DnDFolderPopupMenu(images, ((MyFolderResource) context.getDroppableData()).getResource(), Arrays.asList(context.getDraggableData()));
349                   }
350                   else
351                           popup = new DnDFolderPopupMenu(images, ((MyFolderResource) context.getDroppableData()).getResource(), context.getDraggableData());
352                   int left = context.getDroppable().getAbsoluteLeft() + 40;
353               int top = context.getDroppable().getAbsoluteTop() + 20;
354               popup.setPopupPosition(left, top);
355                  
356                   popup.show();
357           }
358         });
359         }
360
361         @Override
362         public boolean isLeaf(Object value) {
363                 if(value instanceof RestResourceWrapper)
364                         return ((RestResourceWrapper)value).getResource().getFolders().size()==0;
365                 else if(value instanceof TrashResource)
366                         return ((TrashResource)value).getFolders().size()==0;
367                 else if(value instanceof SharedResource)
368                         return ((SharedResource)value).getFolders().size()==0;
369                 else if(value instanceof OthersResource)
370                         return ((OthersResource)value).getOtherUsers().size()==0;
371                 else if(value instanceof OtherUserResource)
372                         return ((OtherUserResource)value).getFolders().size()==0;
373                 return false;
374         }
375         
376         class ResourceValueUpdater implements  ValueUpdater<RestResource>{
377
378                 @Override
379                 public void update(final RestResource value) {
380                         if(value instanceof MyFolderResource){
381                                 GetCommand<FolderResource> gf = new GetCommand<FolderResource>(FolderResource.class, value.getUri(), null) {
382
383                                         @Override
384                                         public void onComplete() {
385                                                 FolderResource rootResource = getResult();
386                                                 //((MyFolderResource)value).getResource().setFiles(rootResource.getFiles());
387                                                 ((MyFolderResource)value).setResource(rootResource);
388                                                 if(GSS.get().getTreeView().getSelection().getUri().equals(value.getUri()))
389                                                         selectionModel.setSelected(value, true);
390                                                 GSS.get().onResourceUpdate(value);
391                                                 
392                                         }
393         
394                                         @Override
395                                         public void onError(Throwable t) {
396                                                 GWT.log("Error fetching root folder", t);
397                                                 GSS.get().displayError("Unable to fetch root folder");
398                                         }
399         
400                                 };
401                                 DeferredCommand.addCommand(gf);
402                         }
403                         else if(value instanceof TrashResource){
404                                 DeferredCommand.addCommand(new GetCommand<TrashResource>(TrashResource.class, GSS.get().getCurrentUserResource().getTrashPath(), null) {
405                                         @Override
406                                         public void onComplete() {
407                                                 //trash = getResult();
408                                                 for(RestResource r : getRootNodes().getList()){
409                                                         if(r instanceof TrashResource)
410                                                                 getRootNodes().getList().set(getRootNodes().getList().indexOf(r),GSS.get().getTreeView().getTrash());
411                                                 }
412                                                 GSS.get().getTreeView().updateNodeChildren(GSS.get().getTreeView().getTrash());
413                                         }
414
415                                         @Override
416                                         public void onError(Throwable t) {
417                                                 if(t instanceof RestException){
418                                                         int statusCode = ((RestException)t).getHttpStatusCode();
419                                                         // On IE status code 1223 may be returned instead of 204.
420                                                         if(statusCode == 204 || statusCode == 1223){
421                                                                 //trash = new TrashResource(GSS.get().getCurrentUserResource().getTrashPath());
422                                                 }
423                                                 else{
424                                                         GWT.log("", t);
425                                                         GSS.get().displayError("Unable to fetch trash folder:"+t.getMessage());
426                                                         //GSS.get().getTreeView().getTrash() = new TrashResource(GSS.get().getCurrentUserResource().getTrashPath());
427                                                 }
428                                         }
429                                 }
430                                 });
431                         }
432                         else if(value instanceof OthersFolderResource){
433                                 
434                         }
435                         
436                 }
437                 
438         }
439         class MyFolderDataProvider extends AsyncDataProvider<RestResource>{
440                 private RestResource restResource;
441                 private Class resourceClass;
442                   public MyFolderDataProvider(RestResource department, Class resourceClass) {
443                     super(new ProvidesKey<RestResource>() {
444
445                                 @Override
446                                 public Object getKey(RestResource item) {
447                                         return item.getUri();
448                                 }});
449                     this.restResource = department;
450                     this.resourceClass=resourceClass;
451                     //getMymap().put(department.getUri(), MyFolderDataProvider.this);
452                   }
453
454                   @Override
455                   protected void onRangeChanged(final HasData<RestResource> view) {
456                         refresh(null);
457                   }
458                   
459                 /**
460                  * Retrieve the restResource.
461                  *
462                  * @return the restResource
463                  */
464                 public RestResource getRestResource() {
465                         return restResource;
466                 }
467                 
468                 
469                 /**
470                  * Modify the restResource.
471                  *
472                  * @param restResource the restResource to set
473                  */
474                 public void setRestResource(RestResource restResource) {
475                         this.restResource = restResource;
476                 }
477                 List<RestResource> res =null;
478                   public void refresh(final RefreshHandler refresh){
479                           FolderResource cache = null;
480                           if(restResource instanceof RestResourceWrapper && !((RestResourceWrapper)restResource).getResource().isNeedsExpanding())
481                                   cache = ((RestResourceWrapper)restResource).getResource();
482                           GetCommand<FolderResource> gf = new GetCommand<FolderResource>(FolderResource.class, restResource.getUri(),cache ) {
483
484                                         @Override
485                                         public void onComplete() {
486                                                 if(restResource instanceof RestResourceWrapper){
487                                                         ((RestResourceWrapper)restResource).setResource(getResult());//restResource = getResult();
488                                                         ((RestResourceWrapper)restResource).getResource().setNeedsExpanding(false);
489                                                 }
490                                                 if(usedCachedVersion()&&res!=null){
491                                                         
492                                                                 updateRowCount(res.size(), true);
493                                                                 updateRowData(0,res);
494                                                         return;
495                                                 }
496                                                 String[] folderPaths = null;
497                                                 if(resourceClass.equals(MyFolderResource.class))
498                                                         folderPaths=((MyFolderResource) restResource).getResource().getSubfolderPaths().toArray(new String[] {});
499                                                 else if(resourceClass.equals(SharedFolderResource.class) && restResource instanceof SharedResource)
500                                                         folderPaths=((SharedResource) restResource).getSubfolderPaths().toArray(new String[] {});
501                                                 else if(resourceClass.equals(SharedFolderResource.class)){
502                                                         folderPaths=((SharedFolderResource) restResource).getResource().getSubfolderPaths().toArray(new String[] {});
503                                                         GWT.log("------------>"+folderPaths);
504                                                 }
505                                                 else if(resourceClass.equals(TrashFolderResource.class))
506                                                         folderPaths=((TrashFolderResource) restResource).getResource().getSubfolderPaths().toArray(new String[] {});
507                                                 else if(resourceClass.equals(OthersFolderResource.class) && restResource instanceof OtherUserResource)
508                                                         folderPaths=((OtherUserResource) restResource).getSubfolderPaths().toArray(new String[] {});
509                                                 else if(resourceClass.equals(OthersFolderResource.class))
510                                                         folderPaths=((OthersFolderResource) restResource).getResource().getSubfolderPaths().toArray(new String[] {});
511                                                 MultipleGetCommand.Cached[] cached = null;
512                                                 if(restResource instanceof RestResourceWrapper)
513                                                         cached=((RestResourceWrapper)restResource).getResource().getCache();
514                                                 MultipleGetCommand<FolderResource> gf2 = new MultipleGetCommand<FolderResource>(FolderResource.class,
515                                                                         folderPaths, cached) {
516
517                                                         @Override
518                                                         public void onComplete() {
519                                                                 res = new ArrayList<RestResource>();
520                                                                 for(FolderResource r : getResult()){
521                                                                         if(r.isDeleted()){
522                                                                                 
523                                                                         }
524                                                                         else if(resourceClass.equals(MyFolderResource.class))
525                                                                                 res.add(new MyFolderResource(r));
526                                                                         else if(resourceClass.equals(SharedFolderResource.class)){
527                                                                                 res.add(new SharedFolderResource(r));
528                                                                         }
529                                                                         else if(resourceClass.equals(TrashFolderResource.class))
530                                                                                 res.add(new TrashFolderResource(r));
531                                                                         else if(resourceClass.equals(OthersFolderResource.class))
532                                                                                 res.add(new OthersFolderResource(r));
533                                                                 }
534                                                                 if(restResource instanceof RestResourceWrapper)
535                                                                         ((RestResourceWrapper)restResource).getResource().setFolders(getResult());
536                                                                 updateRowCount(res.size(), true);
537                                                                 updateRowData(0,res);
538                                                                 if(refresh!=null)
539                                                                         refresh.onRefresh();
540                                                         }
541
542                                                         @Override
543                                                         public void onError(Throwable t) {
544                                                                 GSS.get().displayError("Unable to fetch subfolders");
545                                                                 GWT.log("Unable to fetch subfolders", t);
546                                                         }
547
548                                                         @Override
549                                                         public void onError(String p, Throwable throwable) {
550                                                                 GWT.log("Path:"+p, throwable);
551                                                         }
552
553                                                 };
554                                                 DeferredCommand.addCommand(gf2);
555                                                 
556                                         }
557
558                                         @Override
559                                         public void onError(Throwable t) {
560                                                 
561                                                 GWT.log("Error fetching root folder", t);
562                                                 GSS.get().displayError("Unable to fetch root folder");
563                                         }
564
565                                 };
566                                 DeferredCommand.addCommand(gf);
567                   }               
568         }
569         
570         
571         class OthersDataProvider extends AsyncDataProvider<RestResource>{
572                 private RestResource restResource;
573                 private Class resourceClass;
574                   public OthersDataProvider(RestResource department, Class resourceClass) {
575                     super(new ProvidesKey<RestResource>() {
576
577                                 @Override
578                                 public Object getKey(RestResource item) {
579                                         return item.getUri();
580                                 }});
581                     this.restResource = department;
582                     this.resourceClass=resourceClass;
583                     //CellTreeView.this.mymap.put(department.getUri(), OthersDataProvider.this);
584                   }
585
586                   @Override
587                   protected void onRangeChanged(final HasData<RestResource> view) {
588                         refresh(null);
589                   }
590                   
591                 /**
592                  * Retrieve the restResource.
593                  *
594                  * @return the restResource
595                  */
596                 public RestResource getRestResource() {
597                         return restResource;
598                 }
599                 
600                 
601                 /**
602                  * Modify the restResource.
603                  *
604                  * @param restResource the restResource to set
605                  */
606                 public void setRestResource(RestResource restResource) {
607                         this.restResource = restResource;
608                 }
609                 
610                   public void refresh(final RefreshHandler refresh){
611                           GetCommand<OthersResource> go = new GetCommand<OthersResource>(OthersResource.class,
612                           restResource.getUri(), null) {
613
614                                   @Override
615                                   public void onComplete() {
616                                           final OthersResource others = getResult();
617                           MultipleGetCommand<OtherUserResource> gogo = new MultipleGetCommand<OtherUserResource>(OtherUserResource.class,
618                                                   others.getOthers().toArray(new String[] {}), null) {
619
620                                   @Override
621                                   public void onComplete() {
622                                           List<OtherUserResource> res = getResult();
623                                           updateRowCount(res.size(), true);
624                                           List<RestResource> r = new ArrayList<RestResource>();
625                                           r.addAll(res);
626                                                                           updateRowData(0,r);
627                                   }
628
629                                   @Override
630                                   public void onError(Throwable t) {
631                                           GWT.log("Error fetching Others Root folder", t);
632                                           GSS.get().displayError("Unable to fetch Others Root folder");
633                                   }
634
635                                   @Override
636                                   public void onError(String p, Throwable throwable) {
637                                           GWT.log("Path:"+p, throwable);
638                                   }
639                           };
640                           DeferredCommand.addCommand(gogo);
641                                   }
642                         
643                                   @Override
644                                   public void onError(Throwable t) {
645                                           GWT.log("Error fetching Others Root folder", t);
646                                           GSS.get().displayError("Unable to fetch Others Root folder");
647                                   }
648                           };
649                           DeferredCommand.addCommand(go);
650                   }               
651         }
652
653
654         
655         /**
656          * Retrieve the rootNodes.
657          *
658          * @return the rootNodes
659          */
660         public ListDataProvider<RestResource> getRootNodes() {
661                 return rootNodes;
662         }
663
664         
665         /**
666          * Retrieve the mymap.
667          *
668          * @return the mymap
669          */
670         public Map<String, MyFolderDataProvider> getMymap() {
671                 return mymap;
672         }
673
674         
675         /**
676          * Retrieve the sharedmap.
677          *
678          * @return the sharedmap
679          */
680         public Map<String, MyFolderDataProvider> getSharedmap() {
681                 return sharedmap;
682         }
683
684         
685         /**
686          * Retrieve the othersmap.
687          *
688          * @return the othersmap
689          */
690         public Map<String, MyFolderDataProvider> getOthersmap() {
691                 return othersmap;
692         }
693         
694         
695         
696         
697         
698         
699 }