Statistics
| Branch: | Tag: | Revision:

root / src / gr / ebs / gss / client / CellTreeViewModel.java @ 20211689

History | View | Annotate | Download (25.5 kB)

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
}