/*
* 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.dialogs.ControlEnableState;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.preference.PreferenceDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.eclipse.ui.dialogs.PreferencesUtil;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.core.DBeaverCore;
import org.jkiss.dbeaver.model.DBPContextProvider;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.preferences.DBPPreferenceStore;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
import org.jkiss.dbeaver.model.navigator.DBNDataSource;
import org.jkiss.dbeaver.model.navigator.DBNNode;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.dialogs.connection.SelectDataSourceDialog;
import org.jkiss.dbeaver.ui.editors.IDatabaseEditorInput;
import org.jkiss.dbeaver.utils.PrefUtils;
/**
* TargetPrefPage
*/
public abstract class TargetPrefPage extends AbstractPrefPage implements IWorkbenchPreferencePage, IWorkbenchPropertyPage
{
static final Log log = Log.getLog(TargetPrefPage.class);
private DBNDataSource containerNode;
private Button dataSourceSettingsButton;
private Control configurationBlockControl;
private Link changeSettingsTargetLink;
private ControlEnableState blockEnableState;
protected TargetPrefPage()
{
}
public final boolean isDataSourcePreferencePage()
{
return containerNode != null;
}
protected abstract boolean hasDataSourceSpecificOptions(DBPDataSourceContainer dsContainer);
protected abstract boolean supportsDataSourceSpecificOptions();
protected void createPreferenceHeader(Composite composite)
{
}
protected abstract Control createPreferenceContent(Composite composite);
protected abstract void loadPreferences(DBPPreferenceStore store);
protected abstract void savePreferences(DBPPreferenceStore store);
protected abstract void clearPreferences(DBPPreferenceStore store);
protected abstract String getPropertyPageID();
public DBPDataSourceContainer getDataSourceContainer()
{
return containerNode == null ? null : containerNode.getObject();
}
@Override
public void init(IWorkbench workbench)
{
}
@Override
public IAdaptable getElement()
{
return containerNode;
}
@Override
public void setElement(IAdaptable element)
{
if (element == null) {
return;
}
containerNode = element.getAdapter(DBNDataSource.class);
if (containerNode == null) {
final DBPDataSourceContainer dsContainer = element.getAdapter(DBPDataSourceContainer.class);
if (dsContainer != null) {
containerNode = (DBNDataSource) DBeaverCore.getInstance().getNavigatorModel().findNode(dsContainer);
} else {
IDatabaseEditorInput dbInput = element.getAdapter(IDatabaseEditorInput.class);
if (dbInput != null) {
DBNNode dbNode = dbInput.getNavigatorNode();
if (dbNode instanceof DBNDataSource) {
containerNode = (DBNDataSource) dbNode;
}
} else if (element instanceof DBPContextProvider) {
DBCExecutionContext context = ((DBPContextProvider) element).getExecutionContext();
if (context != null) {
containerNode = (DBNDataSource) DBeaverCore.getInstance().getNavigatorModel().findNode(context.getDataSource().getContainer());
}
} else if (element instanceof DBPDataSourceContainer) {
containerNode = (DBNDataSource) DBeaverCore.getInstance().getNavigatorModel().findNode((DBPDataSourceContainer) element);
}
}
}
}
public void applyData(Object data) {
if (containerNode == null && data instanceof IAdaptable) {
setElement((IAdaptable) data);
}
}
@Override
protected Label createDescriptionLabel(Composite parent)
{
if (isDataSourcePreferencePage()) {
Composite composite = UIUtils.createPlaceholder(parent, 2);
composite.setFont(parent.getFont());
composite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
dataSourceSettingsButton = new Button(composite, SWT.CHECK);
dataSourceSettingsButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
boolean enabled = dataSourceSettingsButton.getSelection();
enableDataSourceSpecificSettings(enabled);
}
});
String dataSourceName = containerNode.getDataSourceContainer().getName();
dataSourceSettingsButton.setText(NLS.bind(CoreMessages.pref_page_target_button_use_datasource_settings, dataSourceName));
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
dataSourceSettingsButton.setLayoutData(gd);
changeSettingsTargetLink = createLink(composite, CoreMessages.pref_page_target_link_show_global_settings);
changeSettingsTargetLink.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
} else if (supportsDataSourceSpecificOptions()) {
changeSettingsTargetLink = createLink(
parent,
CoreMessages.pref_page_target_link_show_datasource_settings);
changeSettingsTargetLink.setLayoutData(new GridData(SWT.END, SWT.CENTER, true, false));
}
Label horizontalLine = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
horizontalLine.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, 2, 1));
horizontalLine.setFont(parent.getFont());
createPreferenceHeader(parent);
return super.createDescriptionLabel(parent);
}
/*
* @see org.eclipse.jface.preference.IPreferencePage#createContents(Composite)
*/
@Override
protected Control createContents(Composite parent)
{
Composite composite = UIUtils.createPlaceholder(parent, 1);
configurationBlockControl = createPreferenceContent(composite);
configurationBlockControl.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
if (isDataSourcePreferencePage()) {
boolean useProjectSettings = hasDataSourceSpecificOptions(getDataSourceContainer());
enableDataSourceSpecificSettings(useProjectSettings);
}
{
DBPPreferenceStore store = useDataSourceSettings() ?
getDataSourceContainer().getPreferenceStore() :
DBeaverCore.getGlobalPreferenceStore();
loadPreferences(store);
}
Dialog.applyDialogFont(composite);
return composite;
}
private Link createLink(Composite composite, String text)
{
Link link = UIUtils.createLink(composite, "<A>" + text + "</A>", new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e)
{
doLinkActivated((Link) e.widget);
}
@Override
public void widgetDefaultSelected(SelectionEvent e)
{
widgetSelected(e);
}
});
link.setFont(composite.getFont());
return link;
}
protected void enableDataSourceSpecificSettings(boolean useProjectSpecificSettings)
{
dataSourceSettingsButton.setSelection(useProjectSpecificSettings);
enablePreferenceContent(useProjectSpecificSettings);
updateLinkVisibility();
doStatusChanged();
}
protected void doStatusChanged()
{
/*
if (!isProjectPreferencePage() || useDataSourceSettings()) {
updateStatus(fBlockStatus);
} else {
updateStatus(new StatusInfo());
}
*/
}
protected void enablePreferenceContent(boolean enable)
{
if (enable) {
if (blockEnableState != null) {
blockEnableState.restore();
blockEnableState = null;
}
} else {
if (blockEnableState == null) {
blockEnableState = ControlEnableState.disable(configurationBlockControl);
}
}
}
protected boolean useDataSourceSettings()
{
return isDataSourcePreferencePage() && dataSourceSettingsButton != null && dataSourceSettingsButton.getSelection();
}
private void updateLinkVisibility()
{
if (changeSettingsTargetLink == null || changeSettingsTargetLink.isDisposed()) {
return;
}
if (isDataSourcePreferencePage()) {
//changeSettingsTargetLink.setEnabled(!useDataSourceSettings());
changeSettingsTargetLink.setEnabled(true);
}
}
private void doLinkActivated(Link link)
{
PreferenceDialog prefDialog = null;
if (isDataSourcePreferencePage()) {
// Show global settings
prefDialog = PreferencesUtil.createPreferenceDialogOn(
getShell(),
getPropertyPageID(),
null,//new String[]{getPropertyPageID()},
null);
} else if (supportsDataSourceSpecificOptions()) {
// Select datasource
DBPDataSourceContainer dataSource = SelectDataSourceDialog.selectDataSource(getShell(), null);
if (dataSource != null) {
DBNNode dsNode = DBeaverCore.getInstance().getNavigatorModel().getNodeByObject(dataSource);
if (dsNode instanceof DBNDataSource) {
prefDialog = PreferencesUtil.createPropertyDialogOn(
getShell(),
(DBNDataSource)dsNode,
getPropertyPageID(),
null,//new String[]{getPropertyPageID()},
null);
}
}
}
if (prefDialog != null) {
prefDialog.open();
}
}
@Override
protected void performApply()
{
performOk();
}
@Override
public final boolean performOk()
{
DBPPreferenceStore store = isDataSourcePreferencePage() ?
getDataSourceContainer().getPreferenceStore() :
DBeaverCore.getGlobalPreferenceStore();
if (isDataSourcePreferencePage() && !useDataSourceSettings()) {
// Just delete datasource specific settings
clearPreferences(store);
PrefUtils.savePreferenceStore(store);
} else {
savePreferences(store);
}
//PrefUtils.savePreferenceStore(store);
return super.performOk();
}
}