\r
protected PermissionsList permList;\r
\r
- protected CheckBox readForAll;\r
- \r
private HorizontalPanel pathPanel;\r
\r
private TextBox path;\r
\r
- private Dictionary otherProperties = Dictionary.getDictionary("otherProperties");\r
- \r
/**\r
* An image bundle for this widgets images.\r
*/\r
"distribute this file and that it does not violate the Terms of Use.", true);\r
readForAllNote.setStylePrimaryName("pithos-readForAllNote");\r
\r
- readForAll = new CheckBox();\r
- readForAll.setValue(file.isPublished());\r
- readForAll.addClickHandler(new ClickHandler() {\r
- @Override\r
- public void onClick(ClickEvent event) {\r
- accept();\r
- }\r
- });\r
-\r
- // Only show the read for all permission if the user is the owner.\r
- if (file.getOwner().equals(app.getUsername())) {\r
- final HorizontalPanel permForAll = new HorizontalPanel();\r
- permForAll.add(new Label("Public"));\r
- permForAll.add(readForAll);\r
- permForAll.setSpacing(8);\r
- permForAll.addStyleName("pithos-TabPanelBottom");\r
- permForAll.add(readForAllNote);\r
- permPanel.add(permForAll);\r
- }\r
-\r
pathPanel = new HorizontalPanel();\r
pathPanel.setVisible(false);\r
pathPanel.setWidth("100%");\r
\r
@Override\r
public void execute() {\r
- showLinkIfPublished();\r
+ showLinkIfShared();\r
}\r
});\r
return permPanel;\r
}\r
\r
- void showLinkIfPublished() {\r
+ void showLinkIfShared() {\r
if (file.isShared()) {\r
UrlBuilder b = Window.Location.createUrlBuilder();\r
- if (file.isPublished()) {\r
- b.setPath(file.getPublicUri());\r
- path.setText(b.buildString());\r
- }\r
- else {\r
- b.setPath(app.getApiPath() + file.getOwner() + file.getUri());\r
- String href = Window.Location.getHref();\r
- boolean hasParameters = href.contains("?");\r
- path.setText(href + (hasParameters ? "&" : "?") + "goto=" + b.buildString());\r
- }\r
+ b.setPath(app.getApiPath() + file.getOwner() + file.getUri());\r
+ String href = Window.Location.getHref();\r
+ boolean hasParameters = href.contains("?");\r
+ path.setText(href + (hasParameters ? "&" : "?") + "goto=" + b.buildString());\r
pathPanel.setVisible(true);\r
}\r
else {\r
*/\r
@Override\r
protected void accept() {\r
- Boolean published = null;\r
- if (readForAll.getValue() != file.isPublished())\r
- if (file.getOwner().equals(app.getUsername()))\r
- published = readForAll.getValue();\r
- updateMetaData(app.getApiPath(), app.getUsername(), file.getUri() + "?update=", published, permList.getPermissions());\r
+ updateMetaData(app.getApiPath(), app.getUsername(), file.getUri() + "?update=", permList.getPermissions());\r
}\r
\r
- protected void updateMetaData(String api, String owner, final String path, final Boolean published, final Map<String, Boolean[]> newPermissions) {\r
- if (published != null || newPermissions != null) {\r
+ protected void updateMetaData(String api, String owner, final String path, final Map<String, Boolean[]> newPermissions) {\r
+ if (newPermissions != null) {\r
PostRequest updateFile = new PostRequest(api, owner, path) {\r
@Override\r
public void onSuccess(Resource result) {\r
\r
@Override\r
public void onSuccess(File _result) {\r
- showLinkIfPublished();\r
+ showLinkIfShared();\r
app.updateFolder(file.getParent(), true, new Command() {\r
\r
@Override\r
};\r
updateFile.setHeader("X-Auth-Token", app.getToken());\r
\r
- if (published != null)\r
- updateFile.setHeader("X-Object-Public", published.toString());\r
- if (newPermissions != null) {\r
- String readPermHeader = "read=";\r
- String writePermHeader = "write=";\r
- for (String u : newPermissions.keySet()) {\r
- Boolean[] p = newPermissions.get(u);\r
- if (p[0] != null && p[0])\r
- readPermHeader += u + ",";\r
- if (p[1] != null && p[1])\r
- writePermHeader += u + ",";\r
- }\r
- if (readPermHeader.endsWith("="))\r
- readPermHeader = "";\r
- else if (readPermHeader.endsWith(","))\r
- readPermHeader = readPermHeader.substring(0, readPermHeader.length() - 1);\r
- if (writePermHeader.endsWith("="))\r
- writePermHeader = "";\r
- else if (writePermHeader.endsWith(","))\r
- writePermHeader = writePermHeader.substring(0, writePermHeader.length() - 1);\r
- String permHeader = readPermHeader + ((readPermHeader.length() > 0 && writePermHeader.length() > 0) ? ";" : "") + writePermHeader;\r
- if (permHeader.length() == 0)\r
- permHeader="~";\r
- else\r
- permHeader = URL.encodePathSegment(permHeader);\r
- updateFile.setHeader("X-Object-Sharing", permHeader);\r
+ String readPermHeader = "read=";\r
+ String writePermHeader = "write=";\r
+ for (String u : newPermissions.keySet()) {\r
+ Boolean[] p = newPermissions.get(u);\r
+ if (p[0] != null && p[0])\r
+ readPermHeader += u + ",";\r
+ if (p[1] != null && p[1])\r
+ writePermHeader += u + ",";\r
}\r
+ if (readPermHeader.endsWith("="))\r
+ readPermHeader = "";\r
+ else if (readPermHeader.endsWith(","))\r
+ readPermHeader = readPermHeader.substring(0, readPermHeader.length() - 1);\r
+ if (writePermHeader.endsWith("="))\r
+ writePermHeader = "";\r
+ else if (writePermHeader.endsWith(","))\r
+ writePermHeader = writePermHeader.substring(0, writePermHeader.length() - 1);\r
+ String permHeader = readPermHeader + ((readPermHeader.length() > 0 && writePermHeader.length() > 0) ? ";" : "") + writePermHeader;\r
+ if (permHeader.length() == 0)\r
+ permHeader="~";\r
+ else\r
+ permHeader = URL.encodePathSegment(permHeader);\r
+ updateFile.setHeader("X-Object-Sharing", permHeader);\r
Scheduler.get().scheduleDeferred(updateFile);\r
}\r
else\r
\r
@Override\r
public void execute() {\r
- if (file.isShared())\r
+ if (file.isSharedOrPublished())\r
app.updateMySharedRoot();\r
}\r
}, true);\r
--- /dev/null
+/*\r
+ * Copyright 2011-2012 GRNET S.A. All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or\r
+ * without modification, are permitted provided that the following\r
+ * conditions are met:\r
+ *\r
+ * 1. Redistributions of source code must retain the above\r
+ * copyright notice, this list of conditions and the following\r
+ * disclaimer.\r
+ *\r
+ * 2. Redistributions in binary form must reproduce the above\r
+ * copyright notice, this list of conditions and the following\r
+ * disclaimer in the documentation and/or other materials\r
+ * provided with the distribution.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS\r
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR\r
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF\r
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\r
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\r
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
+ * POSSIBILITY OF SUCH DAMAGE.\r
+ *\r
+ * The views and conclusions contained in the software and\r
+ * documentation are those of the authors and should not be\r
+ * interpreted as representing official policies, either expressed\r
+ * or implied, of GRNET S.A.\r
+ */\r
+package gr.grnet.pithos.web.client;\r
+\r
+import gr.grnet.pithos.web.client.foldertree.File;\r
+import gr.grnet.pithos.web.client.foldertree.Resource;\r
+import gr.grnet.pithos.web.client.rest.HeadRequest;\r
+import gr.grnet.pithos.web.client.rest.PostRequest;\r
+\r
+import java.util.Map;\r
+\r
+import com.google.gwt.core.client.GWT;\r
+import com.google.gwt.core.client.Scheduler;\r
+import com.google.gwt.dom.client.NativeEvent;\r
+import com.google.gwt.event.dom.client.ClickEvent;\r
+import com.google.gwt.event.dom.client.ClickHandler;\r
+import com.google.gwt.event.dom.client.KeyCodes;\r
+import com.google.gwt.http.client.Response;\r
+import com.google.gwt.http.client.URL;\r
+import com.google.gwt.http.client.UrlBuilder;\r
+import com.google.gwt.i18n.client.Dictionary;\r
+import com.google.gwt.resources.client.ImageResource;\r
+import com.google.gwt.user.client.Command;\r
+import com.google.gwt.user.client.Window;\r
+import com.google.gwt.user.client.Event.NativePreviewEvent;\r
+import com.google.gwt.user.client.ui.Anchor;\r
+import com.google.gwt.user.client.ui.Button;\r
+import com.google.gwt.user.client.ui.CheckBox;\r
+import com.google.gwt.user.client.ui.FocusPanel;\r
+import com.google.gwt.user.client.ui.HasHorizontalAlignment;\r
+import com.google.gwt.user.client.ui.HorizontalPanel;\r
+import com.google.gwt.user.client.ui.Label;\r
+import com.google.gwt.user.client.ui.TextBox;\r
+import com.google.gwt.user.client.ui.VerticalPanel;\r
+\r
+/**\r
+ * The 'File properties' dialog box implementation.\r
+ *\r
+ */\r
+public class FilePublishDialog extends AbstractPropertiesDialog {\r
+\r
+ protected CheckBox readForAll;\r
+ \r
+ private HorizontalPanel pathPanel;\r
+ \r
+ private TextBox path;\r
+ \r
+ /**\r
+ * An image bundle for this widgets images.\r
+ */\r
+ public interface Images extends MessagePanel.Images {\r
+\r
+ @Source("gr/grnet/pithos/resources/edit_user.png")\r
+ ImageResource permUser();\r
+\r
+ @Source("gr/grnet/pithos/resources/groups22.png")\r
+ ImageResource permGroup();\r
+\r
+ @Source("gr/grnet/pithos/resources/editdelete.png")\r
+ ImageResource delete();\r
+ }\r
+\r
+ final File file;\r
+\r
+ Images images = GWT.create(Images.class);\r
+\r
+ /**\r
+ * The widget's constructor.\r
+ */\r
+ public FilePublishDialog(Pithos _app, File _file) {\r
+ super(_app);\r
+ file = _file;\r
+\r
+ Anchor close = new Anchor();\r
+ close.addStyleName("close");\r
+ close.addClickHandler(new ClickHandler() {\r
+ \r
+ @Override\r
+ public void onClick(ClickEvent event) {\r
+ hide();\r
+ }\r
+ });\r
+ // Set the dialog's caption.\r
+ setText("Publish/Un-publish");\r
+ setAnimationEnabled(true);\r
+ setGlassEnabled(true);\r
+ setStyleName("pithos-DialogBox");\r
+\r
+ // Outer contains inner and buttons.\r
+ final VerticalPanel outer = new VerticalPanel();\r
+ outer.add(close);\r
+ final FocusPanel focusPanel = new FocusPanel(outer);\r
+ // Inner contains generalPanel and permPanel.\r
+ inner = new VerticalPanel();\r
+ inner.addStyleName("inner");\r
+\r
+ inner.add(createSharingPanel());\r
+\r
+ outer.add(inner);\r
+\r
+ final Button ok = new Button("Close", new ClickHandler() {\r
+ @Override\r
+ public void onClick(ClickEvent event) {\r
+ closeDialog();\r
+ }\r
+ });\r
+ ok.addStyleName("button");\r
+\r
+ outer.add(ok);\r
+ outer.setCellHorizontalAlignment(inner, HasHorizontalAlignment.ALIGN_CENTER);\r
+\r
+ focusPanel.setFocus(true);\r
+ setWidget(outer);\r
+ }\r
+\r
+ private VerticalPanel createSharingPanel() {\r
+ VerticalPanel permPanel = new VerticalPanel();\r
+\r
+ final Label readForAllNote = new Label("When this option is enabled, the file will be readable" +\r
+ " by everyone. By checking this option, you are certifying that you have the right to " +\r
+ "distribute this file and that it does not violate the Terms of Use.", true);\r
+ readForAllNote.setStylePrimaryName("pithos-readForAllNote");\r
+\r
+ readForAll = new CheckBox();\r
+ readForAll.setValue(file.isPublished());\r
+ readForAll.addClickHandler(new ClickHandler() {\r
+ @Override\r
+ public void onClick(ClickEvent event) {\r
+ accept();\r
+ }\r
+ });\r
+\r
+ // Only show the read for all permission if the user is the owner.\r
+ if (file.getOwner().equals(app.getUsername())) {\r
+ final HorizontalPanel permForAll = new HorizontalPanel();\r
+ permForAll.add(new Label("Public"));\r
+ permForAll.add(readForAll);\r
+ permForAll.setSpacing(8);\r
+ permForAll.addStyleName("pithos-TabPanelBottom");\r
+ permForAll.add(readForAllNote);\r
+ permPanel.add(permForAll);\r
+ }\r
+\r
+ pathPanel = new HorizontalPanel();\r
+ pathPanel.setVisible(false);\r
+ pathPanel.setWidth("100%");\r
+ pathPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_LEFT);\r
+ pathPanel.add(new Label("Link"));\r
+ pathPanel.setSpacing(8);\r
+ pathPanel.addStyleName("pithos-TabPanelBottom");\r
+\r
+ path = new TextBox();\r
+ path.setWidth("100%");\r
+ path.addClickHandler(new ClickHandler() {\r
+ @Override\r
+ public void onClick(ClickEvent event) {\r
+ Pithos.enableIESelection();\r
+ ((TextBox) event.getSource()).selectAll();\r
+ Pithos.preventIESelection();\r
+ }\r
+ });\r
+ path.setText(Window.Location.getHost() + file.getPublicUri());\r
+ path.setTitle("Use this link for sharing the file via e-mail, IM, etc. (crtl-C/cmd-C to copy to system clipboard)");\r
+ path.setWidth("100%");\r
+ path.setReadOnly(true);\r
+ pathPanel.add(path);\r
+ permPanel.add(pathPanel);\r
+\r
+ Scheduler.get().scheduleDeferred(new Command() {\r
+ \r
+ @Override\r
+ public void execute() {\r
+ showLinkIfPublished();\r
+ }\r
+ });\r
+ return permPanel;\r
+ }\r
+\r
+ void showLinkIfPublished() {\r
+ if (file.isPublished()) {\r
+ UrlBuilder b = Window.Location.createUrlBuilder();\r
+ b.setPath(file.getPublicUri());\r
+ path.setText(b.buildString());\r
+ pathPanel.setVisible(true);\r
+ }\r
+ else {\r
+ pathPanel.setVisible(false);\r
+ }\r
+ }\r
+ /**\r
+ * Accepts any change and updates the file\r
+ *\r
+ */\r
+ @Override\r
+ protected void accept() {\r
+ Boolean published = null;\r
+ if (readForAll.getValue() != file.isPublished())\r
+ if (file.getOwner().equals(app.getUsername()))\r
+ published = readForAll.getValue();\r
+ updateMetaData(app.getApiPath(), app.getUsername(), file.getUri() + "?update=", published);\r
+ }\r
+\r
+ protected void updateMetaData(String api, String owner, final String path, final Boolean published) {\r
+ if (published != null) {\r
+ PostRequest updateFile = new PostRequest(api, owner, path) {\r
+ @Override\r
+ public void onSuccess(Resource result) {\r
+ HeadRequest<File> headFile = new HeadRequest<File>(File.class, app.getApiPath(), file.getOwner(), path, file) {\r
+\r
+ @Override\r
+ public void onSuccess(File _result) {\r
+ showLinkIfPublished();\r
+ app.updateFolder(file.getParent(), true, new Command() {\r
+ \r
+ @Override\r
+ public void execute() {\r
+ app.updateMySharedRoot();\r
+ }\r
+ }, true);\r
+ }\r
+\r
+ @Override\r
+ public void onError(Throwable t) {\r
+ GWT.log("", t);\r
+ app.setError(t);\r
+ app.displayError("System error modifying file:" + t.getMessage());\r
+ }\r
+\r
+ @Override\r
+ protected void onUnauthorized(Response response) {\r
+ app.sessionExpired();\r
+ }\r
+ };\r
+ headFile.setHeader("X-Auth-Token", app.getToken());\r
+ Scheduler.get().scheduleDeferred(headFile);\r
+ }\r
+\r
+ @Override\r
+ public void onError(Throwable t) {\r
+ GWT.log("", t);\r
+ app.setError(t);\r
+ app.displayError("System error modifying file:" + t.getMessage());\r
+ }\r
+\r
+ @Override\r
+ protected void onUnauthorized(Response response) {\r
+ app.sessionExpired();\r
+ }\r
+ };\r
+ updateFile.setHeader("X-Auth-Token", app.getToken());\r
+ updateFile.setHeader("X-Object-Public", published.toString());\r
+ Scheduler.get().scheduleDeferred(updateFile);\r
+ }\r
+ else\r
+ app.updateFolder(file.getParent(), true, new Command() {\r
+ \r
+ @Override\r
+ public void execute() {\r
+ if (file.isSharedOrPublished())\r
+ app.updateMySharedRoot();\r
+ }\r
+ }, true);\r
+ }\r
+\r
+ @Override\r
+ protected void onPreviewNativeEvent(NativePreviewEvent preview) {\r
+ super.onPreviewNativeEvent(preview);\r
+\r
+ NativeEvent evt = preview.getNativeEvent();\r
+ if (evt.getType().equals("keydown") && evt.getKeyCode() == KeyCodes.KEY_ENTER)\r
+ closeDialog();\r
+ }\r
+}\r