001package org.vishia.gral.swt; 002 003import org.eclipse.swt.events.PaintEvent; 004import org.eclipse.swt.events.PaintListener; 005import org.eclipse.swt.graphics.Color; 006import org.eclipse.swt.graphics.GC; 007import org.eclipse.swt.widgets.Canvas; 008import org.eclipse.swt.widgets.Composite; 009import org.vishia.gral.base.GralLed; 010import org.vishia.gral.base.GralLed.GraphicImplAccess; 011import org.vishia.gral.base.GralWidget; 012import org.vishia.gral.ifc.GralColor; 013import org.vishia.gral.ifc.GralRectangle; 014 015/**This class represents a LED, which is able to show a state with its color. 016 * The LED may have a inner light and a border light. In that case to state, 017 * which may have any association, can presented. 018 */ 019public class SwtLed extends GralLed.GraphicImplAccess 020{ 021 022 /**Version and history 023 * <ul> 024 * <li>2011-12-03 chg now it is the implementation class for the new class {@link GralLed}. 025 * It is the concept of specialized {@link GralWidget}. 026 * The ctor creates the swt Control. 027 * The content before is the inner class {@link SwtLedImpl} up to now. 028 * <li>2010-05-00 created. 029 * </ul> 030 * 031 */ 032 private SwtLedImpl widgSwt; 033 034 035 /**It contains the association to the swt widget (Control) and the {@link SwtMng} 036 * and implements some methods of {@link GralWidgImpl_ifc} which are delegate from this. 037 */ 038 private final SwtWidgetHelper wdgh; 039 040 041 Color borderColor, innerColor; 042 043 final SwtMng mng; 044 045 boolean round; 046 047 048 SwtLed(String name, SwtMng mng){ 049 this(new GralLed(name), mng); 050 } 051 052 SwtLed(GralLed widgg, SwtMng mng){ 053 widgg.super(widgg, mng.mng); 054 //super(name, mng); 055 this.mng = mng; 056 switch('r'){ 057 case 'r': round = true; break; 058 case 'q': round = false; break; 059 default: throw new IllegalArgumentException("param size must be r or q"); 060 } 061 Composite panel = mng.getCurrentPanel(); 062 widgSwt = new SwtLedImpl(panel); 063 super.wdgimpl = this.wdgh = new SwtWidgetHelper(widgSwt, mng); 064 widgSwt.setBackground(mng.propertiesGuiSwt.colorBackground); 065 widgSwt.addFocusListener(mng.focusListener); 066 widgSwt.setForeground(mng.propertiesGuiSwt.colorSwt(0xff00)); 067 //widget.setSize(propertiesGui.xPixelUnit() * xSize -2, propertiesGui.yPixelUnit() * ySize -2); 068 mng.setBounds_(widgg.pos(), widgSwt); 069 widgSwt.setData(this); 070 widgSwt.addMouseListener(mng.mouseClickForInfo); 071 072 } 073 074 075 076 077 /**Called in the paint routine, corrects the colors for SWT depending on {@link GralWidget.DynamicData#backColor} 078 * and {@link GralWidget.DynamicData#lineColor}. 079 * <ul> 080 * <li>lineColor is the border color 081 * <li>backColor is the inner color. 082 * </ul> 083 */ 084 private void setColors(){ 085 int changedAckn = 0; 086 GralWidget.DynamicData dyda = dyda(); //GralLed.GraphicImplAccess.this.dyda(); 087 int chg = dyda.getChanged(); 088 if(dyda.backColor !=null 089 && ( (chg & GralWidget.ImplAccess.chgColorBack)!=0 090 ||innerColor == null //uninitialized: start with dyda.backColor 091 ) ){ 092 innerColor = mng.getColorImpl(dyda.backColor); 093 changedAckn |= GralWidget.ImplAccess.chgColorBack; 094 } 095 if(dyda.lineColor !=null){ //use backColor if lineColor is not set! 096 if( (chg & GralWidget.ImplAccess.chgColorLine)!=0 097 || borderColor == null 098 ){ 099 borderColor = mng.getColorImpl(dyda.lineColor); 100 changedAckn |= GralWidget.ImplAccess.chgColorLine; 101 } 102 } else { 103 borderColor = innerColor; 104 } 105 if(changedAckn !=0) { 106 dyda.acknChanged(changedAckn); 107 } 108 } 109 110 111 112 113 114private class SwtLedImpl extends Canvas 115 { 116 /**Creates a LED. 117 * @param mng The Gui-panel-manager contains information about the graphic frame and properties. 118 * @param kind Use 'r' or 'q' for a round or a square LED. 119 */ 120 public SwtLedImpl(Composite panel) 121 { 122 123 super(panel, 0); 124 addPaintListener(paintListener); 125 } 126 127 PaintListener paintListener = new PaintListener(){ 128 @Override 129 public void paintControl(PaintEvent e) { 130 // TODO Auto-generated method stub 131 GC gc = e.gc; 132 //gc.d 133 //drawBackground(e.gc, e.x, e.y, e.width, e.height); 134 setColors(); 135 gc.setBackground(borderColor); 136 gc.fillOval(2,2,e.width-3,e.height-3); 137 gc.setBackground(innerColor); 138 int dx = (e.width+1) / 2; //size of inner point, calculate 1 if width = 1,2 139 int dy = (e.height+1) / 2; //size of inner point, calculate 1 if height = 1,2 140 int x1 = (e.width - dx) /2 +1; 141 int y1 = (e.height - dy) /2 +1; 142 gc.fillOval(x1,y1, dx, dy); 143 //gc.setForeground(borderColor); 144 //gc.setLineWidth(3); 145 //gc.drawOval(2,2,e.width-3,e.height-3); 146 } 147 }; 148 149 150 void XXXsetBorderColor(int color) 151 { 152 borderColor = mng.propertiesGuiSwt.colorSwt(color); 153 redraw(); 154 } 155 156 void XXXsetInnerColor(int color) 157 { 158 innerColor = mng.propertiesGuiSwt.colorSwt(color); 159 redraw(); 160 } 161 162 void XXXsetColor(int color) 163 { 164 borderColor = innerColor = mng.propertiesGuiSwt.colorSwt(color); 165 redraw(); 166 } 167 168 void XXXsetColor(String sColor) 169 { 170 borderColor = innerColor = mng.propertiesGuiSwt.color(sColor); 171 redraw(); 172 } 173 174 175 void XXXsetColor(int nBorderColor, int nInnerColor) 176 { 177 borderColor = mng.propertiesGuiSwt.colorSwt(nBorderColor); 178 innerColor = mng.propertiesGuiSwt.colorSwt(nInnerColor); 179 redraw(); 180 } 181 182 183 } 184 185 @Override public GralRectangle getPixelPositionSize(){ return wdgh.getPixelPositionSize(); } 186 187 188 @Override 189 public void removeWidgetImplementation() 190 { if(widgSwt !=null){ 191 widgSwt.dispose(); 192 widgSwt = null; 193 } 194 } 195 196 @Override 197 public boolean setFocusGThread() 198 { return widgSwt.setFocus(); 199 } 200 201 @Override public void setVisibleGThread(boolean bVisible) { super.setVisibleState(bVisible); wdgh.setVisibleGThread(bVisible); } 202 203 204 @Override public void repaintGthread(){ 205 widgSwt.redraw(); 206 } 207 208 209 @Override 210 public Object getWidgetImplementation() 211 { 212 return widgSwt; 213 } 214 215 216 217 @Override 218 public void setBoundsPixel(int x, int y, int dx, int dy) 219 { 220 // TODO Auto-generated method stub 221 222 } 223 224 //@Override 225 public GralColor XXXsetForegroundColor(GralColor color) 226 { 227 // TODO Auto-generated method stub 228 return null; 229 } 230}