28aecefdae82c7e99383652ff6810d99317ef2ff
[pithos-web-client] / src / gr / grnet / pithos / web / client / PermissionsAddDialog.java
1 /*
2  * Copyright 2011-2012 GRNET S.A. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or
5  * without modification, are permitted provided that the following
6  * conditions are met:
7  *
8  *   1. Redistributions of source code must retain the above
9  *      copyright notice, this list of conditions and the following
10  *      disclaimer.
11  *
12  *   2. Redistributions in binary form must reproduce the above
13  *      copyright notice, this list of conditions and the following
14  *      disclaimer in the documentation and/or other materials
15  *      provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  *
30  * The views and conclusions contained in the software and
31  * documentation are those of the authors and should not be
32  * interpreted as representing official policies, either expressed
33  * or implied, of GRNET S.A.
34  */
35 package gr.grnet.pithos.web.client;
36
37 import gr.grnet.pithos.web.client.grouptree.Group;
38
39 import java.util.List;
40
41 import com.google.gwt.dom.client.NativeEvent;
42 import com.google.gwt.event.dom.client.ClickEvent;
43 import com.google.gwt.event.dom.client.ClickHandler;
44 import com.google.gwt.event.dom.client.KeyCodes;
45 import com.google.gwt.regexp.shared.RegExp;
46 import com.google.gwt.user.client.Event.NativePreviewEvent;
47 import com.google.gwt.user.client.ui.Anchor;
48 import com.google.gwt.user.client.ui.Button;
49 import com.google.gwt.user.client.ui.DialogBox;
50 import com.google.gwt.user.client.ui.FlexTable;
51 import com.google.gwt.user.client.ui.HasHorizontalAlignment;
52 import com.google.gwt.user.client.ui.ListBox;
53 import com.google.gwt.user.client.ui.RadioButton;
54 import com.google.gwt.user.client.ui.TextBox;
55 import com.google.gwt.user.client.ui.VerticalPanel;
56
57 public class PermissionsAddDialog extends DialogBox {
58
59         private TextBox userBox = new TextBox();
60
61         private ListBox groupBox = new ListBox();
62
63         private RadioButton read = new RadioButton("permissions");
64
65         private RadioButton write = new RadioButton("permissions");
66
67         private PermissionsList permList;
68
69         boolean userAdd;
70
71     private Pithos app;
72
73         public PermissionsAddDialog(Pithos _app, List<Group> _groups, PermissionsList _permList, boolean _userAdd) {
74         app = _app;
75                 userAdd = _userAdd;
76                 permList = _permList;
77
78                 Anchor close = new Anchor("close");
79                 close.addStyleName("close");
80                 close.addClickHandler(new ClickHandler() {
81                         
82                         @Override
83                         public void onClick(ClickEvent event) {
84                                 hide();
85                         }
86                 });
87                 setText("Add permission");
88                 setStyleName("pithos-DialogBox");
89
90         final VerticalPanel panel = new VerticalPanel();
91         panel.add(close);
92
93         VerticalPanel inner = new VerticalPanel();
94                 inner.addStyleName("inner");
95
96         final FlexTable permTable = new FlexTable();
97         permTable.setText(0, 0, "Users/Groups");
98         permTable.setText(0, 1, "Read Only");
99         permTable.setText(0, 2, "Read/Write");
100         permTable.getFlexCellFormatter().setStyleName(0, 0, "props-toplabels");
101         permTable.getFlexCellFormatter().setStyleName(0, 1, "props-toplabels");
102         permTable.getFlexCellFormatter().setStyleName(0, 2, "props-toplabels");
103
104         if (userAdd) {
105             permTable.setWidget(1, 0, userBox);
106         }
107         else {
108             for (Group group : _groups)
109                 groupBox.addItem(group.getName(), group.getName());
110             permTable.setWidget(1, 0, groupBox);
111         }
112                 
113         read.setValue(true);
114         permTable.setWidget(1, 1, read);
115         permTable.setWidget(1, 2, write);
116
117         permTable.getFlexCellFormatter().setStyleName(1, 0, "props-labels");
118         permTable.getFlexCellFormatter().setHorizontalAlignment(1, 1, HasHorizontalAlignment.ALIGN_CENTER);
119         permTable.getFlexCellFormatter().setHorizontalAlignment(1, 2, HasHorizontalAlignment.ALIGN_CENTER);
120         inner.add(permTable);
121
122         final Button ok = new Button("OK", new ClickHandler() {
123             @Override
124             public void onClick(ClickEvent event) {
125                 addPermission();
126                 hide();
127             }
128         });
129
130         ok.addStyleName("button");
131         inner.add(ok);
132
133         panel.add(inner);
134         panel.setCellHorizontalAlignment(inner, HasHorizontalAlignment.ALIGN_CENTER);
135         
136         setWidget(panel);
137         }
138
139         protected void addPermission() {
140         String selected = null;
141                 if (userAdd) {
142                         selected = userBox.getText().trim();
143                         RegExp emailValidator = RegExp.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+[.][A-Z]{2,4}$", "i");
144                         if (!emailValidator.test(selected)) {
145                                 app.displayWarning("Username must be a valid email address");
146                                 return;
147                         }
148                 } else if (groupBox.getSelectedIndex() > -1) {
149                         String groupName = groupBox.getValue(groupBox.getSelectedIndex());
150                         selected = app.getUserID() + ":" + groupName;
151                 }
152         if (permList.getPermissions().get(selected) != null) {
153             return;
154         }
155         if (selected == null || selected.length() == 0 || selected.equals(app.getUserID() + ":")) {
156                 app.displayWarning("You have to select a username or group");
157                 return;
158         }
159
160                 boolean readValue = read.getValue();
161                 boolean writeValue = write.getValue();
162
163                 permList.addPermission(selected, readValue, writeValue);
164         }
165
166         @Override
167         protected void onPreviewNativeEvent(NativePreviewEvent preview) {
168                 super.onPreviewNativeEvent(preview);
169
170                 NativeEvent evt = preview.getNativeEvent();
171                 if (evt.getType().equals("keydown"))
172                         // Use the popup's key preview hooks to close the dialog when either
173                         // enter or escape is pressed.
174                         switch (evt.getKeyCode()) {
175                                 case KeyCodes.KEY_ENTER:
176                                         addPermission();
177                                         hide();
178                                         break;
179                                 case KeyCodes.KEY_ESCAPE:
180                                         hide();
181                                         break;
182                         }
183         }
184
185
186         @Override
187         public void center() {
188                 super.center();
189                 if (userAdd)
190                         userBox.setFocus(true);
191         }
192 }