00001
00007 #include <cassert>
00008 #include <sstream>
00009 #include <algorithm>
00010
00011 extern "C" {
00012 #include <slang.h>
00013 #include <signal.h>
00014 }
00015
00016
00017
00018
00019 inline Slang::Posicao::Posicao(int linha, int coluna)
00020 : linha_(linha), coluna_(coluna)
00021 {
00022
00023 assert(cumpreInvariante());
00024 }
00025
00026 inline int Slang::Posicao::linha() const
00027 {
00028 assert(cumpreInvariante());
00029
00030 return linha_;
00031 }
00032
00033 inline int Slang::Posicao::coluna() const
00034 {
00035 assert(cumpreInvariante());
00036
00037 return coluna_;
00038 }
00039
00040 inline void Slang::Posicao::mudaLinhaPara(int nova_linha)
00041 {
00042 assert(cumpreInvariante());
00043
00044 linha_ = nova_linha;
00045
00046 assert(cumpreInvariante());
00047 }
00048
00049 inline void Slang::Posicao::mudaColunaPara(int nova_coluna)
00050 {
00051 assert(cumpreInvariante());
00052
00053 coluna_ = nova_coluna;
00054
00055 assert(cumpreInvariante());
00056 }
00057
00058 inline void Slang::Posicao::carregaDe(std::istream& entrada)
00059 {
00060 assert(cumpreInvariante());
00061
00062 *this = Posicao(entrada);
00063
00064 assert(cumpreInvariante());
00065 }
00066
00067 inline Slang::Posicao&
00068 Slang::Posicao::operator+=(Dimensao const& deslocamento)
00069 {
00070 assert(cumpreInvariante());
00071
00072 linha_ += deslocamento.numeroDeLinhas();
00073 coluna_ += deslocamento.numeroDeColunas();
00074
00075 assert(cumpreInvariante());
00076
00077 return *this;
00078 }
00079
00080 inline Slang::Posicao&
00081 Slang::Posicao::operator-=(Dimensao const& deslocamento)
00082 {
00083 assert(cumpreInvariante());
00084
00085 linha_ -= deslocamento.numeroDeLinhas();
00086 coluna_ -= deslocamento.numeroDeColunas();
00087
00088 assert(cumpreInvariante());
00089
00090 return *this;
00091 }
00092
00093 inline bool Slang::Posicao::cumpreInvariante() const
00094 {
00095 return true;
00096 }
00097
00098 inline Slang::Posicao const
00099 Slang::operator+(Slang::Posicao posicao, Slang::Dimensao const& deslocamento)
00100 {
00101 posicao += deslocamento;
00102
00103 return posicao;
00104 }
00105
00106 inline Slang::Posicao const
00107 Slang::operator-(Slang::Posicao posicao, Slang::Dimensao const& deslocamento)
00108 {
00109 return posicao -= deslocamento;
00110 }
00111
00112 inline Slang::Posicao const
00113 Slang::operator+(Slang::Dimensao const& deslocamento, Slang::Posicao posicao)
00114 {
00115 posicao += deslocamento;
00116
00117 return posicao;
00118 }
00119
00120 inline Slang::Posicao const
00121 Slang::operator-(Slang::Dimensao const& deslocamento,
00122 Slang::Posicao const& posicao)
00123 {
00124 Posicao copia(-posicao);
00125 copia += deslocamento;
00126
00127 return copia;
00128 }
00129
00130 inline Slang::Dimensao const
00131 Slang::operator-(Slang::Posicao const& destino, Slang::Posicao const& origem)
00132 {
00133 return Dimensao(destino.linha() - origem.linha(),
00134 destino.coluna() - origem.coluna());
00135 }
00136
00137 inline Slang::Posicao const Slang::operator-(Slang::Posicao const& posicao)
00138 {
00139 return Posicao(-posicao.linha(), -posicao.coluna());
00140 }
00141
00142 inline bool
00143 Slang::operator==(Slang::Posicao const& uma_posicao,
00144 Slang::Posicao const& outra_posicao)
00145 {
00146 return uma_posicao.linha() == outra_posicao.linha() and
00147 uma_posicao.coluna() == outra_posicao.coluna();
00148 }
00149
00150 inline bool
00151 Slang::operator!=(Slang::Posicao const& uma_posicao,
00152 Slang::Posicao const& outra_posicao)
00153 {
00154 return not (uma_posicao == outra_posicao);
00155 }
00156
00157
00158
00159
00160 inline Slang::Dimensao::Dimensao(int numero_de_linhas,
00161 int numero_de_colunas)
00162 : numero_de_linhas(numero_de_linhas),
00163 numero_de_colunas(numero_de_colunas)
00164 {
00165
00166 assert(cumpreInvariante());
00167 }
00168
00169 inline Slang::Dimensao::Dimensao(Posicao const& posicao)
00170 : numero_de_linhas(posicao.linha()),
00171 numero_de_colunas(posicao.coluna())
00172 {
00173
00174 assert(cumpreInvariante());
00175 }
00176
00177 inline int Slang::Dimensao::numeroDeLinhas() const
00178 {
00179 assert(cumpreInvariante());
00180
00181 return numero_de_linhas;
00182 }
00183
00184 inline int Slang::Dimensao::numeroDeColunas() const
00185 {
00186 assert(cumpreInvariante());
00187
00188 return numero_de_colunas;
00189 }
00190
00191 inline bool Slang::Dimensao::eCanonica() const
00192 {
00193 assert(cumpreInvariante());
00194
00195 return 0 <= numeroDeColunas() and 0 <= numeroDeLinhas();
00196 }
00197
00198 inline void
00199 Slang::Dimensao::mudaNumeroDeLinhasPara(int const novo_numero_de_linhas)
00200 {
00201 assert(cumpreInvariante());
00202
00203 numero_de_linhas = novo_numero_de_linhas;
00204
00205 assert(cumpreInvariante());
00206 }
00207
00208 inline void
00209 Slang::Dimensao::mudaNumeroDeColunasPara(int const novo_numero_de_colunas)
00210 {
00211 assert(cumpreInvariante());
00212
00213 numero_de_colunas = novo_numero_de_colunas;
00214
00215 assert(cumpreInvariante());
00216 }
00217
00218 inline void Slang::Dimensao::carregaDe(std::istream& entrada)
00219 {
00220 assert(cumpreInvariante());
00221
00222 *this = Dimensao(entrada);
00223
00224 assert(cumpreInvariante());
00225 }
00226
00227 inline Slang::Dimensao& Slang::Dimensao::operator+=(Dimensao const& dimensao)
00228 {
00229 assert(cumpreInvariante() and dimensao.cumpreInvariante());
00230
00231 numero_de_linhas += dimensao.numeroDeLinhas();
00232 numero_de_colunas += dimensao.numeroDeColunas();
00233
00234 assert(cumpreInvariante());
00235
00236 return *this;
00237 }
00238
00239 inline Slang::Dimensao& Slang::Dimensao::operator-=(Dimensao const& dimensao)
00240 {
00241 assert(cumpreInvariante() and dimensao.cumpreInvariante());
00242
00243 numero_de_linhas -= dimensao.numeroDeLinhas();
00244 numero_de_colunas -= dimensao.numeroDeColunas();
00245
00246 assert(cumpreInvariante());
00247
00248 return *this;
00249 }
00250
00251 inline bool Slang::Dimensao::cumpreInvariante() const
00252 {
00253 return true;
00254 }
00255
00256 inline Slang::Dimensao const Slang::operator+(Dimensao uma_dimensao,
00257 Dimensao const& outra_dimensao)
00258 {
00259 uma_dimensao += outra_dimensao;
00260
00261 return uma_dimensao;
00262 }
00263
00264 inline Slang::Dimensao const Slang::operator-(Dimensao uma_dimensao,
00265 Dimensao const& outra_dimensao)
00266 {
00267 uma_dimensao -= outra_dimensao;
00268
00269 return uma_dimensao;
00270 }
00271
00272 inline Slang::Dimensao const Slang::operator-(Slang::Dimensao const& dimensao)
00273 {
00274 return Dimensao(-dimensao.numeroDeLinhas(), -dimensao.numeroDeColunas());
00275 }
00276
00277 inline bool Slang::operator==(Slang::Dimensao const& uma_dimensao,
00278 Slang::Dimensao const& outra_dimensao)
00279 {
00280 return uma_dimensao.numeroDeLinhas() == outra_dimensao.numeroDeLinhas() and
00281 uma_dimensao.numeroDeColunas() == outra_dimensao.numeroDeColunas();
00282 }
00283
00284 inline bool Slang::operator!=(Slang::Dimensao const& uma_dimensao,
00285 Slang::Dimensao const& outra_dimensao)
00286 {
00287 return not (uma_dimensao == outra_dimensao);
00288 }
00289
00290
00291
00292
00293 inline Slang::Caixa::Caixa(Posicao const& origem, Dimensao const& dimensao)
00294 : origem_(origem), dimensao_(dimensao)
00295 {
00296
00297 assert(cumpreInvariante());
00298 }
00299
00300 inline Slang::Caixa::Caixa(Posicao const& origem, Posicao const& extremo)
00301 : origem_(origem),
00302 dimensao_(extremo - origem + Dimensao(1, 1))
00303 {
00304
00305 assert(cumpreInvariante());
00306 }
00307
00308 inline Slang::Posicao const& Slang::Caixa::origem() const
00309 {
00310 assert(cumpreInvariante());
00311
00312 return origem_;
00313 }
00314
00315 inline Slang::Posicao Slang::Caixa::extremo() const
00316 {
00317 assert(cumpreInvariante());
00318
00319 return origem_ + dimensao_ - Dimensao(1, 1);
00320 }
00321
00322 inline Slang::Dimensao const& Slang::Caixa::dimensao() const
00323 {
00324 assert(cumpreInvariante());
00325
00326 return dimensao_;
00327 }
00328
00329 inline bool Slang::Caixa::eVazia() const
00330 {
00331 assert(cumpreInvariante());
00332
00333 return dimensao() == Dimensao(0, 0);
00334 }
00335
00336 inline bool Slang::Caixa::eCanonica() const
00337 {
00338 assert(cumpreInvariante());
00339
00340 return dimensao().eCanonica();
00341 }
00342
00343 inline bool Slang::Caixa::contem(Posicao const& posicao) const
00344 {
00345 assert(cumpreInvariante());
00346
00347 return origem().linha() <= posicao.linha() and
00348 posicao.linha() <= extremo().linha() and
00349 origem().linha() <= posicao.coluna() and
00350 posicao.coluna() <= extremo().coluna();
00351 }
00352
00353 inline bool Slang::Caixa::bordaContem(Posicao const& posicao) const
00354 {
00355 assert(cumpreInvariante());
00356
00357 return ((origem().linha() <= posicao.linha() and
00358 posicao.linha() <= extremo().linha() and
00359 (posicao.coluna() == origem().coluna() or
00360 posicao.coluna() == extremo().coluna())) or
00361 (origem().coluna() <= posicao.coluna() and
00362 posicao.coluna() <= extremo().coluna() and
00363 (posicao.linha() == origem().linha() or
00364 posicao.linha() == extremo().linha())));
00365 }
00366
00367 inline void Slang::Caixa::mudaOrigemPara(Posicao const & nova_origem)
00368 {
00369 assert(cumpreInvariante());
00370
00371 origem_ = nova_origem;
00372
00373 assert(cumpreInvariante());
00374 }
00375
00376 inline void Slang::Caixa::mudaExtremoPara(Posicao const& novo_extremo)
00377 {
00378 assert(cumpreInvariante());
00379
00380 dimensao_ = novo_extremo - origem() + Dimensao(1, 1);
00381
00382 assert(cumpreInvariante());
00383 }
00384
00385 inline void Slang::Caixa::mudaDimensaoPara(Dimensao const& nova_dimensao)
00386 {
00387 assert(cumpreInvariante());
00388
00389 dimensao_ = nova_dimensao;
00390
00391 assert(cumpreInvariante());
00392 }
00393
00394 inline Slang::Caixa::Caixa(std::istream& entrada)
00395 : origem_(entrada), dimensao_(entrada)
00396 {
00397
00398 assert(cumpreInvariante());
00399 }
00400
00401 inline void Slang::Caixa::carregaDe(std::istream& entrada)
00402 {
00403 assert(cumpreInvariante());
00404
00405 *this = Caixa(entrada);
00406
00407 assert(cumpreInvariante());
00408 }
00409
00410 inline Slang::Caixa&
00411 Slang::Caixa::operator+=(Slang::Dimensao const& deslocamento)
00412 {
00413 assert(cumpreInvariante());
00414
00415 origem_ += deslocamento;
00416
00417 assert(cumpreInvariante());
00418
00419 return *this;
00420 }
00421
00422 inline Slang::Caixa&
00423 Slang::Caixa::operator-=(Slang::Dimensao const& deslocamento)
00424 {
00425 assert(cumpreInvariante());
00426
00427 origem_ -= deslocamento;
00428
00429 assert(cumpreInvariante());
00430
00431 return *this;
00432 }
00433
00434 inline Slang::Caixa& Slang::Caixa::operator+=(Slang::Caixa const& outra_caixa)
00435 {
00436 assert(cumpreInvariante());
00437
00438 mudaOrigemPara(Posicao(std::min(origem().linha(),
00439 outra_caixa.origem().linha()),
00440 std::min(origem().coluna(),
00441 outra_caixa.origem().coluna())));
00442
00443 mudaExtremoPara(Posicao(std::max(extremo().linha(),
00444 outra_caixa.extremo().linha()),
00445 std::max(extremo().coluna(),
00446 outra_caixa.extremo().coluna())));
00447
00448 assert(cumpreInvariante());
00449
00450 return *this;
00451 }
00452
00453 inline Slang::Caixa& Slang::Caixa::operator*=(Slang::Caixa const& outra_caixa)
00454 {
00455 assert(cumpreInvariante());
00456
00457 mudaOrigemPara(Posicao(std::max(origem().linha(),
00458 outra_caixa.origem().linha()),
00459 std::max(origem().coluna(),
00460 outra_caixa.origem().coluna())));
00461
00462 mudaExtremoPara(Posicao(std::min(extremo().linha(),
00463 outra_caixa.extremo().linha()),
00464 std::min(extremo().coluna(),
00465 outra_caixa.extremo().coluna())));
00466
00467 assert(cumpreInvariante());
00468
00469 return *this;
00470 }
00471
00472 inline bool Slang::Caixa::cumpreInvariante() const
00473 {
00474 return true;
00475 }
00476
00477 inline Slang::Caixa const Slang::operator+(Slang::Caixa caixa,
00478 Slang::Dimensao const& deslocamento)
00479 {
00480 caixa += deslocamento;
00481
00482 return caixa;
00483 }
00484
00485 inline Slang::Caixa const Slang::operator-(Slang::Caixa caixa,
00486 Slang::Dimensao const& deslocamento)
00487 {
00488 caixa -= deslocamento;
00489
00490 return caixa;
00491 }
00492
00493 inline Slang::Caixa const Slang::operator+(Slang::Dimensao const& deslocamento,
00494 Slang::Caixa caixa)
00495 {
00496 caixa += deslocamento;
00497
00498 return caixa;
00499 }
00500
00501 inline Slang::Caixa const
00502 Slang::operator+(Slang::Caixa uma_caixa, Slang::Caixa const& outra_caixa)
00503 {
00504 uma_caixa += outra_caixa;
00505
00506 return uma_caixa;
00507 }
00508
00509 inline Slang::Caixa const
00510 Slang::operator*(Slang::Caixa uma_caixa, Slang::Caixa const& outra_caixa)
00511 {
00512 uma_caixa *= outra_caixa;
00513
00514 return uma_caixa;
00515 }
00516
00517 inline bool Slang::operator==(Caixa const& uma_caixa, Caixa const& outra_caixa)
00518 {
00519 return uma_caixa.origem() == outra_caixa.origem() and
00520 uma_caixa.dimensao() == outra_caixa.dimensao();
00521 }
00522
00523 inline bool Slang::operator!=(Caixa const& uma_caixa, Caixa const& outra_caixa)
00524 {
00525 return not (uma_caixa == outra_caixa);
00526 }
00527
00528
00529
00530
00531 inline std::ostream& Slang::operator<<(std::ostream& saida,
00532 Slang::Cor const cor)
00533 {
00534 saida << Slang::nomes_das_cores[cor];
00535
00536 return saida;
00537 }
00538
00539
00540
00541
00542 inline Slang::Ecra::~Ecra()
00543 {
00544 assert(cumpreInvariante());
00545
00546
00547 SLsmg_reset_smg();
00548 }
00549
00550 inline Slang::Dimensao const Slang::Ecra::dimensao() const
00551 {
00552 assert(cumpreInvariante());
00553
00554 verificaRedimensionamento();
00555
00556 return Dimensao(SLtt_Screen_Rows, SLtt_Screen_Cols);
00557 }
00558
00559 inline Slang::Posicao const Slang::Ecra::origem() const
00560 {
00561 assert(cumpreInvariante());
00562
00563 verificaRedimensionamento();
00564
00565 return Posicao(0, 0);
00566 }
00567
00568 inline Slang::Posicao const Slang::Ecra::extremo() const
00569 {
00570 assert(cumpreInvariante());
00571
00572 verificaRedimensionamento();
00573
00574 return origem() + dimensao() - Dimensao(1, 1);
00575 }
00576
00577 inline Slang::Posicao const Slang::Ecra::posicaoDoCursor() const
00578 {
00579 assert(cumpreInvariante());
00580
00581 verificaRedimensionamento();
00582
00583 return Posicao(SLsmg_get_row(), SLsmg_get_column());
00584 }
00585
00586 inline Slang::Justificacao
00587 Slang::Ecra::justificacaoActual() const
00588 {
00589 assert(cumpreInvariante());
00590
00591 verificaRedimensionamento();
00592
00593 return justificacao_actual;
00594 }
00595
00596 inline int Slang::Ecra::larguraDaProximaOperacaoDeEscrita() const
00597 {
00598 assert(cumpreInvariante());
00599
00600 verificaRedimensionamento();
00601
00602 return largura_da_proxima_operacao_de_escrita;
00603 }
00604
00605 inline bool Slang::Ecra::foiRedimensionado() const
00606 {
00607 assert(cumpreInvariante());
00608
00609 verificaRedimensionamento();
00610
00611 if(redimensionado_)
00612 {
00613 redimensionado_ = false;
00614 return true;
00615 } else
00616 return false;
00617 }
00618
00619 inline bool Slang::Ecra::cursorEstaVisivel() const
00620 {
00621 assert(cumpreInvariante());
00622
00623 verificaRedimensionamento();
00624
00625 return parteVisivelContem(posicaoDoCursor());
00626 }
00627
00628 inline bool Slang::Ecra::parteVisivelContem(Posicao const& posicao) const
00629 {
00630 assert(cumpreInvariante());
00631
00632 verificaRedimensionamento();
00633
00634 return Caixa(origem(), dimensao()).contem(posicao);
00635 }
00636
00637 inline bool Slang::Ecra::cursorEstaLimitadoAoEcraReal() const
00638 {
00639 assert(cumpreInvariante());
00640
00641 verificaRedimensionamento();
00642
00643 return cursor_esta_limitado_ao_ecra_real;
00644 }
00645
00646 inline bool
00647 Slang::Ecra::cursorImovelNaProximaOperacaoDeInsercao() const
00648 {
00649 assert(cumpreInvariante());
00650
00651 verificaRedimensionamento();
00652
00653 return cursor_imovel_na_proxima_operacao_de_escrita;
00654 }
00655
00656 inline void
00657 Slang::Ecra::mudaJustificacaoPara(Justificacao const nova_justificacao)
00658 {
00659 assert(cumpreInvariante());
00660
00661 verificaRedimensionamento();
00662
00663 justificacao_actual = nova_justificacao;
00664
00665 assert(cumpreInvariante());
00666 }
00667
00668 inline void Slang::Ecra::impoeImobilidadeDoCursorNaProximaInsercao()
00669 {
00670 assert(cumpreInvariante());
00671
00672 verificaRedimensionamento();
00673
00674 cursor_imovel_na_proxima_operacao_de_escrita = true;
00675
00676 assert(cumpreInvariante());
00677 }
00678
00679 inline void Slang::Ecra::mudaLarguraDaProximaOperacaoDeEscritaPara
00680 (int const largura_da_proxima_operacao_de_escrita_)
00681 {
00682 assert(cumpreInvariante());
00683 assert(0 <= largura_da_proxima_operacao_de_escrita_);
00684
00685 verificaRedimensionamento();
00686
00687 largura_da_proxima_operacao_de_escrita =
00688 largura_da_proxima_operacao_de_escrita_;
00689
00690 assert(cumpreInvariante());
00691 }
00692
00693 inline void Slang::Ecra::mudaObjectoCorEmUsoPara(ObjectoCor const& objecto_cor)
00694 {
00695 assert(cumpreInvariante());
00696
00697 verificaRedimensionamento();
00698
00699 SLsmg_set_color(objecto_cor.numero_do_objecto);
00700
00701 assert(cumpreInvariante());
00702 }
00703
00704 inline void Slang::Ecra::mudaObjectoCorEmUsoParaFundo()
00705 {
00706 assert(cumpreInvariante());
00707
00708 verificaRedimensionamento();
00709
00710 SLsmg_set_color(0);
00711
00712 assert(cumpreInvariante());
00713 }
00714
00715 inline void
00716 Slang::Ecra::mudaCoresDasCelulasDoFundoPara(Cor const cor_do_texto,
00717 Cor const cor_do_fundo)
00718 {
00719 assert(cumpreInvariante());
00720
00721 verificaRedimensionamento();
00722
00723 SLtt_set_color(0, 0, nome_de_cor_do_s_lang[cor_do_texto],
00724 nome_de_cor_do_s_lang[cor_do_fundo]);
00725
00726 assert(cumpreInvariante());
00727 }
00728
00729 inline void Slang::Ecra::sobeCursor()
00730 {
00731 assert(cumpreInvariante());
00732
00733 verificaRedimensionamento();
00734
00735 moveCursorPara(posicaoDoCursor() - Dimensao(1, 0));
00736
00737 assert(cumpreInvariante());
00738 }
00739
00740 inline void Slang::Ecra::baixaCursor()
00741 {
00742 assert(cumpreInvariante());
00743
00744 verificaRedimensionamento();
00745
00746 moveCursorPara(posicaoDoCursor() + Dimensao(1, 0));
00747
00748 assert(cumpreInvariante());
00749 }
00750
00751 inline void Slang::Ecra::recuaCursor()
00752 {
00753 assert(cumpreInvariante());
00754
00755 verificaRedimensionamento();
00756
00757 moveCursorPara(posicaoDoCursor() - Dimensao(0, 1));
00758
00759 assert(cumpreInvariante());
00760 }
00761
00762 inline void Slang::Ecra::avancaCursor()
00763 {
00764 assert(cumpreInvariante());
00765
00766 verificaRedimensionamento();
00767
00768 moveCursorPara(posicaoDoCursor() + Dimensao(0, 1));
00769
00770 assert(cumpreInvariante());
00771 }
00772
00773 inline Slang::Ecra::Troco const Slang::Ecra::trocoDoEcraCompleto() const
00774 {
00775 assert(cumpreInvariante());
00776
00777 verificaRedimensionamento();
00778
00779 return trocoDe(Caixa(Posicao(0, 0), dimensao()));
00780 }
00781
00782 inline Slang::Ecra::Troco const
00783 Slang::Ecra::trocoNoCursorCom(Dimensao const& dimensao) const
00784 {
00785 assert(cumpreInvariante());
00786 assert(dimensao.eCanonica());
00787
00788 verificaRedimensionamento();
00789
00790 return trocoDe(Caixa(posicaoDoCursor(), dimensao));
00791 }
00792
00793 inline void Slang::Ecra::tocaCampainha() const
00794 {
00795 assert(cumpreInvariante());
00796
00797 verificaRedimensionamento();
00798
00799 SLtt_beep();
00800 }
00801
00802 inline void Slang::Ecra::apagaDoCursorAteOFimDaLinha()
00803 {
00804 assert(cumpreInvariante());
00805
00806 verificaRedimensionamento();
00807
00808 SLsmg_erase_eol();
00809
00810 assert(cumpreInvariante());
00811 }
00812
00813 inline void Slang::Ecra::apagaDoCursorAteOFim()
00814 {
00815 assert(cumpreInvariante());
00816
00817 verificaRedimensionamento();
00818
00819 SLsmg_erase_eos();
00820
00821 assert(cumpreInvariante());
00822 }
00823
00824 inline void Slang::Ecra::apaga()
00825 {
00826 assert(cumpreInvariante());
00827
00828 verificaRedimensionamento();
00829
00830 SLsmg_cls();
00831
00832 assert(cumpreInvariante());
00833 }
00834
00835 inline void Slang::Ecra::refresca() const
00836 {
00837 assert(cumpreInvariante());
00838
00839 verificaRedimensionamento();
00840
00841 SLsmg_refresh();
00842 }
00843
00844 inline void Slang::Ecra::refrescaTudo() const
00845 {
00846 assert(cumpreInvariante());
00847
00848 verificaRedimensionamento();
00849
00850
00851 SLsmg_touch_lines(0, dimensao().numeroDeLinhas());
00852
00853 refresca();
00854 }
00855
00856 template <typename T>
00857 inline Slang::Ecra& Slang::Ecra::operator<<(T const& valor)
00858 {
00859 assert(cumpreInvariante());
00860
00861 verificaRedimensionamento();
00862
00863 std::ostringstream saida;
00864
00865 saida << valor;
00866
00867 *this << saida.str();
00868
00869 assert(cumpreInvariante());
00870
00871 return ecra;
00872 }
00873
00874 inline Slang::Ecra& Slang::Ecra::operator<<(Caixa const& caixa)
00875 {
00876 assert(cumpreInvariante());
00877 assert(caixa.eCanonica());
00878
00879 verificaRedimensionamento();
00880
00881 desenha(caixa);
00882
00883 assert(cumpreInvariante());
00884
00885 return *this;
00886 }
00887
00888 inline Slang::Ecra& Slang::Ecra::operator<<(Simbolo const simbolo)
00889 {
00890 assert(cumpreInvariante());
00891
00892 verificaRedimensionamento();
00893
00894 SLsmg_set_char_set(1);
00895 *this << char(simbolo);
00896 SLsmg_set_char_set(0);
00897
00898 assert(cumpreInvariante());
00899
00900 return *this;
00901 }
00902
00903 inline Slang::Ecra& Slang::Ecra::operator<<(Troco const& troco)
00904 {
00905 assert(cumpreInvariante());
00906
00907 verificaRedimensionamento();
00908
00909 cola(troco, posicaoDoCursor());
00910
00911 assert(cumpreInvariante());
00912
00913 return *this;
00914 }
00915
00916 inline Slang::Ecra&
00917 Slang::Ecra::operator<<(Posicao const& nova_posicao_do_cursor)
00918 {
00919 assert(cumpreInvariante());
00920
00921 verificaRedimensionamento();
00922
00923 moveCursorPara(nova_posicao_do_cursor);
00924
00925 assert(cumpreInvariante());
00926
00927 return *this;
00928 }
00929
00930 inline Slang::Ecra& Slang::Ecra::operator<<(ObjectoCor const& objecto_cor)
00931 {
00932 assert(cumpreInvariante());
00933
00934 verificaRedimensionamento();
00935
00936 mudaObjectoCorEmUsoPara(objecto_cor);
00937
00938 assert(cumpreInvariante());
00939
00940 return *this;
00941 }
00942
00943 inline Slang::Ecra&
00944 Slang::Ecra::operator<<(Justificacao nova_justificacao)
00945 {
00946 assert(cumpreInvariante());
00947
00948 verificaRedimensionamento();
00949
00950 mudaJustificacaoPara(nova_justificacao);
00951
00952 assert(cumpreInvariante());
00953
00954 return *this;
00955 }
00956
00957 inline Slang::Ecra&
00958 Slang::Ecra::operator<<(void manipulador(Ecra& ecra))
00959 {
00960 assert(cumpreInvariante());
00961
00962 verificaRedimensionamento();
00963
00964 manipulador(*this);
00965
00966 assert(cumpreInvariante());
00967
00968 return *this;
00969 }
00970
00971 inline void Slang::Ecra::mudaCoresDe(int const objecto,
00972 Cor const cor_do_texto,
00973 Cor const cor_do_fundo)
00974 {
00975 SLtt_set_color(objecto, 0,
00976 nome_de_cor_do_s_lang[cor_do_texto],
00977 nome_de_cor_do_s_lang[cor_do_fundo]);
00978 }
00979
00980 inline void Slang::Ecra::manipuladorDeRedimensionamento(int const sinal)
00981 {
00982 Slang::Ecra::tamanho_do_ecra_real_mudou = true;
00983
00984 SLsignal(SIGWINCH, manipuladorDeRedimensionamento);
00985 }
00986
00987 inline bool Slang::Ecra::cumpreInvariante() const
00988 {
00989 return true;
00990 }
00991
00992
00993
00994
00995 inline Slang::Ecra::ObjectoCor::ObjectoCor(Cor const cor_do_texto,
00996 Cor const cor_do_fundo)
00997 : cor_do_texto(cor_do_texto), cor_do_fundo(cor_do_fundo),
00998 numero_do_objecto(ecra.reservaObjecto())
00999 {
01000 ecra.mudaCoresDe(numero_do_objecto, cor_do_texto, cor_do_fundo);
01001
01002 assert(cumpreInvariante());
01003 }
01004
01005 inline Slang::Ecra::ObjectoCor::~ObjectoCor()
01006 {
01007 assert(cumpreInvariante());
01008
01009 ecra.libertaObjecto(numero_do_objecto);
01010 }
01011
01012 inline Slang::Cor Slang::Ecra::ObjectoCor::corDoTexto() const
01013 {
01014 assert(cumpreInvariante());
01015
01016 return cor_do_texto;
01017 }
01018
01019 inline Slang::Cor Slang:: Ecra::ObjectoCor::corDoFundo() const
01020 {
01021 assert(cumpreInvariante());
01022
01023 return cor_do_fundo;
01024 }
01025
01026 inline void
01027 Slang::Ecra::ObjectoCor::mudaCorDoTextoPara(Cor const nova_cor_do_texto)
01028 {
01029 assert(cumpreInvariante());
01030
01031 cor_do_texto = nova_cor_do_texto;
01032
01033 ecra.mudaCoresDe(numero_do_objecto, cor_do_texto, cor_do_fundo);
01034
01035 assert(cumpreInvariante());
01036 }
01037
01038 inline void
01039 Slang::Ecra::ObjectoCor::mudaCorDoFundoPara(Cor const nova_cor_do_fundo)
01040 {
01041 assert(cumpreInvariante());
01042
01043 cor_do_fundo = nova_cor_do_fundo;
01044
01045 ecra.mudaCoresDe(numero_do_objecto, cor_do_texto, cor_do_fundo);
01046
01047 assert(cumpreInvariante());
01048 }
01049
01050 inline bool Slang::Ecra::ObjectoCor::cumpreInvariante() const
01051 {
01052 return 1 <= numero_do_objecto and
01053 numero_do_objecto < numero_de_objectos_cor_no_s_lang;
01054 }
01055
01056
01057
01058
01059 inline Slang::Ecra::Troco::Troco(Dimensao const& dimensao)
01060 : dimensao_(dimensao),
01061 dados(dimensao.numeroDeLinhas() * dimensao.numeroDeColunas())
01062 {
01063 assert(dimensao.eCanonica());
01064
01065 assert(cumpreInvariante());
01066 }
01067
01068 inline Slang::Dimensao Slang::Ecra::Troco::dimensao() const
01069 {
01070 assert(cumpreInvariante());
01071
01072 return dimensao_;
01073 }
01074
01075 inline bool Slang::Ecra::Troco::cumpreInvariante() const
01076 {
01077 return dimensao_.numeroDeLinhas() * dimensao_.numeroDeColunas() ==
01078 int(dados.size());
01079 }
01080
01081
01082
01083
01084 inline Slang::ManipuladorDaLargura::ManipuladorDaLargura(int const largura)
01085 : largura(largura)
01086 {
01087 }
01088
01089 inline Slang::Ecra& Slang::operator<<(Ecra& ecra,
01090 ManipuladorDaLargura const& manipulador)
01091 {
01092 ecra.mudaLarguraDaProximaOperacaoDeEscritaPara(manipulador.largura);
01093
01094 return ecra;
01095 }
01096
01097
01098
01099
01100 inline Slang::ManipuladorDeDesenhoDeSegmento::
01101 ManipuladorDeDesenhoDeSegmento(bool const e_horizontal,
01102 int const dimensao)
01103 : e_horizontal(e_horizontal), dimensao(dimensao)
01104 {
01105 }
01106
01107 inline Slang::Ecra&
01108 Slang::operator<<(Ecra& ecra,
01109 ManipuladorDeDesenhoDeSegmento const& manipulador)
01110 {
01111 if(manipulador.e_horizontal)
01112 ecra.desenhaSegmentoHorizontalCom(manipulador.dimensao);
01113 else
01114 ecra.desenhaSegmentoVerticalCom(manipulador.dimensao);
01115
01116 return ecra;
01117 }
01118
01119
01120
01121
01122 inline Slang::Posicao const Slang::cursor(int const linha, int const coluna)
01123 {
01124 return Slang::Posicao(linha, coluna);
01125 }
01126
01127 inline Slang::Posicao const& Slang::cursor(Slang::Posicao const& posicao)
01128 {
01129 return posicao;
01130 }
01131
01132 inline Slang::Caixa const Slang::caixa(int const linha, int const coluna,
01133 int const numero_de_linhas,
01134 int const numero_de_colunas)
01135 {
01136 return Caixa(Posicao(linha, coluna),
01137 Dimensao(numero_de_linhas, numero_de_colunas));
01138 }
01139
01140 inline Slang::Caixa const
01141 Slang::caixa(Slang::Posicao const& origem, Slang::Dimensao const& dimensao)
01142 {
01143 return Caixa(origem, dimensao);
01144 }
01145
01146 inline void Slang::fundo(Slang::Ecra& ecra)
01147 {
01148 ecra.mudaObjectoCorEmUsoParaFundo();
01149 }
01150
01151 inline void Slang::parado(Slang::Ecra& ecra)
01152 {
01153 ecra.impoeImobilidadeDoCursorNaProximaInsercao();
01154 }
01155
01156 inline void Slang::sobeCursor(Slang::Ecra& ecra)
01157 {
01158 ecra.sobeCursor();
01159 }
01160
01161 inline void Slang::baixaCursor(Slang::Ecra& ecra)
01162 {
01163 ecra.baixaCursor();
01164 }
01165
01166 inline void Slang::recuaCursor(Slang::Ecra& ecra)
01167 {
01168 ecra.recuaCursor();
01169 }
01170
01171 inline void Slang::avancaCursor(Slang::Ecra& ecra)
01172 {
01173 ecra.avancaCursor();
01174 }
01175
01176 inline Slang::ManipuladorDaLargura Slang::largura(int const largura)
01177 {
01178 assert(0 <= largura);
01179
01180 return ManipuladorDaLargura(largura);
01181 }
01182
01183 inline Slang::ManipuladorDeDesenhoDeSegmento
01184 Slang::segmento_horizontal(int largura)
01185 {
01186 assert(0 <= largura);
01187
01188 return ManipuladorDeDesenhoDeSegmento(true, largura);
01189 }
01190
01191 inline Slang::ManipuladorDeDesenhoDeSegmento
01192 Slang::segmento_vertical(int altura)
01193 {
01194 assert(0 <= altura);
01195
01196 return ManipuladorDeDesenhoDeSegmento(false, altura);
01197 }
01198
01199 inline void Slang::refresca(Ecra& ecra)
01200 {
01201 ecra.refresca();
01202 }
01203
01204 inline void Slang::refresca_tudo(Ecra& ecra)
01205 {
01206 ecra.refrescaTudo();
01207 }
01208
01209 inline void Slang::apaga(Ecra& ecra)
01210 {
01211 ecra.apaga();
01212 }
01213
01214 inline void Slang::apaga_fim_da_linha(Ecra& ecra)
01215 {
01216 ecra.apagaDoCursorAteOFimDaLinha();
01217 }
01218
01219 inline void Slang::apaga_fim_do_ecra(Ecra& ecra)
01220 {
01221 ecra.apagaDoCursorAteOFim();
01222 }
01223
01224 inline void Slang::campainha(Ecra& ecra)
01225 {
01226 ecra.tocaCampainha();
01227 }