public WatchVariableControl(
            WatchVariableControlPrecursor watchVarPrecursor,
            string name,
            WatchVariable watchVar,
            WatchVariableSubclass subclass,
            Color?backgroundColor,
            Type displayType,
            int?roundingLimit,
            bool?useHex,
            bool?invertBool,
            bool?isYaw,
            Coordinate?coordinate,
            List <VariableGroup> groupList,
            List <uint> fixedAddresses)
        {
            // Initialize controls
            InitializeComponent();

            _tableLayoutPanel.BorderColor = Color.Red;
            _tableLayoutPanel.BorderWidth = 3;
            _nameTextBox.Text             = name;

            // Store the precursor
            WatchVarPrecursor = watchVarPrecursor;

            // Initialize main fields
            _varName    = name;
            GroupList   = groupList;
            _editMode   = false;
            _renameMode = false;
            IsSelected  = false;

            List <uint> copy1 = fixedAddresses == null ? null : new List <uint>(fixedAddresses);

            _defaultFixedAddressListGetter = () => copy1;
            List <uint> copy2 = fixedAddresses == null ? null : new List <uint>(fixedAddresses);

            FixedAddressListGetter = () => copy2;

            // Initialize color fields
            _initialBaseColor = backgroundColor ?? DEFAULT_COLOR;
            _baseColor        = _initialBaseColor;
            _currentColor     = _baseColor;
            _isFlashing       = false;
            _flashStartTime   = DateTime.Now;

            // Initialize flush/size fields
            _rightFlush         = true;
            _variableNameWidth  = 0;
            _variableValueWidth = 0;
            _variableHeight     = 0;
            _variableTextSize   = 0;
            _variableOffset     = 0;

            // Create watch var wrapper
            WatchVarWrapper = WatchVariableWrapper.CreateWatchVariableWrapper(
                watchVar, this, subclass, displayType, roundingLimit, useHex, invertBool, isYaw, coordinate);

            // Set whether to start as a checkbox
            SetUseCheckbox(WatchVarWrapper.StartsAsCheckbox());

            // Add functions
            _namePanel.Click       += (sender, e) => OnVariableClick();
            _namePanel.DoubleClick += (sender, e) => OnNameTextBoxDoubleClick();

            _nameTextBox.Click       += (sender, e) => OnVariableClick();
            _nameTextBox.DoubleClick += (sender, e) => OnNameTextBoxDoubleClick();
            _nameTextBox.Leave       += (sender, e) => { RenameMode = false; };
            _nameTextBox.KeyDown     += (sender, e) => OnNameTextValueKeyDown(e);

            _valueTextBox.Click       += (sender, e) => _watchVariablePanel.UnselectAllVariables();
            _valueTextBox.DoubleClick += (sender, e) => { EditMode = true; };
            _valueTextBox.KeyDown     += (sender, e) => OnValueTextValueKeyDown(e);
            _valueTextBox.Leave       += (sender, e) => { EditMode = false; };

            _valueCheckBox.Click += (sender, e) => OnCheckboxClick();

            MouseDown += ShowMainContextMenu;
            _valueTextBox.MouseDown += ShowMainContextMenu;
            _namePanel.MouseDown    += ShowMainContextMenu;
            _valuePanel.MouseDown   += ShowMainContextMenu;

            _nameTextBox.MouseDown += (sender, e) =>
            {
                if (e.Button == MouseButtons.Right)
                {
                    if (RenameMode)
                    {
                        ShowRenameContextMenu();
                    }
                    else
                    {
                        ShowContextMenu();
                    }
                }
            };

            _valueTextBox.ContextMenu = _nameTextBox.ContextMenu = DummyContextMenu;
        }