/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
* Copyright (C) 2011-2012 Eugene Fradkin (eugene.fradkin@gmail.com)
*
* 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.ui.preferences;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.preference.ColorSelector;
import org.eclipse.jface.resource.StringConverter;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.IWorkbenchPropertyPage;
import org.jkiss.dbeaver.model.connection.DBPConnectionType;
import org.jkiss.dbeaver.registry.DataSourceProviderRegistry;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.UIIcon;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.utils.CommonUtils;
import org.jkiss.utils.SecurityUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
* PrefPageConnectionTypes
*/
public class PrefPageConnectionTypes extends AbstractPrefPage implements IWorkbenchPreferencePage, IWorkbenchPropertyPage
{
public static final String PAGE_ID = "org.jkiss.dbeaver.preferences.connectionTypes"; //$NON-NLS-1$
private Table typeTable;
private Text typeName;
private Text typeDescription;
private ColorSelector colorPicker;
private Button autocommitCheck;
private Button confirmCheck;
private ToolItem deleteButton;
private DBPConnectionType selectedType;
private Map<DBPConnectionType, DBPConnectionType> changedInfo = new HashMap<>();
@Override
public void init(IWorkbench workbench)
{
}
@Override
protected Control createContents(final Composite parent)
{
Composite composite = UIUtils.createPlaceholder(parent, 1, 5);
{
typeTable = new Table(composite, SWT.SINGLE | SWT.BORDER | SWT.FULL_SELECTION);
typeTable.setLayoutData(new GridData(GridData.FILL_BOTH));
UIUtils.createTableColumn(typeTable, SWT.LEFT, "Name");
UIUtils.createTableColumn(typeTable, SWT.LEFT, "Description");
typeTable.setHeaderVisible(true);
typeTable.setLayoutData(new GridData(GridData.FILL_BOTH));
typeTable.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e)
{
showSelectedType(getSelectedType());
}
});
ToolBar toolbar = new ToolBar(composite, SWT.FLAT | SWT.HORIZONTAL);
final ToolItem newButton = new ToolItem(toolbar, SWT.NONE);
newButton.setImage(DBeaverIcons.getImage(UIIcon.ROW_ADD));
deleteButton = new ToolItem(toolbar, SWT.NONE);
deleteButton.setImage(DBeaverIcons.getImage(UIIcon.ROW_DELETE));
newButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e)
{
String name;
for (int i = 1;; i++) {
name = "Type" + i;
boolean hasName = false;
for (DBPConnectionType type : changedInfo.keySet()) {
if (type.getName().equals(name)) {
hasName = true;
break;
}
}
if (!hasName) {
break;
}
}
DBPConnectionType newType = new DBPConnectionType(
SecurityUtils.generateUniqueId(),
name,
"255,255,255",
"New type",
true,
false);
addTypeToTable(newType, newType);
typeTable.select(typeTable.getItemCount() - 1);
typeTable.showSelection();
showSelectedType(newType);
}
});
this.deleteButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
DBPConnectionType connectionType = getSelectedType();
if (!UIUtils.confirmAction(
getShell(),
"Delete connection type", "Are you sure you want to delete connection type '" + connectionType.getName() + "'?\n" +
"All connections of this type will be reset to default type (" + DBPConnectionType.DEFAULT_TYPE.getName() + ")")) {
return;
}
changedInfo.remove(connectionType);
int index = typeTable.getSelectionIndex();
typeTable.remove(index);
if (index > 0) index--;
typeTable.select(index);
showSelectedType(getSelectedType());
}
});
}
{
Group groupSettings = UIUtils.createControlGroup(composite, "Settings", 2, GridData.VERTICAL_ALIGN_BEGINNING, 300);
groupSettings.setLayoutData(new GridData(GridData.FILL_BOTH));
typeName = UIUtils.createLabelText(groupSettings, "Name", null);
typeName.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e)
{
getSelectedType().setName(typeName.getText());
updateTableInfo();
}
});
typeDescription = UIUtils.createLabelText(groupSettings, "Description", null);
typeDescription.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e)
{
getSelectedType().setDescription(typeDescription.getText());
updateTableInfo();
}
});
{
UIUtils.createControlLabel(groupSettings, "Color");
// Composite colorGroup = UIUtils.createPlaceholder(groupSettings, 2, 5);
// colorGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
colorPicker = new ColorSelector(groupSettings);
// colorPicker.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
colorPicker.addListener(new IPropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event) {
getSelectedType().setColor(StringConverter.asString(colorPicker.getColorValue()));
updateTableInfo();
}
});
/*
Button pickerButton = new Button(colorGroup, SWT.PUSH);
pickerButton.setText("...");
pickerButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e)
{
DBPConnectionType connectionType = getSelectedType();
ColorDialog colorDialog = new ColorDialog(parent.getShell());
colorDialog.setRGB(StringConverter.asRGB(connectionType.getColor()));
RGB rgb = colorDialog.open();
if (rgb != null) {
Color color = null;
int count = colorPicker.getItemCount();
for (int i = 0; i < count; i++) {
Color item = colorPicker.getColorItem(i);
if (item != null && item.getRGB().equals(rgb)) {
color = item;
break;
}
}
if (color == null) {
color = new Color(colorPicker.getDisplay(), rgb);
colorPicker.addColor(color);
}
colorPicker.select(color);
getSelectedType().setColor(StringConverter.asString(color.getRGB()));
updateTableInfo();
}
}
});
*/
}
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan = 2;
autocommitCheck = UIUtils.createCheckbox(groupSettings, "Auto-commit by default", false);
autocommitCheck.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e)
{
getSelectedType().setAutocommit(autocommitCheck.getSelection());
}
});
autocommitCheck.setLayoutData(gd);
confirmCheck = UIUtils.createCheckbox(groupSettings, "Confirm SQL execution", false);
confirmCheck.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e)
{
getSelectedType().setConfirmExecute(confirmCheck.getSelection());
}
});
confirmCheck.setLayoutData(gd);
}
performDefaults();
return composite;
}
private DBPConnectionType getSelectedType()
{
return (DBPConnectionType) typeTable.getItem(typeTable.getSelectionIndex()).getData();
}
private void showSelectedType(DBPConnectionType connectionType)
{
final Color connectionTypeColor = UIUtils.getConnectionTypeColor(connectionType);
if (connectionTypeColor != null) {
colorPicker.setColorValue(connectionTypeColor.getRGB());
}
typeName.setText(connectionType.getName());
typeDescription.setText(connectionType.getDescription());
autocommitCheck.setSelection(connectionType.isAutocommit());
confirmCheck.setSelection(connectionType.isConfirmExecute());
deleteButton.setEnabled(!connectionType.isPredefined());
}
private void updateTableInfo()
{
DBPConnectionType connectionType = getSelectedType();
for (TableItem item : typeTable.getItems()) {
if (item.getData() == connectionType) {
item.setText(0, connectionType.getName());
item.setText(1, connectionType.getDescription());
Color connectionColor = UIUtils.getConnectionTypeColor(connectionType);
item.setBackground(0, connectionColor);
item.setBackground(1, connectionColor);
break;
}
}
}
@Override
protected void performDefaults()
{
typeTable.removeAll();
//colorPicker.loadStandardColors();
for (DBPConnectionType source : DataSourceProviderRegistry.getInstance().getConnectionTypes()) {
addTypeToTable(source, new DBPConnectionType(source));
}
typeTable.select(0);
if (selectedType != null) {
for (int i = 0; i < typeTable.getItemCount(); i++) {
if (typeTable.getItem(i).getData().equals(selectedType)) {
typeTable.select(i);
break;
}
}
}
showSelectedType(getSelectedType());
typeTable.addControlListener(new ControlAdapter() {
@Override
public void controlResized(ControlEvent e)
{
UIUtils.packColumns(typeTable, true);
}
});
super.performDefaults();
}
private void addTypeToTable(DBPConnectionType source, DBPConnectionType connectionType)
{
changedInfo.put(connectionType, source);
TableItem item = new TableItem(typeTable, SWT.LEFT);
item.setText(0, connectionType.getName());
item.setText(1, CommonUtils.toString(connectionType.getDescription()));
if (connectionType.getColor() != null) {
Color connectionColor = UIUtils.getConnectionTypeColor(connectionType);
item.setBackground(0, connectionColor);
item.setBackground(1, connectionColor);
if (connectionColor != null) {
colorPicker.setColorValue(connectionColor.getRGB());
}
}
item.setData(connectionType);
}
@Override
public boolean performOk()
{
DataSourceProviderRegistry registry = DataSourceProviderRegistry.getInstance();
java.util.List<DBPConnectionType> toRemove = new ArrayList<>();
for (DBPConnectionType type : registry.getConnectionTypes()) {
if (!changedInfo.values().contains(type)) {
// Remove
toRemove.add(type);
}
}
for (DBPConnectionType connectionType : toRemove) {
registry.removeConnectionType(connectionType);
}
for (DBPConnectionType changed : changedInfo.keySet()) {
DBPConnectionType source = changedInfo.get(changed);
if (source == changed) {
// New type
registry.addConnectionType(changed);
} else {
// Changed type
source.setName(changed.getName());
source.setDescription(changed.getDescription());
source.setAutocommit(changed.isAutocommit());
source.setConfirmExecute(changed.isConfirmExecute());
source.setColor(changed.getColor());
}
}
registry.saveConnectionTypes();
return super.performOk();
}
@Override
public IAdaptable getElement()
{
return null;
}
@Override
public void setElement(IAdaptable element)
{
selectedType = element.getAdapter(DBPConnectionType.class);
}
}