X-Git-Url: https://code.grnet.gr/git/pithos-web-client/blobdiff_plain/cd63ee1ad610e36f578d7dbd21d96bf0e9260cd9..refs/tags/v0.9.1:/src/gr/grnet/pithos/web/client/Pithos.java diff --git a/src/gr/grnet/pithos/web/client/Pithos.java b/src/gr/grnet/pithos/web/client/Pithos.java index 3caed4c..992916f 100644 --- a/src/gr/grnet/pithos/web/client/Pithos.java +++ b/src/gr/grnet/pithos/web/client/Pithos.java @@ -62,6 +62,7 @@ import java.util.Set; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; +import com.google.gwt.core.client.JsArrayString; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.RepeatingCommand; import com.google.gwt.core.client.Scheduler.ScheduledCommand; @@ -76,12 +77,13 @@ import com.google.gwt.http.client.RequestException; import com.google.gwt.http.client.Response; import com.google.gwt.http.client.URL; import com.google.gwt.i18n.client.Dictionary; -import com.google.gwt.i18n.client.NumberFormat; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONParser; import com.google.gwt.json.client.JSONString; import com.google.gwt.json.client.JSONValue; +import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.CssResource; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.resources.client.ImageResource.ImageOptions; import com.google.gwt.user.client.Command; @@ -92,11 +94,13 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.AbstractImagePrototype; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.HorizontalSplitPanel; +import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.view.client.SelectionChangeEvent; @@ -114,6 +118,35 @@ public class Pithos implements EntryPoint, ResizeHandler { public static final Configuration config = GWT.create(Configuration.class); + public interface Style extends CssResource { + String commandAnchor(); + + String statistics(); + + @ClassName("gwt-HTML") + String html(); + + String uploadAlert(); + + String uploadAlertLink(); + + String uploadAlertProgress(); + + String uploadAlertPercent(); + + String uploadAlertClose(); + } + + public interface Resources extends ClientBundle { + @Source("Pithos.css") + Style pithosCss(); + + @Source("gr/grnet/pithos/resources/close-popup.png") + ImageResource closePopup(); + } + + public static Resources resources = GWT.create(Resources.class); + /** * Instantiate an application-level image bundle. This object will provide * programmatic access to all the images needed by widgets. @@ -144,12 +177,16 @@ public class Pithos implements EntryPoint, ResizeHandler { mysharedTreeView.updateRoot(); } - public void updateSharedFolder(Folder f, boolean showfiles) { - mysharedTreeView.updateFolder(f, showfiles); + public void updateSharedFolder(Folder f, boolean showfiles, Command callback) { + mysharedTreeView.updateFolder(f, showfiles, callback); } - public void updateOtherSharedFolder(Folder f, boolean showfiles) { - otherSharedTreeView.updateFolder(f, showfiles); + public void updateSharedFolder(Folder f, boolean showfiles) { + updateSharedFolder(f, showfiles, null); + } + + public void updateOtherSharedFolder(Folder f, boolean showfiles, Command callback) { + otherSharedTreeView.updateFolder(f, showfiles, callback); } public MysharedTreeView getMySharedTreeView() { @@ -190,7 +227,7 @@ public class Pithos implements EntryPoint, ResizeHandler { /** * The bottom panel that contains the status bar. */ - private StatusPanel statusPanel = null; + StatusPanel statusPanel = null; /** * The file list widget. @@ -238,7 +275,7 @@ public class Pithos implements EntryPoint, ResizeHandler { OtherSharedTreeView otherSharedTreeView = null; GroupTreeViewModel groupTreeViewModel; - private GroupTreeView groupTreeView; + GroupTreeView groupTreeView; TreeView selectedTree; protected AccountResource account; @@ -249,20 +286,16 @@ public class Pithos implements EntryPoint, ResizeHandler { @SuppressWarnings("rawtypes") List selectionModels = new ArrayList(); - Button upload; - - private HTML usedBytes; - - private HTML totalBytes; - - private HTML usedPercent; + public Button upload; private HTML numOfFiles; private Toolbar toolbar; - private FileUploadDialog fileUploadDialog; - + private FileUploadDialog fileUploadDialog = new FileUploadDialog(this); + + UploadAlert uploadAlert; + @Override public void onModuleLoad() { if (parseUserCredentials()) @@ -270,6 +303,7 @@ public class Pithos implements EntryPoint, ResizeHandler { } private void initialize() { + resources.pithosCss().ensureInjected(); boolean bareContent = Window.Location.getParameter("noframe") != null; String contentWidth = bareContent ? "100%" : "75%"; @@ -327,7 +361,7 @@ public class Pithos implements EntryPoint, ResizeHandler { header.setCellWidth(folderStatistics, "40px"); outer.add(header); outer.setCellHorizontalAlignment(header, HasHorizontalAlignment.ALIGN_CENTER); - // Inner contains the various lists.nner + // Inner contains the various lists inner.sinkEvents(Event.ONCONTEXTMENU); inner.setWidth("100%"); @@ -362,49 +396,18 @@ public class Pithos implements EntryPoint, ResizeHandler { folderTreeView = new FolderTreeView(folderTreeViewModel); treeViews.add(folderTreeView); - fileList = new FileList(this, images, folderTreeView); + fileList = new FileList(this, images); inner.add(fileList); - groupTreeViewModel = new GroupTreeViewModel(this); - groupTreeView = new GroupTreeView(groupTreeViewModel); - treeViews.add(groupTreeView); - trees = new VerticalPanel(); trees.setWidth("100%"); - trees.setSpacing(5); - -// HorizontalPanel treeHeader = new HorizontalPanel(); -// treeHeader.addStyleName("pithos-treeHeader"); -// treeHeader.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); -// treeHeader.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); -// treeHeader.add(statistics); -// treeHeader.setCellHorizontalAlignment(statistics, HasHorizontalAlignment.ALIGN_LEFT); -// trees.add(treeHeader); - - trees.add(folderTreeView); - - HorizontalPanel separator = new HorizontalPanel(); - separator.addStyleName("pithos-statisticsSeparator"); - trees.add(separator); - - HorizontalPanel statistics = new HorizontalPanel(); - statistics.addStyleName("pithos-statistics"); - statistics.add(new HTML("Used: ")); - usedBytes = new HTML(); - statistics.add(usedBytes); - statistics.add(new HTML(" of ")); - totalBytes = new HTML(); - statistics.add(totalBytes); - statistics.add(new HTML(" (")); - usedPercent = new HTML(); - statistics.add(usedPercent); - statistics.add(new HTML(")")); - trees.add(statistics); - trees.add(groupTreeView); // Add the left and right panels to the split panel. splitPanel.setLeftWidget(trees); - splitPanel.setRightWidget(inner); + FlowPanel right = new FlowPanel(); + right.getElement().setId("rightPanel"); + right.add(inner); + splitPanel.setRightWidget(right); splitPanel.setSplitPosition("219px"); splitPanel.setSize("100%", "100%"); splitPanel.addStyleName("pithos-splitPanel"); @@ -432,14 +435,17 @@ public class Pithos implements EntryPoint, ResizeHandler { // Call the window resized handler to get the initial sizes setup. Doing // this in a deferred command causes it to occur after all widgets' // sizes have been computed by the browser. - Scheduler.get().scheduleDeferred(new ScheduledCommand() { - - @Override - public void execute() { + Scheduler.get().scheduleIncremental(new RepeatingCommand() { + + @Override + public boolean execute() { + if (!isCloudbarReady()) + return true; onWindowResized(Window.getClientHeight()); - } - }); - + return false; + } + }); + Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { @@ -457,6 +463,7 @@ public class Pithos implements EntryPoint, ResizeHandler { trash = f; break; } + trees.add(folderTreeView); folderTreeViewModel.initialize(account, new Command() { @Override @@ -464,8 +471,17 @@ public class Pithos implements EntryPoint, ResizeHandler { createMySharedTree(); } }); - groupTreeViewModel.initialize(); - showStatistics(); + + HorizontalPanel separator = new HorizontalPanel(); + separator.addStyleName("pithos-statisticsSeparator"); + separator.add(new HTML("")); + trees.add(separator); + + groupTreeViewModel = new GroupTreeViewModel(Pithos.this); + groupTreeView = new GroupTreeView(groupTreeViewModel); + treeViews.add(groupTreeView); + trees.add(groupTreeView); + folderTreeView.showStatistics(account); } } }); @@ -490,31 +506,32 @@ public class Pithos implements EntryPoint, ResizeHandler { public void applyPermissions(Folder f) { if (f != null) { - if (f.isInTrash()) + if (f.isInTrash()) { upload.setEnabled(false); + disableUploadArea(); + } else { Boolean[] perms = f.getPermissions().get(username); if (f.getOwner().equals(username) || (perms != null && perms[1] != null && perms[1])) { upload.setEnabled(true); + enableUploadArea(); } - else + else { upload.setEnabled(false); + disableUploadArea(); + } } } - else + else { upload.setEnabled(false); + disableUploadArea(); + } } @SuppressWarnings({ "rawtypes", "unchecked" }) public void deselectOthers(TreeView _selectedTree, SingleSelectionModel model) { selectedTree = _selectedTree; - for (Composite c : treeViews) - if (c.equals(selectedTree)) - c.addStyleName("cellTreeWidget-selectedTree"); - else - c.removeStyleName("cellTreeWidget-selectedTree"); - for (SingleSelectionModel s : selectionModels) if (!s.equals(model) && s.getSelectedObject() != null) s.setSelected(s.getSelectedObject(), false); @@ -569,7 +586,7 @@ public class Pithos implements EntryPoint, ResizeHandler { Window.Location.assign(otherProperties.get("loginUrl") + Window.Location.getHref()); } - protected void fetchAccount(final Command callback) { + public void fetchAccount(final Command callback) { String path = "?format=json"; GetRequest getAccount = new GetRequest(AccountResource.class, getApiPath(), username, path) { @@ -604,7 +621,7 @@ public class Pithos implements EntryPoint, ResizeHandler { @Override public void onSuccess(AccountResource _result) { - showStatistics(); + folderTreeView.showStatistics(account); } @Override @@ -626,13 +643,6 @@ public class Pithos implements EntryPoint, ResizeHandler { Scheduler.get().scheduleDeferred(headAccount); } - protected void showStatistics() { - usedBytes.setHTML(String.valueOf(account.getFileSizeAsString())); - totalBytes.setHTML(String.valueOf(account.getQuotaAsString())); - NumberFormat nf = NumberFormat.getPercentFormat(); - usedPercent.setHTML(nf.format(account.getUsedPercentage())); - } - protected void createHomeContainer(final AccountResource _account, final Command callback) { String path = "/" + Pithos.HOME_CONTAINER; PutRequest createPithos = new PutRequest(getApiPath(), getUsername(), path) { @@ -708,13 +718,19 @@ public class Pithos implements EntryPoint, ResizeHandler { protected void onWindowResized(int height) { // Adjust the split panel to take up the available room in the window. - int newHeight = height - splitPanel.getAbsoluteTop(); + int newHeight = height - splitPanel.getAbsoluteTop() - 153; if (newHeight < 1) newHeight = 1; splitPanel.setHeight("" + newHeight); inner.setHeight("" + newHeight); } - + + native boolean isCloudbarReady()/*-{ + if ($wnd.$("div.servicesbar") && $wnd.$("div.servicesbar").height() > 0) + return true; + return false; + }-*/; + @Override public void onResize(ResizeEvent event) { int height = event.getHeight(); @@ -728,6 +744,7 @@ public class Pithos implements EntryPoint, ResizeHandler { */ public void displayError(String msg) { messagePanel.displayError(msg); + onWindowResized(Window.getClientHeight()); } /** @@ -737,6 +754,7 @@ public class Pithos implements EntryPoint, ResizeHandler { */ public void displayWarning(String msg) { messagePanel.displayWarning(msg); + onWindowResized(Window.getClientHeight()); } /** @@ -746,6 +764,7 @@ public class Pithos implements EntryPoint, ResizeHandler { */ public void displayInformation(String msg) { messagePanel.displayInformation(msg); + onWindowResized(Window.getClientHeight()); } /** @@ -1081,10 +1100,11 @@ public class Pithos implements EntryPoint, ResizeHandler { groupTreeView.updateGroupNode(null); } - public void addGroup(String groupname) { + public Group addGroup(String groupname) { Group newGroup = new Group(groupname); account.addGroup(newGroup); groupTreeView.updateGroupNode(null); + return newGroup; } public void removeGroup(Group group) { @@ -1101,7 +1121,9 @@ public class Pithos implements EntryPoint, ResizeHandler { } public Folder getSelection() { - return selectedTree.getSelection(); + if (selectedTree != null) + return selectedTree.getSelection(); + return null; } public void showFolderStatistics(int folderFileCount) { @@ -1128,6 +1150,7 @@ public class Pithos implements EntryPoint, ResizeHandler { if (mysharedTreeSelectionModel.getSelectedObject() != null) { deselectOthers(mysharedTreeView, mysharedTreeSelectionModel); upload.setEnabled(false); + disableUploadArea(); updateSharedFolder(mysharedTreeSelectionModel.getSelectedObject(), true); showRelevantToolbarButtons(); } @@ -1146,7 +1169,7 @@ public class Pithos implements EntryPoint, ResizeHandler { @Override public void execute() { mysharedTreeView = new MysharedTreeView(mysharedTreeViewModel); - trees.insert(mysharedTreeView, 4); + trees.insert(mysharedTreeView, 2); treeViews.add(mysharedTreeView); createOtherSharedTree(); } @@ -1160,9 +1183,8 @@ public class Pithos implements EntryPoint, ResizeHandler { public void onSelectionChange(SelectionChangeEvent event) { if (otherSharedTreeSelectionModel.getSelectedObject() != null) { deselectOthers(otherSharedTreeView, otherSharedTreeSelectionModel); - otherSharedTreeView.addStyleName("cellTreeWidget-selectedTree"); applyPermissions(otherSharedTreeSelectionModel.getSelectedObject()); - updateOtherSharedFolder(otherSharedTreeSelectionModel.getSelectedObject(), true); + updateOtherSharedFolder(otherSharedTreeSelectionModel.getSelectedObject(), true, null); showRelevantToolbarButtons(); } else { @@ -1180,7 +1202,7 @@ public class Pithos implements EntryPoint, ResizeHandler { @Override public void execute() { otherSharedTreeView = new OtherSharedTreeView(otherSharedTreeViewModel); - trees.insert(otherSharedTreeView, 4); + trees.insert(otherSharedTreeView, 1); treeViews.add(otherSharedTreeView); } }); @@ -1314,4 +1336,79 @@ public class Pithos implements EntryPoint, ResizeHandler { headFile.setHeader("X-Auth-Token", getToken()); Scheduler.get().scheduleDeferred(headFile); } + + public boolean isMySharedSelected() { + return getSelectedTree().equals(getMySharedTreeView()); + } + + private Folder getUploadFolder() { + if (folderTreeView.equals(getSelectedTree()) || otherSharedTreeView.equals(getSelectedTree())) { + return getSelection(); + } + return null; + } + + private void updateUploadFolder() { + updateUploadFolder(null); + } + + private void updateUploadFolder(final JsArrayString urls) { + if (folderTreeView.equals(getSelectedTree()) || otherSharedTreeView.equals(getSelectedTree())) { + Folder f = getSelection(); + if (getSelectedTree().equals(getFolderTreeView())) + updateFolder(f, true, new Command() { + + @Override + public void execute() { + updateStatistics(); + if (urls != null) + selectUploadedFiles(urls); + } + }, false); + else + updateOtherSharedFolder(f, true, null); + } + } + + public native void disableUploadArea() /*-{ + var uploader = $wnd.$("#uploader").pluploadQueue(); + var dropElm = $wnd.document.getElementById('rightPanel'); + $wnd.plupload.removeAllEvents(dropElm, uploader.id); + }-*/; + + public native void enableUploadArea() /*-{ + var uploader = $wnd.$("#uploader").pluploadQueue(); + var dropElm = $wnd.document.getElementById('rightPanel'); + $wnd.plupload.removeAllEvents(dropElm, uploader.id); + if (uploader.runtime == 'html5') { + uploader.settings.drop_element = 'rightPanel'; + uploader.trigger('PostInit'); + } + }-*/; + + public void showUploadAlert(int nOfFiles) { + if (uploadAlert == null) + uploadAlert = new UploadAlert(this, nOfFiles); + if (!uploadAlert.isShowing()) + uploadAlert.setPopupPositionAndShow(new PopupPanel.PositionCallback() { + + @Override + public void setPosition(int offsetWidth, int offsetHeight) { + uploadAlert.setPopupPosition((Window.getClientWidth() - offsetWidth)/2, statusPanel.getAbsoluteTop() - offsetHeight); + } + }); + uploadAlert.setNumOfFiles(nOfFiles); + } + + public void hideUploadAlert() { + if (uploadAlert != null && uploadAlert.isShowing()) + uploadAlert.hide(); + } + + public void selectUploadedFiles(JsArrayString urls) { + List selectedUrls = new ArrayList(); + for (int i=0; i