/* * 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.sql; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.*; import org.eclipse.ui.ISharedImages; import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.core.DBeaverUI; import org.jkiss.dbeaver.model.DBPEvaluationContext; import org.jkiss.dbeaver.model.DBPImage; import org.jkiss.dbeaver.model.DBUtils; import org.jkiss.dbeaver.model.exec.DBCException; import org.jkiss.dbeaver.model.exec.DBCResultSet; import org.jkiss.dbeaver.model.exec.DBCStatement; import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.ui.UIUtils; import org.jkiss.dbeaver.ui.dialogs.BaseDialog; import java.util.Collection; public abstract class SQLScriptStatusDialog<T extends DBSObject> extends BaseDialog implements SQLScriptProgressListener<T> { private static final String DIALOG_ID = "SQLScriptStatusDialog"; private Tree objectTree; private ProgressBar progressBar; private Label finishLabel; private Job job; private Collection<T> objects; private int processedCount; protected SQLScriptStatusDialog(String title, @Nullable DBPImage image) { super(DBeaverUI.getActiveWorkbenchShell(), title, image); } @Override protected IDialogSettings getDialogBoundsSettings() { return UIUtils.getDialogSettings(DIALOG_ID); } @Override protected Composite createDialogArea(Composite parent) { Composite composite = super.createDialogArea(parent); objectTree = new Tree(composite, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION); GridData gd = new GridData(GridData.FILL_BOTH); gd.widthHint = 500; gd.heightHint = 200; objectTree.setLayoutData(gd); objectTree.setHeaderVisible(true); objectTree.setLinesVisible(true); TreeColumn nameColumn = new TreeColumn(objectTree, SWT.NONE); nameColumn.setText("Object"); createStatusColumns(objectTree); for (T object : objects) { TreeItem item = new TreeItem(objectTree, SWT.NONE); item.setData(object); item.setText(0, DBUtils.getObjectFullName(object, DBPEvaluationContext.UI)); } Composite progressPanel = UIUtils.createPlaceholder(composite, 2, 5); progressPanel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); progressBar = new ProgressBar(progressPanel, SWT.HORIZONTAL); gd = new GridData(GridData.FILL_HORIZONTAL); progressBar.setLayoutData(gd); progressBar.setMinimum(0); progressBar.setMaximum(this.objects.size()); final Button stopButton = UIUtils.createPushButton( progressPanel, null, UIUtils.getShardImage(ISharedImages.IMG_ELCL_STOP)); stopButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { job.cancel(); stopButton.setEnabled(false); } }); finishLabel = new Label(composite, SWT.NONE); gd = new GridData(GridData.FILL_HORIZONTAL); gd.exclude = true; finishLabel.setLayoutData(gd); finishLabel.setText("Finished"); DBeaverUI.asyncExec(new Runnable() { @Override public void run() { UIUtils.packColumns(objectTree, false, null); } }); return composite; } @Override protected void createButtonsForButtonBar(Composite parent) { Button button = createButton(parent, IDialogConstants.CLOSE_ID, IDialogConstants.CLOSE_LABEL, true); button.setEnabled(false); } @Override protected void buttonPressed(int buttonId) { if (buttonId == IDialogConstants.CLOSE_ID) { okPressed(); } else { super.buttonPressed(buttonId); } } protected TreeItem getTreeItem(T object) { return UIUtils.getTreeItem(objectTree, object); } protected void createStatusColumns(Tree objectTree) { } @Override public void beginScriptProcessing(Job job, Collection<T> objects) { this.job = job; this.objects = objects; this.open(); } @Override public void endScriptProcessing() { if (getShell().isDisposed()) { return; } getButton(IDialogConstants.CLOSE_ID).setEnabled(true); Composite progressPanel = progressBar.getParent(); progressPanel.setVisible(false); ((GridData)progressPanel.getLayoutData()).exclude = true; finishLabel.setVisible(true); ((GridData)finishLabel.getLayoutData()).exclude = false; finishLabel.setText("Finished - " + processedCount + " object(s) processed"); progressPanel.getParent().layout(); } @Override public void beginObjectProcessing(@NotNull T object, int objectNumber) { progressBar.setSelection(objectNumber + 1); TreeItem item = getTreeItem(object); if (item != null) { objectTree.setSelection(item); } processedCount++; } @Override public void endObjectProcessing(@NotNull T object, Exception error) { UIUtils.packColumns(objectTree, false, null); } @Override public void processObjectResults(@NotNull T object, @Nullable DBCStatement statement, @Nullable DBCResultSet resultSet) throws DBCException { } }