/* Copyright (c) 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package sample.spreadsheet.gui;
import com.google.gdata.client.GoogleService.CaptchaRequiredException;
import com.google.gdata.client.spreadsheet.SpreadsheetService;
import com.google.gdata.util.AuthenticationException;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
/**
* A Swing window for logging in to Google Spreadsheets.
*
*
*/
public class LoginFrame extends JFrame {
/** The spreadsheet service. */
private SpreadsheetService service;
/** Field for entering username. */
private JTextField usernameField;
/** Field for entering password. */
private JPasswordField passwordField;
/** Image to display as a CAPTCHA (distorted letters to verify human). */
private JLabel captchaImage;
/** Place where user types the captcha answer. */
private JTextField captchaAnswerField;
/** Button to log in. */
private JButton submitButton;
/**
* The captcha token that is issued,
* null if there was no CAPTCHA challenge.
*/
private String captchaToken = null;
/**
* Starts out the login window, for a particular service and
* feed root, with initial username and password (these can
* be blank strings).
*/
public LoginFrame(SpreadsheetService service,
String username, String password) {
this.service = service;
initializeGui();
usernameField.setText(username);
passwordField.setText(password);
}
/**
* Try authenticating the user with the provided username and
* password.
*/
private boolean authenticate(
String username, String password) {
try {
if (captchaToken == null) {
// No CAPTCHA challenge was presented.
// Proceed to the next step.
service.setUserCredentials(username, password);
} else {
// Use the CAPTCHA token and answer to help the
// authentication.
service.setUserCredentials(username, password, captchaToken,
captchaAnswerField.getText());
}
return true;
} catch (CaptchaRequiredException e) {
// Get the CAPTCHA token and display the image.
captchaToken = e.getCaptchaToken();
try {
captchaImage.setIcon(new ImageIcon(new URL(e.getCaptchaUrl())));
captchaAnswerField.setText("(Please write the above letters here)");
} catch (IOException ioe) {
captchaImage.setText("(Error parsing captcha image URL)");
}
return false;
} catch (AuthenticationException e) {
SpreadsheetApiDemo.showErrorBox(e);
return false;
}
}
/**
* Handles the submit button being pressed.
*/
private void handleSubmitButton() {
String username = usernameField.getText();
String password = new String(passwordField.getPassword());
if (authenticate(username, password)) {
new ChooseSpreadsheetFrame(service);
dispose();
}
}
// ---- GUI code from here on down ----------------------------------------
/**
* Handles all clicks.
*/
private class ActionHandler implements ActionListener {
public void actionPerformed(ActionEvent ae) {
if (ae.getSource() == submitButton) {
handleSubmitButton();
}
}
}
/**
* Initializes all the GUI widgets.
*/
private void initializeGui() {
setTitle("Log in to Google Spreadsheets");
Container panel = getContentPane();
panel.setLayout(new BorderLayout());
JPanel topPanel = new JPanel();
topPanel.setLayout(new GridLayout(4, 1));
topPanel.add(new JLabel("Log in to Google Spreadsheets!"));
usernameField = new JTextField();
topPanel.add(usernameField);
passwordField = new JPasswordField();
topPanel.add(passwordField);
submitButton = new JButton("Log in!");
submitButton.addActionListener(new ActionHandler());
topPanel.add(submitButton);
panel.add(topPanel, BorderLayout.NORTH);
captchaImage = new JLabel("(A CAPTCHA may appear here)",
SwingConstants.CENTER);
panel.add(captchaImage, BorderLayout.CENTER);
captchaAnswerField = new JTextField();
captchaAnswerField.setText("(type captcha answer here)");
panel.add(captchaAnswerField, BorderLayout.SOUTH);
setSize(300, 240);
setVisible(true);
}
}