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
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
01106 class Manipulador;
01107
01108
01109 class Troco;
01110
01111
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
01781
01782 static volatile bool tamanho_do_ecra_real_mudou;
01783
01784 static char *nome_de_cor_do_s_lang[numero_de_cores];
01785
01786
01787 Ecra(Ecra const&);
01788
01789
01790 Ecra& operator = (Ecra const&);
01791
01792
01793 void mudaCoresDe(int const objecto,
01794 Cor const cor_do_texto, Cor const cor_do_fundo);
01795
01796
01797 void verificaRedimensionamento() const;
01798
01799
01800
01801
01802
01803 void moveCursorPara(Posicao const& posicao) const;
01804
01805
01806
01807 int reservaObjecto();
01808 void libertaObjecto(int const numero_do_objecto);
01809
01810
01811 static void manipuladorDeRedimensionamento(int sinal);
01812
01818 bool cumpreInvariante() const;
01819
01820
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
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;
01969
01976 bool cumpreInvariante() const;
01977
01978
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
02038
02039 friend class Ecra;
02040 };
02041
02042
02049 extern Ecra ecra;
02050
02051
02052
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