    001package org.vishia.gral.swt;
    002
    003import org.eclipse.swt.events.PaintEvent;
    004import org.eclipse.swt.events.PaintListener;
    005import org.eclipse.swt.graphics.GC;
    006import org.eclipse.swt.graphics.Image;
    007import org.eclipse.swt.widgets.Canvas;
    008import org.eclipse.swt.widgets.Composite;
    009import org.vishia.gral.base.GralPanelContent;
    010import org.vishia.gral.base.GralWidget;
    011import org.vishia.gral.ifc.GralCanvasStorage;
    012import org.vishia.gral.ifc.GralColor;
    013import org.vishia.gral.widget.GralPlotArea;
    014
    015/**Implementation of GralPlotArea to SET
    016 * @author Hartmut Schorrig
    017 *
    018 */
    019public class SwtPlotArea extends GralPlotArea._GraphicImplAccess_
    020{
    021  /**Version, history and license.
    022   * <ul>
    023   * <li>2015-09-26 Hartmut creation.
    024   * </ul>
    025   * <br><br>
    026   * <b>Copyright/Copyleft</b>:
    027   * For this source the LGPL Lesser General Public License,
    028   * published by the Free Software Foundation is valid.
    029   * It means:
    030   * <ol>
    031   * <li> You can use this source without any restriction for any desired purpose.
    032   * <li> You can redistribute copies of this source to everybody.
    033   * <li> Every user of this source, also the user of redistribute copies
    034   *    with or without payment, must accept this license for further using.
    035   * <li> But the LPGL is not appropriate for a whole software product,
    036   *    if this source is only a part of them. It means, the user
    037   *    must publish this part of source,
    038   *    but don't need to publish the whole source of the own product.
    039   * <li> You can study and modify (improve) this source
    040   *    for own using or for redistribution, but you have to license the
    041   *    modified sources likewise under this LGPL Lesser General Public License.
    042   *    You mustn't delete this Copyright/Copyleft inscription in this source file.
    043   * </ol>
    044   * If you are intent to use this sources without publishing its usage, you can get
    045   * a second license subscribing a special contract with the author.
    046   *
    047   * @author Hartmut Schorrig = hartmut@vishia.org
    048   *
    049   */
    050  public static final String sVersion = "2015-09-26";
    051
    052  private final Canvas swtCanvas;
    053
    054  private final SwtMng mng;
    055
    056  protected SwtPlotArea(GralPlotArea gralPlotArea, SwtMng mng)
    057  {
    058    gralPlotArea.super(gralPlotArea);
    059    this.mng = mng;
    060    GralPanelContent panel = gralPlotArea.pos().panel;
    061    Object swtPanel = panel._wdgImpl.getWidgetImplementation();
    062    Composite panelSwt = (Composite) swtPanel; //mng.getCurrentPanel();
    063    swtCanvas = new Canvas(panelSwt, 0);
    064    swtCanvas.setBackground(mng.getColorImpl(GralColor.getColor("white")));
    065    mng.setPosAndSizeSwt( gralPlotArea.pos(), swtCanvas, 800, 600);
    066    swtCanvas.addPaintListener(paintListener);
    067  }
    068
    069
    070  private void paintRoutine(PaintEvent ev) {
    071    GC g = ev.gc;
    072    for(GralCanvasStorage.PaintOrder order: super.canvasStore().paintOrders){
    073        switch(order.paintWhat){
    074          case GralCanvasStorage.paintLine: {
    075            g.setForeground(mng.getColorImpl(order.color));
    076            g.drawLine(order.x1, order.y1, order.x2, order.y2);
    077
    078          } break;
    079          case GralCanvasStorage.paintImage: {
    080            GralCanvasStorage.PaintOrderImage orderImage = (GralCanvasStorage.PaintOrderImage) order;
    081            Image image = (Image)orderImage.image.getImage();
    082            //int dx1 = (int)(orderImage.zoom * order.x2);
    083            //int dy1 = (int)(orderImage.zoom * order.y2);
    084            g.drawImage(image, 0, 0, orderImage.dxImage, orderImage.dyImage, order.x1, order.y1, order.x2, order.y2);
    085          } break;
    086          case GralCanvasStorage.paintPolyline: {
    087            if(order instanceof GralCanvasStorage.PolyLineFloatArray) {
    088              GralCanvasStorage.PolyLineFloatArray line = (GralCanvasStorage.PolyLineFloatArray) order;
    089              int[] points = ((GralCanvasStorage.PolyLineFloatArray) order).getImplStoreInt1Array();
    090              g.setForeground(mng.getColorImpl(order.color));
    091              g.drawPolyline(points);
    092            } else {
    093              GralCanvasStorage.PolyLine line = (GralCanvasStorage.PolyLine) order;
    094              SwtCanvasStorePanel.SwtPolyLine swtLine;
    095              { Object oImpl = line.getImplData();
    096                if(oImpl == null){
    097                  swtLine = new SwtCanvasStorePanel.SwtPolyLine(line, mng);
    098                  line.setImplData(swtLine);
    099                } else {
    100                  swtLine = (SwtCanvasStorePanel.SwtPolyLine) oImpl;
    101                }
    102              }
    103              g.drawPolyline(swtLine.points);
    104            }
    105          } break;
    106          default: throw new IllegalArgumentException("unknown order");
    107        }
    108      }
    109
    110  }
    111
    112
    113
    114  @Override public void setVisibleGThread(boolean bVisible) { super.setVisibleState(bVisible); swtCanvas.setVisible(bVisible); }
    115
    116
    117  @SuppressWarnings("synthetic-access")
    118  PaintListener paintListener = new PaintListener(){
    119    @Override public void paintControl(PaintEvent ev) {
    120      SwtPlotArea.this.paintRoutine( ev);
    121    }
    122  };
    123
    124
    125}