public SQLHistorySearchCtrl(
      SQLTextAreaServices sqlTextAreaServices,
      Session session,
      ObservableList<SQLHistoryEntry> items) {
    _sqlTextAreaServices = sqlTextAreaServices;

    FxmlHelper<SQLHistorySearchView> fxmlHelper = new FxmlHelper<>(SQLHistorySearchView.class);
    _view = fxmlHelper.getView();

    _dialog = new Stage();
    _dialog.setTitle(
        new I18n(getClass())
            .t("SQLHistorySearchCtrl.title", session.getMainTabContext().getSessionTabTitle()));
    _dialog.initModality(Modality.WINDOW_MODAL);
    _dialog.initOwner(AppState.get().getPrimaryStage());
    Region region = fxmlHelper.getRegion();
    _dialog.setScene(new Scene(region));

    GuiUtils.makeEscapeClosable(region);

    new StageDimensionSaver(
        "sqlhistorysearch",
        _dialog,
        new Pref(getClass()),
        region.getPrefWidth(),
        region.getPrefHeight(),
        _dialog.getOwner());

    _view.cboFilterType.setItems(
        FXCollections.observableList(Arrays.asList(SqlHistoryFilterType.values())));
    _view.cboFilterType.getSelectionModel().selectFirst();

    _view.btnApply.setOnAction(e -> onApply());
    _view.chkFiltered.setOnAction(e -> onChkFiltered());

    _view.split.getItems().add(_tblHistory);
    _view.split.getItems().add(_txtSqlPreview);

    _originalTableLoader = new RowObjectTableLoader<>();
    _originalTableLoader.initColsByAnnotations(SQLHistoryEntry.class);
    _originalTableLoader.addRowObjects(items);
    _currentLoader = _originalTableLoader.cloneLoader();
    _currentLoader.load(_tblHistory);

    _tblHistory
        .getSelectionModel()
        .selectedItemProperty()
        .addListener((observable, oldValue, newValue) -> onTableSelectionChanged());

    _tblHistory.setOnMouseClicked(e -> onTblHistoryClicked(e));

    _txtSqlPreview.setEditable(false);

    _dialog.setOnCloseRequest(e -> close());

    _view.txtFilter.requestFocus();

    _splitPositionSaver.apply(_view.split);
    _dialog.showAndWait();
  }
  private void onApply() {
    List<SQLHistoryEntry> toFilter = _originalTableLoader.getRowObjects();

    ArrayList<SQLHistoryEntry> toRemove = new ArrayList<>();
    for (SQLHistoryEntry sqlHistoryEntry : toFilter) {
      if (false == matchesFilter(sqlHistoryEntry)) {
        toRemove.add(sqlHistoryEntry);
      }
    }

    boolean filtered;
    if (0 < toRemove.size()) {
      toFilter.removeAll(toRemove);

      _currentLoader = _originalTableLoader.cloneLoaderFor(toFilter);

      _tblHistory.getItems().clear();
      _currentLoader.load(_tblHistory);
      filtered = true;
    } else {
      _currentLoader = _originalTableLoader.cloneLoader();
      _currentLoader.load(_tblHistory);
      filtered = false;
    }

    try {
      _dontReactToChkFiltered = true;
      _view.chkFiltered.setSelected(filtered);
    } finally {
      _dontReactToChkFiltered = false;
    }
  }
  private void onChkFiltered() {
    if (_dontReactToChkFiltered) {
      return;
    }

    if (_view.chkFiltered.isSelected()) {
      onApply();
    } else {
      _tblHistory.getItems().clear();
      _currentLoader = _originalTableLoader.cloneLoader();
      _currentLoader.load(_tblHistory);
    }
  }
 private List<SQLHistoryEntry> getSelectedRowObjects() {
   ObservableList<Integer> selectedIndices = _tblHistory.getSelectionModel().getSelectedIndices();
   return _currentLoader.getRowObjectsForIndices(selectedIndices);
 }