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}