All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.swtchart.internal.series.LineSeries Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * Copyright (c) 2008, 2019 SWTChart project.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 * yoshitaka - initial API and implementation
 * Christoph Läubrich - add support for datamodel
 * Frank Buloup = Internationalization
 *******************************************************************************/
package org.eclipse.swtchart.internal.series;

import java.util.ArrayList;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swtchart.Chart;
import org.eclipse.swtchart.IAxis.Direction;
import org.eclipse.swtchart.ILineSeries;
import org.eclipse.swtchart.LineStyle;
import org.eclipse.swtchart.Range;
import org.eclipse.swtchart.internal.Util;
import org.eclipse.swtchart.internal.axis.Axis;
import org.eclipse.swtchart.internal.compress.CompressLineSeries;
import org.eclipse.swtchart.internal.compress.CompressScatterSeries;
import org.eclipse.swtchart.model.CartesianSeriesModel;
import org.eclipse.swtchart.model.DoubleArraySeriesModel;

/**
 * Line series.
 */
public class LineSeries extends Series implements ILineSeries
{
   /** the symbol size in pixel */
   private int symbolSize = 4;

   /** the symbol color */
   private Color symbolColor = Display.getDefault().getSystemColor(DEFAULT_SYMBOL_COLOR);

   /** the symbol colors */
   private Color[] symbolColors = new Color[0];

   /** the symbol type */
   private PlotSymbolType symbolType = DEFAULT_SYMBOL_TYPE;

   /** the line style */
   private LineStyle lineStyle = DEFAULT_LINE_STYLE;

   /** the line color */
   private Color lineColor = Display.getDefault().getSystemColor(DEFAULT_LINE_COLOR);

   /** the line width */
   private int lineWidth = DEFAULT_LINE_WIDTH;

   /** the state indicating if area chart is enabled */
   private boolean areaEnabled = false;
   /** the state indicating if step chart is enabled */
   private boolean stepEnabled = false;
   /** the anti-aliasing value for drawing line */
   private int antialias = DEFAULT_ANTIALIAS;
   /** specific symbol */
   private String extendedSymbolType = "😂"; //$NON-NLS-1$
   /** the alpha value to draw area */
   private static final int ALPHA = 50;
   /** the default line style */
   private static final LineStyle DEFAULT_LINE_STYLE = LineStyle.SOLID;
   /** the default line width */
   private static final int DEFAULT_LINE_WIDTH = 1;
   /** the default line color */
   private static final int DEFAULT_LINE_COLOR = SWT.COLOR_BLUE;
   /** the default symbol color */
   private static final int DEFAULT_SYMBOL_COLOR = SWT.COLOR_DARK_GRAY;
   /** the default symbol size */
   private static final int DEFAULT_SIZE = 4;
   /** the default symbol type */
   private static final PlotSymbolType DEFAULT_SYMBOL_TYPE = PlotSymbolType.CIRCLE;
   /** the default anti-aliasing value */
   private static final int DEFAULT_ANTIALIAS = SWT.DEFAULT;
   /** the margin in pixels attached at the minimum/maximum plot */
   private static final int MARGIN_AT_MIN_MAX_PLOT = 6;

   /**
    * Constructor.
    *
    * @param chart the chart
    * @param id the series id
    */
   protected LineSeries(Chart chart, String id)
   {
      super(chart, id);
      compressor = new CompressLineSeries();
   }

   /**
    * @see org.eclipse.swtchart.ILineSeries#getLineStyle()
    */
   @Override
   public LineStyle getLineStyle()
   {
      return lineStyle;
   }

   /**
    * @see org.eclipse.swtchart.ILineSeries#setLineStyle(org.eclipse.swtchart.LineStyle)
    */
   @Override
   public void setLineStyle(LineStyle style)
   {
      if (style == null)
      {
         this.lineStyle = DEFAULT_LINE_STYLE;
         return;
      }
      this.lineStyle = style;
      if (compressor instanceof CompressScatterSeries)
      {
         ((CompressScatterSeries)compressor).setLineVisible(style != LineStyle.NONE);
      }
   }

   /**
    * @see org.eclipse.swtchart.ILineSeries#getLineColor()
    */
   @Override
   public Color getLineColor()
   {
      if (lineColor.isDisposed())
      {
         lineColor = Display.getDefault().getSystemColor(DEFAULT_LINE_COLOR);
      }
      return lineColor;
   }

   /**
    * @see org.eclipse.swtchart.ILineSeries#setLineColor(org.eclipse.swt.graphics.Color)
    */
   @Override
   public void setLineColor(Color color)
   {
      if (color != null && color.isDisposed())
      {
         SWT.error(SWT.ERROR_INVALID_ARGUMENT);
      }
      if (color == null)
      {
         this.lineColor = Display.getDefault().getSystemColor(DEFAULT_LINE_COLOR);
      }
      else
      {
         this.lineColor = color;
      }
   }

   /**
    * @see org.eclipse.swtchart.ILineSeries#getLineWidth()
    */
   @Override
   public int getLineWidth()
   {
      return lineWidth;
   }

   /**
    * @see org.eclipse.swtchart.ILineSeries#setLineWidth(int)
    */
   @Override
   public void setLineWidth(int width)
   {
      if (width <= 0)
      {
         this.lineWidth = DEFAULT_LINE_WIDTH;
      }
      else
      {
         this.lineWidth = width;
      }
   }

   /**
    * @see org.eclipse.swtchart.ILineSeries#getSymbolType()
    */
   @Override
   public PlotSymbolType getSymbolType()
   {
      return symbolType;
   }

   /**
    * @see org.eclipse.swtchart.ILineSeries#setSymbolType(org.eclipse.swtchart.ILineSeries.PlotSymbolType)
    */
   @Override
   public void setSymbolType(PlotSymbolType type)
   {
      if (type == null)
      {
         this.symbolType = DEFAULT_SYMBOL_TYPE;
      }
      else
      {
         this.symbolType = type;
      }
   }

   /**
    * @see org.eclipse.swtchart.ILineSeries#getExtendedPlotSymbolType()
    */
   @Override
   public String getExtendedPlotSymbolType()
   {
      return extendedSymbolType;
   }

   /**
    * @see org.eclipse.swtchart.ILineSeries#setExtendedPlotSymbolType(java.lang.String)
    */
   @Override
   public void setExtendedPlotSymbolType(String type)
   {
      extendedSymbolType = type;
   }

   /**
    * @see org.eclipse.swtchart.ILineSeries#getSymbolSize()
    */
   @Override
   public int getSymbolSize()
   {
      return symbolSize;
   }

   /**
    * @see org.eclipse.swtchart.ILineSeries#setSymbolSize(int)
    */
   @Override
   public void setSymbolSize(int size)
   {
      if (size <= 0)
      {
         this.symbolSize = DEFAULT_SIZE;
      }
      else
      {
         this.symbolSize = size;
      }
   }

   /**
    * @see org.eclipse.swtchart.ILineSeries#getSymbolColor()
    */
   @Override
   public Color getSymbolColor()
   {
      return symbolColor;
   }

   /**
    * @see org.eclipse.swtchart.ILineSeries#setSymbolColor(org.eclipse.swt.graphics.Color)
    */
   @Override
   public void setSymbolColor(Color color)
   {
      if (color != null && color.isDisposed())
      {
         SWT.error(SWT.ERROR_INVALID_ARGUMENT);
      }
      if (color == null)
      {
         this.symbolColor = Display.getDefault().getSystemColor(DEFAULT_SYMBOL_COLOR);
      }
      else
      {
         this.symbolColor = color;
      }
   }

   /**
    * @see org.eclipse.swtchart.ILineSeries#getSymbolColors()
    */
   @Override
   public Color[] getSymbolColors()
   {

      Color[] copiedSymbolColors = new Color[symbolColors.length];
      System.arraycopy(symbolColors, 0, copiedSymbolColors, 0, symbolColors.length);
      return copiedSymbolColors;
   }

   /**
    * @see org.eclipse.swtchart.ILineSeries#setSymbolColors(org.eclipse.swt.graphics.Color[])
    */
   @Override
   public void setSymbolColors(Color[] colors)
   {

      if (colors == null)
      {
         symbolColors = new Color[0];
         return;
      }
      for(Color color : colors)
      {
         if (color.isDisposed())
         {
            SWT.error(SWT.ERROR_INVALID_ARGUMENT);
         }
      }
      symbolColors = new Color[colors.length];
      System.arraycopy(colors, 0, symbolColors, 0, colors.length);
   }

   /**
    * @see org.eclipse.swtchart.internal.series.Series#setCompressor()
    */
   @Override
   protected void setCompressor()
   {
      CartesianSeriesModel dataModel = getDataModel();
      if (dataModel instanceof DoubleArraySeriesModel)
      {
         if (((DoubleArraySeriesModel)dataModel).isXMonotoneIncreasing())
         {
            compressor = new CompressLineSeries();
            return;
         }
      }
      compressor = new CompressScatterSeries();
      ((CompressScatterSeries)compressor).setLineVisible(getLineStyle() != LineStyle.NONE);
   }

   @Override
   public void enableArea(boolean enabled)
   {

      areaEnabled = enabled;
   }

   @Override
   public boolean isAreaEnabled()
   {

      return areaEnabled;
   }

   @Override
   public void enableStep(boolean enabled)
   {

      stepEnabled = enabled;
   }

   @Override
   public boolean isStepEnabled()
   {

      return stepEnabled;
   }

   @Override
   public Range getAdjustedRange(Axis axis, int length)
   {

      Range range;
      if (axis.getDirection() == Direction.X)
      {
         range = getXRange();
      }
      else
      {
         range = getYRange();
      }
      int lowerPlotMargin = getSymbolSize() + MARGIN_AT_MIN_MAX_PLOT;
      int upperPlotMargin = getSymbolSize() + MARGIN_AT_MIN_MAX_PLOT;
      return getRangeWithMargin(lowerPlotMargin, upperPlotMargin, length, axis, range);
   }

   @Override
   public int getAntialias()
   {
      return antialias;
   }

   @Override
   public void setAntialias(int antialias)
   {
      if (antialias != SWT.DEFAULT && antialias != SWT.ON && antialias != SWT.OFF)
      {
         SWT.error(SWT.ERROR_INVALID_ARGUMENT);
      }
      this.antialias = antialias;
   }

   /**
    * Gets the line points to draw line and area.
    *
    * @param xseries the horizontal series
    * @param yseries the vertical series
    * @param indexes the series indexes
    * @param index the index of series
    * @param xAxis the X axis
    * @param yAxis the Y axis
    * @return the line points
    */
   private int[] getLinePoints(double[] xseries, double[] yseries, int[] indexes, int index, Axis xAxis, Axis yAxis)
   {
      int x1 = xAxis.getPixelCoordinate(xseries[index]);
      int x2 = xAxis.getPixelCoordinate(xseries[index + 1]);
      int x3 = x2;
      int x4 = x1;
      int y1 = yAxis.getPixelCoordinate(inverted ? -yseries[index] : yseries[index]);
      int y2 = yAxis.getPixelCoordinate(inverted ? -yseries[index + 1] : yseries[index + 1]);
      int y3, y4;

      double baseYCoordinate = yAxis.getRange().lower > 0 ? yAxis.getRange().lower : 0;

      if (yAxis.isLogScaleEnabled())
      {
         y3 = yAxis.getPixelCoordinate(yAxis.getRange().lower);
         y4 = y3;
      }
      else if (isValidStackSeries())
      {
         y1 = yAxis.getPixelCoordinate(inverted ? -stackSeries[indexes[index]] : stackSeries[indexes[index]]);
         y2 = yAxis.getPixelCoordinate(inverted ? -stackSeries[indexes[index + 1]] : stackSeries[indexes[index + 1]]);
         if (inverted)
         {
            y3 = yAxis.getPixelCoordinate(-stackSeries[indexes[index + 1]]) -
                  Math.abs(yAxis.getPixelCoordinate(-yseries[index + 1]) - yAxis.getPixelCoordinate(0)) * (xAxis.isHorizontalAxis() ? 1 : -1);
            y4 = yAxis.getPixelCoordinate(-stackSeries[indexes[index]]) - Math.abs(yAxis.getPixelCoordinate(-yseries[index]) - yAxis.getPixelCoordinate(0)) * (xAxis.isHorizontalAxis() ? 1 : -1);
         }
         else
         {
            y3 = yAxis.getPixelCoordinate(stackSeries[indexes[index + 1]]) + Math.abs(yAxis.getPixelCoordinate(yseries[index + 1]) - yAxis.getPixelCoordinate(0)) * (xAxis.isHorizontalAxis() ? 1 : -1);
            y4 = yAxis.getPixelCoordinate(stackSeries[indexes[index]]) + Math.abs(yAxis.getPixelCoordinate(yseries[index]) - yAxis.getPixelCoordinate(0)) * (xAxis.isHorizontalAxis() ? 1 : -1);
         }
      }
      else
      {
         y3 = yAxis.getPixelCoordinate(baseYCoordinate);
         y4 = y3;
      }
      if (xAxis.isHorizontalAxis())
      {
         return new int[] { x1, y1, x2, y2, x3, y3, x4, y4 };
      }
      return new int[] { y1, x1, y2, x2, y3, x3, y4, x4 };
   }

   /**
    * @see org.eclipse.swtchart.internal.series.Series#draw(org.eclipse.swt.graphics.GC, int, int, org.eclipse.swtchart.internal.axis.Axis, org.eclipse.swtchart.internal.axis.Axis)
    */
   @Override
   protected void draw(GC gc, int width, int height, Axis xAxis, Axis yAxis)
   {
      int oldAntialias = gc.getAntialias();
      int oldLineWidth = gc.getLineWidth();
      gc.setAntialias(antialias);
      gc.setLineWidth(lineWidth);
      if (lineStyle != LineStyle.NONE)
      {
         drawLineAndArea(gc, width, height, xAxis, yAxis);
      }
      if (symbolType != PlotSymbolType.NONE || getLabel().isVisible() || getXErrorBar().isVisible() || getYErrorBar().isVisible())
      {
         drawSymbolAndLabel(gc, width, height, xAxis, yAxis);
      }
      gc.setAntialias(oldAntialias);
      gc.setLineWidth(oldLineWidth);
   }

   /**
    * Draws the line and area.
    *
    * @param gc the graphics context
    * @param width the width to draw series
    * @param height the height to draw series
    * @param xAxis the x axis
    * @param yAxis the y axis
    */
   private void drawLineAndArea(GC gc, int width, int height, Axis xAxis, Axis yAxis)
   {
      // get x and y series
      double[] xseries = compressor.getCompressedXSeries();
      double[] yseries = compressor.getCompressedYSeries();
      if (xseries.length == 0 || yseries.length == 0)
      {
         return;
      }
      int[] indexes = compressor.getCompressedIndexes();
      if (xAxis.isValidCategoryAxis())
      {
         for(int i = 0; i < xseries.length; i++)
         {
            xseries[i] = indexes[i];
         }
      }

      gc.setLineStyle(Util.getIndexDefinedInSWT(lineStyle));
      Color oldForeground = gc.getForeground();
      gc.setForeground(getLineColor());

      boolean isHorizontal = xAxis.isHorizontalAxis();
      if (stepEnabled || areaEnabled || stackEnabled)
      {
         for(int i = 0; i < xseries.length - 1; i++)
         {
            int[] p = getLinePoints(xseries, yseries, indexes, i, xAxis, yAxis);
            // draw line
            if (lineStyle != LineStyle.NONE)
            {
               if (stepEnabled)
               {
                  if (isHorizontal)
                  {
                     gc.drawLine(p[0], p[1], p[2], p[1]);
                     gc.drawLine(p[2], p[1], p[2], p[3]);
                  }
                  else
                  {
                     gc.drawLine(p[0], p[1], p[0], p[3]);
                     gc.drawLine(p[0], p[3], p[2], p[3]);
                  }
               }
               else
               {
                  gc.drawLine(p[0], p[1], p[2], p[3]);
               }
            }

            // draw area
            if (areaEnabled)
            {
               drawArea(gc, p, isHorizontal);
            }
         }
      }
      else
      {
         if (lineStyle == LineStyle.SOLID)
         {
            drawLine(gc, xAxis, yAxis, xseries, yseries, isHorizontal);
         }
         else if (lineStyle != LineStyle.NONE)
         {
            drawLineWithStyle(gc, xAxis, yAxis, xseries, yseries, isHorizontal);
         }
      }

      gc.setForeground(oldForeground);
   }

   /*
    * This method basically does the same things as drawLineWithStyle(), but is kept being used. The reason is that,
    * drawLineWithStyle() has a workaround for eclipse bug #243588, and there could be a case that the workaround doesn't work. To
    * minimize the risk of side effect, this method remains for solid line style until that bug is fixed and the workaround is
    * removed.
    */
   private void drawLine(GC gc, Axis xAxis, Axis yAxis, double[] xseries, double[] yseries, boolean isHorizontal)
   {
      double xLower = xAxis.getRange().lower;
      double xUpper = xAxis.getRange().upper;
      double yLower = yAxis.getRange().lower;
      double yUpper = yAxis.getRange().upper;
      int prevX = xAxis.getPixelCoordinate(xseries[0], xLower, xUpper);
      int prevY = yAxis.getPixelCoordinate(inverted ? -yseries[0] : yseries[0], yLower, yUpper);
      boolean drawVerticalLine = false;
      int verticalLineYLower = 0;
      int verticalLineYUpper = 0;
      for(int i = 0; i < xseries.length - 1; i++)
      {
         int x = xAxis.getPixelCoordinate(xseries[i + 1], xLower, xUpper);
         int y = yAxis.getPixelCoordinate(inverted ? -yseries[i + 1] : yseries[i + 1], yLower, yUpper);
         if (x == prevX && i < xseries.length - 2)
         {
            if (drawVerticalLine)
            {
               // extend vertical line
               verticalLineYLower = Math.min(verticalLineYLower, y);
               verticalLineYUpper = Math.max(verticalLineYUpper, y);
            }
            else
            {
               // init vertical line
               verticalLineYLower = Math.min(prevY, y);
               verticalLineYUpper = Math.max(prevY, y);
               drawVerticalLine = true;
            }
         }
         else
         {
            // draw vertical line
            if (drawVerticalLine)
            {
               if (isHorizontal)
               {
                  gc.drawLine(prevX, verticalLineYLower, prevX, verticalLineYUpper);
               }
               else
               {
                  gc.drawLine(verticalLineYLower, prevX, verticalLineYUpper, prevX);
               }
               drawVerticalLine = false;
            }
            // draw non-vertical line
            if (isHorizontal)
            {
               gc.drawLine(prevX, prevY, x, y);
            }
            else
            {
               gc.drawLine(prevY, prevX, y, x);
            }
         }
         prevX = x;
         prevY = y;
      }
   }

   /**
    * Draws the line segments with line style.
    * 

* When there are multiple data points at the same x pixel coordinate, it is inefficient to simply draw vertical lines connecting * them by overlaying. Instead, only a single vertical line representing the overlaid multiple vertical lines is drawn at that x * pixel coordinate. *

* That's why vertical line is handled differently from non-vertical line in this method. * * @param gc the graphic context * @param xAxis the x axis * @param yAxis the y axis * @param xseries the x series * @param yseries the y series * @param isHorizontal true if orientation is horizontal */ private void drawLineWithStyle(GC gc, Axis xAxis, Axis yAxis, double[] xseries, double[] yseries, boolean isHorizontal) { double xLower = xAxis.getRange().lower; double xUpper = xAxis.getRange().upper; double yLower = yAxis.getRange().lower; double yUpper = yAxis.getRange().upper; List pointList = new ArrayList(); int prevX = xAxis.getPixelCoordinate(xseries[0], xLower, xUpper); int prevY = yAxis.getPixelCoordinate(inverted ? -yseries[0] : yseries[0], yLower, yUpper); // add initial point addPoint(pointList, prevX, prevY, isHorizontal); boolean drawVerticalLine = false; int verticalLineYLower = 0; int verticalLineYUpper = 0; for(int i = 0; i < xseries.length - 1; i++) { int x = xAxis.getPixelCoordinate(xseries[i + 1], xLower, xUpper); int y = yAxis.getPixelCoordinate(inverted ? -yseries[i + 1] : yseries[i + 1], yLower, yUpper); if (x == prevX && i < xseries.length - 2) { if (drawVerticalLine) { // extend vertical line verticalLineYLower = Math.min(verticalLineYLower, y); verticalLineYUpper = Math.max(verticalLineYUpper, y); } else { // init vertical line verticalLineYLower = Math.min(prevY, y); verticalLineYUpper = Math.max(prevY, y); drawVerticalLine = true; } } else { // add vertical line if (drawVerticalLine) { addPoint(pointList, prevX, verticalLineYLower, isHorizontal); addPoint(pointList, prevX, verticalLineYUpper, isHorizontal); addPoint(pointList, prevX, prevY, isHorizontal); } // add non-vertical line addPoint(pointList, x, y, isHorizontal); drawVerticalLine = false; } prevX = x; prevY = y; } int[] polyline = new int[pointList.size()]; for(int i = 0; i < polyline.length; i++) { polyline[i] = pointList.get(i); } boolean advanced = gc.getAdvanced(); gc.setAdvanced(true); // workaround gc.drawPolyline(polyline); gc.setAdvanced(advanced); } private static void addPoint(List pointList, int x, int y, boolean isHorizontal) { if (isHorizontal) { pointList.add(Integer.valueOf(x)); pointList.add(Integer.valueOf(y)); } else { pointList.add(Integer.valueOf(y)); pointList.add(Integer.valueOf(x)); } } /** * Draws the area. * * @param gc the graphic context * @param p the line points * @param isHorizontal true if orientation is horizontal */ private void drawArea(GC gc, int[] p, boolean isHorizontal) { int alpha = gc.getAlpha(); gc.setAlpha(chart.isTranslucent() ? ALPHA : 255); Color oldBackground = gc.getBackground(); gc.setBackground(getLineColor()); int[] pointArray; if (stepEnabled) { if (isHorizontal) { pointArray = new int[] { p[0], p[1], p[2], p[1], p[4], p[7], p[6], p[7], p[0], p[1] }; } else { pointArray = new int[] { p[0], p[1], p[0], p[3], p[6], p[5], p[6], p[7], p[0], p[1] }; } } else { pointArray = new int[] { p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[0], p[1] }; } gc.fillPolygon(pointArray); gc.setAlpha(alpha); gc.setBackground(oldBackground); } /** * Draws series symbol, label and error bars. * * @param gc the graphics context * @param width the width to draw series * @param height the height to draw series * @param xAxis the x axis * @param yAxis the y axis */ private void drawSymbolAndLabel(GC gc, int width, int height, Axis xAxis, Axis yAxis) { // get x and y series double[] xseries = compressor.getCompressedXSeries(); double[] yseries = compressor.getCompressedYSeries(); int[] indexes = compressor.getCompressedIndexes(); if (xAxis.isValidCategoryAxis()) { boolean isValidStackSeries = isValidStackSeries(); for(int i = 0; i < xseries.length; i++) { xseries[i] = indexes[i]; if (isValidStackSeries) { yseries[i] = stackSeries[indexes[i]]; } } } // draw symbol and label for(int i = 0; i < xseries.length; i++) { Color color; if (symbolColors.length > indexes[i]) { color = symbolColors[indexes[i]]; } else { color = getSymbolColor(); } int h, v; if (xAxis.isHorizontalAxis()) { h = xAxis.getPixelCoordinate(xseries[i]); v = yAxis.getPixelCoordinate(yseries[i]); } else { v = xAxis.getPixelCoordinate(xseries[i]); h = yAxis.getPixelCoordinate(yseries[i]); } if (getSymbolType() != PlotSymbolType.NONE) { drawSeriesSymbol(gc, h, v, color); } seriesLabel.draw(gc, h, v, yseries[i], indexes[i], SWT.BOTTOM); xErrorBar.draw(gc, h, v, xAxis, indexes[i]); yErrorBar.draw(gc, h, v, yAxis, indexes[i]); } } /** * Draws series symbol. * * @param gc the GC object * @param h the horizontal coordinate to draw symbol * @param v the vertical coordinate to draw symbol * @param color the symbol color */ public void drawSeriesSymbol(GC gc, int h, int v, Color color) { int oldAntialias = gc.getAntialias(); gc.setAntialias(SWT.ON); Color oldForeground = gc.getForeground(); gc.setForeground(color); Color oldBackground = gc.getBackground(); gc.setBackground(color); switch(symbolType) { case CIRCLE: gc.fillOval(h - symbolSize, v - symbolSize, symbolSize * 2, symbolSize * 2); break; case SQUARE: gc.fillRectangle(h - symbolSize, v - symbolSize, symbolSize * 2, symbolSize * 2); break; case DIAMOND: int[] diamondArray = { h, v - symbolSize, h + symbolSize, v, h, v + symbolSize, h - symbolSize, v }; gc.fillPolygon(diamondArray); break; case TRIANGLE: int[] triangleArray = { h, v - symbolSize, h + symbolSize, v + symbolSize, h - symbolSize, v + symbolSize }; gc.fillPolygon(triangleArray); break; case INVERTED_TRIANGLE: int[] invertedTriangleArray = { h, v + symbolSize, h + symbolSize, v - symbolSize, h - symbolSize, v - symbolSize }; gc.fillPolygon(invertedTriangleArray); break; case CROSS: gc.setLineStyle(SWT.LINE_SOLID); gc.drawLine(h - symbolSize, v - symbolSize, h + symbolSize, v + symbolSize); gc.drawLine(h - symbolSize, v + symbolSize, h + symbolSize, v - symbolSize); break; case PLUS: gc.setLineStyle(SWT.LINE_SOLID); gc.drawLine(h, v - symbolSize, h, v + symbolSize); gc.drawLine(h - symbolSize, v, h + symbolSize, v); break; case EMOJI: String extendedSymbol = getExtendedPlotSymbolType(); Point extendedSymbolSize = gc.textExtent(extendedSymbol); gc.drawText(extendedSymbol, h - extendedSymbolSize.x / 2, v - extendedSymbolSize.y / 2, true); break; case NONE: default: break; } gc.setAntialias(oldAntialias); gc.setBackground(oldBackground); gc.setForeground(oldForeground); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy