001package jmri.jmrit.logixng.util; 002 003import java.nio.charset.Charset; 004import java.nio.charset.StandardCharsets; 005import java.util.*; 006 007import javax.annotation.Nonnull; 008 009import jmri.*; 010import jmri.jmrit.logixng.*; 011import jmri.jmrit.logixng.implementation.AbstractBase; 012import jmri.jmrit.logixng.util.parser.ParserException; 013 014/** 015 * Select a charset for LogixNG actions and expressions. 016 * 017 * @author Daniel Bergqvist (C) 2023 018 */ 019public class LogixNG_SelectCharset { 020 021 public static final List<Charset> STANDARD_CHARSETS = getStandardCharsets(); 022 023 private final AbstractBase _base; 024 private final InUse _inUse; 025 026 private Addressing _addressing = Addressing.Standard; 027 private Charset _standardValue = StandardCharsets.UTF_8; 028 private Charset _allValue = StandardCharsets.UTF_8; 029 private final LogixNG_SelectString _selectUserSpecifiedCharset; 030 031 032 public LogixNG_SelectCharset(AbstractBase base) { 033 _base = base; 034 _inUse = () -> _addressing == Addressing.UserSpecified; 035 _selectUserSpecifiedCharset = new LogixNG_SelectString(base, _inUse); 036 } 037 038 private static List<Charset> getStandardCharsets() { 039 List<Charset> standardCharsets = new ArrayList<>(); 040 standardCharsets.add(StandardCharsets.US_ASCII); 041 standardCharsets.add(StandardCharsets.ISO_8859_1); 042 standardCharsets.add(StandardCharsets.UTF_8); 043 standardCharsets.add(StandardCharsets.UTF_16); 044 standardCharsets.add(StandardCharsets.UTF_16BE); 045 standardCharsets.add(StandardCharsets.UTF_16LE); 046 return Collections.unmodifiableList(standardCharsets); 047 } 048 049 public void copy(LogixNG_SelectCharset copy) throws ParserException { 050 copy.setAddressing(_addressing); 051 copy.setStandardValue(_standardValue); 052 copy.setAllValue(_standardValue); 053 _selectUserSpecifiedCharset.copy(copy._selectUserSpecifiedCharset); 054 } 055 056 public void setAddressing(@Nonnull Addressing addressing) { 057 this._addressing = addressing; 058 } 059 060 public Addressing getAddressing() { 061 return _addressing; 062 } 063 064 public void setStandardValue(@Nonnull Charset charset) { 065 _base.assertListenersAreNotRegistered(log, "setStandardValue"); 066 _standardValue = charset; 067 } 068 069 public Charset getStandardValue() { 070 return _standardValue; 071 } 072 073 public void setAllValue(@Nonnull Charset charset) { 074 _base.assertListenersAreNotRegistered(log, "setListValue"); 075 _allValue = charset; 076 } 077 078 public Charset getAllValue() { 079 return _allValue; 080 } 081 082 public LogixNG_SelectString getSelectUserSpecified() { 083 return _selectUserSpecifiedCharset; 084 } 085 086 public Charset evaluateCharset(ConditionalNG conditionalNG) throws JmriException { 087 088 switch (_addressing) { 089 case Standard: 090 return _standardValue; 091 092 case All: 093 return _standardValue; 094 095 case UserSpecified: 096 String charsetName = _selectUserSpecifiedCharset.evaluateValue(conditionalNG); 097 return Charset.forName(charsetName); 098 099 default: 100 throw new IllegalArgumentException("_addressing has unknown value: "+_addressing.name()); 101 } 102 } 103 104 public String getDescription(Locale locale) { 105 return "ERROR !!!!"; 106/* 107 String enumName; 108 109 String memoryName; 110 if (_memoryHandle != null) { 111 memoryName = _memoryHandle.getName(); 112 } else { 113 memoryName = Bundle.getMessage(locale, "BeanNotSelected"); 114 } 115 116 switch (_addressing) { 117 case Direct: 118 enumName = Bundle.getMessage(locale, "AddressByDirect", _value); 119 break; 120 121 case Reference: 122 enumName = Bundle.getMessage(locale, "AddressByReference", _reference); 123 break; 124 125 case Memory: 126 enumName = Bundle.getMessage(locale, "AddressByMemory", memoryName); 127 break; 128 129 case LocalVariable: 130 enumName = Bundle.getMessage(locale, "AddressByLocalVariable", _localVariable); 131 break; 132 133 case Formula: 134 enumName = Bundle.getMessage(locale, "AddressByFormula", _formula); 135 break; 136 137 case Table: 138 enumName = Bundle.getMessage( 139 locale, 140 "AddressByTable", 141 _selectTable.getTableNameDescription(locale), 142 _selectTable.getTableRowDescription(locale), 143 _selectTable.getTableColumnDescription(locale)); 144 break; 145 146 default: 147 throw new IllegalArgumentException("invalid _addressing: " + _addressing.name()); 148 } 149 return enumName; 150*/ 151 } 152 153 /** 154 * Register listeners if this object needs that. 155 */ 156 public void registerListeners() { 157 } 158 159 /** 160 * Unregister listeners if this object needs that. 161 */ 162 public void unregisterListeners() { 163 } 164 165 166 public enum Addressing { 167 168 Standard(Bundle.getMessage("LogixNG_SelectCharset_Addressing_Standard")), 169 All(Bundle.getMessage("LogixNG_SelectCharset_Addressing_All")), 170 UserSpecified(Bundle.getMessage("LogixNG_SelectCharset_Addressing_UserSpecified")); 171 172 private final String _text; 173 174 private Addressing(String text) { 175 this._text = text; 176 } 177 178 @Override 179 public String toString() { 180 return _text; 181 } 182 183 } 184 185 186 private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogixNG_SelectCharset.class); 187}