private void InicializaSimbolosFixosDaLinha()
        {
            // Inicio de Linha
            simboloInicioLinha.setCI(CodigosInterpretaveis.INICIO_DA_LINHA);
            simboloInicioLinha.TabStop = true;

            // Fim de Linha
            simboloFimLinha.setCI(CodigosInterpretaveis.FIM_DA_LINHA);
            simboloFimLinha.TabStop = false;

            // Desenho de fundo da Linha
            simboloDesenhoFundo.setCI(CodigosInterpretaveis.LINHA_DE_FUNDO);
            simboloDesenhoFundo.TabStop = false;


            ///////////////////////////////////////

            // Inicio de linha
            simboloInicioLinha.linhaAtual = this;
            simboloInicioLinha.Parent     = this.frmDiag;
            simboloInicioLinha.CreateControl();
            simboloInicioLinha.BringToFront();

            // Fim de linha de linha
            simboloFimLinha.linhaAtual = this;
            simboloFimLinha.Parent     = this.frmDiag;
            simboloFimLinha.CreateControl();
            simboloFimLinha.BringToFront();



            InsereSimboloDireto(this.simbolos, this.simboloInicioLinha, linhaBase.simbolos);
            InsereSimboloDireto(this.saida, this.simboloInicioLinha, linhaBase.saida);

            // Desenho de fundo da linha
            simboloDesenhoFundo.linhaAtual = this;
            simboloDesenhoFundo.SendToBack();
            simboloDesenhoFundo.Parent = this.frmDiag;
            simboloDesenhoFundo.CreateControl();
            simboloDesenhoFundo.SendToBack();
            /// Desabilito o desenho de fundo para evitar que um clique do mouse
            /// sobre partes dele faca com que a tela seja movida para o primeiro
            /// controle.
            simboloDesenhoFundo.Enabled = false;

            AtribuiFuncoesAosControles();
        }
        public bool ApagaSimbolos(ControleLivre _aSerApagado)
        {
            int _indicePosInicial = 0;
            int _indicePosFinal   = 0;
            int _auxSaida         = 0;
            List <ControleLivre> _lstCLDeletar = new List <ControleLivre>();
            List <ControleLivre> _lstCL        = null;
            List <SimboloBasico> _lstSB        = null;
            ControleLivre        _cLAMudarCI   = null;

            if (!simbolos.Contains(_aSerApagado))
            {
                if (!saida.Contains(_aSerApagado))
                {
                    return(false);
                }
                else
                {
                    _lstCL = this.saida;
                    _lstSB = linhaBase.saida;

                    /// caso haja um paralelo na saida
                    /// deleta a linha do paralelo
                    switch (_aSerApagado.getCI())
                    {
                    case CodigosInterpretaveis.PARALELO_INICIAL:
                    case CodigosInterpretaveis.PARALELO_FINAL:
                    case CodigosInterpretaveis.PARALELO_PROXIMO:
                        break;

                    default:
                        if (this.saida.Count > 1)
                        {
                            _auxSaida    = this.saida.IndexOf(_aSerApagado);
                            _aSerApagado = this.saida[_auxSaida - 1];
                        }
                        break;
                    }
                }
            }
            else
            {
                _lstCL = this.simbolos;
                _lstSB = linhaBase.simbolos;
            }

            switch (_aSerApagado.getCI())
            {
            case CodigosInterpretaveis.PARALELO_INICIAL:
            case CodigosInterpretaveis.PARALELO_PROXIMO:
                _indicePosInicial = _lstCL.IndexOf(_aSerApagado);
                _indicePosFinal   = _lstCL.IndexOf(_aSerApagado.Aponta2proxPP);

                _indicePosFinal--;

                switch (_aSerApagado.getCI())
                {
                case CodigosInterpretaveis.PARALELO_INICIAL:
                    if (_aSerApagado.Aponta2proxPP.Aponta2proxPP.Aponta2PI != null)
                    {
                        _lstCLDeletar.Add(_aSerApagado.Aponta2proxPP.Aponta2proxPP);
                        _indicePosFinal++;
                    }
                    else
                    {
                        _cLAMudarCI = _aSerApagado.Aponta2proxPP;
                    }
                    break;

                case CodigosInterpretaveis.PARALELO_PROXIMO:
                    if (_aSerApagado.Aponta2proxPP.Aponta2PI != null)
                    {
                        if (_aSerApagado.Aponta2proxPP.Aponta2PI.Aponta2proxPP.Equals(_aSerApagado))
                        {
                            _lstCLDeletar.Add(_aSerApagado.Aponta2proxPP.Aponta2PI);
                            _indicePosFinal++;
                        }
                        //else
                        //_aSerApagado.Aponta2proxPP.setCI(CodigosInterpretaveis.PARALELO_FINAL);
                    }
                    break;
                }
                break;

            case CodigosInterpretaveis.PARALELO_FINAL:
                _indicePosFinal   = _lstCL.IndexOf(_aSerApagado);
                _indicePosInicial = _lstCL.IndexOf(_aSerApagado.Aponta2PI);
                break;

            default:
                _indicePosInicial = _lstCL.IndexOf(_aSerApagado);
                _indicePosFinal   = _indicePosInicial;
                break;
            }

            /// levanta os controles a serem deletados
            for (int i = _indicePosInicial; i <= _indicePosFinal; i++)
            {
                _lstCLDeletar.Add(_lstCL[i]);
            }

            /// deleta um a um
            foreach (ControleLivre _cLADeletar in _lstCLDeletar)
            {
                ApagaSimbolo(_lstCL, _lstSB, _cLADeletar);
            }

            if (_cLAMudarCI != null)
            {
                _cLAMudarCI.setCI(CodigosInterpretaveis.PARALELO_INICIAL);
            }

            return(true);
        }