提交 d53fd9c3 编写于 作者: S Serge Rider

#4121 Tabbed driver viewer. Get rid of nebula gallery.

上级 536c8478
......@@ -39,7 +39,6 @@
<plugin id="com.github.jsqlparser" download-size="0" install-size="0" version="0.0.0" unpack="false"/>
<plugin id="org.apache.commons.jexl" download-size="0" install-size="0" version="0.0.0" unpack="false"/>
<plugin id="net.sf.opencsv" download-size="0" install-size="0" version="0.0.0" unpack="false"/>
<plugin id="org.eclipse.nebula.widgets.gallery" download-size="0" install-size="0" version="0.0.0" unpack="false"/>
<plugin id="org.jkiss.dbeaver.model" download-size="0" install-size="0" version="0.0.0" unpack="false"/>
<plugin id="org.jkiss.dbeaver.core" download-size="0" install-size="0" version="0.0.0" unpack="false"/>
......
......@@ -66,7 +66,6 @@ Require-Bundle: org.eclipse.core.runtime,
org.eclipse.e4.ui.services,
org.eclipse.e4.ui.workbench.swt,
org.eclipse.e4.ui.workbench.renderers.swt,
org.eclipse.nebula.widgets.gallery,
org.jkiss.dbeaver.model;visibility:=reexport,
org.jkiss.dbeaver.ui;visibility:=reexport,
org.jkiss.dbeaver.ui.editors.base;visibility:=reexport,
......
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 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.driver;
import org.eclipse.nebula.widgets.gallery.AbstractGalleryItemRenderer;
import org.eclipse.nebula.widgets.gallery.Gallery;
import org.eclipse.nebula.widgets.gallery.GalleryItem;
import org.eclipse.nebula.widgets.gallery.RendererHelper;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.utils.CommonUtils;
/**
* DriverGalleryItemRenderer
*/
public class DriverGalleryItemRenderer extends AbstractGalleryItemRenderer {
public static final int IMAGE_DRAW_WIDTH = 50;
public static final int ITEM_MARGIN = 5;
private Color selectionForegroundColor;
private Color selectionBackgroundColor;
private Color foregroundColor, backgroundColor;
private boolean showRoundedSelectionCorners = true;
private int selectionRadius = 10;
// Vars used during drawing (optimization)
private boolean drawBackground = false;
private Color drawBackgroundColor = null;
private Color drawForegroundColor = null;
private Font normalFont, boldFont;
public DriverGalleryItemRenderer(Composite panel) {
// Set defaults
foregroundColor = Display.getDefault().getSystemColor(SWT.COLOR_LIST_FOREGROUND);
backgroundColor = Display.getDefault().getSystemColor(SWT.COLOR_LIST_BACKGROUND);
selectionForegroundColor = Display.getDefault().getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT);
selectionBackgroundColor = Display.getDefault().getSystemColor(SWT.COLOR_LIST_SELECTION);
normalFont = panel.getFont();
boldFont = UIUtils.makeBoldFont(normalFont);
}
public void draw(GC gc, GalleryItem item, int index, int x, int y, int width, int height) {
final Image itemImage = item.getImage();
drawForegroundColor = getForeground(item);
// Set up the GC
gc.setFont(getFont(item));
// Create some room for the label.
int useableHeight = height;
String itemText = item.getText();
String itemDescription = item.getText(1);
String itemCategory = item.getText(2);
// Draw background (rounded rectangles)
// Checks if background has to be drawn
drawBackground = selected;
drawBackgroundColor = null;
if (!drawBackground && item.getBackground(true) != null) {
drawBackgroundColor = getBackground(item);
if (!RendererHelper.isColorsEquals(drawBackgroundColor,
gallery.getBackground())) {
drawBackground = true;
}
}
if (drawBackground) {
// Set colors
if (selected) {
gc.setBackground(selectionBackgroundColor);
gc.setForeground(selectionBackgroundColor);
} else if (drawBackgroundColor != null) {
gc.setBackground(drawBackgroundColor);
}
// Draw
if (showRoundedSelectionCorners) {
gc.fillRoundRectangle(x, y, width, useableHeight, selectionRadius, selectionRadius);
} else {
gc.fillRectangle(x, y, width, height);
}
}
if (false) {
// Draw rectangle
gc.setForeground(drawForegroundColor);
gc.drawRoundRectangle(x + 1, y + 1, width - 2, useableHeight - 2, selectionRadius, selectionRadius);
}
// Draw image
if (itemImage != null) {
Rectangle itemImageBounds = itemImage.getBounds();
int imageWidth = itemImageBounds.width;
int imageHeight = itemImageBounds.height;
int imageDrawWidth = IMAGE_DRAW_WIDTH;
int imageDrawHeight = IMAGE_DRAW_WIDTH;
gc.drawImage(itemImage, 0, 0, imageWidth, imageHeight, x + ITEM_MARGIN, y + ITEM_MARGIN, imageDrawWidth, imageDrawHeight);
}
// Draw label
if (itemText != null && !EMPTY_STRING.equals(itemText)) {
// Set colors
if (selected) {
// Selected : use selection colors.
gc.setForeground(selectionForegroundColor);
gc.setBackground(selectionBackgroundColor);
} else {
// Not selected, use item values or defaults.
// Background
if (drawBackgroundColor != null) {
gc.setBackground(drawBackgroundColor);
} else {
gc.setBackground(backgroundColor);
}
// Foreground
if (drawForegroundColor != null) {
gc.setForeground(drawForegroundColor);
} else {
gc.setForeground(foregroundColor);
}
}
// Create label
String text = RendererHelper.createLabel(itemText, gc, width - IMAGE_DRAW_WIDTH - ITEM_MARGIN);
// Center text
//int textWidth = gc.textExtent(text).x;
//int textxShift = RendererHelper.getShift(width, textWidth);
// Draw
int textY = y + ITEM_MARGIN;
int textX = x + IMAGE_DRAW_WIDTH + ITEM_MARGIN * 2;
gc.setFont(boldFont);
gc.drawText(text, textX, textY, true);
gc.setFont(normalFont);
textY += gc.getFontMetrics().getHeight() + ITEM_MARGIN;
if (!CommonUtils.isEmpty(itemCategory)) {
gc.drawText(itemCategory, textX, textY, true);
}
textY += gc.getFontMetrics().getHeight();
if (!CommonUtils.isEmpty(itemDescription)) {
gc.drawText(itemDescription, textX, textY, true);
}
}
}
/**
* Returns the font used for drawing all item labels or <tt>null</tt> if
* system font is used.
*
* @return the font
* @see {@link Gallery#getFont()} for setting font for a specific
* GalleryItem.
*/
public Font getFont() {
if (gallery != null) {
return gallery.getFont();
}
return null;
}
/**
* Set the font for drawing all item labels or <tt>null</tt> to use system
* font.
*
* @param font the font to set
* @see {@link Gallery#setFont(Font)} for setting font for a specific
* GalleryItem.
*/
public void setFont(Font font) {
if (gallery != null) {
gallery.setFont(font);
}
}
public void dispose() {
if (boldFont != null) {
UIUtils.dispose(boldFont);
boldFont = null;
}
}
}
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 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.driver;
import org.eclipse.jface.viewers.*;
import org.eclipse.nebula.jface.galleryviewer.FlatTreeContentProvider;
import org.eclipse.nebula.jface.galleryviewer.GalleryTreeViewer;
import org.eclipse.nebula.widgets.gallery.DefaultGalleryGroupRenderer;
import org.eclipse.nebula.widgets.gallery.Gallery;
import org.eclipse.nebula.widgets.gallery.GalleryItem;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.jkiss.dbeaver.model.DBIcon;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.DBPNamedObject;
import org.jkiss.dbeaver.model.connection.DBPDriver;
import org.jkiss.dbeaver.registry.DataSourceProviderDescriptor;
import org.jkiss.dbeaver.registry.DataSourceRegistry;
import org.jkiss.dbeaver.registry.driver.DriverUtils;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.controls.ListContentProvider;
import org.jkiss.dbeaver.ui.editors.TextEditorUtils;
import org.jkiss.utils.CommonUtils;
import java.util.*;
/**
* DriverGalleryViewer
*
* @author Serge Rider
*/
public class DriverGalleryViewer extends GalleryTreeViewer {
public static final String GROUP_ALL = "all";
public static final String GROUP_RECENT = "recent";
//private final Gallery gallery;
private final List<DBPDriver> allDrivers = new ArrayList<>();;
public DriverGalleryViewer(Composite parent, Object site, List<DataSourceProviderDescriptor> providers, boolean expandRecent) {
super(new Gallery(parent, SWT.V_SCROLL | SWT.SINGLE | SWT.BORDER));
setContentProvider(new FlatTreeContentProvider(new ListContentProvider()));
gallery.setBackground(TextEditorUtils.getDefaultTextBackground());
gallery.setForeground(TextEditorUtils.getDefaultTextForeground());
gallery.setLayoutData(new GridData(GridData.FILL_BOTH));
gallery.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
if (site instanceof ISelectionChangedListener) {
((ISelectionChangedListener) site).selectionChanged(new SelectionChangedEvent(DriverGalleryViewer.this, getSelection()));
}
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
if (site instanceof IDoubleClickListener) {
((IDoubleClickListener) site).doubleClick(new DoubleClickEvent(DriverGalleryViewer.this, getSelection()));
}
}
});
gallery.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
GalleryItem[] items = gallery.getSelection();
if (items.length == 0) {
items = gallery.getItems();
}
if (items.length > 0) {
if (items[0].getItemCount() > 0) {
items[0] = items[0].getItem(0);
}
gallery.setSelection(new GalleryItem[]{ items[0] });
}
}
});
// Renderers
DefaultGalleryGroupRenderer groupRenderer = new DefaultGalleryGroupRenderer();
groupRenderer.setMaxImageHeight(16);
groupRenderer.setMaxImageWidth(16);
groupRenderer.setItemHeight(60);
groupRenderer.setItemWidth(200);
groupRenderer.setTitleBackground(gallery.getDisplay().getSystemColor(SWT.COLOR_TITLE_BACKGROUND));
gallery.setGroupRenderer(groupRenderer);
//gallery.setGroupRenderer(new NoGroupRenderer());
DriverGalleryItemRenderer ir = new DriverGalleryItemRenderer(parent);
gallery.setItemRenderer(ir);
for (DataSourceProviderDescriptor dpd : providers) {
allDrivers.addAll(dpd.getEnabledDrivers());
}
allDrivers.sort(Comparator.comparing(DBPNamedObject::getName));
createDriverGallery();
}
private void createDriverGallery() {
int oldItemCount = gallery.getItemCount();
gallery.removeAll();
GalleryItem groupRecent = new GalleryItem(gallery, SWT.NONE);
groupRecent.setText("Recent drivers"); //$NON-NLS-1$
groupRecent.setImage(DBeaverIcons.getImage(DBIcon.TREE_SCHEMA));
groupRecent.setData(GROUP_RECENT);
groupRecent.setExpanded(true);
GalleryItem groupAll = new GalleryItem(gallery, SWT.NONE);
groupAll.setText("All drivers"); //$NON-NLS-1$
groupAll.setImage(DBeaverIcons.getImage(DBIcon.TREE_DATABASE));
groupAll.setData(GROUP_ALL);
groupAll.setExpanded(true);
fillDriverGroup(groupRecent);
if (groupRecent.getItemCount() == 0) {
groupRecent.dispose();
}
fillDriverGroup(groupAll);
if (oldItemCount == 0) {
gallery.setFocus();
gallery.setSelection(new GalleryItem[]{gallery.getItem(0)});
}
}
private void fillDriverGroup(GalleryItem group) {
List<DBPDataSourceContainer> allDataSources = DataSourceRegistry.getAllDataSources();
ViewerFilter[] filters = getFilters();
List<DBPDriver> drivers;
if (GROUP_ALL.equals(group.getData())) {
drivers = this.allDrivers;
} else if (GROUP_RECENT.equals(group.getData())) {
drivers = DriverUtils.getRecentDrivers(allDrivers, 6);
} else {
drivers = Collections.emptyList();
}
for (DBPDriver driver : drivers) {
boolean isVisible = true;
for (ViewerFilter filter : filters) {
if (!filter.select(this, null, driver)) {
isVisible = false;
break;
}
}
if (!isVisible) {
continue;
}
GalleryItem item = new GalleryItem(group, SWT.NONE);
item.setImage(DBeaverIcons.getImage(driver.getIconBig()));
item.setText(driver.getName()); //$NON-NLS-1$
item.setText(0, driver.getName()); //$NON-NLS-1$
List<DBPDataSourceContainer> usedBy = DriverUtils.getUsedBy(driver, allDataSources);
if (!usedBy.isEmpty()) {
item.setText(1, "Connections: " + usedBy.size());
}
if (!CommonUtils.isEmpty(driver.getCategory())) {
item.setText(2, driver.getCategory());
}
item.setData(driver);
}
}
public Control getControl() {
return getGallery();
}
@Override
public Object getInput() {
return allDrivers;
}
public Gallery getGallery() {
return gallery;
}
public void addTraverseListener(TraverseListener traverseListener) {
if (traverseListener != null) {
gallery.addTraverseListener(traverseListener);
}
}
/*
@Override
public ISelection getSelection() {
GalleryItem[] itemSelection = gallery.getSelection();
Object[] selectedDrivers = new Object[itemSelection.length];
for (int i = 0; i < itemSelection.length; i++) {
selectedDrivers[i] = itemSelection[i].getData();
}
return new StructuredSelection(selectedDrivers);
}
*/
@Override
public void refresh(boolean updateLabels) {
createDriverGallery();
}
}
......@@ -16,27 +16,48 @@
*/
package org.jkiss.dbeaver.ui.dialogs.driver;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBIcon;
import org.jkiss.dbeaver.model.connection.DBPDriver;
import org.jkiss.dbeaver.registry.driver.DriverUtils;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.controls.finder.viewer.AdvancedListViewer;
import org.jkiss.dbeaver.ui.controls.folders.ITabbedFolder;
import org.jkiss.dbeaver.ui.controls.folders.TabbedFolderComposite;
import org.jkiss.dbeaver.ui.controls.folders.TabbedFolderInfo;
import java.util.List;
/**
* DriverTabbedList
*/
public class DriverTabbedList extends Composite {
private static final Log log = Log.getLog(DriverTabbedList.class);
// Tabs:
// - Recent
// - Cloud
// - Embedded
// - All
public DriverTabbedList(Composite parent, int style) {
super(parent, style);
List<DBPDriver> allDrivers = DriverUtils.getAllDrivers();
allDrivers.sort((o1, o2) -> { return o1.getName().compareToIgnoreCase(o2.getName()); });
List<DBPDriver> recentDrivers = DriverUtils.getRecentDrivers(allDrivers, 6);
TabbedFolderComposite folderComposite = new TabbedFolderComposite(this, SWT.NONE);
TabbedFolderInfo[] folders = new TabbedFolderInfo[] {
new TabbedFolderInfo("recent", "Recent", DBIcon.TREE_DATABASE, "Recent drivers", false, new DriverListFolder(recentDrivers)),
new TabbedFolderInfo("all", "All", DBIcon.TREE_DATABASE, "All drivers", false, new DriverListFolder(allDrivers))
};
folderComposite.setFolders(getClass().getSimpleName(), folders);
}
......@@ -44,14 +65,37 @@ public class DriverTabbedList extends Composite {
private static class DriverListFolder implements ITabbedFolder {
private AdvancedListViewer viewer;
private List<DBPDriver> drivers;
private boolean activated;
DriverListFolder(List<DBPDriver> drivers) {
this.drivers = drivers;
}
@Override
public void createControl(Composite parent) {
viewer = new AdvancedListViewer(parent, SWT.NONE);
viewer.setContentProvider((IStructuredContentProvider) inputElement -> drivers.toArray());
viewer.setLabelProvider(new LabelProvider() {
@Override
public Image getImage(Object element) {
return DBeaverIcons.getImage(((DBPDriver)element).getIconBig());
}
@Override
public String getText(Object element) {
return ((DBPDriver)element).getName();
}
});
}
@Override
public void aboutToBeShown() {
if (!activated) {
viewer.setInput(drivers);
activated = true;
}
}
@Override
......
......@@ -107,7 +107,7 @@ public class AdvancedListViewer extends StructuredViewer {
@Override
public void reveal(Object element) {
//control.showControl();
}
@Override
......@@ -120,4 +120,5 @@ public class AdvancedListViewer extends StructuredViewer {
super.inputChanged(input, oldInput);
internalRefresh(getInput());
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册