84dc9b482328595ab8d69c7bb66c1d330d87278f
[pithos] / web_client / src / gr / grnet / pithos / web / client / AbstractPropertiesDialog.java
1 /*\r
2  * Copyright 2011 GRNET S.A. All rights reserved.\r
3  *\r
4  * Redistribution and use in source and binary forms, with or\r
5  * without modification, are permitted provided that the following\r
6  * conditions are met:\r
7  *\r
8  *   1. Redistributions of source code must retain the above\r
9  *      copyright notice, this list of conditions and the following\r
10  *      disclaimer.\r
11  *\r
12  *   2. Redistributions in binary form must reproduce the above\r
13  *      copyright notice, this list of conditions and the following\r
14  *      disclaimer in the documentation and/or other materials\r
15  *      provided with the distribution.\r
16  *\r
17  * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS\r
18  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
20  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR\r
21  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
22  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
23  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF\r
24  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\r
25  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\r
27  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
28  * POSSIBILITY OF SUCH DAMAGE.\r
29  *\r
30  * The views and conclusions contained in the software and\r
31  * documentation are those of the authors and should not be\r
32  * interpreted as representing official policies, either expressed\r
33  * or implied, of GRNET S.A.\r
34  */\r
35 package gr.grnet.pithos.web.client;\r
36 \r
37 import gr.grnet.pithos.web.client.rest.GetCommand;\r
38 import gr.grnet.pithos.web.client.rest.resource.TagsResource;\r
39 \r
40 import java.util.List;\r
41 \r
42 import com.google.gwt.core.client.GWT;\r
43 import com.google.gwt.dom.client.NativeEvent;\r
44 import com.google.gwt.event.dom.client.ClickEvent;\r
45 import com.google.gwt.event.dom.client.ClickHandler;\r
46 import com.google.gwt.event.dom.client.KeyCodes;\r
47 import com.google.gwt.user.client.DeferredCommand;\r
48 import com.google.gwt.user.client.Event.NativePreviewEvent;\r
49 import com.google.gwt.user.client.ui.Anchor;\r
50 import com.google.gwt.user.client.ui.DialogBox;\r
51 import com.google.gwt.user.client.ui.FlowPanel;\r
52 import com.google.gwt.user.client.ui.Label;\r
53 import com.google.gwt.user.client.ui.TabPanel;\r
54 import com.google.gwt.user.client.ui.TextBox;\r
55 \r
56 /**\r
57  * Abstract class, parent of all 'File properties' dialog boxes.\r
58  *\r
59  */\r
60 public abstract class AbstractPropertiesDialog extends DialogBox {\r
61 \r
62         protected static final String MULTIPLE_VALUES_TEXT = "(Multiple values)";\r
63 \r
64         /**\r
65          * Text box with the tags associated with the file\r
66          */\r
67         protected TextBox tags = new TextBox();\r
68 \r
69         protected String initialTagText;\r
70 \r
71         /**\r
72          * A FlowPanel with all user tags\r
73          */\r
74         protected FlowPanel allTagsContent;\r
75 \r
76 \r
77         protected TabPanel inner = null;\r
78 \r
79         /**\r
80          * The widget's constructor.\r
81          *\r
82          */\r
83         public AbstractPropertiesDialog() {\r
84 \r
85                 // Enable IE selection for the dialog (must disable it upon closing it)\r
86                 GSS.enableIESelection();\r
87 \r
88                 setAnimationEnabled(true);\r
89 \r
90         }\r
91         /**\r
92          * Retrieves all user tags from the server and updates the FlowPanel\r
93          *\r
94          * @param userId\r
95          */\r
96         protected void updateTags() {\r
97                 GetCommand<TagsResource> tc = new GetCommand<TagsResource>(TagsResource.class, GSS.get().getCurrentUserResource().getTagsPath(),null) {\r
98 \r
99                         @Override\r
100                         public void onComplete() {\r
101                                 allTagsContent.clear();\r
102                                 TagsResource tagr = getResult();\r
103                                 List<String> userTags = tagr.getTags();\r
104                                 Anchor tag = null;\r
105                                 for(String usrTag : userTags){\r
106                                         tag = new Anchor(usrTag.toString(), false);\r
107                                         tag.addStyleName("pithos-tag");\r
108                                         allTagsContent.add(tag);\r
109                                         Label separator = new Label(", ");\r
110                                         separator.addStyleName("pithos-tag");\r
111                                         allTagsContent.add(separator);\r
112                                         tag.addClickHandler( new ClickHandler() {\r
113 \r
114                                                 @Override\r
115                                                 public void onClick(ClickEvent event) {\r
116                                                         String existing = tags.getText();\r
117                                                         if (MULTIPLE_VALUES_TEXT.equals(existing)) existing = "";\r
118                                                         String newTag = ((Anchor) event.getSource()).getText().trim();\r
119                                                         // insert the new tag only if it is not in the list\r
120                                                         // already\r
121                                                         if (existing.indexOf(newTag) == -1 && !existing.trim().endsWith(newTag))\r
122                                                                 tags.setText(existing.trim()\r
123                                                                                         + (existing.length() > 0 ? ", " : "")\r
124                                                                                         + newTag);\r
125                                                 }\r
126                                         });\r
127                                 }\r
128                         }\r
129 \r
130                         @Override\r
131                         public void onError(Throwable t) {\r
132                                 GWT.log("", t);\r
133                                 GSS.get().displayError("Unable to fetch user tags");\r
134                         }\r
135                 };\r
136                 DeferredCommand.addCommand(tc);\r
137 \r
138         }\r
139 \r
140         /**\r
141          * Accepts any change and updates the file\r
142          *\r
143          */\r
144         protected abstract void accept();\r
145 \r
146         @Override\r
147         @SuppressWarnings("fallthrough")\r
148         protected void onPreviewNativeEvent(NativePreviewEvent preview) {\r
149             super.onPreviewNativeEvent(preview);\r
150 \r
151             NativeEvent evt = preview.getNativeEvent();\r
152             if (evt.getType().equals("keydown"))\r
153                         // Use the popup's key preview hooks to close the dialog when either\r
154                           // enter or escape is pressed.\r
155                           switch (evt.getKeyCode()) {\r
156                             case KeyCodes.KEY_ENTER:\r
157                                 accept();\r
158                             case KeyCodes.KEY_ESCAPE:\r
159                               closeDialog();\r
160                               break;\r
161                           }\r
162           }\r
163 \r
164 \r
165 \r
166         public void selectTab(int _tab) {\r
167                 inner.selectTab(_tab);\r
168         }\r
169 \r
170 \r
171         /**\r
172          * Enables IE selection prevention and hides the dialog\r
173          * (we disable the prevention on creation of the dialog)\r
174          */\r
175         public void closeDialog() {\r
176                 GSS.preventIESelection();\r
177                 hide();\r
178         }\r
179 \r
180 }\r