Statistics
| Branch: | Tag: | Revision:

root / src / gr / grnet / pithos / web / client / Pithos.java @ d2b953c5

History | View | Annotate | Download (58.4 kB)

1 a57faaf0 Christos Stathis
/*
2 e6e9f6e6 Christos KK Loverdos
 * Copyright 2011-2013 GRNET S.A. All rights reserved.
3 63366925 Christos Stathis
 *
4 63366925 Christos Stathis
 * Redistribution and use in source and binary forms, with or
5 63366925 Christos Stathis
 * without modification, are permitted provided that the following
6 63366925 Christos Stathis
 * conditions are met:
7 63366925 Christos Stathis
 *
8 63366925 Christos Stathis
 *   1. Redistributions of source code must retain the above
9 63366925 Christos Stathis
 *      copyright notice, this list of conditions and the following
10 63366925 Christos Stathis
 *      disclaimer.
11 63366925 Christos Stathis
 *
12 63366925 Christos Stathis
 *   2. Redistributions in binary form must reproduce the above
13 63366925 Christos Stathis
 *      copyright notice, this list of conditions and the following
14 63366925 Christos Stathis
 *      disclaimer in the documentation and/or other materials
15 63366925 Christos Stathis
 *      provided with the distribution.
16 63366925 Christos Stathis
 *
17 63366925 Christos Stathis
 * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18 63366925 Christos Stathis
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 63366925 Christos Stathis
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 63366925 Christos Stathis
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21 63366925 Christos Stathis
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 63366925 Christos Stathis
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 63366925 Christos Stathis
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24 63366925 Christos Stathis
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 63366925 Christos Stathis
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 63366925 Christos Stathis
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27 63366925 Christos Stathis
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 63366925 Christos Stathis
 * POSSIBILITY OF SUCH DAMAGE.
29 63366925 Christos Stathis
 *
30 63366925 Christos Stathis
 * The views and conclusions contained in the software and
31 63366925 Christos Stathis
 * documentation are those of the authors and should not be
32 63366925 Christos Stathis
 * interpreted as representing official policies, either expressed
33 63366925 Christos Stathis
 * or implied, of GRNET S.A.
34 a57faaf0 Christos Stathis
 */
35 a57faaf0 Christos Stathis
package gr.grnet.pithos.web.client;
36 a57faaf0 Christos Stathis
37 a57faaf0 Christos Stathis
import com.google.gwt.core.client.EntryPoint;
38 a57faaf0 Christos Stathis
import com.google.gwt.core.client.GWT;
39 3646552f Christos Stathis
import com.google.gwt.core.client.JsArrayString;
40 7811b9d1 Christos Stathis
import com.google.gwt.core.client.Scheduler;
41 983f9ee2 Christos Stathis
import com.google.gwt.core.client.Scheduler.RepeatingCommand;
42 7811b9d1 Christos Stathis
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
43 7811b9d1 Christos Stathis
import com.google.gwt.event.dom.client.ClickEvent;
44 7811b9d1 Christos Stathis
import com.google.gwt.event.dom.client.ClickHandler;
45 a57faaf0 Christos Stathis
import com.google.gwt.event.logical.shared.ResizeEvent;
46 a57faaf0 Christos Stathis
import com.google.gwt.event.logical.shared.ResizeHandler;
47 7811b9d1 Christos Stathis
import com.google.gwt.http.client.Response;
48 f5023f13 Christos Stathis
import com.google.gwt.http.client.URL;
49 b1001100 Christos Stathis
import com.google.gwt.i18n.client.DateTimeFormat;
50 f0105e9f Christos Stathis
import com.google.gwt.i18n.client.Dictionary;
51 b1001100 Christos Stathis
import com.google.gwt.i18n.client.TimeZone;
52 01bd6099 Christos Stathis
import com.google.gwt.resources.client.ClientBundle;
53 01bd6099 Christos Stathis
import com.google.gwt.resources.client.CssResource;
54 a57faaf0 Christos Stathis
import com.google.gwt.resources.client.ImageResource;
55 9fbf5596 Christos Stathis
import com.google.gwt.resources.client.ImageResource.ImageOptions;
56 cdd90acb Christos KK Loverdos
import com.google.gwt.user.client.*;
57 cdd90acb Christos KK Loverdos
import com.google.gwt.user.client.ui.*;
58 7811b9d1 Christos Stathis
import com.google.gwt.view.client.SelectionChangeEvent;
59 7811b9d1 Christos Stathis
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
60 7811b9d1 Christos Stathis
import com.google.gwt.view.client.SingleSelectionModel;
61 eee72ed5 Christos KK Loverdos
import gr.grnet.pithos.web.client.catalog.UpdateUserCatalogs;
62 cc0120ab Christos KK Loverdos
import gr.grnet.pithos.web.client.catalog.UserCatalogs;
63 cdd90acb Christos KK Loverdos
import gr.grnet.pithos.web.client.commands.UploadFileCommand;
64 cdd90acb Christos KK Loverdos
import gr.grnet.pithos.web.client.foldertree.*;
65 cdd90acb Christos KK Loverdos
import gr.grnet.pithos.web.client.grouptree.Group;
66 cdd90acb Christos KK Loverdos
import gr.grnet.pithos.web.client.grouptree.GroupTreeView;
67 cdd90acb Christos KK Loverdos
import gr.grnet.pithos.web.client.grouptree.GroupTreeViewModel;
68 cdd90acb Christos KK Loverdos
import gr.grnet.pithos.web.client.mysharedtree.MysharedTreeView;
69 cdd90acb Christos KK Loverdos
import gr.grnet.pithos.web.client.mysharedtree.MysharedTreeViewModel;
70 cdd90acb Christos KK Loverdos
import gr.grnet.pithos.web.client.othersharedtree.OtherSharedTreeView;
71 cdd90acb Christos KK Loverdos
import gr.grnet.pithos.web.client.othersharedtree.OtherSharedTreeViewModel;
72 cdd90acb Christos KK Loverdos
import gr.grnet.pithos.web.client.rest.*;
73 cdd90acb Christos KK Loverdos
import org.apache.http.HttpStatus;
74 cdd90acb Christos KK Loverdos
75 cdd90acb Christos KK Loverdos
import java.util.*;
76 6084aa02 Christos Stathis
77 a57faaf0 Christos Stathis
/**
78 a57faaf0 Christos Stathis
 * Entry point classes define <code>onModuleLoad()</code>.
79 a57faaf0 Christos Stathis
 */
80 749068ba Christos Stathis
public class Pithos implements EntryPoint, ResizeHandler {
81 d8e2a280 Christos KK Loverdos
    private static final boolean IsLOGEnabled = false;
82 45c76262 Christos KK Loverdos
    public static final boolean IsDetailedHTTPLOGEnabled = true;
83 10ff638f Christos KK Loverdos
    public static final boolean IsFullResponseBodyLOGEnabled = true;
84 10ff638f Christos KK Loverdos
85 59aa2375 Christos KK Loverdos
    public static final Set<String> HTTPHeadersToIgnoreInLOG = new HashSet<String>();
86 59aa2375 Christos KK Loverdos
    static {
87 59aa2375 Christos KK Loverdos
        HTTPHeadersToIgnoreInLOG.add(Const.HTTP_HEADER_CONNECTION);
88 59aa2375 Christos KK Loverdos
        HTTPHeadersToIgnoreInLOG.add(Const.HTTP_HEADER_DATE);
89 59aa2375 Christos KK Loverdos
        HTTPHeadersToIgnoreInLOG.add(Const.HTTP_HEADER_KEEP_ALIVE);
90 59aa2375 Christos KK Loverdos
        HTTPHeadersToIgnoreInLOG.add(Const.HTTP_HEADER_SERVER);
91 77a99b26 Christos KK Loverdos
        HTTPHeadersToIgnoreInLOG.add(Const.HTTP_HEADER_VARY);
92 10ff638f Christos KK Loverdos
        HTTPHeadersToIgnoreInLOG.add(Const.IF_MODIFIED_SINCE);
93 59aa2375 Christos KK Loverdos
    }
94 e0a0c6ea Christos KK Loverdos
95 cdd90acb Christos KK Loverdos
    public static final Configuration config = GWT.create(Configuration.class);
96 d2b953c5 Kostas Papadimitriou
    public static final String CONFIG_API_PATH = getFromOtherPropertiesOrDefaultString("STORAGE_API_URL", config.apiPath());
97 28e270f9 Christos KK Loverdos
    static {
98 28e270f9 Christos KK Loverdos
        LOG("CONFIG_API_PATH = ", CONFIG_API_PATH);
99 28e270f9 Christos KK Loverdos
    }
100 28e270f9 Christos KK Loverdos
101 28e270f9 Christos KK Loverdos
    public static final Dictionary otherProperties = Dictionary.getDictionary(Const.OTHER_PROPERTIES);
102 28e270f9 Christos KK Loverdos
    public static String getFromOtherPropertiesOrNull(String key) {
103 28e270f9 Christos KK Loverdos
        try {
104 28e270f9 Christos KK Loverdos
            return otherProperties.get(key);
105 28e270f9 Christos KK Loverdos
        }
106 28e270f9 Christos KK Loverdos
        catch(Exception e) {
107 28e270f9 Christos KK Loverdos
            LOGError(e);
108 28e270f9 Christos KK Loverdos
            return null;
109 28e270f9 Christos KK Loverdos
        }
110 28e270f9 Christos KK Loverdos
    }
111 d2b953c5 Kostas Papadimitriou
    public static String getFromOtherPropertiesOrDefaultString(String key, String dflt) {
112 d2b953c5 Kostas Papadimitriou
        try {
113 d2b953c5 Kostas Papadimitriou
            return otherProperties.get(key);
114 d2b953c5 Kostas Papadimitriou
        }
115 d2b953c5 Kostas Papadimitriou
        catch(Exception e) {
116 d2b953c5 Kostas Papadimitriou
            return dflt;
117 d2b953c5 Kostas Papadimitriou
        }
118 d2b953c5 Kostas Papadimitriou
    }
119 28e270f9 Christos KK Loverdos
    public static final String OTHERPROPS_STORAGE_API_URL = getFromOtherPropertiesOrNull("STORAGE_API_URL");
120 28e270f9 Christos KK Loverdos
    public static final String OTHERPROPS_USER_CATALOGS_API_URL = getFromOtherPropertiesOrNull("USER_CATALOGS_API_URL");
121 28e270f9 Christos KK Loverdos
    static {
122 28e270f9 Christos KK Loverdos
        LOG("STORAGE_API_URL = ", OTHERPROPS_STORAGE_API_URL);
123 28e270f9 Christos KK Loverdos
        LOG("USER_CATALOGS_API_URL = ", OTHERPROPS_USER_CATALOGS_API_URL);
124 28e270f9 Christos KK Loverdos
    }
125 28e270f9 Christos KK Loverdos
126 28e270f9 Christos KK Loverdos
    public static final String STORAGE_API_URL;
127 28e270f9 Christos KK Loverdos
    static {
128 28e270f9 Christos KK Loverdos
        if(OTHERPROPS_STORAGE_API_URL != null) {
129 28e270f9 Christos KK Loverdos
            STORAGE_API_URL = OTHERPROPS_STORAGE_API_URL;
130 28e270f9 Christos KK Loverdos
        }
131 28e270f9 Christos KK Loverdos
        else if(CONFIG_API_PATH != null) {
132 28e270f9 Christos KK Loverdos
            STORAGE_API_URL = CONFIG_API_PATH;
133 28e270f9 Christos KK Loverdos
        }
134 28e270f9 Christos KK Loverdos
        else {
135 28e270f9 Christos KK Loverdos
            throw new RuntimeException("Unknown STORAGE_API_URL");
136 28e270f9 Christos KK Loverdos
        }
137 28e270f9 Christos KK Loverdos
    }
138 28e270f9 Christos KK Loverdos
    public static final String USER_CATALOGS_API_URL;
139 28e270f9 Christos KK Loverdos
    static {
140 28e270f9 Christos KK Loverdos
        if(OTHERPROPS_USER_CATALOGS_API_URL != null) {
141 28e270f9 Christos KK Loverdos
            USER_CATALOGS_API_URL = OTHERPROPS_USER_CATALOGS_API_URL;
142 28e270f9 Christos KK Loverdos
        }
143 28e270f9 Christos KK Loverdos
        else if(OTHERPROPS_STORAGE_API_URL != null) {
144 28e270f9 Christos KK Loverdos
            throw new RuntimeException("STORAGE_API_URL is defined but USER_CATALOGS_API_URL is not");
145 28e270f9 Christos KK Loverdos
        }
146 28e270f9 Christos KK Loverdos
        else {
147 28e270f9 Christos KK Loverdos
            // https://server.com/v1/ --> https://server.com
148 28e270f9 Christos KK Loverdos
            String url = CONFIG_API_PATH;
149 28e270f9 Christos KK Loverdos
            url = Helpers.stripTrailing(url, "/");
150 28e270f9 Christos KK Loverdos
            url = Helpers.upToIncludingLastPart(url, "/");
151 28e270f9 Christos KK Loverdos
            url = Helpers.stripTrailing(url, "/");
152 28e270f9 Christos KK Loverdos
            url = url + "/user_catalogs";
153 28e270f9 Christos KK Loverdos
154 28e270f9 Christos KK Loverdos
            USER_CATALOGS_API_URL = url;
155 28e270f9 Christos KK Loverdos
156 28e270f9 Christos KK Loverdos
            LOG("USER_CATALOGS_API_URL = ", USER_CATALOGS_API_URL);
157 28e270f9 Christos KK Loverdos
        }
158 28e270f9 Christos KK Loverdos
    }
159 cdd90acb Christos KK Loverdos
160 cdd90acb Christos KK Loverdos
    public interface Style extends CssResource {
161 cdd90acb Christos KK Loverdos
        String commandAnchor();
162 cdd90acb Christos KK Loverdos
163 cdd90acb Christos KK Loverdos
        String statistics();
164 cdd90acb Christos KK Loverdos
165 cdd90acb Christos KK Loverdos
        @ClassName("gwt-HTML")
166 cdd90acb Christos KK Loverdos
        String html();
167 cdd90acb Christos KK Loverdos
168 cdd90acb Christos KK Loverdos
        String uploadAlert();
169 cdd90acb Christos KK Loverdos
170 cdd90acb Christos KK Loverdos
        String uploadAlertLink();
171 cdd90acb Christos KK Loverdos
172 cdd90acb Christos KK Loverdos
        String uploadAlertProgress();
173 cdd90acb Christos KK Loverdos
174 cdd90acb Christos KK Loverdos
        String uploadAlertPercent();
175 cdd90acb Christos KK Loverdos
176 cdd90acb Christos KK Loverdos
        String uploadAlertClose();
177 cdd90acb Christos KK Loverdos
    }
178 cdd90acb Christos KK Loverdos
179 cdd90acb Christos KK Loverdos
    public interface Resources extends ClientBundle {
180 cdd90acb Christos KK Loverdos
        @Source("Pithos.css")
181 cdd90acb Christos KK Loverdos
        Style pithosCss();
182 cdd90acb Christos KK Loverdos
183 cdd90acb Christos KK Loverdos
        @Source("gr/grnet/pithos/resources/close-popup.png")
184 cdd90acb Christos KK Loverdos
        ImageResource closePopup();
185 cdd90acb Christos KK Loverdos
    }
186 cdd90acb Christos KK Loverdos
187 cdd90acb Christos KK Loverdos
    public static Resources resources = GWT.create(Resources.class);
188 cdd90acb Christos KK Loverdos
189 cdd90acb Christos KK Loverdos
    /**
190 cdd90acb Christos KK Loverdos
     * Instantiate an application-level image bundle. This object will provide
191 cdd90acb Christos KK Loverdos
     * programmatic access to all the images needed by widgets.
192 cdd90acb Christos KK Loverdos
     */
193 cdd90acb Christos KK Loverdos
    static Images images = (Images) GWT.create(Images.class);
194 a57faaf0 Christos Stathis
195 cc0120ab Christos KK Loverdos
    public String getUserID() {
196 cc0120ab Christos KK Loverdos
        return userID;
197 6084aa02 Christos Stathis
    }
198 a57faaf0 Christos Stathis
199 b9a1049a Christos KK Loverdos
    public UserCatalogs getUserCatalogs() {
200 b9a1049a Christos KK Loverdos
        return userCatalogs;
201 b9a1049a Christos KK Loverdos
    }
202 b9a1049a Christos KK Loverdos
203 cde22209 Christos KK Loverdos
    public String getCurrentUserDisplayNameOrID() {
204 dc8cc18a Christos KK Loverdos
        final String displayName = userCatalogs.getDisplayName(getUserID());
205 1bb330dc Christos KK Loverdos
        return displayName == null ? getUserID() : displayName;
206 1bb330dc Christos KK Loverdos
    }
207 1bb330dc Christos KK Loverdos
208 c8f8690d Christos KK Loverdos
    public boolean hasDisplayNameForUserID(String userID) {
209 dc8cc18a Christos KK Loverdos
        return userCatalogs.getDisplayName(userID) != null;
210 b9a1049a Christos KK Loverdos
    }
211 b9a1049a Christos KK Loverdos
212 c8f8690d Christos KK Loverdos
    public boolean hasIDForUserDisplayName(String userDisplayName) {
213 c8f8690d Christos KK Loverdos
        return userCatalogs.getID(userDisplayName) != null;
214 c8f8690d Christos KK Loverdos
    }
215 c8f8690d Christos KK Loverdos
216 c8f8690d Christos KK Loverdos
    public String getDisplayNameForUserID(String userID) {
217 dc8cc18a Christos KK Loverdos
        return userCatalogs.getDisplayName(userID);
218 b9a1049a Christos KK Loverdos
    }
219 b9a1049a Christos KK Loverdos
220 c8f8690d Christos KK Loverdos
    public String getIDForUserDisplayName(String userDisplayName) {
221 c8f8690d Christos KK Loverdos
        return userCatalogs.getID(userDisplayName);
222 b9a1049a Christos KK Loverdos
    }
223 b9a1049a Christos KK Loverdos
224 c8f8690d Christos KK Loverdos
    public List<String> getDisplayNamesForUserIDs(List<String> userIDs) {
225 b9a1049a Christos KK Loverdos
        if(userIDs == null) {
226 b9a1049a Christos KK Loverdos
            userIDs = new ArrayList<String>();
227 b9a1049a Christos KK Loverdos
        }
228 b9a1049a Christos KK Loverdos
        final List<String> userDisplayNames = new ArrayList<String>();
229 b9a1049a Christos KK Loverdos
        for(String userID : userIDs) {
230 c8f8690d Christos KK Loverdos
            final String displayName = getDisplayNameForUserID(userID);
231 b9a1049a Christos KK Loverdos
            userDisplayNames.add(displayName);
232 b9a1049a Christos KK Loverdos
        }
233 b9a1049a Christos KK Loverdos
234 b9a1049a Christos KK Loverdos
        return userDisplayNames;
235 cde22209 Christos KK Loverdos
    }
236 cde22209 Christos KK Loverdos
237 b9a1049a Christos KK Loverdos
    public List<String> filterUserIDsWithUnknownDisplayName(Collection<String> userIDs) {
238 b9a1049a Christos KK Loverdos
        if(userIDs == null) {
239 b9a1049a Christos KK Loverdos
            userIDs = new ArrayList<String>();
240 b9a1049a Christos KK Loverdos
        }
241 b9a1049a Christos KK Loverdos
        final List<String> filtered = new ArrayList<String>();
242 b9a1049a Christos KK Loverdos
        for(String userID : userIDs) {
243 dc8cc18a Christos KK Loverdos
            if(!this.userCatalogs.hasID(userID)) {
244 b9a1049a Christos KK Loverdos
                filtered.add(userID);
245 b9a1049a Christos KK Loverdos
            }
246 b9a1049a Christos KK Loverdos
        }
247 b9a1049a Christos KK Loverdos
        return filtered;
248 cde22209 Christos KK Loverdos
    }
249 cde22209 Christos KK Loverdos
250 8e61880b Christos Stathis
    public void setAccount(AccountResource acct) {
251 8e61880b Christos Stathis
        account = acct;
252 8e61880b Christos Stathis
    }
253 8e61880b Christos Stathis
254 8e61880b Christos Stathis
    public AccountResource getAccount() {
255 8e61880b Christos Stathis
        return account;
256 8e61880b Christos Stathis
    }
257 8e61880b Christos Stathis
258 6acd4df3 Christos Stathis
    public void updateFolder(Folder f, boolean showfiles, Command callback, final boolean openParent) {
259 6acd4df3 Christos Stathis
        folderTreeView.updateFolder(f, showfiles, callback, openParent);
260 b651e67f Christos Stathis
    }
261 b651e67f Christos Stathis
262 4baffab1 Christos Stathis
    public void updateGroupNode(Group group) {
263 4baffab1 Christos Stathis
        groupTreeView.updateGroupNode(group);
264 4baffab1 Christos Stathis
    }
265 4baffab1 Christos Stathis
266 3601b114 Christos Stathis
    public void updateMySharedRoot() {
267 cdd90acb Christos KK Loverdos
        mysharedTreeView.updateRoot();
268 3601b114 Christos Stathis
    }
269 cdd90acb Christos KK Loverdos
270 3586ad5e Christos Stathis
    public void updateSharedFolder(Folder f, boolean showfiles, Command callback) {
271 cdd90acb Christos KK Loverdos
        mysharedTreeView.updateFolder(f, showfiles, callback);
272 105b4e49 Christos Stathis
    }
273 cdd90acb Christos KK Loverdos
274 3586ad5e Christos Stathis
    public void updateSharedFolder(Folder f, boolean showfiles) {
275 cdd90acb Christos KK Loverdos
        updateSharedFolder(f, showfiles, null);
276 3586ad5e Christos Stathis
    }
277 3586ad5e Christos Stathis
278 3646552f Christos Stathis
    public void updateOtherSharedFolder(Folder f, boolean showfiles, Command callback) {
279 cdd90acb Christos KK Loverdos
        otherSharedTreeView.updateFolder(f, showfiles, callback);
280 6d8e0f58 Christos Stathis
    }
281 6d8e0f58 Christos Stathis
282 105b4e49 Christos Stathis
    public MysharedTreeView getMySharedTreeView() {
283 105b4e49 Christos Stathis
        return mysharedTreeView;
284 105b4e49 Christos Stathis
    }
285 105b4e49 Christos Stathis
286 6084aa02 Christos Stathis
    /**
287 cdd90acb Christos KK Loverdos
     * An aggregate image bundle that pulls together all the images for this
288 cdd90acb Christos KK Loverdos
     * application into a single bundle.
289 cdd90acb Christos KK Loverdos
     */
290 cdd90acb Christos KK Loverdos
    public interface Images extends TopPanel.Images, FileList.Images, ToolsMenu.Images {
291 cdd90acb Christos KK Loverdos
292 cdd90acb Christos KK Loverdos
        @Source("gr/grnet/pithos/resources/document.png")
293 cdd90acb Christos KK Loverdos
        ImageResource folders();
294 cdd90acb Christos KK Loverdos
295 cdd90acb Christos KK Loverdos
        @Source("gr/grnet/pithos/resources/advancedsettings.png")
296 cdd90acb Christos KK Loverdos
        @ImageOptions(width = 32, height = 32)
297 cdd90acb Christos KK Loverdos
        ImageResource tools();
298 cdd90acb Christos KK Loverdos
    }
299 cdd90acb Christos KK Loverdos
300 cdd90acb Christos KK Loverdos
    private Throwable error;
301 cdd90acb Christos KK Loverdos
302 cdd90acb Christos KK Loverdos
    /**
303 cdd90acb Christos KK Loverdos
     * The Application Clipboard implementation;
304 cdd90acb Christos KK Loverdos
     */
305 cdd90acb Christos KK Loverdos
    private Clipboard clipboard = new Clipboard();
306 cdd90acb Christos KK Loverdos
307 cdd90acb Christos KK Loverdos
    /**
308 cdd90acb Christos KK Loverdos
     * The top panel that contains the menu bar.
309 cdd90acb Christos KK Loverdos
     */
310 cdd90acb Christos KK Loverdos
    private TopPanel topPanel;
311 cdd90acb Christos KK Loverdos
312 cdd90acb Christos KK Loverdos
    /**
313 cdd90acb Christos KK Loverdos
     * The panel that contains the various system messages.
314 cdd90acb Christos KK Loverdos
     */
315 cdd90acb Christos KK Loverdos
    private MessagePanel messagePanel = new MessagePanel(this, Pithos.images);
316 cdd90acb Christos KK Loverdos
317 cdd90acb Christos KK Loverdos
    /**
318 cdd90acb Christos KK Loverdos
     * The bottom panel that contains the status bar.
319 cdd90acb Christos KK Loverdos
     */
320 cdd90acb Christos KK Loverdos
    StatusPanel statusPanel = null;
321 cdd90acb Christos KK Loverdos
322 cdd90acb Christos KK Loverdos
    /**
323 cdd90acb Christos KK Loverdos
     * The file list widget.
324 cdd90acb Christos KK Loverdos
     */
325 cdd90acb Christos KK Loverdos
    private FileList fileList;
326 cdd90acb Christos KK Loverdos
327 cdd90acb Christos KK Loverdos
    /**
328 cdd90acb Christos KK Loverdos
     * The tab panel that occupies the right side of the screen.
329 cdd90acb Christos KK Loverdos
     */
330 cdd90acb Christos KK Loverdos
    private VerticalPanel inner = new VerticalPanel();
331 cdd90acb Christos KK Loverdos
332 cdd90acb Christos KK Loverdos
333 cdd90acb Christos KK Loverdos
    /**
334 cdd90acb Christos KK Loverdos
     * The split panel that will contain the left and right panels.
335 cdd90acb Christos KK Loverdos
     */
336 cdd90acb Christos KK Loverdos
    private HorizontalSplitPanel splitPanel = new HorizontalSplitPanel();
337 cdd90acb Christos KK Loverdos
338 cdd90acb Christos KK Loverdos
    /**
339 cdd90acb Christos KK Loverdos
     * The currently selected item in the application, for use by the Edit menu
340 cdd90acb Christos KK Loverdos
     * commands. Potential types are Folder, File, User and Group.
341 cdd90acb Christos KK Loverdos
     */
342 cdd90acb Christos KK Loverdos
    private Object currentSelection;
343 cdd90acb Christos KK Loverdos
344 cdd90acb Christos KK Loverdos
    public HashMap<String, String> userFullNameMap = new HashMap<String, String>();
345 a57faaf0 Christos Stathis
346 cc0120ab Christos KK Loverdos
    /**
347 cc0120ab Christos KK Loverdos
     * The ID that uniquely identifies the user in Pithos+.
348 cc0120ab Christos KK Loverdos
     * Currently this is a UUID. It used to be the user's email.
349 cc0120ab Christos KK Loverdos
     */
350 cc0120ab Christos KK Loverdos
    private String userID = null;
351 cc0120ab Christos KK Loverdos
352 cc0120ab Christos KK Loverdos
    /**
353 0a85a75b Christos KK Loverdos
     * Holds mappings from user UUIDs to emails and vice-versa.
354 cc0120ab Christos KK Loverdos
     */
355 cc0120ab Christos KK Loverdos
    private UserCatalogs userCatalogs = new UserCatalogs();
356 6084aa02 Christos Stathis
357 6084aa02 Christos Stathis
    /**
358 6084aa02 Christos Stathis
     * The authentication token of the current user.
359 6084aa02 Christos Stathis
     */
360 cc0120ab Christos KK Loverdos
    private String userToken;
361 6084aa02 Christos Stathis
362 7c54d867 Christos Stathis
    VerticalPanel trees;
363 cdd90acb Christos KK Loverdos
364 f1b24b82 Christos Stathis
    SingleSelectionModel<Folder> folderTreeSelectionModel;
365 f1b24b82 Christos Stathis
    FolderTreeViewModel folderTreeViewModel;
366 f1b24b82 Christos Stathis
    FolderTreeView folderTreeView;
367 6084aa02 Christos Stathis
368 f1b24b82 Christos Stathis
    SingleSelectionModel<Folder> mysharedTreeSelectionModel;
369 7c54d867 Christos Stathis
    MysharedTreeViewModel mysharedTreeViewModel;
370 cdd90acb Christos KK Loverdos
    MysharedTreeView mysharedTreeView = null;
371 105b4e49 Christos Stathis
372 7811b9d1 Christos Stathis
    protected SingleSelectionModel<Folder> otherSharedTreeSelectionModel;
373 7c54d867 Christos Stathis
    OtherSharedTreeViewModel otherSharedTreeViewModel;
374 7c54d867 Christos Stathis
    OtherSharedTreeView otherSharedTreeView = null;
375 a6592a15 Christos Stathis
376 abd8738f Christos Stathis
    GroupTreeViewModel groupTreeViewModel;
377 c46c9e31 Christos Stathis
    GroupTreeView groupTreeView;
378 ee9fbc37 Christos Stathis
379 c4b7a6bb Christos Stathis
    TreeView selectedTree;
380 7811b9d1 Christos Stathis
    protected AccountResource account;
381 cdd90acb Christos KK Loverdos
382 abd8738f Christos Stathis
    Folder trash;
383 cdd90acb Christos KK Loverdos
384 0549e173 Christos Stathis
    List<Composite> treeViews = new ArrayList<Composite>();
385 8e61880b Christos Stathis
386 cdd90acb Christos KK Loverdos
    @SuppressWarnings("rawtypes")
387 cdd90acb Christos KK Loverdos
    List<SingleSelectionModel> selectionModels = new ArrayList<SingleSelectionModel>();
388 cdd90acb Christos KK Loverdos
389 1238d28d Christos Stathis
    public Button upload;
390 cdd90acb Christos KK Loverdos
391 a19f758c Christos Stathis
    private HTML numOfFiles;
392 cdd90acb Christos KK Loverdos
393 b75210b5 Christos Stathis
    private Toolbar toolbar;
394 cdd90acb Christos KK Loverdos
395 89dddc7d Christos Stathis
    private FileUploadDialog fileUploadDialog = new FileUploadDialog(this);
396 3646552f Christos Stathis
397 cdd90acb Christos KK Loverdos
    UploadAlert uploadAlert;
398 cdd90acb Christos KK Loverdos
399 cdd90acb Christos KK Loverdos
    Date lastModified;
400 3646552f Christos Stathis
401 cdd90acb Christos KK Loverdos
    @Override
402 cdd90acb Christos KK Loverdos
    public void onModuleLoad() {
403 cdd90acb Christos KK Loverdos
        if(parseUserCredentials()) {
404 6084aa02 Christos Stathis
            initialize();
405 cdd90acb Christos KK Loverdos
        }
406 cdd90acb Christos KK Loverdos
    }
407 a57faaf0 Christos Stathis
408 f0ff407d Christos KK Loverdos
    static native void __ConsoleLog(String message) /*-{
409 64800147 Christos KK Loverdos
      try { console.log(message); } catch (e) {}
410 f0ff407d Christos KK Loverdos
    }-*/;
411 f0ff407d Christos KK Loverdos
412 e0a0c6ea Christos KK Loverdos
    public static void LOGError(Throwable error, StringBuilder sb) {
413 64800147 Christos KK Loverdos
        if(!isLOGEnabled()) { return; }
414 e0a0c6ea Christos KK Loverdos
415 e0a0c6ea Christos KK Loverdos
        sb.append("\nException: [" + error.toString().replace("\n", "\n  ") + "]");
416 e0a0c6ea Christos KK Loverdos
        Throwable cause = error.getCause();
417 e0a0c6ea Christos KK Loverdos
        if(cause != null) {
418 e0a0c6ea Christos KK Loverdos
            sb.append("\nCauses:\n");
419 e0a0c6ea Christos KK Loverdos
            while(cause != null) {
420 e0a0c6ea Christos KK Loverdos
                sb.append("  ");
421 e0a0c6ea Christos KK Loverdos
                sb.append("[" + cause.toString().replace("\n", "\n  ")  + "]");
422 e0a0c6ea Christos KK Loverdos
                sb.append("\n");
423 e0a0c6ea Christos KK Loverdos
                cause = cause.getCause();
424 86432004 Christos KK Loverdos
            }
425 e0a0c6ea Christos KK Loverdos
        }
426 e0a0c6ea Christos KK Loverdos
        else {
427 e0a0c6ea Christos KK Loverdos
            sb.append("\n");
428 e0a0c6ea Christos KK Loverdos
        }
429 e0a0c6ea Christos KK Loverdos
430 e0a0c6ea Christos KK Loverdos
        StackTraceElement[] stackTrace = error.getStackTrace();
431 e0a0c6ea Christos KK Loverdos
        sb.append("Stack trace (" + stackTrace.length + " elements):\n");
432 e0a0c6ea Christos KK Loverdos
        for(int i = 0; i < stackTrace.length; i++) {
433 e0a0c6ea Christos KK Loverdos
            StackTraceElement errorElem = stackTrace[i];
434 e0a0c6ea Christos KK Loverdos
            sb.append("  [" + i + "] ");
435 e0a0c6ea Christos KK Loverdos
            sb.append(errorElem.toString());
436 e0a0c6ea Christos KK Loverdos
            sb.append("\n");
437 e0a0c6ea Christos KK Loverdos
        }
438 e0a0c6ea Christos KK Loverdos
    }
439 e0a0c6ea Christos KK Loverdos
440 e0a0c6ea Christos KK Loverdos
    public static void LOGError(Throwable error) {
441 64800147 Christos KK Loverdos
        if(!isLOGEnabled()) { return; }
442 e0a0c6ea Christos KK Loverdos
443 e0a0c6ea Christos KK Loverdos
        final StringBuilder sb = new StringBuilder();
444 e0a0c6ea Christos KK Loverdos
        LOGError(error, sb);
445 e0a0c6ea Christos KK Loverdos
        if(sb.length() > 0) {
446 e0a0c6ea Christos KK Loverdos
            __ConsoleLog(sb.toString());
447 e0a0c6ea Christos KK Loverdos
        }
448 e0a0c6ea Christos KK Loverdos
    }
449 01337c33 Christos KK Loverdos
450 64800147 Christos KK Loverdos
    public static boolean isLOGEnabled() {
451 e0a0c6ea Christos KK Loverdos
        return IsLOGEnabled;
452 e0a0c6ea Christos KK Loverdos
    }
453 01337c33 Christos KK Loverdos
454 e0a0c6ea Christos KK Loverdos
    public static void LOG(Object ...args) {
455 64800147 Christos KK Loverdos
        if(!isLOGEnabled()) { return; }
456 e0a0c6ea Christos KK Loverdos
457 e0a0c6ea Christos KK Loverdos
        final StringBuilder sb = new StringBuilder();
458 e0a0c6ea Christos KK Loverdos
        for(Object arg : args) {
459 e0a0c6ea Christos KK Loverdos
            if(arg instanceof Throwable) {
460 e0a0c6ea Christos KK Loverdos
                LOGError((Throwable) arg, sb);
461 86432004 Christos KK Loverdos
            }
462 e0a0c6ea Christos KK Loverdos
            else {
463 e0a0c6ea Christos KK Loverdos
                sb.append(arg);
464 e0a0c6ea Christos KK Loverdos
            }
465 e0a0c6ea Christos KK Loverdos
        }
466 e0a0c6ea Christos KK Loverdos
467 e0a0c6ea Christos KK Loverdos
        if(sb.length() > 0) {
468 e0a0c6ea Christos KK Loverdos
            __ConsoleLog(sb.toString());
469 f0ff407d Christos KK Loverdos
        }
470 f0ff407d Christos KK Loverdos
    }
471 f0ff407d Christos KK Loverdos
472 6084aa02 Christos Stathis
    private void initialize() {
473 34cd9aff Christos KK Loverdos
        userCatalogs.updateWithIDAndName("*", "All Pithos users");
474 34cd9aff Christos KK Loverdos
475 cdd90acb Christos KK Loverdos
        lastModified = new Date(); //Initialize if-modified-since value with now.
476 cdd90acb Christos KK Loverdos
        resources.pithosCss().ensureInjected();
477 cdd90acb Christos KK Loverdos
        boolean bareContent = Window.Location.getParameter("noframe") != null;
478 34cd9aff Christos KK Loverdos
        String contentWidth = bareContent ? Const.PERCENT_100 : Const.PERCENT_75;
479 bbdd34ef Christos Stathis
480 cdd90acb Christos KK Loverdos
        VerticalPanel outer = new VerticalPanel();
481 fa68c84d Christos KK Loverdos
        outer.setWidth(Const.PERCENT_100);
482 cdd90acb Christos KK Loverdos
        if(!bareContent) {
483 cdd90acb Christos KK Loverdos
            outer.addStyleName("pithos-outer");
484 cdd90acb Christos KK Loverdos
        }
485 cdd90acb Christos KK Loverdos
486 cdd90acb Christos KK Loverdos
        if(!bareContent) {
487 cdd90acb Christos KK Loverdos
            topPanel = new TopPanel(this, Pithos.images);
488 fa68c84d Christos KK Loverdos
            topPanel.setWidth(Const.PERCENT_100);
489 cdd90acb Christos KK Loverdos
            outer.add(topPanel);
490 cdd90acb Christos KK Loverdos
            outer.setCellHorizontalAlignment(topPanel, HasHorizontalAlignment.ALIGN_CENTER);
491 a7b6e464 Christos Stathis
        }
492 cdd90acb Christos KK Loverdos
493 6cf258b1 Christos Stathis
        messagePanel.setVisible(false);
494 6cf258b1 Christos Stathis
        outer.add(messagePanel);
495 6cf258b1 Christos Stathis
        outer.setCellHorizontalAlignment(messagePanel, HasHorizontalAlignment.ALIGN_CENTER);
496 6cf258b1 Christos Stathis
        outer.setCellVerticalAlignment(messagePanel, HasVerticalAlignment.ALIGN_MIDDLE);
497 6cf258b1 Christos Stathis
498 a7b6e464 Christos Stathis
        HorizontalPanel header = new HorizontalPanel();
499 a7b6e464 Christos Stathis
        header.addStyleName("pithos-header");
500 2d91458a Christos Stathis
        header.setWidth(contentWidth);
501 cdd90acb Christos KK Loverdos
        if(bareContent) {
502 cdd90acb Christos KK Loverdos
            header.addStyleName("pithos-header-noframe");
503 cdd90acb Christos KK Loverdos
        }
504 1a0db4f4 Christos Stathis
        upload = new Button("Upload", new ClickHandler() {
505 a7b6e464 Christos Stathis
            @Override
506 ebead1b5 Christos Stathis
            public void onClick(ClickEvent event) {
507 cdd90acb Christos KK Loverdos
                if(getSelection() != null) {
508 cdd90acb Christos KK Loverdos
                    new UploadFileCommand(Pithos.this, null, getSelection()).execute();
509 cdd90acb Christos KK Loverdos
                }
510 a7b6e464 Christos Stathis
            }
511 a7b6e464 Christos Stathis
        });
512 a7b6e464 Christos Stathis
        upload.addStyleName("pithos-uploadButton");
513 140f0f6d Christos Stathis
        header.add(upload);
514 140f0f6d Christos Stathis
        header.setCellHorizontalAlignment(upload, HasHorizontalAlignment.ALIGN_LEFT);
515 140f0f6d Christos Stathis
        header.setCellVerticalAlignment(upload, HasVerticalAlignment.ALIGN_MIDDLE);
516 6084aa02 Christos Stathis
517 b75210b5 Christos Stathis
        toolbar = new Toolbar(this);
518 bd187dfb Christos Stathis
        header.add(toolbar);
519 bd187dfb Christos Stathis
        header.setCellHorizontalAlignment(toolbar, HasHorizontalAlignment.ALIGN_CENTER);
520 bd187dfb Christos Stathis
        header.setCellVerticalAlignment(toolbar, HasVerticalAlignment.ALIGN_MIDDLE);
521 cdd90acb Christos KK Loverdos
522 a19f758c Christos Stathis
        HorizontalPanel folderStatistics = new HorizontalPanel();
523 bbdd34ef Christos Stathis
        folderStatistics.addStyleName("pithos-folderStatistics");
524 a19f758c Christos Stathis
        numOfFiles = new HTML();
525 a19f758c Christos Stathis
        folderStatistics.add(numOfFiles);
526 a7b6e464 Christos Stathis
        folderStatistics.setCellVerticalAlignment(numOfFiles, HasVerticalAlignment.ALIGN_MIDDLE);
527 a19f758c Christos Stathis
        HTML numOfFilesLabel = new HTML("&nbsp;Files");
528 a19f758c Christos Stathis
        folderStatistics.add(numOfFilesLabel);
529 a7b6e464 Christos Stathis
        folderStatistics.setCellVerticalAlignment(numOfFilesLabel, HasVerticalAlignment.ALIGN_MIDDLE);
530 140f0f6d Christos Stathis
        header.add(folderStatistics);
531 140f0f6d Christos Stathis
        header.setCellHorizontalAlignment(folderStatistics, HasHorizontalAlignment.ALIGN_RIGHT);
532 140f0f6d Christos Stathis
        header.setCellVerticalAlignment(folderStatistics, HasVerticalAlignment.ALIGN_MIDDLE);
533 9fbf5596 Christos Stathis
        header.setCellWidth(folderStatistics, "40px");
534 a7b6e464 Christos Stathis
        outer.add(header);
535 a7b6e464 Christos Stathis
        outer.setCellHorizontalAlignment(header, HasHorizontalAlignment.ALIGN_CENTER);
536 89dddc7d Christos Stathis
        // Inner contains the various lists
537 a7b6e464 Christos Stathis
        inner.sinkEvents(Event.ONCONTEXTMENU);
538 fa68c84d Christos KK Loverdos
        inner.setWidth(Const.PERCENT_100);
539 6084aa02 Christos Stathis
540 875a0179 Christos Stathis
        folderTreeSelectionModel = new SingleSelectionModel<Folder>();
541 875a0179 Christos Stathis
        folderTreeSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
542 875a0179 Christos Stathis
            @Override
543 ebead1b5 Christos Stathis
            public void onSelectionChange(SelectionChangeEvent event) {
544 cdd90acb Christos KK Loverdos
                if(folderTreeSelectionModel.getSelectedObject() != null) {
545 f1b24b82 Christos Stathis
                    deselectOthers(folderTreeView, folderTreeSelectionModel);
546 3ebb88f4 Christos Stathis
                    applyPermissions(folderTreeSelectionModel.getSelectedObject());
547 a845b044 Christos Stathis
                    Folder f = folderTreeSelectionModel.getSelectedObject();
548 cdd90acb Christos KK Loverdos
                    updateFolder(f, true, new Command() {
549 cdd90acb Christos KK Loverdos
550 cdd90acb Christos KK Loverdos
                        @Override
551 cdd90acb Christos KK Loverdos
                        public void execute() {
552 cdd90acb Christos KK Loverdos
                            updateStatistics();
553 cdd90acb Christos KK Loverdos
                        }
554 cdd90acb Christos KK Loverdos
                    }, true);
555 cdd90acb Christos KK Loverdos
                    showRelevantToolbarButtons();
556 cdd90acb Christos KK Loverdos
                }
557 cdd90acb Christos KK Loverdos
                else {
558 cdd90acb Christos KK Loverdos
                    if(getSelectedTree().equals(folderTreeView)) {
559 cdd90acb Christos KK Loverdos
                        setSelectedTree(null);
560 cdd90acb Christos KK Loverdos
                    }
561 cdd90acb Christos KK Loverdos
                    if(getSelectedTree() == null) {
562 cdd90acb Christos KK Loverdos
                        showRelevantToolbarButtons();
563 cdd90acb Christos KK Loverdos
                    }
564 a845b044 Christos Stathis
                }
565 875a0179 Christos Stathis
            }
566 875a0179 Christos Stathis
        });
567 105b4e49 Christos Stathis
        selectionModels.add(folderTreeSelectionModel);
568 875a0179 Christos Stathis
569 a7c43f26 Christos Stathis
        folderTreeViewModel = new FolderTreeViewModel(this, folderTreeSelectionModel);
570 875a0179 Christos Stathis
        folderTreeView = new FolderTreeView(folderTreeViewModel);
571 0549e173 Christos Stathis
        treeViews.add(folderTreeView);
572 cdd90acb Christos KK Loverdos
573 e2920e8d Christos Stathis
        fileList = new FileList(this, images);
574 bbdd34ef Christos Stathis
        inner.add(fileList);
575 875a0179 Christos Stathis
576 7c54d867 Christos Stathis
        trees = new VerticalPanel();
577 fa68c84d Christos KK Loverdos
        trees.setWidth(Const.PERCENT_100);
578 cdd90acb Christos KK Loverdos
579 6084aa02 Christos Stathis
        // Add the left and right panels to the split panel.
580 a6592a15 Christos Stathis
        splitPanel.setLeftWidget(trees);
581 89dddc7d Christos Stathis
        FlowPanel right = new FlowPanel();
582 89dddc7d Christos Stathis
        right.getElement().setId("rightPanel");
583 89dddc7d Christos Stathis
        right.add(inner);
584 89dddc7d Christos Stathis
        splitPanel.setRightWidget(right);
585 e56be452 Christos Stathis
        splitPanel.setSplitPosition("219px");
586 fa68c84d Christos KK Loverdos
        splitPanel.setSize(Const.PERCENT_100, Const.PERCENT_100);
587 6084aa02 Christos Stathis
        splitPanel.addStyleName("pithos-splitPanel");
588 a7b6e464 Christos Stathis
        splitPanel.setWidth(contentWidth);
589 6084aa02 Christos Stathis
        outer.add(splitPanel);
590 a76065b6 Christos Stathis
        outer.setCellHorizontalAlignment(splitPanel, HasHorizontalAlignment.ALIGN_CENTER);
591 bbdd34ef Christos Stathis
592 cdd90acb Christos KK Loverdos
        if(!bareContent) {
593 cdd90acb Christos KK Loverdos
            statusPanel = new StatusPanel();
594 fa68c84d Christos KK Loverdos
            statusPanel.setWidth(Const.PERCENT_100);
595 cdd90acb Christos KK Loverdos
            outer.add(statusPanel);
596 cdd90acb Christos KK Loverdos
            outer.setCellHorizontalAlignment(statusPanel, HasHorizontalAlignment.ALIGN_CENTER);
597 cdd90acb Christos KK Loverdos
        }
598 cdd90acb Christos KK Loverdos
        else {
599 cdd90acb Christos KK Loverdos
            splitPanel.addStyleName("pithos-splitPanel-noframe");
600 a7b6e464 Christos Stathis
        }
601 6084aa02 Christos Stathis
602 6084aa02 Christos Stathis
        // Hook the window resize event, so that we can adjust the UI.
603 6084aa02 Christos Stathis
        Window.addResizeHandler(this);
604 6084aa02 Christos Stathis
        // Clear out the window's built-in margin, because we want to take
605 6084aa02 Christos Stathis
        // advantage of the entire client area.
606 6084aa02 Christos Stathis
        Window.setMargin("0px");
607 6084aa02 Christos Stathis
        // Finally, add the outer panel to the RootPanel, so that it will be
608 6084aa02 Christos Stathis
        // displayed.
609 6084aa02 Christos Stathis
        RootPanel.get().add(outer);
610 6084aa02 Christos Stathis
        // Call the window resized handler to get the initial sizes setup. Doing
611 6084aa02 Christos Stathis
        // this in a deferred command causes it to occur after all widgets'
612 6084aa02 Christos Stathis
        // sizes have been computed by the browser.
613 34e7d8d5 Christos Stathis
        Scheduler.get().scheduleIncremental(new RepeatingCommand() {
614 cdd90acb Christos KK Loverdos
615 cdd90acb Christos KK Loverdos
            @Override
616 cdd90acb Christos KK Loverdos
            public boolean execute() {
617 cdd90acb Christos KK Loverdos
                if(!isCloudbarReady()) {
618 cdd90acb Christos KK Loverdos
                    return true;
619 cdd90acb Christos KK Loverdos
                }
620 6084aa02 Christos Stathis
                onWindowResized(Window.getClientHeight());
621 cdd90acb Christos KK Loverdos
                return false;
622 cdd90acb Christos KK Loverdos
            }
623 cdd90acb Christos KK Loverdos
        });
624 cdd90acb Christos KK Loverdos
625 7c818c14 Christos Stathis
        Scheduler.get().scheduleDeferred(new ScheduledCommand() {
626 7c818c14 Christos Stathis
            @Override
627 7c818c14 Christos Stathis
            public void execute() {
628 86432004 Christos KK Loverdos
                LOG("Pithos::initialize() Calling Pithos::fetchAccount()");
629 64f42c0b Christos Stathis
                fetchAccount(new Command() {
630 cdd90acb Christos KK Loverdos
631 cdd90acb Christos KK Loverdos
                    @Override
632 cdd90acb Christos KK Loverdos
                    public void execute() {
633 cdd90acb Christos KK Loverdos
                        if(!account.hasHomeContainer()) {
634 cdd90acb Christos KK Loverdos
                            createHomeContainer(account, this);
635 cdd90acb Christos KK Loverdos
                        }
636 cdd90acb Christos KK Loverdos
                        else if(!account.hasTrashContainer()) {
637 cdd90acb Christos KK Loverdos
                            createTrashContainer(this);
638 cdd90acb Christos KK Loverdos
                        }
639 cdd90acb Christos KK Loverdos
                        else {
640 cdd90acb Christos KK Loverdos
                            for(Folder f : account.getContainers()) {
641 fa68c84d Christos KK Loverdos
                                if(f.getName().equals(Const.TRASH_CONTAINER)) {
642 cdd90acb Christos KK Loverdos
                                    trash = f;
643 cdd90acb Christos KK Loverdos
                                    break;
644 cdd90acb Christos KK Loverdos
                                }
645 cdd90acb Christos KK Loverdos
                            }
646 cdd90acb Christos KK Loverdos
                            trees.add(folderTreeView);
647 cdd90acb Christos KK Loverdos
                            folderTreeViewModel.initialize(account, new Command() {
648 cdd90acb Christos KK Loverdos
649 cdd90acb Christos KK Loverdos
                                @Override
650 cdd90acb Christos KK Loverdos
                                public void execute() {
651 cdd90acb Christos KK Loverdos
                                    createMySharedTree();
652 cdd90acb Christos KK Loverdos
                                }
653 cdd90acb Christos KK Loverdos
                            });
654 cdd90acb Christos KK Loverdos
655 cdd90acb Christos KK Loverdos
                            HorizontalPanel separator = new HorizontalPanel();
656 cdd90acb Christos KK Loverdos
                            separator.addStyleName("pithos-statisticsSeparator");
657 cdd90acb Christos KK Loverdos
                            separator.add(new HTML(""));
658 cdd90acb Christos KK Loverdos
                            trees.add(separator);
659 cdd90acb Christos KK Loverdos
660 cdd90acb Christos KK Loverdos
                            groupTreeViewModel = new GroupTreeViewModel(Pithos.this);
661 cdd90acb Christos KK Loverdos
                            groupTreeView = new GroupTreeView(groupTreeViewModel);
662 cdd90acb Christos KK Loverdos
                            treeViews.add(groupTreeView);
663 cdd90acb Christos KK Loverdos
                            trees.add(groupTreeView);
664 cdd90acb Christos KK Loverdos
                            folderTreeView.showStatistics(account);
665 cdd90acb Christos KK Loverdos
                        }
666 cdd90acb Christos KK Loverdos
                    }
667 cdd90acb Christos KK Loverdos
                });
668 7c818c14 Christos Stathis
            }
669 7c818c14 Christos Stathis
        });
670 b1001100 Christos Stathis
    }
671 cdd90acb Christos KK Loverdos
672 b1001100 Christos Stathis
    public void scheduleResfresh() {
673 cdd90acb Christos KK Loverdos
        Scheduler.get().scheduleFixedDelay(new RepeatingCommand() {
674 cdd90acb Christos KK Loverdos
675 cdd90acb Christos KK Loverdos
            @Override
676 cdd90acb Christos KK Loverdos
            public boolean execute() {
677 cdd90acb Christos KK Loverdos
                final Folder f = getSelection();
678 cdd90acb Christos KK Loverdos
                if(f == null) {
679 cdd90acb Christos KK Loverdos
                    return true;
680 cdd90acb Christos KK Loverdos
                }
681 cdd90acb Christos KK Loverdos
682 28e270f9 Christos KK Loverdos
                HeadRequest<Folder> head = new HeadRequest<Folder>(Folder.class, getStorageAPIURL(), f.getOwnerID(), "/" + f.getContainer()) {
683 cdd90acb Christos KK Loverdos
684 cdd90acb Christos KK Loverdos
                    @Override
685 cdd90acb Christos KK Loverdos
                    public void onSuccess(Folder _result) {
686 cdd90acb Christos KK Loverdos
                        lastModified = new Date();
687 cdd90acb Christos KK Loverdos
                        if(getSelectedTree().equals(folderTreeView)) {
688 cdd90acb Christos KK Loverdos
                            updateFolder(f, true, new Command() {
689 cdd90acb Christos KK Loverdos
690 cdd90acb Christos KK Loverdos
                                @Override
691 cdd90acb Christos KK Loverdos
                                public void execute() {
692 cdd90acb Christos KK Loverdos
                                    scheduleResfresh();
693 cdd90acb Christos KK Loverdos
                                }
694 cdd90acb Christos KK Loverdos
695 cdd90acb Christos KK Loverdos
                            }, false);
696 cdd90acb Christos KK Loverdos
                        }
697 cdd90acb Christos KK Loverdos
                        else if(getSelectedTree().equals(mysharedTreeView)) {
698 cdd90acb Christos KK Loverdos
                            updateSharedFolder(f, true, new Command() {
699 cdd90acb Christos KK Loverdos
700 cdd90acb Christos KK Loverdos
                                @Override
701 cdd90acb Christos KK Loverdos
                                public void execute() {
702 cdd90acb Christos KK Loverdos
                                    scheduleResfresh();
703 cdd90acb Christos KK Loverdos
                                }
704 cdd90acb Christos KK Loverdos
                            });
705 cdd90acb Christos KK Loverdos
                        }
706 cdd90acb Christos KK Loverdos
                        else {
707 cdd90acb Christos KK Loverdos
                            scheduleResfresh();
708 cdd90acb Christos KK Loverdos
                        }
709 cdd90acb Christos KK Loverdos
                    }
710 cdd90acb Christos KK Loverdos
711 cdd90acb Christos KK Loverdos
                    @Override
712 cdd90acb Christos KK Loverdos
                    public void onError(Throwable t) {
713 cdd90acb Christos KK Loverdos
                        if(t instanceof RestException && ((RestException) t).getHttpStatusCode() == HttpStatus.SC_NOT_MODIFIED) {
714 cdd90acb Christos KK Loverdos
                            scheduleResfresh();
715 cdd90acb Christos KK Loverdos
                        }
716 cdd90acb Christos KK Loverdos
                        else if(retries >= MAX_RETRIES) {
717 8ddb4627 Christos KK Loverdos
                            LOG("Error heading folder. ", t);
718 cdd90acb Christos KK Loverdos
                            setError(t);
719 cdd90acb Christos KK Loverdos
                            if(t instanceof RestException) {
720 cdd90acb Christos KK Loverdos
                                displayError("Error heading folder: " + ((RestException) t).getHttpStatusText());
721 cdd90acb Christos KK Loverdos
                            }
722 cdd90acb Christos KK Loverdos
                            else {
723 cdd90acb Christos KK Loverdos
                                displayError("System error heading folder: " + t.getMessage());
724 cdd90acb Christos KK Loverdos
                            }
725 cdd90acb Christos KK Loverdos
                        }
726 cdd90acb Christos KK Loverdos
                        else {//retry
727 8ddb4627 Christos KK Loverdos
                            LOG("Retry ", retries);
728 cdd90acb Christos KK Loverdos
                            Scheduler.get().scheduleDeferred(this);
729 cdd90acb Christos KK Loverdos
                        }
730 cdd90acb Christos KK Loverdos
                    }
731 cdd90acb Christos KK Loverdos
732 cdd90acb Christos KK Loverdos
                    @Override
733 cdd90acb Christos KK Loverdos
                    protected void onUnauthorized(Response response) {
734 cdd90acb Christos KK Loverdos
                        if(retries >= MAX_RETRIES) {
735 cdd90acb Christos KK Loverdos
                            sessionExpired();
736 cdd90acb Christos KK Loverdos
                        }
737 cdd90acb Christos KK Loverdos
                        else //retry
738 cdd90acb Christos KK Loverdos
                        {
739 cdd90acb Christos KK Loverdos
                            Scheduler.get().scheduleDeferred(this);
740 cdd90acb Christos KK Loverdos
                        }
741 cdd90acb Christos KK Loverdos
                    }
742 cdd90acb Christos KK Loverdos
                };
743 728ff1e4 Christos KK Loverdos
                head.setHeader(Const.X_AUTH_TOKEN, getUserToken());
744 fa68c84d Christos KK Loverdos
                head.setHeader(Const.IF_MODIFIED_SINCE, DateTimeFormat.getFormat(Const.DATE_FORMAT_1).format(lastModified, TimeZone.createTimeZone(0)) + " GMT");
745 cdd90acb Christos KK Loverdos
                Scheduler.get().scheduleDeferred(head);
746 cdd90acb Christos KK Loverdos
747 cdd90acb Christos KK Loverdos
                return false;
748 cdd90acb Christos KK Loverdos
            }
749 cdd90acb Christos KK Loverdos
        }, 3000);
750 6084aa02 Christos Stathis
    }
751 a57faaf0 Christos Stathis
752 3ebb88f4 Christos Stathis
    public void applyPermissions(Folder f) {
753 cdd90acb Christos KK Loverdos
        if(f != null) {
754 cdd90acb Christos KK Loverdos
            if(f.isInTrash()) {
755 cdd90acb Christos KK Loverdos
                upload.setEnabled(false);
756 cdd90acb Christos KK Loverdos
                disableUploadArea();
757 cdd90acb Christos KK Loverdos
            }
758 cdd90acb Christos KK Loverdos
            else {
759 cc0120ab Christos KK Loverdos
                Boolean[] perms = f.getPermissions().get(userID);
760 4eaecbac Christos KK Loverdos
                if(f.getOwnerID().equals(userID) || (perms != null && perms[1] != null && perms[1])) {
761 cdd90acb Christos KK Loverdos
                    upload.setEnabled(true);
762 cdd90acb Christos KK Loverdos
                    enableUploadArea();
763 cdd90acb Christos KK Loverdos
                }
764 cdd90acb Christos KK Loverdos
                else {
765 cdd90acb Christos KK Loverdos
                    upload.setEnabled(false);
766 cdd90acb Christos KK Loverdos
                    disableUploadArea();
767 cdd90acb Christos KK Loverdos
                }
768 cdd90acb Christos KK Loverdos
            }
769 cdd90acb Christos KK Loverdos
        }
770 cdd90acb Christos KK Loverdos
        else {
771 cdd90acb Christos KK Loverdos
            upload.setEnabled(false);
772 cdd90acb Christos KK Loverdos
            disableUploadArea();
773 cdd90acb Christos KK Loverdos
        }
774 cdd90acb Christos KK Loverdos
    }
775 cdd90acb Christos KK Loverdos
776 cdd90acb Christos KK Loverdos
    @SuppressWarnings({"rawtypes", "unchecked"})
777 cdd90acb Christos KK Loverdos
    public void deselectOthers(TreeView _selectedTree, SingleSelectionModel model) {
778 cdd90acb Christos KK Loverdos
        selectedTree = _selectedTree;
779 cdd90acb Christos KK Loverdos
780 cdd90acb Christos KK Loverdos
        for(SingleSelectionModel s : selectionModels) {
781 cdd90acb Christos KK Loverdos
            if(!s.equals(model) && s.getSelectedObject() != null) {
782 105b4e49 Christos Stathis
                s.setSelected(s.getSelectedObject(), false);
783 cdd90acb Christos KK Loverdos
            }
784 cdd90acb Christos KK Loverdos
        }
785 105b4e49 Christos Stathis
    }
786 105b4e49 Christos Stathis
787 dddb75e2 Christos Stathis
    public void showFiles(final Folder f) {
788 07a1b5fe Christos Stathis
        Set<File> files = f.getFiles();
789 a845b044 Christos Stathis
        showFiles(files);
790 a845b044 Christos Stathis
    }
791 a845b044 Christos Stathis
792 a845b044 Christos Stathis
    public void showFiles(Set<File> files) {
793 a845b044 Christos Stathis
        fileList.setFiles(new ArrayList<File>(files));
794 07a1b5fe Christos Stathis
    }
795 07a1b5fe Christos Stathis
796 875a0179 Christos Stathis
    /**
797 cdd90acb Christos KK Loverdos
     * Parse and store the user credentials to the appropriate fields.
798 cdd90acb Christos KK Loverdos
     */
799 cdd90acb Christos KK Loverdos
    private boolean parseUserCredentials() {
800 28e270f9 Christos KK Loverdos
        final String cookie = otherProperties.get(Const.AUTH_COOKIE);
801 4ea3c87b Christos Stathis
        String auth = Cookies.getCookie(cookie);
802 cdd90acb Christos KK Loverdos
        if(auth == null) {
803 cdd90acb Christos KK Loverdos
            authenticateUser();
804 cdd90acb Christos KK Loverdos
            return false;
805 cdd90acb Christos KK Loverdos
        }
806 cdd90acb Christos KK Loverdos
        if(auth.startsWith("\"")) {
807 cdd90acb Christos KK Loverdos
            auth = auth.substring(1);
808 cdd90acb Christos KK Loverdos
        }
809 cdd90acb Christos KK Loverdos
        if(auth.endsWith("\"")) {
810 cdd90acb Christos KK Loverdos
            auth = auth.substring(0, auth.length() - 1);
811 cdd90acb Christos KK Loverdos
        }
812 28e270f9 Christos KK Loverdos
        String[] authSplit = auth.split("\\" + config.cookieSeparator(), 2);
813 cdd90acb Christos KK Loverdos
        if(authSplit.length != 2) {
814 4ea3c87b Christos Stathis
            authenticateUser();
815 4ea3c87b Christos Stathis
            return false;
816 36dc8e18 Christos Stathis
        }
817 28e270f9 Christos KK Loverdos
        this.userID = authSplit[0];
818 28e270f9 Christos KK Loverdos
        this.userToken = authSplit[1];
819 4d869bf1 Christos Stathis
820 4d869bf1 Christos Stathis
        String gotoUrl = Window.Location.getParameter("goto");
821 cdd90acb Christos KK Loverdos
        if(gotoUrl != null && gotoUrl.length() > 0) {
822 cdd90acb Christos KK Loverdos
            Window.Location.assign(gotoUrl);
823 cdd90acb Christos KK Loverdos
            return false;
824 cdd90acb Christos KK Loverdos
        }
825 cdd90acb Christos KK Loverdos
        return true;
826 36dc8e18 Christos Stathis
    }
827 a57faaf0 Christos Stathis
828 6084aa02 Christos Stathis
    /**
829 cdd90acb Christos KK Loverdos
     * Redirect the user to the login page for authentication.
830 cdd90acb Christos KK Loverdos
     */
831 cdd90acb Christos KK Loverdos
    protected void authenticateUser() {
832 fa68c84d Christos KK Loverdos
        Dictionary otherProperties = Dictionary.getDictionary(Const.OTHER_PROPERTIES);
833 fa68c84d Christos KK Loverdos
        Window.Location.assign(otherProperties.get(Const.LOGIN_URL) + Window.Location.getHref());
834 cdd90acb Christos KK Loverdos
    }
835 a57faaf0 Christos Stathis
836 cdd90acb Christos KK Loverdos
    public void fetchAccount(final Command callback) {
837 b51c628b Christos Stathis
        String path = "?format=json";
838 7c818c14 Christos Stathis
839 28e270f9 Christos KK Loverdos
        GetRequest<AccountResource> getAccount = new GetRequest<AccountResource>(AccountResource.class, getStorageAPIURL(), userID, path) {
840 7c818c14 Christos Stathis
            @Override
841 c8f8690d Christos KK Loverdos
            public void onSuccess(AccountResource accountResource) {
842 c8f8690d Christos KK Loverdos
                account = accountResource;
843 cdd90acb Christos KK Loverdos
                if(callback != null) {
844 cdd90acb Christos KK Loverdos
                    callback.execute();
845 cdd90acb Christos KK Loverdos
                }
846 c8f8690d Christos KK Loverdos
847 c8f8690d Christos KK Loverdos
                final List<String> memberIDs = new ArrayList<String>();
848 c8f8690d Christos KK Loverdos
                final List<Group> groups = account.getGroups();
849 c8f8690d Christos KK Loverdos
                for(Group group : groups) {
850 f36c8a7d Christos KK Loverdos
                    memberIDs.addAll(group.getMemberIDs());
851 c8f8690d Christos KK Loverdos
                }
852 f36c8a7d Christos KK Loverdos
                memberIDs.add(Pithos.this.getUserID());
853 c8f8690d Christos KK Loverdos
854 c8f8690d Christos KK Loverdos
                final List<String> theUnknown = Pithos.this.filterUserIDsWithUnknownDisplayName(memberIDs);
855 cc0120ab Christos KK Loverdos
                // Initialize the user catalog
856 f36c8a7d Christos KK Loverdos
                new UpdateUserCatalogs(Pithos.this, theUnknown).scheduleDeferred();
857 c8f8690d Christos KK Loverdos
                LOG("Called new UpdateUserCatalogs(Pithos.this, theUnknown).scheduleDeferred();");
858 7c818c14 Christos Stathis
            }
859 7c818c14 Christos Stathis
860 7c818c14 Christos Stathis
            @Override
861 7c818c14 Christos Stathis
            public void onError(Throwable t) {
862 8ddb4627 Christos KK Loverdos
                LOG("Error getting account", t);
863 cdd90acb Christos KK Loverdos
                setError(t);
864 cdd90acb Christos KK Loverdos
                if(t instanceof RestException) {
865 a7c43f26 Christos Stathis
                    displayError("Error getting account: " + ((RestException) t).getHttpStatusText());
866 cdd90acb Christos KK Loverdos
                }
867 cdd90acb Christos KK Loverdos
                else {
868 a7c43f26 Christos Stathis
                    displayError("System error fetching user data: " + t.getMessage());
869 cdd90acb Christos KK Loverdos
                }
870 7c818c14 Christos Stathis
            }
871 9539e23d Christos Stathis
872 cdd90acb Christos KK Loverdos
            @Override
873 cdd90acb Christos KK Loverdos
            protected void onUnauthorized(Response response) {
874 cdd90acb Christos KK Loverdos
                sessionExpired();
875 cdd90acb Christos KK Loverdos
            }
876 7c818c14 Christos Stathis
        };
877 728ff1e4 Christos KK Loverdos
        getAccount.setHeader(Const.X_AUTH_TOKEN, userToken);
878 7c818c14 Christos Stathis
        Scheduler.get().scheduleDeferred(getAccount);
879 7c818c14 Christos Stathis
    }
880 7c818c14 Christos Stathis
881 64f42c0b Christos Stathis
    public void updateStatistics() {
882 28e270f9 Christos KK Loverdos
        HeadRequest<AccountResource> headAccount = new HeadRequest<AccountResource>(AccountResource.class, getStorageAPIURL(), userID, "", account) {
883 64f42c0b Christos Stathis
884 cdd90acb Christos KK Loverdos
            @Override
885 cdd90acb Christos KK Loverdos
            public void onSuccess(AccountResource _result) {
886 cdd90acb Christos KK Loverdos
                folderTreeView.showStatistics(account);
887 cdd90acb Christos KK Loverdos
            }
888 64f42c0b Christos Stathis
889 cdd90acb Christos KK Loverdos
            @Override
890 cdd90acb Christos KK Loverdos
            public void onError(Throwable t) {
891 8ddb4627 Christos KK Loverdos
                LOG("Error getting account", t);
892 cdd90acb Christos KK Loverdos
                setError(t);
893 cdd90acb Christos KK Loverdos
                if(t instanceof RestException) {
894 64f42c0b Christos Stathis
                    displayError("Error getting account: " + ((RestException) t).getHttpStatusText());
895 cdd90acb Christos KK Loverdos
                }
896 cdd90acb Christos KK Loverdos
                else {
897 64f42c0b Christos Stathis
                    displayError("System error fetching user data: " + t.getMessage());
898 cdd90acb Christos KK Loverdos
                }
899 cdd90acb Christos KK Loverdos
            }
900 cdd90acb Christos KK Loverdos
901 cdd90acb Christos KK Loverdos
            @Override
902 cdd90acb Christos KK Loverdos
            protected void onUnauthorized(Response response) {
903 cdd90acb Christos KK Loverdos
                sessionExpired();
904 cdd90acb Christos KK Loverdos
            }
905 cdd90acb Christos KK Loverdos
        };
906 728ff1e4 Christos KK Loverdos
        headAccount.setHeader(Const.X_AUTH_TOKEN, userToken);
907 cdd90acb Christos KK Loverdos
        Scheduler.get().scheduleDeferred(headAccount);
908 cdd90acb Christos KK Loverdos
    }
909 cdd90acb Christos KK Loverdos
910 cdd90acb Christos KK Loverdos
    protected void createHomeContainer(final AccountResource _account, final Command callback) {
911 fa68c84d Christos KK Loverdos
        String path = "/" + Const.HOME_CONTAINER;
912 28e270f9 Christos KK Loverdos
        PutRequest createPithos = new PutRequest(getStorageAPIURL(), getUserID(), path) {
913 b8822fe7 Christos Stathis
            @Override
914 ebead1b5 Christos Stathis
            public void onSuccess(Resource result) {
915 cdd90acb Christos KK Loverdos
                if(!_account.hasTrashContainer()) {
916 cdd90acb Christos KK Loverdos
                    createTrashContainer(callback);
917 cdd90acb Christos KK Loverdos
                }
918 cdd90acb Christos KK Loverdos
                else {
919 cdd90acb Christos KK Loverdos
                    fetchAccount(callback);
920 cdd90acb Christos KK Loverdos
                }
921 b8822fe7 Christos Stathis
            }
922 b8822fe7 Christos Stathis
923 b8822fe7 Christos Stathis
            @Override
924 b8822fe7 Christos Stathis
            public void onError(Throwable t) {
925 8ddb4627 Christos KK Loverdos
                LOG("Error creating pithos", t);
926 cdd90acb Christos KK Loverdos
                setError(t);
927 cdd90acb Christos KK Loverdos
                if(t instanceof RestException) {
928 a7c43f26 Christos Stathis
                    displayError("Error creating pithos: " + ((RestException) t).getHttpStatusText());
929 cdd90acb Christos KK Loverdos
                }
930 cdd90acb Christos KK Loverdos
                else {
931 a7c43f26 Christos Stathis
                    displayError("System error Error creating pithos: " + t.getMessage());
932 cdd90acb Christos KK Loverdos
                }
933 b8822fe7 Christos Stathis
            }
934 9539e23d Christos Stathis
935 cdd90acb Christos KK Loverdos
            @Override
936 cdd90acb Christos KK Loverdos
            protected void onUnauthorized(Response response) {
937 cdd90acb Christos KK Loverdos
                sessionExpired();
938 cdd90acb Christos KK Loverdos
            }
939 b8822fe7 Christos Stathis
        };
940 728ff1e4 Christos KK Loverdos
        createPithos.setHeader(Const.X_AUTH_TOKEN, getUserToken());
941 b8822fe7 Christos Stathis
        Scheduler.get().scheduleDeferred(createPithos);
942 b8822fe7 Christos Stathis
    }
943 b8822fe7 Christos Stathis
944 64f42c0b Christos Stathis
    protected void createTrashContainer(final Command callback) {
945 fa68c84d Christos KK Loverdos
        String path = "/" + Const.TRASH_CONTAINER;
946 28e270f9 Christos KK Loverdos
        PutRequest createPithos = new PutRequest(getStorageAPIURL(), getUserID(), path) {
947 7b28ae07 Christos Stathis
            @Override
948 ebead1b5 Christos Stathis
            public void onSuccess(Resource result) {
949 cdd90acb Christos KK Loverdos
                fetchAccount(callback);
950 7b28ae07 Christos Stathis
            }
951 7b28ae07 Christos Stathis
952 7b28ae07 Christos Stathis
            @Override
953 7b28ae07 Christos Stathis
            public void onError(Throwable t) {
954 8ddb4627 Christos KK Loverdos
                LOG("Error creating pithos", t);
955 cdd90acb Christos KK Loverdos
                setError(t);
956 cdd90acb Christos KK Loverdos
                if(t instanceof RestException) {
957 7b28ae07 Christos Stathis
                    displayError("Error creating pithos: " + ((RestException) t).getHttpStatusText());
958 cdd90acb Christos KK Loverdos
                }
959 cdd90acb Christos KK Loverdos
                else {
960 7b28ae07 Christos Stathis
                    displayError("System error Error creating pithos: " + t.getMessage());
961 cdd90acb Christos KK Loverdos
                }
962 7b28ae07 Christos Stathis
            }
963 9539e23d Christos Stathis
964 cdd90acb Christos KK Loverdos
            @Override
965 cdd90acb Christos KK Loverdos
            protected void onUnauthorized(Response response) {
966 cdd90acb Christos KK Loverdos
                sessionExpired();
967 cdd90acb Christos KK Loverdos
            }
968 7b28ae07 Christos Stathis
        };
969 728ff1e4 Christos KK Loverdos
        createPithos.setHeader(Const.X_AUTH_TOKEN, getUserToken());
970 7b28ae07 Christos Stathis
        Scheduler.get().scheduleDeferred(createPithos);
971 7b28ae07 Christos Stathis
    }
972 7b28ae07 Christos Stathis
973 7b28ae07 Christos Stathis
    /**
974 cdd90acb Christos KK Loverdos
     * Creates an HTML fragment that places an image & caption together, for use
975 cdd90acb Christos KK Loverdos
     * in a group header.
976 cdd90acb Christos KK Loverdos
     *
977 cdd90acb Christos KK Loverdos
     * @param imageProto an image prototype for an image
978 cdd90acb Christos KK Loverdos
     * @param caption    the group caption
979 cdd90acb Christos KK Loverdos
     * @return the header HTML fragment
980 cdd90acb Christos KK Loverdos
     */
981 cdd90acb Christos KK Loverdos
    private String createHeaderHTML(AbstractImagePrototype imageProto, String caption) {
982 cdd90acb Christos KK Loverdos
        String captionHTML = "<table class='caption' cellpadding='0' "
983 cdd90acb Christos KK Loverdos
            + "cellspacing='0'>" + "<tr><td class='lcaption'>" + imageProto.getHTML()
984 cdd90acb Christos KK Loverdos
            + "</td><td id =" + caption + " class='rcaption'><b style='white-space:nowrap'>&nbsp;"
985 cdd90acb Christos KK Loverdos
            + caption + "</b></td></tr></table>";
986 cdd90acb Christos KK Loverdos
        return captionHTML;
987 cdd90acb Christos KK Loverdos
    }
988 cdd90acb Christos KK Loverdos
989 cdd90acb Christos KK Loverdos
    protected void onWindowResized(int height) {
990 cdd90acb Christos KK Loverdos
        // Adjust the split panel to take up the available room in the window.
991 cdd90acb Christos KK Loverdos
        int newHeight = height - splitPanel.getAbsoluteTop() - 153;
992 cdd90acb Christos KK Loverdos
        if(newHeight < 1) {
993 cdd90acb Christos KK Loverdos
            newHeight = 1;
994 cdd90acb Christos KK Loverdos
        }
995 cdd90acb Christos KK Loverdos
        splitPanel.setHeight("" + newHeight);
996 cdd90acb Christos KK Loverdos
        inner.setHeight("" + newHeight);
997 cdd90acb Christos KK Loverdos
    }
998 cdd90acb Christos KK Loverdos
999 cdd90acb Christos KK Loverdos
    native boolean isCloudbarReady()/*-{
1000 cdd90acb Christos KK Loverdos
      if ($wnd.$("div.cloudbar") && $wnd.$("div.cloudbar").height() > 0)
1001 cdd90acb Christos KK Loverdos
        return true;
1002 cdd90acb Christos KK Loverdos
      return false;
1003 cdd90acb Christos KK Loverdos
    }-*/;
1004 cdd90acb Christos KK Loverdos
1005 cdd90acb Christos KK Loverdos
    @Override
1006 cdd90acb Christos KK Loverdos
    public void onResize(ResizeEvent event) {
1007 cdd90acb Christos KK Loverdos
        int height = event.getHeight();
1008 cdd90acb Christos KK Loverdos
        onWindowResized(height);
1009 cdd90acb Christos KK Loverdos
    }
1010 cdd90acb Christos KK Loverdos
1011 cdd90acb Christos KK Loverdos
    /**
1012 cdd90acb Christos KK Loverdos
     * Display an error message.
1013 cdd90acb Christos KK Loverdos
     *
1014 cdd90acb Christos KK Loverdos
     * @param msg the message to display
1015 cdd90acb Christos KK Loverdos
     */
1016 cdd90acb Christos KK Loverdos
    public void displayError(String msg) {
1017 cdd90acb Christos KK Loverdos
        messagePanel.displayError(msg);
1018 cdd90acb Christos KK Loverdos
        onWindowResized(Window.getClientHeight());
1019 cdd90acb Christos KK Loverdos
    }
1020 cdd90acb Christos KK Loverdos
1021 cdd90acb Christos KK Loverdos
    /**
1022 cdd90acb Christos KK Loverdos
     * Display a warning message.
1023 cdd90acb Christos KK Loverdos
     *
1024 cdd90acb Christos KK Loverdos
     * @param msg the message to display
1025 cdd90acb Christos KK Loverdos
     */
1026 cdd90acb Christos KK Loverdos
    public void displayWarning(String msg) {
1027 cdd90acb Christos KK Loverdos
        messagePanel.displayWarning(msg);
1028 cdd90acb Christos KK Loverdos
        onWindowResized(Window.getClientHeight());
1029 cdd90acb Christos KK Loverdos
    }
1030 cdd90acb Christos KK Loverdos
1031 cdd90acb Christos KK Loverdos
    /**
1032 cdd90acb Christos KK Loverdos
     * Display an informational message.
1033 cdd90acb Christos KK Loverdos
     *
1034 cdd90acb Christos KK Loverdos
     * @param msg the message to display
1035 cdd90acb Christos KK Loverdos
     */
1036 cdd90acb Christos KK Loverdos
    public void displayInformation(String msg) {
1037 cdd90acb Christos KK Loverdos
        messagePanel.displayInformation(msg);
1038 cdd90acb Christos KK Loverdos
        onWindowResized(Window.getClientHeight());
1039 cdd90acb Christos KK Loverdos
    }
1040 cdd90acb Christos KK Loverdos
1041 cdd90acb Christos KK Loverdos
    /**
1042 cdd90acb Christos KK Loverdos
     * Retrieve the fileList.
1043 cdd90acb Christos KK Loverdos
     *
1044 cdd90acb Christos KK Loverdos
     * @return the fileList
1045 cdd90acb Christos KK Loverdos
     */
1046 cdd90acb Christos KK Loverdos
    public FileList getFileList() {
1047 cdd90acb Christos KK Loverdos
        return fileList;
1048 cdd90acb Christos KK Loverdos
    }
1049 cdd90acb Christos KK Loverdos
1050 cdd90acb Christos KK Loverdos
    /**
1051 cdd90acb Christos KK Loverdos
     * Retrieve the topPanel.
1052 cdd90acb Christos KK Loverdos
     *
1053 cdd90acb Christos KK Loverdos
     * @return the topPanel
1054 cdd90acb Christos KK Loverdos
     */
1055 cdd90acb Christos KK Loverdos
    TopPanel getTopPanel() {
1056 cdd90acb Christos KK Loverdos
        return topPanel;
1057 cdd90acb Christos KK Loverdos
    }
1058 cdd90acb Christos KK Loverdos
1059 cdd90acb Christos KK Loverdos
    /**
1060 cdd90acb Christos KK Loverdos
     * Retrieve the clipboard.
1061 cdd90acb Christos KK Loverdos
     *
1062 cdd90acb Christos KK Loverdos
     * @return the clipboard
1063 cdd90acb Christos KK Loverdos
     */
1064 cdd90acb Christos KK Loverdos
    public Clipboard getClipboard() {
1065 cdd90acb Christos KK Loverdos
        return clipboard;
1066 cdd90acb Christos KK Loverdos
    }
1067 cdd90acb Christos KK Loverdos
1068 cdd90acb Christos KK Loverdos
    public StatusPanel getStatusPanel() {
1069 cdd90acb Christos KK Loverdos
        return statusPanel;
1070 cdd90acb Christos KK Loverdos
    }
1071 cdd90acb Christos KK Loverdos
1072 cc0120ab Christos KK Loverdos
    public String getUserToken() {
1073 cc0120ab Christos KK Loverdos
        return userToken;
1074 cdd90acb Christos KK Loverdos
    }
1075 cdd90acb Christos KK Loverdos
1076 cdd90acb Christos KK Loverdos
    public static native void preventIESelection() /*-{
1077 cdd90acb Christos KK Loverdos
      $doc.body.onselectstart = function () {
1078 cdd90acb Christos KK Loverdos
        return false;
1079 cdd90acb Christos KK Loverdos
      };
1080 cdd90acb Christos KK Loverdos
    }-*/;
1081 cdd90acb Christos KK Loverdos
1082 cdd90acb Christos KK Loverdos
    public static native void enableIESelection() /*-{
1083 cdd90acb Christos KK Loverdos
      if ($doc.body.onselectstart != null)
1084 cdd90acb Christos KK Loverdos
        $doc.body.onselectstart = null;
1085 cdd90acb Christos KK Loverdos
    }-*/;
1086 cdd90acb Christos KK Loverdos
1087 28e270f9 Christos KK Loverdos
    public static String getStorageAPIURL() {
1088 28e270f9 Christos KK Loverdos
        return STORAGE_API_URL;
1089 28e270f9 Christos KK Loverdos
    }
1090 28e270f9 Christos KK Loverdos
1091 28e270f9 Christos KK Loverdos
    public static String getUserCatalogsURL() {
1092 28e270f9 Christos KK Loverdos
        return USER_CATALOGS_API_URL;
1093 cdd90acb Christos KK Loverdos
    }
1094 cdd90acb Christos KK Loverdos
1095 cdd90acb Christos KK Loverdos
    /**
1096 cdd90acb Christos KK Loverdos
     * History support for folder navigation
1097 cdd90acb Christos KK Loverdos
     * adds a new browser history entry
1098 cdd90acb Christos KK Loverdos
     *
1099 cdd90acb Christos KK Loverdos
     * @param key
1100 cdd90acb Christos KK Loverdos
     */
1101 cdd90acb Christos KK Loverdos
    public void updateHistory(String key) {
1102 a57faaf0 Christos Stathis
//                Replace any whitespace of the initial string to "+"
1103 a57faaf0 Christos Stathis
//                String result = key.replaceAll("\\s","+");
1104 a57faaf0 Christos Stathis
//                Add a new browser history entry.
1105 a57faaf0 Christos Stathis
//                History.newItem(result);
1106 cdd90acb Christos KK Loverdos
        History.newItem(key);
1107 cdd90acb Christos KK Loverdos
    }
1108 a57faaf0 Christos Stathis
1109 2c801ad7 Christos Stathis
    public void deleteFolder(final Folder folder, final Command callback) {
1110 cdd90acb Christos KK Loverdos
        final PleaseWaitPopup pwp = new PleaseWaitPopup();
1111 cdd90acb Christos KK Loverdos
        pwp.center();
1112 f6c9957e Christos Stathis
        String path = "/" + folder.getContainer() + "/" + folder.getPrefix() + "?delimiter=/" + "&t=" + System.currentTimeMillis();
1113 28e270f9 Christos KK Loverdos
        DeleteRequest deleteFolder = new DeleteRequest(getStorageAPIURL(), folder.getOwnerID(), path) {
1114 cdd90acb Christos KK Loverdos
1115 cdd90acb Christos KK Loverdos
            @Override
1116 cdd90acb Christos KK Loverdos
            protected void onUnauthorized(Response response) {
1117 cdd90acb Christos KK Loverdos
                pwp.hide();
1118 cdd90acb Christos KK Loverdos
                sessionExpired();
1119 cdd90acb Christos KK Loverdos
            }
1120 cdd90acb Christos KK Loverdos
1121 cdd90acb Christos KK Loverdos
            @Override
1122 cdd90acb Christos KK Loverdos
            public void onSuccess(Resource result) {
1123 f6c9957e Christos Stathis
                updateFolder(folder.getParent(), true, new Command() {
1124 cdd90acb Christos KK Loverdos
1125 cdd90acb Christos KK Loverdos
                    @Override
1126 cdd90acb Christos KK Loverdos
                    public void execute() {
1127 cdd90acb Christos KK Loverdos
                        folderTreeSelectionModel.setSelected(folder.getParent(), true);
1128 cdd90acb Christos KK Loverdos
                        updateStatistics();
1129 cdd90acb Christos KK Loverdos
                        if(callback != null) {
1130 cdd90acb Christos KK Loverdos
                            callback.execute();
1131 cdd90acb Christos KK Loverdos
                        }
1132 cdd90acb Christos KK Loverdos
                        pwp.hide();
1133 cdd90acb Christos KK Loverdos
                    }
1134 cdd90acb Christos KK Loverdos
                }, true);
1135 cdd90acb Christos KK Loverdos
            }
1136 cdd90acb Christos KK Loverdos
1137 cdd90acb Christos KK Loverdos
            @Override
1138 cdd90acb Christos KK Loverdos
            public void onError(Throwable t) {
1139 8ddb4627 Christos KK Loverdos
                LOG(t);
1140 cdd90acb Christos KK Loverdos
                setError(t);
1141 cdd90acb Christos KK Loverdos
                if(t instanceof RestException) {
1142 cdd90acb Christos KK Loverdos
                    if(((RestException) t).getHttpStatusCode() != Response.SC_NOT_FOUND) {
1143 cdd90acb Christos KK Loverdos
                        displayError("Unable to delete folder: " + ((RestException) t).getHttpStatusText());
1144 cdd90acb Christos KK Loverdos
                    }
1145 cdd90acb Christos KK Loverdos
                    else {
1146 cdd90acb Christos KK Loverdos
                        onSuccess(null);
1147 cdd90acb Christos KK Loverdos
                    }
1148 602ebeb4 Christos Stathis
                }
1149 cdd90acb Christos KK Loverdos
                else {
1150 f6c9957e Christos Stathis
                    displayError("System error unable to delete folder: " + t.getMessage());
1151 cdd90acb Christos KK Loverdos
                }
1152 cdd90acb Christos KK Loverdos
                pwp.hide();
1153 cdd90acb Christos KK Loverdos
            }
1154 cdd90acb Christos KK Loverdos
        };
1155 728ff1e4 Christos KK Loverdos
        deleteFolder.setHeader(Const.X_AUTH_TOKEN, getUserToken());
1156 cdd90acb Christos KK Loverdos
        Scheduler.get().scheduleDeferred(deleteFolder);
1157 602ebeb4 Christos Stathis
    }
1158 fad48f0d Christos Stathis
1159 fad48f0d Christos Stathis
    public FolderTreeView getFolderTreeView() {
1160 fad48f0d Christos Stathis
        return folderTreeView;
1161 fad48f0d Christos Stathis
    }
1162 d6be39da Christos Stathis
1163 63ee965c Christos Stathis
    public void copyFiles(final Iterator<File> iter, final String targetUsername, final String targetUri, final Command callback) {
1164 cdd90acb Christos KK Loverdos
        if(iter.hasNext()) {
1165 d6be39da Christos Stathis
            File file = iter.next();
1166 b51c628b Christos Stathis
            String path = targetUri + "/" + file.getName();
1167 28e270f9 Christos KK Loverdos
            PutRequest copyFile = new PutRequest(getStorageAPIURL(), targetUsername, path) {
1168 d6be39da Christos Stathis
                @Override
1169 ebead1b5 Christos Stathis
                public void onSuccess(Resource result) {
1170 63ee965c Christos Stathis
                    copyFiles(iter, targetUsername, targetUri, callback);
1171 d6be39da Christos Stathis
                }
1172 d6be39da Christos Stathis
1173 d6be39da Christos Stathis
                @Override
1174 d6be39da Christos Stathis
                public void onError(Throwable t) {
1175 8ddb4627 Christos KK Loverdos
                    LOG(t);
1176 cdd90acb Christos KK Loverdos
                    setError(t);
1177 cdd90acb Christos KK Loverdos
                    if(t instanceof RestException) {
1178 a7c43f26 Christos Stathis
                        displayError("Unable to copy file: " + ((RestException) t).getHttpStatusText());
1179 d6be39da Christos Stathis
                    }
1180 cdd90acb Christos KK Loverdos
                    else {
1181 cdd90acb Christos KK Loverdos
                        displayError("System error unable to copy file: " + t.getMessage());
1182 cdd90acb Christos KK Loverdos
                    }
1183 d6be39da Christos Stathis
                }
1184 9539e23d Christos Stathis
1185 cdd90acb Christos KK Loverdos
                @Override
1186 cdd90acb Christos KK Loverdos
                protected void onUnauthorized(Response response) {
1187 cdd90acb Christos KK Loverdos
                    sessionExpired();
1188 cdd90acb Christos KK Loverdos
                }
1189 d6be39da Christos Stathis
            };
1190 728ff1e4 Christos KK Loverdos
            copyFile.setHeader(Const.X_AUTH_TOKEN, getUserToken());
1191 fa68c84d Christos KK Loverdos
            copyFile.setHeader(Const.X_COPY_FROM, URL.encodePathSegment(file.getUri()));
1192 cde22209 Christos KK Loverdos
            if(!file.getOwnerID().equals(targetUsername)) {
1193 fa68c84d Christos KK Loverdos
                copyFile.setHeader(Const.X_SOURCE_ACCOUNT, URL.encodePathSegment(file.getOwnerID()));
1194 cdd90acb Christos KK Loverdos
            }
1195 fa68c84d Christos KK Loverdos
            copyFile.setHeader(Const.CONTENT_TYPE, file.getContentType());
1196 d6be39da Christos Stathis
            Scheduler.get().scheduleDeferred(copyFile);
1197 d6be39da Christos Stathis
        }
1198 cdd90acb Christos KK Loverdos
        else if(callback != null) {
1199 d6be39da Christos Stathis
            callback.execute();
1200 d6be39da Christos Stathis
        }
1201 d6be39da Christos Stathis
    }
1202 d6be39da Christos Stathis
1203 d58c0da5 Christos Stathis
    public void copyFolder(final Folder f, final String targetUsername, final String targetUri, boolean move, final Command callback) {
1204 d58c0da5 Christos Stathis
        String path = targetUri + "?delimiter=/";
1205 28e270f9 Christos KK Loverdos
        PutRequest copyFolder = new PutRequest(getStorageAPIURL(), targetUsername, path) {
1206 d6be39da Christos Stathis
            @Override
1207 ebead1b5 Christos Stathis
            public void onSuccess(Resource result) {
1208 cdd90acb Christos KK Loverdos
                if(callback != null) {
1209 cdd90acb Christos KK Loverdos
                    callback.execute();
1210 cdd90acb Christos KK Loverdos
                }
1211 d6be39da Christos Stathis
            }
1212 d6be39da Christos Stathis
1213 d6be39da Christos Stathis
            @Override
1214 d6be39da Christos Stathis
            public void onError(Throwable t) {
1215 8ddb4627 Christos KK Loverdos
                LOG(t);
1216 cdd90acb Christos KK Loverdos
                setError(t);
1217 cdd90acb Christos KK Loverdos
                if(t instanceof RestException) {
1218 ff32989e Christos Stathis
                    displayError("Unable to copy folder: " + ((RestException) t).getHttpStatusText());
1219 d6be39da Christos Stathis
                }
1220 cdd90acb Christos KK Loverdos
                else {
1221 ff32989e Christos Stathis
                    displayError("System error copying folder: " + t.getMessage());
1222 cdd90acb Christos KK Loverdos
                }
1223 d6be39da Christos Stathis
            }
1224 9539e23d Christos Stathis
1225 cdd90acb Christos KK Loverdos
            @Override
1226 cdd90acb Christos KK Loverdos
            protected void onUnauthorized(Response response) {
1227 cdd90acb Christos KK Loverdos
                sessionExpired();
1228 cdd90acb Christos KK Loverdos
            }
1229 d6be39da Christos Stathis
        };
1230 728ff1e4 Christos KK Loverdos
        copyFolder.setHeader(Const.X_AUTH_TOKEN, getUserToken());
1231 fa68c84d Christos KK Loverdos
        copyFolder.setHeader(Const.ACCEPT, "*/*");
1232 fa68c84d Christos KK Loverdos
        copyFolder.setHeader(Const.CONTENT_LENGTH, "0");
1233 fa68c84d Christos KK Loverdos
        copyFolder.setHeader(Const.CONTENT_TYPE, "application/directory");
1234 4eaecbac Christos KK Loverdos
        if(!f.getOwnerID().equals(targetUsername)) {
1235 fa68c84d Christos KK Loverdos
            copyFolder.setHeader(Const.X_SOURCE_ACCOUNT, f.getOwnerID());
1236 cdd90acb Christos KK Loverdos
        }
1237 cdd90acb Christos KK Loverdos
        if(move) {
1238 fa68c84d Christos KK Loverdos
            copyFolder.setHeader(Const.X_MOVE_FROM, URL.encodePathSegment(f.getUri()));
1239 cdd90acb Christos KK Loverdos
        }
1240 cdd90acb Christos KK Loverdos
        else {
1241 fa68c84d Christos KK Loverdos
            copyFolder.setHeader(Const.X_COPY_FROM, URL.encodePathSegment(f.getUri()));
1242 cdd90acb Christos KK Loverdos
        }
1243 ff32989e Christos Stathis
        Scheduler.get().scheduleDeferred(copyFolder);
1244 d6be39da Christos Stathis
    }
1245 cdd90acb Christos KK Loverdos
1246 7811b9d1 Christos Stathis
    public void addSelectionModel(@SuppressWarnings("rawtypes") SingleSelectionModel model) {
1247 cdd90acb Christos KK Loverdos
        selectionModels.add(model);
1248 cdd90acb Christos KK Loverdos
    }
1249 cdd90acb Christos KK Loverdos
1250 cdd90acb Christos KK Loverdos
    public OtherSharedTreeView getOtherSharedTreeView() {
1251 cdd90acb Christos KK Loverdos
        return otherSharedTreeView;
1252 cdd90acb Christos KK Loverdos
    }
1253 cdd90acb Christos KK Loverdos
1254 cdd90acb Christos KK Loverdos
    public void updateTrash(boolean showFiles, Command callback) {
1255 cdd90acb Christos KK Loverdos
        updateFolder(trash, showFiles, callback, true);
1256 cdd90acb Christos KK Loverdos
    }
1257 cdd90acb Christos KK Loverdos
1258 cdd90acb Christos KK Loverdos
    public void updateGroupsNode() {
1259 cdd90acb Christos KK Loverdos
        groupTreeView.updateGroupNode(null);
1260 cdd90acb Christos KK Loverdos
    }
1261 cdd90acb Christos KK Loverdos
1262 dc8cc18a Christos KK Loverdos
    public Group addGroup(String groupname) {
1263 dc8cc18a Christos KK Loverdos
        Group newGroup = new Group(groupname);
1264 dc8cc18a Christos KK Loverdos
        account.addGroup(newGroup);
1265 cdd90acb Christos KK Loverdos
        groupTreeView.updateGroupNode(null);
1266 dc8cc18a Christos KK Loverdos
        return newGroup;
1267 cdd90acb Christos KK Loverdos
    }
1268 cdd90acb Christos KK Loverdos
1269 cdd90acb Christos KK Loverdos
    public void removeGroup(Group group) {
1270 cdd90acb Christos KK Loverdos
        account.removeGroup(group);
1271 cdd90acb Christos KK Loverdos
        updateGroupsNode();
1272 cdd90acb Christos KK Loverdos
    }
1273 cdd90acb Christos KK Loverdos
1274 cdd90acb Christos KK Loverdos
    public TreeView getSelectedTree() {
1275 cdd90acb Christos KK Loverdos
        return selectedTree;
1276 cdd90acb Christos KK Loverdos
    }
1277 cdd90acb Christos KK Loverdos
1278 cdd90acb Christos KK Loverdos
    public void setSelectedTree(TreeView selected) {
1279 cdd90acb Christos KK Loverdos
        selectedTree = selected;
1280 cdd90acb Christos KK Loverdos
    }
1281 cdd90acb Christos KK Loverdos
1282 cdd90acb Christos KK Loverdos
    public Folder getSelection() {
1283 cdd90acb Christos KK Loverdos
        if(selectedTree != null) {
1284 cdd90acb Christos KK Loverdos
            return selectedTree.getSelection();
1285 cdd90acb Christos KK Loverdos
        }
1286 cdd90acb Christos KK Loverdos
        return null;
1287 cdd90acb Christos KK Loverdos
    }
1288 cdd90acb Christos KK Loverdos
1289 cdd90acb Christos KK Loverdos
    public void showFolderStatistics(int folderFileCount) {
1290 cdd90acb Christos KK Loverdos
        numOfFiles.setHTML(String.valueOf(folderFileCount));
1291 cdd90acb Christos KK Loverdos
    }
1292 cdd90acb Christos KK Loverdos
1293 cdd90acb Christos KK Loverdos
    public GroupTreeView getGroupTreeView() {
1294 cdd90acb Christos KK Loverdos
        return groupTreeView;
1295 cdd90acb Christos KK Loverdos
    }
1296 cdd90acb Christos KK Loverdos
1297 cdd90acb Christos KK Loverdos
    public void sessionExpired() {
1298 cdd90acb Christos KK Loverdos
        new SessionExpiredDialog(this).center();
1299 cdd90acb Christos KK Loverdos
    }
1300 cdd90acb Christos KK Loverdos
1301 cdd90acb Christos KK Loverdos
    public void updateRootFolder(Command callback) {
1302 cdd90acb Christos KK Loverdos
        updateFolder(account.getPithos(), false, callback, true);
1303 cdd90acb Christos KK Loverdos
    }
1304 cdd90acb Christos KK Loverdos
1305 cdd90acb Christos KK Loverdos
    void createMySharedTree() {
1306 86432004 Christos KK Loverdos
        LOG("Pithos::createMySharedTree()");
1307 cdd90acb Christos KK Loverdos
        mysharedTreeSelectionModel = new SingleSelectionModel<Folder>();
1308 cdd90acb Christos KK Loverdos
        mysharedTreeSelectionModel.addSelectionChangeHandler(new Handler() {
1309 cdd90acb Christos KK Loverdos
            @Override
1310 cdd90acb Christos KK Loverdos
            public void onSelectionChange(SelectionChangeEvent event) {
1311 cdd90acb Christos KK Loverdos
                if(mysharedTreeSelectionModel.getSelectedObject() != null) {
1312 cdd90acb Christos KK Loverdos
                    deselectOthers(mysharedTreeView, mysharedTreeSelectionModel);
1313 cdd90acb Christos KK Loverdos
                    upload.setEnabled(false);
1314 cdd90acb Christos KK Loverdos
                    disableUploadArea();
1315 cdd90acb Christos KK Loverdos
                    updateSharedFolder(mysharedTreeSelectionModel.getSelectedObject(), true);
1316 cdd90acb Christos KK Loverdos
                    showRelevantToolbarButtons();
1317 cdd90acb Christos KK Loverdos
                }
1318 cdd90acb Christos KK Loverdos
                else {
1319 cdd90acb Christos KK Loverdos
                    if(getSelectedTree().equals(mysharedTreeView)) {
1320 cdd90acb Christos KK Loverdos
                        setSelectedTree(null);
1321 cdd90acb Christos KK Loverdos
                    }
1322 cdd90acb Christos KK Loverdos
                    if(getSelectedTree() == null) {
1323 cdd90acb Christos KK Loverdos
                        showRelevantToolbarButtons();
1324 cdd90acb Christos KK Loverdos
                    }
1325 cdd90acb Christos KK Loverdos
                }
1326 cdd90acb Christos KK Loverdos
            }
1327 cdd90acb Christos KK Loverdos
        });
1328 cdd90acb Christos KK Loverdos
        selectionModels.add(mysharedTreeSelectionModel);
1329 cdd90acb Christos KK Loverdos
        mysharedTreeViewModel = new MysharedTreeViewModel(Pithos.this, mysharedTreeSelectionModel);
1330 cdd90acb Christos KK Loverdos
        mysharedTreeViewModel.initialize(new Command() {
1331 cdd90acb Christos KK Loverdos
1332 cdd90acb Christos KK Loverdos
            @Override
1333 cdd90acb Christos KK Loverdos
            public void execute() {
1334 cdd90acb Christos KK Loverdos
                mysharedTreeView = new MysharedTreeView(mysharedTreeViewModel);
1335 cdd90acb Christos KK Loverdos
                trees.insert(mysharedTreeView, 2);
1336 cdd90acb Christos KK Loverdos
                treeViews.add(mysharedTreeView);
1337 cdd90acb Christos KK Loverdos
                createOtherSharedTree();
1338 cdd90acb Christos KK Loverdos
            }
1339 cdd90acb Christos KK Loverdos
        });
1340 cdd90acb Christos KK Loverdos
    }
1341 cdd90acb Christos KK Loverdos
1342 cdd90acb Christos KK Loverdos
    void createOtherSharedTree() {
1343 86432004 Christos KK Loverdos
        LOG("Pithos::createOtherSharedTree()");
1344 cdd90acb Christos KK Loverdos
        otherSharedTreeSelectionModel = new SingleSelectionModel<Folder>();
1345 cdd90acb Christos KK Loverdos
        otherSharedTreeSelectionModel.addSelectionChangeHandler(new Handler() {
1346 cdd90acb Christos KK Loverdos
            @Override
1347 cdd90acb Christos KK Loverdos
            public void onSelectionChange(SelectionChangeEvent event) {
1348 cdd90acb Christos KK Loverdos
                if(otherSharedTreeSelectionModel.getSelectedObject() != null) {
1349 cdd90acb Christos KK Loverdos
                    deselectOthers(otherSharedTreeView, otherSharedTreeSelectionModel);
1350 cdd90acb Christos KK Loverdos
                    applyPermissions(otherSharedTreeSelectionModel.getSelectedObject());
1351 cdd90acb Christos KK Loverdos
                    updateOtherSharedFolder(otherSharedTreeSelectionModel.getSelectedObject(), true, null);
1352 cdd90acb Christos KK Loverdos
                    showRelevantToolbarButtons();
1353 cdd90acb Christos KK Loverdos
                }
1354 cdd90acb Christos KK Loverdos
                else {
1355 cdd90acb Christos KK Loverdos
                    if(getSelectedTree().equals(otherSharedTreeView)) {
1356 cdd90acb Christos KK Loverdos
                        setSelectedTree(null);
1357 cdd90acb Christos KK Loverdos
                    }
1358 cdd90acb Christos KK Loverdos
                    if(getSelectedTree() == null) {
1359 cdd90acb Christos KK Loverdos
                        showRelevantToolbarButtons();
1360 cdd90acb Christos KK Loverdos
                    }
1361 cdd90acb Christos KK Loverdos
                }
1362 cdd90acb Christos KK Loverdos
            }
1363 cdd90acb Christos KK Loverdos
        });
1364 cdd90acb Christos KK Loverdos
        selectionModels.add(otherSharedTreeSelectionModel);
1365 cdd90acb Christos KK Loverdos
        otherSharedTreeViewModel = new OtherSharedTreeViewModel(Pithos.this, otherSharedTreeSelectionModel);
1366 0a85a75b Christos KK Loverdos
        // #3784 We show it empty...
1367 d4ace10a Christos KK Loverdos
        otherSharedTreeView = new OtherSharedTreeView(otherSharedTreeViewModel, true);
1368 0a85a75b Christos KK Loverdos
        trees.insert(otherSharedTreeView, 1);
1369 0a85a75b Christos KK Loverdos
1370 86432004 Christos KK Loverdos
        LOG("Pithos::createOtherSharedTree(), initializing otherSharedTreeViewModel with a callback");
1371 cdd90acb Christos KK Loverdos
        otherSharedTreeViewModel.initialize(new Command() {
1372 cdd90acb Christos KK Loverdos
            @Override
1373 cdd90acb Christos KK Loverdos
            public void execute() {
1374 0a85a75b Christos KK Loverdos
                // #3784 ... then remove the empty stuff and add a new view with the populated model
1375 0a85a75b Christos KK Loverdos
                trees.remove(otherSharedTreeView);
1376 0a85a75b Christos KK Loverdos
1377 d4ace10a Christos KK Loverdos
                otherSharedTreeView = new OtherSharedTreeView(otherSharedTreeViewModel, false);
1378 cdd90acb Christos KK Loverdos
                trees.insert(otherSharedTreeView, 1);
1379 cdd90acb Christos KK Loverdos
                treeViews.add(otherSharedTreeView);
1380 cdd90acb Christos KK Loverdos
                scheduleResfresh();
1381 cdd90acb Christos KK Loverdos
            }
1382 cdd90acb Christos KK Loverdos
        });
1383 cdd90acb Christos KK Loverdos
    }
1384 cdd90acb Christos KK Loverdos
1385 cdd90acb Christos KK Loverdos
    public String getErrorData() {
1386 86432004 Christos KK Loverdos
        final StringBuilder sb = new StringBuilder();
1387 86432004 Christos KK Loverdos
        final String NL = Const.NL;
1388 86432004 Christos KK Loverdos
        Throwable t = this.error;
1389 86432004 Christos KK Loverdos
        while(t != null) {
1390 86432004 Christos KK Loverdos
            sb.append(t.toString());
1391 86432004 Christos KK Loverdos
            sb.append(NL);
1392 86432004 Christos KK Loverdos
            StackTraceElement[] traces = t.getStackTrace();
1393 86432004 Christos KK Loverdos
            for(StackTraceElement trace : traces) {
1394 86432004 Christos KK Loverdos
                sb.append("  [");
1395 86432004 Christos KK Loverdos
                sb.append(trace.getClassName());
1396 86432004 Christos KK Loverdos
                sb.append("::");
1397 86432004 Christos KK Loverdos
                sb.append(trace.getMethodName());
1398 86432004 Christos KK Loverdos
                sb.append("() at ");
1399 86432004 Christos KK Loverdos
                sb.append(trace.getFileName());
1400 86432004 Christos KK Loverdos
                sb.append(":");
1401 86432004 Christos KK Loverdos
                sb.append(trace.getLineNumber());
1402 86432004 Christos KK Loverdos
                sb.append("]");
1403 86432004 Christos KK Loverdos
                sb.append(NL);
1404 86432004 Christos KK Loverdos
            }
1405 86432004 Christos KK Loverdos
            t = t.getCause();
1406 cdd90acb Christos KK Loverdos
        }
1407 86432004 Christos KK Loverdos
1408 86432004 Christos KK Loverdos
        return sb.toString();
1409 cdd90acb Christos KK Loverdos
    }
1410 cdd90acb Christos KK Loverdos
1411 cdd90acb Christos KK Loverdos
    public void setError(Throwable t) {
1412 cdd90acb Christos KK Loverdos
        error = t;
1413 e0a0c6ea Christos KK Loverdos
        LOG(t);
1414 cdd90acb Christos KK Loverdos
    }
1415 cdd90acb Christos KK Loverdos
1416 cdd90acb Christos KK Loverdos
    public void showRelevantToolbarButtons() {
1417 cdd90acb Christos KK Loverdos
        toolbar.showRelevantButtons();
1418 cdd90acb Christos KK Loverdos
    }
1419 cdd90acb Christos KK Loverdos
1420 cdd90acb Christos KK Loverdos
    public FileUploadDialog getFileUploadDialog() {
1421 cdd90acb Christos KK Loverdos
        if(fileUploadDialog == null) {
1422 cdd90acb Christos KK Loverdos
            fileUploadDialog = new FileUploadDialog(this);
1423 cdd90acb Christos KK Loverdos
        }
1424 cdd90acb Christos KK Loverdos
        return fileUploadDialog;
1425 cdd90acb Christos KK Loverdos
    }
1426 cdd90acb Christos KK Loverdos
1427 cdd90acb Christos KK Loverdos
    public void hideUploadIndicator() {
1428 cdd90acb Christos KK Loverdos
        upload.removeStyleName("pithos-uploadButton-loading");
1429 cdd90acb Christos KK Loverdos
        upload.setTitle("");
1430 cdd90acb Christos KK Loverdos
    }
1431 cdd90acb Christos KK Loverdos
1432 cdd90acb Christos KK Loverdos
    public void showUploadIndicator() {
1433 cdd90acb Christos KK Loverdos
        upload.addStyleName("pithos-uploadButton-loading");
1434 cdd90acb Christos KK Loverdos
        upload.setTitle("Upload in progress. Click for details.");
1435 cdd90acb Christos KK Loverdos
    }
1436 cdd90acb Christos KK Loverdos
1437 cdd90acb Christos KK Loverdos
    public void scheduleFolderHeadCommand(final Folder folder, final Command callback) {
1438 cdd90acb Christos KK Loverdos
        if(folder == null) {
1439 cdd90acb Christos KK Loverdos
            if(callback != null) {
1440 cdd90acb Christos KK Loverdos
                callback.execute();
1441 cdd90acb Christos KK Loverdos
            }
1442 cdd90acb Christos KK Loverdos
        }
1443 cdd90acb Christos KK Loverdos
        else {
1444 28e270f9 Christos KK Loverdos
            HeadRequest<Folder> headFolder = new HeadRequest<Folder>(Folder.class, getStorageAPIURL(), folder.getOwnerID(), folder.getUri(), folder) {
1445 cdd90acb Christos KK Loverdos
1446 cdd90acb Christos KK Loverdos
                @Override
1447 cdd90acb Christos KK Loverdos
                public void onSuccess(Folder _result) {
1448 cdd90acb Christos KK Loverdos
                    if(callback != null) {
1449 cdd90acb Christos KK Loverdos
                        callback.execute();
1450 cdd90acb Christos KK Loverdos
                    }
1451 cdd90acb Christos KK Loverdos
                }
1452 cdd90acb Christos KK Loverdos
1453 cdd90acb Christos KK Loverdos
                @Override
1454 cdd90acb Christos KK Loverdos
                public void onError(Throwable t) {
1455 cdd90acb Christos KK Loverdos
                    if(t instanceof RestException) {
1456 cdd90acb Christos KK Loverdos
                        if(((RestException) t).getHttpStatusCode() == Response.SC_NOT_FOUND) {
1457 cdd90acb Christos KK Loverdos
                            final String path = folder.getUri();
1458 28e270f9 Christos KK Loverdos
                            PutRequest newFolder = new PutRequest(getStorageAPIURL(), folder.getOwnerID(), path) {
1459 cdd90acb Christos KK Loverdos
                                @Override
1460 cdd90acb Christos KK Loverdos
                                public void onSuccess(Resource _result) {
1461 cdd90acb Christos KK Loverdos
                                    scheduleFolderHeadCommand(folder, callback);
1462 cdd90acb Christos KK Loverdos
                                }
1463 cdd90acb Christos KK Loverdos
1464 cdd90acb Christos KK Loverdos
                                @Override
1465 cdd90acb Christos KK Loverdos
                                public void onError(Throwable _t) {
1466 cdd90acb Christos KK Loverdos
                                    setError(_t);
1467 cdd90acb Christos KK Loverdos
                                    if(_t instanceof RestException) {
1468 cdd90acb Christos KK Loverdos
                                        displayError("Unable to create folder: " + ((RestException) _t).getHttpStatusText());
1469 cdd90acb Christos KK Loverdos
                                    }
1470 cdd90acb Christos KK Loverdos
                                    else {
1471 cdd90acb Christos KK Loverdos
                                        displayError("System error creating folder: " + _t.getMessage());
1472 cdd90acb Christos KK Loverdos
                                    }
1473 cdd90acb Christos KK Loverdos
                                }
1474 cdd90acb Christos KK Loverdos
1475 cdd90acb Christos KK Loverdos
                                @Override
1476 cdd90acb Christos KK Loverdos
                                protected void onUnauthorized(Response response) {
1477 cdd90acb Christos KK Loverdos
                                    sessionExpired();
1478 cdd90acb Christos KK Loverdos
                                }
1479 cdd90acb Christos KK Loverdos
                            };
1480 728ff1e4 Christos KK Loverdos
                            newFolder.setHeader(Const.X_AUTH_TOKEN, getUserToken());
1481 fa68c84d Christos KK Loverdos
                            newFolder.setHeader(Const.CONTENT_TYPE, "application/folder");
1482 fa68c84d Christos KK Loverdos
                            newFolder.setHeader(Const.ACCEPT, "*/*");
1483 fa68c84d Christos KK Loverdos
                            newFolder.setHeader(Const.CONTENT_LENGTH, "0");
1484 cdd90acb Christos KK Loverdos
                            Scheduler.get().scheduleDeferred(newFolder);
1485 cdd90acb Christos KK Loverdos
                        }
1486 cdd90acb Christos KK Loverdos
                        else if(((RestException) t).getHttpStatusCode() == Response.SC_FORBIDDEN) {
1487 cdd90acb Christos KK Loverdos
                            onSuccess(folder);
1488 cdd90acb Christos KK Loverdos
                        }
1489 cdd90acb Christos KK Loverdos
                        else {
1490 cdd90acb Christos KK Loverdos
                            displayError("Error heading folder: " + ((RestException) t).getHttpStatusText());
1491 cdd90acb Christos KK Loverdos
                        }
1492 cdd90acb Christos KK Loverdos
                    }
1493 cdd90acb Christos KK Loverdos
                    else {
1494 cdd90acb Christos KK Loverdos
                        displayError("System error heading folder: " + t.getMessage());
1495 cdd90acb Christos KK Loverdos
                    }
1496 cdd90acb Christos KK Loverdos
1497 8ddb4627 Christos KK Loverdos
                    LOG("Error heading folder", t);
1498 cdd90acb Christos KK Loverdos
                    setError(t);
1499 cdd90acb Christos KK Loverdos
                }
1500 cdd90acb Christos KK Loverdos
1501 cdd90acb Christos KK Loverdos
                @Override
1502 cdd90acb Christos KK Loverdos
                protected void onUnauthorized(Response response) {
1503 cdd90acb Christos KK Loverdos
                    sessionExpired();
1504 cdd90acb Christos KK Loverdos
                }
1505 cdd90acb Christos KK Loverdos
            };
1506 728ff1e4 Christos KK Loverdos
            headFolder.setHeader(Const.X_AUTH_TOKEN, getUserToken());
1507 cdd90acb Christos KK Loverdos
            Scheduler.get().scheduleDeferred(headFolder);
1508 cdd90acb Christos KK Loverdos
        }
1509 cdd90acb Christos KK Loverdos
    }
1510 cdd90acb Christos KK Loverdos
1511 cdd90acb Christos KK Loverdos
    public void scheduleFileHeadCommand(File f, final Command callback) {
1512 28e270f9 Christos KK Loverdos
        HeadRequest<File> headFile = new HeadRequest<File>(File.class, getStorageAPIURL(), f.getOwnerID(), f.getUri(), f) {
1513 cdd90acb Christos KK Loverdos
1514 cdd90acb Christos KK Loverdos
            @Override
1515 cdd90acb Christos KK Loverdos
            public void onSuccess(File _result) {
1516 cdd90acb Christos KK Loverdos
                if(callback != null) {
1517 cdd90acb Christos KK Loverdos
                    callback.execute();
1518 cdd90acb Christos KK Loverdos
                }
1519 cdd90acb Christos KK Loverdos
            }
1520 cdd90acb Christos KK Loverdos
1521 cdd90acb Christos KK Loverdos
            @Override
1522 cdd90acb Christos KK Loverdos
            public void onError(Throwable t) {
1523 8ddb4627 Christos KK Loverdos
                LOG("Error heading file", t);
1524 cdd90acb Christos KK Loverdos
                setError(t);
1525 cdd90acb Christos KK Loverdos
                if(t instanceof RestException) {
1526 cdd90acb Christos KK Loverdos
                    displayError("Error heading file: " + ((RestException) t).getHttpStatusText());
1527 cdd90acb Christos KK Loverdos
                }
1528 cdd90acb Christos KK Loverdos
                else {
1529 cdd90acb Christos KK Loverdos
                    displayError("System error heading file: " + t.getMessage());
1530 cdd90acb Christos KK Loverdos
                }
1531 cdd90acb Christos KK Loverdos
            }
1532 cdd90acb Christos KK Loverdos
1533 cdd90acb Christos KK Loverdos
            @Override
1534 cdd90acb Christos KK Loverdos
            protected void onUnauthorized(Response response) {
1535 cdd90acb Christos KK Loverdos
                sessionExpired();
1536 cdd90acb Christos KK Loverdos
            }
1537 cdd90acb Christos KK Loverdos
        };
1538 728ff1e4 Christos KK Loverdos
        headFile.setHeader(Const.X_AUTH_TOKEN, getUserToken());
1539 cdd90acb Christos KK Loverdos
        Scheduler.get().scheduleDeferred(headFile);
1540 cdd90acb Christos KK Loverdos
    }
1541 cdd90acb Christos KK Loverdos
1542 cdd90acb Christos KK Loverdos
    public boolean isMySharedSelected() {
1543 cdd90acb Christos KK Loverdos
        return getSelectedTree().equals(getMySharedTreeView());
1544 cdd90acb Christos KK Loverdos
    }
1545 cdd90acb Christos KK Loverdos
1546 cdd90acb Christos KK Loverdos
    private Folder getUploadFolder() {
1547 cdd90acb Christos KK Loverdos
        if(folderTreeView.equals(getSelectedTree()) || otherSharedTreeView.equals(getSelectedTree())) {
1548 cdd90acb Christos KK Loverdos
            return getSelection();
1549 cdd90acb Christos KK Loverdos
        }
1550 cdd90acb Christos KK Loverdos
        return null;
1551 cdd90acb Christos KK Loverdos
    }
1552 cdd90acb Christos KK Loverdos
1553 cdd90acb Christos KK Loverdos
    private void updateUploadFolder() {
1554 cdd90acb Christos KK Loverdos
        updateUploadFolder(null);
1555 cdd90acb Christos KK Loverdos
    }
1556 cdd90acb Christos KK Loverdos
1557 cdd90acb Christos KK Loverdos
    private void updateUploadFolder(final JsArrayString urls) {
1558 cdd90acb Christos KK Loverdos
        if(folderTreeView.equals(getSelectedTree()) || otherSharedTreeView.equals(getSelectedTree())) {
1559 cdd90acb Christos KK Loverdos
            Folder f = getSelection();
1560 cdd90acb Christos KK Loverdos
            if(getSelectedTree().equals(getFolderTreeView())) {
1561 cdd90acb Christos KK Loverdos
                updateFolder(f, true, new Command() {
1562 cdd90acb Christos KK Loverdos
1563 cdd90acb Christos KK Loverdos
                    @Override
1564 cdd90acb Christos KK Loverdos
                    public void execute() {
1565 cdd90acb Christos KK Loverdos
                        updateStatistics();
1566 cdd90acb Christos KK Loverdos
                        if(urls != null) {
1567 cdd90acb Christos KK Loverdos
                            selectUploadedFiles(urls);
1568 cdd90acb Christos KK Loverdos
                        }
1569 cdd90acb Christos KK Loverdos
                    }
1570 cdd90acb Christos KK Loverdos
                }, false);
1571 cdd90acb Christos KK Loverdos
            }
1572 cdd90acb Christos KK Loverdos
            else {
1573 cdd90acb Christos KK Loverdos
                updateOtherSharedFolder(f, true, null);
1574 cdd90acb Christos KK Loverdos
            }
1575 cdd90acb Christos KK Loverdos
        }
1576 cdd90acb Christos KK Loverdos
    }
1577 cdd90acb Christos KK Loverdos
1578 cdd90acb Christos KK Loverdos
    public native void disableUploadArea() /*-{
1579 cdd90acb Christos KK Loverdos
      var uploader = $wnd.$("#uploader").pluploadQueue();
1580 cdd90acb Christos KK Loverdos
      var dropElm = $wnd.document.getElementById('rightPanel');
1581 cdd90acb Christos KK Loverdos
      $wnd.plupload.removeAllEvents(dropElm, uploader.id);
1582 cdd90acb Christos KK Loverdos
    }-*/;
1583 cdd90acb Christos KK Loverdos
1584 cdd90acb Christos KK Loverdos
    public native void enableUploadArea() /*-{
1585 cdd90acb Christos KK Loverdos
      var uploader = $wnd.$("#uploader").pluploadQueue();
1586 cdd90acb Christos KK Loverdos
      var dropElm = $wnd.document.getElementById('rightPanel');
1587 cdd90acb Christos KK Loverdos
      $wnd.plupload.removeAllEvents(dropElm, uploader.id);
1588 cdd90acb Christos KK Loverdos
      if (uploader.runtime == 'html5') {
1589 cdd90acb Christos KK Loverdos
        uploader.settings.drop_element = 'rightPanel';
1590 cdd90acb Christos KK Loverdos
        uploader.trigger('PostInit');
1591 cdd90acb Christos KK Loverdos
      }
1592 cdd90acb Christos KK Loverdos
    }-*/;
1593 cdd90acb Christos KK Loverdos
1594 cdd90acb Christos KK Loverdos
    public void showUploadAlert(int nOfFiles) {
1595 cdd90acb Christos KK Loverdos
        if(uploadAlert == null) {
1596 cdd90acb Christos KK Loverdos
            uploadAlert = new UploadAlert(this, nOfFiles);
1597 cdd90acb Christos KK Loverdos
        }
1598 cdd90acb Christos KK Loverdos
        if(!uploadAlert.isShowing()) {
1599 cdd90acb Christos KK Loverdos
            uploadAlert.setPopupPositionAndShow(new PopupPanel.PositionCallback() {
1600 cdd90acb Christos KK Loverdos
1601 cdd90acb Christos KK Loverdos
                @Override
1602 cdd90acb Christos KK Loverdos
                public void setPosition(int offsetWidth, int offsetHeight) {
1603 cdd90acb Christos KK Loverdos
                    uploadAlert.setPopupPosition((Window.getClientWidth() - offsetWidth) / 2, statusPanel.getAbsoluteTop() - offsetHeight);
1604 cdd90acb Christos KK Loverdos
                }
1605 cdd90acb Christos KK Loverdos
            });
1606 cdd90acb Christos KK Loverdos
        }
1607 cdd90acb Christos KK Loverdos
        uploadAlert.setNumOfFiles(nOfFiles);
1608 cdd90acb Christos KK Loverdos
    }
1609 cdd90acb Christos KK Loverdos
1610 cdd90acb Christos KK Loverdos
    public void hideUploadAlert() {
1611 cdd90acb Christos KK Loverdos
        if(uploadAlert != null && uploadAlert.isShowing()) {
1612 cdd90acb Christos KK Loverdos
            uploadAlert.hide();
1613 cdd90acb Christos KK Loverdos
        }
1614 cdd90acb Christos KK Loverdos
    }
1615 cdd90acb Christos KK Loverdos
1616 cdd90acb Christos KK Loverdos
    public void selectUploadedFiles(JsArrayString urls) {
1617 cdd90acb Christos KK Loverdos
        List<String> selectedUrls = new ArrayList<String>();
1618 cdd90acb Christos KK Loverdos
        for(int i = 0; i < urls.length(); i++) {
1619 cdd90acb Christos KK Loverdos
            selectedUrls.add(urls.get(i));
1620 cdd90acb Christos KK Loverdos
        }
1621 cdd90acb Christos KK Loverdos
        fileList.selectByUrl(selectedUrls);
1622 cdd90acb Christos KK Loverdos
    }
1623 cdd90acb Christos KK Loverdos
1624 8ddb4627 Christos KK Loverdos
    public void purgeContainer(final Folder container) {
1625 cdd90acb Christos KK Loverdos
        String path = "/" + container.getName() + "?delimiter=/";
1626 28e270f9 Christos KK Loverdos
        DeleteRequest delete = new DeleteRequest(getStorageAPIURL(), getUserID(), path) {
1627 cdd90acb Christos KK Loverdos
1628 cdd90acb Christos KK Loverdos
            @Override
1629 cdd90acb Christos KK Loverdos
            protected void onUnauthorized(Response response) {
1630 cdd90acb Christos KK Loverdos
                sessionExpired();
1631 cdd90acb Christos KK Loverdos
            }
1632 cdd90acb Christos KK Loverdos
1633 cdd90acb Christos KK Loverdos
            @Override
1634 cdd90acb Christos KK Loverdos
            public void onSuccess(Resource result) {
1635 cdd90acb Christos KK Loverdos
                updateFolder(container, true, null, true);
1636 cdd90acb Christos KK Loverdos
            }
1637 cdd90acb Christos KK Loverdos
1638 cdd90acb Christos KK Loverdos
            @Override
1639 cdd90acb Christos KK Loverdos
            public void onError(Throwable t) {
1640 8ddb4627 Christos KK Loverdos
                LOG("Error deleting trash", t);
1641 cdd90acb Christos KK Loverdos
                setError(t);
1642 cdd90acb Christos KK Loverdos
                if(t instanceof RestException) {
1643 b73a903e Christos Stathis
                    displayError("Error deleting trash: " + ((RestException) t).getHttpStatusText());
1644 cdd90acb Christos KK Loverdos
                }
1645 cdd90acb Christos KK Loverdos
                else {
1646 b73a903e Christos Stathis
                    displayError("System error deleting trash: " + t.getMessage());
1647 cdd90acb Christos KK Loverdos
                }
1648 cdd90acb Christos KK Loverdos
            }
1649 cdd90acb Christos KK Loverdos
        };
1650 728ff1e4 Christos KK Loverdos
        delete.setHeader(Const.X_AUTH_TOKEN, getUserToken());
1651 cdd90acb Christos KK Loverdos
        Scheduler.get().scheduleDeferred(delete);
1652 cdd90acb Christos KK Loverdos
    }
1653 a57faaf0 Christos Stathis
}