| /********************************************************************** |
| * Copyright (c) 2005, 2014 IBM Corporation, Ericsson |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM - Initial API and implementation |
| * Bernd Hufmann - Updated for TMF |
| **********************************************************************/ |
| |
| package org.eclipse.tracecompass.tmf.ui.views.uml2sd; |
| |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.graphics.Color; |
| import org.eclipse.swt.graphics.Font; |
| import org.eclipse.swt.graphics.FontData; |
| 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.widgets.Display; |
| import org.eclipse.tracecompass.tmf.ui.views.uml2sd.drawings.IColor; |
| import org.eclipse.tracecompass.tmf.ui.views.uml2sd.drawings.IFont; |
| import org.eclipse.tracecompass.tmf.ui.views.uml2sd.drawings.IGC; |
| import org.eclipse.tracecompass.tmf.ui.views.uml2sd.drawings.IImage; |
| import org.eclipse.tracecompass.tmf.ui.views.uml2sd.drawings.impl.ColorImpl; |
| import org.eclipse.tracecompass.tmf.ui.views.uml2sd.preferences.SDViewPref; |
| |
| /** |
| * <p> |
| * This class implements the graphical context for the sequence diagram widgets. |
| * </p> |
| * |
| * @version 1.0 |
| * @author sveyrier |
| */ |
| public class NGC implements IGC { |
| |
| // ------------------------------------------------------------------------ |
| // Attributes |
| // ------------------------------------------------------------------------ |
| |
| /** |
| * The graphical context. |
| */ |
| private GC fContext; |
| /** |
| * The reference to the sequence diagram view. |
| */ |
| private SDWidget fView; |
| /** |
| * A reference to the last used font. |
| */ |
| private Font fTempFont = null; |
| /** |
| * The color of the gradient. |
| */ |
| private IColor fGradientColor = null; |
| /** |
| * The color of the background. |
| */ |
| private IColor fBackground = null; |
| /** |
| * The color of the foreground. |
| */ |
| private IColor fForeground = null; |
| /** |
| * The current visible y screen bounds |
| */ |
| private int fVisibleY; |
| /** |
| * The current visible x screen bound. |
| */ |
| private int fVisibleX; |
| /** |
| * The current yx value (view visible height - visible screen bounds) |
| */ |
| private int yx; |
| /** |
| * The current xx value (view visible width - visible screen bounds) |
| */ |
| private int xx; |
| /** |
| * <code>true</code> to draw with focus else <code>false</code>. |
| */ |
| private boolean fDrawWithFocus = false; |
| |
| /** |
| * The static visible screen bounds. |
| */ |
| private static int fVisibleScreenBounds = 0; |
| |
| |
| // ------------------------------------------------------------------------ |
| // Constructors |
| // ------------------------------------------------------------------------ |
| |
| /** |
| * Default constructor. |
| * |
| * @param scrollView A sequence diagram view reference. |
| * @param gc A graphical context. |
| */ |
| public NGC(SDWidget scrollView, GC gc) { |
| fContext = gc; |
| fView = scrollView; |
| } |
| |
| // ------------------------------------------------------------------------ |
| // Methods |
| // ------------------------------------------------------------------------ |
| |
| @Override |
| public void setLineStyle(int style) { |
| fContext.setLineStyle(style); |
| } |
| |
| @Override |
| public int getLineStyle() { |
| return fContext.getLineStyle(); |
| } |
| |
| @Override |
| public int getContentsX() { |
| return Math.round(fView.getContentsX() / fView.getZoomValue()); |
| } |
| |
| @Override |
| public int getContentsY() { |
| return Math.round(fView.getContentsY() / fView.getZoomValue()); |
| } |
| |
| @Override |
| public int getVisibleWidth() { |
| return Math.round(fView.getVisibleWidth() / fView.getZoomValue()); |
| } |
| |
| @Override |
| public int getVisibleHeight() { |
| return Math.round(fView.getVisibleHeight() / fView.getZoomValue()); |
| } |
| |
| /** |
| * Returns the current visible y screen bounds. |
| * |
| * @return the current visible y screen bounds |
| */ |
| protected int getVisibleY() { |
| return fVisibleY; |
| } |
| |
| /** |
| * Sets the current visible y screen bounds. |
| * |
| * @param visibleY |
| * the current visible y screen bounds |
| */ |
| protected void setVisibleY(int visibleY) { |
| fVisibleY = visibleY; |
| } |
| |
| /** |
| * Returns the current visible x screen bound. |
| * |
| * @return the current visible x screen bound. |
| */ |
| protected int getfVisibleX() { |
| return fVisibleX; |
| } |
| |
| /** |
| * Sets the current visible x screen bound. |
| * |
| * @param visibleX |
| * the current visible x screen bound. |
| */ |
| protected void setVisibleX(int visibleX) { |
| fVisibleX = visibleX; |
| } |
| |
| /** |
| * Returns current yx value (view visible height - visible screen bounds). |
| * |
| * @return current yx value |
| */ |
| protected int getYx() { |
| return yx; |
| } |
| |
| /** |
| * Sets current yx value (view visible height - visible screen bounds). |
| * |
| * @param yx |
| * current yx value |
| */ |
| protected void setYx(int yx) { |
| this.yx = yx; |
| } |
| |
| /** |
| * Returns the current xx value (view visible width - visible screen bounds) |
| * |
| * @return the current xx value |
| */ |
| protected int getXx() { |
| return xx; |
| } |
| |
| /** |
| * Sets the current xx value (view visible width - visible screen bounds) |
| * |
| * @param xx |
| * the current xx value |
| */ |
| protected void setXx(int xx) { |
| this.xx = xx; |
| } |
| |
| @Override |
| public int contentsToViewX(int x) { |
| return fView.contentsToViewX(x); |
| } |
| |
| @Override |
| public int contentsToViewY(int y) { |
| return fView.contentsToViewY(y); |
| } |
| |
| /** |
| * Get code for drawings at given x and y position. |
| * |
| * @param x The x position |
| * @param y The y position. |
| * @return A code for top, bottom, right and left |
| */ |
| protected byte code(int x, int y) { |
| byte c = 0; |
| fVisibleY = fVisibleScreenBounds; |
| fVisibleX = fVisibleScreenBounds; |
| yx = fView.getVisibleHeight() + fVisibleScreenBounds; |
| xx = fView.getVisibleWidth() + fVisibleScreenBounds; |
| if (y > yx) { |
| c |= 0x01; // top |
| } else if (y < fVisibleY) { |
| c |= 0x02; // bottom |
| } |
| |
| if (x > xx) { |
| c |= 0x04; // right |
| } else if (x < fVisibleX) { |
| c |= 0x08; // left |
| } |
| return c; |
| } |
| |
| @Override |
| public void drawLine(int x1, int y1, int x2, int y2) { |
| int localX1 = x1; |
| int localY1 = y1; |
| int localX2 = x2; |
| int localY2 = y2; |
| |
| localX1 = Math.round(localX1 * fView.getZoomValue()); |
| localY1 = Math.round(localY1 * fView.getZoomValue()); |
| localX2 = Math.round(localX2 * fView.getZoomValue()); |
| localY2 = Math.round(localY2 * fView.getZoomValue()); |
| localX1 = fView.contentsToViewX(localX1); |
| localY1 = fView.contentsToViewY(localY1); |
| localX2 = fView.contentsToViewX(localX2); |
| localY2 = fView.contentsToViewY(localY2); |
| |
| byte code1 = code(localX1, localY1); |
| byte code2 = code(localX2, localY2); |
| byte codex; |
| boolean draw = false; |
| boolean end = false; |
| int x = 0, y = 0; |
| |
| do { |
| if (code1 == 0 && code2 == 0) { |
| draw = true; |
| end = true; |
| } else if ((code1 & code2) != 0) { |
| end = true; |
| } else { |
| codex = (code1 != 0) ? code1 : code2; |
| if ((codex & 0x01) != 0) { // top |
| x = localX1 + ((localX2 - localX1) * (yx - localY1)) / (localY2 - localY1); |
| y = yx; |
| } else if ((codex & 0x02) != 0) { // bottom |
| x = localX1 + ((localX2 - localX1) * (fVisibleY - localY1)) / (localY2 - localY1); |
| y = fVisibleY; |
| } else if ((codex & 0x04) != 0) { // right |
| y = localY1 + ((localY2 - localY1) * (xx - localX1)) / (localX2 - localX1); |
| x = xx; |
| } else if ((codex & 0x08) != 0) { // left |
| y = localY1 + ((localY2 - localY1) * (fVisibleX - localX1)) / (localX2 - localX1); |
| x = fVisibleX; |
| } |
| |
| if (codex == code1) { |
| localX1 = x; |
| localY1 = y; |
| code1 = code(localX1, localY1); |
| } else { |
| localX2 = x; |
| localY2 = y; |
| code2 = code(localX2, localY2); |
| } |
| } |
| } while (!end); |
| |
| if (draw) { |
| fContext.drawLine(localX1, localY1, localX2, localY2); |
| } |
| } |
| |
| @Override |
| public void drawRectangle(int x, int y, int width, int height) { |
| int localX = x; |
| int localY = y; |
| int localWidth = width; |
| int localHeight = height; |
| |
| localX = Math.round(localX * fView.getZoomValue()); |
| // Workaround to avoid problems for some special cases (not very nice) |
| if (localY != getContentsY()) { |
| localY = Math.round(localY * fView.getZoomValue()); |
| localY = fView.contentsToViewY(localY); |
| } else { |
| localY = 0; |
| } |
| localWidth = Math.round(localWidth * fView.getZoomValue()); |
| localHeight = Math.round(localHeight * fView.getZoomValue()); |
| localX = fView.contentsToViewX(localX); |
| |
| if (localX < -fVisibleScreenBounds) { |
| localWidth = localWidth + localX + fVisibleScreenBounds; |
| localX = -fVisibleScreenBounds; |
| } |
| if (localY < -fVisibleScreenBounds) { |
| localHeight = localHeight + localY + fVisibleScreenBounds; |
| localY = -fVisibleScreenBounds; |
| } |
| if ((localWidth < -fVisibleScreenBounds) && (localX + localWidth < -fVisibleScreenBounds)) { |
| localWidth = -fVisibleScreenBounds; |
| } else if (localWidth + localX > fView.getVisibleWidth() + fVisibleScreenBounds) { |
| localWidth = fView.getVisibleWidth() + fVisibleScreenBounds - localX; |
| } |
| if ((localHeight < -fVisibleScreenBounds) && (localY + localHeight < -fVisibleScreenBounds)) { |
| localHeight = -fVisibleScreenBounds; |
| } else if (localHeight + localY > fView.getVisibleHeight() + fVisibleScreenBounds) { |
| localHeight = fView.getVisibleHeight() + fVisibleScreenBounds - localY; |
| } |
| fContext.drawRectangle(localX, localY, localWidth, localHeight); |
| } |
| |
| @Override |
| public void drawFocus(int x, int y, int width, int height) { |
| int localX = x; |
| int localY = y; |
| int localWidth = width; |
| int localHeight = height; |
| |
| IColor bC = getBackground(); |
| IColor fC = getForeground(); |
| |
| if (localWidth < 0) { |
| localX = localX + localWidth; |
| localWidth = -localWidth; |
| } |
| |
| if (localHeight < 0) { |
| localY = localY + localHeight; |
| localHeight = -localHeight; |
| } |
| |
| localX = Math.round(localX * fView.getZoomValue()); |
| localY = Math.round(localY * fView.getZoomValue()); |
| localWidth = Math.round(localWidth * fView.getZoomValue()); |
| localHeight = Math.round(localHeight * fView.getZoomValue()); |
| |
| setForeground(SDViewPref.getInstance().getForeGroundColorSelection()); |
| setBackground(SDViewPref.getInstance().getBackGroundColorSelection()); |
| |
| fContext.drawFocus(fView.contentsToViewX(localX - 1), fView.contentsToViewY(localY - 1), localWidth + 3, localHeight + 3); |
| |
| setBackground(bC); |
| setForeground(fC); |
| } |
| |
| @Override |
| public void fillPolygon(int[] points) { |
| int len = (points.length / 2) * 2; |
| int[] localPoint = new int[len]; |
| for (int i = 0; i < len; i++) { |
| localPoint[i] = fView.contentsToViewX(Math.round(points[i] * fView.getZoomValue())); |
| i++; |
| localPoint[i] = fView.contentsToViewY(Math.round(points[i] * fView.getZoomValue())); |
| } |
| |
| if (validatePolygonHeight(localPoint) <= 0) { |
| return; |
| } |
| |
| fContext.fillPolygon(localPoint); |
| } |
| |
| @Override |
| public void drawPolygon(int[] points) { |
| int len = (points.length / 2) * 2; |
| int[] localPoint = new int[len]; |
| for (int i = 0; i < len; i++) { |
| localPoint[i] = fView.contentsToViewX(Math.round(points[i] * fView.getZoomValue())); |
| i++; |
| localPoint[i] = fView.contentsToViewY(Math.round(points[i] * fView.getZoomValue())); |
| } |
| |
| if (validatePolygonHeight(localPoint) <= 0) { |
| return; |
| } |
| |
| fContext.drawPolygon(localPoint); |
| } |
| |
| @Override |
| public void fillRectangle(int x, int y, int width, int height) { |
| int localX = x; |
| int localY = y; |
| int localWidth = width; |
| int localHeight = height; |
| |
| localX = Math.round(localX * fView.getZoomValue()); |
| // Workaround to avoid problems for some special cases (not very nice) |
| if (localY != getContentsY()) { |
| localY = Math.round(localY * fView.getZoomValue()); |
| localY = fView.contentsToViewY(localY) + 1; |
| } else { |
| localY = 1; |
| } |
| localWidth = Math.round(localWidth * fView.getZoomValue()) - 1; |
| localHeight = Math.round(localHeight * fView.getZoomValue()) - 1; |
| localX = fView.contentsToViewX(localX) + 1; |
| if (localX < -fVisibleScreenBounds) { |
| localWidth = localWidth + localX + fVisibleScreenBounds; |
| localX = -fVisibleScreenBounds; |
| } |
| if (localY < -fVisibleScreenBounds) { |
| localHeight = localHeight + localY + fVisibleScreenBounds; |
| localY = -fVisibleScreenBounds; |
| } |
| if ((localWidth < -fVisibleScreenBounds) && (localX + localWidth < -fVisibleScreenBounds)) { |
| localWidth = -fVisibleScreenBounds; |
| } else if (localWidth + localX > fView.getVisibleWidth() + fVisibleScreenBounds) { |
| localWidth = fView.getVisibleWidth() + fVisibleScreenBounds - localX; |
| } |
| if ((localHeight < -fVisibleScreenBounds) && (localY + localHeight < -fVisibleScreenBounds)) { |
| localHeight = -fVisibleScreenBounds; |
| } else if (localHeight + localY > fView.getVisibleHeight() + fVisibleScreenBounds) { |
| localHeight = fView.getVisibleHeight() + fVisibleScreenBounds - localY; |
| } |
| fContext.fillRectangle(localX, localY, localWidth, localHeight); |
| } |
| |
| @Override |
| public void fillGradientRectangle(int x, int y, int width, int height, boolean isVertical) { |
| int localX = x; |
| int localY = y; |
| int localWidth = width; |
| int localHeight = height; |
| |
| localX = Math.round(localX * fView.getZoomValue()); |
| localY = Math.round(localY * fView.getZoomValue()); |
| localWidth = Math.round(localWidth * fView.getZoomValue()); |
| localHeight = Math.round(localHeight * fView.getZoomValue()); |
| IColor tempColor = fForeground; |
| setForeground(fGradientColor); |
| localX = fView.contentsToViewX(localX); |
| localY = fView.contentsToViewY(localY); |
| |
| if (localX < -fVisibleScreenBounds) { |
| localWidth = localWidth + localX + fVisibleScreenBounds; |
| localX = -fVisibleScreenBounds; |
| } |
| if (localY < -fVisibleScreenBounds) { |
| localHeight = localHeight + localY + fVisibleScreenBounds; |
| localY = -fVisibleScreenBounds; |
| } |
| |
| if ((localWidth < -fVisibleScreenBounds) && (localX + localWidth < -fVisibleScreenBounds)) { |
| localWidth = -fVisibleScreenBounds; |
| } else if (localWidth + localX > fView.getVisibleWidth() + fVisibleScreenBounds) { |
| localWidth = fView.getVisibleWidth() + fVisibleScreenBounds - localX; |
| } |
| if ((localHeight < -fVisibleScreenBounds) && (localY + localHeight < -fVisibleScreenBounds)) { |
| localHeight = -fVisibleScreenBounds; |
| } else if (localHeight + localY > fView.getVisibleHeight() + fVisibleScreenBounds) { |
| localHeight = fView.getVisibleHeight() + fVisibleScreenBounds - localY; |
| } |
| if (isVertical) { |
| fContext.fillGradientRectangle(localX, localY, localWidth, localHeight, isVertical); |
| } |
| else { |
| fContext.fillGradientRectangle(localX + localWidth, localY, -localWidth, localHeight + 1, isVertical); |
| } |
| setForeground(tempColor); |
| } |
| |
| @Override |
| public int textExtent(String name) { |
| return fContext.textExtent(name).x; |
| } |
| |
| @Override |
| public void drawText(String string, int x, int y, boolean isTrans) { |
| int localX = x; |
| int localY = y; |
| |
| localX = Math.round(localX * fView.getZoomValue()); |
| localY = Math.round(localY * fView.getZoomValue()); |
| fContext.drawText(string, fView.contentsToViewX(localX), fView.contentsToViewY(localY), isTrans); |
| if (fDrawWithFocus) { |
| Point r = fContext.textExtent(string); |
| fContext.drawFocus(localX - 1, localY - 1, r.x + 2, r.y + 2); |
| } |
| } |
| |
| @Override |
| public void drawText(String string, int x, int y) { |
| int localX = x; |
| int localY = y; |
| |
| localX = Math.round(localX * fView.getZoomValue()); |
| localY = Math.round(localY * fView.getZoomValue()); |
| fContext.drawText(string, fView.contentsToViewX(localX), fView.contentsToViewY(localY), true); |
| if (fDrawWithFocus) { |
| Point r = fContext.textExtent(string); |
| fContext.drawFocus(localX - 1, localY - 1, r.x + 2, r.y + 2); |
| } |
| } |
| |
| @Override |
| public void fillOval(int x, int y, int width, int height) { |
| int localX = x; |
| int localY = y; |
| int localWidth = width; |
| int localHeight = height; |
| |
| localX = Math.round(localX * fView.getZoomValue()); |
| localY = Math.round(localY * fView.getZoomValue()); |
| localWidth = Math.round(localWidth * fView.getZoomValue()); |
| localHeight = Math.round(localHeight * fView.getZoomValue()); |
| fContext.fillOval(fView.contentsToViewX(localX), fView.contentsToViewY(localY), localWidth, localHeight); |
| } |
| |
| @Override |
| public IColor getBackground() { |
| if ((fBackground != null) && (fBackground.getColor() instanceof Color) && (!((Color) (fBackground.getColor())).isDisposed())) { |
| return fBackground; |
| } |
| return ColorImpl.getSystemColor(SWT.COLOR_WHITE); |
| } |
| |
| @Override |
| public IColor getForeground() { |
| if ((fForeground != null) && (fForeground.getColor() instanceof Color) && (!((Color) (fForeground.getColor())).isDisposed())) { |
| return fForeground; |
| } |
| return ColorImpl.getSystemColor(SWT.COLOR_WHITE); |
| } |
| |
| @Override |
| public void setBackground(IColor color) { |
| if (color == null) { |
| return; |
| } |
| if (color.getColor() instanceof Color) { |
| fContext.setBackground((Color) color.getColor()); |
| fBackground = color; |
| } |
| } |
| |
| @Override |
| public void setForeground(IColor color) { |
| if (color == null) { |
| return; |
| } |
| if (color.getColor() instanceof Color) { |
| Color c = (Color) color.getColor(); |
| if (!c.isDisposed()) { |
| fContext.setForeground(c); |
| fForeground = color; |
| } |
| } |
| } |
| |
| @Override |
| public void setGradientColor(IColor color) { |
| if (color == null) { |
| return; |
| } |
| if (color.getColor() instanceof Color) { |
| fGradientColor = color; |
| } |
| } |
| |
| @Override |
| public void setLineWidth(int width) { |
| if (fView.isPrinting()) { |
| fContext.setLineWidth(width * 2); |
| } |
| else { |
| fContext.setLineWidth(width); |
| } |
| } |
| |
| @Override |
| public int getLineWidth() { |
| return fContext.getLineWidth(); |
| } |
| |
| /** |
| * Method to draw a text in rectangle. (Linux GTK Workaround) |
| * |
| * @param string The text to draw. |
| * @param x The x position. |
| * @param y The y position. |
| * @param isTransparent true for transparent else false |
| */ |
| protected void localDrawText(String string, int x, int y, boolean isTransparent) { |
| Point r = fContext.textExtent(string); |
| if (!isTransparent) { |
| fContext.fillRectangle(x, y, r.x, r.y); |
| } |
| fContext.drawText(string, x, y, isTransparent); |
| if ((fDrawWithFocus) && (string.length() > 1)) { |
| fContext.drawFocus(x - 1, y - 1, r.x + 2, r.y + 2); |
| } |
| } |
| |
| @Override |
| public void drawTextTruncatedCentred(String name, int xValue, int yValue, int width, int height, boolean trans) { |
| int localX = xValue; |
| int localY = yValue; |
| int localWidth = width; |
| int localHeight = height; |
| |
| Point tx = fContext.textExtent(name); |
| localX = Math.round(localX * fView.getZoomValue()); |
| int y = 0; |
| // Workaround to avoid round problems for some special cases (not very nice) |
| if (localY != getContentsY()) { |
| localY = Math.round(localY * fView.getZoomValue()); |
| y = fView.contentsToViewY(localY); |
| } |
| localWidth = Math.round(localWidth * fView.getZoomValue()); |
| localHeight = Math.round(localHeight * fView.getZoomValue()); |
| int x = fView.contentsToViewX(localX); |
| if (tx.y > localHeight) { |
| return; |
| } |
| |
| // Adjust height and y |
| if (y < -fVisibleScreenBounds) { |
| localHeight = localHeight + y + fVisibleScreenBounds; |
| y = -fVisibleScreenBounds; |
| } |
| if ((localHeight < -fVisibleScreenBounds) && (y + localHeight < -fVisibleScreenBounds)) { |
| localHeight = -fVisibleScreenBounds; |
| } else if (localHeight + y > fView.getVisibleHeight() + fVisibleScreenBounds) { |
| localHeight = fView.getVisibleHeight() + fVisibleScreenBounds - y; |
| } |
| |
| if (tx.x <= localWidth) { |
| localDrawText(name, x + 1 + (localWidth - tx.x) / 2, y + 1 + (localHeight - tx.y) / 2, trans); |
| } else { |
| String nameToDisplay = name; |
| for (int i = name.length() - 1; i >= 0 && fContext.textExtent(nameToDisplay).x >= localWidth; i--) { |
| nameToDisplay = name.substring(0, i); |
| } |
| int dotCount = 0; |
| for (int i = 1; i <= 3 && nameToDisplay.length() - i > 0; i++) { |
| dotCount++; |
| } |
| nameToDisplay = nameToDisplay.substring(0, nameToDisplay.length() - dotCount); |
| StringBuffer buf = new StringBuffer(nameToDisplay); |
| for (int i = 0; i < dotCount; i++) { |
| buf.append("."); //$NON-NLS-1$ |
| } |
| nameToDisplay = buf.toString(); |
| localDrawText(nameToDisplay, x + 1 + (localWidth - fContext.textExtent(nameToDisplay).x) / 2, y + 1 + (localHeight - fContext.textExtent(nameToDisplay).y) / 2, trans); |
| } |
| } |
| |
| @Override |
| public void drawTextTruncated(String name, int xValue, int yValue, int width, int height, boolean trans) { |
| int localX = xValue; |
| int localY = yValue; |
| int localWidth = width; |
| int localHeight = height; |
| |
| localX = Math.round(localX * fView.getZoomValue()); |
| localY = Math.round(localY * fView.getZoomValue()); |
| localWidth = Math.round(localWidth * fView.getZoomValue()); |
| localHeight = Math.round(localHeight * fView.getZoomValue()); |
| int x = fView.contentsToViewX(localX); |
| int y = fView.contentsToViewY(localY); |
| if (fContext.textExtent(name).x <= localWidth) { |
| localDrawText(name, x + 1, y + 1 + localHeight, trans); |
| } else { |
| String nameToDisplay = name; |
| for (int i = name.length() - 1; i >= 0 && fContext.textExtent(nameToDisplay).x >= localWidth; i--) { |
| nameToDisplay = name.substring(0, i); |
| } |
| int dotCount = 0; |
| for (int i = 1; i <= 3 && nameToDisplay.length() - i > 0; i++) { |
| dotCount++; |
| } |
| nameToDisplay = nameToDisplay.substring(0, nameToDisplay.length() - dotCount); |
| |
| StringBuffer buf = new StringBuffer(nameToDisplay); |
| |
| for (int i = 0; i < dotCount; i++) { |
| buf.append("."); //$NON-NLS-1$ |
| } |
| nameToDisplay = buf.toString(); |
| localDrawText(nameToDisplay, x + 1, y + 1 + localHeight, trans); |
| } |
| } |
| |
| @Override |
| public void drawImage(IImage image, int xValue, int yValue, int maxWith, int maxHeight) { |
| int localX = xValue; |
| int localY = yValue; |
| |
| Image img = null; |
| if (image != null && image.getImage() instanceof Image) { |
| img = (Image) image.getImage(); |
| } else { |
| localX = Math.round(localX * fView.getZoomValue()); |
| localY = Math.round(localY * fView.getZoomValue()); |
| int x = fView.contentsToViewX(localX); |
| int y = fView.contentsToViewY(localY); |
| float tempZoom = fView.getZoomValue(); |
| int width = Math.round(maxWith * tempZoom); |
| int height = Math.round(maxHeight * tempZoom); |
| fContext.setBackground(fView.getDisplay().getSystemColor(SWT.COLOR_RED)); |
| fContext.fillRectangle(x, y, width, height); |
| return; |
| } |
| localX = Math.round(localX * fView.getZoomValue()); |
| localY = Math.round(localY * fView.getZoomValue()); |
| int x = fView.contentsToViewX(localX); |
| int y = fView.contentsToViewY(localY); |
| Rectangle b = ((Image) image.getImage()).getBounds(); |
| int width = b.width; |
| int height = b.height; |
| if (width > maxWith) { |
| width = maxWith; |
| } |
| if (height > maxHeight) { |
| height = maxHeight; |
| } |
| float tempZoom = fView.getZoomValue(); |
| width = Math.round(width * tempZoom); |
| height = Math.round(height * tempZoom); |
| |
| if (fView.isPrinting() && width > 0 && height > 0) { |
| Image dbuffer = new Image(fView.getDisplay(), width, height); |
| GC tempgc = new GC(dbuffer); |
| tempgc.drawImage(img, 0, 0, b.width, b.height, 0, 0, width, height); |
| Image dbuffer2 = new Image(fView.getDisplay(), dbuffer.getImageData()); |
| fContext.drawImage(dbuffer2, x, y); |
| tempgc.dispose(); |
| dbuffer.dispose(); |
| dbuffer2.dispose(); |
| } else { |
| fContext.drawImage(img, 0, 0, b.width, b.height, x, y, width, height); |
| } |
| } |
| |
| @Override |
| public void drawArc(int x, int y, int width, int height, int startAngle, int endAngle) { |
| int localX = x; |
| int localY = y; |
| int localWidth = width; |
| int localHeight = height; |
| |
| localX = Math.round(localX * fView.getZoomValue()); |
| localY = Math.round(localY * fView.getZoomValue()); |
| localWidth = Math.round(localWidth * fView.getZoomValue()); |
| localHeight = Math.round(localHeight * fView.getZoomValue()); |
| if (localWidth == 0 || localHeight == 0 || endAngle == 0) { |
| return; |
| } |
| fContext.drawArc(fView.contentsToViewX(localX), fView.contentsToViewY(localY), localWidth, localHeight, startAngle, endAngle); |
| } |
| |
| @Override |
| public void setFont(IFont font) { |
| if (font.getFont() != null && ((Font) font.getFont()).getFontData().length > 0) { |
| FontData fontData = ((Font) font.getFont()).getFontData()[0]; |
| if (SDViewPref.getInstance().fontLinked() || fView.isPrinting()) { |
| int h = Math.round(fontData.getHeight() * fView.getZoomValue()); |
| if (h > 0) { |
| fontData.setHeight(h); |
| } |
| } |
| if (fTempFont != null) { |
| fTempFont.dispose(); |
| } |
| fTempFont = new Font(Display.getCurrent(), fontData); |
| fContext.setFont(fTempFont); |
| } |
| } |
| |
| @Override |
| public int getFontHeight(IFont font) { |
| if (font.getFont() != null && (font.getFont() instanceof Font) && ((Font) font.getFont()).getFontData().length > 0) { |
| Font toRestore = fContext.getFont(); |
| fContext.setFont((Font) font.getFont()); |
| int height = fContext.textExtent("lp").y;//$NON-NLS-1$ |
| fContext.setFont(toRestore); |
| return height; |
| } |
| return 0; |
| } |
| |
| /** |
| * Returns the current font height. |
| * |
| * @return the current font height. |
| */ |
| protected int getCurrentFontHeight() { |
| return fContext.textExtent("lp").y; //$NON-NLS-1$ |
| } |
| |
| @Override |
| public int getFontWidth(IFont font) { |
| if ((font.getFont() != null) && (font.getFont() instanceof Font)) { |
| Font toRestore = fContext.getFont(); |
| fContext.setFont((Font) font.getFont()); |
| int width = fContext.getFontMetrics().getAverageCharWidth(); |
| fContext.setFont(toRestore); |
| return width; |
| } |
| return 0; |
| } |
| |
| /** |
| * Disposes all created resources. |
| */ |
| public void dispose() { |
| if (fTempFont != null) { |
| fTempFont.dispose(); |
| } |
| fTempFont = null; |
| if (fContext != null) { |
| fContext.dispose(); |
| } |
| fContext = null; |
| } |
| |
| @Override |
| public float getZoom() { |
| if (fView != null) { |
| return fView.getZoomValue(); |
| } |
| return 1; |
| } |
| |
| @Override |
| public int getLineDotStyle() { |
| return SWT.LINE_DOT; |
| } |
| |
| @Override |
| public int getLineDashStyle() { |
| return SWT.LINE_DASH; |
| } |
| |
| @Override |
| public int getLineSolidStyle() { |
| return SWT.LINE_SOLID; |
| } |
| |
| @Override |
| public IColor createColor(int r, int g, int b) { |
| return new ColorImpl(Display.getDefault(), r, g, b); |
| } |
| |
| @Override |
| public void setDrawTextWithFocusStyle(boolean focus) { |
| fDrawWithFocus = focus; |
| } |
| |
| /** |
| * Returns the screen bounds. |
| * |
| * @return the screen bounds. |
| */ |
| protected static int getVscreenBounds() { |
| return fVisibleScreenBounds; |
| } |
| |
| /** |
| * Sets the visible screen bounds. |
| * |
| * @param vBounds the screen bounds. |
| */ |
| protected static void setVscreenBounds(int vBounds) { |
| fVisibleScreenBounds = vBounds; |
| } |
| |
| /** |
| * Returns the graphical context. |
| * |
| * @return the graphical context |
| */ |
| protected GC getGc() { |
| return fContext; |
| } |
| |
| /** |
| * Returns the SD widget. |
| * |
| * @return the SD widget |
| */ |
| protected SDWidget getSDWidget() { |
| return fView; |
| } |
| |
| /** |
| * Returns the gradient color. |
| * |
| * @return the gradient color |
| */ |
| protected IColor setGradientColor() { |
| return fGradientColor; |
| } |
| |
| // ------------------------------------------------------------------------ |
| // Helper methods |
| // ------------------------------------------------------------------------ |
| |
| /** |
| * Validates the polygon height |
| * |
| * @param localPoint array of points |
| * @return height |
| */ |
| private int validatePolygonHeight(int[] localPoint) { |
| int i = 1; |
| int max = 0; |
| int min = Integer.MAX_VALUE; |
| while (i < localPoint.length) { |
| max = Math.abs(localPoint[i]) > Math.abs(max) ? localPoint[i] : max; |
| min = Math.abs(localPoint[i]) < Math.abs(min) ? localPoint[i] : min; |
| i+=2; |
| } |
| int height = max - min; |
| if (min < -fVisibleScreenBounds) { |
| height = height + min + fVisibleScreenBounds; |
| min = -fVisibleScreenBounds; |
| } |
| if ((height < -fVisibleScreenBounds) && (min + height < -fVisibleScreenBounds)) { |
| height = -fVisibleScreenBounds; |
| } else if (height + min > fView.getVisibleHeight() + fVisibleScreenBounds) { |
| height = fView.getVisibleHeight() + fVisibleScreenBounds - min; |
| } |
| return height; |
| } |
| } |