Package net.sourceforge.squirrel_sql.plugins.smarttools.gui

Source Code of net.sourceforge.squirrel_sql.plugins.smarttools.gui.SmarttoolChangeValuesFrame

/*
* 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.smarttools.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.ITableInfo;
import net.sourceforge.squirrel_sql.fw.sql.TableColumnInfo;
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.smarttools.STDataType;
import net.sourceforge.squirrel_sql.plugins.smarttools.SmarttoolsHelper;
import net.sourceforge.squirrel_sql.plugins.smarttools.comp.STButton;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Vector;

/**
* @author Mike
*/
public class SmarttoolChangeValuesFrame extends DialogWidget implements ISmarttoolFrame, ActionListener
{
  private static final long serialVersionUID = 3680564541641320485L;

  private final String WILDCARD = "%";

  private final String INDENT = "   ";

  private final int START_SEARCHING = 0;

  private final int START_CHANGEING = 1;

  private final int STOP_WORKING = 2;

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

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

  private final int TABLE_COL_MARKER = 0;

  private final int TABLE_COL_TABLE = 1;

  private final int TABLE_COL_COLUMNNAME = 2;

  // private final int TABLE_COL_DATATYPE = 3; // not used
  private final int TABLE_COL_RECORDS = 4;

  private final int TABLE_COL_STATUS = 5;

  private final int[] TABLE_DEFAULT_COL_WIDTH = new int[] { 30, 205, 210, 80, 120, 50 };

  private ISession session;

  private Thread threadSearching = null;

  private Thread threadChanging = null;

  private boolean threadSuspended;

  private Vector<String> vecHeader = new Vector<String>();

  private Vector<Vector<Object>> vecData = new Vector<Vector<Object>>();

  private boolean operatorActionListenerDisabled = false;

  // visible (gui)
  // ------------------------------------------------------------------------
  private JPanel panelMain = new JPanel();

  private JLabel lblColumn = new JLabel();

  private JTextField tfColumnName = new JTextField();

  private JLabel lblDatatype = new JLabel();

  private JComboBox cbDataType = new JComboBox();

  private JCheckBox chkDisplayOnlyTablesWithData = new JCheckBox();

  private JLabel lblWhere = new JLabel();

  private JLabel lblOperator = new JLabel();

  private JComboBox cbOperator = new JComboBox();

  private JTextField tfOldValue = new JTextField();

  private JLabel lblNewValue = new JLabel();

  private JTextField tfNewValue = new JTextField();

  private JCheckBox chkEnableChangeData = new JCheckBox();

  private STButton btnSearchData = new STButton();

  private STButton btnChangeData = new STButton();

  private STButton btnStop = new STButton();

  private JPanel panelResult = new JPanel();

  private STButton btnSelectAll = new STButton();

  private STButton btnSelectNone = new STButton();

  private JLabel lblTitleResult = new JLabel();

  private JTable tblResult = new JTable();

  private STButton btnPrint = new STButton();

  private JLabel lblFooterTableResult = new JLabel();

  private JProgressBar pbMain = new JProgressBar();

  private ImageIcon iconMarked = SmarttoolsHelper.loadIcon("gridMarked16x16.png");

  private ImageIcon iconDemarked = SmarttoolsHelper.loadIcon("gridDemarked16x16.png");

  /**
   * Constructor
   *
   * @param app
   * @param rsrc
   * @param session
   * @param tab
   */
  public SmarttoolChangeValuesFrame(ISession session, String title)
  {
    super("Smarttool - " + title, true, true, true, true, session.getApplication());
    this.session = session;

    initLayout();
    this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    this.setVisible(true);
    this.moveToFront();
    JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.WARNING, i18n.WARNING_TITLE, JOptionPane.WARNING_MESSAGE);
  }

  private void initLayout()
  {
    this.getContentPane().setLayout(new BorderLayout());
    createTableHeader();
    tblResult = new JTable(vecData, vecHeader);
    this.getContentPane().add(createPanelMain());

    initVisualObjects();
  }

  private void initVisualObjects()
  {
    lblColumn.setText(i18n.GLOBAL_COLUMN);
    lblDatatype.setText(i18n.GLOBAL_DATATYPE);
    lblNewValue.setText(i18n.LBL_NEW_VALUE);
    lblTitleResult.setText(i18n.LBL_TITLE_RESULT);
    lblOperator.setText(i18n.GLOBAL_OPERATOR);
    lblNewValue.setText(i18n.LBL_NEW_VALUE);
    lblWhere.setText(i18n.LBL_WHERE);

    tfColumnName.setToolTipText(i18n.TOOLTIP_WILDCARD);
    tfOldValue.setToolTipText(i18n.TOOLTIP_TF_OLD_VALUE);

    btnSearchData.setText(i18n.LBL_BTN_SEARCHDATA);
    btnSearchData.setIcon(SmarttoolsHelper.loadIcon("start16x16.png"));
    btnSearchData.addActionListener(this);

    btnChangeData.setText(i18n.LBL_BTN_CHANGEDATA);
    btnChangeData.setIcon(SmarttoolsHelper.loadIcon("change16x16.png"));
    btnChangeData.addActionListener(this);

    btnStop.setText(i18n.GLOBAL_BTN_STOP);
    btnStop.setIcon(SmarttoolsHelper.loadIcon("stop16x16.png"));
    btnStop.addActionListener(this);
    btnStop.setEnabled(false);

    btnPrint.setText(i18n.GLOBAL_BTN_PRINT);
    btnPrint.setIcon(SmarttoolsHelper.loadIcon("printer16x16.png"));
    btnPrint.addActionListener(this);
    btnPrint.setEnabled(false);

    btnSelectAll.setText(i18n.LBL_BTN_ALL);
    btnSelectAll.setToolTipText(i18n.TOOLTIP_BTN_ALL);
    btnSelectAll.setIcon(iconMarked);
    btnSelectAll.addActionListener(this);

    btnSelectNone.setText(i18n.LBL_BTN_NONE);
    btnSelectNone.setToolTipText(i18n.TOOLTIP_BTN_NONE);
    btnSelectNone.setIcon(iconDemarked);
    btnSelectNone.addActionListener(this);

    fillDataTypes();
    cbDataType.addActionListener(this);
    cbDataType.setSelectedIndex(0);
    cbOperator.addActionListener(this);

    chkDisplayOnlyTablesWithData.setText(i18n.LBL_CHK_ONLY_TABLES_WITH_DATA);
    chkEnableChangeData.setText(i18n.LBL_CHK_ENABLE_CHANGE_DATA);
    chkEnableChangeData.addActionListener(this);

    tblResult.setDefaultRenderer(Object.class, new SmarttoolChangeValuesTableCellRenderer());
    tblResult.setModel(new SmarttoolChangeValuesTableModel());
    tblResult.setRowSelectionAllowed(true);
    tblResult.setColumnSelectionAllowed(false);
    // tblResult.setAutoCreateRowSorter(true);
    tblResult.addMouseListener(new MouseAdapter()
    {
      @Override
      public void mouseClicked(MouseEvent e)
      {
        super.mouseClicked(e);
        if (tblResult.getSelectedColumn() == TABLE_COL_MARKER)
        {
          int row = tblResult.getSelectedRow();
          boolean newMarkerValue =
            !((Boolean) tblResult.getValueAt(row, TABLE_COL_MARKER)).booleanValue();
          tblResult.setValueAt(newMarkerValue, row, TABLE_COL_MARKER);
          tblResult.setValueAt(newMarkerValue ? 0 : -1, row, TABLE_COL_STATUS);
        }
      }

    });
    tblResult.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    SmarttoolsHelper.setColumnWidth(tblResult, TABLE_DEFAULT_COL_WIDTH);

    pbMain.setValue(0);
    pbMain.setStringPainted(true);

    controlComponents(STOP_WORKING);
  }

  private void createTableHeader()
  {
    vecHeader.add("");
    vecHeader.add(i18n.GLOBAL_TABLE);
    vecHeader.add(i18n.GLOBAL_COLUMN);
    vecHeader.add(i18n.GLOBAL_DATATYPE);
    vecHeader.add(i18n.GLOBAL_RECORDS);
    vecHeader.add(i18n.GLOBAL_STATUS);
  }

  private void fillDataTypes()
  {
    cbDataType.removeAllItems();
    List<STDataType> data = SmarttoolsHelper.getListSmarttoolsDataType(false);
    for (int i = 0; i < data.size(); i++)
    {
      cbDataType.addItem(data.get(i));
    }
    cbDataType.setSelectedIndex(0);
  }

  public JPanel createPanelMain()
  {
    panelMain.setName("panelMain");
    FormLayout formlayout1 =
      new FormLayout(
        "FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:100DLU:NONE,FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:80DLU:NONE,FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:8DLU:GROW(1.0),FILL:DEFAULT:NONE,FILL:4DLU:NONE",
        "CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:4DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE,CENTER:2DLU:NONE");
    CellConstraints cc = new CellConstraints();
    panelMain.setLayout(formlayout1);

    lblColumn.setName("lblColumn");
    lblColumn.setText("column name");
    panelMain.add(lblColumn, cc.xy(2, 2));

    tfColumnName.setName("tfColumnName");
    panelMain.add(tfColumnName, cc.xy(4, 2));

    lblDatatype.setName("lblDatatype");
    lblDatatype.setText("datatype");
    panelMain.add(lblDatatype, cc.xy(6, 2));

    cbDataType.setName("cbDataType");
    panelMain.add(cbDataType, cc.xy(8, 2));

    btnSearchData.setActionCommand("JButton");
    btnSearchData.setName("btnSearchData");
    btnSearchData.setText("search data");
    panelMain.add(btnSearchData, cc.xy(13, 2));

    btnChangeData.setActionCommand("JButton");
    btnChangeData.setEnabled(false);
    btnChangeData.setName("btnChangeData");
    btnChangeData.setText("change data");
    panelMain.add(btnChangeData, cc.xy(13, 4));

    chkDisplayOnlyTablesWithData.setActionCommand("display only rows with data");
    chkDisplayOnlyTablesWithData.setName("chkDisplayOnlyTablesWithData");
    chkDisplayOnlyTablesWithData.setSelected(true);
    chkDisplayOnlyTablesWithData.setText("display only rows with data");
    panelMain.add(chkDisplayOnlyTablesWithData, cc.xy(10, 2));

    btnStop.setActionCommand("stop");
    btnStop.setEnabled(false);
    btnStop.setName("btnStop");
    btnStop.setText("stop");
    panelMain.add(btnStop, cc.xy(13, 6));

    pbMain.setName("pbMain");
    pbMain.setValue(25);
    panelMain.add(pbMain, cc.xywh(2, 12, 12, 1));

    lblOperator.setName("lblOperator");
    lblOperator.setText("operator");
    panelMain.add(lblOperator, cc.xy(6, 4));

    cbOperator.setName("cbOperator");
    panelMain.add(cbOperator, cc.xy(8, 4));

    lblNewValue.setName("lblNewValue");
    lblNewValue.setText("new value");
    panelMain.add(lblNewValue, cc.xy(2, 6));

    tfNewValue.setName("tfNewValue");
    panelMain.add(tfNewValue, cc.xy(4, 6));

    chkEnableChangeData.setActionCommand("enable change data");
    chkEnableChangeData.setName("chkEnableChangeData");
    chkEnableChangeData.setText("enable change button");
    panelMain.add(chkEnableChangeData, cc.xy(10, 6));

    tfOldValue.setName("tfOldValue");
    panelMain.add(tfOldValue, cc.xy(10, 4));

    lblWhere.setName("lblWhere");
    lblWhere.setText("where");
    lblWhere.setHorizontalAlignment(JLabel.RIGHT);
    panelMain.add(lblWhere, cc.xy(4, 4));

    lblFooterTableResult.setBackground(new Color(153, 153, 153));
    lblFooterTableResult.setName("lblFooterTableResult");
    lblFooterTableResult.setOpaque(true);
    lblFooterTableResult.setText("Finished in ...");
    panelMain.add(lblFooterTableResult, cc.xywh(2, 10, 12, 1));

    panelMain.add(createpanelResult(), cc.xywh(2, 8, 12, 1));

    return panelMain;
  }

  public JPanel createpanelResult()
  {
    panelResult.setName("panelResult");
    FormLayout formlayout1 =
      new FormLayout(
        "FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:DEFAULT:NONE,FILL:4DLU:NONE,FILL:DEFAULT:GROW(1.0),FILL:4DLU:NONE,FILL:DEFAULT:NONE",
        "FILL:DEFAULT:NONE,CENTER:2DLU:NONE,CENTER:DEFAULT:NONE");
    CellConstraints cc = new CellConstraints();
    panelResult.setLayout(formlayout1);

    btnSelectAll.setActionCommand("all");
    btnSelectAll.setName("btnSelectAll");
    btnSelectAll.setText("all");
    btnSelectAll.setToolTipText("select all result entries");
    panelResult.add(btnSelectAll, cc.xy(1, 1));

    btnSelectNone.setActionCommand("none");
    btnSelectNone.setName("btnSelectNone");
    btnSelectNone.setText("none");
    btnSelectNone.setToolTipText("deselect all result entries");
    panelResult.add(btnSelectNone, cc.xy(3, 1));

    tblResult.setName("tblResult");
    JScrollPane jscrollpane1 = new JScrollPane();
    jscrollpane1.setViewportView(tblResult);
    jscrollpane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
    jscrollpane1.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    panelResult.add(jscrollpane1, cc.xywh(1, 3, 7, 1));

    lblTitleResult.setBackground(new Color(153, 153, 153));
    lblTitleResult.setName("lblTitleResult");
    lblTitleResult.setOpaque(true);
    lblTitleResult.setText("Found tables and columns:");
    EmptyBorder emptyborder1 = new EmptyBorder(0, 5, 0, 0);
    lblTitleResult.setBorder(emptyborder1);
    panelResult.add(lblTitleResult, cc.xy(5, 1));

    btnPrint.setActionCommand("print");
    btnPrint.setName("btnPrint");
    btnPrint.setText(" print ");
    panelResult.add(btnPrint, cc.xy(7, 1));

    return panelResult;
  }

  /*
   * (non-Javadoc)
   *
   * @see net.sourceforge.squirrel_sql.plugins.smarttools.gui.ISmarttoolFrame#setFocusToFirstEmptyInputField()
   */
  public void setFocusToFirstEmptyInputField()
  {
    tfColumnName.requestFocusInWindow();
  }

  private String getHeaderText()
  {
    return this.getTitle();
  }

  private String getFooterText()
  {
    return i18n.GLOBAL_ALIAS + ": " + session.getAlias().getName() + " | "
      + DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT).format(new Date()) + " | "
      + i18n.GLOBAL_PAGE + " {0}";
  }

  private int getUsedGroup()
  {
    return ((STDataType) cbDataType.getSelectedItem()).getGroup();
  }

  private int getUsedDataType()
  {
    return ((STDataType) cbDataType.getSelectedItem()).getJdbcType();
  }

  private boolean isInputOK(int threadType)
  {
    if (threadType == START_SEARCHING)
    {
      if (tfColumnName.getText().trim().length() < 1)
      {
        JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.ERROR_COLUMNNAME_MISSING);
        tfColumnName.requestFocusInWindow();
        return false;
      }
    }
    else
    {
      int group = getUsedGroup();
      if (group == STDataType.GROUP_INT)
      {
        try
        {
          Integer.parseInt(tfNewValue.getText());
        }
        catch (NumberFormatException ex)
        {
          JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.GLOBAL_ERROR_FORMAT_INTEGER);
          tfNewValue.requestFocusInWindow();
          return false;
        }
      }
      else if (group == STDataType.GROUP_NUMERIC)
      {
        try
        {
          Double.parseDouble(tfNewValue.getText());
        }
        catch (NumberFormatException ex)
        {
          JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.GLOBAL_ERROR_FORMAT_NUMERIC);
          tfNewValue.requestFocusInWindow();
          return false;
        }
      }
      else if (group == STDataType.GROUP_DATE)
      {
        int dataType = getUsedDataType();
        DateFormat df = null;
        if (dataType == Types.DATE)
        {
          df = DateFormat.getDateInstance();
          try
          {
            df.parse(tfNewValue.getText());
          }
          catch (ParseException ex)
          {
            JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.GLOBAL_ERROR_FORMAT_DATE);
            tfNewValue.requestFocusInWindow();
            return false;
          }
        }
        else if (dataType == Types.TIMESTAMP)
        {
          df = DateFormat.getDateTimeInstance();
          try
          {
            df.parse(tfNewValue.getText());
          }
          catch (ParseException ex)
          {
            JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.GLOBAL_ERROR_FORMAT_DATETIME);
            tfNewValue.requestFocusInWindow();
            return false;
          }
        }
        else if (dataType == Types.TIME)
        {
          df = DateFormat.getTimeInstance();
          try
          {
            df.parse(tfNewValue.getText());
          }
          catch (ParseException ex)
          {
            JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.GLOBAL_ERROR_FORMAT_TIME);
            tfNewValue.requestFocusInWindow();
            return false;
          }
        }
      } // if (group == STDataType.GROUP_DATE)
      boolean selectedRowExists = false;
      for (int row = 0; row < tblResult.getRowCount(); row++)
      {
        if (((Boolean) tblResult.getValueAt(row, TABLE_COL_MARKER)).booleanValue())
        {
          selectedRowExists = true;
          break;
        }
      }
      if (!selectedRowExists)
      {
        JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.ERROR_SELECT_ENTRY);
        return false;
      }
    }

    if (tfOldValue.isEnabled() && tfOldValue.getText().trim().length() == 0)
    {
      JOptionPane.showMessageDialog(session.getApplication().getMainFrame(), i18n.ERROR_MISSING_OLD_VALUE);
      return false;
    }
    return true;
  }

  private String getWhereCondition(String columnName, String value)
  {
    if (cbOperator.getSelectedIndex() > 0)
    {
      return " where " + columnName + " " + (String) cbOperator.getSelectedItem() + " " + value;
    }
    else
    {
      return "";
    }
  }

  private void startSearching()
  {
    if (isInputOK(START_SEARCHING))
    {
      controlComponents(START_SEARCHING);
      chkEnableChangeData.setSelected(false);
      threadSearching = new ThreadSearching();
      threadSearching.start();
    }
  }

  private void startChanging()
  {
    if (isInputOK(START_CHANGEING)
      && JOptionPane.showConfirmDialog(session.getApplication().getMainFrame(), i18n.QUESTION_START_CHANGING,
        i18n.QUESTION_START_CHANGING_TITLE, JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
    {
      controlComponents(START_CHANGEING);
      chkEnableChangeData.setSelected(false);
      threadChanging = new ThreadChanging();
      threadChanging.start();
    }
  }

  private void stopWork()
  {
    threadSuspended = true;
    if (JOptionPane.showConfirmDialog(session.getApplication().getMainFrame(), i18n.QUESTION_CANCEL_WORK, i18n.QUESTION_CANCEL_WORK_TITLE,
      JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
    {
      if (threadSearching != null)
      {
        threadSearching = null;
      }
      else
      {
        threadChanging = null;
      }
      controlComponents(STOP_WORKING);
    }
    threadSuspended = false;
  }

  // controlling
  // ------------------------------------------------------------------------
  public void controlComponents(int type)
  {
    boolean enabled = type == STOP_WORKING;

    tfColumnName.setEnabled(enabled);
    cbDataType.setEnabled(enabled);
    cbOperator.setEnabled(enabled);
    controlTfOldValue(enabled);
    chkDisplayOnlyTablesWithData.setEnabled(enabled);
    chkEnableChangeData.setEnabled(enabled && tblResult.getRowCount() > 0);
    tfNewValue.setEnabled(enabled && chkEnableChangeData.isSelected());

    btnSearchData.setEnabled(enabled);
    btnChangeData.setEnabled(enabled && chkEnableChangeData.isSelected());
    btnStop.setEnabled(!enabled);
    btnPrint.setEnabled(enabled && tblResult.getRowCount() > 0);
    btnSelectAll.setEnabled(enabled && tblResult.getRowCount() > 0);
    btnSelectNone.setEnabled(enabled && tblResult.getRowCount() > 0);
    tblResult.setEnabled(enabled);

    tfColumnName.setBackground(tfColumnName.isEnabled() ? Color.WHITE : Color.LIGHT_GRAY);
    tfNewValue.setBackground(tfNewValue.isEnabled() ? Color.WHITE : Color.LIGHT_GRAY);
  }

  private void controlTfOldValue(boolean enabled)
  {
    tfOldValue.setEnabled(enabled && cbOperator.getSelectedIndex() > 0 && !isNullOperator());
    if (isNullOperator() || cbOperator.getSelectedIndex() == 0)
    {
      tfOldValue.setText("");
    }
    tfOldValue.setBackground(tfOldValue.isEnabled() ? Color.WHITE : Color.LIGHT_GRAY);
  }

  private boolean isNullOperator()
  {
    return ((String) cbOperator.getSelectedItem()).toLowerCase().indexOf("null") > -1;
  }

  private String getOldValue()
  {
    if (isNullOperator()) { return ""; }

    String oldValue = tfOldValue.getText();
    if (getUsedGroup() == STDataType.GROUP_CHAR || getUsedGroup() == STDataType.GROUP_DATE)
    {
      oldValue = "'" + oldValue + "'";
    }
    return oldValue;
  }

  private String getNewValue()
  {
    String newValue = tfNewValue.getText();
    if (getUsedGroup() == STDataType.GROUP_CHAR || getUsedGroup() == STDataType.GROUP_DATE)
    {
      newValue = "'" + newValue + "'";
    }
    return newValue;
  }

  // ########################################################################
  // ########## events
  // ########################################################################
  // ------------------------------------------------------------------------
  public void actionPerformed(ActionEvent e)
  {
    if (e.getSource() == btnSearchData)
    {
      startSearching();
    }
    else if (e.getSource() == btnChangeData)
    {
      startChanging();
    }
    else if (e.getSource() == btnStop)
    {
      stopWork();
    }
    else if (e.getSource() == btnPrint)
    {
      SmarttoolsHelper.printTable(tblResult, getHeaderText(), getFooterText());
    }
    else if (e.getSource() == btnSelectAll)
    {
      SmarttoolsHelper.markAllRows(tblResult, TABLE_COL_MARKER, true);
      ((SmarttoolChangeValuesTableModel) tblResult.getModel()).fireTableDataChanged();
    }
    else if (e.getSource() == btnSelectNone)
    {
      SmarttoolsHelper.markAllRows(tblResult, TABLE_COL_MARKER, false);
      ((SmarttoolChangeValuesTableModel) tblResult.getModel()).fireTableDataChanged();
    }
    else if (e.getSource() == chkEnableChangeData)
    {
      controlComponents(STOP_WORKING);
      tfNewValue.requestFocusInWindow();
    }
    else if (e.getSource() == cbDataType)
    {
      operatorActionListenerDisabled = true;
      SmarttoolsHelper.fillOperatorTypes(cbOperator, getUsedGroup());
      cbOperator.insertItemAt(i18n.ENTRY_NO_CONDITION, 0);
      operatorActionListenerDisabled = false;
      cbOperator.setSelectedIndex(0);
    }
    else if (e.getSource() == cbOperator)
    {
      if (!operatorActionListenerDisabled)
      {
        controlTfOldValue(true);
      }
    }
  }

  private interface i18n
  {
    // Global misc
    String GLOBAL_RECORDS = stringManager.getString("global.records");

    String GLOBAL_TABLE = stringManager.getString("global.table");

    String GLOBAL_COLUMN = stringManager.getString("global.column");

    String GLOBAL_DATATYPE = stringManager.getString("global.datatype");

    String GLOBAL_STATUS = stringManager.getString("global.status");

    String GLOBAL_PAGE = stringManager.getString("global.page");

    String GLOBAL_ALIAS = stringManager.getString("global.alias");

    String GLOBAL_OPERATOR = stringManager.getString("global.operator");

    String GLOBAL_VALUE = stringManager.getString("global.value");

    String GLOBAL_BTN_STOP = stringManager.getString("global.lbl.btn.stop");

    String GLOBAL_BTN_PRINT = stringManager.getString("global.lbl.btn.print");

    // Global errors
    String GLOBAL_ERROR_FORMAT_INTEGER = stringManager.getString("global.error.format.integer");

    String GLOBAL_ERROR_FORMAT_NUMERIC = stringManager.getString("global.error.format.numeric");

    String GLOBAL_ERROR_FORMAT_DATE = stringManager.getString("global.error.format.date");

    String GLOBAL_ERROR_FORMAT_DATETIME = stringManager.getString("global.error.format.datetime");

    String GLOBAL_ERROR_FORMAT_TIME = stringManager.getString("global.error.format.time");

    // Misc
    String WARNING_TITLE = stringManager.getString("changevalues.info.warning.title");

    String WARNING = stringManager.getString("changevalues.info.warning");

    // Labels
    String LBL_COLUMNNAME = stringManager.getString("changevalues.lbl.columnname");

    String LBL_NEW_VALUE = stringManager.getString("changevalues.lbl.new.value");

    String LBL_WHERE = stringManager.getString("changevalues.lbl.where");

    String LBL_TITLE_RESULT = stringManager.getString("changevalues.lbl.title.result");

    String LBL_BTN_SEARCHDATA = stringManager.getString("changevalues.btn.searchdata");

    String LBL_BTN_CHANGEDATA = stringManager.getString("changevalues.btn.changedata");

    String LBL_BTN_ALL = stringManager.getString("changevalues.btn.select.all");

    String LBL_BTN_NONE = stringManager.getString("changevalues.btn.select.none");

    String LBL_CHK_ONLY_TABLES_WITH_DATA =
      stringManager.getString("changevalues.chk.lbl.only.tables.with.data");

    String LBL_CHK_ENABLE_CHANGE_DATA = stringManager.getString("changevalues.chk.lbl.enable.change.data");

    // Entries
    String ENTRY_NO_CONDITION = stringManager.getString("changevalues.entry.no.condition");

    // Tooltips
    String TOOLTIP_WILDCARD = stringManager.getString("changevalues.tooltip.wildcard");

    String TOOLTIP_BTN_ALL = stringManager.getString("changevalues.tooltip.btn.select.all");

    String TOOLTIP_BTN_NONE = stringManager.getString("changevalues.tooltip.btn.select.none");

    String TOOLTIP_TF_OLD_VALUE = stringManager.getString("changevalues.tooltip.old.value");

    // Questions
    String QUESTION_CANCEL_WORK = stringManager.getString("changevalues.question.cancel.work");

    String QUESTION_CANCEL_WORK_TITLE = stringManager.getString("changevalues.question.cancel.work.title");

    String QUESTION_START_CHANGING = stringManager.getString("changevalues.question.start.changing");

    String QUESTION_START_CHANGING_TITLE =
      stringManager.getString("changevalues.question.start.changing.title");

    // Info
    String INFO_SEARCHING_FINISHED = stringManager.getString("changevalues.info.searching.finished");

    String INFO_CHANGING_FINISHED = stringManager.getString("changevalues.info.changing.finished");

    String INFO_CHANGING_DATA_FOR_COLUMNNAME =
      stringManager.getString("changevalues.info.changing.data.for.columnname");

    // Errors
    String ERROR_COLUMNNAME_MISSING = stringManager.getString("changevalues.error.columnname.missing");

    String ERROR_SEARCHING_DATA = stringManager.getString("changevalues.error.searching.data");

    String ERROR_CHANGING_DATA = stringManager.getString("changevalues.error.changing.data");

    String ERROR_ON_TABLE = stringManager.getString("changevalues.error.on.table");

    String ERROR_CREATING_STATEMENT = stringManager.getString("changevalues.error.creating.statement");

    String ERROR_CLOSING_STATEMENT = stringManager.getString("changevalues.error.closing.statement");

    String ERROR_SELECT_ENTRY = stringManager.getString("changevalues.error.select.entry");

    String ERROR_MISSING_OLD_VALUE = stringManager.getString("changevalues.error.missing.old.value");
  }

  // ------------------------------------------------------------------------
  // Thread SEARCHING
  // ------------------------------------------------------------------------
  class ThreadSearching extends Thread
  {
    private Thread thisThread = null;

    @Override
    public void run()
    {
      super.run();
      thisThread = Thread.currentThread();

      startSearching();

      controlComponents(STOP_WORKING);
      threadSearching = null;
    }

    private boolean isThreadInvalid()
    {
      if (thisThread != threadSearching) { return true; }
      try
      {
        synchronized (this)
        {
          while (threadSuspended)
          {
            wait(200);
          }
        }
      }
      catch (InterruptedException e)
      {
      }
      return false;
    }

    private void startSearching()
    {
      long startTime = System.currentTimeMillis();

      ((DefaultTableModel) tblResult.getModel()).setDataVector(new Vector<Vector<Object>>(), vecHeader);

      String tableNamePattern = WILDCARD;
      String oldValue = getOldValue();

      try
      {
        ITableInfo[] tableInfoArray =
          session.getMetaData().getTables(null, null, tableNamePattern, new String[] { "TABLE" }, null);
        pbMain.setValue(0);
        pbMain.setMaximum(tableInfoArray.length);

        for (int i = 0; i < tableInfoArray.length; i++)
        {
          ITableInfo tableInfo = tableInfoArray[i];
          pbMain.setString(tableInfo.getSimpleName() + " " + (i + 1) + "/" + pbMain.getMaximum());

          checkColumns(tableInfo, oldValue);

          pbMain.setValue(i + 1);
          pbMain.repaint();
          if (isThreadInvalid())
          {
            break;
          }
        }
        long diffTime = System.currentTimeMillis() - startTime;
        lblFooterTableResult.setText(" " + i18n.INFO_SEARCHING_FINISHED + " " + diffTime + " ms");
      }
      catch (SQLException e)
      {
        log.error(e);
        JOptionPane.showMessageDialog(null, i18n.ERROR_SEARCHING_DATA);
      }
    }

    private void checkColumns(ITableInfo tableInfo, String oldValue) throws SQLException
    {
      TableColumnInfo[] columnInfos = session.getMetaData().getColumnInfo(tableInfo);
      Statement stmt = session.getSQLConnection().createStatement();
      int resultFound = 0;

      for (int c = 0; c < columnInfos.length; c++)
      {
        TableColumnInfo tableColumnInfo = columnInfos[c];
        String sql = null;

        if (isStringValueCheck(tableColumnInfo) || isIntegerValueCheck(tableColumnInfo)
          || isNumericValueCheck(tableColumnInfo) || isDateValueCheck(tableColumnInfo))
        {
          sql =
            "SELECT COUNT(*) FROM " + tableInfo.getSimpleName() + " "
              + getWhereCondition(tableColumnInfo.getColumnName(), oldValue);
        }

        if (sql != null)
        {
          try
          {
            resultFound = SmarttoolsHelper.checkColumnData(stmt, sql);
            if (resultFound > 0 || !chkDisplayOnlyTablesWithData.isSelected())
            {
              addTableEntry(stmt, tableInfo.getSimpleName(), tableColumnInfo.getColumnName(),
                SmarttoolsHelper.getDataTypeForDisplay(tableColumnInfo), resultFound);
            }
          }
          catch (SQLException e)
          {
            String text =
              INDENT + i18n.ERROR_ON_TABLE + " [" + tableInfo.getSimpleName() + "] "
                + i18n.GLOBAL_COLUMN + " [" + tableColumnInfo.getColumnName() + "] :"
                + e.getLocalizedMessage();
            addTableEntry(stmt, tableInfo.getSimpleName(), tableColumnInfo.getColumnName(),
              SmarttoolsHelper.getDataTypeForDisplay(tableColumnInfo), -1);
            log.error(text);
          }
        }
      }

      stmt.close();
    }

    private void addTableEntry(Statement stmt, String tableName, String columnName, String dataType,
      int recordsFound) throws SQLException
    {
      if (!chkDisplayOnlyTablesWithData.isSelected() || recordsFound > 0)
      {
        Vector<Object> vecRow = new Vector<Object>();
        vecRow.add(Boolean.FALSE);
        vecRow.add(tableName);
        vecRow.add(columnName);
        vecRow.add(dataType);
        if (recordsFound > -1)
        {
          String records = recordsFound + "/" + SmarttoolsHelper.getRowCount(stmt, tableName);
          vecRow.add(records);
        }
        else
        {
          vecRow.add(i18n.ERROR_ON_TABLE);
        }
        vecRow.add(new Integer(0));
        DefaultTableModel tm = (DefaultTableModel) tblResult.getModel();
        tm.addRow(vecRow);
        tm.fireTableDataChanged();
        SmarttoolsHelper.setColumnWidth(tblResult, TABLE_DEFAULT_COL_WIDTH);
      }
    }

    private boolean isValidColumnName(String columnName)
    {
      String columnNameInput = tfColumnName.getText();
      if (columnNameInput.endsWith(WILDCARD))
      {
        String cni = columnNameInput.replaceAll("\\" + WILDCARD, "").toLowerCase();
        return columnName.toLowerCase().startsWith(cni);
      }
      else
      {
        return columnName.equalsIgnoreCase(columnNameInput);
      }
    }

    private boolean isStringValueCheck(TableColumnInfo tableColumnInfo)
    {
      int dataType = getUsedDataType();
      return (getUsedGroup() == STDataType.GROUP_CHAR
        && (dataType == tableColumnInfo.getDataType() || (dataType == STDataType.USE_WHOLE_GROUP && SmarttoolsHelper.isDataTypeString(tableColumnInfo.getDataType()))) && isValidColumnName(tableColumnInfo.getColumnName()));
    }

    private boolean isIntegerValueCheck(TableColumnInfo tableColumnInfo)
    {
      int dataType = getUsedDataType();
      return (getUsedGroup() == STDataType.GROUP_INT
        && (dataType == tableColumnInfo.getDataType() || (dataType == STDataType.USE_WHOLE_GROUP && SmarttoolsHelper.isDataTypeInt(tableColumnInfo.getDataType()))) && isValidColumnName(tableColumnInfo.getColumnName()));
    }

    private boolean isNumericValueCheck(TableColumnInfo tableColumnInfo)
    {
      int dataType = getUsedDataType();
      return (getUsedGroup() == STDataType.GROUP_NUMERIC
        && (dataType == tableColumnInfo.getDataType() || (dataType == STDataType.USE_WHOLE_GROUP && SmarttoolsHelper.isDataTypeNumeric(tableColumnInfo.getDataType()))) && isValidColumnName(tableColumnInfo.getColumnName()));
    }

    private boolean isDateValueCheck(TableColumnInfo tableColumnInfo)
    {
      int dataType = getUsedDataType();
      return (getUsedGroup() == STDataType.GROUP_DATE
        && (dataType == tableColumnInfo.getDataType() || (dataType == STDataType.USE_WHOLE_GROUP && SmarttoolsHelper.isDataTypeDate(tableColumnInfo.getDataType()))) && isValidColumnName(tableColumnInfo.getColumnName()));
    }
  } // ThreadSearching

  // ------------------------------------------------------------------------
  // Thread SEARCHING
  // ------------------------------------------------------------------------
  class ThreadChanging extends Thread
  {
    private Thread thisThread = null;

    @Override
    public void run()
    {
      super.run();
      thisThread = Thread.currentThread();

      startChanging();

      controlComponents(STOP_WORKING);
      threadChanging = null;
    }

    private boolean isThreadInvalid()
    {
      if (thisThread != threadChanging) { return true; }
      try
      {
        synchronized (this)
        {
          while (threadSuspended)
          {
            wait(200);
          }
        }
      }
      catch (InterruptedException e)
      {
      }
      return false;
    }

    private void startChanging()
    {
      long startTime = System.currentTimeMillis();
      String oldValue = getOldValue();
      String newValue = getNewValue();

      pbMain.setValue(0);
      pbMain.setMaximum(0);
      // init progressbar
      for (int r = 0; r < tblResult.getRowCount(); r++)
      {
        if (((Boolean) tblResult.getValueAt(r, TABLE_COL_MARKER)).booleanValue())
        {
          pbMain.setMaximum(pbMain.getMaximum() + 1);
        }
      }

      Statement stmt = null;
      boolean error = false;
      try
      {
        stmt = session.getSQLConnection().createStatement();
      }
      catch (SQLException e)
      {
        JOptionPane.showMessageDialog(null, i18n.ERROR_CREATING_STATEMENT);
        log.error(e);
      }

      int i = 0;
      for (int row = 0; row < tblResult.getRowCount(); row++)
      {
        if (((Boolean) tblResult.getValueAt(row, TABLE_COL_MARKER)).booleanValue())
        {
          String tableName = (String) tblResult.getValueAt(row, TABLE_COL_TABLE);
          String columnName = (String) tblResult.getValueAt(row, TABLE_COL_COLUMNNAME);
          i++;
          pbMain.setString(tableName + "." + columnName + " " + i + "/" + pbMain.getMaximum());

          try
          {
            String sql =
              "UPDATE " + tableName + " SET " + columnName + " = " + newValue + " "
                + getWhereCondition(columnName, oldValue);
            int rowsAffected = stmt.executeUpdate(sql);
            int rowCount = SmarttoolsHelper.getRowCount(stmt, tableName);
            tblResult.setValueAt(new Integer(1), row, TABLE_COL_STATUS);
            tblResult.setValueAt(rowsAffected + "/" + rowCount, row, TABLE_COL_RECORDS);
          }
          catch (SQLException e)
          {
            error = true;
            tblResult.setValueAt(new Integer(2), row, TABLE_COL_STATUS);
            log.error(e);
          }

          pbMain.setValue(i);
          pbMain.repaint();
          if (isThreadInvalid())
          {
            break;
          }
        }
      }

      try
      {
        stmt.close();
      }
      catch (SQLException e)
      {
        JOptionPane.showMessageDialog(null, i18n.ERROR_CLOSING_STATEMENT);
        log.error(e);
      }
      long diffTime = System.currentTimeMillis() - startTime;
      lblFooterTableResult.setText(" " + i18n.INFO_CHANGING_FINISHED + " " + diffTime + " ms");

      if (error)
      {
        JOptionPane.showMessageDialog(null, i18n.ERROR_CHANGING_DATA);
      }
    }
  }

  // ------------------------------------------------------------------------
  // Table classes
  // ------------------------------------------------------------------------
  class SmarttoolChangeValuesTableCellRenderer extends JLabel implements TableCellRenderer
  {
    private static final long serialVersionUID = -7923233754901241279L;

    private ImageIcon iconMarkedSelected = SmarttoolsHelper.loadIcon("gridMarkedSelected16x16.png");

    private ImageIcon iconDemarkedSelected = SmarttoolsHelper.loadIcon("gridDemarkedSelected16x16.png");

    private ImageIcon iconStatusInit = SmarttoolsHelper.loadIcon("statusInit16x16.png");

    private ImageIcon iconStatusOk = SmarttoolsHelper.loadIcon("statusOk16x16.png");

    private ImageIcon iconStatusError = SmarttoolsHelper.loadIcon("statusError16x16.png");

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column)
    {
      JLabel lbl = new JLabel();
      lbl.setOpaque(true);

      if (column == TABLE_COL_MARKER && value instanceof Boolean)
      {
        lbl.setHorizontalAlignment(SwingConstants.CENTER);
        if (((Boolean) value).booleanValue())
        {
          if (isSelected)
          {
            lbl.setIcon(iconMarkedSelected);
          }
          else
          {
            lbl.setIcon(iconMarked);
          }
        }
        else
        {
          if (isSelected)
          {
            lbl.setIcon(iconDemarkedSelected);
          }
          else
          {
            lbl.setIcon(iconDemarked);
          }
        }
      }
      else if (column == TABLE_COL_STATUS && value instanceof Integer)
      {
        if (((Boolean) tblResult.getValueAt(row, TABLE_COL_MARKER)).booleanValue())
        {
          int status = ((Integer) value).intValue();
          lbl.setHorizontalAlignment(SwingConstants.CENTER);
          if (status == 0)
          {
            lbl.setIcon(iconStatusInit);
          }
          else if (status == 1)
          {
            lbl.setIcon(iconStatusOk);
          }
          else if (status == 2)
          {
            lbl.setIcon(iconStatusError);
          }
        }
      }
      else if (value instanceof String)
      {
        lbl.setText((String) value);
      }
      if (column == TABLE_COL_RECORDS)
      {
        lbl.setHorizontalAlignment(SwingConstants.CENTER);
      }

      if (isSelected)
      {
        lbl.setBackground(new Color(0, 0, 100));
        lbl.setForeground(Color.LIGHT_GRAY);
      }

      return lbl;
    }
  }

  class SmarttoolChangeValuesTableModel extends DefaultTableModel
  {
    private static final long serialVersionUID = 1355771906563987627L;

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

Related Classes of net.sourceforge.squirrel_sql.plugins.smarttools.gui.SmarttoolChangeValuesFrame

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.