001package org.vishia.gral.swt; 002 003 004import org.vishia.gral.base.GralMng; 005import org.vishia.gral.base.GralPanelContent; 006import org.vishia.gral.ifc.GralCanvasStorage; 007import org.vishia.gral.ifc.GralColor; 008import org.vishia.gral.ifc.GralPoint; 009import org.vishia.gral.ifc.GralRectangle; 010import org.eclipse.swt.events.PaintEvent; 011import org.eclipse.swt.events.PaintListener; 012import org.eclipse.swt.graphics.Color; 013import org.eclipse.swt.graphics.GC; 014import org.eclipse.swt.graphics.Image; 015import org.eclipse.swt.widgets.Canvas; 016import org.eclipse.swt.widgets.Composite; 017import org.eclipse.swt.widgets.Control; 018 019/**Class to store some graphical figures to draw it in its {@link SwtCanvas#drawBackground(GC, int, int, int, int)}-routine. 020 * The figures are stored with its coordinates and it are drawn if necessary. 021 * <br><br> 022 * It can contain some GUI-Elements like Button, Text, Label, Table etc from org.eclipse.swt.widgets. 023 * The graphical figures are shown as background than. 024 * 025 * @author Hartmut Schorrig 026 * 027 */ 028public class SwtCanvasStorePanel extends SwtPanel //CanvasStorePanel // 029{ 030 031 protected SwtCanvas swtCanvas; 032 033 /**The storage for the Canvas content. */ 034 //GralCanvasStorage store = new GralCanvasStorage(); 035 036 037 038 039 //class MyCanvas extends Canvas{ 040 041 private static final long serialVersionUID = 6448419343757106982L; 042 043 protected Color currColor; 044 045 /**Constructs the instance with a SWT-Canvas Panel. 046 * @param parent 047 * @param style 048 * @param backGround 049 */ 050 public SwtCanvasStorePanel(GralPanelContent panelg, Composite parent, int style, Color backGround, GralMng gralMng) 051 { super(panelg, null); 052 gralPanel().canvas = new GralCanvasStorage(); 053 swtCanvas = new SwtCanvas(this,parent, style); 054 super.panelComposite = swtCanvas; 055 swtCanvas.addControlListener(resizeItemListener); 056 swtCanvas.setData(this); 057 swtCanvas.setLayout(null); 058 currColor = swtCanvas.getForeground(); 059 swtCanvas.addPaintListener(swtCanvas.paintListener); 060 swtCanvas.setBackground(backGround); 061 } 062 063 /**Constructor called in derived classes. The derived class have to be instantiate the Canvas 064 * maybe with other draw routines. 065 */ 066 protected SwtCanvasStorePanel(GralPanelContent panelg) 067 { 068 super(panelg, null); 069 gralPanel().canvas = new GralCanvasStorage(); 070 } 071 072 073 public void xxxsetForeground(Color color){ 074 currColor = color; 075 } 076 077 078 079 /**Implementation class for Canvas for Swt 080 * This class is a org.eclipse.swt.widgets.Composite. 081 */ 082 protected static class SwtCanvas extends Canvas 083 { 084 private final SwtCanvasStorePanel storeMng; 085 086 SwtCanvas(SwtCanvasStorePanel storeMng, Composite parent, int style) 087 { 088 super(parent, style); 089 this.storeMng = storeMng; 090 } 091 092 @Override 093 public void drawBackground(GC g, int x, int y, int dx, int dy) { 094 //NOTE: forces stack overflow because calling of this routine recursively: super.paint(g); 095 096 if(storeMng.gralPanel().canvas == null){ 097 stop(); 098 } else 099 for(GralCanvasStorage.PaintOrder order: storeMng.gralPanel().canvas.paintOrders){ 100 switch(order.paintWhat){ 101 case GralCanvasStorage.paintLine: { 102 g.setForeground(((SwtMng)storeMng.gralPanel().gralMng().impl).getColorImpl(order.color)); 103 g.drawLine(order.x1, order.y1, order.x2, order.y2); 104 105 } break; 106 case GralCanvasStorage.paintImage: { 107 GralCanvasStorage.PaintOrderImage orderImage = (GralCanvasStorage.PaintOrderImage) order; 108 Image image = (Image)orderImage.image.getImage(); 109 //int dx1 = (int)(orderImage.zoom * order.x2); 110 //int dy1 = (int)(orderImage.zoom * order.y2); 111 g.drawImage(image, 0, 0, orderImage.dxImage, orderImage.dyImage, order.x1, order.y1, order.x2, order.y2); 112 } break; 113 case GralCanvasStorage.paintPolyline: { 114 GralCanvasStorage.PolyLine line = (GralCanvasStorage.PolyLine) order; 115 SwtPolyLine swtLine; 116 { Object oImpl = line.getImplData(); 117 if(oImpl == null){ 118 swtLine = new SwtPolyLine(line, ((SwtMng)storeMng.gralPanel().gralMng().impl)); 119 line.setImplData(swtLine); 120 } else { 121 swtLine = (SwtPolyLine) oImpl; 122 } 123 } 124 g.drawPolyline(swtLine.points); 125 } break; 126 default: throw new IllegalArgumentException("unknown order"); 127 } 128 } 129 } 130 131 /**The listener for paint events. It is called whenever the window is shown newly. */ 132 protected PaintListener paintListener = new PaintListener() 133 { 134 135 @Override 136 public void paintControl(PaintEvent e) { 137 // TODO Auto-generated method stub 138 GC gc = e.gc; 139 drawBackground(e.gc, e.x, e.y, e.width, e.height); 140 //stop(); 141 } 142 143 }; 144 145 void stop(){} 146 147 } 148 149 @Override public Control getWidgetImplementation(){ return swtCanvas; } 150 151 @Override public boolean setFocusGThread() 152 { 153 if(!super.setFocusGThread()){ 154 return swtCanvas.setFocus(); 155 } else return true; 156 } 157 158 159 void stop(){} //debug 160 161 public static class SwtPolyLine // extends GralCanvasStorage.PolyLine 162 { 163 int[] points; 164 int nrofPoints; 165 Color color; 166 167 SwtPolyLine(GralCanvasStorage.PolyLine line, SwtMng gralMng){ 168 nrofPoints = line.points.size(); 169 points = new int[2 * nrofPoints]; 170 GralRectangle rr = line.pos.calcWidgetPosAndSize(gralMng.mng.propertiesGui, 0, 0, 800, 600); 171 int ix = -1; 172 int xf, yf; 173 if(line.bPointsAreGralPosUnits){ 174 xf = gralMng.mng.propertiesGui.xPixelUnit(); //1.0 is one GralPos unit 175 yf = gralMng.mng.propertiesGui.xPixelUnit(); 176 } else { 177 xf = rr.dx; //0.0..1.0 is size of line.pos 178 yf = rr.dy; 179 } 180 for(GralPoint point: line.points){ 181 int x = rr.x + (int)(point.x * xf + 0.5f); 182 int y = rr.y - (int)(point.y * xf + 0.5f); 183 points[++ix] = x; 184 points[++ix] = y; 185 } 186 color = gralMng.getColorImpl(line.color); 187 } 188 } 189 190 191} 192