提交 aa6c7a9d 编写于 作者: S serge-rider

#2050 Aut-refresh control refactoring


Former-commit-id: e1295859
上级 952b3646
......@@ -14,34 +14,29 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ui.controls.resultset;
package org.jkiss.dbeaver.ui.controls.autorefresh;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Spinner;
import org.eclipse.swt.widgets.*;
import org.jkiss.dbeaver.ui.UIIcon;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.dialogs.BaseDialog;
class AutoRefreshConfigDialog extends BaseDialog {
public class AutoRefreshConfigDialog extends BaseDialog {
private static final String DIALOG_ID = "DBeaver.AutoRefreshConfigDialog";//$NON-NLS-1$
private final ResultSetViewer resultSetViewer;
private ResultSetViewer.RefreshSettings refreshSettings;
private RefreshSettings refreshSettings;
AutoRefreshConfigDialog(ResultSetViewer resultSetViewer) {
super(resultSetViewer.getControl().getShell(), "Auto-refresh configuration", UIIcon.RS_SCHED_START);
this.resultSetViewer = resultSetViewer;
this.refreshSettings = new ResultSetViewer.RefreshSettings(resultSetViewer.getRefreshSettings());
AutoRefreshConfigDialog(Shell parentShell, RefreshSettings settings) {
super(parentShell, "Auto-refresh configuration", UIIcon.RS_SCHED_START);
this.refreshSettings = new RefreshSettings(settings);
}
ResultSetViewer.RefreshSettings getRefreshSettings() {
public RefreshSettings getRefreshSettings() {
return refreshSettings;
}
......@@ -56,18 +51,18 @@ class AutoRefreshConfigDialog extends BaseDialog {
Composite composite = super.createDialogArea(parent);
Group settingsGroup = UIUtils.createControlGroup(composite, "Settings", 2, GridData.FILL_BOTH, 0);
final Spinner intervalSpinner = UIUtils.createLabelSpinner(settingsGroup, "Interval (sec)", "Auto-refresh interval in seconds", refreshSettings.refreshInterval, 0, Integer.MAX_VALUE);
final Spinner intervalSpinner = UIUtils.createLabelSpinner(settingsGroup, "Interval (sec)", "Auto-refresh interval in seconds", refreshSettings.getRefreshInterval(), 0, Integer.MAX_VALUE);
intervalSpinner.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
refreshSettings.refreshInterval = intervalSpinner.getSelection();
refreshSettings.setRefreshInterval(intervalSpinner.getSelection());
}
});
final Button stopOnErrorCheck = UIUtils.createCheckbox(settingsGroup, "Stop on error", "Stop auto-refresh if error happens", refreshSettings.stopOnError, 2);
final Button stopOnErrorCheck = UIUtils.createCheckbox(settingsGroup, "Stop on error", "Stop auto-refresh if error happens", refreshSettings.isStopOnError(), 2);
stopOnErrorCheck.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
refreshSettings.stopOnError = stopOnErrorCheck.getSelection();
refreshSettings.setStopOnError(stopOnErrorCheck.getSelection());
}
});
......
/*
* 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.autorefresh;
import org.eclipse.jface.dialogs.IDialogConstants;
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.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.*;
import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.model.runtime.DBRRunnableWithProgress;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.UIIcon;
import java.util.ArrayList;
import java.util.List;
public class AutoRefreshControl {
private Control parent;
private String controlId;
private DBRRunnableWithProgress runnable;
private AutoRefreshJob autoRefreshJob;
private RefreshSettings refreshSettings;
private volatile boolean autoRefreshEnabled = false;
private ToolItem autoRefreshButton;
private Menu schedulerMenu;
public AutoRefreshControl(Control parent, String controlId, DBRRunnableWithProgress runnable) {
this.parent = parent;
this.controlId = controlId;
this.runnable = runnable;
parent.addDisposeListener(e -> {
if (schedulerMenu != null) {
schedulerMenu.dispose();
schedulerMenu = null;
}
});
}
String getControlId() {
return controlId;
}
public DBRRunnableWithProgress getRunnable() {
return runnable;
}
private synchronized RefreshSettings getRefreshSettings() {
if (refreshSettings == null) {
refreshSettings = new RefreshSettings(controlId);
refreshSettings.loadSettings();
}
return refreshSettings;
}
private synchronized void setRefreshSettings(RefreshSettings refreshSettings) {
this.refreshSettings = refreshSettings;
this.refreshSettings.saveSettings();
}
synchronized boolean isAutoRefreshEnabled() {
return autoRefreshEnabled;
}
public synchronized void enableAutoRefresh(boolean enable) {
this.autoRefreshEnabled = enable;
scheduleAutoRefresh(false);
updateAutoRefreshToolbar();
}
public synchronized void scheduleAutoRefresh(boolean afterError) {
if (autoRefreshJob != null) {
autoRefreshJob.cancel();
autoRefreshJob = null;
}
if (!this.autoRefreshEnabled) {
return;
}
RefreshSettings settings = getRefreshSettings();
if (afterError && settings.isStopOnError()) {
return;
}
autoRefreshJob = new AutoRefreshJob(this);
autoRefreshJob.schedule((long)settings.getRefreshInterval() * 1000);
}
public void cancelRefresh() {
// Cancel any auto-refresh activities
final AutoRefreshJob refreshJob = this.autoRefreshJob;
if (refreshJob != null) {
refreshJob.cancel();
this.autoRefreshJob = null;
}
}
public void populateRefreshButton(ToolBar toolbar) {
autoRefreshButton = new ToolItem(toolbar, SWT.DROP_DOWN | SWT.NO_FOCUS);
autoRefreshButton.addSelectionListener(new AutoRefreshMenuListener(autoRefreshButton));
updateAutoRefreshToolbar();
}
private void updateAutoRefreshToolbar() {
if (isAutoRefreshEnabled()) {
autoRefreshButton.setImage(DBeaverIcons.getImage(UIIcon.RS_SCHED_STOP));
autoRefreshButton.setToolTipText(CoreMessages.sql_editor_resultset_filter_panel_btn_stop_refresh);
} else {
autoRefreshButton.setImage(DBeaverIcons.getImage(UIIcon.RS_SCHED_START));
autoRefreshButton.setToolTipText(CoreMessages.sql_editor_resultset_filter_panel_btn_config_refresh);
}
}
private static final int[] AUTO_REFRESH_DEFAULTS = new int[]{1, 5, 10, 15, 30, 60};
private class AutoRefreshMenuListener extends SelectionAdapter {
private final ToolItem dropdown;
AutoRefreshMenuListener(ToolItem item) {
this.dropdown = item;
}
@Override
public void widgetSelected(SelectionEvent e) {
if (e.detail == SWT.ARROW) {
ToolItem item = (ToolItem) e.widget;
Rectangle rect = item.getBounds();
Point pt = item.getParent().toDisplay(new Point(rect.x, rect.y));
if (schedulerMenu != null) {
schedulerMenu.dispose();
}
schedulerMenu = new Menu(dropdown.getParent().getShell());
{
MenuItem mi = new MenuItem(schedulerMenu, SWT.NONE);
mi.setText(CoreMessages.sql_editor_resultset_filter_panel_menu_customize);
mi.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
runCustomized();
}
});
mi = new MenuItem(schedulerMenu, SWT.NONE);
mi.setText(CoreMessages.sql_editor_resultset_filter_panel_menu_stop);
mi.setEnabled(isAutoRefreshEnabled());
mi.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
enableAutoRefresh(false);
}
});
new MenuItem(schedulerMenu, SWT.SEPARATOR);
List<Integer> presetList = new ArrayList<>();
for (int t : AUTO_REFRESH_DEFAULTS) presetList.add(t);
int defaultInterval = getRefreshSettings().getRefreshInterval();
if (defaultInterval > 0 && !presetList.contains(defaultInterval)) {
presetList.add(0, defaultInterval);
}
for (final Integer timeout : presetList) {
mi = new MenuItem(schedulerMenu, SWT.PUSH);
mi.setText(NLS.bind(CoreMessages.sql_editor_resultset_filter_panel_menu_refresh_interval , String.valueOf(timeout)));
if (isAutoRefreshEnabled() && timeout == defaultInterval) {
schedulerMenu.setDefaultItem(mi);
}
mi.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
runPreset(timeout);
}
});
}
}
schedulerMenu.setLocation(pt.x, pt.y + rect.height);
schedulerMenu.setVisible(true);
} else {
if (isAutoRefreshEnabled()) {
enableAutoRefresh(false);
} else {
runCustomized();
}
}
}
private void runCustomized() {
AutoRefreshConfigDialog dialog = new AutoRefreshConfigDialog(parent.getShell(), getRefreshSettings());
if (dialog.open() == IDialogConstants.OK_ID) {
setRefreshSettings(dialog.getRefreshSettings());
enableAutoRefresh(true);
}
}
private void runPreset(int interval) {
RefreshSettings settings = new RefreshSettings(getRefreshSettings());
settings.setRefreshInterval(interval);
setRefreshSettings(settings);
enableAutoRefresh(true);
}
}
}
......@@ -14,26 +14,35 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ui.controls.resultset;
package org.jkiss.dbeaver.ui.controls.autorefresh;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.jkiss.dbeaver.model.runtime.AbstractJob;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.utils.GeneralUtils;
class AutoRefreshJob extends AbstractJob {
import java.lang.reflect.InvocationTargetException;
private final ResultSetViewer viewer;
public class AutoRefreshJob extends AbstractJob {
AutoRefreshJob(ResultSetViewer viewer) {
super("Auto-refresh job");
this.viewer = viewer;
private final AutoRefreshControl refreshControl;
AutoRefreshJob(AutoRefreshControl refreshControl) {
super("Auto-refresh job (" + refreshControl.getControlId() + ")");
this.refreshControl = refreshControl;
}
@Override
protected IStatus run(DBRProgressMonitor monitor) {
if (!monitor.isCanceled() && viewer.isAutoRefreshEnabled()) {
viewer.refreshData(null);
if (!monitor.isCanceled() && refreshControl.isAutoRefreshEnabled()) {
try {
refreshControl.getRunnable().run(monitor);
} catch (InvocationTargetException e) {
return GeneralUtils.makeErrorStatus("Auto-refresh error", e.getTargetException());
} catch (InterruptedException e) {
// ignore
}
}
return Status.OK_STATUS;
}
......
/*
* 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.autorefresh;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.jkiss.dbeaver.ui.UIUtils;
public class RefreshSettings {
private static IDialogSettings viewerSettings;
private final String settingsId;
private int refreshInterval = 0;
private boolean stopOnError = true;
RefreshSettings(String settingsId) {
this.settingsId = settingsId;
}
RefreshSettings(RefreshSettings src) {
this.settingsId = src.settingsId;
this.refreshInterval = src.refreshInterval;
this.stopOnError = src.stopOnError;
}
int getRefreshInterval() {
return refreshInterval;
}
void setRefreshInterval(int refreshInterval) {
this.refreshInterval = refreshInterval;
}
boolean isStopOnError() {
return stopOnError;
}
void setStopOnError(boolean stopOnError) {
this.stopOnError = stopOnError;
}
public void loadSettings() {
IDialogSettings viewerSettings = getViewerSettings(settingsId);
if (viewerSettings.get("interval") != null) refreshInterval = viewerSettings.getInt("interval");
if (viewerSettings.get("stopOnError") != null) stopOnError = viewerSettings.getBoolean("stopOnError");
}
public void saveSettings() {
IDialogSettings viewerSettings = getViewerSettings(settingsId);
viewerSettings.put("interval", refreshInterval);
viewerSettings.put("stopOnError", stopOnError);
}
private static IDialogSettings getViewerSettings(String section) {
if (viewerSettings == null) {
viewerSettings = UIUtils.getDialogSettings("DBeaver.AutoRefresh");
}
return UIUtils.getSettingsSection(viewerSettings, section);
}
}
......@@ -17,64 +17,18 @@
package org.jkiss.dbeaver.ui.controls.resultset;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.fieldassist.ContentProposal;
import org.eclipse.jface.fieldassist.IContentProposal;
import org.eclipse.jface.fieldassist.IContentProposalProvider;
import org.eclipse.jface.text.Document;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseMoveListener;
import org.eclipse.swt.events.MouseTrackAdapter;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.ScrollBar;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.*;
import org.eclipse.ui.IWorkbenchCommandConstants;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.texteditor.ITextEditorActionConstants;
......@@ -84,11 +38,7 @@ import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.core.DBeaverUI;
import org.jkiss.dbeaver.model.DBIcon;
import org.jkiss.dbeaver.model.DBPDataSource;
import org.jkiss.dbeaver.model.DBPImage;
import org.jkiss.dbeaver.model.DBPImageProvider;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.*;
import org.jkiss.dbeaver.model.data.DBDAttributeBinding;
import org.jkiss.dbeaver.model.data.DBDAttributeConstraint;
import org.jkiss.dbeaver.model.data.DBDDataFilter;
......@@ -103,11 +53,7 @@ import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.dbeaver.model.struct.DBSDataContainer;
import org.jkiss.dbeaver.model.struct.DBSEntity;
import org.jkiss.dbeaver.runtime.ui.DBUserInterface;
import org.jkiss.dbeaver.ui.ActionUtils;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.TextUtils;
import org.jkiss.dbeaver.ui.UIIcon;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.*;
import org.jkiss.dbeaver.ui.controls.StyledTextContentAdapter;
import org.jkiss.dbeaver.ui.editors.StringEditorInput;
import org.jkiss.dbeaver.ui.editors.SubEditorSite;
......@@ -118,6 +64,14 @@ import org.jkiss.dbeaver.ui.editors.sql.syntax.SQLWordPartDetector;
import org.jkiss.dbeaver.utils.GeneralUtils;
import org.jkiss.utils.CommonUtils;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* ResultSetFilterPanel
*/
......@@ -142,7 +96,6 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
private final ToolItem filtersApplyButton;
private final ToolItem filtersClearButton;
private final ToolItem filtersSaveButton;
private final ToolItem autoRefreshButton;
private final ToolItem historyBackButton;
private final ToolItem historyForwardButton;
......@@ -158,7 +111,6 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
private String prevQuery = null;
private final List<String> filtersHistory = new ArrayList<>();
private Menu historyMenu;
private Menu schedulerMenu;
ResultSetFilterPanel(ResultSetViewer rsv) {
super(rsv.getControl(), SWT.NONE);
......@@ -307,9 +259,7 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
UIUtils.createToolBarSeparator(filterToolbar, SWT.VERTICAL);
autoRefreshButton = new ToolItem(filterToolbar, SWT.DROP_DOWN | SWT.NO_FOCUS);
autoRefreshButton.addSelectionListener(new AutoRefreshMenuListener(autoRefreshButton));
updateAutoRefreshToolbar();
rsv.getAutoRefresh().populateRefreshButton(filterToolbar);
UIUtils.createToolBarSeparator(filterToolbar, SWT.VERTICAL);
......@@ -350,20 +300,13 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
enablePanelControls(false);
this.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
if (historyMenu != null) {
historyMenu.dispose();
historyMenu = null;
}
if (schedulerMenu != null) {
schedulerMenu.dispose();
schedulerMenu = null;
}
UIUtils.dispose(sizingGC);
UIUtils.dispose(hintFont);
this.addDisposeListener(e -> {
if (historyMenu != null) {
historyMenu.dispose();
historyMenu = null;
}
UIUtils.dispose(sizingGC);
UIUtils.dispose(hintFont);
});
}
......@@ -427,16 +370,6 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
redrawPanels();
}
void updateAutoRefreshToolbar() {
if (viewer.isAutoRefreshEnabled()) {
autoRefreshButton.setImage(DBeaverIcons.getImage(UIIcon.RS_SCHED_STOP));
autoRefreshButton.setToolTipText(CoreMessages.sql_editor_resultset_filter_panel_btn_stop_refresh);
} else {
autoRefreshButton.setImage(DBeaverIcons.getImage(UIIcon.RS_SCHED_START));
autoRefreshButton.setToolTipText(CoreMessages.sql_editor_resultset_filter_panel_btn_config_refresh);
}
}
private void enablePanelControls(boolean enable) {
setRedraw(false);
try {
......@@ -623,12 +556,7 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
//textWidget.setAlwaysShowScrollBars(false);
panel.setBackground(textWidget.getBackground());
panel.addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
editor.dispose();
}
});
panel.addDisposeListener(e -> editor.dispose());
return textWidget;
}
......@@ -688,12 +616,7 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
FilterPanel(Composite parent, int style) {
super(parent, style);
addPaintListener(new PaintListener() {
@Override
public void paintControl(PaintEvent e) {
paintPanel(e);
}
});
addPaintListener(this::paintPanel);
addMouseTrackListener(new MouseTrackAdapter() {
@Override
public void mouseEnter(MouseEvent e) {
......@@ -734,12 +657,7 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
@Override
public void mouseDown(final MouseEvent e) {
DBeaverUI.asyncExec(new Runnable() {
@Override
public void run() {
showObjectInfoPopup(e);
}
});
DBeaverUI.asyncExec(() -> showObjectInfoPopup(e));
}
});
}
......@@ -854,12 +772,7 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
gd.widthHint = dropImageE.getBounds().width;
setLayoutData(gd);
addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
UIUtils.dispose(dropImageD);
}
});
addDisposeListener(e -> UIUtils.dispose(dropImageD));
addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
......@@ -973,12 +886,7 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
}
}
});
historyTable.addMouseMoveListener(new MouseMoveListener() {
@Override
public void mouseMove(MouseEvent e) {
hoverItem = historyTable.getItem(new Point(e.x, e.y));
}
});
historyTable.addMouseMoveListener(e -> hoverItem = historyTable.getItem(new Point(e.x, e.y)));
historyTable.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
......@@ -1005,12 +913,7 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
setToolTipText(CoreMessages.controls_resultset_viewer_action_refresh);
enabledImage = DBeaverIcons.getImage(UIIcon.RS_REFRESH);
disabledImage = new Image(enabledImage.getDevice(), enabledImage, SWT.IMAGE_GRAY);
addDisposeListener(new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
UIUtils.dispose(disabledImage);
}
});
addDisposeListener(e -> UIUtils.dispose(disabledImage));
addMouseListener(new MouseAdapter() {
@Override
public void mouseUp(MouseEvent e) {
......@@ -1085,94 +988,4 @@ class ResultSetFilterPanel extends Composite implements IContentProposalProvider
}
}
private static final int[] AUTO_REFRESH_DEFAULTS = new int[]{1, 5, 10, 15, 30, 60};
private class AutoRefreshMenuListener extends SelectionAdapter {
private final ToolItem dropdown;
AutoRefreshMenuListener(ToolItem item) {
this.dropdown = item;
}
@Override
public void widgetSelected(SelectionEvent e) {
if (e.detail == SWT.ARROW) {
ToolItem item = (ToolItem) e.widget;
Rectangle rect = item.getBounds();
Point pt = item.getParent().toDisplay(new Point(rect.x, rect.y));
if (schedulerMenu != null) {
schedulerMenu.dispose();
}
schedulerMenu = new Menu(dropdown.getParent().getShell());
{
MenuItem mi = new MenuItem(schedulerMenu, SWT.NONE);
mi.setText(CoreMessages.sql_editor_resultset_filter_panel_menu_customize);
mi.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
runCustomized();
}
});
mi = new MenuItem(schedulerMenu, SWT.NONE);
mi.setText(CoreMessages.sql_editor_resultset_filter_panel_menu_stop);
mi.setEnabled(viewer.isAutoRefreshEnabled());
mi.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
viewer.enableAutoRefresh(false);
}
});
new MenuItem(schedulerMenu, SWT.SEPARATOR);
List<Integer> presetList = new ArrayList<>();
for (int t : AUTO_REFRESH_DEFAULTS) presetList.add(t);
int defaultInterval = viewer.getRefreshSettings().refreshInterval;
if (defaultInterval > 0 && !presetList.contains(defaultInterval)) {
presetList.add(0, defaultInterval);
}
for (final Integer timeout : presetList) {
mi = new MenuItem(schedulerMenu, SWT.PUSH);
mi.setText(NLS.bind(CoreMessages.sql_editor_resultset_filter_panel_menu_refresh_interval , String.valueOf(timeout)));
if (viewer.isAutoRefreshEnabled() && timeout == defaultInterval) {
schedulerMenu.setDefaultItem(mi);
}
mi.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
runPreset(timeout);
}
});
}
}
schedulerMenu.setLocation(pt.x, pt.y + rect.height);
schedulerMenu.setVisible(true);
} else {
if (viewer.isAutoRefreshEnabled()) {
viewer.enableAutoRefresh(false);
} else {
runCustomized();
}
}
}
private void runCustomized() {
AutoRefreshConfigDialog dialog = new AutoRefreshConfigDialog(viewer);
if (dialog.open() == IDialogConstants.OK_ID) {
viewer.setRefreshSettings(dialog.getRefreshSettings());
viewer.enableAutoRefresh(true);
}
}
private void runPreset(int interval) {
ResultSetViewer.RefreshSettings settings = new ResultSetViewer.RefreshSettings(viewer.getRefreshSettings());
settings.refreshInterval = interval;
viewer.setRefreshSettings(settings);
viewer.enableAutoRefresh(true);
}
}
}
......@@ -81,6 +81,7 @@ import org.jkiss.dbeaver.model.struct.*;
import org.jkiss.dbeaver.model.virtual.*;
import org.jkiss.dbeaver.runtime.ui.DBUserInterface;
import org.jkiss.dbeaver.ui.*;
import org.jkiss.dbeaver.ui.controls.autorefresh.AutoRefreshControl;
import org.jkiss.dbeaver.ui.controls.resultset.valuefilter.FilterValueEditDialog;
import org.jkiss.dbeaver.ui.controls.resultset.valuefilter.FilterValueEditPopup;
import org.jkiss.dbeaver.ui.controls.resultset.view.EmptyPresentation;
......@@ -117,7 +118,7 @@ public class ResultSetViewer extends Viewer
implements DBPContextProvider, IResultSetController, ISaveablePart2, IAdaptable
{
private static final Log log = Log.getLog(ResultSetViewer.class);
private static final String SETTINGS_SECTION_REFRESH = "autoRefresh";
private static final String SETTINGS_SECTION_PRESENTATIONS = "presentations";
private static final DecimalFormat ROW_COUNT_FORMAT = new DecimalFormat("###,###,###,###,###,##0");
......@@ -173,10 +174,7 @@ public class ResultSetViewer extends Viewer
private final List<HistoryStateItem> stateHistory = new ArrayList<>();
private int historyPosition = -1;
private AutoRefreshJob autoRefreshJob;
private RefreshSettings refreshSettings;
private volatile boolean autoRefreshEnabled = false;
private AutoRefreshControl autoRefreshControl;
private boolean actionsDisabled;
private static Action NOREFS_ACTION, REFS_TITLE_ACTION;
......@@ -204,6 +202,9 @@ public class ResultSetViewer extends Viewer
this.viewerPanel.setRedraw(false);
try {
this.autoRefreshControl = new AutoRefreshControl(
this.viewerPanel, ResultSetViewer.class.getSimpleName(), monitor -> refreshData(null));
this.filtersPanel = new ResultSetFilterPanel(this);
this.findReplaceTarget = new DynamicFindReplaceTarget();
......@@ -276,6 +277,10 @@ public class ResultSetViewer extends Viewer
return container;
}
AutoRefreshControl getAutoRefresh() {
return autoRefreshControl;
}
////////////////////////////////////////////////////////////
// Filters
......@@ -2410,45 +2415,6 @@ public class ResultSetViewer extends Viewer
return true;
}
public synchronized RefreshSettings getRefreshSettings() {
if (refreshSettings == null) {
refreshSettings = new RefreshSettings();
refreshSettings.loadSettings();
}
return refreshSettings;
}
public synchronized void setRefreshSettings(RefreshSettings refreshSettings) {
this.refreshSettings = refreshSettings;
this.refreshSettings.saveSettings();
}
public synchronized boolean isAutoRefreshEnabled() {
return autoRefreshEnabled;
}
public synchronized void enableAutoRefresh(boolean enable) {
this.autoRefreshEnabled = enable;
scheduleAutoRefresh(false);
filtersPanel.updateAutoRefreshToolbar();
}
private synchronized void scheduleAutoRefresh(boolean afterError) {
if (autoRefreshJob != null) {
autoRefreshJob.cancel();
autoRefreshJob = null;
}
if (!this.autoRefreshEnabled) {
return;
}
RefreshSettings settings = getRefreshSettings();
if (afterError && settings.stopOnError) {
return;
}
autoRefreshJob = new AutoRefreshJob(this);
autoRefreshJob.schedule((long)settings.refreshInterval * 1000);
}
/**
* Refresh is called to execute new query/browse new data. It is public API function.
*/
......@@ -2459,7 +2425,7 @@ public class ResultSetViewer extends Viewer
return;
}
// Disable auto-refresh
enableAutoRefresh(false);
autoRefreshControl.enableAutoRefresh(false);
// Pump data
DBSDataContainer dataContainer = getDataContainer();
......@@ -2651,12 +2617,9 @@ public class ResultSetViewer extends Viewer
UIUtils.showMessageBox(viewerPanel.getShell(), "Data read", "Data read is in progress - can't run another", SWT.ICON_WARNING);
return false;
}
// Cancel any auto-refresh activities
final AutoRefreshJob refreshJob = this.autoRefreshJob;
if (refreshJob != null) {
refreshJob.cancel();
this.autoRefreshJob = null;
}
// Cancel any refresh jobs
autoRefreshControl.cancelRefresh();
// Read data
final DBDDataFilter useDataFilter = dataFilter != null ? dataFilter :
(dataContainer == getDataContainer() ? model.getDataFilter() : null);
......@@ -2741,7 +2704,7 @@ public class ResultSetViewer extends Viewer
fireResultSetLoad();
}
// auto-refresh
scheduleAutoRefresh(error != null);
autoRefreshControl.scheduleAutoRefresh(error != null);
} finally {
if (finalizer != null) {
try {
......@@ -3455,7 +3418,6 @@ public class ResultSetViewer extends Viewer
}
private class FilterByValueAction extends Action {
private final DBCLogicalOperator operator;
private final FilterByAttributeType type;
......@@ -3815,32 +3777,7 @@ public class ResultSetViewer extends Viewer
boolean panelsVisible;
}
static class RefreshSettings {
int refreshInterval = 0;
boolean stopOnError = true;
RefreshSettings() {
}
RefreshSettings(RefreshSettings src) {
this.refreshInterval = src.refreshInterval;
this.stopOnError = src.stopOnError;
}
private void loadSettings() {
IDialogSettings viewerSettings = ResultSetUtils.getViewerSettings(SETTINGS_SECTION_REFRESH);
if (viewerSettings.get("interval") != null) refreshInterval = viewerSettings.getInt("interval");
if (viewerSettings.get("stopOnError") != null) stopOnError = viewerSettings.getBoolean("stopOnError");
}
private void saveSettings() {
IDialogSettings viewerSettings = ResultSetUtils.getViewerSettings(SETTINGS_SECTION_REFRESH);
viewerSettings.put("interval", refreshInterval);
viewerSettings.put("stopOnError", stopOnError);
}
}
/*
/*
public static void openNewDataEditor(DBNDatabaseNode targetNode, DBDDataFilter newFilter) {
IEditorPart entityEditor = NavigatorHandlerObjectOpen.openEntityEditor(
targetNode,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册