/* * 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.lightgrid; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.*; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.ui.DBeaverIcons; import org.jkiss.dbeaver.ui.TextUtils; import org.jkiss.dbeaver.ui.UIIcon; import org.jkiss.utils.CommonUtils; /** * Grid column renderer */ class GridColumnRenderer extends AbstractRenderer { public static final int LEFT_MARGIN = 6; public static final int RIGHT_MARGIN = 6; public static final int BOTTOM_MARGIN = 3; public static final int TOP_MARGIN = 3; public static final int ARROW_MARGIN = 6; public static final int IMAGE_SPACING = 3; public static final Image IMAGE_ASTERISK = DBeaverIcons.getImage(UIIcon.SORT_UNKNOWN); public static final Image IMAGE_DESC = DBeaverIcons.getImage(UIIcon.SORT_DECREASE); public static final Image IMAGE_ASC = DBeaverIcons.getImage(UIIcon.SORT_INCREASE); public static final int SORT_WIDTH = 16; public GridColumnRenderer(LightGrid grid) { super(grid); } public static Rectangle getSortControlBounds() { return IMAGE_DESC.getBounds(); } @Nullable protected Image getColumnImage(Object element) { return grid.getLabelProvider().getImage(element); } protected String getColumnText(Object element) { return grid.getLabelProvider().getText(element); } protected String getColumnDescription(Object element) { return grid.getLabelProvider().getDescription(element); } protected Font getColumnFont(Object element) { Font font = grid.getLabelProvider().getFont(element); return font != null ? font : grid.normalFont; } public void paint(GC gc, Rectangle bounds, boolean selected, boolean hovering, Object element) { //GridColumn col = grid.getColumnByElement(cell.col); //AbstractRenderer arrowRenderer = col.getSortRenderer(); int sortOrder = grid.getContentProvider().getSortOrder(element); Rectangle sortBounds = getSortControlBounds(); // set the font to be used to display the text. gc.setFont(getColumnFont(element)); boolean flat = true; boolean drawSelected = false; if (flat && (selected || hovering)) { gc.setBackground(grid.getCellHeaderSelectionBackground()); //gc.setForeground(grid.getCellHeaderSelectionForeground()); } else { gc.setBackground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND)); //gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND)); } gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_LIST_FOREGROUND)); gc.fillRectangle(bounds.x, bounds.y, bounds.width, bounds.height); int pushedDrawingOffset = 0; if (drawSelected) { pushedDrawingOffset = 1; } int x = LEFT_MARGIN; Image columnImage = getColumnImage(element); if (columnImage != null) { int y = bounds.y + pushedDrawingOffset + TOP_MARGIN; gc.drawImage(columnImage, bounds.x + x + pushedDrawingOffset, y); x += columnImage.getBounds().width + IMAGE_SPACING; } int width = bounds.width - x; if (sortOrder == SWT.NONE) { width -= RIGHT_MARGIN; } else { width -= ARROW_MARGIN + sortBounds.width + ARROW_MARGIN; } //gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_FOREGROUND)); int y = bounds.y + TOP_MARGIN; { // Column name String text = getColumnText(element); text = TextUtils.getShortString(grid.fontMetrics, text, width); gc.setFont(grid.normalFont); gc.drawString(text, bounds.x + x + pushedDrawingOffset, y + pushedDrawingOffset, true); } if (sortOrder != SWT.NONE) { if (drawSelected) { sortBounds.x = bounds.x + bounds.width - ARROW_MARGIN - sortBounds.width + 1; sortBounds.y = y; } else { sortBounds.x = bounds.x + bounds.width - ARROW_MARGIN - sortBounds.width; sortBounds.y = y; } paintSort(gc, sortBounds, sortOrder); } { // Draw column description String text = getColumnDescription(element); if (!CommonUtils.isEmpty(text)) { y += TOP_MARGIN + grid.fontMetrics.getHeight(); text = TextUtils.getShortString(grid.fontMetrics, text, width); gc.setFont(grid.normalFont); gc.drawString(text, bounds.x + x + pushedDrawingOffset, y + pushedDrawingOffset, true); } } // Draw border if (!flat) { if (drawSelected) { gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW)); } else { gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW)); } gc.drawLine(bounds.x, bounds.y, bounds.x + bounds.width - 1, bounds.y); gc.drawLine(bounds.x, bounds.y, bounds.x, bounds.y + bounds.height - 1); if (!drawSelected) { gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW)); gc.drawLine(bounds.x + 1, bounds.y + 1, bounds.x + bounds.width - 2, bounds.y + 1); gc.drawLine(bounds.x + 1, bounds.y + 1, bounds.x + 1, bounds.y + bounds.height - 2); } if (drawSelected) { gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW)); } else { gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW)); } gc.drawLine(bounds.x + bounds.width - 1, bounds.y, bounds.x + bounds.width - 1, bounds.y + bounds.height - 1); gc.drawLine(bounds.x, bounds.y + bounds.height - 1, bounds.x + bounds.width - 1, bounds.y + bounds.height - 1); if (!drawSelected) { gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW)); gc.drawLine(bounds.x + bounds.width - 2, bounds.y + 1, bounds.x + bounds.width - 2, bounds.y + bounds.height - 2); gc.drawLine(bounds.x + 1, bounds.y + bounds.height - 2, bounds.x + bounds.width - 2, bounds.y + bounds.height - 2); } } else { gc.setForeground(getDisplay().getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW)); gc.drawLine(bounds.x + bounds.width - 1, bounds.y, bounds.x + bounds.width - 1, bounds.y + bounds.height - 1); gc.drawLine(bounds.x, bounds.y + bounds.height - 1, bounds.x + bounds.width - 1, bounds.y + bounds.height - 1); } gc.setFont(grid.normalFont); } public static void paintSort(GC gc, Rectangle bounds, int sort) { switch (sort) { case SWT.DEFAULT: gc.drawImage(IMAGE_ASTERISK, bounds.x, bounds.y); break; case SWT.UP: gc.drawImage(IMAGE_ASC, bounds.x, bounds.y); break; case SWT.DOWN: gc.drawImage(IMAGE_DESC, bounds.x, bounds.y); break; } /* if (isSelected()) { gc.drawLine(bounds.x, bounds.y, bounds.x + 6, bounds.y); gc.drawLine(bounds.x + 1, bounds.y + 1, bounds.x + 5, bounds.y + 1); gc.drawLine(bounds.x + 2, bounds.y + 2, bounds.x + 4, bounds.y + 2); gc.drawPoint(bounds.x + 3, bounds.y + 3); } else { gc.drawPoint(bounds.x + 3, bounds.y); gc.drawLine(bounds.x + 2, bounds.y + 1, bounds.x + 4, bounds.y + 1); gc.drawLine(bounds.x + 1, bounds.y + 2, bounds.x + 5, bounds.y + 2); gc.drawLine(bounds.x, bounds.y + 3, bounds.x + 6, bounds.y + 3); } */ } }