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.echocomp.GeneralButton;
031 import ch.uzh.ifi.attempto.echocomp.Label;
032 import ch.uzh.ifi.attempto.echocomp.MessageWindow;
033 import ch.uzh.ifi.attempto.echocomp.PasswordField;
034 import ch.uzh.ifi.attempto.echocomp.SolidLabel;
035 import ch.uzh.ifi.attempto.echocomp.Style;
036 import ch.uzh.ifi.attempto.echocomp.TextField;
037 import ch.uzh.ifi.attempto.echocomp.VSpace;
038
039 /**
040 * This class represents a window with information about the current user.
041 *
042 * @author Tobias Kuhn
043 */
044 public class UserWindow extends WindowPane implements ActionListener {
045
046 private static final long serialVersionUID = -6704597832001286479L;
047
048 private Wiki wiki;
049 private User user;
050
051 private TextField emailField = new TextField(220, this, Font.ITALIC);
052 private PasswordField passwordField = new PasswordField(220, this);
053 private PasswordField newPasswordField = new PasswordField(220, this);
054 private PasswordField retypePasswordField = new PasswordField(220, this);
055
056 private Row buttonBar;
057
058 /**
059 * Creates a new user window.
060 *
061 * @param wiki The wiki instance.
062 */
063 public UserWindow(Wiki wiki) {
064 this.wiki = wiki;
065 this.user = wiki.getUser();
066
067 setTitle("User: " + user.getName());
068 setTitleFont(new Font(Style.fontTypeface, Font.ITALIC, new Extent(13)));
069 setModal(true);
070 setWidth(new Extent(470));
071 setHeight(new Extent(360));
072 setResizable(false);
073 setMovable(true);
074 setTitleBackground(Style.windowTitleBackground);
075 setStyleName("Default");
076
077 wiki.log("logi", "registration window");
078
079 Grid mainGrid = new Grid(1);
080 mainGrid.setInsets(new Insets(10, 10, 10, 0));
081 mainGrid.setColumnWidth(0, new Extent(450));
082 mainGrid.setRowHeight(0, new Extent(270));
083
084 Column messageColumn = new Column();
085 GridLayoutData layout1 = new GridLayoutData();
086 layout1.setAlignment(new Alignment(Alignment.LEFT, Alignment.TOP));
087 messageColumn.setLayoutData(layout1);
088 Label label = new Label("Your personal information:");
089 label.setFont(new Font(Style.fontTypeface, Font.ITALIC, new Extent(13)));
090 messageColumn.add(label);
091 messageColumn.add(new VSpace());
092
093 Grid formGrid = new Grid(2);
094 formGrid.setInsets(new Insets(10, 10, 10, 0));
095 formGrid.add(new SolidLabel("username:", Font.ITALIC));
096 formGrid.add(new SolidLabel(user.getName(), Font.ITALIC));
097 formGrid.add(new SolidLabel("registration:", Font.ITALIC));
098 formGrid.add(new SolidLabel(user.getUserData("registerdate"), Font.ITALIC));
099 formGrid.add(new SolidLabel("number of sessions:", Font.ITALIC));
100 formGrid.add(new SolidLabel(user.getUserData("logincount"), Font.ITALIC));
101 formGrid.add(new SolidLabel("email:", Font.ITALIC));
102 emailField.setText(user.getUserData("email"));
103 emailField.setEnabled(false);
104 formGrid.add(emailField);
105 formGrid.add(new SolidLabel("current password:", Font.ITALIC));
106 passwordField.setText("***************");
107 passwordField.setEnabled(false);
108 formGrid.add(passwordField);
109 formGrid.add(new SolidLabel("new password:", Font.ITALIC));
110 newPasswordField.setEnabled(false);
111 formGrid.add(newPasswordField);
112 formGrid.add(new SolidLabel("retype new password:", Font.ITALIC));
113 retypePasswordField.setEnabled(false);
114 formGrid.add(retypePasswordField);
115 messageColumn.add(formGrid);
116
117 mainGrid.add(messageColumn);
118
119 buttonBar = new Row();
120 buttonBar.setCellSpacing(new Extent(10));
121 buttonBar.setInsets(new Insets(0, 0, 0, 10));
122 buttonBar.add(new GeneralButton("Unlock", 80, this));
123 buttonBar.add(new GeneralButton("Close", 80, this));
124 GridLayoutData layout2 = new GridLayoutData();
125 layout2.setAlignment(new Alignment(Alignment.CENTER, Alignment.BOTTOM));
126 buttonBar.setLayoutData(layout2);
127 mainGrid.add(buttonBar);
128
129 add(mainGrid);
130 }
131
132 public void actionPerformed(ActionEvent e) {
133 String password = passwordField.getText();
134 String newPassword = newPasswordField.getText();
135 String newPassword2 = retypePasswordField.getText();
136 String email = emailField.getText();
137 if ("Cancel".equals(e.getActionCommand()) || "Close".equals(e.getActionCommand())) {
138 wiki.log("logi", "registration canceled");
139 setVisible(false);
140 wiki.removeWindow(this);
141 } else if ("Unlock".equals(e.getActionCommand())) {
142 emailField.setEnabled(true);
143 passwordField.setEnabled(true);
144 passwordField.setText("");
145 newPasswordField.setEnabled(true);
146 retypePasswordField.setEnabled(true);
147 buttonBar.removeAll();
148 buttonBar.add(new GeneralButton("Change", 80, this));
149 buttonBar.add(new GeneralButton("Cancel", 80, this));
150 wiki.getApplication().setFocusedComponent(emailField);
151 } else {
152 wiki.log("logi", "pressed: change user data");
153 if (!user.isCorrectPassword(password)) {
154 wiki.log("logi", "invalid password");
155 if (password.length() == 0) {
156 wiki.showWindow(new MessageWindow(
157 "Error",
158 "You have to enter your current password to apply the changes.",
159 "OK"
160 ));
161 } else {
162 wiki.showWindow(new MessageWindow(
163 "Error",
164 "The password is not correct.",
165 "OK"
166 ));
167 }
168 } else if (newPassword.length() > 0 && newPassword.length() < 5) {
169 wiki.log("logi", "invalid new password");
170 wiki.showWindow(new MessageWindow(
171 "Error",
172 "Password needs at least 5 characters.",
173 "OK"
174 ));
175 } else if (!newPassword.equals(newPassword2)) {
176 wiki.log("logi", "retype password does not match");
177 wiki.showWindow(new MessageWindow(
178 "Error",
179 "The two passwords do not match.",
180 "OK"
181 ));
182 } else if (email.indexOf("@") < 0) {
183 wiki.log("logi", "no email");
184 wiki.showWindow(new MessageWindow(
185 "Error",
186 "Please provide a valid email address.",
187 "OK"
188 ));
189 } else {
190 user.setUserData("email", email);
191 if (newPassword.length() > 0) {
192 user.changePassword(password, newPassword);
193 }
194 wiki.removeWindow(this);
195 }
196 }
197 }
198
199 }