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 login window.
043     * 
044     * @author Tobias Kuhn
045     */
046    public class LoginWindow 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 PasswordField passwordField = new PasswordField(250, this);
054            private CheckBox stayLoggedInCheckBox = new CheckBox();
055            
056            /**
057             * Creates a new login window.
058             * 
059             * @param wiki The wiki instance.
060             */
061            public LoginWindow(Wiki wiki) {
062                    this.wiki = wiki;
063                    
064                    setTitle("Login");
065                    setTitleFont(new Font(Style.fontTypeface, Font.ITALIC, new Extent(13)));
066                    setModal(true);
067                    setWidth(new Extent(470));
068                    setHeight(new Extent(240));
069                    setResizable(false);
070                    setMovable(true);
071                    setClosable(!wiki.isLoginRequiredForViewing());
072                    setTitleBackground(Style.windowTitleBackground);
073                    setStyleName("Default");
074                    
075                    wiki.log("logi", "login window");
076    
077                    Grid mainGrid = new Grid(1);
078                    mainGrid.setInsets(new Insets(10, 10, 10, 0));
079                    mainGrid.setColumnWidth(0, new Extent(450));
080                    mainGrid.setRowHeight(0, new Extent(150));
081                    
082                    Column messageColumn = new Column();
083                    GridLayoutData layout1 = new GridLayoutData();
084                    layout1.setAlignment(new Alignment(Alignment.LEFT, Alignment.TOP));
085                    messageColumn.setLayoutData(layout1);
086                    Label label = new Label("Enter your username and password:");
087                    label.setFont(new Font(Style.fontTypeface, Font.ITALIC, new Extent(13)));
088                    messageColumn.add(label);
089                    messageColumn.add(new VSpace());
090                    
091                    Grid formGrid = new Grid(2);
092                    formGrid.setInsets(new Insets(10, 10, 10, 0));
093                    formGrid.add(new SolidLabel("username:", Font.ITALIC));
094                    formGrid.add(usernameField);
095                    usernameField.setText(wiki.getCookie("lastusername"));
096                    formGrid.add(new SolidLabel("password:", Font.ITALIC));
097                    formGrid.add(passwordField);
098                    formGrid.add(new SolidLabel("stay logged in:", Font.ITALIC));
099                    stayLoggedInCheckBox.setSelected(!wiki.getCookie("stayloggedin").equals("false"));
100                    formGrid.add(stayLoggedInCheckBox);
101                    messageColumn.add(formGrid);
102                    
103                    mainGrid.add(messageColumn);
104                    
105                    Row buttonBar = new Row();
106                    buttonBar.setCellSpacing(new Extent(10));
107                    buttonBar.setInsets(new Insets(0, 0, 0, 10));
108                    buttonBar.add(new GeneralButton("Login", 80, this));
109                    if (wiki.isUserRegistrationOpen()) {
110                            buttonBar.add(new GeneralButton("Register...", 80, this));
111                    }
112                    if (!wiki.isLoginRequiredForViewing()) {
113                            buttonBar.add(new GeneralButton("Cancel", 80, this));
114                    }
115                    GridLayoutData layout2 = new GridLayoutData();
116                    layout2.setAlignment(new Alignment(Alignment.CENTER, Alignment.BOTTOM));
117                    buttonBar.setLayoutData(layout2);
118                    mainGrid.add(buttonBar);
119                    
120                    add(mainGrid);
121                    
122                    if (usernameField.getText().length() == 0) {
123                            wiki.getApplication().setFocusedComponent(usernameField);
124                    } else {
125                            wiki.getApplication().setFocusedComponent(passwordField);
126                    }
127            }
128    
129            public void actionPerformed(ActionEvent e) {
130                    UserBase ub = wiki.getUserBase();
131                    String username = usernameField.getText();
132                    String password = passwordField.getText();
133                    boolean stayLoggedIn = stayLoggedInCheckBox.isSelected();
134                    if ("Cancel".equals(e.getActionCommand())) {
135                            wiki.log("logi", "login canceled");
136                            setVisible(false);
137                            wiki.removeWindow(this);
138                    } else if ("Register...".equals(e.getActionCommand())) {
139                            wiki.log("logi", "pressed: register...");
140                            wiki.showWindow(new RegisterWindow(username, password, stayLoggedIn, wiki));
141                            wiki.removeWindow(this);
142                    } else {
143                            wiki.log("logi", "pressed: login");
144                            User user = ub.login(username, password);
145                            if (user != null) {
146                                    wiki.log("logi", "correct password for " + username);
147                                    wiki.login(user, stayLoggedInCheckBox.isSelected());
148                                    wiki.removeWindow(this);
149                            } else {
150                                    wiki.log("logi", "incorrect username or password for " + username);
151                                    wiki.showWindow(new MessageWindow(
152                                                    "Error",
153                                                    "Invalid username or password!",
154                                                    "OK"
155                                            ));
156                            }
157                    }
158            }
159            
160    }