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_impl.H

Ir para a documentação deste ficheiro.
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 // Posicao:
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 // Dimensao:
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 // Caixa:
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 // Cor:
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 // Ecra:
00541 
00542 inline Slang::Ecra::~Ecra()
00543 {
00544     assert(cumpreInvariante());
00545 
00546     // Terminação do slang:
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     // Com isto o próximo refresh redesenhará todo o ecrã!
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 // Ecra::ObjectoCor:
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 // Ecra::Troco:
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 // ManipuladorDaLargura:
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 // ManipuladorDeDesenhoDeSegmento:
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 // Manipuladores:
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 }

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