/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.runtime.sql;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.StatusDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.*;
import org.jkiss.dbeaver.core.DBeaverUI;
import org.jkiss.dbeaver.model.DBIcon;
import org.jkiss.dbeaver.model.sql.SQLQueryParameter;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.controls.CustomTableEditor;
import org.jkiss.dbeaver.utils.GeneralUtils;
import org.jkiss.utils.CommonUtils;
import java.util.*;
import java.util.List;
/**
* Parameter binding
*/
public class SQLQueryParameterBindDialog extends StatusDialog {
private static final String DIALOG_ID = "DBeaver.SQLQueryParameterBindDialog";//$NON-NLS-1$
private List<SQLQueryParameter> parameters;
private final Map<String, List<SQLQueryParameter>> dupParameters = new HashMap<>();
private static Map<String, SQLQueryParameterRegistry.ParameterInfo> savedParamValues = new HashMap<>();
protected SQLQueryParameterBindDialog(Shell shell, List<SQLQueryParameter> parameters)
{
super(shell);
this.parameters = parameters;
// Restore saved values from registry
SQLQueryParameterRegistry registry = SQLQueryParameterRegistry.getInstance();
for (SQLQueryParameter param : this.parameters) {
if (param.isNamed() && param.getValue() == null) {
SQLQueryParameterRegistry.ParameterInfo paramInfo = registry.getParameter(param.getName());
if (paramInfo != null) {
param.setValue(paramInfo.value);
}
}
}
}
@Override
protected IDialogSettings getDialogBoundsSettings()
{
return UIUtils.getDialogSettings(DIALOG_ID);
}
@Override
protected boolean isResizable()
{
return true;
}
@Override
protected Control createDialogArea(Composite parent)
{
getShell().setText("Bind parameter(s)");
final Composite composite = (Composite)super.createDialogArea(parent);
final Table paramTable = new Table(composite, SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
final GridData gd = new GridData(GridData.FILL_BOTH);
gd.widthHint = 400;
gd.heightHint = 200;
paramTable.setLayoutData(gd);
paramTable.setHeaderVisible(true);
paramTable.setLinesVisible(true);
final TableColumn indexColumn = UIUtils.createTableColumn(paramTable, SWT.LEFT, "#");
indexColumn.setWidth(40);
final TableColumn nameColumn = UIUtils.createTableColumn(paramTable, SWT.LEFT, "Name");
nameColumn.setWidth(100);
final TableColumn valueColumn = UIUtils.createTableColumn(paramTable, SWT.LEFT, "Value");
valueColumn.setWidth(200);
for (SQLQueryParameter param : parameters) {
if (param.getPrevious() != null) {
// Skip duplicates
List<SQLQueryParameter> dups = dupParameters.get(param.getName());
if (dups == null) {
dups = new ArrayList<>();
dupParameters.put(param.getName(), dups);
}
dups.add(param);
continue;
}
TableItem item = new TableItem(paramTable, SWT.NONE);
item.setData(param);
item.setImage(DBeaverIcons.getImage(DBIcon.TREE_ATTRIBUTE));
item.setText(0, String.valueOf(param.getOrdinalPosition() + 1));
item.setText(1, param.getTitle());
item.setText(2, CommonUtils.notEmpty(param.getValue()));
}
final CustomTableEditor tableEditor = new CustomTableEditor(paramTable) {
{
firstTraverseIndex = 2;
lastTraverseIndex = 2;
editOnEnter = false;
}
@Override
protected Control createEditor(Table table, int index, TableItem item) {
if (index != 2) {
return null;
}
SQLQueryParameter param = (SQLQueryParameter) item.getData();
Text editor = new Text(table, SWT.BORDER);
editor.setText(CommonUtils.notEmpty(param.getValue()));
editor.selectAll();
return editor;
}
@Override
protected void saveEditorValue(Control control, int index, TableItem item) {
SQLQueryParameter param = (SQLQueryParameter) item.getData();
String newValue = ((Text) control).getText();
item.setText(2, newValue);
param.setValue(newValue);
if (param.isNamed()) {
final List<SQLQueryParameter> dups = dupParameters.get(param.getName());
if (dups != null) {
for (SQLQueryParameter dup : dups) {
dup.setValue(newValue);
}
}
}
savedParamValues.put(
param.getName().toUpperCase(Locale.ENGLISH),
new SQLQueryParameterRegistry.ParameterInfo(param.getName(), newValue));
}
};
if (!parameters.isEmpty()) {
DBeaverUI.asyncExec(new Runnable() {
@Override
public void run() {
paramTable.select(0);
tableEditor.showEditor(paramTable.getItem(0), 2);
}
});
}
updateStatus(GeneralUtils.makeInfoStatus("Use Tab to switch. String values must be quoted. You can use expressions in values"));
return composite;
}
@Override
protected void okPressed()
{
SQLQueryParameterRegistry registry = SQLQueryParameterRegistry.getInstance();
for (SQLQueryParameterRegistry.ParameterInfo param : savedParamValues.values()) {
registry.setParameter(param.name, param.value);
}
registry.save();
super.okPressed();
}
}