net.sourceforge.squirrel_sql.plugins.firebirdmanager.gui.FirebirdManagerUserManagerFrame.java Source code

Java tutorial

Introduction

Here is the source code for net.sourceforge.squirrel_sql.plugins.firebirdmanager.gui.FirebirdManagerUserManagerFrame.java

Source

/*
 * Copyright (C) 2008 Michael Romankiewicz
 * microm at users.sourceforge.net
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
package net.sourceforge.squirrel_sql.plugins.firebirdmanager.gui;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import net.sourceforge.squirrel_sql.client.IApplication;
import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.DialogWidget;
import net.sourceforge.squirrel_sql.fw.util.StringManager;
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
import net.sourceforge.squirrel_sql.fw.util.log.ILogger;
import net.sourceforge.squirrel_sql.fw.util.log.LoggerController;
import net.sourceforge.squirrel_sql.plugins.firebirdmanager.FirebirdManagerHelper;
import net.sourceforge.squirrel_sql.plugins.firebirdmanager.pref.FirebirdManagerPreferenceBean;
import net.sourceforge.squirrel_sql.plugins.firebirdmanager.pref.FirebirdManagerUsersPreferenceBean;
import net.sourceforge.squirrel_sql.plugins.firebirdmanager.pref.PreferencesManager;
import org.firebirdsql.gds.GDSException;
import org.firebirdsql.gds.IscSvcHandle;
import org.firebirdsql.management.FBUser;
import org.firebirdsql.management.FBUserManager;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;

public class FirebirdManagerUserManagerFrame extends DialogWidget
        implements IFirebirdManagerFrame, ActionListener, KeyListener, ListSelectionListener {
    private static final long serialVersionUID = 7592543018317340170L;

    private final String CR = System.getProperty("line.separator", "\n");
    private final int TABLE_USERS_COL_USERNAME = 0;
    private final int TABLE_USERS_COL_USERID = 1;
    private final int TABLE_USERS_COL_GROUPID = 2;
    private final int TABLE_USERS_COL_FIRSTNAME = 3;
    private final int TABLE_USERS_COL_MIDDLENAME = 4;
    private final int TABLE_USERS_COL_LASTNAME = 5;
    private final int UNIQUE_USER = 0;
    private final int USERNAME_EXISTS = 1;
    private final int USERID_EXISTS = 2;

    // variables
    // ========================================================================
    // non visible
    // ------------------------------------------------------------------------
    // Logger for this class
    private final static ILogger log = LoggerController.createLogger(FirebirdManagerUserManagerFrame.class);

    private static final StringManager stringManager = StringManagerFactory
            .getStringManager(FirebirdManagerUserManagerFrame.class);
    // global references
    private FirebirdManagerPreferenceBean firebirdPreferencesBean;
    // session preferences
    private FirebirdManagerUsersPreferenceBean sessionPreferencesBean = null;
    // display mode
    private int mode = FirebirdManagerHelper.DISPLAY_MODE;
    // read map with users
    private Map<String, FBUser> mapUsers = null;
    // usermanager of jaybird
    private FBUserManager fbUserManager = new FBUserManager();
    // handle of connected server
    private IscSvcHandle iscSvcHandle = null;
    // table data objects
    private Vector<Vector<Object>> vecTableUsers = null;
    private Vector<String> vecTableUsersHeader = null;

    // visible (gui)
    // ------------------------------------------------------------------------
    private JButton btnNew = new JButton();
    private JButton btnEdit = new JButton();
    private JButton btnSave = new JButton();
    private JButton btnCancel = new JButton();
    private JButton btnDelete = new JButton();
    private JTextField jtextfieldManagerUsername = new JTextField();
    private JLabel lblManagerUsername = new JLabel();
    private JLabel lblManagerPassword = new JLabel();
    private JLabel lblManagerTitle = new JLabel();
    private JLabel lblServer = new JLabel();
    private JTextField jtextfieldServer = new JTextField();
    private JLabel lblPort = new JLabel();
    private JCheckBox jcheckboxConnectToServer = new JCheckBox();
    private JTextField jtextfieldPort = new JTextField();
    private JPasswordField jpasswordfieldManager = new JPasswordField();
    private JTable jtableUsers = new JTable(new DefaultTableModel());
    private JLabel lblUsername = new JLabel();
    private JLabel lblPassword1 = new JLabel();
    private JLabel lblPassword2 = new JLabel();
    private JLabel lblFirstName = new JLabel();
    private JTextField jtextfieldUsername = new JTextField();
    private JLabel lblUserId = new JLabel();
    private JLabel lblGroupId = new JLabel();
    private JTextField jtextfieldUserId = new JTextField();
    private JTextField jtextfieldGroupId = new JTextField();
    private JTextField jtextfieldFirstName = new JTextField();
    private JPasswordField jpasswordField1 = new JPasswordField();
    private JPasswordField jpasswordField2 = new JPasswordField();
    private JLabel lblMiddleName = new JLabel();
    private JTextField jtextfieldMiddleName = new JTextField();
    private JLabel lblLastName = new JLabel();
    private JTextField jtextfieldLastName = new JTextField();
    private IApplication _application;

    /**
      * Constructor
      * @param application
      */
    public FirebirdManagerUserManagerFrame(IApplication application) {
        super("Firebird manager - " + stringManager.getString("usermanager.title"), true, true, true, true,
                application);
        _application = application;

        initLayout();

        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        this.setVisible(true);
        this.moveToFront();
    }

    private interface i18n {
        // Labels
        String LBL_BTN_NEW = stringManager.getString("global.lbl.btn.new");
        String LBL_BTN_EDIT = stringManager.getString("global.lbl.btn.edit");
        String LBL_BTN_SAVE = stringManager.getString("global.lbl.btn.save");
        String LBL_BTN_CANCEL = stringManager.getString("global.lbl.btn.cancel");
        String LBL_BTN_DELETE = stringManager.getString("global.lbl.btn.delete");

        String LBL_MANAGER_TITLE = stringManager.getString("usermanager.lbl.manager.title");
        String LBL_MANAGER_SERVER = stringManager.getString("usermanager.lbl.manager.server");
        String LBL_MANAGER_PORT = stringManager.getString("usermanager.lbl.manager.port");
        String LBL_MANAGER_CONECTED = stringManager.getString("usermanager.lbl.manager.connected");
        String LBL_MANAGER_USERNAME = stringManager.getString("usermanager.lbl.manager.username");
        String LBL_MANAGER_PASSWORD = stringManager.getString("usermanager.lbl.manager.password");

        String LBL_USERS_USERNAME = stringManager.getString("usermanager.lbl.username");
        String LBL_USERS_USERID = stringManager.getString("usermanager.lbl.userid");
        String LBL_USERS_GROUPID = stringManager.getString("usermanager.lbl.groupid");
        String LBL_USERS_PASSWORD = stringManager.getString("usermanager.lbl.password");
        String LBL_USERS_PASSWORD_CONFIRM = stringManager.getString("usermanager.lbl.password.confirm");
        String LBL_USERS_FIRSTNAME = stringManager.getString("usermanager.lbl.firstname");
        String LBL_USERS_MIDDLENAME = stringManager.getString("usermanager.lbl.middlename");
        String LBL_USERS_LASTNAME = stringManager.getString("usermanager.lbl.lastname");

        // Tooltips and questions
        String TOOLTIP_USERNAME = stringManager.getString("usermanager.tooltip.username");
        String TOOLTIP_PASSWORD = stringManager.getString("usermanager.tooltip.password");

        // Questions
        String QUESTION_TITLE_DELETE_USER = stringManager.getString("rolemanager.question.title.delete.user");
        String QUESTION_DELETE_USER = stringManager.getString("usermanager.question.delete.user");

        // Errors
        String ERROR_CANNOT_CONNECT_SERVER = stringManager.getString("usermanager.error.cannot.connect.server");
        String ERROR_CANNOT_DISCONNECT_SERVER = stringManager
                .getString("usermanager.error.cannot.disconnect.server");
        String ERROR_USERNAME_MISSING = stringManager.getString("usermanager.error.username.missing");
        String ERROR_USERNAME_MAXLENGTH = stringManager.getString("usermanager.error.username.maxlength");
        String ERROR_PASSWORD_MISSING = stringManager.getString("usermanager.error.password.missing");
        String ERROR_PASSWORD_DIFFERENCES = stringManager.getString("usermanager.error.passwords.differences");
        String ERROR_PASSWORD_MAXLENGTH = stringManager.getString("usermanager.error.password.maxlength");
        String ERROR_NO_NUMBER = stringManager.getString("usermanager.error.no.number");

        String ERROR_USERNAME_EXISTS = stringManager.getString("usermanager.error.username.exists");
        String ERROR_USERID_EXISTS = stringManager.getString("usermanager.error.userid.exists");
        String ERROR_SAVE_USER = stringManager.getString("usermanager.error.save.user");
        String ERROR_DELETE_USER = stringManager.getString("usermanager.error.delete.user");
    }

    private void initLayout() {
        this.getContentPane().setLayout(new BorderLayout());
        this.getContentPane().add(createPanel(), BorderLayout.CENTER);

        initVisualObjects();
        readPreferences();
    }

    public void setFocusToFirstEmptyInputField() {
        if (jtextfieldServer.getText().length() == 0) {
            jtextfieldServer.requestFocusInWindow();
        } else if (jtextfieldPort.getText().length() == 0) {
            jtextfieldPort.requestFocusInWindow();
        } else if (jtextfieldManagerUsername.getText().length() == 0) {
            jtextfieldManagerUsername.requestFocusInWindow();
        } else {
            jpasswordfieldManager.requestFocusInWindow();
        }
    }

    private JPanel createPanel() {
        JPanel jpanel1 = new JPanel();
        FormLayout formlayout1 = new FormLayout(
                "FILL:5DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:3DLU:NONE",
                "CENTER:5DLU:NONE,CENTER:DEFAULT:NONE,CENTER:12DLU:NONE,CENTER:DEFAULT:NONE,CENTER:5DLU:NONE,CENTER:DEFAULT:NONE,CENTER:5DLU:NONE");
        CellConstraints cc = new CellConstraints();
        jpanel1.setLayout(formlayout1);

        btnNew.setActionCommand("new");
        btnNew.setName("btnNew");
        btnNew.setText("new");
        jpanel1.add(btnNew, cc.xy(2, 4));

        btnEdit.setActionCommand("edit");
        btnEdit.setName("btnEdit");
        btnEdit.setText("edit");
        jpanel1.add(btnEdit, cc.xy(4, 4));

        btnSave.setActionCommand("save");
        btnSave.setName("btnSave");
        btnSave.setText("save");
        jpanel1.add(btnSave, cc.xy(6, 4));

        btnCancel.setActionCommand("cancel");
        btnCancel.setName("btnCancel");
        btnCancel.setText("cancel");
        jpanel1.add(btnCancel, cc.xy(8, 4));

        btnDelete.setActionCommand("delete");
        btnDelete.setName("btnDelete");
        btnDelete.setText("delete");
        jpanel1.add(btnDelete, cc.xy(10, 4));

        jpanel1.add(createPanelConnectionData(), cc.xywh(2, 2, 11, 1));
        jpanel1.add(createPanelUserEdit(), cc.xywh(2, 6, 11, 1));
        return jpanel1;
    }

    public JPanel createPanelConnectionData() {
        JPanel jpanel1 = new JPanel();
        FormLayout formlayout1 = new FormLayout(
                "FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:30DLU:GROW(1.0),FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:30DLU:NONE,FILL:3DLU:GROW(1.0)",
                "CENTER:DEFAULT:NONE,CENTER:5DLU:NONE,CENTER:DEFAULT:NONE,CENTER:5DLU:NONE,CENTER:DEFAULT:NONE");
        CellConstraints cc = new CellConstraints();
        jpanel1.setLayout(formlayout1);

        jtextfieldManagerUsername.setName("jtextfieldManagerUsername");
        jpanel1.add(jtextfieldManagerUsername, cc.xy(3, 5));

        lblManagerUsername.setName("lblManagerUsername");
        lblManagerUsername.setText("username");
        jpanel1.add(lblManagerUsername, cc.xy(1, 5));

        lblManagerPassword.setName("lblManagerPassword");
        lblManagerPassword.setText("password");
        jpanel1.add(lblManagerPassword, cc.xy(5, 5));

        lblManagerTitle.setName("lblManagerTitle");
        lblManagerTitle.setText("Connection parameter:");
        jpanel1.add(lblManagerTitle, cc.xywh(1, 1, 8, 1));

        lblServer.setName("lblServer");
        lblServer.setText("server");
        jpanel1.add(lblServer, cc.xy(1, 3));

        jtextfieldServer.setName("jtextfieldServer");
        jpanel1.add(jtextfieldServer, cc.xy(3, 3));

        lblPort.setName("lblPort");
        lblPort.setText("port");
        jpanel1.add(lblPort, cc.xy(5, 3));

        jtextfieldPort.setName("jtextfieldPort");
        jpanel1.add(jtextfieldPort, cc.xy(7, 3));

        jpasswordfieldManager.setName("jpasswordfieldManager");
        jpanel1.add(jpasswordfieldManager, cc.xywh(7, 5, 2, 1));

        jcheckboxConnectToServer.setActionCommand("connected to server");
        jcheckboxConnectToServer.setName("jcheckboxConnectToServer");
        jcheckboxConnectToServer.setText("connected to server");
        jcheckboxConnectToServer.setHorizontalAlignment(JCheckBox.RIGHT);
        jpanel1.add(jcheckboxConnectToServer, cc.xy(8, 3));

        return jpanel1;
    }

    public JPanel createPanelUserEdit() {
        JPanel jpanel1 = new JPanel();
        FormLayout formlayout1 = new FormLayout(
                "FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:30DLU:NONE,FILL:3DLU:NONE,FILL:DEFAULT:NONE,FILL:3DLU:NONE,FILL:30DLU:NONE,FILL:DEFAULT:GROW(1.0)",
                "CENTER:DEFAULT:NONE,CENTER:5DLU:NONE,CENTER:DEFAULT:NONE,CENTER:5DLU:NONE,CENTER:DEFAULT:NONE,CENTER:5DLU:NONE,CENTER:DEFAULT:NONE,CENTER:5DLU:NONE,CENTER:DEFAULT:NONE,CENTER:5DLU:NONE,CENTER:DEFAULT:NONE,CENTER:5DLU:NONE,CENTER:DEFAULT:NONE,CENTER:5DLU:NONE,CENTER:DEFAULT:NONE");
        CellConstraints cc = new CellConstraints();
        jpanel1.setLayout(formlayout1);

        jtableUsers.setName("jtableUsers");
        JScrollPane jscrollpane1 = new JScrollPane();
        jscrollpane1.setViewportView(jtableUsers);
        jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        jpanel1.add(jscrollpane1, cc.xywh(1, 1, 8, 1));

        lblUsername.setName("lblUsername");
        lblUsername.setText("Username");
        jpanel1.add(lblUsername, cc.xy(1, 3));

        lblPassword1.setName("lblPassword1");
        lblPassword1.setText("Password");
        jpanel1.add(lblPassword1, cc.xy(1, 7));

        lblPassword2.setName("lblPassword2");
        lblPassword2.setText("Confirm password");
        jpanel1.add(lblPassword2, cc.xy(1, 9));

        lblFirstName.setName("lblFirstName");
        lblFirstName.setText("Firstname");
        jpanel1.add(lblFirstName, cc.xy(1, 11));

        lblMiddleName.setName("lblMiddleName");
        lblMiddleName.setText("Middle name");
        jpanel1.add(lblMiddleName, cc.xy(1, 13));

        lblLastName.setName("lblLastName");
        lblLastName.setText("Last name");
        jpanel1.add(lblLastName, cc.xy(1, 15));

        jtextfieldUsername.setName("jtextfieldUsername");
        jpanel1.add(jtextfieldUsername, cc.xywh(3, 3, 6, 1));

        jpasswordField1.setName("jpasswordField1");
        jpanel1.add(jpasswordField1, cc.xywh(3, 7, 6, 1));

        jpasswordField2.setName("jpasswordField2");
        jpanel1.add(jpasswordField2, cc.xywh(3, 9, 6, 1));

        jtextfieldFirstName.setName("jtextfieldFirstName");
        jpanel1.add(jtextfieldFirstName, cc.xywh(3, 11, 6, 1));

        jtextfieldMiddleName.setName("jtextfieldMiddleName");
        jpanel1.add(jtextfieldMiddleName, cc.xywh(3, 13, 6, 1));

        jtextfieldLastName.setName("jtextfieldLastName");
        jpanel1.add(jtextfieldLastName, cc.xywh(3, 15, 6, 1));

        lblUserId.setName("lblUserId");
        lblUserId.setText("user id");
        jpanel1.add(lblUserId, cc.xy(1, 5));

        lblGroupId.setName("lblGroupId");
        lblGroupId.setText("group id");
        jpanel1.add(lblGroupId, cc.xy(5, 5));

        jtextfieldUserId.setName("jtextfieldUserId");
        jpanel1.add(jtextfieldUserId, cc.xy(3, 5));

        jtextfieldGroupId.setName("jtextfieldGroupId");
        jpanel1.add(jtextfieldGroupId, cc.xy(7, 5));

        return jpanel1;
    }

    private void initVisualObjects() {
        btnNew.setText(i18n.LBL_BTN_NEW);
        btnNew.setIcon(FirebirdManagerHelper.loadIcon("new22x22.png"));
        btnNew.addActionListener(this);
        btnEdit.setText(i18n.LBL_BTN_EDIT);
        btnEdit.setIcon(FirebirdManagerHelper.loadIcon("edit22x22.png"));
        btnEdit.addActionListener(this);
        btnSave.setText(i18n.LBL_BTN_SAVE);
        btnSave.setIcon(FirebirdManagerHelper.loadIcon("save22x22.png"));
        btnSave.addActionListener(this);
        btnCancel.setText(i18n.LBL_BTN_CANCEL);
        btnCancel.setIcon(FirebirdManagerHelper.loadIcon("cancel22x22.png"));
        btnCancel.addActionListener(this);
        btnDelete.setText(i18n.LBL_BTN_DELETE);
        btnDelete.setIcon(FirebirdManagerHelper.loadIcon("delete22x22.png"));
        btnDelete.addActionListener(this);

        lblManagerTitle.setText(i18n.LBL_MANAGER_TITLE);
        lblServer.setText(i18n.LBL_MANAGER_SERVER);
        lblPort.setText(i18n.LBL_MANAGER_PORT);
        jcheckboxConnectToServer.setText(i18n.LBL_MANAGER_CONECTED);
        jcheckboxConnectToServer.addActionListener(this);
        lblManagerUsername.setText(i18n.LBL_MANAGER_USERNAME);
        lblManagerPassword.setText(i18n.LBL_MANAGER_PASSWORD);
        jpasswordfieldManager.addKeyListener(this);

        jtableUsers.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        jtableUsers.getSelectionModel().addListSelectionListener(this);

        lblUsername.setText(i18n.LBL_USERS_USERNAME);
        jtextfieldUsername.setToolTipText(i18n.TOOLTIP_USERNAME);
        lblUserId.setText(i18n.LBL_USERS_USERID);
        lblGroupId.setText(i18n.LBL_USERS_GROUPID);
        lblPassword1.setText(i18n.LBL_USERS_PASSWORD);
        jpasswordField1.setToolTipText(i18n.TOOLTIP_PASSWORD);
        lblPassword2.setText(i18n.LBL_USERS_PASSWORD_CONFIRM);
        jpasswordField2.setToolTipText(i18n.TOOLTIP_PASSWORD);
        lblFirstName.setText(i18n.LBL_USERS_FIRSTNAME);
        lblMiddleName.setText(i18n.LBL_USERS_MIDDLENAME);
        lblLastName.setText(i18n.LBL_USERS_LASTNAME);

        controlComponents(FirebirdManagerHelper.DISPLAY_MODE);
    }

    /**
     * Set input fields with the last saved session preferences when exists
     * <br>or otherwise with the global preferences
     */
    private void readPreferences() {
        firebirdPreferencesBean = PreferencesManager.getGlobalPreferences();
        jtextfieldServer.setText(firebirdPreferencesBean.getServer());
        jtextfieldPort.setText(firebirdPreferencesBean.getPort());
        jtextfieldManagerUsername.setText(firebirdPreferencesBean.getUser());

        // preferences from the last session
        sessionPreferencesBean = (FirebirdManagerUsersPreferenceBean) PreferencesManager
                .loadPreferences(PreferencesManager.PREFERENCES_BEAN_USERS);
        if (sessionPreferencesBean.getUser().length() > 0)
            jtextfieldManagerUsername.setText(sessionPreferencesBean.getUser());
        if (sessionPreferencesBean.getServer().length() > 0)
            jtextfieldServer.setText(sessionPreferencesBean.getServer());
        if (sessionPreferencesBean.getPort().length() > 0)
            jtextfieldPort.setText(sessionPreferencesBean.getPort());
    }

    /**
     * Save the session preferences
     */
    private void saveSessionPreferences() {
        sessionPreferencesBean.setUser(jtextfieldManagerUsername.getText());
        sessionPreferencesBean.setServer(jtextfieldServer.getText());
        sessionPreferencesBean.setPort(jtextfieldPort.getText());

        PreferencesManager.savePreferences(sessionPreferencesBean, PreferencesManager.PREFERENCES_BEAN_USERS);
    }

    @SuppressWarnings("unchecked")
    private void readUsers() {

        try {
            mapUsers = (Map<String, FBUser>) fbUserManager.getUsers();
        } catch (Exception e) {
            log.error(e.getLocalizedMessage());
        }

        Collection<FBUser> listUsers = (Collection<FBUser>) mapUsers.values();
        vecTableUsers = new Vector<Vector<Object>>();
        Vector<Object> vecRow = null;
        for (Iterator iter = listUsers.iterator(); iter.hasNext();) {
            FBUser fbUser = (FBUser) iter.next();
            vecRow = new Vector<Object>();
            vecRow.add(fbUser.getUserName());
            vecRow.add(fbUser.getUserId());
            vecRow.add(fbUser.getGroupId());
            vecRow.add(fbUser.getFirstName());
            vecRow.add(fbUser.getMiddleName());
            vecRow.add(fbUser.getLastName());
            vecTableUsers.add(vecRow);
        }

        if (vecTableUsersHeader == null) {
            vecTableUsersHeader = new Vector<String>();
            vecTableUsersHeader.add(i18n.LBL_USERS_USERNAME);
            vecTableUsersHeader.add(i18n.LBL_USERS_USERID);
            vecTableUsersHeader.add(i18n.LBL_USERS_GROUPID);
            vecTableUsersHeader.add(i18n.LBL_USERS_FIRSTNAME);
            vecTableUsersHeader.add(i18n.LBL_USERS_MIDDLENAME);
            vecTableUsersHeader.add(i18n.LBL_USERS_LASTNAME);
        }

        ((DefaultTableModel) jtableUsers.getModel()).setDataVector(vecTableUsers, vecTableUsersHeader);
    }

    private void selectUser() {
        int row = jtableUsers.getSelectedRow();

        if (row > -1) {
            controlComponents(mode);
            jtextfieldUsername.setText((String) jtableUsers.getValueAt(row, TABLE_USERS_COL_USERNAME));
            jtextfieldUserId
                    .setText("" + ((Integer) jtableUsers.getValueAt(row, TABLE_USERS_COL_USERID)).intValue());
            jtextfieldGroupId
                    .setText("" + ((Integer) jtableUsers.getValueAt(row, TABLE_USERS_COL_GROUPID)).intValue());
            jtextfieldFirstName.setText((String) jtableUsers.getValueAt(row, TABLE_USERS_COL_FIRSTNAME));
            jtextfieldMiddleName.setText((String) jtableUsers.getValueAt(row, TABLE_USERS_COL_MIDDLENAME));
            jtextfieldLastName.setText((String) jtableUsers.getValueAt(row, TABLE_USERS_COL_LASTNAME));
        } else {
            initUserFields();
        }
    }

    private void initUserFields() {
        jtextfieldUsername.setText("");
        jtextfieldUserId.setText("0");
        jtextfieldGroupId.setText("0");
        jtextfieldFirstName.setText("");
        jtextfieldMiddleName.setText("");
        jtextfieldLastName.setText("");
        jpasswordField1.setText("");
        jpasswordField2.setText("");
    }

    // controlling
    // ------------------------------------------------------------------------
    private void controlComponents(int mode) {
        controlButton(mode);
        controlFields(mode);

        this.mode = mode;
    }

    private void controlButton(int mode) {
        int rowUser = jtableUsers.getSelectedRow();
        boolean sysdba = rowUser > -1
                && ((String) jtableUsers.getValueAt(rowUser, TABLE_USERS_COL_USERNAME)).equalsIgnoreCase("SYSDBA");

        btnNew.setEnabled(jcheckboxConnectToServer.isSelected() && mode == FirebirdManagerHelper.DISPLAY_MODE);
        btnEdit.setEnabled(jcheckboxConnectToServer.isSelected() && mode == FirebirdManagerHelper.DISPLAY_MODE
                && rowUser > -1);
        btnSave.setEnabled(jcheckboxConnectToServer.isSelected() && mode != FirebirdManagerHelper.DISPLAY_MODE);
        btnCancel.setEnabled(btnSave.isEnabled());
        btnDelete.setEnabled(btnEdit.isEnabled() && !sysdba);
    }

    private void controlFields(int mode) {
        boolean disconnected = iscSvcHandle == null;
        jtextfieldServer.setEnabled(disconnected);
        jtextfieldPort.setEnabled(disconnected);
        jtextfieldManagerUsername.setEnabled(disconnected);
        jpasswordfieldManager.setEnabled(disconnected);

        jtableUsers.setEnabled(mode == FirebirdManagerHelper.DISPLAY_MODE);

        jtextfieldUsername.setEnabled(mode == FirebirdManagerHelper.NEW_MODE);
        jtextfieldUserId.setEnabled(jtextfieldUsername.isEnabled());
        jtextfieldGroupId.setEnabled(mode != FirebirdManagerHelper.DISPLAY_MODE);
        jtextfieldFirstName.setEnabled(jtextfieldGroupId.isEnabled());
        jtextfieldMiddleName.setEnabled(jtextfieldGroupId.isEnabled());
        jtextfieldLastName.setEnabled(jtextfieldGroupId.isEnabled());
        jpasswordField1.setEnabled(jtextfieldGroupId.isEnabled());
        jpasswordField2.setEnabled(jtextfieldGroupId.isEnabled());
    }

    private void connectToServer() {
        if (iscSvcHandle == null) {
            fbUserManager.setHost(jtextfieldServer.getText());
            fbUserManager.setPort(FirebirdManagerHelper.convertStringToIntDef(jtextfieldPort.getText(), 3050));
            fbUserManager.setUser(jtextfieldManagerUsername.getText());
            fbUserManager.setPassword(new String(jpasswordfieldManager.getPassword()));

            try {
                iscSvcHandle = fbUserManager.attachServiceManager(fbUserManager.getGds());
                readUsers();
                controlComponents(mode);
                saveSessionPreferences();
            } catch (GDSException e) {
                JOptionPane.showMessageDialog(null, i18n.ERROR_CANNOT_CONNECT_SERVER);
                log.error(i18n.ERROR_CANNOT_CONNECT_SERVER);
                jcheckboxConnectToServer.setSelected(false);
            }
        }
    }

    private void disconnectFromServer() {
        if (iscSvcHandle != null) {
            try {
                fbUserManager.detachServiceManager(fbUserManager.getGds(), iscSvcHandle);
                iscSvcHandle = null;
                // init user list
                vecTableUsers = new Vector<Vector<Object>>();
                ((DefaultTableModel) jtableUsers.getModel()).setDataVector(vecTableUsers, vecTableUsersHeader);
                controlComponents(mode);
            } catch (GDSException e) {
                JOptionPane.showMessageDialog(null, i18n.ERROR_CANNOT_DISCONNECT_SERVER);
                log.error(i18n.ERROR_CANNOT_DISCONNECT_SERVER);
                jcheckboxConnectToServer.setSelected(true);
            }
        }
    }

    // user checks
    // ------------------------------------------------------------------------
    private boolean isInputOK() {
        StringBuffer bufError = new StringBuffer();
        boolean focusSet = false;

        if (jtextfieldUsername.getText().trim().length() == 0) {
            bufError.append(i18n.ERROR_USERNAME_MISSING + CR);
            jtextfieldUsername.requestFocusInWindow();
            focusSet = true;
        } else if (jtextfieldUsername.getText().trim().length() > 31) {
            bufError.append(i18n.ERROR_USERNAME_MAXLENGTH + CR);
            if (!focusSet) {
                jtextfieldUsername.requestFocusInWindow();
                focusSet = true;
            }
        }
        if (jtextfieldUserId.getText().length() > 0) {
            try {
                Integer.parseInt(jtextfieldUserId.getText());
            } catch (NumberFormatException e) {
                bufError.append(i18n.ERROR_NO_NUMBER + CR);
                if (!focusSet) {
                    jtextfieldUserId.requestFocusInWindow();
                    focusSet = true;
                }
            }
        }
        if (jtextfieldGroupId.getText().length() > 0) {
            try {
                Integer.parseInt(jtextfieldGroupId.getText());
            } catch (NumberFormatException e) {
                bufError.append(i18n.ERROR_NO_NUMBER + CR);
                if (!focusSet) {
                    jtextfieldGroupId.requestFocusInWindow();
                    focusSet = true;
                }
            }
        }
        boolean pwRequired = mode == FirebirdManagerHelper.NEW_MODE || jpasswordField1.getPassword().length > 0
                || jpasswordField2.getPassword().length > 0;

        if (pwRequired) {
            if (jpasswordField1.getPassword().length == 0) {
                bufError.append(i18n.ERROR_PASSWORD_MISSING + CR);
                if (!focusSet) {
                    jpasswordField1.requestFocusInWindow();
                    focusSet = true;
                }
            } else {
                if (jpasswordField2.getPassword().length == 0) {
                    bufError.append(i18n.ERROR_PASSWORD_MISSING + CR);
                    if (!focusSet) {
                        jpasswordField2.requestFocusInWindow();
                        focusSet = true;
                    }
                } else {
                    if (!new String(jpasswordField1.getPassword())
                            .equals(new String(jpasswordField2.getPassword()))) {
                        bufError.append(i18n.ERROR_PASSWORD_DIFFERENCES + CR);
                        if (!focusSet) {
                            jpasswordField1.requestFocusInWindow();
                            focusSet = true;
                        }
                    } else if (new String(jpasswordField1.getPassword()).length() > 31) {
                        bufError.append(i18n.ERROR_PASSWORD_MAXLENGTH + CR);
                        if (!focusSet) {
                            jpasswordField1.requestFocusInWindow();
                            focusSet = true;
                        }
                    }
                }
            }
        }

        if (mode == FirebirdManagerHelper.NEW_MODE) {
            int uniqueUser = uniqueUser();
            if (uniqueUser > UNIQUE_USER) {
                if (uniqueUser == USERNAME_EXISTS) {
                    bufError.append(i18n.ERROR_USERNAME_EXISTS + CR);
                } else if (uniqueUser == USERID_EXISTS) {
                    bufError.append(i18n.ERROR_USERID_EXISTS + CR);
                }
                if (!focusSet) {
                    jtextfieldUsername.requestFocusInWindow();
                    focusSet = true;
                }
            }
        }

        if (bufError.length() != 0) {
            JOptionPane.showMessageDialog(_application.getMainFrame(), bufError.toString());
        }

        return bufError.length() == 0;
    }

    private int uniqueUser() {
        int userId = FirebirdManagerHelper.convertStringToIntDef(jtextfieldUserId.getText(), -1);
        for (int i = 0; i < jtableUsers.getRowCount(); i++) {
            if (jtextfieldUsername.getText()
                    .equalsIgnoreCase((String) jtableUsers.getValueAt(i, TABLE_USERS_COL_USERNAME))) {
                return USERNAME_EXISTS;
            } else if (userId > 0
                    && userId == ((Integer) jtableUsers.getValueAt(i, TABLE_USERS_COL_USERID)).intValue()) {
                return USERID_EXISTS;
            }
        }
        return UNIQUE_USER;
    }

    private FBUser fillUser() {
        FBUser fbUser = new FBUser();
        fbUser.setUserName(jtextfieldUsername.getText().trim());
        fbUser.setUserId(FirebirdManagerHelper.convertStringToIntDef(jtextfieldUserId.getText(), 0));
        fbUser.setGroupId(FirebirdManagerHelper.convertStringToIntDef(jtextfieldGroupId.getText(), 0));
        if (mode == FirebirdManagerHelper.NEW_MODE
                || new String(jpasswordField1.getPassword()).trim().length() > 0) {
            fbUser.setPassword(new String(jpasswordField1.getPassword()).trim());
        }
        fbUser.setFirstName(jtextfieldFirstName.getText());
        fbUser.setMiddleName(jtextfieldMiddleName.getText());
        fbUser.setLastName(jtextfieldLastName.getText());

        return fbUser;
    }

    private boolean saveData() {
        if (isInputOK()) {
            try {
                if (mode == FirebirdManagerHelper.NEW_MODE) {
                    fbUserManager.add(fillUser());
                } else {
                    fbUserManager.update(fillUser());
                }
                readUsers();
                return true;
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, i18n.ERROR_SAVE_USER);
                log.error(i18n.ERROR_SAVE_USER + CR + e.getLocalizedMessage());
            }
        }

        return false;
    }

    private void deleteUser() {
        int row = jtableUsers.getSelectedRow();
        if (row > -1
                && JOptionPane.showConfirmDialog(null, i18n.QUESTION_DELETE_USER, i18n.QUESTION_TITLE_DELETE_USER,
                        JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
            FBUser fbUser = mapUsers.get(jtextfieldUsername.getText());
            try {
                fbUserManager.delete(fbUser);
                readUsers();
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, i18n.ERROR_DELETE_USER);
                log.error(i18n.ERROR_DELETE_USER + CR + e.getLocalizedMessage());
            }
        }
    }

    // ########################################################################
    // ########## events
    // ########################################################################
    // ------------------------------------------------------------------------
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == btnNew) {
            initUserFields();
            controlComponents(FirebirdManagerHelper.NEW_MODE);
            jtextfieldUsername.requestFocusInWindow();
        } else if (e.getSource() == btnEdit) {
            controlComponents(FirebirdManagerHelper.EDIT_MODE);
            jtextfieldFirstName.requestFocusInWindow();
        } else if (e.getSource() == btnSave) {
            if (saveData()) {
                controlComponents(FirebirdManagerHelper.DISPLAY_MODE);
            }
        } else if (e.getSource() == btnCancel) {
            selectUser();
            controlComponents(FirebirdManagerHelper.DISPLAY_MODE);
        } else if (e.getSource() == btnDelete) {
            deleteUser();
        } else if (e.getSource() == jcheckboxConnectToServer) {
            if (jcheckboxConnectToServer.isSelected()) {
                connectToServer();
            } else {
                disconnectFromServer();
            }
        }
    }

    // ------------------------------------------------------------------------
    public void keyTyped(KeyEvent e) {
    }

    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            if (e.getSource() == jpasswordfieldManager && !jcheckboxConnectToServer.isSelected()) {
                jcheckboxConnectToServer.doClick();
            }
        }
    }

    public void keyReleased(KeyEvent e) {
    }

    // ------------------------------------------------------------------------
    public void valueChanged(ListSelectionEvent e) {
        if (!e.getValueIsAdjusting() && e.getSource() == jtableUsers.getSelectionModel()) {
            selectUser();
        }
    }

}