/*
* 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.tools.transfer.wizard;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.registry.transfer.DataTransferNodeDescriptor;
import org.jkiss.dbeaver.registry.transfer.DataTransferProcessorDescriptor;
import org.jkiss.dbeaver.registry.transfer.DataTransferRegistry;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.dialogs.ActiveWizardPage;
import org.jkiss.utils.CommonUtils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
class DataTransferPagePipes extends ActiveWizardPage<DataTransferWizard> {
private TableViewer consumersTable;
private static class TransferTarget {
DataTransferNodeDescriptor consumer;
DataTransferProcessorDescriptor processor;
private TransferTarget(DataTransferNodeDescriptor consumer, DataTransferProcessorDescriptor processor)
{
this.consumer = consumer;
this.processor = processor;
}
}
DataTransferPagePipes() {
super(CoreMessages.data_transfer_wizard_init_name);
setTitle(CoreMessages.data_transfer_wizard_init_title);
setDescription(CoreMessages.data_transfer_wizard_init_description);
setPageComplete(false);
}
@Override
public void createControl(Composite parent) {
initializeDialogUnits(parent);
Composite composite = new Composite(parent, SWT.NULL);
composite.setLayout(new GridLayout());
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
consumersTable = new TableViewer(composite, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION);
consumersTable.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
consumersTable.getTable().setLinesVisible(true);
consumersTable.setContentProvider(new IStructuredContentProvider() {
@Override
public void dispose()
{
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
{
}
@Override
public Object[] getElements(Object inputElement)
{
if (inputElement instanceof Collection) {
return ((Collection<?>) inputElement).toArray();
}
return new Object[0];
}
});
CellLabelProvider labelProvider = new CellLabelProvider() {
@Override
public void update(ViewerCell cell) {
TransferTarget element = (TransferTarget) cell.getElement();
if (cell.getColumnIndex() == 0) {
if (element.processor != null) {
cell.setImage(DBeaverIcons.getImage(element.processor.getIcon()));
cell.setText(element.processor.getName());
} else {
cell.setImage(DBeaverIcons.getImage(element.consumer.getIcon()));
cell.setText(element.consumer.getName());
}
} else {
if (element.processor != null) {
cell.setText(element.processor.getDescription());
} else {
cell.setText(element.consumer.getDescription());
}
}
}
};
{
TableViewerColumn columnName = new TableViewerColumn(consumersTable, SWT.LEFT);
columnName.setLabelProvider(labelProvider);
columnName.getColumn().setText(CoreMessages.data_transfer_wizard_init_column_exported);
TableViewerColumn columnDesc = new TableViewerColumn(consumersTable, SWT.LEFT);
columnDesc.setLabelProvider(labelProvider);
columnDesc.getColumn().setText(CoreMessages.data_transfer_wizard_init_column_description);
}
loadConsumers();
consumersTable.getTable().addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e)
{
final IStructuredSelection selection = (IStructuredSelection) consumersTable.getSelection();
TransferTarget target;
if (!selection.isEmpty()) {
target = (TransferTarget) selection.getFirstElement();
} else {
target = null;
}
if (target == null) {
getWizard().getSettings().selectConsumer(null, null);
} else {
getWizard().getSettings().selectConsumer(target.consumer, target.processor);
}
updatePageCompletion();
}
@Override
public void widgetDefaultSelected(SelectionEvent e)
{
widgetSelected(e);
if (isPageComplete()) {
getWizard().getContainer().showPage(getWizard().getNextPage(DataTransferPagePipes.this));
}
}
});
consumersTable.getTable().addControlListener(new ControlAdapter() {
@Override
public void controlResized(ControlEvent e)
{
UIUtils.packColumns(consumersTable.getTable());
UIUtils.maxTableColumnsWidth(consumersTable.getTable());
consumersTable.getTable().removeControlListener(this);
}
});
setControl(composite);
DataTransferNodeDescriptor consumer = getWizard().getSettings().getConsumer();
DataTransferProcessorDescriptor processor = getWizard().getSettings().getProcessor();
if (consumer != null) {
Collection<TransferTarget> targets = (Collection<TransferTarget>) consumersTable.getInput();
for (TransferTarget target : targets) {
if (target.consumer == consumer && target.processor == processor) {
consumersTable.setSelection(new StructuredSelection(target));
break;
}
}
}
updatePageCompletion();
}
private void loadConsumers()
{
DataTransferSettings settings = getWizard().getSettings();
Collection<Class<?>> objectTypes = settings.getObjectTypes();
List<TransferTarget> transferTargets = new ArrayList<>();
for (DataTransferNodeDescriptor consumer : DataTransferRegistry.getInstance().getAvailableConsumers(objectTypes)) {
Collection<DataTransferProcessorDescriptor> processors = consumer.getAvailableProcessors(objectTypes);
if (CommonUtils.isEmpty(processors)) {
transferTargets.add(new TransferTarget(consumer, null));
} else {
for (DataTransferProcessorDescriptor processor : processors) {
transferTargets.add(new TransferTarget(consumer, processor));
}
}
}
consumersTable.setInput(transferTargets);
}
@Override
protected boolean determinePageCompletion() {
return getWizard().getSettings().getConsumer() != null;
}
}