/*
* 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.ui.dialogs.connection;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogPage;
import org.eclipse.jface.wizard.IWizardPage;
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.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
import org.jkiss.dbeaver.model.runtime.DBRRunnableContext;
import org.jkiss.dbeaver.registry.DataSourceDescriptor;
import org.jkiss.dbeaver.registry.DataSourceViewDescriptor;
import org.jkiss.dbeaver.registry.driver.DriverDescriptor;
import org.jkiss.dbeaver.runtime.RunnableContextDelegate;
import org.jkiss.dbeaver.ui.*;
import org.jkiss.dbeaver.ui.dialogs.ActiveWizardPage;
import org.jkiss.dbeaver.ui.dialogs.driver.DriverEditDialog;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
import java.util.*;
/**
* Settings connection page. Hosts particular drivers' connection pages
*/
class ConnectionPageSettings extends ActiveWizardPage<ConnectionWizard> implements IDataSourceConnectionEditorSite, ICompositeDialogPage
{
private static final Log log = Log.getLog(DriverDescriptor.class);
@NotNull
private final ConnectionWizard wizard;
@NotNull
private DataSourceViewDescriptor viewDescriptor;
@Nullable
private IDataSourceConnectionEditor connectionEditor;
@Nullable
private DataSourceDescriptor dataSource;
private final Set<DataSourceDescriptor> activated = new HashSet<>();
private IDialogPage[] subPages, extraPages;
private TabFolder tabFolder;
/**
* Constructor for ConnectionPageSettings
*/
ConnectionPageSettings(
@NotNull ConnectionWizard wizard,
@NotNull DataSourceViewDescriptor viewDescriptor)
{
super("newConnectionSettings");
this.wizard = wizard;
this.viewDescriptor = viewDescriptor;
setTitle(wizard.isNew() ? viewDescriptor.getLabel() : "Connection settings");
setDescription(CoreMessages.dialog_connection_description);
}
/**
* Constructor for ConnectionPageSettings
*/
ConnectionPageSettings(
@NotNull ConnectionWizard wizard,
@NotNull DataSourceViewDescriptor viewDescriptor,
@Nullable DataSourceDescriptor dataSource)
{
this(wizard, viewDescriptor);
this.dataSource = dataSource;
}
@Override
public void activatePage()
{
if (connectionEditor == null) {
createProviderPage(getControl().getParent());
//UIUtils.resizeShell(getWizard().getContainer().getShell());
}
setMessage(NLS.bind(CoreMessages.dialog_connection_message, getDriver().getFullName()));
DataSourceDescriptor connectionInfo = getActiveDataSource();
if (!activated.contains(connectionInfo)) {
if (this.connectionEditor != null) {
this.connectionEditor.loadSettings();
}
if (subPages != null) {
for (IDialogPage page : subPages) {
Control pageControl = page.getControl();
// if (pageControl == null) {
// page.createControl(getControl().getParent());
// }
if (pageControl != null && page instanceof IDataSourceConnectionEditor) {
((IDataSourceConnectionEditor) page).loadSettings();
}
}
}
activated.add(connectionInfo);
} else if (connectionEditor != null) {
connectionEditor.loadSettings();
}
activateCurrentItem();
getContainer().updateTitleBar();
}
@Override
public Image getImage() {
if (this.connectionEditor != null) {
Image image = this.connectionEditor.getImage();
if (image != null) {
return image;
}
}
return super.getImage();
}
void saveSettings(DataSourceDescriptor dataSource)
{
if (connectionEditor != null) {
connectionEditor.saveSettings(dataSource);
}
if (subPages != null) {
for (IDialogPage page : subPages) {
if (page.getControl() != null && page instanceof IDataSourceConnectionEditor) {
((IDataSourceConnectionEditor) page).saveSettings(dataSource);
}
}
}
}
@Override
public void createControl(Composite parent)
{
if (wizard.isNew()) {
setControl(new Composite(parent, SWT.BORDER));
} else {
createProviderPage(parent);
}
}
private void createProviderPage(Composite parent) {
if (this.connectionEditor != null && this.connectionEditor.getControl() != null) {
return;
}
if (getControl() != null) {
getControl().dispose();
}
try {
if (this.connectionEditor == null) {
this.connectionEditor = viewDescriptor.createView(IDataSourceConnectionEditor.class);
this.connectionEditor.setSite(this);
}
// init sub pages (if any)
getSubPages();
if (wizard.isNew() && !ArrayUtils.isEmpty(subPages)) {
// Create tab folder
List<IDialogPage> allPages = new ArrayList<>();
allPages.add(connectionEditor);
Collections.addAll(allPages, subPages);
tabFolder = new TabFolder(parent, SWT.TOP);
tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH));
setControl(tabFolder);
for (IDialogPage page : allPages) {
TabItem item = new TabItem(tabFolder, SWT.NONE);
page.createControl(tabFolder);
item.setData(page);
Control pageControl = page.getControl();
item.setControl(pageControl);
item.setText(CommonUtils.isEmpty(page.getTitle()) ? "General" : page.getTitle());
item.setToolTipText(page.getDescription());
}
tabFolder.setSelection(0);
tabFolder.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
activateCurrentItem();
}
});
} else {
// Create single editor control
this.connectionEditor.createControl(parent);
setControl(this.connectionEditor.getControl());
}
UIUtils.setHelp(getControl(), IHelpContextIds.CTX_CON_WIZARD_SETTINGS);
}
catch (Exception ex) {
log.warn(ex);
setErrorMessage("Can't create settings dialog: " + ex.getMessage());
}
parent.layout();
}
private void activateCurrentItem() {
if (tabFolder != null) {
TabItem[] selection = tabFolder.getSelection();
if (selection.length == 1) {
IDialogPage page = (IDialogPage) selection[0].getData();
page.setVisible(true);
}
}
}
@Override
public boolean canFlipToNextPage()
{
return true;
}
@Override
public boolean isPageComplete()
{
return wizard.getPageSettings() != this ||
this.connectionEditor != null && this.connectionEditor.isComplete();
}
@Override
public DBRRunnableContext getRunnableContext()
{
return new RunnableContextDelegate(wizard.getContainer());
}
@Override
public DBPDataSourceRegistry getDataSourceRegistry() {
return wizard.getDataSourceRegistry();
}
@Override
public boolean isNew() {
return wizard.isNew();
}
@Override
public DriverDescriptor getDriver()
{
return wizard.getSelectedDriver();
}
@NotNull
@Override
public DataSourceDescriptor getActiveDataSource()
{
if (dataSource != null) {
return dataSource;
}
return wizard.getActiveDataSource();
}
@Override
public void updateButtons()
{
getWizard().getContainer().updateButtons();
}
@Override
public boolean openDriverEditor()
{
DriverEditDialog dialog = new DriverEditDialog(wizard.getShell(), this.getDriver());
return dialog.open() == IDialogConstants.OK_ID;
}
@Override
public boolean openSettingsPage(String pageId) {
final IWizardPage page = wizard.getPage(pageId);
if (page != null) {
wizard.getContainer().showPage(page);
}
return false;
}
@Override
public void dispose()
{
if (connectionEditor != null) {
connectionEditor.dispose();
connectionEditor = null;
}
super.dispose();
}
@Nullable
@Override
public IDialogPage[] getSubPages()
{
if (subPages != null) {
return subPages;
}
if (this.connectionEditor == null) {
this.connectionEditor = viewDescriptor.createView(IDataSourceConnectionEditor.class);
this.connectionEditor.setSite(this);
}
if (connectionEditor instanceof ICompositeDialogPage) {
subPages = ((ICompositeDialogPage) connectionEditor).getSubPages();
if (!ArrayUtils.isEmpty(subPages)) {
for (IDialogPage page : subPages) {
if (page instanceof IDataSourceConnectionEditor) {
((IDataSourceConnectionEditor) page).setSite(this);
}
}
}
if (extraPages != null) {
subPages = ArrayUtils.concatArrays(subPages, extraPages);
}
return subPages;
} else {
return extraPages;
}
}
public void addSubPage(IDialogPage page) {
if (extraPages == null) {
extraPages = new IDialogPage[] { page };
} else {
extraPages = ArrayUtils.concatArrays(extraPages, new IDialogPage[] { page });
}
}
}