X-Git-Url: https://code.grnet.gr/git/pithos/blobdiff_plain/c8239751635c795db276d0dc77d59ecd9cb7123c..c3cf7286a71489b56e28c33cd446ef1f1c80e271:/src/gr/ebs/gss/client/FolderPropertiesDialog.java diff --git a/src/gr/ebs/gss/client/FolderPropertiesDialog.java b/src/gr/ebs/gss/client/FolderPropertiesDialog.java index 71fde37..93c349a 100644 --- a/src/gr/ebs/gss/client/FolderPropertiesDialog.java +++ b/src/gr/ebs/gss/client/FolderPropertiesDialog.java @@ -1,5 +1,5 @@ /* - * Copyright 2007, 2008, 2009 Electronic Business Systems Ltd. + * Copyright 2007, 2008, 2009, 2010 Electronic Business Systems Ltd. * * This file is part of GSS. * @@ -19,17 +19,24 @@ package gr.ebs.gss.client; import gr.ebs.gss.client.FilePropertiesDialog.Images; -import gr.ebs.gss.client.dnd.DnDTreeItem; import gr.ebs.gss.client.rest.PostCommand; import gr.ebs.gss.client.rest.RestException; import gr.ebs.gss.client.rest.resource.FolderResource; import gr.ebs.gss.client.rest.resource.GroupResource; import gr.ebs.gss.client.rest.resource.PermissionHolder; +import gr.ebs.gss.client.rest.resource.RestResource; +import gr.ebs.gss.client.rest.resource.RestResourceWrapper; import java.util.List; import java.util.Set; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.NativeEvent; +import com.google.gwt.event.dom.client.ChangeEvent; +import com.google.gwt.event.dom.client.ChangeHandler; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.http.client.URL; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.json.client.JSONArray; @@ -37,17 +44,18 @@ import com.google.gwt.json.client.JSONBoolean; import com.google.gwt.json.client.JSONObject; import com.google.gwt.json.client.JSONString; import com.google.gwt.user.client.DeferredCommand; +import com.google.gwt.user.client.Event.NativePreviewEvent; import com.google.gwt.user.client.ui.Button; -import com.google.gwt.user.client.ui.ClickListener; +import com.google.gwt.user.client.ui.CheckBox; +import com.google.gwt.user.client.ui.DecoratedTabPanel; import com.google.gwt.user.client.ui.DialogBox; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.KeyboardListener; +import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.TabPanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; -import com.google.gwt.user.client.ui.Widget; /** * The 'Folder properties' dialog box implementation. @@ -58,6 +66,8 @@ public class FolderPropertiesDialog extends DialogBox { final PermissionsList permList; + private CheckBox readForAll; + /** * The widget that holds the folderName of the folder. */ @@ -88,8 +98,8 @@ public class FolderPropertiesDialog extends DialogBox { GSS.enableIESelection(); create = _create; - DnDTreeItem folderItem = (DnDTreeItem)GSS.get().getFolders().getCurrent(); - folder = folderItem.getFolderResource(); + + folder = ((RestResourceWrapper) GSS.get().getTreeView().getSelection()).getResource(); permList = new PermissionsList(images, folder.getPermissions(), folder.getOwner()); groups = _groups; @@ -102,33 +112,56 @@ public class FolderPropertiesDialog extends DialogBox { // Outer contains inner and buttons VerticalPanel outer = new VerticalPanel(); // Inner contains generalPanel and permPanel - inner = new TabPanel(); + inner = new DecoratedTabPanel(); + inner.setAnimationEnabled(true); VerticalPanel generalPanel = new VerticalPanel(); VerticalPanel permPanel = new VerticalPanel(); + final HorizontalPanel permForAll = new HorizontalPanel(); + final HorizontalPanel pathPanel = new HorizontalPanel(); HorizontalPanel buttons = new HorizontalPanel(); HorizontalPanel permButtons = new HorizontalPanel(); + inner.add(generalPanel, "General"); if (!create) inner.add(permPanel, "Sharing"); inner.selectTab(0); + final Label folderNameNote = new Label("Please note that slashes ('/') are not allowed in folder names.", true); + folderNameNote.setVisible(false); + folderNameNote.setStylePrimaryName("gss-readForAllNote"); + FlexTable generalTable = new FlexTable(); generalTable.setText(0, 0, "Name"); generalTable.setText(1, 0, "Parent"); generalTable.setText(2, 0, "Creator"); - generalTable.setText(3, 0, "Date"); + generalTable.setText(3, 0, "Last modified"); folderName.setText(create ? "" : folder.getName()); + folderName.getElement().setId("folderPropertiesDialog.textBox.name"); generalTable.setWidget(0, 1, folderName); + folderName.addChangeHandler(new ChangeHandler() { + + @Override + public void onChange(ChangeEvent event) { + if(folderName.getText().contains("/")) + folderNameNote.setVisible(true); + else + folderNameNote.setVisible(false); + + } + }); + + if (create) generalTable.setText(1, 1, folder.getName()); else if(folder.getParentName() == null) generalTable.setText(1, 1, "-"); else generalTable.setText(1, 1, folder.getParentName()); + generalTable.setWidget(0, 2, folderNameNote); generalTable.setText(2, 1, folder.getOwner()); DateTimeFormat formatter = DateTimeFormat.getFormat("d/M/yyyy h:mm a"); - if(folder.getCreationDate() != null) - generalTable.setText(3, 1, formatter.format(folder.getCreationDate())); + if(folder.getModificationDate() != null) + generalTable.setText(3, 1, formatter.format(folder.getModificationDate())); generalTable.getFlexCellFormatter().setStyleName(0, 0, "props-labels"); generalTable.getFlexCellFormatter().setStyleName(1, 0, "props-labels"); generalTable.getFlexCellFormatter().setStyleName(2, 0, "props-labels"); @@ -146,62 +179,121 @@ public class FolderPropertiesDialog extends DialogBox { okLabel = "Create"; else okLabel = "Update"; - Button ok = new Button(okLabel, new ClickListener() { - - public void onClick(Widget sender) { - - createOrUpdateFolder(); + Button ok = new Button(okLabel, new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + if(folderName.getText().contains("/")) + folderNameNote.setVisible(true); + else { + folderNameNote.setVisible(false); + createOrUpdateFolder(); + closeDialog(); + } - closeDialog(); } }); + ok.getElement().setId("folderPropertiesDialog.button.ok"); buttons.add(ok); buttons.setCellHorizontalAlignment(ok, HasHorizontalAlignment.ALIGN_CENTER); // Create the 'Cancel' button, along with a listener that hides the // dialog // when the button is clicked. - Button cancel = new Button("Cancel", new ClickListener() { - - public void onClick(Widget sender) { + Button cancel = new Button("Cancel", new ClickHandler() { + @Override + public void onClick(ClickEvent event) { closeDialog(); } }); + cancel.getElement().setId("folderPropertiesDialog.button.cancel"); buttons.add(cancel); buttons.setCellHorizontalAlignment(cancel, HasHorizontalAlignment.ALIGN_CENTER); buttons.setSpacing(8); - buttons.addStyleName("gwt-TabPanelBottom"); + buttons.addStyleName("gss-TabPanelBottom"); - Button add = new Button("Add Group", new ClickListener() { - - public void onClick(Widget sender) { + Button add = new Button("Add Group", new ClickHandler() { + @Override + public void onClick(ClickEvent event) { PermissionsAddDialog dlg = new PermissionsAddDialog(groups, permList, false); dlg.center(); } }); + add.getElement().setId("folderPropertiesDialog.button.addGroup"); permButtons.add(add); permButtons.setCellHorizontalAlignment(add, HasHorizontalAlignment.ALIGN_CENTER); - Button addUser = new Button("Add User", new ClickListener() { - - public void onClick(Widget sender) { + Button addUser = new Button("Add User", new ClickHandler() { + @Override + public void onClick(ClickEvent event) { PermissionsAddDialog dlg = new PermissionsAddDialog(groups, permList, true); dlg.center(); } }); + addUser.getElement().setId("folderPropertiesDialog.button.addUser"); permButtons.add(addUser); permButtons.setCellHorizontalAlignment(addUser, HasHorizontalAlignment.ALIGN_CENTER); permButtons.setCellHorizontalAlignment(cancel, HasHorizontalAlignment.ALIGN_CENTER); permButtons.setSpacing(8); - permButtons.addStyleName("gwt-TabPanelBottom"); + permButtons.addStyleName("gss-TabPanelBottom"); + + final Label readForAllNote = new Label("When this option is enabled, the folder will be readable" + + " by everyone. By checking this option, you are certifying that you have the right to " + + "distribute this folder's contents and that it does not violate the Terms of Use.", true); + readForAllNote.setVisible(false); + readForAllNote.setStylePrimaryName("gss-readForAllNote"); + + readForAll = new CheckBox(); + readForAll.getElement().setId("folderPropertiesDialog.checkBox.public"); + readForAll.setValue(folder.isReadForAll()); + readForAll.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + readForAllNote.setVisible(readForAll.getValue()); + } + + }); generalPanel.add(generalTable); permPanel.add(permList); permPanel.add(permButtons); + + // Only show the read for all permission if the user is the owner. + if (folder.getOwner().equals(GSS.get().getCurrentUserResource().getUsername())) { + permForAll.add(new Label("Public")); + permForAll.add(readForAll); + permForAll.setSpacing(8); + permForAll.addStyleName("gss-TabPanelBottom"); + permForAll.add(readForAllNote); + permPanel.add(permForAll); + } + TextBox path = new TextBox(); + path.getElement().setId("folderPropertiesDialog.textBox.link"); + path.setWidth("100%"); + path.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + GSS.enableIESelection(); + ((TextBox) event.getSource()).selectAll(); + GSS.preventIESelection(); + } + + }); + path.setText(folder.getUri()); + path.setTitle("Use this link for sharing the folder via e-mail, IM, etc. (crtl-C/cmd-C to copy to system clipboard)"); + path.setWidth("100%"); + path.setReadOnly(true); + pathPanel.setWidth("100%"); + pathPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT); + pathPanel.add(new Label("Link")); + pathPanel.setSpacing(8); + pathPanel.addStyleName("gss-TabPanelBottom"); + pathPanel.add(path); + permPanel.add(pathPanel); + outer.add(inner); outer.add(buttons); outer.setCellHorizontalAlignment(buttons, HasHorizontalAlignment.ALIGN_CENTER); - outer.addStyleName("gwt-TabPanelBottom"); + outer.addStyleName("gss-TabPanelBottom"); setWidget(outer); @@ -218,22 +310,25 @@ public class FolderPropertiesDialog extends DialogBox { } @Override - public boolean onKeyDownPreview(char key, int modifiers) { - // Use the popup's key preview hooks to close the dialog when either - // enter or escape is pressed. - switch (key) { - case KeyboardListener.KEY_ENTER: - closeDialog(); - createOrUpdateFolder(); - break; - case KeyboardListener.KEY_ESCAPE: - closeDialog(); - break; - } - - return true; + protected void onPreviewNativeEvent(NativePreviewEvent preview) { + super.onPreviewNativeEvent(preview); + + NativeEvent evt = preview.getNativeEvent(); + if (evt.getType().equals("keydown")) + // Use the popup's key preview hooks to close the dialog when either + // enter or escape is pressed. + switch (evt.getKeyCode()) { + case KeyCodes.KEY_ENTER: + closeDialog(); + createOrUpdateFolder(); + break; + case KeyCodes.KEY_ESCAPE: + closeDialog(); + break; + } } + /** * Enables IE selection prevention and hides the dialog * (we disable the prevention on creation of the dialog) @@ -251,11 +346,19 @@ public class FolderPropertiesDialog extends DialogBox { * @param _folderName the name of the folder to create */ private void createFolder() { - PostCommand ep = new PostCommand(folder.getUri()+"?new="+URL.encode(folderName.getText()),"", 201){ + String name = folderName.getText(); + if (!GSS.isValidResourceName(name)) { + GSS.get().displayError("The folder name '" + name + "' is invalid"); + return; + } + PostCommand ep = new PostCommand(folder.getUri() + "?new=" + + URL.encodeComponent(name), "", 201) { @Override public void onComplete() { - GSS.get().getFolders().updateFolder( (DnDTreeItem) GSS.get().getFolders().getCurrent()); + //TODO:CELLTREE + GSS.get().getTreeView().updateNodeChildren((RestResourceWrapper) GSS.get().getTreeView().getSelection()); + //GSS.get().getFolders().updateFolder((DnDTreeItem) GSS.get().getFolders().getCurrent()); } @Override @@ -264,14 +367,18 @@ public class FolderPropertiesDialog extends DialogBox { if(t instanceof RestException){ int statusCode = ((RestException)t).getHttpStatusCode(); if(statusCode == 405) - GSS.get().displayError("You don't have the necessary permissions or a folder with same name already exists"); + GSS.get().displayError("You don't have the necessary" + + " permissions or a folder with same name " + + "already exists"); else if(statusCode == 404) GSS.get().displayError("Resource not found"); else - GSS.get().displayError("Unable to create folder:"+((RestException)t).getHttpStatusText()); + GSS.get().displayError("Unable to create folder:" + + ((RestException)t).getHttpStatusText()); } else - GSS.get().displayError("System error creating folder:"+t.getMessage()); + GSS.get().displayError("System error creating folder:" + + t.getMessage()); } }; DeferredCommand.addCommand(ep); @@ -299,6 +406,10 @@ public class FolderPropertiesDialog extends DialogBox { JSONObject json = new JSONObject(); if(!folder.getName().equals(folderName.getText())) json.put("name", new JSONString(folderName.getText())); + //only update the read for all perm if the user is the owner + if (readForAll.getValue() != folder.isReadForAll()) + if (folder.getOwner().equals(GSS.get().getCurrentUserResource().getUsername())) + json.put("readForAll", JSONBoolean.getInstance(readForAll.getValue())); if (permList.hasChanges()) { JSONArray perma = new JSONArray(); int i=0; @@ -321,19 +432,29 @@ public class FolderPropertiesDialog extends DialogBox { @Override public void onComplete() { + //TODO:CELLTREE + if(getPostBody() != null && !"".equals(getPostBody().trim())){ - DnDTreeItem folderItem = (DnDTreeItem) GSS.get().getFolders().getCurrent(); - FolderResource fres = folderItem.getFolderResource(); + + + FolderResource fres = ((RestResourceWrapper) GSS.get().getTreeView().getSelection()).getResource(); String initialPath = fres.getUri(); String newPath = getPostBody().trim(); fres.setUri(newPath); - + ((RestResourceWrapper) GSS.get().getTreeView().getSelection()).getResource().setUri(newPath); + ((RestResourceWrapper) GSS.get().getTreeView().getSelection()).setUri(newPath); + GSS.get().getTreeView().updateNodeChildren(fres.getParentURI()); + if (permList.hasChanges()) { + GSS.get().getTreeView().updateMySharedNode(); + } + /* if(folderItem.getParentItem() != null && ((DnDTreeItem)folderItem.getParentItem()).getFolderResource() != null){ ((DnDTreeItem)folderItem.getParentItem()).getFolderResource().removeSubfolderPath(initialPath); ((DnDTreeItem)folderItem.getParentItem()).getFolderResource().getSubfolderPaths().add(newPath); - } + }*/ } - GSS.get().getFolders().updateFolder( (DnDTreeItem) GSS.get().getFolders().getCurrent()); + //GSS.get().getFolders().updateFolder( (DnDTreeItem) GSS.get().getFolders().getCurrent()); + GSS.get().showFileList(true); } @@ -352,7 +473,8 @@ public class FolderPropertiesDialog extends DialogBox { } else GSS.get().displayError("System error moifying file: "+t.getMessage()); - GSS.get().getFolders().updateFolder( (DnDTreeItem) GSS.get().getFolders().getCurrent()); + //TODO:CELLTREE + //GSS.get().getFolders().updateFolder( (DnDTreeItem) GSS.get().getFolders().getCurrent()); } }; DeferredCommand.addCommand(ep);