package org.docear.plugin.services.components.dialog;
import java.awt.AWTEvent;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.border.TitledBorder;
import org.docear.plugin.core.DocearController;
import org.docear.plugin.core.ui.MultiLineActionLabel;
import org.docear.plugin.core.ui.components.DocearLicensePanel;
import org.docear.plugin.services.ServiceController;
import org.docear.plugin.services.communications.CommunicationsController;
import org.docear.plugin.services.communications.features.DocearServiceException;
import org.docear.plugin.services.components.OverlayPasswordField;
import org.docear.plugin.services.components.OverlayTextField;
import org.freeplane.core.resources.ResourceController;
import org.freeplane.core.util.LogUtils;
import org.freeplane.core.util.TextUtils;
import org.freeplane.features.mode.Controller;
import com.jgoodies.forms.factories.FormFactory;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;
public class DocearIRChoiceDialogPanel extends JPanel {
private static final long serialVersionUID = 1L;
private JTextField txtUsername;
private JTextField txtEmail;
private JPasswordField pwdPassword;
private JPasswordField pwdRetypepasswd;
private boolean registrationNecessary = false;
private JCheckBox chckbxAllowbackup;
private JCheckBox chckbxAllowResearchContent;
private JCheckBox chckbxAllowIR;
private JCheckBox chckbxAllowResearchUsage;
boolean removed = false;
private JButton okButton;
private JRadioButton rdbtnRegister;
private JRadioButton rdbtnLogin;
private JLabel lblRetypePassword;
private JLabel lblEmail;
private List<ActionListener> listeners = new ArrayList<ActionListener>();
private final KeyListener keyListener = new KeyListener() {
public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}
public void keyPressed(final KeyEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
enableButtonIfPossible(e);
}
});
}
};
private final ActionListener actionListener = new ActionListener() {
public void actionPerformed(final ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
enableButtonIfPossible(e);
}
});
}
};
private JCheckBox chckbxAllowRecommendations;
private JLabel lblGender;
private JCheckBox chckbxSendnewsletter;
private JComboBox genderChooser;
private JLabel lblRequiredFields;
private JLabel lblBirthyear;
private JTextField txtBirthYear;
private JPanel lblMoreinfo;
private JLabel lblAdvice;
private JPanel LegalMattersPane;
private JScrollPane scrollPane;
private JTextArea txtrLicense;
private JPanel panel;
private JCheckBox chckbxAcceptTermsOfService;
private JPanel lblAcceptTermsOfService;
private JPanel panel_1;
private JCheckBox chckbxAcceptDataUsage;
private JPanel panel_2;
private JPanel lblAcceptDataUsageTerms;
private String adviceText1;
private String adviceText2;
public DocearIRChoiceDialogPanel(final boolean withoutLicense) {
setLayout(new FormLayout(new ColumnSpec[] {
FormFactory.RELATED_GAP_COLSPEC,
ColumnSpec.decode("default:grow"),
FormFactory.RELATED_GAP_COLSPEC,},
new RowSpec[] {
RowSpec.decode("fill:default"),
FormFactory.RELATED_GAP_ROWSPEC,
RowSpec.decode("fill:default"),
FormFactory.RELATED_GAP_ROWSPEC,
RowSpec.decode("top:default:grow"),
FormFactory.DEFAULT_ROWSPEC,}));
initOptionSection();
initUserDataSection();
initLegalMattersSection(withoutLicense);
adviceText1 = TextUtils.getText("docear.uploadchooser.advice1.text");
adviceText2 = TextUtils.getText("docear.uploadchooser.advice2.text");
lblAdvice = new JLabel(adviceText1);
lblAdvice.setForeground(Color.RED);
lblAdvice.setVerticalAlignment(SwingConstants.TOP);
lblAdvice.setFont(new Font("Tahoma", Font.BOLD, 11));
add(lblAdvice, "2, 6");
enableRegistration(isEmpty(txtUsername.getText()));
}
private void initLegalMattersSection(boolean withoutLicense) {
LegalMattersPane = new JPanel();
LegalMattersPane.setBorder(new TitledBorder(null, TextUtils.getText("docear.uploadchooser.section.legal_matters"), TitledBorder.LEADING, TitledBorder.TOP, null, null));
add(LegalMattersPane, "2, 5, fill, fill");
LegalMattersPane.setLayout(new FormLayout(new ColumnSpec[] {
ColumnSpec.decode("default:grow"),},
new RowSpec[] {
RowSpec.decode("default:grow"),
RowSpec.decode("default:grow"),
RowSpec.decode("default:grow"),}));
scrollPane = new JScrollPane();
LegalMattersPane.add(scrollPane, "1, 1, fill, fill");
txtrLicense = new JTextArea();
txtrLicense.setColumns(80);
txtrLicense.setRows(10);
txtrLicense.setLineWrap(true);
txtrLicense.setWrapStyleWord(true);
txtrLicense.setEditable(false);
txtrLicense.setFont(new Font("Monospaced", Font.PLAIN, 11));
txtrLicense.setText(DocearController.getController().getDataProcessingTerms());
scrollPane.setViewportView(txtrLicense);
panel_1 = new JPanel();
LegalMattersPane.add(panel_1, "1, 2, fill, fill");
panel_1.setLayout(new FormLayout(new ColumnSpec[] {
FormFactory.DEFAULT_COLSPEC,
ColumnSpec.decode("default:grow"),},
new RowSpec[] {
FormFactory.RELATED_GAP_ROWSPEC,
RowSpec.decode("top:default:grow"),}));
chckbxAcceptDataUsage = new JCheckBox();
chckbxAcceptDataUsage.addActionListener(actionListener);
panel_1.add(chckbxAcceptDataUsage, "1, 2");
final DocearLicensePanel licenseText = new DocearLicensePanel();
lblAcceptDataUsageTerms = /*new JPanel();//*/ new MultiLineActionLabel(TextUtils.getText("docear.uploadchooser.usage.accept.text"));
panel_1.add(lblAcceptDataUsageTerms, "2, 2, fill, fill");
panel = new JPanel();
LegalMattersPane.add(panel, "1, 3, fill, fill");
panel.setLayout(new FormLayout(new ColumnSpec[] {
FormFactory.DEFAULT_COLSPEC,
ColumnSpec.decode("default:grow"),},
new RowSpec[] {
RowSpec.decode("top:default:grow"),}));
chckbxAcceptTermsOfService = new JCheckBox();
chckbxAcceptTermsOfService.addActionListener(actionListener);
panel.add(chckbxAcceptTermsOfService, "1, 1");
lblAcceptTermsOfService = /*new JPanel();//*/ new MultiLineActionLabel(TextUtils.getText("docear.uploadchooser.licenses.accept.text"));
((MultiLineActionLabel) lblAcceptTermsOfService).addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if("tos".equals(e.getActionCommand())) {
licenseText.setLicenseText(DocearController.getController().getTermsOfUse());
JOptionPane.showConfirmDialog(DocearIRChoiceDialogPanel.this, licenseText, TextUtils.getText("docear.license.terms_of_use.title"), JOptionPane.PLAIN_MESSAGE, JOptionPane.PLAIN_MESSAGE, null);
return;
}
if("dps".equals(e.getActionCommand())) {
licenseText.setLicenseText(DocearController.getController().getDataPrivacyTerms());
JOptionPane.showConfirmDialog(DocearIRChoiceDialogPanel.this, licenseText, TextUtils.getText("docear.license.data_privacy.title"), JOptionPane.PLAIN_MESSAGE, JOptionPane.PLAIN_MESSAGE, null);
return;
}
}
});
panel.add(lblAcceptTermsOfService, "2, 1, fill, fill");
if(withoutLicense) {
chckbxAcceptDataUsage.setEnabled(false);
chckbxAcceptDataUsage.setSelected(true);
chckbxAcceptTermsOfService.setEnabled(false);
chckbxAcceptTermsOfService.setSelected(true);
}
}
private void initUserDataSection() {
JPanel userDataPane = new JPanel();
userDataPane.setBorder(new TitledBorder(null, TextUtils.getText("docear.uploadchooser.section.userdata"), TitledBorder.LEADING, TitledBorder.TOP, null, null));
add(userDataPane, "2, 3, fill, fill");
userDataPane.setLayout(new FormLayout(new ColumnSpec[] {
FormFactory.RELATED_GAP_COLSPEC,
ColumnSpec.decode("default:grow"),
FormFactory.RELATED_GAP_COLSPEC,
FormFactory.DEFAULT_COLSPEC,
FormFactory.RELATED_GAP_COLSPEC,
ColumnSpec.decode("default:grow"),
FormFactory.RELATED_GAP_COLSPEC,
FormFactory.DEFAULT_COLSPEC,
FormFactory.RELATED_GAP_COLSPEC,},
new RowSpec[] {
FormFactory.DEFAULT_ROWSPEC,
FormFactory.RELATED_GAP_ROWSPEC,
FormFactory.DEFAULT_ROWSPEC,
FormFactory.RELATED_GAP_ROWSPEC,
FormFactory.DEFAULT_ROWSPEC,
FormFactory.RELATED_GAP_ROWSPEC,
RowSpec.decode("default:grow"),
FormFactory.DEFAULT_ROWSPEC,}));
rdbtnLogin = new JRadioButton(TextUtils.getText("docear.uploadchooser.method.login"));
rdbtnLogin.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
enableRegistration(false);
enableButtonIfPossible(e);
}
});
userDataPane.add(rdbtnLogin, "2, 1, 3, 1");
rdbtnRegister = new JRadioButton(TextUtils.getText("docear.uploadchooser.method.register"));
rdbtnRegister.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
enableRegistration(true);
enableButtonIfPossible(e);
}
});
userDataPane.add(rdbtnRegister, "6, 1, 3, 1");
txtUsername = /*new JTextField(); //*/ new OverlayTextField(TextUtils.getText("docear.uploadchooser.username.label"));
txtUsername.setText(ResourceController.getResourceController().getProperty("docear.service.connect.username",""));
txtUsername.setForeground(new Color(txtUsername.getForeground().getRGB(), false));
txtUsername.setColumns(10);
txtUsername.addKeyListener(keyListener);
userDataPane.add(txtUsername, "2, 3");
JLabel lblUsername = new JLabel("*");
userDataPane.add(lblUsername, "4, 3");
pwdPassword = /*new JPasswordField(); //*/ new OverlayPasswordField(TextUtils.getText("docear.uploadchooser.passwd.label1"));
pwdPassword.addKeyListener(keyListener);
txtEmail = /*new JTextField(); //*/ new OverlayTextField(TextUtils.getText("docear.uploadchooser.mail.label"));
txtEmail.setColumns(10);
txtEmail.addKeyListener(keyListener);
userDataPane.add(txtEmail, "6, 3");
lblEmail = new JLabel("*");
userDataPane.add(lblEmail, "8, 3");
userDataPane.add(pwdPassword, "2, 5");
JLabel lblPassword = new JLabel("*");
userDataPane.add(lblPassword, "4, 5");
pwdRetypepasswd = /*new JPasswordField(); //*/ new OverlayPasswordField(TextUtils.getText("docear.uploadchooser.passwd.label2"));
pwdRetypepasswd.addKeyListener(keyListener);
userDataPane.add(pwdRetypepasswd, "6, 5");
lblRetypePassword = new JLabel("*");
userDataPane.add(lblRetypePassword, "8, 5");
chckbxSendnewsletter = new JCheckBox(TextUtils.getText("docear.uploadchooser.news.text"));
userDataPane.add(chckbxSendnewsletter, "2, 7, 3, 1");
chckbxSendnewsletter.setSelected(true);
panel_2 = new JPanel();
userDataPane.add(panel_2, "6, 7, 3, 1, fill, fill");
panel_2.setLayout(new FormLayout(new ColumnSpec[] {
FormFactory.DEFAULT_COLSPEC,
FormFactory.RELATED_GAP_COLSPEC,
FormFactory.DEFAULT_COLSPEC,
ColumnSpec.decode("4dlu:grow"),
FormFactory.DEFAULT_COLSPEC,
FormFactory.RELATED_GAP_COLSPEC,
FormFactory.DEFAULT_COLSPEC,},
new RowSpec[] {
FormFactory.RELATED_GAP_ROWSPEC,
FormFactory.DEFAULT_ROWSPEC,}));
lblBirthyear = new JLabel(TextUtils.getText("docear.uploadchooser.birthyear.label"));
lblBirthyear.setHorizontalAlignment(SwingConstants.RIGHT);
panel_2.add(lblBirthyear, "1, 2");
txtBirthYear = new JTextField();
panel_2.add(txtBirthYear, "3, 2");
txtBirthYear.setHorizontalAlignment(SwingConstants.RIGHT);
txtBirthYear.addKeyListener(new KeyListener() {
public void keyTyped(KeyEvent e) {
if(e.getKeyChar() >= 32 && !(txtBirthYear.getText().length() < 4 && e.getKeyChar() <= '9' && e.getKeyChar() >= '0')) {
e.consume();
}
}
public void keyReleased(KeyEvent e) {}
public void keyPressed(KeyEvent e) {}
});
txtBirthYear.setColumns(4);
lblGender = new JLabel(TextUtils.getText("docear.uploadchooser.gender.label"));
lblGender.setHorizontalAlignment(SwingConstants.RIGHT);
panel_2.add(lblGender, "5, 2");
genderChooser = new JComboBox(new Object[] {"",TextUtils.getText("docear.uploadchooser.gender.male"),TextUtils.getText("docear.uploadchooser.gender.female")});
panel_2.add(genderChooser, "7, 2");
genderChooser.setEditable(false);
lblRequiredFields = new JLabel("* "+TextUtils.getText("docear.uploadchooser.required.text"));
lblRequiredFields.setFont(new Font("Tahoma", Font.BOLD, 9));
userDataPane.add(lblRequiredFields, "2, 8, 6, 1");
}
private void initOptionSection() {
JPanel uploadPanel = new JPanel();
uploadPanel.setBorder(new TitledBorder(null, TextUtils.getText("docear.uploadchooser.section.upload"), TitledBorder.LEADING, TitledBorder.TOP, null, null));
add(uploadPanel, "2, 1, fill, fill");
uploadPanel.setLayout(new FormLayout(new ColumnSpec[] {
FormFactory.RELATED_GAP_COLSPEC,
ColumnSpec.decode("left:default:grow"),
FormFactory.RELATED_GAP_COLSPEC,
ColumnSpec.decode("default:grow"),
FormFactory.RELATED_GAP_COLSPEC,
ColumnSpec.decode("default:grow"),
FormFactory.RELATED_GAP_COLSPEC,
ColumnSpec.decode("default:grow"),
FormFactory.RELATED_GAP_COLSPEC,
ColumnSpec.decode("left:default:grow"),},
new RowSpec[] {
FormFactory.DEFAULT_ROWSPEC,
FormFactory.RELATED_GAP_ROWSPEC,
FormFactory.DEFAULT_ROWSPEC,}));
chckbxAllowbackup = new JCheckBox(TextUtils.getText("docear.uploadchooser.ckbx.backup"));
chckbxAllowbackup.setSelected(Boolean.parseBoolean(ResourceController.getResourceController().getProperty(ServiceController.DOCEAR_SAVE_BACKUP, "false")));
chckbxAllowbackup.addActionListener(actionListener);
uploadPanel.add(chckbxAllowbackup, "2, 1");
int irNumber = Integer.parseInt(ResourceController.getResourceController().getProperty(ServiceController.DOCEAR_INFORMATION_RETRIEVAL, "13"));
chckbxAllowRecommendations = new JCheckBox(TextUtils.getText("docear.uploadchooser.ckbx.recommendations"));
chckbxAllowRecommendations.addActionListener(actionListener);
chckbxAllowRecommendations.setSelected((irNumber&ServiceController.ALLOW_RECOMMENDATIONS) > 0);
uploadPanel.add(chckbxAllowRecommendations, "4, 1");
chckbxAllowResearchContent = new JCheckBox(TextUtils.getText("docear.uploadchooser.ckbx.research.content"));
chckbxAllowResearchContent.setSelected((irNumber&ServiceController.ALLOW_RESEARCH) > 0);
chckbxAllowResearchContent.addActionListener(actionListener);
uploadPanel.add(chckbxAllowResearchContent, "6, 1");
chckbxAllowIR = new JCheckBox(TextUtils.getText("docear.uploadchooser.ckbx.ir.content"));
chckbxAllowIR.setSelected((irNumber&ServiceController.ALLOW_INFORMATION_RETRIEVAL) > 0);
chckbxAllowIR.addActionListener(actionListener);
chckbxAllowResearchUsage = new JCheckBox(TextUtils.getText("docear.uploadchooser.ckbx.research.usage"));
chckbxAllowResearchUsage.setSelected((irNumber&ServiceController.ALLOW_USAGE_MINING) > 0);
chckbxAllowResearchUsage.addActionListener(actionListener);
uploadPanel.add(chckbxAllowResearchUsage, "8, 1");
uploadPanel.add(chckbxAllowIR, "10, 1");
lblMoreinfo = new MultiLineActionLabel(TextUtils.getText("docear.uploadchooser.more.text"));
((MultiLineActionLabel)lblMoreinfo).addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if("more info".equals(e.getActionCommand())) {
try {
Controller.getCurrentController().getViewController().openDocument(new URI("http://www.docear.org/give-back/share-your-data/"));
}
catch (Exception e1) {
LogUtils.warn("could not open link to \"more info\"!");
}
}
}
});
((MultiLineActionLabel)lblMoreinfo).setHorizontalAlignment(MultiLineActionLabel.RIGHT);
uploadPanel.add(lblMoreinfo, "8, 3, 3, 1");
}
public void addActionListener(ActionListener listener) {
if(listeners.contains(listener)) {
return;
}
listeners.add(listener);
}
public void removeActionListener(ActionListener listener) {
listeners.remove(listener);
}
public final boolean useRegistration() {
return this.registrationNecessary;
}
public final String getUserName() {
return txtUsername.getText();
}
public final String getEmail() {
return txtEmail.getText();
}
public final boolean allowBackup() {
return chckbxAllowbackup.isSelected();
}
public final boolean allowContentResearch() {
return chckbxAllowResearchContent.isSelected();
}
public final boolean allowInformationRetrieval() {
return chckbxAllowIR.isSelected();
}
public final boolean allowUsageResearch() {
return chckbxAllowResearchUsage.isSelected();
}
public final boolean allowRecommendations() {
return chckbxAllowRecommendations.isSelected();
}
public final boolean wantsNewsletter() {
return chckbxSendnewsletter.isSelected();
}
public final Boolean isMale() {
if(genderChooser.getSelectedIndex() == 1) {
return true;
}
else if(genderChooser.getSelectedIndex() == 2) {
return false;
}
return null;
}
public final String getPassword() throws DocearServiceException {
String pwd = new String(pwdPassword.getPassword());
if(registrationNecessary && !pwd.equals(new String(pwdRetypepasswd.getPassword()))) {
throw new DocearServiceException(TextUtils.getText("docear.uploadchooser.warning.not_matching_passwords"));
}
return new String(pwdPassword.getPassword());
}
public void integrateButtons(final JButton[] buttons) {
okButton = buttons[0];
enableButtonIfPossible(null);
for(int i=0; i < buttons.length; i++) {
final int id = i;
buttons[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//closeDialogManually();
fireActionEvent(buttons[id] ,id, "");
}
});
}
}
private void fireActionEvent(Object source, int id, String command) {
final ActionEvent event = new ActionEvent(this, id, command);
if(listeners.size() <= 0 ) {
Container cont = getParent();
while(!(cont instanceof JOptionPane)) {
cont = cont.getParent();
}
((JOptionPane)cont).setValue(source);
close();
}
else {
new Thread() {
public void run() {
for(ActionListener listener : listeners) {
listener.actionPerformed(event);
}
}
}.start();
}
}
public void clearUserData() {
pwdPassword.setText("");
pwdRetypepasswd.setText("");
enableButtonIfPossible(null);
}
public void close() {
closeDialogManually();
}
private void closeDialogManually() {
Container container = getParent();
while(!(container instanceof JDialog)) {
container = container.getParent();
}
((JDialog)container).dispose();
}
private void enableButtonIfPossible(AWTEvent event) {
if(okButton != null) {
lblAdvice.setText(adviceText2);
lblAdvice.setOpaque(true);
if(!chckbxAcceptDataUsage.isSelected() || !chckbxAcceptTermsOfService.isSelected()) {
okButton.setEnabled(false);
lblAdvice.setText(adviceText1);
lblAdvice.setForeground(new Color(0xFFFF0000, true));
}
else
if(chckbxAllowbackup.isSelected()) {
if(rdbtnLogin.isSelected() && txtUsername.getText().trim().length() > 0 && !isEmpty(CommunicationsController.getController().getRegisteredAccessToken())) {
okButton.setEnabled(true);
lblAdvice.setForeground(new Color(0x00000000, true));
}
else if(rdbtnLogin.isSelected() && txtUsername.getText().trim().length() > 0 && pwdPassword.getPassword() != null && pwdPassword.getPassword().length > 0) {
okButton.setEnabled(true);
lblAdvice.setForeground(new Color(0x00000000, true));
}
else if(rdbtnRegister.isSelected() && txtUsername.getText().trim().length() > 0 && pwdPassword.getPassword().length > 0 && txtEmail.getText().trim().length() > 0 && pwdRetypepasswd.getPassword().length > 0 ) {
okButton.setEnabled(true);
lblAdvice.setForeground(new Color(0x00000000, true));
}
else {
okButton.setEnabled(false);
lblAdvice.setForeground(new Color(0xFFFF0000, true));
}
} else {
if((chckbxAllowIR.isSelected() || chckbxAllowResearchContent.isSelected() || chckbxAllowResearchUsage.isSelected())) {
okButton.setEnabled(true);
lblAdvice.setForeground(new Color(0x00000000, true));
}
else if(!chckbxAllowIR.isSelected() && !chckbxAllowResearchContent.isSelected() && !chckbxAllowResearchUsage.isSelected() && !chckbxAllowbackup.isSelected()) {
okButton.setEnabled(true);
lblAdvice.setForeground(new Color(0x00000000, true));
}
else {
okButton.setEnabled(false);
lblAdvice.setForeground(new Color(0xFFFF0000, true));
}
}
}
}
public JButton getOkButton() {
return okButton;
}
public void enableRegistration(boolean enabled) {
rdbtnRegister.setSelected(enabled);
rdbtnLogin.setSelected(!enabled);
lblRetypePassword.setEnabled(enabled);
pwdRetypepasswd.setEnabled(enabled);
lblEmail.setEnabled(enabled);
txtEmail.setEnabled(enabled);
lblGender.setEnabled(enabled);
genderChooser.setEnabled(enabled);
chckbxSendnewsletter.setEnabled(enabled);
lblBirthyear.setEnabled(enabled);
txtBirthYear.setEnabled(enabled);
registrationNecessary = enabled;
}
public int getIrCode() {
int code = 0;
if (allowContentResearch()) {
code += ServiceController.ALLOW_RESEARCH;
}
if (allowInformationRetrieval()) {
code += ServiceController.ALLOW_INFORMATION_RETRIEVAL;
}
if (allowUsageResearch()) {
code += ServiceController.ALLOW_USAGE_MINING;
}
if (allowRecommendations()) {
code += ServiceController.ALLOW_RECOMMENDATIONS;
}
return code;
}
private boolean isEmpty(String s) {
return s==null || s.trim().length()==0;
}
public Integer getBirthYear() {
try {
return new Integer(txtBirthYear.getText());
}
catch(Exception e) {
}
return null;
}
}