private List<DbObject> retrieveObjects(Set<String> types) throws SQLException {
    if (this.monitor != null) {
      monitor.setMonitorType(RowActionMonitor.MONITOR_PLAIN);
      monitor.setCurrentObject(ResourceMgr.getString("MsgRetrievingTables"), -1, -1);
    }
    List<DbObject> result = CollectionUtil.sizedArrayList(50);

    String[] typeNames = new String[types.size()];
    int i = 0;
    for (String type : types) {
      if (type != null) {
        // the JDBC calls all use upper-case type names, even
        // if the DBMS stores them lower case
        typeNames[i] = type.toUpperCase();
        i++;
      }
    }

    for (String schema : schemas) {
      for (String name : names) {
        if (cancelSearch) return null;
        List<TableIdentifier> objects =
            connection.getMetadata().getObjectList(name, schema, typeNames);
        result.addAll(objects);
      }
    }
    return result;
  }
  public void retrieve() {
    initGui();

    if (this.dbConnection == null) return;
    if (this.reader == null) return;
    if (this.isRetrieving) return;

    if (!WbSwingUtilities.isConnectionIdle(this, this.dbConnection)) return;

    try {
      this.reset();
      this.dbConnection.setBusy(true);
      this.isRetrieving = true;
      this.infoLabel.setText(ResourceMgr.getString("MsgRetrieving"));
      WbSwingUtilities.showWaitCursorOnWindow(this);

      DataStore ds = reader.getTriggers(currentCatalog, currentSchema);
      final DataStoreTableModel model = new DataStoreTableModel(ds);

      WbSwingUtilities.invoke(
          () -> {
            infoLabel.showObjectListInfo(model);
            triggerList.setModel(model, true);
          });
      shouldRetrieve = false;
    } catch (OutOfMemoryError mem) {
      WbManager.getInstance().showOutOfMemoryError();
    } catch (Throwable e) {
      LogMgr.logError("ProcedureListPanel.retrieve() thread", "Could not retrieve trigger list", e);
    } finally {
      this.isRetrieving = false;
      this.dbConnection.setBusy(false);
      WbSwingUtilities.showDefaultCursorOnWindow(this);
    }
  }
  @Override
  public void executeAction(ActionEvent e) {
    String text = client.getSelectedText();
    if (StringUtil.isBlank(text)) {
      Toolkit.getDefaultToolkit().beep();
      return;
    }

    AddMacroPanel panel = new AddMacroPanel(this.macroClientId);

    ValidatingDialog dialog =
        ValidatingDialog.createDialog(
            SwingUtilities.getWindowAncestor(client),
            panel,
            ResourceMgr.getString("TxtGetMacroNameWindowTitle"),
            null,
            0,
            true);

    dialog.addWindowListener(panel);
    dialog.setVisible(true);

    if (!dialog.isCancelled()) {
      MacroGroup group = panel.getSelectedGroup();
      String name = panel.getMacroName();
      if (StringUtil.isNonBlank(name) && group != null) {
        MacroManager.getInstance()
            .getMacros(macroClientId)
            .addMacro(group, new MacroDefinition(name, text));
      }
    }
  }
  public DataDisplayOptions() {
    super();
    initComponents();
    ComboBoxModel model =
        new DefaultComboBoxModel(
            new String[] {
              ResourceMgr.getString("TxtTabRight"), ResourceMgr.getString("TxtTabLeft")
            });
    alignmentDropDown.setModel(model);

    WbSwingUtilities.setMinimumSizeFromCols(defMaxRows);
    WbSwingUtilities.setMinimumSizeFromCols(nullString);
    WbSwingUtilities.setMinimumSizeFromCols(maxRowHeight);
    WbSwingUtilities.setMinimumSizeFromCols(multiLineThreshold);
    WbSwingUtilities.setMinimumSizeFromCols(minColSizeField);
    WbSwingUtilities.setMinimumSizeFromCols(maxColSizeField);
    WbSwingUtilities.makeEqualWidth(nullString, defMaxRows, alignmentDropDown);
  }
 public FindAction(Searchable aClient) {
   super();
   this.client = aClient;
   this.initMenuDefinition(
       "MnuTxtFind",
       KeyStroke.getKeyStroke(KeyEvent.VK_F, PlatformShortcuts.getDefaultModifier()));
   this.setIcon("find");
   this.setMenuItemName(ResourceMgr.MNU_TXT_EDIT);
   this.setCreateToolbarSeparator(true);
   this.setDescriptiveName(ResourceMgr.getString("TxtEdPrefix") + " " + getMenuLabel());
 }
  public WindowTitleOptionsPanel() {
    super();
    initComponents();
    // It is important to add these in the correct order
    // which is defined by the numeric values from Settings.SHOW_NO_FILENAME
    // SHOW_FILENAME and SHOW_FULL_PATH
    this.windowTitleComboBox.addItem(ResourceMgr.getString("TxtShowNone"));
    this.windowTitleComboBox.addItem(ResourceMgr.getString("TxtShowName"));
    this.windowTitleComboBox.addItem(ResourceMgr.getString("TxtShowPath"));

    WbTraversalPolicy policy = new WbTraversalPolicy();
    policy.addComponent(productAtEnd);
    policy.addComponent(showProfileGroup);
    policy.addComponent(showWorkspace);
    policy.addComponent(windowTitleComboBox);
    policy.setDefaultComponent(productAtEnd);

    this.encloseChar.insertItemAt(ResourceMgr.getString("TxtNothingItem"), 0);
    this.setFocusTraversalPolicy(policy);
    this.setFocusCycleRoot(false);
    this.restoreSettings();
  }
 private List<DbObject> retrieveTriggers() throws SQLException {
   if (this.monitor != null) {
     monitor.setMonitorType(RowActionMonitor.MONITOR_PLAIN);
     monitor.setCurrentObject(ResourceMgr.getString("MsgRetrievingTriggers"), -1, -1);
   }
   TriggerReader trgReader = TriggerReaderFactory.createReader(connection);
   List<DbObject> result = CollectionUtil.sizedArrayList(50);
   for (String schema : schemas) {
     if (cancelSearch) return null;
     List<TriggerDefinition> triggers = trgReader.getTriggerList(null, schema, null);
     result.addAll(triggers);
   }
   return result;
 }
  private List<DbObject> retrieveProcedures() throws SQLException {
    if (this.monitor != null) {
      monitor.setMonitorType(RowActionMonitor.MONITOR_PLAIN);
      monitor.setCurrentObject(ResourceMgr.getString("MsgRetrievingProcedures"), -1, -1);
    }
    List<DbObject> result = CollectionUtil.sizedArrayList(50);
    ProcedureReader reader = connection.getMetadata().getProcedureReader();
    if (reader == null) return result;

    for (String schema : schemas) {
      for (String name : names) {
        if (cancelSearch) return null;
        List<ProcedureDefinition> procs = reader.getProcedureList(null, schema, name);
        result.addAll(procs);
      }
    }
    return result;
  }
  public void openEditWindow() {
    if (!table.isEditing()) return;

    int col = table.getEditingColumn();
    int row = table.getEditingRow();
    String data = null;
    TableCellEditor editor = table.getCellEditor();

    if (editor instanceof WbTextCellEditor) {
      WbTextCellEditor wbeditor = (WbTextCellEditor) editor;
      if (table.isEditing() && wbeditor.isModified()) {
        data = wbeditor.getText();
      } else {
        data = table.getValueAsString(row, col);
      }
    } else {
      data = (String) editor.getCellEditorValue();
    }

    Window owner = SwingUtilities.getWindowAncestor(table);
    Frame ownerFrame = null;
    if (owner instanceof Frame) {
      ownerFrame = (Frame) owner;
    }

    String title = ResourceMgr.getString("TxtEditWindowTitle");
    EditWindow w = new EditWindow(ownerFrame, title, data);
    try {
      w.setVisible(true);
      if (editor != null) {
        // we need to "cancel" the editor so that the data
        // in the editor component will not be written into the
        // table model!
        editor.cancelCellEditing();
      }
      if (!w.isCancelled()) {
        table.setValueAt(w.getText(), row, col);
      }
    } finally {
      w.dispose();
    }
  }
  protected final synchronized void updateMenu() {
    if (parentWindow == null) return;

    List<String> panels = this.parentWindow.getPanelLabels();
    if (CollectionUtil.isEmpty(panels)) return;

    int count = this.getItemCount();
    // Make sure none of the items has an ActionListener attached
    for (int i = 0; i < count; i++) {
      JMenuItem item = this.getItem(i);
      if (item != null && target != null) {
        item.removeActionListener(target);
      }
    }

    this.removeAll();

    int current = this.parentWindow.getCurrentPanelIndex();

    JMenuItem show = new WbMenuItem(ResourceMgr.getString("LblShowDataInNewTab"));
    show.setActionCommand(PANEL_CMD_PREFIX + "-1");
    show.setToolTipText(newTabTooltip);
    show.addActionListener(target == null ? this : target);
    this.add(show);

    if (withClipboard) {
      JMenuItem clipboard = new WbMenuItem(ResourceMgr.getString("MnuTxtStmtClip"));
      clipboard.setToolTipText(ResourceMgr.getDescription("MnuTxtStmtClip", true));
      clipboard.setActionCommand(CMD_CLIPBOARD);
      clipboard.addActionListener(target);
      this.add(clipboard);
    }

    Font boldFont = show.getFont();
    if (boldFont != null) boldFont = boldFont.deriveFont(Font.BOLD);

    addSeparator();

    for (int i = 0; i < panels.size(); i++) {
      if (panels.get(i) == null) continue;

      String menuText = panels.get(i);
      if (i < 9) {
        menuText += " &" + NumberStringCache.getNumberString(i + 1);
      } else {
        menuText += NumberStringCache.getNumberString(i + 1);
      }
      JMenuItem item = new WbMenuItem(menuText);

      item.setActionCommand(
          EditorTabSelectMenu.PANEL_CMD_PREFIX + NumberStringCache.getNumberString(i));
      if (i == current && boldFont != null) {
        item.setFont(boldFont);
      }

      // The tooltip is the same for all items
      item.setToolTipText(regularTooltip);
      item.addActionListener(target == null ? this : target);
      this.add(item);
    }

    List<TableIdentifier> tables = DbObjectList.Util.getSelectedTableObjects(objectList);
    setEnabled(tables.size() > 0);
  }
  public String getWindowTitle(
      ConnectionProfile profile, String workspaceFile, String editorFile, String appName) {
    final StringBuilder title = new StringBuilder(50);

    String enclose = GuiSettings.getTitleGroupBracket();
    String sep = GuiSettings.getTitleGroupSeparator();

    if (appName != null && productNamePosition == NAME_AT_START) {
      title.append(appName);
      title.append(' ');
    }

    if (profile != null) {
      boolean showUser = includeUser || profile.getPromptForUsername();

      if (showURL) {
        String url = makeCleanUrl(profile.getUrl());
        if (showUser) {
          title.append(profile.getLoginUser());
          if (url.charAt(0) != '@') {
            title.append('@');
          }
        }
        title.append(url);
      } else {
        if (profile.getPromptForUsername()) {
          // always display the username if prompted
          title.append(profile.getLoginUser());
          title.append("- ");
        }
        if (showProfileGroup) {
          char open = getOpeningBracket(enclose);
          char close = getClosingBracket(enclose);

          if (open != 0 && close != 0) {
            title.append(open);
          }
          title.append(profile.getGroup());
          if (open != 0 && close != 0) {
            title.append(close);
          }
          if (sep != null) title.append(sep);
        }
        title.append(profile.getName());
      }
    } else if (showNotConnected) {
      if (title.length() > 0) title.append("- ");
      title.append(ResourceMgr.getString("TxtNotConnected"));
    }

    if (workspaceFile != null && showWorkspace) {
      File f = new File(workspaceFile);
      String baseName = f.getName();
      title.append(" - ");
      title.append(baseName);
      title.append(" ");
    }

    int showFilename = GuiSettings.getShowFilenameInWindowTitle();
    if (editorFile != null && showFilename != GuiSettings.SHOW_NO_FILENAME) {
      title.append(" - ");
      if (showFilename == GuiSettings.SHOW_FULL_PATH) {
        title.append(editorFile);
      } else {
        File f = new File(editorFile);
        title.append(f.getName());
      }
    }

    if (appName != null && productNamePosition == NAME_AT_END) {
      if (title.length() > 0) title.append(" - ");
      title.append(appName);
    }

    return title.toString();
  }
  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
  private void initComponents() {
    java.awt.GridBagConstraints gridBagConstraints;

    productAtEnd = new javax.swing.JCheckBox();
    showProfileGroup = new javax.swing.JCheckBox();
    showWorkspace = new javax.swing.JCheckBox();
    windowTitleLabel = new javax.swing.JLabel();
    windowTitleComboBox = new javax.swing.JComboBox();
    encloseCharLabel = new javax.swing.JLabel();
    encloseChar = new javax.swing.JComboBox();
    jPanel1 = new javax.swing.JPanel();
    titleGroupSepLabel = new javax.swing.JLabel();
    titleGroupSep = new javax.swing.JTextField();
    showUrl = new javax.swing.JCheckBox();
    includeUser = new javax.swing.JCheckBox();

    setLayout(new java.awt.GridBagLayout());

    productAtEnd.setText(ResourceMgr.getString("LblShowProductAtEnd")); // NOI18N
    productAtEnd.setToolTipText(ResourceMgr.getString("d_LblShowProductAtEnd")); // NOI18N
    productAtEnd.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 2;
    gridBagConstraints.gridwidth = 4;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(6, 12, 2, 11);
    add(productAtEnd, gridBagConstraints);

    showProfileGroup.setText(ResourceMgr.getString("LblShowProfileGroup")); // NOI18N
    showProfileGroup.setToolTipText(ResourceMgr.getString("d_LblShowProfileGroup")); // NOI18N
    showProfileGroup.setBorder(null);
    showProfileGroup.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
    showProfileGroup.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
    showProfileGroup.setIconTextGap(5);
    showProfileGroup.addChangeListener(
        new javax.swing.event.ChangeListener() {
          public void stateChanged(javax.swing.event.ChangeEvent evt) {
            showProfileGroupStateChanged(evt);
          }
        });
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 4;
    gridBagConstraints.gridwidth = 4;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(8, 12, 0, 11);
    add(showProfileGroup, gridBagConstraints);

    showWorkspace.setText(ResourceMgr.getString("LblShowWorkspace")); // NOI18N
    showWorkspace.setToolTipText(ResourceMgr.getString("d_LblShowWorkspace")); // NOI18N
    showWorkspace.setBorder(null);
    showWorkspace.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
    showWorkspace.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
    showWorkspace.setIconTextGap(5);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 3;
    gridBagConstraints.gridwidth = 4;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(6, 12, 0, 1);
    add(showWorkspace, gridBagConstraints);

    windowTitleLabel.setLabelFor(windowTitleComboBox);
    windowTitleLabel.setText(ResourceMgr.getString("LblShowEditorInfo")); // NOI18N
    windowTitleLabel.setToolTipText(ResourceMgr.getString("d_LblShowEditorInfo")); // NOI18N
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 6;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
    gridBagConstraints.insets = new java.awt.Insets(16, 12, 0, 0);
    add(windowTitleLabel, gridBagConstraints);

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 1;
    gridBagConstraints.gridy = 6;
    gridBagConstraints.gridwidth = 3;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
    gridBagConstraints.insets = new java.awt.Insets(15, 4, 0, 11);
    add(windowTitleComboBox, gridBagConstraints);

    encloseCharLabel.setText(ResourceMgr.getString("LblEncloseGroupChar")); // NOI18N
    encloseCharLabel.setToolTipText(ResourceMgr.getString("d_LblEncloseGroupChar")); // NOI18N
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 5;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(10, 12, 2, 0);
    add(encloseCharLabel, gridBagConstraints);

    encloseChar.setModel(
        new javax.swing.DefaultComboBoxModel(new String[] {"( )", "{ }", "[ ]", "< >"}));
    encloseChar.setToolTipText(ResourceMgr.getDescription("LblEncloseGroupChar"));
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 1;
    gridBagConstraints.gridy = 5;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(10, 4, 0, 11);
    add(encloseChar, gridBagConstraints);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 3;
    gridBagConstraints.gridy = 6;
    gridBagConstraints.weightx = 1.0;
    gridBagConstraints.weighty = 1.0;
    add(jPanel1, gridBagConstraints);

    titleGroupSepLabel.setText(ResourceMgr.getString("LblGroupSeparator")); // NOI18N
    titleGroupSepLabel.setToolTipText(ResourceMgr.getString("d_LblGroupSeparator")); // NOI18N
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 2;
    gridBagConstraints.gridy = 5;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(10, 2, 2, 0);
    add(titleGroupSepLabel, gridBagConstraints);

    titleGroupSep.setColumns(5);
    titleGroupSep.setToolTipText(ResourceMgr.getDescription("LblGroupSeparator"));
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 3;
    gridBagConstraints.gridy = 5;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(10, 5, 2, 11);
    add(titleGroupSep, gridBagConstraints);

    showUrl.setText(ResourceMgr.getString("LblUrlInTitle")); // NOI18N
    showUrl.setToolTipText(ResourceMgr.getString("d_LblUrlInTitle")); // NOI18N
    showUrl.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
    showUrl.addActionListener(
        new java.awt.event.ActionListener() {
          public void actionPerformed(java.awt.event.ActionEvent evt) {
            showUrlActionPerformed(evt);
          }
        });
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.gridwidth = 4;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(10, 12, 2, 11);
    add(showUrl, gridBagConstraints);

    includeUser.setText(ResourceMgr.getString("LblUrlWithUser")); // NOI18N
    includeUser.setToolTipText(ResourceMgr.getString("d_LblUrlWithUser")); // NOI18N
    includeUser.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 1;
    gridBagConstraints.gridwidth = 4;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(6, 30, 2, 11);
    add(includeUser, gridBagConstraints);
  } // </editor-fold>//GEN-END:initComponents
 private ObjectCacheStorage(String resourceKey) {
   this.label = ResourceMgr.getString(resourceKey);
 }
  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
  private void initComponents() {
    java.awt.GridBagConstraints gridBagConstraints;

    jLabel1 = new javax.swing.JLabel();
    localeDropDown = new javax.swing.JComboBox();
    generalPanel = new javax.swing.JPanel();
    selectSummary = new javax.swing.JCheckBox();
    retrieveComments = new javax.swing.JCheckBox();
    jLabel5 = new javax.swing.JLabel();
    defMaxRows = new javax.swing.JTextField();
    showRowNumbers = new javax.swing.JCheckBox();
    showMaxRowsWarn = new javax.swing.JCheckBox();
    showMaxRowsTooltip = new javax.swing.JCheckBox();
    showGeneratingSQL = new javax.swing.JCheckBox();
    alignLabel = new javax.swing.JLabel();
    alignmentDropDown = new javax.swing.JComboBox();
    boldHeader = new javax.swing.JCheckBox();
    nullStringLabel = new javax.swing.JLabel();
    nullString = new javax.swing.JTextField();
    appendResults = new javax.swing.JCheckBox();
    useTableName = new javax.swing.JCheckBox();
    colWidthPanel = new javax.swing.JPanel();
    jPanel3 = new javax.swing.JPanel();
    autoColWidth = new javax.swing.JCheckBox();
    includeHeaderWidth = new javax.swing.JCheckBox();
    jPanel4 = new javax.swing.JPanel();
    minColSizeLabel = new javax.swing.JLabel();
    minColSizeField = new NumberField();
    jLabel4 = new javax.swing.JLabel();
    maxColSizeLabel = new javax.swing.JLabel();
    maxColSizeField = new NumberField();
    jLabel6 = new javax.swing.JLabel();
    rowHeightPanel = new javax.swing.JPanel();
    autoRowHeight = new javax.swing.JCheckBox();
    ignoreEmptyRows = new javax.swing.JCheckBox();
    maxRowHeightLabel = new javax.swing.JLabel();
    maxRowHeight = new NumberField();
    rowHeightResize = new javax.swing.JCheckBox();
    multiLinePanel = new javax.swing.JPanel();
    wrapMultineRender = new javax.swing.JCheckBox();
    wrapMultlineEdit = new javax.swing.JCheckBox();
    multilineThresholLabel = new javax.swing.JLabel();
    multiLineThreshold = new NumberField();

    setLayout(new java.awt.GridBagLayout());

    jLabel1.setText(ResourceMgr.getString("LblSortLocale")); // NOI18N
    jLabel1.setToolTipText(ResourceMgr.getString("d_LblSortLocale")); // NOI18N
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(10, 12, 0, 0);
    add(jLabel1, gridBagConstraints);

    localeDropDown.setModel(
        new javax.swing.DefaultComboBoxModel(
            new String[] {"Item 1", "Item 2", "Item 3", "Item 4"}));
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 1;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.weightx = 1.0;
    gridBagConstraints.insets = new java.awt.Insets(10, 7, 0, 10);
    add(localeDropDown, gridBagConstraints);

    generalPanel.setLayout(new java.awt.GridBagLayout());

    selectSummary.setText(ResourceMgr.getString("LblSelectionSummary")); // NOI18N
    selectSummary.setToolTipText(ResourceMgr.getString("d_LblSelectionSummary")); // NOI18N
    selectSummary.setBorder(null);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(1, 0, 0, 0);
    generalPanel.add(selectSummary, gridBagConstraints);

    retrieveComments.setText(ResourceMgr.getString("LblRetrieveColComments")); // NOI18N
    retrieveComments.setToolTipText(ResourceMgr.getString("d_LblRetrieveColComments")); // NOI18N
    retrieveComments.setBorder(null);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 1;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(6, 0, 0, 0);
    generalPanel.add(retrieveComments, gridBagConstraints);

    jLabel5.setLabelFor(defMaxRows);
    jLabel5.setText(ResourceMgr.getString("LblDefMaxRows")); // NOI18N
    jLabel5.setToolTipText(ResourceMgr.getString("d_LblDefMaxRows")); // NOI18N
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 1;
    gridBagConstraints.gridy = 3;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(5, 16, 0, 7);
    generalPanel.add(jLabel5, gridBagConstraints);

    defMaxRows.setColumns(8);
    defMaxRows.setToolTipText(ResourceMgr.getString("d_LblDefMaxRows")); // NOI18N
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 2;
    gridBagConstraints.gridy = 3;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.weightx = 1.0;
    gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 10);
    generalPanel.add(defMaxRows, gridBagConstraints);

    showRowNumbers.setText(ResourceMgr.getString("LblShowRowNumbers")); // NOI18N
    showRowNumbers.setToolTipText(ResourceMgr.getString("d_LblShowRowNumbers")); // NOI18N
    showRowNumbers.setBorder(null);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 2;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(6, 0, 0, 0);
    generalPanel.add(showRowNumbers, gridBagConstraints);

    showMaxRowsWarn.setText(ResourceMgr.getString("LblShowMaxRowsWarning")); // NOI18N
    showMaxRowsWarn.setToolTipText(ResourceMgr.getString("d_LblShowMaxRowsWarning")); // NOI18N
    showMaxRowsWarn.setBorder(null);
    showMaxRowsWarn.addActionListener(this);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 1;
    gridBagConstraints.gridy = 1;
    gridBagConstraints.gridwidth = 2;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.weightx = 1.0;
    gridBagConstraints.insets = new java.awt.Insets(6, 16, 0, 0);
    generalPanel.add(showMaxRowsWarn, gridBagConstraints);

    showMaxRowsTooltip.setText(ResourceMgr.getString("LblShowMaxRowsTooltip")); // NOI18N
    showMaxRowsTooltip.setToolTipText(ResourceMgr.getString("d_LblShowMaxRowsTooltip")); // NOI18N
    showMaxRowsTooltip.setBorder(null);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 1;
    gridBagConstraints.gridy = 2;
    gridBagConstraints.gridwidth = 2;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(6, 16, 0, 0);
    generalPanel.add(showMaxRowsTooltip, gridBagConstraints);

    showGeneratingSQL.setText(ResourceMgr.getString("LblShowGenSQL")); // NOI18N
    showGeneratingSQL.setToolTipText(ResourceMgr.getString("d_LblShowGenSQL")); // NOI18N
    showGeneratingSQL.setBorder(null);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 4;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(4, 0, 0, 0);
    generalPanel.add(showGeneratingSQL, gridBagConstraints);

    alignLabel.setText(ResourceMgr.getString("LblAlignNum")); // NOI18N
    alignLabel.setToolTipText(ResourceMgr.getString("d_LblAlignNum")); // NOI18N
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 1;
    gridBagConstraints.gridy = 5;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.weighty = 1.0;
    gridBagConstraints.insets = new java.awt.Insets(2, 16, 0, 0);
    generalPanel.add(alignLabel, gridBagConstraints);

    alignmentDropDown.setModel(
        new javax.swing.DefaultComboBoxModel(new String[] {"Left", "Right"}));
    alignmentDropDown.setSelectedItem("Right");
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 2;
    gridBagConstraints.gridy = 5;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.weightx = 1.0;
    gridBagConstraints.insets = new java.awt.Insets(2, 0, 0, 10);
    generalPanel.add(alignmentDropDown, gridBagConstraints);

    boldHeader.setText(ResourceMgr.getString("LblBoldHeader")); // NOI18N
    boldHeader.setToolTipText(ResourceMgr.getString("d_LblBoldHeader")); // NOI18N
    boldHeader.setBorder(null);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 3;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(5, 0, 0, 0);
    generalPanel.add(boldHeader, gridBagConstraints);

    nullStringLabel.setText(ResourceMgr.getString("LblNullString")); // NOI18N
    nullStringLabel.setToolTipText(ResourceMgr.getString("d_LblNullDisp")); // NOI18N
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 1;
    gridBagConstraints.gridy = 4;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(2, 16, 0, 0);
    generalPanel.add(nullStringLabel, gridBagConstraints);

    nullString.setColumns(8);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 2;
    gridBagConstraints.gridy = 4;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.weightx = 1.0;
    gridBagConstraints.insets = new java.awt.Insets(2, 0, 0, 10);
    generalPanel.add(nullString, gridBagConstraints);

    appendResults.setText(ResourceMgr.getString("LblAppendDefault")); // NOI18N
    appendResults.setToolTipText(ResourceMgr.getString("d_LblAppendDefault")); // NOI18N
    appendResults.setBorder(null);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 5;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(3, 0, 0, 0);
    generalPanel.add(appendResults, gridBagConstraints);

    useTableName.setText(ResourceMgr.getString("LblUseTblName")); // NOI18N
    useTableName.setToolTipText(ResourceMgr.getString("d_LblUseTblName")); // NOI18N
    useTableName.setBorder(null);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 1;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.gridwidth = 2;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(3, 16, 0, 7);
    generalPanel.add(useTableName, gridBagConstraints);

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 1;
    gridBagConstraints.gridwidth = 2;
    gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
    gridBagConstraints.insets = new java.awt.Insets(4, 12, 2, 0);
    add(generalPanel, gridBagConstraints);

    colWidthPanel.setBorder(
        javax.swing.BorderFactory.createTitledBorder(
            ResourceMgr.getString("TxtColWidthSettings"))); // NOI18N
    colWidthPanel.setLayout(new java.awt.GridBagLayout());

    jPanel3.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT, 5, 0));

    autoColWidth.setText(ResourceMgr.getString("LblAutoColWidth")); // NOI18N
    autoColWidth.setToolTipText(ResourceMgr.getString("d_LblAutoColWidth")); // NOI18N
    autoColWidth.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
    autoColWidth.setMargin(new java.awt.Insets(0, 0, 0, 0));
    jPanel3.add(autoColWidth);

    includeHeaderWidth.setText(ResourceMgr.getString("LblIncludeHeaderColWidth")); // NOI18N
    includeHeaderWidth.setToolTipText(
        ResourceMgr.getString("d_LblIncludeHeaderColWidth")); // NOI18N
    includeHeaderWidth.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 10, 0, 0));
    includeHeaderWidth.setMargin(new java.awt.Insets(0, 0, 0, 0));
    jPanel3.add(includeHeaderWidth);

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.weightx = 1.0;
    gridBagConstraints.weighty = 0.5;
    gridBagConstraints.insets = new java.awt.Insets(5, 1, 0, 0);
    colWidthPanel.add(jPanel3, gridBagConstraints);

    jPanel4.setLayout(new java.awt.GridBagLayout());

    minColSizeLabel.setText(ResourceMgr.getString("LblMinColsize")); // NOI18N
    minColSizeLabel.setToolTipText(ResourceMgr.getString("d_LblMinColsize")); // NOI18N
    minColSizeLabel.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 5, 0));
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(3, 0, 0, 6);
    jPanel4.add(minColSizeLabel, gridBagConstraints);

    minColSizeField.setColumns(6);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 1;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    jPanel4.add(minColSizeField, gridBagConstraints);

    jLabel4.setText("px");
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 2;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.insets = new java.awt.Insets(0, 2, 0, 0);
    jPanel4.add(jLabel4, gridBagConstraints);

    maxColSizeLabel.setText(ResourceMgr.getString("LblMaxColsize")); // NOI18N
    maxColSizeLabel.setToolTipText(ResourceMgr.getString("d_LblMaxColsize")); // NOI18N
    maxColSizeLabel.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 10, 0, 5));
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 3;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 2);
    jPanel4.add(maxColSizeLabel, gridBagConstraints);

    maxColSizeField.setColumns(6);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 4;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    jPanel4.add(maxColSizeField, gridBagConstraints);

    jLabel6.setText("px");
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 5;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.weightx = 1.0;
    gridBagConstraints.insets = new java.awt.Insets(0, 2, 0, 0);
    jPanel4.add(jLabel6, gridBagConstraints);

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 1;
    gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.weightx = 1.0;
    gridBagConstraints.weighty = 0.5;
    gridBagConstraints.insets = new java.awt.Insets(6, 6, 2, 0);
    colWidthPanel.add(jPanel4, gridBagConstraints);

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 2;
    gridBagConstraints.gridwidth = 2;
    gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
    gridBagConstraints.insets = new java.awt.Insets(3, 8, 0, 7);
    add(colWidthPanel, gridBagConstraints);

    rowHeightPanel.setBorder(
        javax.swing.BorderFactory.createTitledBorder(
            ResourceMgr.getString("TxtRowHeightSettings"))); // NOI18N
    rowHeightPanel.setLayout(new java.awt.GridBagLayout());

    autoRowHeight.setText(ResourceMgr.getString("LblRowHeightAuto")); // NOI18N
    autoRowHeight.setToolTipText(ResourceMgr.getString("LblRowHeightAuto")); // NOI18N
    autoRowHeight.setBorder(null);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0);
    rowHeightPanel.add(autoRowHeight, gridBagConstraints);

    ignoreEmptyRows.setText(ResourceMgr.getString("LblIgnoreRowHeightEmptyLine")); // NOI18N
    ignoreEmptyRows.setToolTipText(
        ResourceMgr.getString("d_LblIgnoreRowHeightEmptyLine")); // NOI18N
    ignoreEmptyRows.setBorder(null);
    ignoreEmptyRows.setMargin(new java.awt.Insets(0, 10, 0, 0));
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 1;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(5, 5, 2, 0);
    rowHeightPanel.add(ignoreEmptyRows, gridBagConstraints);

    maxRowHeightLabel.setText(ResourceMgr.getString("LblRowHeightMax")); // NOI18N
    maxRowHeightLabel.setToolTipText(ResourceMgr.getString("d_LblRowHeightMax")); // NOI18N
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 1;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(0, 11, 0, 0);
    rowHeightPanel.add(maxRowHeightLabel, gridBagConstraints);

    maxRowHeight.setColumns(8);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 2;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.weightx = 1.0;
    gridBagConstraints.insets = new java.awt.Insets(1, 5, 0, 0);
    rowHeightPanel.add(maxRowHeight, gridBagConstraints);

    rowHeightResize.setText(ResourceMgr.getString("LblRowResize")); // NOI18N
    rowHeightResize.setToolTipText(ResourceMgr.getString("d_LblRowResize")); // NOI18N
    rowHeightResize.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
    rowHeightResize.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
    rowHeightResize.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 1;
    gridBagConstraints.gridy = 1;
    gridBagConstraints.gridwidth = 2;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.weightx = 1.0;
    gridBagConstraints.insets = new java.awt.Insets(5, 11, 2, 0);
    rowHeightPanel.add(rowHeightResize, gridBagConstraints);

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 4;
    gridBagConstraints.gridwidth = 2;
    gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
    gridBagConstraints.weightx = 1.0;
    gridBagConstraints.weighty = 1.0;
    gridBagConstraints.insets = new java.awt.Insets(5, 8, 0, 7);
    add(rowHeightPanel, gridBagConstraints);

    multiLinePanel.setBorder(
        javax.swing.BorderFactory.createTitledBorder(
            ResourceMgr.getString("LblMultiLineCols"))); // NOI18N
    multiLinePanel.setLayout(new java.awt.GridBagLayout());

    wrapMultineRender.setText(ResourceMgr.getString("LblMultiWrapRender")); // NOI18N
    wrapMultineRender.setBorder(null);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(0, 5, 0, 0);
    multiLinePanel.add(wrapMultineRender, gridBagConstraints);

    wrapMultlineEdit.setText(ResourceMgr.getString("LblMultiWrapEdit")); // NOI18N
    wrapMultlineEdit.setBorder(null);
    wrapMultlineEdit.setMargin(new java.awt.Insets(0, 10, 0, 0));
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 1;
    gridBagConstraints.gridwidth = 2;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(5, 5, 2, 0);
    multiLinePanel.add(wrapMultlineEdit, gridBagConstraints);

    multilineThresholLabel.setText(ResourceMgr.getString("LblMultiLineLimit")); // NOI18N
    multilineThresholLabel.setToolTipText(ResourceMgr.getString("d_LblMultiLineLimit")); // NOI18N
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 1;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.insets = new java.awt.Insets(0, 11, 0, 0);
    multiLinePanel.add(multilineThresholLabel, gridBagConstraints);

    multiLineThreshold.setColumns(8);
    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 2;
    gridBagConstraints.gridy = 0;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
    gridBagConstraints.weightx = 1.0;
    gridBagConstraints.insets = new java.awt.Insets(1, 5, 0, 0);
    multiLinePanel.add(multiLineThreshold, gridBagConstraints);

    gridBagConstraints = new java.awt.GridBagConstraints();
    gridBagConstraints.gridx = 0;
    gridBagConstraints.gridy = 3;
    gridBagConstraints.gridwidth = 2;
    gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
    gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
    gridBagConstraints.insets = new java.awt.Insets(5, 8, 0, 7);
    add(multiLinePanel, gridBagConstraints);
  }
  private void _initGui() {
    if (initialized) return;

    Reloadable sourceReload =
        () -> {
          if (dbConnection == null) return;
          if (dbConnection.isBusy()) return;
          retrieveCurrentTrigger();
        };

    this.source = new DbObjectSourcePanel(parentWindow, sourceReload);
    if (DbExplorerSettings.allowSourceEditing()) {
      source.allowEditing(true);
    }

    JPanel listPanel = new JPanel();
    this.triggerList = new WbTable(true, false, false);

    this.triggerList.setRendererSetup(RendererSetup.getBaseSetup());
    this.triggerList.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    this.triggerList.setCellSelectionEnabled(false);
    this.triggerList.setColumnSelectionAllowed(false);
    this.triggerList.setRowSelectionAllowed(true);
    this.triggerList.getSelectionModel().addListSelectionListener(this);
    this.triggerList
        .getSelectionModel()
        .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    this.triggerList.addTableModelListener(this);
    triggerList.setReadOnly(true);

    findPanel = new QuickFilterPanel(this.triggerList, false, "triggerlist");
    findPanel.setFilterOnType(DbExplorerSettings.getFilterDuringTyping());
    findPanel.setAlwaysUseContainsFilter(DbExplorerSettings.getUsePartialMatch());

    ReloadAction a = new ReloadAction(this);
    a.setUseLabelIconSize(true);
    this.findPanel.addToToolbar(a, true, false);
    a.getToolbarButton().setToolTipText(ResourceMgr.getString("TxtRefreshTriggerList"));
    listPanel.setLayout(new BorderLayout());
    listPanel.add((JPanel) findPanel, BorderLayout.NORTH);

    this.splitPane = new WbSplitPane(JSplitPane.HORIZONTAL_SPLIT);
    this.splitPane.setOneTouchExpandable(true);
    this.splitPane.setDividerSize(6);
    WbScrollPane scroll = new WbScrollPane(this.triggerList);

    listPanel.add(scroll, BorderLayout.CENTER);

    infoLabel = new SummaryLabel("");
    listPanel.add(infoLabel, BorderLayout.SOUTH);

    this.splitPane.setLeftComponent(listPanel);
    this.splitPane.setRightComponent(source);
    this.splitPane.setDividerBorder(WbSwingUtilities.EMPTY_BORDER);
    this.setLayout(new BorderLayout());
    this.add(splitPane, BorderLayout.CENTER);

    WbTraversalPolicy pol = new WbTraversalPolicy();
    pol.setDefaultComponent((JPanel) findPanel);
    pol.addComponent((JPanel) findPanel);
    pol.addComponent(this.triggerList);
    this.setFocusTraversalPolicy(pol);
    this.reset();

    WbSelectionModel list = WbSelectionModel.Factory.createFacade(triggerList.getSelectionModel());
    this.dropAction = new DropDbObjectAction(this, list, this);
    triggerList.addPopupAction(dropAction, true);
    this.compileAction = new CompileDbObjectAction(this, list);
    triggerList.addPopupAction(compileAction, false);

    if (dbConnection != null) {
      setConnection(dbConnection);
    }
    this.splitPane.setDividerLocation(0.5d);

    initialized = true;

    restoreSettings();
    if (workspaceProperties != null) {
      readSettings(workspaceProperties, workspaceProperties.getFilterPrefix());
      workspaceProperties = null;
    }
    Settings.getInstance()
        .addPropertyChangeListener(this, DbExplorerSettings.PROP_ALLOW_SOURCE_EDITING);
  }
/** @author Thomas Kellerer */
public class InsertColumnMatcher {
  private List<InsertColumnInfo> columns;
  private boolean isInsert;
  private String noValue = "<" + ResourceMgr.getString("TxtNoValue") + ">";

  public InsertColumnMatcher(WbConnection conn, String sql) {
    analyzeStatement(conn, sql);
  }

  InsertColumnMatcher(String sql) {
    analyzeStatement(null, sql);
  }

  public boolean isInsertStatement() {
    return isInsert;
  }

  private void analyzeStatement(WbConnection conn, String sql) {
    try {
      Set<String> verbs = CollectionUtil.caseInsensitiveSet("INSERT", "MERGE");

      SQLLexer lexer = SQLLexerFactory.createLexer(conn, sql);
      SQLToken token = lexer.getNextToken(false, false);

      if (token == null || !verbs.contains(token.getContents())) {
        isInsert = false;
        columns = Collections.emptyList();
        return;
      }

      boolean afterValues = false;

      if (token.getContents().equals("MERGE")) {
        // "fast forward" to the actual INSERT part
        // so that the following code does not need to handle any "noise" before the actual insert
        while (token != null) {
          if (token.getContents().equals("INSERT")) break;
          token = lexer.getNextToken(false, false);
        }
      }

      List<ElementInfo> columnEntries = null;
      List<List<ElementInfo>> rowValues = new ArrayList<>(1);

      int bracketCount = 0;
      boolean isSubSelect = false;

      while (token != null) {
        String text = token.getContents();
        if (token.getContents().equals(")")) {
          bracketCount--;
        } else if (token.getContents().equals("(") && !afterValues) {
          bracketCount++;
          if (bracketCount == 1) {
            columnEntries = getListValues(lexer, token.getCharEnd(), sql);
            // getListValues() terminated at the closing bracket
            // so the bracket count must be decreased here again.
            bracketCount--;
          }
        } else if (token.getContents().equals("(") && afterValues) {
          bracketCount++;
          if (bracketCount == 1) {
            rowValues.add(getListValues(lexer, token.getCharEnd(), sql));
            bracketCount--;
          }
        } else if (token.getContents().equals("VALUES")) {
          afterValues = true;
        } else if (text.equals("SELECT") || text.equals("WITH")) {
          String subSelect = sql.substring(token.getCharBegin());
          List<ElementInfo> entries = SqlUtil.getColumnEntries(subSelect, true, conn);
          for (ElementInfo element : entries) {
            element.setOffset(token.getCharBegin());
          }
          rowValues.add(entries);
          isSubSelect = true;
          break; // no need to go any further, it's an INSERT ... SELECT statement
        }
        token = lexer.getNextToken(false, false);
      }

      int maxValues = -1;
      for (List<ElementInfo> values : rowValues) {
        if (values.size() > maxValues) {
          maxValues = values.size();
        }
      }

      int maxElements = columnEntries.size() > maxValues ? columnEntries.size() : maxValues;
      columns = new ArrayList<>(maxElements);
      for (int i = 0; i < maxElements; i++) {
        InsertColumnInfo info = new InsertColumnInfo();
        if (i < columnEntries.size()) {
          info.columnStart = columnEntries.get(i).getStartPosition();
          info.columnEnd = columnEntries.get(i).getEndPosition();
          info.columnName = columnEntries.get(i).getElementValue();
        } else {
          info.columnStart = -1;
          info.columnEnd = -1;
          info.columnName = null;
        }
        for (List<ElementInfo> entries : rowValues) {
          if (i < entries.size()) {
            info.addValue(
                entries.get(i).getElementValue(),
                entries.get(i).getStartPosition(),
                entries.get(i).getEndPosition());
          } else {
            info.addValue(null, -1, -1);
          }
        }
        columns.add(info);
      }
      if (isSubSelect) {
        adjustValueStarts();
      }
    } catch (Exception e) {
      if (columns == null) {
        columns = Collections.emptyList();
      }
      LogMgr.logError(
          "InsertColumnMatcher.analyzeStatemet()", "Could not analyze statement: " + sql, e);
    }
  }

  /**
   * The start position of sub-select columns does not consider whitespace before the column name.
   * It is always the start of the actual column name. This is not correct for tooltip hinting (as
   * the "start of the column is right behind the previous comma), so we need to adjust those
   * values.
   */
  private void adjustValueStarts() {
    for (int i = 0; i < columns.size() - 1; i++) {
      InsertColumnInfo current = columns.get(i);
      InsertColumnInfo next = columns.get(i + 1);
      for (int v = 0; v < next.values.size(); v++) {
        if (next.values.get(v).valueStart > 0 && next.values.get(v).valueEnd > 0) {
          next.values.get(v).valueStart = current.values.get(v).valueEnd - 1;
        }
      }
    }
  }

  private List<ElementInfo> getListValues(SQLLexer lexer, int lastStart, String sql) {
    List<ElementInfo> result = new ArrayList<>();

    int bracketCount = 1;
    int lastComma = lastStart;
    SQLToken token = lexer.getNextToken(false, false);
    while (token != null) {
      String c = token.getText();
      if (c.equals("(")) {
        bracketCount++;
      } else if (c.equals(")")) {
        bracketCount--;
        if (bracketCount == 0) {
          ElementInfo info =
              new ElementInfo(
                  sql.substring(lastComma, token.getCharBegin()).trim(),
                  lastComma,
                  token.getCharBegin());
          result.add(info);
          break;
        }
      } else if (c.equals(",") && bracketCount == 1) {
        ElementInfo info =
            new ElementInfo(
                sql.substring(lastComma, token.getCharBegin()).trim(),
                lastComma,
                token.getCharBegin());
        result.add(info);
        lastComma = token.getCharEnd();
      }
      token = lexer.getNextToken(false, false);
    }
    return result;
  }

  public boolean inValueList(int position) {
    for (InsertColumnInfo info : columns) {
      for (ColumnValueInfo valInfo : info.values) {
        if (valInfo.valueStart <= position && valInfo.valueEnd >= position) {
          return true;
        }
      }
    }
    return false;
  }

  public boolean inColumnList(int position) {
    for (InsertColumnInfo info : columns) {
      if (info.columnStart <= position && info.columnEnd >= position) {
        return true;
      }
    }
    return false;
  }

  public List<String> getColumns() {
    if (columns == null) return Collections.emptyList();

    List<String> result = new ArrayList<>(columns.size());
    for (InsertColumnInfo column : columns) {
      result.add(column.columnName);
    }
    return result;
  }

  /**
   * Return the value for the given column name.
   *
   * @param columnName the column to search for
   * @return the value or null if the column was not found
   */
  public String getValueForColumn(String columnName) {
    if (StringUtil.isBlank(columnName)) return null;

    for (InsertColumnInfo info : columns) {
      if (StringUtil.equalStringIgnoreCase(columnName, info.columnName)) {
        return info.getValue();
      }
    }
    return null;
  }

  /**
   * Return the name of the column at the given position.
   *
   * <p>If the cursor is not in the VALUES list, null will be returned.
   *
   * @param position the cursor position.
   * @return the column name or null
   */
  public String getInsertColumnName(int position) {
    for (InsertColumnInfo info : columns) {
      for (ColumnValueInfo valInfo : info.values) {
        if (valInfo.valueStart <= position && valInfo.valueEnd >= position) {
          return info.columnName;
        }
      }
    }
    return null;
  }

  /**
   * Return the tooltip text for the given cursor position. If the cursor is in the column list, the
   * tooltip will contain the column's value. If the cursor is in the values list, it returns the
   * column's name
   *
   * @param position
   * @return the value or column name. null if position is invalid
   */
  public String getTooltipForPosition(int position) {
    for (InsertColumnInfo info : columns) {
      if (info.columnStart <= position && info.columnEnd >= position) {
        return info.getValue();
      }
      for (ColumnValueInfo valInfo : info.values) {
        if (valInfo.valueStart <= position && valInfo.valueEnd >= position) {
          return info.columnName;
        }
      }
    }
    return null;
  }

  private class InsertColumnInfo {
    int columnStart;
    int columnEnd;
    String columnName;
    List<ColumnValueInfo> values = new ArrayList<>(1);

    void addValue(String value, int valueStart, int valueEnd) {
      values.add(new ColumnValueInfo(value, valueStart, valueEnd));
    }

    String getValue() {
      if (values.isEmpty()) {
        return null;
      }
      if (values.size() == 1) {
        return values.get(0).value;
      }
      StringBuilder result = new StringBuilder(values.size() * 5);
      result.append('[');
      for (int i = 0; i < values.size(); i++) {
        if (i > 0) result.append(", ");
        String value = values.get(i).value;
        if (StringUtil.isBlank(value)) {
          result.append(noValue);
        } else {
          result.append(values.get(i).value);
        }
      }
      result.append(']');
      return result.toString();
    }
  }

  private class ColumnValueInfo {
    int valueStart;
    int valueEnd;
    String value;

    ColumnValueInfo(String value, int valueStart, int valueEnd) {
      this.valueStart = valueStart;
      this.valueEnd = valueEnd;
      this.value = value;
    }

    @Override
    public String toString() {
      return value;
    }
  }
}