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

Java tutorial

Introduction

Here is the source code for net.sourceforge.squirrel_sql.plugins.firebirdmanager.gui.FirebirdManagerGrantFrame.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.gui.desktopcontainer.DialogWidget;
import net.sourceforge.squirrel_sql.client.session.ISession;
import net.sourceforge.squirrel_sql.fw.sql.SQLUtilities;
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.FirebirdManagerDataAccess;
import net.sourceforge.squirrel_sql.plugins.firebirdmanager.FirebirdManagerHelper;

import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

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

    private final String CR = System.getProperty("line.separator", "\n");

    private final int DISPLAY_TYPE_TABLE = 0;

    private final int DISPLAY_TYPE_VIEW = 1;

    private final int DISPLAY_TYPE_PROCEDURE = 2;

    private final int DISPLAY_TYPE_ROLE = 3;

    private final int TABLES_COL_SELECT = 2;

    private final int TABLES_COL_INSERT = 3;

    private final int TABLES_COL_UPDATE = 4;

    private final int TABLES_COL_DELETE = 5;

    private final int TABLES_COL_REFERENCE = 6;

    public final static int TREENODE_TYPE_ROOT = 0;

    public final static int TREENODE_TYPE_USER_GROUP = 1;

    public final static int TREENODE_TYPE_PROCEDURE_GROUP = 2;

    public final static int TREENODE_TYPE_VIEW_GROUP = 3;

    public final static int TREENODE_TYPE_TRIGGER_GROUP = 4;

    public final static int TREENODE_TYPE_ROLE_GROUP = 5;

    public final static int TREENODE_TYPE_USER = 6;

    public final static int TREENODE_TYPE_TRIGGER = 7;

    public final static int TREENODE_TYPE_PROCEDURE = 8;

    public final static int TREENODE_TYPE_VIEW = 9;

    public final static int TREENODE_TYPE_ROLE = 10;

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

    private static final StringManager stringManager = StringManagerFactory
            .getStringManager(FirebirdManagerGrantFrame.class);

    private ISession session;

    private String gsTreenodeName = "";

    private int gTreenodeType = -1;

    // data objects
    private FirebirdManagerGrantTreeNode rootNode;

    private Vector<Vector<Object>> vecGrant = null;

    private List<String> listUserNames = null;

    private List<String> listTriggerNames = null;

    private List<String> listRoleNames = null;

    private List<FirebirdManagerGrantDbObject> listTableNames = null;

    private List<String> listViewNames = null;

    private List<String> listProcedureNames = null;

    // visible (gui)
    // ------------------------------------------------------------------------
    // -- main
    private JSplitPane jsplitpaneMain = new JSplitPane();

    // -- edit
    private JCheckBox jcheckboxSelect = new JCheckBox();

    private JCheckBox jcheckboxInsert = new JCheckBox();

    private JCheckBox jcheckboxDelete = new JCheckBox();

    private JCheckBox jcheckboxUpdate = new JCheckBox();

    private JButton btnSetPermissions = new JButton();

    private JCheckBox jcheckboxReference = new JCheckBox();

    private JCheckBox jcheckboxAll = new JCheckBox();

    private JCheckBox jcheckboxExecute = new JCheckBox();

    private JCheckBox jcheckboxMember = new JCheckBox();

    private JProgressBar jprogressbarSetPermissions = new JProgressBar();

    // tree
    private JTree jtreeReceiver;

    // view
    private JPanel panelTable = null;

    private JTable jtableGrant;

    // select
    private ButtonGroup buttongroupSelect = new ButtonGroup();

    private JRadioButton radioButtonTables = new JRadioButton();

    private JRadioButton radioButtonViews = new JRadioButton();

    private JRadioButton radioButtonProcedures = new JRadioButton();

    private JRadioButton radioButtonRoles = new JRadioButton();

    private JProgressBar jprogressbarReadPermissions = new JProgressBar();

    /**
     * Constructor
     * 
     * @param app
     * @param rsrc
     * @param session
     * @param tab
     */
    public FirebirdManagerGrantFrame(ISession session) {
        super("Firebird manager - " + stringManager.getString("grantmanager.title"), true, true, true, true,
                session.getApplication());
        this.session = session;

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

    private interface i18n {
        // Labels
        String GRANTMANAGER_LBL_SELECT = stringManager.getString("grantmanager.label.select");

        String GRANTMANAGER_LBL_INSERT = stringManager.getString("grantmanager.label.insert");

        String GRANTMANAGER_LBL_UPDATE = stringManager.getString("grantmanager.label.update");

        String GRANTMANAGER_LBL_DELETE = stringManager.getString("grantmanager.label.delete");

        String GRANTMANAGER_LBL_PERMISSIONS = stringManager.getString("grantmanager.label.permissions");

        String GRANTMANAGER_LBL_REFERENCE = stringManager.getString("grantmanager.label.reference");

        String GRANTMANAGER_LBL_ALL = stringManager.getString("grantmanager.label.all");

        String GRANTMANAGER_LBL_EXECUTE = stringManager.getString("grantmanager.label.execute");

        String GRANTMANAGER_LBL_MEMBER = stringManager.getString("grantmanager.label.member");

        String GRANTMANAGER_LBL_TABLES = stringManager.getString("grantmanager.label.tables");

        String GRANTMANAGER_LBL_VIEWS = stringManager.getString("grantmanager.label.views");

        String GRANTMANAGER_LBL_PROCEDURES = stringManager.getString("grantmanager.label.procedures");

        String GRANTMANAGER_LBL_ROLES = stringManager.getString("grantmanager.label.roles");

        String GRANTMANAGER_TOOLTIP_PERMISSIONS = stringManager.getString("grantmanager.tooltip.permissions");

        String GRANTMANAGER_LBL_TABLECOLUMN_OWNER = stringManager.getString("grantmanager.label.tablecolumn.owner");

        String GRANTMANAGER_LBL_TABLECOLUMN_NAME = stringManager.getString("grantmanager.label.tablecolumn.name");

        String GRANTMANAGER_LBL_TABLECOLUMN_SELECT = stringManager
                .getString("grantmanager.label.tablecolumn.select");

        String GRANTMANAGER_LBL_TABLECOLUMN_INSERT = stringManager
                .getString("grantmanager.label.tablecolumn.insert");

        String GRANTMANAGER_LBL_TABLECOLUMN_UPDATE = stringManager
                .getString("grantmanager.label.tablecolumn.update");

        String GRANTMANAGER_LBL_TABLECOLUMN_DELETE = stringManager
                .getString("grantmanager.label.tablecolumn.delete");

        String GRANTMANAGER_LBL_TABLECOLUMN_REFERENCE = stringManager
                .getString("grantmanager.label.tablecolumn.reference");

        String GRANTMANAGER_LBL_TABLECOLUMN_EXECUTE = stringManager
                .getString("grantmanager.label.tablecolumn.execute");

        String GRANTMANAGER_LBL_TABLECOLUMN_MEMBER = stringManager
                .getString("grantmanager.label.tablecolumn.member");

        String GRANTMANAGER_LBL_TREENODE_ROOT = stringManager.getString("grantmanager.label.treenode.root");

        String GRANTMANAGER_LBL_TREENODE_USERS = stringManager.getString("grantmanager.label.treenode.users");

        String GRANTMANAGER_LBL_TREENODE_STORED_PROCEDURES = stringManager
                .getString("grantmanager.label.treenode.stored.procedures");

        String GRANTMANAGER_LBL_TREENODE_TRIGGERS = stringManager.getString("grantmanager.label.treenode.triggers");

        String GRANTMANAGER_LBL_TREENODE_VIEWS = stringManager.getString("grantmanager.label.treenode.views");

        String GRANTMANAGER_LBL_TREENODE_ROLES = stringManager.getString("grantmanager.label.treenode.roles");

        String GRANTMANAGER_INFO_SELECT_PERMISSION_RECEIVER = stringManager
                .getString("grantmanager.info.select.permission.receiver");

        String GRANTMANAGER_INFO_PRIVILEGES_COUNT = stringManager.getString("grantmanager.info.privileges.count");

        String GRANTMANAGER_QUEST_PERMISSION_FOR_GROUP = stringManager
                .getString("grantmanager.question.permission.for.group");

        String GRANTMANAGER_ERROR_SET_PRIVILEGES = stringManager.getString("grantmanager.error.set.privileges");
    }

    // layout
    // ------------------------------------------------------------------------
    private void initLayout() {
        this.getContentPane().setLayout(new BorderLayout());
        this.getContentPane().add(createMain());
    }

    private JPanel createMain() {
        initVisualObjects();

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

        jsplitpaneMain.setDividerLocation(180);
        jsplitpaneMain.setLastDividerLocation(-1);
        jsplitpaneMain.setName("jsplitpaneMain");
        jpanel1.add(jsplitpaneMain, cc.xy(2, 2));

        jpanel1.add(createPanelEdit(), cc.xy(2, 4));
        return jpanel1;
    }

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

        jcheckboxSelect.setName("jcheckboxSelect");
        jcheckboxSelect.setText(i18n.GRANTMANAGER_LBL_SELECT);
        jpanel1.add(jcheckboxSelect, cc.xy(1, 1));

        jcheckboxInsert.setName("jcheckboxInsert");
        jcheckboxInsert.setText(i18n.GRANTMANAGER_LBL_INSERT);
        jpanel1.add(jcheckboxInsert, cc.xy(3, 1));

        jcheckboxDelete.setName("jcheckboxDelete");
        jcheckboxDelete.setText(i18n.GRANTMANAGER_LBL_DELETE);
        jpanel1.add(jcheckboxDelete, cc.xy(7, 1));

        jcheckboxUpdate.setName("jcheckboxUpdate");
        jcheckboxUpdate.setText(i18n.GRANTMANAGER_LBL_UPDATE);
        jpanel1.add(jcheckboxUpdate, cc.xy(5, 1));

        btnSetPermissions.setName("btnSetPermissions");
        btnSetPermissions.setText(i18n.GRANTMANAGER_LBL_PERMISSIONS);
        jpanel1.add(btnSetPermissions, cc.xy(10, 1));

        jcheckboxReference.setName("jcheckboxReference");
        jcheckboxReference.setText(i18n.GRANTMANAGER_LBL_REFERENCE);
        jpanel1.add(jcheckboxReference, cc.xy(1, 3));

        jcheckboxAll.setName("jcheckboxAll");
        jcheckboxAll.setText(i18n.GRANTMANAGER_LBL_ALL);
        jpanel1.add(jcheckboxAll, cc.xy(3, 3));

        jcheckboxExecute.setName("jcheckboxExecute");
        jcheckboxExecute.setText(i18n.GRANTMANAGER_LBL_EXECUTE);
        jpanel1.add(jcheckboxExecute, cc.xy(5, 3));

        jcheckboxMember.setName("jcheckboxMember");
        jcheckboxMember.setText(i18n.GRANTMANAGER_LBL_MEMBER);
        jpanel1.add(jcheckboxMember, cc.xy(7, 3));

        jprogressbarSetPermissions.setName("jprogressBarSetting");
        jprogressbarSetPermissions.setValue(25);
        jpanel1.add(jprogressbarSetPermissions, cc.xywh(9, 3, 2, 1));

        return jpanel1;
    }

    public JPanel createPanelTree() {
        JPanel jpanel1 = new JPanel();
        FormLayout formlayout1 = new FormLayout("FILL:DEFAULT:GROW(1.0)", "FILL:DEFAULT:GROW(1.0)");
        CellConstraints cc = new CellConstraints();
        jpanel1.setLayout(formlayout1);

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

        return jpanel1;
    }

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

        jtableGrant.setName("jtableView");
        JScrollPane jscrollpane1 = new JScrollPane();
        jscrollpane1.setViewportView(jtableGrant);
        jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        jpanel1.add(jscrollpane1, cc.xy(1, 2));

        jpanel1.add(createPanelSelect(), cc.xy(1, 1));

        return jpanel1;
    }

    public JPanel createPanelSelect() {
        JPanel jpanel1 = new JPanel();
        FormLayout formlayout1 = new FormLayout(
                "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:DEFAULT:GROW(1.0),FILL:80DLU:NONE",
                "CENTER:DEFAULT:NONE");
        CellConstraints cc = new CellConstraints();
        jpanel1.setLayout(formlayout1);

        radioButtonTables.setName("radioButtonTables");
        radioButtonTables.setText(i18n.GRANTMANAGER_LBL_TABLES);
        buttongroupSelect.add(radioButtonTables);
        jpanel1.add(radioButtonTables, cc.xy(2, 1));

        radioButtonViews.setName("radioButtonViews");
        radioButtonViews.setText(i18n.GRANTMANAGER_LBL_VIEWS);
        buttongroupSelect.add(radioButtonViews);
        jpanel1.add(radioButtonViews, cc.xy(4, 1));

        radioButtonProcedures.setName("radioButtonProcedures");
        radioButtonProcedures.setText(i18n.GRANTMANAGER_LBL_PROCEDURES);
        buttongroupSelect.add(radioButtonProcedures);
        jpanel1.add(radioButtonProcedures, cc.xy(6, 1));

        radioButtonRoles.setName("radioButtonRoles");
        radioButtonRoles.setText(i18n.GRANTMANAGER_LBL_ROLES);
        buttongroupSelect.add(radioButtonRoles);
        jpanel1.add(radioButtonRoles, cc.xy(8, 1));

        jprogressbarReadPermissions.setName("jprogressBarReading");
        jprogressbarReadPermissions.setValue(25);
        jpanel1.add(jprogressbarReadPermissions, cc.xy(10, 1));

        return jpanel1;
    }

    public void setFocusToFirstEmptyInputField() {
        // not used
    }

    private void initVisualObjects() {
        createTargetTree();

        jtableGrant = new JTable(new FirebirdManagerGrantTableModel(vecGrant, getTableHeader(DISPLAY_TYPE_TABLE)));
        jtableGrant.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        jtableGrant.setDefaultRenderer(Object.class, new FirebirdManagerGrantTableRenderer());
        jtableGrant.addKeyListener(this);
        jtableGrant.addMouseListener(this);

        jsplitpaneMain.setLeftComponent(createPanelTree());
        panelTable = createPanelTable();
        jsplitpaneMain.setRightComponent(panelTable);

        radioButtonTables.addActionListener(this);
        radioButtonViews.addActionListener(this);
        radioButtonProcedures.addActionListener(this);
        radioButtonRoles.addActionListener(this);
        ButtonGroup bg = new ButtonGroup();
        bg.add(radioButtonTables);
        bg.add(radioButtonViews);
        bg.add(radioButtonProcedures);
        bg.add(radioButtonRoles);
        // jradiobuttonRoles.setSelected(true);

        jprogressbarReadPermissions.setMinimum(0);
        jprogressbarReadPermissions.setForeground(Color.BLUE);
        jprogressbarReadPermissions.setBackground(Color.LIGHT_GRAY);
        jprogressbarReadPermissions.setStringPainted(true);
        jprogressbarReadPermissions.setValue(0);

        btnSetPermissions.addActionListener(this);
        btnSetPermissions.setToolTipText(i18n.GRANTMANAGER_TOOLTIP_PERMISSIONS);
        // btnSetPermissions.setEnabled(false);

        jprogressbarSetPermissions.setMinimum(0);
        jprogressbarSetPermissions.setForeground(Color.BLUE);
        jprogressbarSetPermissions.setBackground(Color.LIGHT_GRAY);
        jprogressbarSetPermissions.setStringPainted(true);
        jprogressbarSetPermissions.setValue(0);

        readData();
    }

    // misc
    // ------------------------------------------------------------------------
    private void appendPrivilegeToBuffer(StringBuffer pBuffer, String privilege) {
        if (pBuffer.length() > 0)
            pBuffer.append("," + privilege);
        else
            pBuffer.append(privilege);
    } // private void appendPrivelegeToBuffer(StringBuffer pBuffer, String psPrivilege)

    private boolean isTreeNodeAGroup() {
        return gTreenodeType == TREENODE_TYPE_USER_GROUP || gTreenodeType == TREENODE_TYPE_PROCEDURE_GROUP
                || gTreenodeType == TREENODE_TYPE_VIEW_GROUP || gTreenodeType == TREENODE_TYPE_TRIGGER_GROUP
                || gTreenodeType == TREENODE_TYPE_ROLE_GROUP;
    }

    // data
    // ------------------------------------------------------------------------
    private void createTargetTree() {
        rootNode = new FirebirdManagerGrantTreeNode(i18n.GRANTMANAGER_LBL_TREENODE_ROOT, TREENODE_TYPE_ROOT);
        DefaultTreeModel treeModel = new DefaultTreeModel(rootNode);
        jtreeReceiver = new JTree(treeModel);
        jtreeReceiver.addTreeSelectionListener(new TreeSelectionListener() {
            public void valueChanged(TreeSelectionEvent e) {
                FirebirdManagerGrantTreeNode node = (FirebirdManagerGrantTreeNode) e.getPath()
                        .getLastPathComponent();
                gsTreenodeName = node.getUserObject().toString();
                gTreenodeType = node.getTreenodeType();
                readData();
            }
        });
        TreeSelectionModel tsm = new DefaultTreeSelectionModel();
        tsm.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        jtreeReceiver.setBackground(Color.LIGHT_GRAY);
        jtreeReceiver.setSelectionModel(tsm);
        jtreeReceiver.setEnabled(true);
        jtreeReceiver.setRootVisible(true); // false);
        FirebirdManagerGrantTreeRenderer treeRenderer = new FirebirdManagerGrantTreeRenderer();
        jtreeReceiver.setCellRenderer(treeRenderer);

        setTreeData();
    }

    // ------------------------------------------------------------------------
    private void getPrivileges() {
        if (radioButtonTables.isSelected() || radioButtonViews.isSelected()) {
            jcheckboxSelect
                    .setSelected(((Boolean) jtableGrant.getValueAt(jtableGrant.getSelectedRow(), TABLES_COL_SELECT))
                            .booleanValue());
            jcheckboxInsert
                    .setSelected(((Boolean) jtableGrant.getValueAt(jtableGrant.getSelectedRow(), TABLES_COL_INSERT))
                            .booleanValue());
            jcheckboxUpdate
                    .setSelected(((Boolean) jtableGrant.getValueAt(jtableGrant.getSelectedRow(), TABLES_COL_UPDATE))
                            .booleanValue());
            jcheckboxDelete
                    .setSelected(((Boolean) jtableGrant.getValueAt(jtableGrant.getSelectedRow(), TABLES_COL_DELETE))
                            .booleanValue());
            jcheckboxReference.setSelected(
                    ((Boolean) jtableGrant.getValueAt(jtableGrant.getSelectedRow(), TABLES_COL_REFERENCE))
                            .booleanValue());
            jcheckboxAll.setSelected(
                    jcheckboxSelect.isSelected() && jcheckboxInsert.isSelected() && jcheckboxUpdate.isSelected()
                            && jcheckboxDelete.isSelected() && jcheckboxReference.isSelected());
        } else if (radioButtonProcedures.isSelected()) {
            jcheckboxExecute.setSelected(
                    ((Boolean) jtableGrant.getValueAt(jtableGrant.getSelectedRow(), 1)).booleanValue());
        } else if (radioButtonRoles.isSelected()) {
            jcheckboxMember.setSelected(
                    ((Boolean) jtableGrant.getValueAt(jtableGrant.getSelectedRow(), 1)).booleanValue());
        }
    }

    // ------------------------------------------------------------------------
    private String getSelectedPrivileges() {
        StringBuffer bufPrivileges = new StringBuffer();
        if (radioButtonTables.isSelected() || radioButtonViews.isSelected()) {
            if (jcheckboxAll.isSelected())
                appendPrivilegeToBuffer(bufPrivileges, "ALL");
            else {
                if (jcheckboxSelect.isSelected())
                    appendPrivilegeToBuffer(bufPrivileges, "SELECT");
                if (jcheckboxInsert.isSelected())
                    appendPrivilegeToBuffer(bufPrivileges, "INSERT");
                if (jcheckboxUpdate.isSelected())
                    appendPrivilegeToBuffer(bufPrivileges, "UPDATE");
                if (jcheckboxDelete.isSelected())
                    appendPrivilegeToBuffer(bufPrivileges, "DELETE");
                if (jcheckboxReference.isSelected())
                    appendPrivilegeToBuffer(bufPrivileges, "REFERENCES");
            }
        } else if (radioButtonProcedures.isSelected())
            if (jcheckboxExecute.isSelected())
                appendPrivilegeToBuffer(bufPrivileges, "EXECUTE");

        return bufPrivileges.toString();
    }

    // ------------------------------------------------------------------------
    private void setOptimalColumnWidth(int displayType) {
        int markerColWidth = 50;
        int decOffset = 3;
        if (displayType == DISPLAY_TYPE_PROCEDURE || displayType == DISPLAY_TYPE_ROLE) {
            markerColWidth = 70;
        }
        int maxWidth = panelTable.getWidth();

        TableColumnModel cm = jtableGrant.getColumnModel();

        int textColumnWidth = maxWidth - ((cm.getColumnCount() - 1) * markerColWidth) - decOffset;
        if (textColumnWidth < 50) {
            markerColWidth = (maxWidth - 50) / (cm.getColumnCount() - 1);
        }

        cm.getColumn(0).setPreferredWidth(textColumnWidth);
        for (int i = 1; i < cm.getColumnCount(); i++) {
            cm.getColumn(i).setPreferredWidth(markerColWidth);
        }
    }

    // ------------------------------------------------------------------------
    private Vector<Object> getTableHeader(int piType) {
        Vector<Object> vecTableHeader = new Vector<Object>();
        switch (piType) {
        case DISPLAY_TYPE_TABLE:
        case DISPLAY_TYPE_VIEW:
            vecTableHeader.add(i18n.GRANTMANAGER_LBL_TABLECOLUMN_NAME);
            if (piType == DISPLAY_TYPE_TABLE) {
                vecTableHeader.add(i18n.GRANTMANAGER_LBL_TABLECOLUMN_OWNER);
            }
            vecTableHeader.add(i18n.GRANTMANAGER_LBL_TABLECOLUMN_SELECT);
            vecTableHeader.add(i18n.GRANTMANAGER_LBL_TABLECOLUMN_INSERT);
            vecTableHeader.add(i18n.GRANTMANAGER_LBL_TABLECOLUMN_UPDATE);
            vecTableHeader.add(i18n.GRANTMANAGER_LBL_TABLECOLUMN_DELETE);
            vecTableHeader.add(i18n.GRANTMANAGER_LBL_TABLECOLUMN_REFERENCE);
            break;
        case DISPLAY_TYPE_PROCEDURE:
            vecTableHeader.add(i18n.GRANTMANAGER_LBL_TABLECOLUMN_NAME);
            vecTableHeader.add(i18n.GRANTMANAGER_LBL_TABLECOLUMN_EXECUTE);
            break;
        case DISPLAY_TYPE_ROLE:
            vecTableHeader.add(i18n.GRANTMANAGER_LBL_TABLECOLUMN_NAME);
            vecTableHeader.add(i18n.GRANTMANAGER_LBL_TABLECOLUMN_MEMBER);
            break;
        default:
            break;
        }
        return vecTableHeader;
    }

    // ------------------------------------------------------------------------
    private void initDataObjects() {
        listUserNames = FirebirdManagerDataAccess.getUsernameList(session);
        listTriggerNames = FirebirdManagerDataAccess.getTriggerList(session);
        listRoleNames = FirebirdManagerDataAccess.getRoleList(session);
        listTableNames = FirebirdManagerDataAccess.getTableList(session);
        listViewNames = FirebirdManagerDataAccess.getViewList(session);
        listProcedureNames = FirebirdManagerDataAccess.getProcedureList(session);
    }

    private void readData() {
        if (radioButtonTables.isSelected()) {
            readDataTables();
            setCheckBoxStatus();
        } else if (radioButtonViews.isSelected()) {
            readDataViews();
            setCheckBoxStatus();
        } else if (radioButtonProcedures.isSelected()) {
            readDataProcedures();
            setCheckBoxStatus();
        } else if (radioButtonRoles.isSelected()) {
            readDataRoles();
            setCheckBoxStatus();
        }
        jprogressbarSetPermissions.setMinimum(0);
        jprogressbarSetPermissions.setMaximum(0);
        refreshProgressBar(jprogressbarSetPermissions, 0, 0);
        btnSetPermissions.setEnabled(jtableGrant.getSelectedRow() > -1);
    }

    // ------------------------------------------------------------------------
    private void readDataProcedures() {
        int iCount = listProcedureNames.size();
        jprogressbarReadPermissions.setValue(0);
        jprogressbarReadPermissions.setMaximum(iCount);
        refreshProgressBar(jprogressbarReadPermissions, 0, iCount);
        boolean groupHeader = isTreeNodeAGroup();
        FirebirdManagerPrivilege fbPrivileges = null;
        vecGrant = new Vector<Vector<Object>>();
        for (int i = 0; i < iCount; i++) {
            String relationName = listProcedureNames.get(i);
            Vector<Object> vecRow = new Vector<Object>();
            vecRow.add(relationName);
            fbPrivileges = FirebirdManagerDataAccess.readPrivileges(session, gsTreenodeName, relationName,
                    groupHeader);
            vecRow.add(Boolean.valueOf(fbPrivileges.isExecute()));
            vecGrant.add(vecRow);
            refreshProgressBar(jprogressbarReadPermissions, i + 1, iCount);
        }

        refreshTable(DISPLAY_TYPE_PROCEDURE);
    }

    // ------------------------------------------------------------------------
    private void readDataRoles() {
        int iCount = listRoleNames.size();
        jprogressbarReadPermissions.setValue(0);
        jprogressbarReadPermissions.setMaximum(iCount);
        refreshProgressBar(jprogressbarReadPermissions, 0, iCount);
        boolean groupHeader = isTreeNodeAGroup();
        FirebirdManagerPrivilege fbPrivileges = null;
        vecGrant = new Vector<Vector<Object>>();
        for (int i = 0; i < iCount; i++) {
            String relationName = listRoleNames.get(i);
            Vector<Object> vecRow = new Vector<Object>();
            vecRow.add(relationName);
            fbPrivileges = FirebirdManagerDataAccess.readPrivileges(session, gsTreenodeName, relationName,
                    groupHeader);
            vecRow.add(Boolean.valueOf(fbPrivileges.isMember()));
            vecGrant.add(vecRow);
            refreshProgressBar(jprogressbarReadPermissions, i + 1, iCount);
        }
        refreshTable(DISPLAY_TYPE_ROLE);
    }

    // ------------------------------------------------------------------------
    private void readDataTables() {
        int iCount = listTableNames.size();
        jprogressbarReadPermissions.setValue(0);
        jprogressbarReadPermissions.setMaximum(iCount);
        refreshProgressBar(jprogressbarReadPermissions, 0, iCount);
        boolean groupHeader = isTreeNodeAGroup();
        FirebirdManagerPrivilege fbPrivileges = null;
        vecGrant = new Vector<Vector<Object>>();
        for (int i = 0; i < iCount; i++) {
            String relationName = listTableNames.get(i).getName();
            Vector<Object> vecRow = new Vector<Object>();
            vecRow.add(relationName);
            fbPrivileges = FirebirdManagerDataAccess.readPrivileges(session, gsTreenodeName, relationName,
                    groupHeader);
            vecRow.add(listTableNames.get(i).getOwner());
            vecRow.add(Boolean.valueOf(fbPrivileges.isSelect()));
            vecRow.add(Boolean.valueOf(fbPrivileges.isInsert()));
            vecRow.add(Boolean.valueOf(fbPrivileges.isUpdate()));
            vecRow.add(Boolean.valueOf(fbPrivileges.isDelete()));
            vecRow.add(Boolean.valueOf(fbPrivileges.isReference()));
            vecGrant.add(vecRow);
            refreshProgressBar(jprogressbarReadPermissions, i + 1, iCount);
        }
        refreshTable(DISPLAY_TYPE_TABLE);
    }

    // ------------------------------------------------------------------------
    private void readDataViews() {
        int iCount = listViewNames.size();
        jprogressbarReadPermissions.setValue(0);
        jprogressbarReadPermissions.setMaximum(iCount);
        refreshProgressBar(jprogressbarReadPermissions, 0, iCount);
        boolean groupHeader = isTreeNodeAGroup();
        FirebirdManagerPrivilege fbPrivileges = new FirebirdManagerPrivilege();
        vecGrant = new Vector<Vector<Object>>();
        for (int i = 0; i < iCount; i++) {
            String relationName = listViewNames.get(i);
            Vector<Object> vecRow = new Vector<Object>();
            vecRow.add(relationName);
            fbPrivileges = FirebirdManagerDataAccess.readPrivileges(session, gsTreenodeName, relationName,
                    groupHeader);
            vecRow.add(Boolean.valueOf(fbPrivileges.isSelect()));
            vecRow.add(Boolean.valueOf(fbPrivileges.isInsert()));
            vecRow.add(Boolean.valueOf(fbPrivileges.isUpdate()));
            vecRow.add(Boolean.valueOf(fbPrivileges.isDelete()));
            vecRow.add(Boolean.valueOf(fbPrivileges.isReference()));
            vecGrant.add(vecRow);
            refreshProgressBar(jprogressbarReadPermissions, i + 1, iCount);
        }
        refreshTable(DISPLAY_TYPE_VIEW);
    }

    private void refreshProgressBar(JProgressBar pProgressBar, int piValue, int piCount) {
        pProgressBar.setString(piValue + "/" + piCount);
        pProgressBar.setValue(piValue);
        pProgressBar.paintImmediately(0, 0, pProgressBar.getWidth(), pProgressBar.getHeight());
    }

    // ------------------------------------------------------------------------
    private void refreshTable(int displayType) {
        DefaultTableModel tm = (DefaultTableModel) jtableGrant.getModel();
        tm.setDataVector(vecGrant, getTableHeader(displayType));
        tm.fireTableStructureChanged();
        setOptimalColumnWidth(displayType);
    }

    // ------------------------------------------------------------------------
    private void setCheckBoxStatus() {
        // Tables and Views
        jcheckboxAll.setEnabled(radioButtonTables.isSelected() || radioButtonViews.isSelected());
        jcheckboxSelect.setEnabled(jcheckboxAll.isEnabled());
        jcheckboxUpdate.setEnabled(jcheckboxAll.isEnabled());
        jcheckboxInsert.setEnabled(jcheckboxAll.isEnabled());
        jcheckboxDelete.setEnabled(jcheckboxAll.isEnabled());
        jcheckboxReference.setEnabled(jcheckboxAll.isEnabled());
        jcheckboxAll.setSelected(false);
        jcheckboxSelect.setSelected(false);
        jcheckboxUpdate.setSelected(false);
        jcheckboxInsert.setSelected(false);
        jcheckboxDelete.setSelected(false);
        jcheckboxReference.setSelected(false);
        // Procedures
        jcheckboxExecute.setEnabled(radioButtonProcedures.isSelected());
        jcheckboxExecute.setSelected(false);
        // Roles
        jcheckboxMember.setEnabled(radioButtonRoles.isSelected());
        jcheckboxMember.setSelected(false);
    }

    // ------------------------------------------------------------------------
    private void setPrivileges() {
        boolean bSetPermissions = true;
        if (gTreenodeType == TREENODE_TYPE_ROOT) {
            JOptionPane.showMessageDialog(session.getApplication().getMainFrame(),
                    i18n.GRANTMANAGER_INFO_SELECT_PERMISSION_RECEIVER);
            jtreeReceiver.requestFocus();
            bSetPermissions = false;
        } else if (isTreeNodeAGroup()) {
            bSetPermissions = JOptionPane.showConfirmDialog(session.getApplication().getMainFrame(),
                    i18n.GRANTMANAGER_QUEST_PERMISSION_FOR_GROUP + " " + gsTreenodeName + "?", "",
                    JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION;
        }

        if (bSetPermissions) {
            int[] iSelRows = jtableGrant.getSelectedRows();
            boolean bOK = true;

            // get grant target
            List<String> listGrantTarget = new ArrayList<String>();
            if (isTreeNodeAGroup()) {
                if (gTreenodeType == TREENODE_TYPE_USER_GROUP)
                    listGrantTarget = listUserNames;
                else if (gTreenodeType == TREENODE_TYPE_PROCEDURE_GROUP)
                    listGrantTarget = listProcedureNames;
                else if (gTreenodeType == TREENODE_TYPE_VIEW_GROUP)
                    listGrantTarget = listViewNames;
                else if (gTreenodeType == TREENODE_TYPE_TRIGGER_GROUP)
                    listGrantTarget = listTriggerNames;
                else if (gTreenodeType == TREENODE_TYPE_ROLE_GROUP)
                    listGrantTarget = listRoleNames;
            } else
                listGrantTarget.add(gsTreenodeName);

            int iCountSource = iSelRows.length;
            int iCountTarget = listGrantTarget.size();
            int iCount = iCountSource * iCountTarget;

            bSetPermissions = iCount < 10000;
            if (!bSetPermissions)
                bSetPermissions = JOptionPane.showConfirmDialog(session.getApplication().getMainFrame(),
                        i18n.GRANTMANAGER_INFO_PRIVILEGES_COUNT.replaceFirst("{1}", iCount + "") + CR
                                + "Do you want to do this?",
                        "", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_NO_OPTION;

            if (bSetPermissions) {
                int iValue = 0;
                jprogressbarSetPermissions.setMaximum(0);
                jprogressbarSetPermissions.setMaximum(iCount);
                refreshProgressBar(jprogressbarSetPermissions, iValue, iCount);
                for (int i = 0; i < iCountSource; i++) {
                    if (!bOK)
                        break;
                    String sGrantSource = (String) jtableGrant.getValueAt(iSelRows[i], 0);

                    for (int g = 0; g < iCountTarget; g++) {
                        String sGrantTarget = listGrantTarget.get(g);
                        if (radioButtonTables.isSelected() || radioButtonViews.isSelected())
                            bOK = setPrivilegesForTableAndView(sGrantSource, sGrantTarget, iSelRows[i]);
                        else if (radioButtonProcedures.isSelected())
                            bOK = setPrivilegesForProcedure(sGrantSource, sGrantTarget, iSelRows[i]);
                        else if (radioButtonRoles.isSelected())
                            bOK = setPrivilegesForRole(sGrantSource, sGrantTarget, iSelRows[i]);
                        iValue = i * iCountTarget + g + 1;
                        refreshProgressBar(jprogressbarSetPermissions, iValue, iCount);
                    } // for (int g=0; g<vecGrantTarget.size(); g++)
                }
            }
        }
    }

    // ------------------------------------------------------------------------
    private boolean setPrivilegesForTableAndView(String psGrantOn, String psGrantTo, int piRow) {
        String sSQLRevoke = "Revoke all on " + psGrantOn + " from " + psGrantTo;
        String sPrivileges = getSelectedPrivileges();
        String sSQLGrant = "Grant " + sPrivileges + " on " + psGrantOn + " to " + psGrantTo;
        if (sPrivileges.trim().equals(""))
            sSQLGrant = "";

        if (!setFirebirdPrivileges(sSQLRevoke, sSQLGrant)) {
            JOptionPane.showMessageDialog(session.getApplication().getMainFrame(),
                    i18n.GRANTMANAGER_ERROR_SET_PRIVILEGES);
            return false;
        } else {
            jtableGrant.setValueAt(Boolean.valueOf(jcheckboxSelect.isSelected() || jcheckboxAll.isSelected()),
                    piRow, 2);
            jtableGrant.setValueAt(Boolean.valueOf(jcheckboxInsert.isSelected() || jcheckboxAll.isSelected()),
                    piRow, 3);
            jtableGrant.setValueAt(Boolean.valueOf(jcheckboxUpdate.isSelected() || jcheckboxAll.isSelected()),
                    piRow, 4);
            jtableGrant.setValueAt(Boolean.valueOf(jcheckboxDelete.isSelected() || jcheckboxAll.isSelected()),
                    piRow, 5);
            jtableGrant.setValueAt(Boolean.valueOf(jcheckboxReference.isSelected() || jcheckboxAll.isSelected()),
                    piRow, 6);
            return true;
        }
    }

    // ------------------------------------------------------------------------
    private boolean setPrivilegesForProcedure(String psGrantOn, String psGrantTo, int piRow) {
        String sSQLRevoke = "Revoke all on " + psGrantOn + " from " + psGrantTo;
        String sPrivileges = getSelectedPrivileges();
        String sSQLGrant = "Grant " + sPrivileges + " on Procedure " + psGrantOn + " to " + psGrantTo;
        if (sPrivileges.trim().equals(""))
            sSQLGrant = "";

        if (!setFirebirdPrivileges(sSQLRevoke, sSQLGrant)) {
            JOptionPane.showMessageDialog(session.getApplication().getMainFrame(),
                    i18n.GRANTMANAGER_ERROR_SET_PRIVILEGES);
            return false;
        } else {
            jtableGrant.setValueAt(Boolean.valueOf(jcheckboxExecute.isSelected()), piRow, 1);
            return true;
        }
    }

    // ------------------------------------------------------------------------
    private boolean setPrivilegesForRole(String psGrantOn, String psGrantTo, int piRow) {
        String sSQLRevoke = "Revoke " + psGrantOn + " from " + psGrantTo;
        String sSQLGrant = "";
        if (jcheckboxMember.isSelected())
            sSQLGrant = "Grant " + psGrantOn + " to " + psGrantTo; // " WITH ADMIN OPTION"

        if (!setFirebirdPrivileges(sSQLRevoke, sSQLGrant)) {
            JOptionPane.showMessageDialog(session.getApplication().getMainFrame(),
                    i18n.GRANTMANAGER_ERROR_SET_PRIVILEGES);
            return false;
        } else {
            jtableGrant.setValueAt(Boolean.valueOf(jcheckboxMember.isSelected()), piRow, 1);
            return true;
        }
    }

    // ------------------------------------------------------------------------
    private void setTreeData() {
        DefaultTreeModel treeModel = (DefaultTreeModel) jtreeReceiver.getModel();

        FirebirdManagerGrantTreeNode nodeUsers = new FirebirdManagerGrantTreeNode(
                i18n.GRANTMANAGER_LBL_TREENODE_USERS + " (" + listUserNames.size() + ")", TREENODE_TYPE_USER_GROUP);
        treeModel.insertNodeInto(nodeUsers, rootNode, rootNode.getChildCount());
        if (listUserNames != null) {
            for (int i = 0; i < listUserNames.size(); i++) {
                FirebirdManagerGrantTreeNode node = new FirebirdManagerGrantTreeNode(listUserNames.get(i),
                        TREENODE_TYPE_USER);
                treeModel.insertNodeInto(node, nodeUsers, nodeUsers.getChildCount());
            }
        }

        FirebirdManagerGrantTreeNode nodeProcedures = new FirebirdManagerGrantTreeNode(
                i18n.GRANTMANAGER_LBL_TREENODE_STORED_PROCEDURES + " (" + listProcedureNames.size() + ")",
                TREENODE_TYPE_PROCEDURE_GROUP);
        treeModel.insertNodeInto(nodeProcedures, rootNode, rootNode.getChildCount());
        if (listProcedureNames != null) {
            for (int iV = 0; iV < listProcedureNames.size(); iV++) {
                FirebirdManagerGrantTreeNode node = new FirebirdManagerGrantTreeNode(listProcedureNames.get(iV),
                        TREENODE_TYPE_PROCEDURE);
                treeModel.insertNodeInto(node, nodeProcedures, nodeProcedures.getChildCount());
            }
        }

        FirebirdManagerGrantTreeNode nodeTriggers = new FirebirdManagerGrantTreeNode(
                i18n.GRANTMANAGER_LBL_TREENODE_TRIGGERS + " (" + listTriggerNames.size() + ")",
                TREENODE_TYPE_TRIGGER_GROUP);
        treeModel.insertNodeInto(nodeTriggers, rootNode, rootNode.getChildCount());
        if (listTriggerNames != null) {
            for (int iV = 0; iV < listTriggerNames.size(); iV++) {
                FirebirdManagerGrantTreeNode node = new FirebirdManagerGrantTreeNode(listTriggerNames.get(iV),
                        TREENODE_TYPE_TRIGGER);
                treeModel.insertNodeInto(node, nodeTriggers, nodeTriggers.getChildCount());
            }
        }

        FirebirdManagerGrantTreeNode nodeViews = new FirebirdManagerGrantTreeNode(
                i18n.GRANTMANAGER_LBL_TREENODE_VIEWS + " (" + listViewNames.size() + ")", TREENODE_TYPE_VIEW_GROUP);
        treeModel.insertNodeInto(nodeViews, rootNode, rootNode.getChildCount());
        if (listViewNames != null) {
            for (int iV = 0; iV < listViewNames.size(); iV++) {
                FirebirdManagerGrantTreeNode node = new FirebirdManagerGrantTreeNode(listViewNames.get(iV),
                        TREENODE_TYPE_VIEW);
                treeModel.insertNodeInto(node, nodeViews, nodeViews.getChildCount());
            }
        }

        FirebirdManagerGrantTreeNode nodeRoles = new FirebirdManagerGrantTreeNode(
                i18n.GRANTMANAGER_LBL_TREENODE_ROLES + " (" + listRoleNames.size() + ")", TREENODE_TYPE_ROLE_GROUP);
        treeModel.insertNodeInto(nodeRoles, rootNode, rootNode.getChildCount());
        if (listRoleNames != null) {
            for (int iV = 0; iV < listRoleNames.size(); iV++) {
                FirebirdManagerGrantTreeNode node = new FirebirdManagerGrantTreeNode(listRoleNames.get(iV),
                        TREENODE_TYPE_ROLE);
                treeModel.insertNodeInto(node, nodeRoles, nodeRoles.getChildCount());
            }
        }

        treeModel.reload();
        jtreeReceiver.expandPath(new TreePath(nodeUsers.getPath()));
    }

    // ########################################################################
    public boolean setFirebirdPrivileges(String psSQLRevoke, String psSQLGrant) {

        Statement stmt = null;
        try {
            stmt = session.getSQLConnection().createStatement();
            stmt.execute(psSQLRevoke);
        } catch (SQLException e) {
            log.error(e.getLocalizedMessage() + CR + "Statement:" + CR + psSQLRevoke);
            return false;
        } finally {
            SQLUtilities.closeStatement(stmt);
        }

        try {
            if (!psSQLGrant.trim().equals("")) {
                stmt = session.getSQLConnection().createStatement();
                stmt.execute(psSQLGrant);
            }
        } catch (SQLException e) {
            log.error(e.getLocalizedMessage() + CR + "Statement:" + CR + psSQLGrant + CR);
            return false;
        } finally {
            SQLUtilities.closeStatement(stmt);
        }

        return true;
    }

    // ########################################################################
    // ########## events
    // ########################################################################
    // ------------------------------------------------------------------------
    // ------------------------------------------------------------------------
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == btnSetPermissions)
            setPrivileges();
        else if (e.getSource() == radioButtonTables || e.getSource() == radioButtonViews
                || e.getSource() == radioButtonProcedures || e.getSource() == radioButtonRoles)
            readData();
    }

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

    public void keyReleased(KeyEvent e) {
        if (e.getSource() == jtableGrant)
            getPrivileges();
    }

    public void keyTyped(KeyEvent e) {
    }

    // ------------------------------------------------------------------------
    public void mouseClicked(MouseEvent e) {
        if (e.getSource() == jtableGrant) {
            getPrivileges();
            btnSetPermissions.setEnabled(jtableGrant.getSelectedRow() > -1);
        }
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    public void mousePressed(MouseEvent e) {
    }

    public void mouseReleased(MouseEvent e) {
    }

    // ------------------------------------------------------------------------
    public void windowActivated(WindowEvent e) {
    }

    public void windowClosed(WindowEvent e) {
    }

    public void windowClosing(WindowEvent e) {
    }

    public void windowDeactivated(WindowEvent e) {
    }

    public void windowDeiconified(WindowEvent e) {
    }

    public void windowIconified(WindowEvent e) {
    }

    public void windowOpened(WindowEvent e) {
    }
}

class FirebirdManagerGrantTableModel extends DefaultTableModel {
    private static final long serialVersionUID = 3799375215782358670L;

    @SuppressWarnings("all")
    public FirebirdManagerGrantTableModel(Vector data, Vector columnNames) {
        super(data, columnNames);
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        return false; // super.isCellEditable(row, column);
    }

}

class FirebirdManagerGrantTreeRenderer extends DefaultTreeCellRenderer {
    private static final long serialVersionUID = 1472117273650521629L;

    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
            boolean leaf, int row, boolean hasFocus) {
        super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);

        // set default colors
        setBackground(Color.LIGHT_GRAY);
        setBackgroundNonSelectionColor(Color.LIGHT_GRAY);
        setBackgroundSelectionColor(Color.BLUE);

        if (value instanceof FirebirdManagerGrantTreeNode) {
            switch (((FirebirdManagerGrantTreeNode) value).getTreenodeType()) {
            // root
            case FirebirdManagerGrantFrame.TREENODE_TYPE_ROOT:
                setFont(new Font(getFont().getFamily(), Font.BOLD, getFont().getSize()));
                setIcon(FirebirdManagerHelper.loadIcon("grant_receiver16x16.png"));
                break;
            // groups
            case FirebirdManagerGrantFrame.TREENODE_TYPE_USER_GROUP:
                setFont(new Font(getFont().getFamily(), Font.BOLD, getFont().getSize()));
                setIcon(FirebirdManagerHelper.loadIcon("user16x16.png"));
                break;
            case FirebirdManagerGrantFrame.TREENODE_TYPE_PROCEDURE_GROUP:
                setFont(new Font(getFont().getFamily(), Font.BOLD, getFont().getSize()));
                setIcon(FirebirdManagerHelper.loadIcon("procedure16x16.png"));
                break;
            case FirebirdManagerGrantFrame.TREENODE_TYPE_TRIGGER_GROUP:
                setFont(new Font(getFont().getFamily(), Font.BOLD, getFont().getSize()));
                setIcon(FirebirdManagerHelper.loadIcon("trigger16x16.png"));
                break;
            case FirebirdManagerGrantFrame.TREENODE_TYPE_VIEW_GROUP:
                setFont(new Font(getFont().getFamily(), Font.BOLD, getFont().getSize()));
                setIcon(FirebirdManagerHelper.loadIcon("view16x16.png"));
                break;
            case FirebirdManagerGrantFrame.TREENODE_TYPE_ROLE_GROUP:
                setFont(new Font(getFont().getFamily(), Font.BOLD, getFont().getSize()));
                setIcon(FirebirdManagerHelper.loadIcon("role16x16.png"));
                break;

            // childs
            case FirebirdManagerGrantFrame.TREENODE_TYPE_USER:
                setFont(new Font(getFont().getFamily(), Font.PLAIN, getFont().getSize()));
                if (((FirebirdManagerGrantTreeNode) value).getUserObject().toString().trim().toUpperCase()
                        .equals("SYSDBA"))
                    setIcon(FirebirdManagerHelper.loadIcon("sysdba16x16.png"));
                else
                    setIcon(FirebirdManagerHelper.loadIcon("user16x16.png"));
                break;
            case FirebirdManagerGrantFrame.TREENODE_TYPE_PROCEDURE:
                setFont(new Font(getFont().getFamily(), Font.PLAIN, getFont().getSize()));
                setIcon(FirebirdManagerHelper.loadIcon("procedure16x16.png"));
                break;
            case FirebirdManagerGrantFrame.TREENODE_TYPE_TRIGGER:
                setFont(new Font(getFont().getFamily(), Font.PLAIN, getFont().getSize()));
                setIcon(FirebirdManagerHelper.loadIcon("trigger16x16.png"));
                break;
            case FirebirdManagerGrantFrame.TREENODE_TYPE_VIEW:
                setFont(new Font(getFont().getFamily(), Font.PLAIN, getFont().getSize()));
                setIcon(FirebirdManagerHelper.loadIcon("view16x16.png"));
                break;
            case FirebirdManagerGrantFrame.TREENODE_TYPE_ROLE:
                setFont(new Font(getFont().getFamily(), Font.PLAIN, getFont().getSize()));
                setIcon(FirebirdManagerHelper.loadIcon("role16x16.png"));
                break;
            default:
                break;
            }
        }

        return this;
    }
}

class FirebirdManagerGrantTableRenderer extends JComponent implements TableCellRenderer {
    private static final long serialVersionUID = 8399845562910155925L;

    private Border borderLabel = BorderFactory.createEmptyBorder(0, 3, 0, 3);

    /**
     * @see javax.swing.table.TableCellRenderer#getTableCellRendererComponent(javax.swing.JTable, java.lang.Object, boolean, boolean, int, int)
     */
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
            int row, int column) {
        JComponent comp = null;
        if (value instanceof String) {
            comp = new JLabel(value.toString());
            ((JLabel) comp).setHorizontalAlignment(SwingConstants.LEFT);
            ((JLabel) comp).setBorder(borderLabel);
            ((JLabel) comp).setOpaque(true);
        } else if (value instanceof Boolean) {
            comp = new JCheckBox("");
            ((JCheckBox) comp).setHorizontalAlignment(SwingConstants.CENTER);
        }

        // setting color
        if (isSelected) {
            comp.setBackground(table.getSelectionBackground());
            comp.setForeground(table.getSelectionForeground());
        } else {
            comp.setBackground(table.getBackground());
            comp.setForeground(table.getForeground());
        }

        // setting value
        if (value != null && value instanceof Boolean) {
            ((JCheckBox) comp).setSelected(((Boolean) value).booleanValue());
        }

        return comp;
    }
}