/*
* 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.controls.resultset;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
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.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.load.ILoadService;
import org.jkiss.dbeaver.model.runtime.load.ILoadVisualizer;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.LoadingJob;
import org.jkiss.dbeaver.ui.UIIcon;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.utils.RuntimeUtils;
import java.lang.reflect.InvocationTargetException;
/**
* Active status label
*/
abstract class ActiveStatusMessage extends Composite {
private static final Log log = Log.getLog(ActiveStatusMessage.class);
private final ResultSetViewer viewer;
private final Image actionImage;
private final Text messageText;
private final ToolItem actionItem;
private ILoadService<String> loadService;
public ActiveStatusMessage(@NotNull Composite parent, Image actionImage, String actionText, @Nullable final ResultSetViewer viewer) {
super(parent, SWT.BORDER);
this.viewer = viewer;
this.actionImage = actionImage;
GridLayout layout = new GridLayout(2, false);
layout.marginHeight = 0;
layout.marginWidth = 0;
layout.horizontalSpacing = 1;
this.setLayout(layout);
// Toolbar
ToolBar tb = new ToolBar(this, SWT.HORIZONTAL);
actionItem = new ToolItem(tb, SWT.NONE);
actionItem.setImage(this.actionImage);
if (actionText != null) {
actionItem.setToolTipText(actionText);
}
actionItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
executeAction();
}
});
messageText = new Text(this, SWT.READ_ONLY);
if (RuntimeUtils.isPlatformWindows()) {
messageText.setBackground(null);
} else {
messageText.setBackground(parent.getBackground());
}
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
messageText.setLayoutData(gd);
UIUtils.enableHostEditorKeyBindingsSupport(viewer.getSite(), this.messageText);
UIUtils.addFocusTracker(viewer.getSite(), UIUtils.INLINE_WIDGET_EDITOR_ID, this.messageText);
this.messageText.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
// Unregister from focus service
UIUtils.removeFocusTracker(viewer.getSite(), messageText);
}
});
}
public void setMessage(String message)
{
if (messageText.isDisposed()) {
return;
}
messageText.setText(message);
}
public String getMessage() {
return messageText.getText();
}
public void updateActionState() {
if (!actionItem.isDisposed()) {
actionItem.setEnabled(isActionEnabled());
}
}
public void executeAction() {
if (loadService != null) {
try {
loadService.cancel();
} catch (InvocationTargetException e) {
log.error(e.getTargetException());
}
loadService = null;
} else {
loadService = createLoadService();
LoadingJob.createService(
loadService,
new LoadVisualizer()).schedule();
}
}
protected abstract boolean isActionEnabled();
protected abstract ILoadService<String> createLoadService();
private class LoadVisualizer implements ILoadVisualizer<String> {
private boolean completed;
@Override
public DBRProgressMonitor overwriteMonitor(DBRProgressMonitor monitor) {
return monitor;
}
@Override
public boolean isCompleted() {
return completed || ActiveStatusMessage.this.isDisposed();
}
@Override
public void visualizeLoading() {
actionItem.setImage(DBeaverIcons.getImage(UIIcon.CLOSE));
}
@Override
public void completeLoading(String message) {
completed = true;
setMessage(message);
actionItem.setImage(actionImage);
loadService = null;
}
}
}