class ui.SerialUi

class SerialUi {
    // enums

    enum Defaults;
    bitflag enum ItemId;

    // fields

    ui.ComboBox* m_baudRateCombo;
    ui.ComboBox* m_dataBitsCombo;
    ui.ComboBox* m_parityCombo;
    ui.ComboBox* m_stopBitsCombo;
    ui.ComboBox* m_flowControlCombo;
    ui.Action* m_dtrAction;
    ui.Action* m_rtsAction;
    ui.Action* m_breakConditionAction;
    ui.ComboProperty* m_baudRateProp;
    ui.EnumProperty* m_dataBitsProp;
    ui.EnumProperty* m_parityProp;
    ui.EnumProperty* m_stopBitsProp;
    ui.EnumProperty* m_flowControlProp;
    ui.BoolProperty* m_dtrProp;
    ui.BoolProperty* m_rtsProp;
    ui.BoolProperty* m_breakConditionProp;
    static ui.EnumPropertyOption const m_baudRateTable[19] = {  { "110 bps" },  { "300 bps" },  { "600 bps" },  { "1200 bps" },  { "2400 bps" },  { "4800 bps" },  { "9600 bps" },  { "14400 bps" },  { "19200 bps" },  { "38400 bps" },  { "56000 bps" },  { "57600 bps" },  { "115200 bps" },  { "128000 bps" },  { "153600 bps" },  { "230400 bps" },  { "256000 bps" },  { "460800 bps" },  { "921600 bps" },  };
    static ui.EnumPropertyOption const m_dataBitsTable[2] = {  { "7 bits", 7 },  { "8 bits", 8 },  };
    static ui.EnumPropertyOption const m_stopBitsTable[3] = {  { "1 bit",    io.SerialStopBits._1 },  { "1.5 bits", io.SerialStopBits._15 },  { "2 bits",   io.SerialStopBits._2 },  };
    static ui.EnumPropertyOption const m_parityTable[5] = {  { "None",  io.SerialParity.None },  { "Odd",   io.SerialParity.Odd },  { "Even",  io.SerialParity.Even },  { "Mark",  io.SerialParity.Mark },  { "Space", io.SerialParity.Space },  };
    static ui.EnumPropertyOption const m_flowControlTable[3] = {  { "None",     io.SerialFlowControl.None },  { "RTS/CTS",  io.SerialFlowControl.RtsCts },  { "XON/XOFF", io.SerialFlowControl.XonXoff },  };

    // properties

    uint_t property m_baudRate;
    uint_t property m_dataBits;
    io.SerialParity property m_parity;
    io.SerialStopBits property m_stopBits;
    io.SerialFlowControl property m_flowControl;
    bool property m_dtr;
    bool property m_rts;
    bool property m_breakCondition;

    // methods

    void createForm(
        ui.FormLayout* layout,
        ui.SerialUi.ItemId mask = ItemId.All
    );

    void createProperties(
        ui.PropertyGrid* propertyGrid,
        ui.GroupProperty* groupProp = null,
        ui.SerialUi.ItemId mask = ItemId.All
    );

    void load(doc.Storage* storage);
    void save(doc.Storage* storage);
    void updateProperties();
    void applyProperties();
    void restoreDefaultProperties();
};