Página principal   Módulos   Lista de namespaces   Hierarquia de classes   Lista de componentes   Lista de ficheiros   Membros do namespace   Componentes membro   Ficheiros membro   Páginas relacionadas  

ecra.H

Ir para a documentação deste ficheiro.
00001 
00023 #ifndef SLANG_ECRA_H
00024 #define SLANG_ECRA_H
00025 
00026 #include <string>
00027 #include <vector>
00028 #include <iostream>
00029 #include <limits>
00030 
00031 #include <Slang++/teclado.H>
00032 
00033 namespace Slang {
00034 
00040     // Declaração de classe definida mais abaixo.
00041     class Dimensao;
00042 
00043 
00069     class Posicao {
00070     public:
00072 
00073 
00080         explicit Posicao(int const linha = 0, 
00081                          int const coluna = 0);
00082 
00084 
00086 
00087 
00093         int linha() const;
00094 
00100         int coluna() const;
00101 
00103 
00105 
00106 
00113         void mudaLinhaPara(int const nova_linha);
00114 
00121         void mudaColunaPara(int const nova_coluna);
00122 
00124 
00126 
00127 
00139         explicit Posicao(std::istream& entrada);
00140 
00151         void carregaDe(std::istream& entrada);
00152 
00160         void guardaEm(std::ostream& saida) const;
00161 
00163 
00165 
00166 
00173         Posicao& operator+=(Dimensao const& deslocamento);
00174 
00181         Posicao& operator-=(Dimensao const& deslocamento);
00182 
00184 
00185     private:
00186         int linha_;
00187         int coluna_;
00188 
00194         bool cumpreInvariante() const;
00195     };
00196 
00206     Posicao const operator+(Posicao posicao, 
00207                             Dimensao const& deslocamento);
00208 
00218     Posicao const operator-(Posicao posicao, 
00219                             Dimensao const& deslocamento);
00220 
00230     Posicao const operator+(Dimensao const& deslocamento,
00231                             Posicao posicao);
00232 
00243     Posicao const operator-(Dimensao const& deslocamento,
00244                             Posicao const& posicao);
00245 
00255     Dimensao const operator-(Posicao const& destino,
00256                              Posicao const& origem);
00257 
00266     Posicao const operator-(Posicao const& posicao);
00267 
00277     bool operator==(Posicao const& uma_posicao, 
00278                     Posicao const& outra_posicao);
00279 
00289     bool operator!=(Posicao const& uma_posicao, 
00290                     Posicao const& outra_posicao);
00291 
00292 
00308     class Dimensao {
00309     public:
00311 
00312 
00320         explicit Dimensao(int const numero_de_linhas = 0, 
00321                           int const numero_de_colunas = 0);
00322 
00333         explicit Dimensao(Posicao const& posicao);
00334 
00336 
00338 
00340 
00347         int numeroDeLinhas() const;
00348 
00355         int numeroDeColunas() const;
00356 
00358 
00360 
00362 
00370         bool eCanonica() const;
00371 
00373 
00375 
00376 
00383         void mudaNumeroDeLinhasPara(int const novo_numero_de_linhas);
00384 
00391         void mudaNumeroDeColunasPara(int const novo_numero_de_colunas);
00392 
00394 
00396 
00397 
00409         explicit Dimensao(std::istream& entrada);
00410 
00423         void carregaDe(std::istream& entrada);
00424 
00432         void guardaEm(std::ostream& saida) const;
00433 
00435 
00437 
00438 
00448         Dimensao& operator+=(Dimensao const& dimensao);
00449 
00459         Dimensao& operator-=(Dimensao const& dimensao);
00460 
00462 
00463     private:
00469         bool cumpreInvariante() const;
00470 
00471         int numero_de_linhas;
00472         int numero_de_colunas;
00473     };
00474 
00484     Dimensao const operator+(Dimensao uma_dimensao, 
00485                              Dimensao const& outra_dimensao);
00486 
00496     Dimensao const operator-(Dimensao uma_dimensao, 
00497                              Dimensao const& outra_dimensao);
00498 
00507     Dimensao const operator-(Dimensao const& dimensao);
00508 
00518     bool operator==(Dimensao const& uma_dimensao, 
00519                     Dimensao const& outra_dimensao);
00520 
00530     bool operator!=(Dimensao const& uma_dimensao, 
00531                     Dimensao const& outra_dimensao);
00532 
00533 
00556     class Caixa {
00557     public:
00559 
00560 
00571         explicit Caixa(Posicao const& origem = Posicao(), 
00572                        Dimensao const& dimensao = Dimensao());
00573 
00583         explicit Caixa(Posicao const& origem, 
00584                        Posicao const& extremo);
00585 
00587         
00589 
00590 
00597         Posicao const& origem() const;
00598 
00605         Posicao extremo() const;
00606 
00612         Dimensao const& dimensao() const;
00613 
00615 
00617 
00618 
00625         bool eVazia() const;
00626 
00633         bool eCanonica() const;
00634 
00644         bool contem(Posicao const& posicao) const;
00645 
00653         bool bordaContem(Posicao const& posicao) const;
00654 
00656 
00658 
00659 
00667         void mudaOrigemPara(Posicao const& nova_origem);
00668 
00677         void mudaExtremoPara(Posicao const& novo_extremo);
00678 
00686         void mudaDimensaoPara(Dimensao const& nova_dimensao);
00687 
00689 
00691 
00692 
00703         explicit Caixa(std::istream& entrada);
00704 
00717         void carregaDe(std::istream& entrada);
00718 
00726         void guardaEm(std::ostream& saida) const;
00727 
00729 
00731 
00732 
00738         Caixa& operator+=(Dimensao const& deslocamento);
00739 
00745         Caixa& operator-=(Dimensao const& deslocamento);
00746 
00758         Caixa& operator+=(Caixa const& outra_caixa);
00759 
00776         Caixa& operator*=(Caixa const& outra_caixa);
00777 
00779 
00780     private:
00786         bool cumpreInvariante() const;
00787 
00788         Posicao origem_;
00789         Dimensao dimensao_;
00790     };
00791 
00803     Caixa const operator+(Caixa caixa, Dimensao const& deslocamento);
00804 
00816     Caixa const operator-(Caixa caixa, Dimensao const& deslocamento);
00817 
00829     Caixa const operator+(Dimensao const& deslocamento, Caixa caixa);
00830 
00845     Caixa const operator+(Caixa uma_caixa, Caixa const& outra_caixa);
00846 
00864     Caixa const operator*(Caixa uma_caixa, Caixa const& outra_caixa);
00865 
00874     bool operator==(Caixa const& uma_caixa, Caixa const& outra_caixa);
00875 
00884     bool operator!=(Caixa const& uma_caixa, Caixa const& outra_caixa);
00885 
00889 
00897     Caixa const caixa_vazia = Caixa();
00898 
00905     Caixa const caixa_universal = 
00906     Caixa(Posicao(std::numeric_limits<int>::min(),
00907                   std::numeric_limits<int>::min()), 
00908           Dimensao(std::numeric_limits<int>::max(),
00909                   std::numeric_limits<int>::max()));
00910 
00912 
00913 
00921     enum Cor {
00922         preto,                  
00923         primeira_cor = preto,        
00924         cinza,                  
00925         vermelho,               
00926         vermelho_brilhante,     
00927         verde,                  
00928         verde_brilhante,        
00929         castanho,               
00930         amarelo,                
00931         azul,                   
00932         azul_brilhante,         
00933         magenta,                
00934         magenta_brilhante,      
00935         ciano,                  
00936         ciano_brilhante,        
00937         cinzento_claro,         
00938         branco,                 
00939         ultima_cor = branco
00940     };
00941 
00945 
00952     std::ostream& operator<<(std::ostream& saida, Cor const cor);
00953 
00961     std::istream& operator>>(std::istream& entrada, Cor& cor);
00962 
00966     int const numero_de_cores = ultima_cor + 1;
00967 
00969 
00979     enum Simbolo {
00980         diamante = '`',
00981         tijolo,
00982         ht,
00983         ff,
00984         cr,
00985         lf,
00986         grau,
00987         mais_menos,
00988         nl,
00989         vt,
00990         canto_inferior_direito,
00991         canto_superior_direito,
00992         canto_superior_esquerdo,
00993         canto_inferior_esquerdo,
00994         cruzamento,
00995         traco_topo,
00996         traco_superior,
00997         traco_horizontal,
00998         traco_inferior,
00999         traco_base,
01000         encontro_direita,
01001         encontro_esquerda,
01002         encontro_cima,
01003         encontro_baixo,
01004         traco_vertical,
01005         menor_ou_igual,
01006         maior_ou_igual,
01007         pi,
01008         diferente
01009     };
01010 
01011 
01034     enum Justificacao {
01036         ao_centro,
01038         a_esquerda,
01040         a_direita
01041     };
01042 
01043 
01103     class Ecra {
01104     public:
01105         // A classe Manipulador será definida mais abaixo.
01106         class Manipulador;
01107 
01108         // A classe Troco será definida mais abaixo.
01109         class Troco;
01110 
01111         // A classe ObjectoCor será definida mais abaixo.
01112         class ObjectoCor;
01113 
01115 
01116 
01137         explicit Ecra(Cor cor_do_texto = branco, 
01138                       Cor cor_do_fundo = preto, 
01139                       bool limita_cursor_ao_ecra_real = false);
01140 
01145         ~Ecra();
01146 
01148 
01150 
01151 
01162         Dimensao const dimensao() const;
01163 
01171         Posicao const origem() const;
01172 
01181         Posicao const extremo() const;
01182 
01196         Posicao const posicaoDoCursor() const;
01197 
01203         Justificacao justificacaoActual() const;
01204 
01212         int larguraDaProximaOperacaoDeEscrita() const;
01213 
01215 
01217 
01218 
01242         bool foiRedimensionado() const;
01243 
01255         bool cursorEstaVisivel() const;
01256 
01264         bool parteVisivelContem(Posicao const& posicao) const;
01265 
01273         bool cursorEstaLimitadoAoEcraReal() const;
01274 
01281         bool cursorImovelNaProximaOperacaoDeInsercao() const;
01282 
01284 
01286 
01287 
01294         void mudaJustificacaoPara(Justificacao const nova_justificacao);
01295 
01302         void impoeImobilidadeDoCursorNaProximaInsercao();
01303 
01314         void mudaLarguraDaProximaOperacaoDeEscritaPara
01315         (int const largura_da_proxima_operacao_de_escrita);
01316 
01329         void mudaObjectoCorEmUsoPara(ObjectoCor const& 
01330                                      objecto_cor);
01331 
01343         void mudaObjectoCorEmUsoParaFundo();
01344 
01357         void mudaCoresDasCelulasDoFundoPara(Cor const cor_do_texto, 
01358                                             Cor const cor_do_fundo);
01359 
01367         void moveCursorPara(Posicao const& nova_posicao_do_cursor);
01368 
01376         void sobeCursor();
01377 
01385         void baixaCursor();
01386 
01394         void recuaCursor();
01395 
01403         void avancaCursor();
01404 
01417         void moveCursorDeAcordoCom(Tecla const& tecla);
01418 
01420 
01422 
01423 
01434         Troco const trocoDe(Caixa const& caixa) const;
01435 
01442         Troco const trocoDoEcraCompleto() const;
01443 
01451         Troco const trocoNoCursorCom(Dimensao const& dimensao) const;
01452 
01472         void cola(Troco const& troco, 
01473                   Posicao const& em = Posicao());
01474 
01476 
01478 
01479 
01488         void tocaCampainha() const;
01489 
01497         void apagaDoCursorAteOFimDaLinha(); 
01498 
01506         void apagaDoCursorAteOFim();
01507 
01513         void apaga();
01514 
01522         void refresca() const;
01523 
01535         void refrescaTudo() const;
01536 
01555         void desenha(Caixa const& caixa);
01556 
01572         void desenhaSegmentoHorizontalCom(int const largura);
01573 
01587         void desenhaSegmentoVerticalCom(int const altura);
01589 
01591 
01592 
01614         Ecra& operator<<(std::string const& cadeia);
01615 
01624         template <typename T>
01625         Ecra& operator<<(T const& valor);
01626 
01628 
01632 
01641         Ecra& operator<<(Caixa const& caixa);
01642 
01656         Ecra& operator<<(Simbolo const simbolo);
01657 
01682         Ecra& operator<<(Troco const& troco);
01683 
01685 
01687 
01688 
01699         Ecra const& operator>>(Troco& troco) const;
01700 
01702 
01708 
01722         Ecra& operator<<(Posicao const& nova_posicao_do_cursor);
01723 
01736         Ecra& operator<<(ObjectoCor const& objecto_cor);
01737 
01745         Ecra& operator<<(Justificacao const nova_justificacao);
01746 
01761         Ecra& operator<<(void manipulador(Ecra& ecra));
01762 
01764 
01765     private:
01766         bool cursor_esta_limitado_ao_ecra_real;
01767 
01768         mutable bool redimensionado_;
01769 
01770         bool cursor_imovel_na_proxima_operacao_de_escrita;
01771 
01772         Justificacao justificacao_actual;
01773 
01774         int largura_da_proxima_operacao_de_escrita;
01775 
01776         std::vector<int> ocupacao_dos_objectos;
01777 
01778         static bool ja_existe_instancia;
01779 
01780         // Variável alterada pelo manipulador do sinal SIGWINCH
01781         // (SIGnal WINdow CHanged):
01782         static volatile bool tamanho_do_ecra_real_mudou;
01783 
01784         static char *nome_de_cor_do_s_lang[numero_de_cores];
01785 
01786         // Assim ninguém pode invocar o construtor por cópia...
01787         Ecra(Ecra const&);
01788 
01789         // ...nem a atribuição por cópia:
01790         Ecra& operator = (Ecra const&);
01791 
01792         // Coloca atributos num dado objecto:
01793         void mudaCoresDe(int const objecto, 
01794                          Cor const cor_do_texto, Cor const cor_do_fundo);
01795 
01796         // Verifica se a dimensão do ecrã real sofreu alterações:
01797         void verificaRedimensionamento() const;
01798 
01799         // Só os membros da classe podem posicionar o cursor sem que
01800         // isso seja considerado uma alteração.  Quando o fizerem têm
01801         // de se responsabilizar por voltar a por o cursor na posição
01802         // original.
01803         void moveCursorPara(Posicao const& posicao) const;
01804 
01805         // Usados pelos objectos cor para reservar ou libertar um
01806         // lugar na palete:
01807         int reservaObjecto();
01808         void libertaObjecto(int const numero_do_objecto);
01809 
01810         // Manipulador do sinal SIGWINCH:
01811         static void manipuladorDeRedimensionamento(int sinal);
01812 
01818         bool cumpreInvariante() const;
01819 
01820         // Amizades:
01821         friend class ObjectoCor;
01822     };
01823 
01899     class Ecra::ObjectoCor {
01900     public:
01911         ObjectoCor(Cor const cor_do_texto, Cor const cor_do_fundo);
01912         
01917         ~ObjectoCor();
01918 
01920 
01921 
01927         Cor corDoTexto() const;
01928 
01934         Cor corDoFundo() const;
01935 
01937 
01939 
01940 
01947         void mudaCorDoTextoPara(Cor const nova_cor_do_texto);
01948 
01955         void mudaCorDoFundoPara(Cor const nova_cor_do_fundo);
01956 
01958 
01959     private:
01960         static int const numero_de_objectos_cor_no_s_lang = 256;
01961 
01962         // Não se podem copiar estes objectos!
01963         ObjectoCor(ObjectoCor const&);
01964         ObjectoCor& operator=(ObjectoCor const&);
01965 
01966         Cor cor_do_texto;
01967         Cor cor_do_fundo;
01968         int numero_do_objecto;  // entrada na palete.
01969 
01976         bool cumpreInvariante() const;
01977 
01978         // A classe Ecra precisa de aceder ao número do objecto:
01979         friend class Ecra;
01980     };
01981 
02006     class Ecra::Troco {
02007     public:
02016         explicit Troco(Dimensao const& dimensao);
02017 
02023         Dimensao dimensao() const;
02024 
02025     private:
02026         Dimensao dimensao_;
02027         std::vector<unsigned short> dados;
02028 
02035         bool cumpreInvariante() const;
02036 
02037         // A classe Ecra precisa de acesso a dados privados desta
02038         // classe.
02039         friend class Ecra;
02040     };
02041 
02042 
02049     extern Ecra ecra;
02050 
02051 
02052     // Classes auxiliares para manipuladores:
02053 
02057     struct ManipuladorDaLargura {
02058         explicit ManipuladorDaLargura(int const largura = 0); 
02059 
02060         int largura;
02061     };
02062     
02066     Ecra& operator<<(Ecra& ecra, 
02067                      ManipuladorDaLargura const& manipulador);
02068 
02073     struct ManipuladorDeDesenhoDeSegmento {
02074         explicit ManipuladorDeDesenhoDeSegmento(bool const e_horizontal, 
02075                                                 int const dimensao = 1); 
02076 
02077         bool e_horizontal;
02078         int dimensao;
02079     };
02080 
02085     Ecra& operator<<(Ecra& ecra, 
02086                      ManipuladorDeDesenhoDeSegmento const& manipulador);
02087 
02088 
02092 
02108     Posicao const cursor(int const linha, int const coluna);
02109 
02158     Posicao const& cursor(Posicao const& posicao);
02159 
02173     Caixa const caixa(int const linha, int const coluna, 
02174                       int const numero_de_linhas, int const numero_de_colunas);
02175 
02207     Caixa const caixa(Posicao const& origem = Posicao(), 
02208                       Dimensao const& dimensao = Dimensao());
02209     
02232     void fundo(Ecra& ecra);
02233 
02250     void parado(Ecra& ecra);
02251 
02272     void sobeCursor(Ecra& ecra);
02273 
02294     void baixaCursor(Ecra& ecra);
02295 
02300     void recuaCursor(Ecra& ecra);
02301 
02306     void avancaCursor(Ecra& ecra);
02307 
02326     ManipuladorDaLargura largura(int const largura);
02327 
02337     ManipuladorDeDesenhoDeSegmento segmento_horizontal(int const largura);
02338 
02347     ManipuladorDeDesenhoDeSegmento segmento_vertical(int const altura);
02348 
02364     void refresca(Ecra& ecra);
02365 
02374     void refresca_tudo(Ecra& ecra);
02375 
02388     void apaga(Ecra& ecra);
02389 
02403     void apaga_fim_da_linha(Ecra& ecra);
02404 
02417     void apaga_fim_do_ecra(Ecra& ecra);
02418 
02426     void campainha(Ecra& ecra);
02427 
02429 
02434     extern std::string const nomes_das_cores[numero_de_cores];
02435 }
02436 
02437 #include <Slang++/ecra_impl.H>
02438 
02439 #endif // SLANG_ECRA_H

Gerado em Tue Dec 3 15:19:34 2002 para Pacotes por doxygen1.3-rc1