Statistics
| Branch: | Tag: | Revision:

root / src / gr / ebs / gss / client / FilesPropertiesDialog.java @ fc0fa492

History | View | Annotate | Download (9.1 kB)

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