Statistics
| Branch: | Tag: | Revision:

root / web_client / src / gr / grnet / pithos / web / client / foldertree / FolderTreeViewModel.java @ 1ac430a1

History | View | Annotate | Download (5.7 kB)

1
/*
2
 * Copyright (c) 2011 Greek Research and Technology Network
3
 */
4

    
5
package gr.grnet.pithos.web.client.foldertree;
6

    
7
import com.google.gwt.cell.client.AbstractCell;
8
import com.google.gwt.cell.client.Cell;
9
import com.google.gwt.core.client.GWT;
10
import com.google.gwt.core.client.Scheduler;
11
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
12
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
13
import com.google.gwt.user.client.ui.AbstractImagePrototype;
14
import com.google.gwt.view.client.ListDataProvider;
15
import com.google.gwt.view.client.SelectionChangeEvent;
16
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
17
import com.google.gwt.view.client.SingleSelectionModel;
18
import com.google.gwt.view.client.TreeViewModel;
19
import gr.grnet.pithos.web.client.GSS;
20
import gr.grnet.pithos.web.client.foldertree.FolderTreeView.FolderCell;
21
import gr.grnet.pithos.web.client.rest.GetRequest;
22
import gr.grnet.pithos.web.client.rest.RestException;
23
import gr.grnet.pithos.web.client.rest.resource.FolderResource;
24
import gwtquery.plugins.droppable.client.gwt.DragAndDropNodeInfo;
25
import java.util.Iterator;
26
import java.util.List;
27
import java.util.Set;
28

    
29
public class FolderTreeViewModel implements TreeViewModel {
30

    
31
    private SingleSelectionModel<Folder> selectionModel = new SingleSelectionModel<Folder>();
32

    
33
    private ListDataProvider<Folder> rootDataProvider = new ListDataProvider<Folder>();
34

    
35
    public FolderTreeViewModel() {
36
        Handler selectionHandler = new SelectionChangeEvent.Handler() {
37
            @Override
38
            public void onSelectionChange(SelectionChangeEvent event) {
39
                NodeInfo<Folder> nodeInfo = (NodeInfo<Folder>) getNodeInfo(selectionModel.getSelectedObject());
40
                if(nodeInfo == null || nodeInfo.getValueUpdater() == null) {
41
                    //GSS.get().showFileList(selectionModel.getSelectedObject());
42
                }
43
                else
44
                    nodeInfo.getValueUpdater().update(selectionModel.getSelectedObject());
45
                GSS.get().setCurrentSelection(selectionModel.getSelectedObject());
46
            }
47
        };
48
        selectionModel.addSelectionChangeHandler(selectionHandler);
49
    }
50

    
51
    @Override
52
    public <T> NodeInfo<?> getNodeInfo(T value) {
53
        if (value == null) {
54
            Folder f = new Folder("Loading ...");
55
            rootDataProvider.getList().add(f);
56
            return new DragAndDropNodeInfo<Folder>(rootDataProvider, new FolderCell(), selectionModel, null);
57
        }
58
        else {
59
            final Folder f = (Folder) value;
60
            final ListDataProvider<Folder> dataProvider = new ListDataProvider<Folder>();
61
            dataProvider.flush();
62
            Scheduler.get().scheduleDeferred(new ScheduledCommand() {
63
                @Override
64
                public void execute() {
65
                    final GSS app = GSS.get();
66
                    String path = app.getApiPath() + app.getUsername() + "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
67
                    GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, path, f) {
68
                        @Override
69
                        public void onSuccess(Folder result) {
70
                            Iterator<Folder> iter = result.getSubfolders().iterator();
71
                            fetchFolder(iter, dataProvider, result.getSubfolders());
72
                        }
73

    
74
                        @Override
75
                        public void onError(Throwable t) {
76
                            GWT.log("Error getting folder", t);
77
                            if (t instanceof RestException)
78
                                GSS.get().displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
79
                            else
80
                                GSS.get().displayError("System error fetching folder: " + t.getMessage());
81
                        }
82
                    };
83
                    Scheduler.get().scheduleDeferred(getFolder);
84
                }
85
            });
86
            return new DragAndDropNodeInfo<Folder>(dataProvider, new FolderCell(), selectionModel, null);
87
        }
88
    }
89

    
90
    @Override
91
    public boolean isLeaf(Object o) {
92
        if (o instanceof Folder) {
93
            Folder f = (Folder) o;
94
            return f.getSubfolders().isEmpty();
95
        }
96
        return false;
97
    }
98

    
99
    private void fetchFolder(final Iterator<Folder> iter, final ListDataProvider<Folder> dataProvider, final Set<Folder> folders) {
100
        if (iter.hasNext()) {
101
            final Folder f = iter.next();
102

    
103
            GSS app = GSS.get();
104
            String path = app.getApiPath() + app.getUsername() + "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix();
105
            GetRequest<Folder> getFolder = new GetRequest<Folder>(Folder.class, path, f) {
106
                @Override
107
                public void onSuccess(Folder result) {
108
                    fetchFolder(iter, dataProvider, folders);
109
                }
110

    
111
                @Override
112
                public void onError(Throwable t) {
113
                    GWT.log("Error getting folder", t);
114
                    if (t instanceof RestException)
115
                        GSS.get().displayError("Error getting folder: " + ((RestException) t).getHttpStatusText());
116
                    else
117
                        GSS.get().displayError("System error fetching folder: " + t.getMessage());
118
                }
119
            };
120
            Scheduler.get().scheduleDeferred(getFolder);
121
        }
122
        else {
123
            dataProvider.getList().clear();
124
            dataProvider.getList().addAll(folders);
125
        }
126
    }
127

    
128
    public void initialize(AccountResource account) {
129
        Iterator<Folder> iter = account.getContainers().iterator();
130
        fetchFolder(iter, rootDataProvider, account.getContainers());
131
    }
132
}