fix node open on hover when using dnd
[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                 mymap.put(((MyFolderResource) value).getUri(), dataProvider);
232                 
233                 // permission cell are not draggable
234                 //n.setCellDroppableOnly();
235                 configureFolderDrop(n);
236                 configureDragOperation(n.getDraggableOptions());
237                 
238                 return n;
239                 }
240                 else if (value instanceof SharedResource) {
241                 // Second level.
242                         MyFolderDataProvider dataProvider = new MyFolderDataProvider(
243                     ((SharedResource) value), SharedFolderResource.class);
244                         sharedmap.put(((SharedResource) value).getUri(), dataProvider);
245                         DragAndDropNodeInfo<RestResource> n = new DragAndDropNodeInfo<RestResource>(dataProvider, departmentCell,
246                     selectionModel, new ResourceValueUpdater());
247                          configureFolderDrop(n);
248                         configureDragOperation(n.getDraggableOptions());
249                         return n;
250                 }
251                 else if (value instanceof TrashResource) {
252                 // Second level.
253                         ListDataProvider<RestResource> trashProvider = new ListDataProvider<RestResource>();
254                         List<RestResource> r = new ArrayList<RestResource>();
255                         for(FolderResource f : GSS.get().getTreeView().getTrash().getFolders()){
256                                 r.add(new TrashFolderResource(f));
257                         }
258                         trashProvider.setList(r);
259                         DragAndDropNodeInfo<RestResource> n = new DragAndDropNodeInfo<RestResource>(trashProvider, departmentCell,
260                     selectionModel, new ResourceValueUpdater());
261                         configureFolderDrop(n);
262                 configureDragOperation(n.getDraggableOptions());
263                         return n;
264                 }
265                 else if (value instanceof OthersResource) {
266                 // Second level.
267                         OthersDataProvider dataProvider = new OthersDataProvider(
268                     ((OthersResource) value), SharedFolderResource.class);
269                 DragAndDropNodeInfo<RestResource> n = new DragAndDropNodeInfo<RestResource>(dataProvider, departmentCell,
270                     selectionModel, null);
271                 configureFolderDrop(n);
272                 configureDragOperation(n.getDraggableOptions());
273                 return n;
274                 }
275                 else if (value instanceof SharedFolderResource) {
276                 // Second level.
277                         MyFolderDataProvider dataProvider = new MyFolderDataProvider(
278                     ((SharedFolderResource) value),SharedFolderResource.class);
279                 DragAndDropNodeInfo<RestResource> n =  new DragAndDropNodeInfo<RestResource>(dataProvider, departmentCell,
280                     selectionModel, new ResourceValueUpdater());
281                 sharedmap.put(((SharedFolderResource) value).getUri(), dataProvider);
282                 configureFolderDrop(n);
283                 configureDragOperation(n.getDraggableOptions());
284                 return n;
285                 }
286                 else if (value instanceof OthersFolderResource) {
287                 // Second level.
288                         MyFolderDataProvider dataProvider = new MyFolderDataProvider(
289                     ((OthersFolderResource) value),OthersFolderResource.class);
290                 DragAndDropNodeInfo<RestResource> n =  new DragAndDropNodeInfo<RestResource>(dataProvider, departmentCell,
291                     selectionModel, new ResourceValueUpdater());
292                 //nodeInfos.put(((OthersFolderResource) value).getUri(), n);
293                 othersmap.put(((OthersFolderResource) value).getUri(), dataProvider);
294                 configureFolderDrop(n);
295                 configureDragOperation(n.getDraggableOptions());
296                 return n;
297                 }
298                 else if (value instanceof OtherUserResource) {
299                 // Second level.
300                         MyFolderDataProvider dataProvider = new MyFolderDataProvider(
301                     ((OtherUserResource) value),OthersFolderResource.class);
302                 DragAndDropNodeInfo<RestResource> n =  new DragAndDropNodeInfo<RestResource>(dataProvider, departmentCell,
303                     selectionModel, new ResourceValueUpdater());
304                 configureFolderDrop(n);
305                 configureDragOperation(n.getDraggableOptions());
306                 return n;
307                 }
308                 // TODO Auto-generated method stub
309                 return null;
310         }
311         
312         private void configureFolderDrop(DragAndDropNodeInfo<RestResource> n){
313                 DroppableOptions options = n.getDroppableOptions();
314         options.setDroppableHoverClass("droppableHover");
315         // use a DroppableFunction here. We can also add a DropHandler in the tree
316         // itself
317         
318         options.setOnOver(new DroppableFunction() {
319                         
320                         @Override
321                         public void f(final DragAndDropContext context) {
322                                 if(context.getDroppableData()!=null && context.getDroppableData() instanceof RestResource){
323
324                                         GSS.get().getTreeView().getUtils().openNodeContainingResource((RestResource) context.getDroppableData(), new RefreshHandler() {
325                                                 
326                                                 @Override
327                                                 public void onRefresh() {
328                                                         
329                                                         DragAndDropManager.getInstance().update(context);//initialize(context, GQueryUi.Event.create(com.google.gwt.user.client.Event.getCurrentEvent()));
330                                                         
331                                                 }
332                                         });
333                                         
334                                 }
335                                 
336                                 
337                                 
338                         }
339                 });
340         options.setOnDrop(new DroppableFunction() {
341
342           public void f(DragAndDropContext context) {
343                   
344                   DnDFolderPopupMenu popup ;
345                   if(context.getDraggableData() instanceof FileResource){
346                           if(context.getDroppableData() instanceof RestResourceWrapper)
347                                   popup = new DnDFolderPopupMenu(images, ((RestResourceWrapper) context.getDroppableData()).getResource(), Arrays.asList(context.getDraggableData()));
348                           else
349                                   popup = new DnDFolderPopupMenu(images, null, Arrays.asList(context.getDraggableData()));
350                   }
351                   
352                   else{
353                           if(context.getDroppableData() instanceof RestResourceWrapper)
354                                   popup = new DnDFolderPopupMenu(images, ((RestResourceWrapper) context.getDroppableData()).getResource(), context.getDraggableData());
355                           else
356                                   popup = new DnDFolderPopupMenu(images, null, context.getDraggableData());
357                   }
358                   
359                   int left = context.getDroppable().getAbsoluteLeft() + 40;
360               int top = context.getDroppable().getAbsoluteTop() + 20;
361               popup.setPopupPosition(left, top);
362                  
363                   popup.show();
364           }
365         });
366         }
367
368         @Override
369         public boolean isLeaf(Object value) {
370                 if(value instanceof RestResourceWrapper)
371                         return ((RestResourceWrapper)value).getResource().getFolders().size()==0;
372                 else if(value instanceof TrashResource)
373                         return ((TrashResource)value).getFolders().size()==0;
374                 else if(value instanceof SharedResource)
375                         return ((SharedResource)value).getFolders().size()==0;
376                 else if(value instanceof OthersResource)
377                         return ((OthersResource)value).getOtherUsers().size()==0;
378                 else if(value instanceof OtherUserResource)
379                         return ((OtherUserResource)value).getFolders().size()==0;
380                 return false;
381         }
382         
383         class ResourceValueUpdater implements  ValueUpdater<RestResource>{
384
385                 @Override
386                 public void update(final RestResource value) {
387                         if(value instanceof MyFolderResource){
388                                 GetCommand<FolderResource> gf = new GetCommand<FolderResource>(FolderResource.class, value.getUri(), null) {
389
390                                         @Override
391                                         public void onComplete() {
392                                                 FolderResource rootResource = getResult();
393                                                 //((MyFolderResource)value).getResource().setFiles(rootResource.getFiles());
394                                                 ((MyFolderResource)value).setResource(rootResource);
395                                                 if(GSS.get().getTreeView().getSelection().getUri().equals(value.getUri()))
396                                                         selectionModel.setSelected(value, true);
397                                                 GSS.get().onResourceUpdate(value);
398                                                 
399                                         }
400         
401                                         @Override
402                                         public void onError(Throwable t) {
403                                                 GWT.log("Error fetching root folder", t);
404                                                 GSS.get().displayError("Unable to fetch root folder");
405                                         }
406         
407                                 };
408                                 DeferredCommand.addCommand(gf);
409                         }
410                         else if(value instanceof TrashResource){
411                                 DeferredCommand.addCommand(new GetCommand<TrashResource>(TrashResource.class, GSS.get().getCurrentUserResource().getTrashPath(), null) {
412                                         @Override
413                                         public void onComplete() {
414                                                 //trash = getResult();
415                                                 ((TrashResource)value).setFolders(getResult().getFolders());
416                                                 ((TrashResource)value).setFiles(getResult().getFiles());
417                                                 for(RestResource r : getRootNodes().getList()){
418                                                         if(r instanceof TrashResource)
419                                                                 getRootNodes().getList().set(getRootNodes().getList().indexOf(r),GSS.get().getTreeView().getTrash());
420                                                 }
421                                                 GSS.get().getTreeView().updateNodeChildren(GSS.get().getTreeView().getTrash());
422                                                 //GSS.get().showFileList(true);
423                                                 GSS.get().onResourceUpdate(value);
424                                         }
425
426                                         @Override
427                                         public void onError(Throwable t) {
428                                                 if(t instanceof RestException){
429                                                         int statusCode = ((RestException)t).getHttpStatusCode();
430                                                         // On IE status code 1223 may be returned instead of 204.
431                                                         if(statusCode == 204 || statusCode == 1223){
432                                                                 ((TrashResource)value).setFolders(new ArrayList<FolderResource>());
433                                                                 ((TrashResource)value).setFiles(new ArrayList<FileResource>());
434                                                 }
435                                                 else{
436                                                         GWT.log("", t);
437                                                         GSS.get().displayError("Unable to fetch trash folder:"+t.getMessage());
438                                                         //GSS.get().getTreeView().getTrash() = new TrashResource(GSS.get().getCurrentUserResource().getTrashPath());
439                                                 }
440                                         }
441                                 }
442                                 });
443                         }
444                         else if(value instanceof OthersFolderResource){
445                                 GetCommand<FolderResource> gf = new GetCommand<FolderResource>(FolderResource.class, value.getUri(), null) {
446
447                                         @Override
448                                         public void onComplete() {
449                                                 FolderResource rootResource = getResult();
450                                                 //((MyFolderResource)value).getResource().setFiles(rootResource.getFiles());
451                                                 ((OthersFolderResource)value).setResource(rootResource);
452                                                 if(GSS.get().getTreeView().getSelection().getUri().equals(value.getUri()))
453                                                         selectionModel.setSelected(value, true);
454                                                 GSS.get().onResourceUpdate(value);
455                                                 
456                                         }
457         
458                                         @Override
459                                         public void onError(Throwable t) {
460                                                 GWT.log("Error fetching root folder", t);
461                                                 GSS.get().displayError("Unable to fetch root folder");
462                                         }
463         
464                                 };
465                                 DeferredCommand.addCommand(gf);
466                         }
467                         else if(value instanceof SharedFolderResource){
468                                 GetCommand<FolderResource> gf = new GetCommand<FolderResource>(FolderResource.class, value.getUri(), null) {
469
470                                         @Override
471                                         public void onComplete() {
472                                                 FolderResource rootResource = getResult();
473                                                 //((MyFolderResource)value).getResource().setFiles(rootResource.getFiles());
474                                                 ((SharedFolderResource)value).setResource(rootResource);
475                                                 if(GSS.get().getTreeView().getSelection().getUri().equals(value.getUri()))
476                                                         selectionModel.setSelected(value, true);
477                                                 GSS.get().onResourceUpdate(value);
478                                                 
479                                         }
480         
481                                         @Override
482                                         public void onError(Throwable t) {
483                                                 GWT.log("Error fetching root folder", t);
484                                                 GSS.get().displayError("Unable to fetch root folder");
485                                         }
486         
487                                 };
488                                 DeferredCommand.addCommand(gf);
489                         }
490                         else if(value instanceof SharedResource){
491                                 GetCommand<SharedResource> gf = new GetCommand<SharedResource>(SharedResource.class, value.getUri(), null) {
492
493                                         @Override
494                                         public void onComplete() {
495                                                 SharedResource rootResource = getResult();
496                                                 ((SharedResource)value).setFolders(getResult().getFolders());
497                                                 ((SharedResource)value).setFiles(getResult().getFiles());
498                                                 
499                                                 if(GSS.get().getTreeView().getSelection().getUri().equals(value.getUri()))
500                                                         selectionModel.setSelected(value, true);
501                                                 GSS.get().onResourceUpdate(value);
502                                                 
503                                         }
504         
505                                         @Override
506                                         public void onError(Throwable t) {
507                                                 GWT.log("Error fetching root folder", t);
508                                                 GSS.get().displayError("Unable to fetch root folder");
509                                         }
510         
511                                 };
512                                 DeferredCommand.addCommand(gf);
513                         }
514                         else if(value instanceof OtherUserResource){
515                                 GetCommand<OtherUserResource> gf = new GetCommand<OtherUserResource>(OtherUserResource.class, value.getUri(), null) {
516
517                                         @Override
518                                         public void onComplete() {
519                                                 OtherUserResource rootResource = getResult();
520                                                 ((OtherUserResource)value).setFolders(getResult().getFolders());
521                                                 ((OtherUserResource)value).setFiles(getResult().getFiles());
522                                                 
523                                                 if(GSS.get().getTreeView().getSelection().getUri().equals(value.getUri()))
524                                                         selectionModel.setSelected(value, true);
525                                                 GSS.get().onResourceUpdate(value);
526                                                 
527                                         }
528         
529                                         @Override
530                                         public void onError(Throwable t) {
531                                                 GWT.log("Error fetching root folder", t);
532                                                 GSS.get().displayError("Unable to fetch root folder");
533                                         }
534         
535                                 };
536                                 DeferredCommand.addCommand(gf);
537                         }
538                         
539                 }
540                 
541         }
542         class MyFolderDataProvider extends AsyncDataProvider<RestResource>{
543                 private RestResource restResource;
544                 private Class resourceClass;
545                   public MyFolderDataProvider(RestResource department, Class resourceClass) {
546                     super(new ProvidesKey<RestResource>() {
547
548                                 @Override
549                                 public Object getKey(RestResource item) {
550                                         return item.getUri();
551                                 }});
552                     this.restResource = department;
553                     this.resourceClass=resourceClass;
554                   }
555
556                   @Override
557                   protected void onRangeChanged(final HasData<RestResource> view) {
558                         refresh(null);
559                   }
560                   
561                 /**
562                  * Retrieve the restResource.
563                  *
564                  * @return the restResource
565                  */
566                 public RestResource getRestResource() {
567                         return restResource;
568                 }
569                 
570                 
571                 /**
572                  * Modify the restResource.
573                  *
574                  * @param restResource the restResource to set
575                  */
576                 public void setRestResource(RestResource restResource) {
577                         this.restResource = restResource;
578                 }
579                 List<RestResource> res =null;
580                   public void refresh(final RefreshHandler refresh){
581                           FolderResource cache = null;
582                           if(restResource instanceof RestResourceWrapper && !((RestResourceWrapper)restResource).getResource().isNeedsExpanding())
583                                   cache = ((RestResourceWrapper)restResource).getResource();
584                           GetCommand<FolderResource> gf = new GetCommand<FolderResource>(FolderResource.class, restResource.getUri(),cache ) {
585
586                                         @Override
587                                         public void onComplete() {
588                                                 if(restResource instanceof RestResourceWrapper){
589                                                         ((RestResourceWrapper)restResource).setResource(getResult());//restResource = getResult();
590                                                         ((RestResourceWrapper)restResource).getResource().setNeedsExpanding(false);
591                                                 }
592                                                 if(usedCachedVersion()&&res!=null){
593                                                         
594                                                                 updateRowCount(res.size(), true);
595                                                                 updateRowData(0,res);
596                                                         return;
597                                                 }
598                                                 String[] folderPaths = null;
599                                                 if(resourceClass.equals(MyFolderResource.class))
600                                                         folderPaths=((MyFolderResource) restResource).getResource().getSubfolderPaths().toArray(new String[] {});
601                                                 else if(resourceClass.equals(SharedFolderResource.class) && restResource instanceof SharedResource)
602                                                         folderPaths=((SharedResource) restResource).getSubfolderPaths().toArray(new String[] {});
603                                                 else if(resourceClass.equals(SharedFolderResource.class)){
604                                                         folderPaths=((SharedFolderResource) restResource).getResource().getSubfolderPaths().toArray(new String[] {});
605                                                         GWT.log("------------>"+folderPaths);
606                                                 }
607                                                 else if(resourceClass.equals(TrashFolderResource.class))
608                                                         folderPaths=((TrashFolderResource) restResource).getResource().getSubfolderPaths().toArray(new String[] {});
609                                                 else if(resourceClass.equals(OthersFolderResource.class) && restResource instanceof OtherUserResource)
610                                                         folderPaths=((OtherUserResource) restResource).getSubfolderPaths().toArray(new String[] {});
611                                                 else if(resourceClass.equals(OthersFolderResource.class))
612                                                         folderPaths=((OthersFolderResource) restResource).getResource().getSubfolderPaths().toArray(new String[] {});
613                                                 MultipleGetCommand.Cached[] cached = null;
614                                                 if(restResource instanceof RestResourceWrapper)
615                                                         cached=((RestResourceWrapper)restResource).getResource().getCache();
616                                                 MultipleGetCommand<FolderResource> gf2 = new MultipleGetCommand<FolderResource>(FolderResource.class,
617                                                                         folderPaths, cached) {
618
619                                                         @Override
620                                                         public void onComplete() {
621                                                                 res = new ArrayList<RestResource>();
622                                                                 for(FolderResource r : getResult()){
623                                                                         if(r.isDeleted()){
624                                                                                 
625                                                                         }
626                                                                         else if(resourceClass.equals(MyFolderResource.class))
627                                                                                 res.add(new MyFolderResource(r));
628                                                                         else if(resourceClass.equals(SharedFolderResource.class)){
629                                                                                 res.add(new SharedFolderResource(r));
630                                                                         }
631                                                                         else if(resourceClass.equals(TrashFolderResource.class))
632                                                                                 res.add(new TrashFolderResource(r));
633                                                                         else if(resourceClass.equals(OthersFolderResource.class))
634                                                                                 res.add(new OthersFolderResource(r));
635                                                                 }
636                                                                 if(restResource instanceof RestResourceWrapper)
637                                                                         ((RestResourceWrapper)restResource).getResource().setFolders(getResult());
638                                                                 updateRowCount(res.size(), true);
639                                                                 updateRowData(0,res);
640                                                                 if(refresh!=null)
641                                                                         refresh.onRefresh();
642                                                         }
643
644                                                         @Override
645                                                         public void onError(Throwable t) {
646                                                                 GSS.get().displayError("Unable to fetch subfolders");
647                                                                 GWT.log("Unable to fetch subfolders", t);
648                                                         }
649
650                                                         @Override
651                                                         public void onError(String p, Throwable throwable) {
652                                                                 GWT.log("Path:"+p, throwable);
653                                                         }
654
655                                                 };
656                                                 DeferredCommand.addCommand(gf2);
657                                                 
658                                         }
659
660                                         @Override
661                                         public void onError(Throwable t) {
662                                                 
663                                                 GWT.log("Error fetching root folder", t);
664                                                 GSS.get().displayError("Unable to fetch root folder");
665                                         }
666
667                                 };
668                                 DeferredCommand.addCommand(gf);
669                   }               
670         }
671         
672         
673         class OthersDataProvider extends AsyncDataProvider<RestResource>{
674                 private RestResource restResource;
675                 private Class resourceClass;
676                   public OthersDataProvider(RestResource department, Class resourceClass) {
677                     super(new ProvidesKey<RestResource>() {
678
679                                 @Override
680                                 public Object getKey(RestResource item) {
681                                         return item.getUri();
682                                 }});
683                     this.restResource = department;
684                     this.resourceClass=resourceClass;
685                   }
686
687                   @Override
688                   protected void onRangeChanged(final HasData<RestResource> view) {
689                         refresh(null);
690                   }
691                   
692                 /**
693                  * Retrieve the restResource.
694                  *
695                  * @return the restResource
696                  */
697                 public RestResource getRestResource() {
698                         return restResource;
699                 }
700                 
701                 
702                 /**
703                  * Modify the restResource.
704                  *
705                  * @param restResource the restResource to set
706                  */
707                 public void setRestResource(RestResource restResource) {
708                         this.restResource = restResource;
709                 }
710                 
711                   public void refresh(final RefreshHandler refresh){
712                           GetCommand<OthersResource> go = new GetCommand<OthersResource>(OthersResource.class,
713                           restResource.getUri(), null) {
714
715                                   @Override
716                                   public void onComplete() {
717                                           final OthersResource others = getResult();
718                           MultipleGetCommand<OtherUserResource> gogo = new MultipleGetCommand<OtherUserResource>(OtherUserResource.class,
719                                                   others.getOthers().toArray(new String[] {}), null) {
720
721                                   @Override
722                                   public void onComplete() {
723                                           List<OtherUserResource> res = getResult();
724                                           updateRowCount(res.size(), true);
725                                           List<RestResource> r = new ArrayList<RestResource>();
726                                           r.addAll(res);
727                                                                           updateRowData(0,r);
728                                   }
729
730                                   @Override
731                                   public void onError(Throwable t) {
732                                           GWT.log("Error fetching Others Root folder", t);
733                                           GSS.get().displayError("Unable to fetch Others Root folder");
734                                   }
735
736                                   @Override
737                                   public void onError(String p, Throwable throwable) {
738                                           GWT.log("Path:"+p, throwable);
739                                   }
740                           };
741                           DeferredCommand.addCommand(gogo);
742                                   }
743                         
744                                   @Override
745                                   public void onError(Throwable t) {
746                                           GWT.log("Error fetching Others Root folder", t);
747                                           GSS.get().displayError("Unable to fetch Others Root folder");
748                                   }
749                           };
750                           DeferredCommand.addCommand(go);
751                   }               
752         }
753
754
755         
756         /**
757          * Retrieve the rootNodes.
758          *
759          * @return the rootNodes
760          */
761         public ListDataProvider<RestResource> getRootNodes() {
762                 return rootNodes;
763         }
764
765         
766         /**
767          * Retrieve the mymap.
768          *
769          * @return the mymap
770          */
771         public Map<String, MyFolderDataProvider> getMymap() {
772                 return mymap;
773         }
774
775         
776         /**
777          * Retrieve the sharedmap.
778          *
779          * @return the sharedmap
780          */
781         public Map<String, MyFolderDataProvider> getSharedmap() {
782                 return sharedmap;
783         }
784
785         
786         /**
787          * Retrieve the othersmap.
788          *
789          * @return the othersmap
790          */
791         public Map<String, MyFolderDataProvider> getOthersmap() {
792                 return othersmap;
793         }
794         
795         
796         
797         
798         
799         
800 }