001 // This file is part of AceWiki.
002 // Copyright 2008-2012, AceWiki developers.
003 //
004 // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU
005 // Lesser General Public License as published by the Free Software Foundation, either version 3 of
006 // the License, or (at your option) any later version.
007 //
008 // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
009 // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
010 // Lesser General Public License for more details.
011 //
012 // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If
013 // not, see http://www.gnu.org/licenses/.
014
015 package ch.uzh.ifi.attempto.acewiki.gui;
016
017 import nextapp.echo.app.Alignment;
018 import nextapp.echo.app.Column;
019 import nextapp.echo.app.Extent;
020 import nextapp.echo.app.Font;
021 import nextapp.echo.app.Grid;
022 import nextapp.echo.app.Insets;
023 import nextapp.echo.app.Row;
024 import nextapp.echo.app.WindowPane;
025 import nextapp.echo.app.event.ActionEvent;
026 import nextapp.echo.app.event.ActionListener;
027 import nextapp.echo.app.layout.GridLayoutData;
028 import ch.uzh.ifi.attempto.acewiki.Wiki;
029 import ch.uzh.ifi.attempto.acewiki.core.User;
030 import ch.uzh.ifi.attempto.acewiki.core.UserBase;
031 import ch.uzh.ifi.attempto.echocomp.CheckBox;
032 import ch.uzh.ifi.attempto.echocomp.GeneralButton;
033 import ch.uzh.ifi.attempto.echocomp.Label;
034 import ch.uzh.ifi.attempto.echocomp.MessageWindow;
035 import ch.uzh.ifi.attempto.echocomp.PasswordField;
036 import ch.uzh.ifi.attempto.echocomp.SolidLabel;
037 import ch.uzh.ifi.attempto.echocomp.Style;
038 import ch.uzh.ifi.attempto.echocomp.TextField;
039 import ch.uzh.ifi.attempto.echocomp.VSpace;
040
041 /**
042 * This class represents a window for the registration of a new user.
043 *
044 * @author Tobias Kuhn
045 */
046 public class RegisterWindow extends WindowPane implements ActionListener {
047
048 private static final long serialVersionUID = -6704597832001286479L;
049
050 private Wiki wiki;
051
052 private TextField usernameField = new TextField(250, this, Font.ITALIC);
053 private TextField emailField = new TextField(250, this, Font.ITALIC);
054 private PasswordField passwordField = new PasswordField(250, this);
055 private PasswordField retypePasswordField = new PasswordField(250, this);
056 private CheckBox stayLoggedInCheckBox = new CheckBox();
057
058 /**
059 * Creates a new registration window.
060 *
061 * @param username The default username (from the login window).
062 * @param password The default password (from the login window).
063 * @param stayLoggedIn The default value for staying logged in (from the login window).
064 * @param wiki The wiki instance.
065 */
066 public RegisterWindow(String username, String password, boolean stayLoggedIn, Wiki wiki) {
067 this.wiki = wiki;
068
069 usernameField.setText(username);
070 passwordField.setText(password);
071 stayLoggedInCheckBox.setSelected(stayLoggedIn);
072
073 setTitle("User Registration");
074 setTitleFont(new Font(Style.fontTypeface, Font.ITALIC, new Extent(13)));
075 setModal(true);
076 setWidth(new Extent(470));
077 setHeight(new Extent(290));
078 setResizable(false);
079 setMovable(true);
080 setClosable(!wiki.isLoginRequiredForViewing());
081 setTitleBackground(Style.windowTitleBackground);
082 setStyleName("Default");
083
084 wiki.log("logi", "registration window");
085
086 Grid mainGrid = new Grid(1);
087 mainGrid.setInsets(new Insets(10, 10, 10, 0));
088 mainGrid.setColumnWidth(0, new Extent(450));
089 mainGrid.setRowHeight(0, new Extent(200));
090
091 Column messageColumn = new Column();
092 GridLayoutData layout1 = new GridLayoutData();
093 layout1.setAlignment(new Alignment(Alignment.LEFT, Alignment.TOP));
094 messageColumn.setLayoutData(layout1);
095 Label label = new Label("Enter your data for registration:");
096 label.setFont(new Font(Style.fontTypeface, Font.ITALIC, new Extent(13)));
097 messageColumn.add(label);
098 messageColumn.add(new VSpace());
099
100 Grid formGrid = new Grid(2);
101 formGrid.setInsets(new Insets(10, 10, 10, 0));
102 formGrid.add(new SolidLabel("username:", Font.ITALIC));
103 formGrid.add(usernameField);
104 formGrid.add(new SolidLabel("email:", Font.ITALIC));
105 formGrid.add(emailField);
106 formGrid.add(new SolidLabel("password:", Font.ITALIC));
107 formGrid.add(passwordField);
108 formGrid.add(new SolidLabel("retype password:", Font.ITALIC));
109 formGrid.add(retypePasswordField);
110 formGrid.add(new SolidLabel("stay logged in:", Font.ITALIC));
111 formGrid.add(stayLoggedInCheckBox);
112 messageColumn.add(formGrid);
113
114 mainGrid.add(messageColumn);
115
116 Row buttonBar = new Row();
117 buttonBar.setCellSpacing(new Extent(10));
118 buttonBar.setInsets(new Insets(0, 0, 0, 10));
119 buttonBar.add(new GeneralButton("Register", 80, this));
120 buttonBar.add(new GeneralButton("Cancel", 80, this));
121 GridLayoutData layout2 = new GridLayoutData();
122 layout2.setAlignment(new Alignment(Alignment.CENTER, Alignment.BOTTOM));
123 buttonBar.setLayoutData(layout2);
124 mainGrid.add(buttonBar);
125
126 add(mainGrid);
127
128 wiki.getApplication().setFocusedComponent(usernameField);
129 }
130
131 public void actionPerformed(ActionEvent e) {
132 UserBase ub = wiki.getUserBase();
133 String username = usernameField.getText();
134 String password = passwordField.getText();
135 String password2 = retypePasswordField.getText();
136 String email = emailField.getText();
137 boolean stayLoggedIn = stayLoggedInCheckBox.isSelected();
138 if ("Cancel".equals(e.getActionCommand())) {
139 wiki.log("logi", "registration canceled");
140 setVisible(false);
141 wiki.removeWindow(this);
142 if (wiki.isLoginRequiredForViewing()) {
143 wiki.showLoginWindow();
144 }
145 } else {
146 wiki.log("logi", "pressed: register");
147 if (username.length() < 3 || username.length() > 20) {
148 wiki.log("logi", "invalid username");
149 wiki.showWindow(new MessageWindow(
150 "Error",
151 "Username needs between 3 and 20 characters.",
152 "OK"
153 ));
154 } else if (!username.matches("[a-zA-Z0-9'.][a-zA-Z0-9'._\\- ]*[a-zA-Z0-9'.]")) {
155 wiki.log("logi", "invalid username");
156 wiki.showWindow(new MessageWindow(
157 "Error",
158 "Username contains illegal characters.",
159 "OK"
160 ));
161 } else if (password.length() < 5) {
162 wiki.log("logi", "invalid password");
163 wiki.showWindow(new MessageWindow(
164 "Error",
165 "Password needs at least 5 characters.",
166 "OK"
167 ));
168 } else if (!password.equals(password2)) {
169 wiki.log("logi", "retype password does not match");
170 wiki.showWindow(new MessageWindow(
171 "Error",
172 "The two passwords do not match.",
173 "OK"
174 ));
175 } else if (email.indexOf("@") < 0) {
176 wiki.log("logi", "no email");
177 wiki.showWindow(new MessageWindow(
178 "Error",
179 "Please provide a valid email address.",
180 "OK"
181 ));
182 } else {
183 User user = ub.register(username, email, password);
184 if (user == null) {
185 wiki.log("logi", "username already taken: " + username);
186 wiki.showWindow(new MessageWindow(
187 "Error",
188 "Username is already taken.",
189 "OK"
190 ));
191 } else {
192 wiki.log("logi", "register successful for " + username);
193 wiki.login(user, stayLoggedIn);
194 wiki.removeWindow(this);
195 }
196 }
197 }
198 }
199
200 }