001//==JZcmd== 002//JZcmd Obj a = java org.vishia.gral.widget.GralColorSelector.todo(); 003//==endJZcmd== 004 005package org.vishia.gral.widget; 006 007import org.vishia.gral.base.GralButton; 008import org.vishia.gral.base.GralPos; 009import org.vishia.gral.ifc.GralColor; 010import org.vishia.gral.ifc.GralMngBuild_ifc; 011import org.vishia.gral.ifc.GralUserAction; 012import org.vishia.gral.ifc.GralWidget_ifc; 013import org.vishia.gral.ifc.GralWindow_ifc; 014import org.vishia.util.KeyCode; 015 016/**This class creates a window with buttons for selecting colors. 017 * The window may be created permanently but hided. On calling {@link #openDialog(String, GralUserAction)} 018 * the window is placed in foreground in a concurrently mode. 019 * The user have to implement a instance of {@link GralColorSelector.SetColorIfc}. This interface instance 020 * is used as parameter for {@link #openDialog(String, SetColorIfc)} to receive the color. The user should show 021 * its graphic with the selected color immediately to see the effect in the users context. 022 * @author Hartmut Schorrig 023 * 024 */ 025public class GralColorSelector 026{ 027 028 /**Version, history and license. The version number is a date written as yyyymmdd as decimal number. 029 * Changes: 030 * <ul> 031 * <li>2013-04-15 Hartmut create new 032 * </ul> 033 * <br><br> 034 * 035 * <b>Copyright/Copyleft</b>: 036 * For this source the LGPL Lesser General Public License, 037 * published by the Free Software Foundation is valid. 038 * It means: 039 * <ol> 040 * <li> You can use this source without any restriction for any desired purpose. 041 * <li> You can redistribute copies of this source to everybody. 042 * <li> Every user of this source, also the user of redistribute copies 043 * with or without payment, must accept this license for further using. 044 * <li> But the LPGL ist not appropriate for a whole software product, 045 * if this source is only a part of them. It means, the user 046 * must publish this part of source, 047 * but don't need to publish the whole source of the own product. 048 * <li> You can study and modify (improve) this source 049 * for own using or for redistribution, but you have to license the 050 * modified sources likewise under this LGPL Lesser General Public License. 051 * You mustn't delete this Copyright/Copyleft inscription in this source file. 052 * </ol> 053 * If you are intent to use this sources without publishing its usage, you can get 054 * a second license subscribing a special contract with the author. 055 * 056 * @author Hartmut Schorrig = hartmut.schorrig@vishia.de 057 */ 058 //@SuppressWarnings("hiding") 059 public final static int version = 20130415; 060 061 062 063 064 String[][] colors = { 065 { "pma", "prd", "por", "pye", "pam", "pgn", "pcy", "pbl", "pmv", "pgr", "lgr"} 066 , { "lma", "lrd", "lor", "lye", "lam", "lgn", "lcy", "lbl", "lmv", "gr", "dgr"} 067 , { "Ma1", "Ma2", "Rd1", "Rd2", "Rd3", "Ye1", "Ye2", "Ye3", "Ye4", "Gn1", "Gn2", "Gn3", "Gn4", "Cy1", "Cy2", "Cy3", "Bl1", "Bl2", "Bl3"} 068 , { "sMa1", "sMa2", "sRd1", "sRd2", "sRd3", "sYe1", "sYe2", "sYe3", "sYe4", "sGn1", "sGn2", "sGn3", "sGn4", "sCy1", "sCy2", "sCy3", "sBl1", "sBl2", "sBl3"} 069 , { "ma", "rp", "rd", "or", "am", "ye", "ygn", "lm", "gn", "sgn", "cy", "bl", "vi", "gr", "pbk", "lbk"} 070 , { "dma", "pu", "pk", "or", "am", "sye", "fgn", "sg2", "scy", "dbl", "vi", "dgr", "lbk"} 071 , { "dma", "pu", "pk", "dye", "wh", "dgn", "dcy", "dbl", "vi", "dgr", "lbk"} 072 , { "wh", "drd", "bn", "bk"} 073 }; 074 075 076 private final GralWindow_ifc wind; 077 078 SetColorIfc callback; 079 080 /**Creates the dialog window to select colors. This window may be created only one time 081 * for some functionality, if the application is attempt to open only one color selection dialog. 082 * Use {@link #openDialog(String, SetColorIfc)} to open the window and specify the destination for selecting colors. 083 * @return The created window. 084 */ 085 public GralColorSelector(String name, GralMngBuild_ifc mng){ 086 mng.selectPanel("primaryWindow"); 087 mng.setPosition(-24, 0, -67, 0, 1, 'r'); //right bottom, about half less display width and hight. 088 wind = mng.createWindow("windSelectColor", "select file", GralWindow_ifc.windConcurrently | GralWindow_ifc.windResizeable ); 089 for(int irow=0; irow <= 5 /*colors.length*/; ++irow){ 090 //String[] colorRow = colors[irow]; 091 mng.setPosition(0.5f + 4*irow, GralPos.size + 2.5f, 0, GralPos.size + 3.5f, 0, 'r', 0.5f); 092 for(int ix=0; ix < 19 /*colorRow.length*/; ++ix){ 093 //String sColor = colorRow[ix]; 094 GralColor color = GralColor.getStdColor(irow, ix); 095 String sColor = color.getColorName(); 096 GralButton btn = mng.addButton("", actionSelect_, sColor); 097 btn.setBackColor(color, 0); 098 if(irow >=3){ 099 btn.setLineColor(GralColor.getColor("wh"), 0); 100 } 101 } 102 mng.setPosition(0.5f + 4*irow + 2.6f, GralPos.size + 1.2f, 0, GralPos.size + 3.5f, 0, 'r', 0.5f); 103 for(int ix=0; ix < 19 /*colorRow.length*/; ++ix){ 104 GralColor color = GralColor.getStdColor(irow, ix); 105 int colorValue = color.getColorValue(); 106 String sColorValue = String.format("%06x", new Integer(colorValue)); 107 mng.addText(sColorValue); 108 } 109 } 110 // mng.setPosition(0.5f + 3*irow, 3, 0, GralPos.size + 2.5f, 0, 'r', 0.5f); 111 112 } 113 114 115 /**Opens the window with the given title. The window is non-exclusive. 116 * @param sTitle The title of the window 117 * @param actionSelect called method on press any color button. 118 */ 119 public void openDialog(String sTitle, SetColorIfc actionSelect){ 120 wind.setTitle(sTitle); 121 callback = actionSelect; 122 wind.setFocus(); //setWindowVisible(true); 123 } 124 125 126 /**Action for a color button. It calls {@link #callback}*/ 127 private final GralUserAction actionSelect_ = new GralUserAction("GralColorSelector-select"){ 128 @Override public boolean exec(int actionCode, GralWidget_ifc widgd, Object... params){ 129 if(KeyCode.isControlFunctionMouseUpOrMenu(actionCode)){ 130 GralButton widg = (GralButton)widgd; 131 if(callback !=null){ 132 GralColor color = widg.getBackColor(0); 133 callback.setColor(color, SetColorFor.line); 134 } 135 return true; 136 } else return false; 137 } 138 }; 139 140 141 /**Enumeration to specify what's color is changed. */ 142 public enum SetColorFor{ 143 back, line, text 144 } 145 146 /**The user can build some instances with this interface. 147 * A anonymous inner class is recommended in form: 148 * <pre> 149 public GralColorSelector.SetColorIfc actionColorSet = new GralColorSelector.SetColorIfc(){ 150 @Override public void setColor(GralColor color, SetColorFor what) { 151 switch(what){ 152 case SetColorFor.back: { 153 //do something for show the line 154 } break; 155 case SetColorFor.line: { 156 //do something for show the line 157 } break; 158 case SetColorFor.text: { 159 //do something for show the line 160 } break; 161 }//switch 162 } }; 163 * </pre> 164 * In that routine the widget which should be changed may be chosen by the users algorithm maybe depending 165 * by selecting any widget or other mode. So the GralColorSelector-window may remain open to change 166 * the colors of some parts one after another in a simple way. 167 */ 168 public interface SetColorIfc{ 169 void setColor(GralColor color, SetColorFor what); 170 } 171 172 173}