00001
00007 #ifndef SLANG_MENU_H
00008 #define SLANG_MENU_H
00009
00010 #include <vector>
00011 #include <string>
00012
00013 #include <Slang++/ecra.H>
00014
00015 namespace Slang {
00016
00046 class ApendiceComCor {
00047 protected:
00049
00050
00063 ApendiceComCor();
00064
00068 ~ApendiceComCor();
00069
00071
00073
00074
00081 Ecra::ObjectoCor const& objectoCorDaBorda() const;
00082
00089 Ecra::ObjectoCor const& objectoCorDoTitulo() const;
00090
00097 Ecra::ObjectoCor const& objectoCorDosItens() const;
00098
00105 Ecra::ObjectoCor const& objectoCorDoItemCorrente() const;
00106
00108
00110
00111
00118 Ecra::ObjectoCor& objectoCorDaBorda();
00119
00126 Ecra::ObjectoCor& objectoCorDoTitulo();
00127
00134 Ecra::ObjectoCor& objectoCorDosItens();
00135
00142 Ecra::ObjectoCor& objectoCorDoItemCorrente();
00143
00145
00146 private:
00147 Ecra::ObjectoCor objecto_cor_da_borda;
00148 Ecra::ObjectoCor objecto_cor_do_titulo;
00149 Ecra::ObjectoCor objecto_cor_dos_itens;
00150 Ecra::ObjectoCor objecto_cor_do_item_corrente;
00151
00157 bool cumpreInvariante() const;
00158 };
00159
00167 class Menu {
00168 public:
00170
00171
00177 explicit Menu(std::string const& titulo);
00178
00182 virtual ~Menu() = 0;
00183
00185
00187
00188
00194 std::string titulo() const;
00195
00202 virtual int opcaoActual() const = 0;
00203
00205
00207
00208
00214 virtual void interage() = 0;
00215
00217
00218 private:
00219 std::string titulo_;
00220
00226 bool cumpreInvariante() const;
00227 };
00228
00235 class MenuComCor: public Menu, protected ApendiceComCor {
00236 public:
00238
00239
00245 explicit MenuComCor(std::string const& titulo);
00246
00250 virtual ~MenuComCor() = 0;
00251
00253 };
00254
00275 class MenuSimples : public MenuComCor {
00276 public:
00278
00279
00289 MenuSimples(std::string const& titulo,
00290 std::string const itens[],
00291 int const numero_de_itens);
00292
00301 MenuSimples(std::string const& titulo,
00302 std::string const& itens);
00303
00305
00307
00308
00316 virtual int opcaoActual() const;
00317
00319
00321
00322
00328 virtual void interage();
00329
00331
00332 private:
00333 std::vector<std::string> itens;
00334 int numero_de_itens;
00335 std::string::size_type comprimento_maximo_dos_itens;
00336 Posicao posicao;
00337 Dimensao dimensao;
00338 int opcao_corrente;
00339
00340
00341 void calculaDimensao();
00342
00343
00344 void calculaPosicao();
00345
00346
00347 void desenhaItem(int numero_do_item) const;
00348
00349
00350 void desenha() const;
00351
00361 bool cumpreInvariante() const;
00362 };
00363
00369 class MenuDeCores : public MenuSimples {
00370 public:
00372
00373
00379 explicit MenuDeCores(std::string const& titulo);
00380
00382 };
00383
00389 class MenuDeSimOuNao : private MenuSimples {
00390 public:
00392
00393
00399 explicit MenuDeSimOuNao(std::string const& titulo);
00400
00402
00404
00405
00413 virtual int opcaoActual() const;
00414
00416
00417 using MenuSimples::interage;
00418 };
00419
00428 class Aviso {
00429 public:
00431
00432
00436 explicit Aviso(std::string const& mensagem);
00437
00441 virtual ~Aviso();
00442
00444
00446
00447
00452 virtual void interage();
00453
00455
00456 private:
00457 MenuSimples menu;
00458
00464 bool cumpreInvariante() const;
00465 };
00466
00484 class CaixaDeTexto : protected ApendiceComCor {
00485 public:
00487
00488
00499 explicit CaixaDeTexto(std::string const& titulo,
00500 std::string const& texto_inicial = "",
00501 std::string const& caracteres_admissiveis = "",
00502 bool deve_impedir_caixa_vazia = false,
00503 std::string::size_type espacos = 0);
00504
00508 virtual ~CaixaDeTexto();
00509
00511
00513
00514
00520 virtual std::string const& textoActual() const;
00521
00527 std::string titulo() const;
00528
00530
00532
00533
00538 virtual void interage();
00539
00541
00542 private:
00543 std::string titulo_;
00544 std::string::size_type numero_de_espacos_visiveis;
00545 std::string texto_corrente;
00546 std::string caracteres_admissiveis;
00547 std::string::size_type inicio_da_parte_visivel_do_texto;
00548 std::string::size_type posicao_do_cursor_nos_espacos_visiveis;
00549 Dimensao dimensao;
00550 Posicao origem;
00551 bool impede_caixa_vazia;
00552
00553
00554 void desenha() const;
00555
00556
00557 void calculaPosicao();
00558
00568 bool cumpreInvariante() const;
00569 };
00570 }
00571
00572 #include <Slang++/menu_impl.H>
00573
00574 #endif // SLANG_MENU_H