Updated copyright notice
[pithos] / web_client / src / gr / grnet / pithos / web / client / FilesPropertiesDialog.java
1 /*\r
2  * Copyright (c) 2011 Greek Research and Technology Network\r
3  */\r
4 package gr.grnet.pithos.web.client;\r
5 \r
6 import gr.grnet.pithos.web.client.components.TristateCheckBox;\r
7 import gr.grnet.pithos.web.client.rest.MultiplePostCommand;\r
8 import gr.grnet.pithos.web.client.rest.RestException;\r
9 import gr.grnet.pithos.web.client.rest.resource.FileResource;\r
10 \r
11 import java.util.ArrayList;\r
12 import java.util.Iterator;\r
13 import java.util.List;\r
14 \r
15 import com.google.gwt.core.client.GWT;\r
16 import com.google.gwt.event.dom.client.ClickEvent;\r
17 import com.google.gwt.event.dom.client.ClickHandler;\r
18 import com.google.gwt.event.dom.client.FocusEvent;\r
19 import com.google.gwt.event.dom.client.FocusHandler;\r
20 import com.google.gwt.json.client.JSONArray;\r
21 import com.google.gwt.json.client.JSONBoolean;\r
22 import com.google.gwt.json.client.JSONObject;\r
23 import com.google.gwt.json.client.JSONString;\r
24 import com.google.gwt.user.client.Command;\r
25 import com.google.gwt.user.client.DeferredCommand;\r
26 import com.google.gwt.user.client.ui.Button;\r
27 import com.google.gwt.user.client.ui.DecoratedTabPanel;\r
28 import com.google.gwt.user.client.ui.DisclosurePanel;\r
29 import com.google.gwt.user.client.ui.FlexTable;\r
30 import com.google.gwt.user.client.ui.FlowPanel;\r
31 import com.google.gwt.user.client.ui.FocusPanel;\r
32 import com.google.gwt.user.client.ui.HasHorizontalAlignment;\r
33 import com.google.gwt.user.client.ui.HorizontalPanel;\r
34 import com.google.gwt.user.client.ui.Label;\r
35 import com.google.gwt.user.client.ui.VerticalPanel;\r
36 \r
37 /**\r
38  * The 'Multiple file properties' dialog box implementation.\r
39  *\r
40  */\r
41 public class FilesPropertiesDialog extends AbstractPropertiesDialog {\r
42 \r
43         private final TristateCheckBox versionedCheck;\r
44 \r
45         private final List<FileResource> files;\r
46 \r
47         private Boolean initialVersioned;\r
48 \r
49 \r
50         /**\r
51          * The widget's constructor.\r
52          *\r
53          * @param _files\r
54          */\r
55         public FilesPropertiesDialog(final List<FileResource> _files) {\r
56                 super();\r
57 \r
58                 files = _files;\r
59                 int versionedNum = 0;\r
60                 for (FileResource fr : files)\r
61                         if (fr.isVersioned()) versionedNum++;\r
62                 Boolean versioned = null;\r
63                 if (versionedNum==0) versioned = false;\r
64                 if (versionedNum==files.size()) versioned = true;\r
65                 initialVersioned = versioned;\r
66                 versionedCheck = new TristateCheckBox(versioned);\r
67 \r
68                 // Set the dialog's caption.\r
69                 setText("Files properties");\r
70 \r
71                 // Outer contains inner and buttons.\r
72                 final VerticalPanel outer = new VerticalPanel();\r
73                 final FocusPanel focusPanel = new FocusPanel(outer);\r
74                 // Inner contains generalPanel and permPanel.\r
75                 inner = new DecoratedTabPanel();\r
76                 inner.setAnimationEnabled(true);\r
77                 final VerticalPanel generalPanel = new VerticalPanel();\r
78                 final HorizontalPanel buttons = new HorizontalPanel();\r
79                 final VerticalPanel verPanel = new VerticalPanel();\r
80                 final HorizontalPanel vPanel = new HorizontalPanel();\r
81 \r
82                 inner.add(generalPanel, "General");\r
83                 inner.add(verPanel, "Versions");\r
84                 inner.selectTab(0);\r
85 \r
86                 final FlexTable generalTable = new FlexTable();\r
87                 generalTable.setText(0, 0, String.valueOf(files.size())+" files selected");\r
88                 generalTable.setText(1, 0, "Folder");\r
89                 generalTable.setText(2, 0, "Tags");\r
90                 FileResource firstFile = files.get(0);\r
91                 if(firstFile.getFolderName() != null)\r
92                         generalTable.setText(1, 1, firstFile.getFolderName());\r
93                 else\r
94                         generalTable.setText(1, 1, "-");\r
95 \r
96                 // Find if tags are identical\r
97                 List<String> tagsList = files.get(0).getTags();\r
98                 List<String> tagss;\r
99                 for (int i=1; i<files.size(); i++) {\r
100                         tagss = files.get(i).getTags();\r
101                         if (tagsList.size() != tagss.size() || !tagsList.containsAll(tagss)) {\r
102                                 tagsList = null;\r
103                                 break;\r
104                         }\r
105                 }\r
106                 // Get the tags.\r
107                 StringBuffer tagsBuffer = new StringBuffer();\r
108                 if (tagsList==null)\r
109                         tagsBuffer.append(MULTIPLE_VALUES_TEXT);\r
110                 else {\r
111                         Iterator i = tagsList.iterator();\r
112                         while (i.hasNext()) {\r
113                                 String tag = (String) i.next();\r
114                                 tagsBuffer.append(tag).append(", ");\r
115                         }\r
116                         if (tagsBuffer.length() > 1)\r
117                                 tagsBuffer.delete(tagsBuffer.length() - 2, tagsBuffer.length() - 1);\r
118                 }\r
119                 initialTagText = tagsBuffer.toString();\r
120                 tags.setText(initialTagText);\r
121                 tags.addFocusHandler(new FocusHandler() {\r
122                         @Override\r
123                         public void onFocus(FocusEvent event) {\r
124                                 if (MULTIPLE_VALUES_TEXT.equals(tags.getText()))\r
125                                         tags.setText("");\r
126                         }\r
127                 }\r
128                 );\r
129 \r
130                 generalTable.setWidget(2, 1, tags);\r
131                 generalTable.getFlexCellFormatter().setStyleName(0, 0, "props-labels");\r
132                 generalTable.getFlexCellFormatter().setColSpan(0, 0, 2);\r
133                 generalTable.getFlexCellFormatter().setStyleName(1, 0, "props-labels");\r
134                 generalTable.getFlexCellFormatter().setStyleName(2, 0, "props-labels");\r
135                 generalTable.getFlexCellFormatter().setStyleName(0, 1, "props-values");\r
136                 generalTable.getFlexCellFormatter().setStyleName(1, 1, "props-values");\r
137                 generalTable.getFlexCellFormatter().setStyleName(2, 1, "props-values");\r
138                 generalTable.setCellSpacing(4);\r
139 \r
140                 // Create the 'OK' button, along with a listener that hides the dialog\r
141                 // when the button is clicked.\r
142                 final Button ok = new Button("OK", new ClickHandler() {\r
143                         @Override\r
144                         public void onClick(ClickEvent event) {\r
145                                 accept();\r
146                                 closeDialog();\r
147                         }\r
148                 });\r
149                 buttons.add(ok);\r
150                 buttons.setCellHorizontalAlignment(ok, HasHorizontalAlignment.ALIGN_CENTER);\r
151                 // Create the 'Cancel' button, along with a listener that hides the\r
152                 // dialog when the button is clicked.\r
153                 final Button cancel = new Button("Cancel", new ClickHandler() {\r
154                         @Override\r
155                         public void onClick(ClickEvent event) {\r
156                                 closeDialog();\r
157                         }\r
158                 });\r
159                 buttons.add(cancel);\r
160                 buttons.setCellHorizontalAlignment(cancel, HasHorizontalAlignment.ALIGN_CENTER);\r
161                 buttons.setSpacing(8);\r
162                 buttons.addStyleName("pithos-TabPanelBottom");\r
163 \r
164                 generalPanel.add(generalTable);\r
165 \r
166                 // Asynchronously retrieve the tags defined by this user.\r
167                 DeferredCommand.addCommand(new Command() {\r
168 \r
169                         @Override\r
170                         public void execute() {\r
171                                 updateTags();\r
172                         }\r
173                 });\r
174 \r
175                 DisclosurePanel allTags = new DisclosurePanel("All tags");\r
176                 allTagsContent = new FlowPanel();\r
177                 allTags.setContent(allTagsContent);\r
178                 generalPanel.add(allTags);\r
179                 generalPanel.setSpacing(4);\r
180 \r
181 \r
182                 vPanel.setCellHorizontalAlignment(cancel, HasHorizontalAlignment.ALIGN_CENTER);\r
183                 vPanel.setSpacing(8);\r
184                 vPanel.addStyleName("pithos-TabPanelBottom");\r
185                 vPanel.add(new Label("Versioned"));\r
186 \r
187                 vPanel.add(versionedCheck);\r
188                 verPanel.add(vPanel);\r
189                 outer.add(inner);\r
190                 outer.add(buttons);\r
191                 outer.setCellHorizontalAlignment(buttons, HasHorizontalAlignment.ALIGN_CENTER);\r
192                 outer.addStyleName("pithos-TabPanelBottom");\r
193 \r
194                 focusPanel.setFocus(true);\r
195                 setWidget(outer);\r
196         }\r
197 \r
198 \r
199         /**\r
200          * Accepts any change and updates the file\r
201          *\r
202          */\r
203         @Override\r
204         protected void accept() {\r
205                 JSONObject json = new JSONObject();\r
206                 if ( versionedCheck.getState()!=null && !versionedCheck.getState().equals(initialVersioned) )\r
207                                 json.put("versioned", JSONBoolean.getInstance(versionedCheck.getState()));\r
208 \r
209                 JSONArray taga = new JSONArray();\r
210                 int i = 0;\r
211                 String tagText = tags.getText();\r
212                 if (!MULTIPLE_VALUES_TEXT.equals(tagText) && !initialTagText.equals(tagText)) {\r
213                         String[] tagset = tagText.split(",");\r
214                         for (String t : tagset) {\r
215                                 JSONString to = new JSONString(t);\r
216                                 taga.set(i, to);\r
217                                 i++;\r
218                         }\r
219                         json.put("tags", taga);\r
220                 }\r
221                 String jsonString = json.toString();\r
222                 if(jsonString.equals("{}")){\r
223                         GWT.log("NO CHANGES", null);\r
224                         return;\r
225                 }\r
226                 final List<String> fileIds = new ArrayList<String>();\r
227                 for(FileResource f : files)\r
228                         fileIds.add(f.getUri()+"?update=");\r
229                 MultiplePostCommand rt = new MultiplePostCommand(fileIds.toArray(new String[0]), jsonString, 200){\r
230 \r
231                         @Override\r
232                         public void onComplete() {\r
233                                 GSS.get().getTreeView().refreshCurrentNode(false);\r
234                         }\r
235 \r
236                         @Override\r
237                         public void onError(String p, Throwable t) {\r
238                                 GWT.log("", t);\r
239                                 if(t instanceof RestException){\r
240                                         int statusCode = ((RestException)t).getHttpStatusCode();\r
241                                         if(statusCode == 405)\r
242                                                 GSS.get().displayError("You don't have the necessary permissions");\r
243                                         else if(statusCode == 404)\r
244                                                 GSS.get().displayError("File does not exist");\r
245                                         else if(statusCode == 409)\r
246                                                 GSS.get().displayError("A file with the same name already exists");\r
247                                         else if(statusCode == 413)\r
248                                                 GSS.get().displayError("Your quota has been exceeded");\r
249                                         else\r
250                                                 GSS.get().displayError("Unable to modify file::"+((RestException)t).getHttpStatusText());\r
251                                 }\r
252                                 else\r
253                                         GSS.get().displayError("System error modifying file:"+t.getMessage());\r
254                         }\r
255                 };\r
256                 DeferredCommand.addCommand(rt);\r
257         }\r
258 \r
259 \r
260 }\r