001package org.vishia.gral.base; 002 003import org.vishia.gral.ifc.GralColor; 004import org.vishia.util.ObjectValue; 005 006public class GralLed extends GralWidget 007{ 008 /**Version and history 009 * <ul> 010 * <li>2016-11-22 bugfix: {@link #setValue(Object[])} with negative input causes an exception. Now a 3. color magenta was shown to see that failure. 011 * <li>2014-10-12 chg: now instantiable. New concept. 012 * <li>2012-04-01 new: {@link #colorBorder}, {@link #colorBorderSelectable}, {@link #setValue(Object[])} 013 * <li>2011-12-03 new Baseclass for LED visualization. 014 * It is the concept of specialized {@link GralWidget}. 015 * </ul> 016 * 017 * <b>Copyright/Copyleft</b>: 018 * For this source the LGPL Lesser General Public License, 019 * published by the Free Software Foundation is valid. 020 * It means: 021 * <ol> 022 * <li> You can use this source without any restriction for any desired purpose. 023 * <li> You can redistribute copies of this source to everybody. 024 * <li> Every user of this source, also the user of redistribute copies 025 * with or without payment, must accept this license for further using. 026 * <li> But the LPGL ist not appropriate for a whole software product, 027 * if this source is only a part of them. It means, the user 028 * must publish this part of source, 029 * but don't need to publish the whole source of the own product. 030 * <li> You can study and modify (improve) this source 031 * for own using or for redistribution, but you have to license the 032 * modified sources likewise under this LGPL Lesser General Public License. 033 * You mustn't delete this Copyright/Copyleft inscription in this source file. 034 * </ol> 035 * If you are intent to use this sources without publishing its usage, you can get 036 * a second license subscribing a special contract with the author. 037 * 038 * @author Hartmut Schorrig = hartmut.schorrig@vishia.de 039 * 040 * 041 */ 042 @SuppressWarnings("hiding") 043 static final public int version = 0x20111203; 044 045 /**Some given colors which can be selected by value calling {@link #setValue(Object[])} 046 * or {@link #setValue(float)}. 047 * 048 */ 049 private final GralColor[] colorBorderSelectable, colorInnerSelectable; 050 051 052 /**The colors which are used for repaint (if not null). */ 053 //protected GralColor colorBorder, colorInner; 054 055 /** 056 * @param name 057 * @param mng 058 * @deprecated use {@link #GralLed(String)} 059 */ 060 protected GralLed(String name, GralMng mng) 061 { super(name, 'D', mng); 062 colorBorderSelectable = new GralColor[3]; 063 colorBorderSelectable[0] = GralColor.getColor("ye"); 064 colorBorderSelectable[1] = GralColor.getColor("gn"); 065 colorBorderSelectable[2] = GralColor.getColor("ma"); //faulty showing color 066 colorInnerSelectable = new GralColor[3]; 067 colorInnerSelectable[0] = GralColor.getColor("wh"); 068 colorInnerSelectable[1] = GralColor.getColor("gn"); 069 colorInnerSelectable[2] = GralColor.getColor("ma"); //faulty showing color 070 setValue(0); //initializes dyda.colors 071 } 072 073 074 public GralLed(String name) 075 { this(name, null); 076 } 077 078 079 /**Sets the LED's color. The border can be another than the inner color. 080 * The effect of {@link #setValue(Object[])} is independent from this method. 081 * @param colorBorder assign to {@link GralWidget#setLineColor(GralColor, int)} or {@link GralWidget.DynamicData#lineColor}. 082 * @param colorInner assign to {@link GralWidget#setBackColor(GralColor, int)} {@link GralWidget.DynamicData#backColor}. 083 */ 084 public void setColor(GralColor colorBorder, GralColor colorInner){ 085 dyda.lineColor = colorBorder; 086 dyda.backColor = colorInner; 087 repaint(repaintDelay, repaintDelayMax); 088 } 089 090 /**Sets the color both inner and border with the given value 091 * using the {@link #colorInnerSelectable} 092 * @see org.vishia.gral.base.GralWidget#setValue(float) 093 */ 094 @Override public void setValue(float value){ 095 int ival = (int)value; 096 if(ival < 0){ ival = 0; } 097 else if(ival >= colorInnerSelectable.length){ ival = colorInnerSelectable.length -1;} 098 dyda.lineColor = dyda.backColor = colorInnerSelectable[ival]; 099 dyda.setChanged(ImplAccess.chgColorBack | ImplAccess.chgColorLine); 100 super.setValue(value); //stores and calls repaint. 101 } 102 103 104 /**This method is invoked if more as one variable is assigned to the widget. 105 * It sets the line and the back color which is the inner color (back) and border (line). 106 * The values should be integer-readable. 107 * @see org.vishia.gral.base.GralWidget#setValue(java.lang.Object[]) 108 */ 109 @Override public void setValue(Object[] values){ 110 if(values.length >=2){ 111 int val1 = ObjectValue.getInt(values[0]); //The index to the color 112 int val2 = ObjectValue.getInt(values[1]); 113 if(val1 >= colorBorderSelectable.length || val1 <0){ val1 = colorBorderSelectable.length -1; } //faulty index, use faulty showing color. 114 if(val2 >= colorInnerSelectable.length || val2 <0){ val2 = colorInnerSelectable.length -1; } 115 dyda.lineColor = colorBorderSelectable[val1]; 116 dyda.backColor = colorInnerSelectable[val2]; 117 dyda.setChanged(ImplAccess.chgColorBack | ImplAccess.chgColorLine); 118 super.setValue(values); //stores and calls repaint. 119 //repaint(repaintDelay, repaintDelayMax); 120 } 121 } 122 123 124 125 public abstract class GraphicImplAccess extends GralWidget.ImplAccess 126 implements GralWidgImpl_ifc 127 { 128 129 130 protected GraphicImplAccess(GralWidget widgg, GralMng mng) 131 { 132 super(widgg, mng); 133 } 134 135 protected GralWidget.DynamicData dyda(){ return dyda; } 136 } 137 138}