X-Git-Url: https://code.grnet.gr/git/pithos-web-client/blobdiff_plain/ff06bcd5de7e285cb1af054b5be8fce44c5709c9..7e8e9ff01800c3c3e63b4fcff68cd28bfadeff9f:/src/gr/grnet/pithos/web/client/mysharedtree/MysharedTreeViewModel.java diff --git a/src/gr/grnet/pithos/web/client/mysharedtree/MysharedTreeViewModel.java b/src/gr/grnet/pithos/web/client/mysharedtree/MysharedTreeViewModel.java index 5a34d98..e5595ce 100644 --- a/src/gr/grnet/pithos/web/client/mysharedtree/MysharedTreeViewModel.java +++ b/src/gr/grnet/pithos/web/client/mysharedtree/MysharedTreeViewModel.java @@ -1,5 +1,5 @@ /* - * Copyright 2011 GRNET S.A. All rights reserved. + * Copyright 2011-2012 GRNET S.A. All rights reserved. * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following @@ -37,12 +37,15 @@ package gr.grnet.pithos.web.client.mysharedtree; import gr.grnet.pithos.web.client.FolderContextMenu; import gr.grnet.pithos.web.client.Pithos; +import gr.grnet.pithos.web.client.foldertree.AccountResource; import gr.grnet.pithos.web.client.foldertree.File; import gr.grnet.pithos.web.client.foldertree.Folder; +import gr.grnet.pithos.web.client.foldertree.FolderTreeView; import gr.grnet.pithos.web.client.mysharedtree.MysharedTreeView.Templates; import gr.grnet.pithos.web.client.rest.GetRequest; import gr.grnet.pithos.web.client.rest.RestException; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -57,6 +60,8 @@ import com.google.gwt.cell.client.ValueUpdater; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.Scheduler; import com.google.gwt.event.dom.client.ContextMenuEvent; +import com.google.gwt.http.client.Response; +import com.google.gwt.http.client.URL; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.text.shared.SafeHtmlRenderer; @@ -72,22 +77,30 @@ public class MysharedTreeViewModel implements TreeViewModel { protected Pithos app; - private Cell folderCell = new AbstractCell(ContextMenuEvent.getType().getName()) { + private Cell folderCell = new AbstractCell() { @Override public void render(Context context, Folder folder, SafeHtmlBuilder safeHtmlBuilder) { String html = AbstractImagePrototype.create(MysharedTreeView.images.folderYellow()).getHTML(); - safeHtmlBuilder.appendHtmlConstant(html); + safeHtmlBuilder.appendHtmlConstant(html).appendHtmlConstant(" "); safeHtmlBuilder.append(Templates.INSTANCE.nameSpan(folder.getName())); } @Override - public void onBrowserEvent(Context context, com.google.gwt.dom.client.Element parent, Folder folder, com.google.gwt.dom.client.NativeEvent event, ValueUpdater valueUpdater) { + public void onBrowserEvent(Context context, com.google.gwt.dom.client.Element parent, final Folder folder, com.google.gwt.dom.client.NativeEvent event, ValueUpdater valueUpdater) { if (event.getType().equals(ContextMenuEvent.getType().getName())) { + final int x = event.getClientX(); + final int y = event.getClientY(); MysharedTreeViewModel.this.selectionModel.setSelected(folder, true); - FolderContextMenu menu = new FolderContextMenu(app, MysharedTreeView.images, folder); - menu.setPopupPosition(event.getClientX(), event.getClientY()); - menu.show(); + app.scheduleFolderHeadCommand(folder, new Command() { + + @Override + public void execute() { + FolderContextMenu menu = new FolderContextMenu(app, MysharedTreeView.images, app.getSelectedTree(), folder); + menu.setPopupPosition(x, y); + menu.show(); + } + }); } } }; @@ -96,9 +109,7 @@ public class MysharedTreeViewModel implements TreeViewModel { private Map> dataProviderMap = new HashMap>(); - protected Set sharedFiles = new HashSet(); - - private SingleSelectionModel selectionModel; + protected SingleSelectionModel selectionModel; public MysharedTreeViewModel(Pithos _app, SingleSelectionModel selectionModel) { app = _app; @@ -108,126 +119,103 @@ public class MysharedTreeViewModel implements TreeViewModel { @Override public NodeInfo getNodeInfo(T value) { if (value == null) { - ListDataProvider rootDataProvider = new ListDataProvider(); - rootDataProvider.getList().add("My Shared"); - final SingleSelectionModel selectionModel2 = new SingleSelectionModel(); - selectionModel2.addSelectionChangeHandler(new Handler() { - - @Override - public void onSelectionChange(SelectionChangeEvent event) { - if (selectionModel2.getSelectedObject() != null) { - app.deselectOthers(selectionModel2); - fetchSharedFiles(); - app.showFiles(sharedFiles); - } - } - }); - app.addSelectionModel(selectionModel2); - return new DefaultNodeInfo(rootDataProvider, new TextCell(new SafeHtmlRenderer() { - @Override - public SafeHtml render(String object) { - SafeHtmlBuilder builder = new SafeHtmlBuilder(); - render(object, builder); - return builder.toSafeHtml(); - } - - @Override - public void render(String object, SafeHtmlBuilder builder) { - String html = AbstractImagePrototype.create(MysharedTreeView.images.myShared()).getHTML(); - builder.appendHtmlConstant(html); - builder.append(MysharedTreeView.Templates.INSTANCE.nameSpan(object)); - } - }), selectionModel2, null); - } - else if (value instanceof String) { - fetchSharedContainers(); + fetchSharedContainers(null); return new DefaultNodeInfo(firstLevelDataProvider, folderCell, selectionModel, null); } - else { - final Folder f = (Folder) value; - if (dataProviderMap.get(f) == null) { - dataProviderMap.put(f, new ListDataProvider()); - } - final ListDataProvider dataProvider = dataProviderMap.get(f); - fetchFolder(f, dataProvider, false); - return new DefaultNodeInfo(dataProvider, folderCell, selectionModel, null); + final Folder f = (Folder) value; + if (dataProviderMap.get(f) == null) { + dataProviderMap.put(f, new ListDataProvider()); } + final ListDataProvider dataProvider = dataProviderMap.get(f); + fetchFolder(f, dataProvider, false); + return new DefaultNodeInfo(dataProvider, folderCell, selectionModel, null); } - protected void fetchSharedFiles() { - final List containers = app.getAccount().getContainers(); - final ListDataProvider tempProvider = new ListDataProvider(); - Iterator iter = containers.iterator(); - fetchFolder(iter, tempProvider, new Command() { - - @Override - public void execute() { - firstLevelDataProvider.getList().clear(); - firstLevelDataProvider.getList().addAll(tempProvider.getList()); - app.showFiles(sharedFiles); - } - }); - } + private void fetchSharedContainers(final Command callback) { + String path = "?format=json&shared="; + GetRequest getAccount = new GetRequest(AccountResource.class, app.getApiPath(), app.getUsername(), path) { + @Override + public void onSuccess(final AccountResource _result) { + Iterator iter = _result.getContainers().listIterator(); + fetchFolder(iter, new Command() { + + @Override + public void execute() { + firstLevelDataProvider.getList().clear(); + Folder t = null; + for (Folder c : _result.getContainers()) { + if (c.isHome()) + firstLevelDataProvider.getList().add(0, c); //Pithos is always first + else if (!c.isTrash()) + firstLevelDataProvider.getList().add(c); + } + if (callback != null) + callback.execute(); + } + }); + } + + @Override + public void onError(Throwable t) { + GWT.log("Error getting account", t); + app.setError(t); + if (t instanceof RestException) + app.displayError("Error getting account: " + ((RestException) t).getHttpStatusText()); + else + app.displayError("System error fetching user data: " + t.getMessage()); + } - private void fetchSharedContainers() { - final List containers = app.getAccount().getContainers(); - final ListDataProvider tempProvider = new ListDataProvider(); - Iterator iter = containers.iterator(); - fetchFolder(iter, tempProvider, new Command() { - @Override - public void execute() { - firstLevelDataProvider.getList().clear(); - firstLevelDataProvider.getList().addAll(tempProvider.getList()); + protected void onUnauthorized(Response response) { + app.sessionExpired(); } - }); + }; + getAccount.setHeader("X-Auth-Token", app.getToken()); + Scheduler.get().scheduleDeferred(getAccount); } @Override public boolean isLeaf(Object o) { - if (o instanceof Folder) { + if (o == null) + return false; + else if (o instanceof Folder) { Folder f = (Folder) o; return f.getSubfolders().isEmpty(); } - return false; + else { + return firstLevelDataProvider.getList().isEmpty(); + } } + + private native void log(String msg) /*-{ + $wnd.console.log(msg); + }-*/; - protected void fetchFolder(final Iterator iter, final ListDataProvider dataProvider, final Command callback) { + protected void fetchFolder(final Iterator iter, final Command callback) { if (iter.hasNext()) { final Folder f = iter.next(); - String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix(); - GetRequest getFolder = new GetRequest(Folder.class, app.getApiPath(), app.getUsername(), path, f) { + String path = "/" + f.getContainer() + "?format=json&shared=&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix()); + GetRequest getFolder = new GetRequest(Folder.class, app.getApiPath(), f.getOwner(), path, f) { @Override - public void onSuccess(Folder result) { - if (!result.isShared()) { - for (File file : result.getFiles()) { - if (file.isShared()) - sharedFiles.add(file); - } - Iterator iter2 = result.getSubfolders().iterator(); - fetchFolder(iter2, dataProvider, new Command() { - - @Override - public void execute() { - fetchFolder(iter, dataProvider, callback); - } - }); - } - else { - dataProvider.getList().add(result); - fetchFolder(iter, dataProvider, callback); - } + public void onSuccess(Folder _result) { + fetchFolder(iter, callback); } @Override public void onError(Throwable t) { GWT.log("Error getting folder", t); + app.setError(t); if (t instanceof RestException) app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText()); else app.displayError("System error fetching folder: " + t.getMessage()); } + + @Override + protected void onUnauthorized(Response response) { + app.sessionExpired(); + } }; getFolder.setHeader("X-Auth-Token", app.getToken()); Scheduler.get().scheduleDeferred(getFolder); @@ -249,18 +237,18 @@ public class MysharedTreeViewModel implements TreeViewModel { } public void fetchFolder(final Folder f, final ListDataProvider dataProvider, final boolean showfiles) { - String path = "/" + f.getContainer() + "?format=json&delimiter=/&prefix=" + f.getPrefix(); - GetRequest getFolder = new GetRequest(Folder.class, app.getApiPath(), app.getUsername(), path, f) { + String path = "/" + f.getContainer() + "?format=json&shared=&delimiter=/&prefix=" + URL.encodeQueryString(f.getPrefix()); + GetRequest getFolder = new GetRequest(Folder.class, app.getApiPath(), f.getOwner(), path, f) { @Override - public void onSuccess(final Folder result) { + public void onSuccess(final Folder _result) { if (showfiles) - app.showFiles(result); - Iterator iter = result.getSubfolders().iterator(); - fetchFolder(iter, dataProvider, new Command() { + app.showFiles(_result); + Iterator iter = new ArrayList(_result.getSubfolders()).listIterator(); + fetchFolder(iter, new Command() { @Override public void execute() { dataProvider.getList().clear(); - dataProvider.getList().addAll(result.getSubfolders()); + dataProvider.getList().addAll(_result.getSubfolders()); app.getMySharedTreeView().updateChildren(f); } }); @@ -269,13 +257,23 @@ public class MysharedTreeViewModel implements TreeViewModel { @Override public void onError(Throwable t) { GWT.log("Error getting folder", t); + app.setError(t); if (t instanceof RestException) app.displayError("Error getting folder: " + ((RestException) t).getHttpStatusText()); else app.displayError("System error fetching folder: " + t.getMessage()); } + + @Override + protected void onUnauthorized(Response response) { + app.sessionExpired(); + } }; getFolder.setHeader("X-Auth-Token", app.getToken()); Scheduler.get().scheduleDeferred(getFolder); } + + public void initialize(Command callback) { + fetchSharedContainers(callback); + } }