Programm.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. #include "Programm.h"
  2. #include <Punkt.h>
  3. #include <Rahmen.h>
  4. // Inhalt der Programm Klasse aus Programm.h
  5. // Konstruktor
  6. Programm::Programm( Bildschirm *b, Schrift *s )
  7. {
  8. bildschirm = b;
  9. schrift = s;
  10. Punkt bg = b->getBackBufferSize();
  11. kFenster = new Fenster();
  12. kFenster->setStyle( Fenster::Style::Sichtbar | Fenster::Style::Erlaubt | Fenster::Style::Rahmen | Fenster::Style::VScroll );
  13. kFenster->setRFarbe( 0xFFFFFFFF );
  14. kFenster->setRBreite( 1 );
  15. kFenster->setPosition( bg.x - 200, 0 );
  16. kFenster->setSize( 200, bg.y );
  17. kFenster->setVSBMax( 0 );
  18. bildschirm->addMember( kFenster );
  19. mFenster = new Fenster();
  20. mFenster->setStyle( Fenster::Style::Erlaubt | Fenster::Style::Sichtbar );
  21. mFenster->setSize( bg.x - 200, bg.y );
  22. bildschirm->addMember( mFenster );
  23. auswahlRahmen = new LRahmen();
  24. auswahlRahmen->setPosition( 0, -30 );
  25. auswahlRahmen->setSize( 182, 30 );
  26. auswahlRahmen->setRamenBreite( 1 );
  27. auswahlRahmen->setFarbe( 0xFFFFFFFF );
  28. kFenster->addMember( auswahlRahmen );
  29. sichtbar = -1;
  30. name = new RCArray< Text >();
  31. knopf = new RCArray< Knopf >();
  32. abschnitte = new RCArray< Abschnitt >();
  33. abschnittAnzahl = 0;
  34. ref = 1;
  35. }
  36. // Destruktor
  37. Programm::~Programm()
  38. {
  39. bildschirm->removeMember( kFenster );
  40. bildschirm->removeMember( mFenster );
  41. name->release();
  42. knopf->release();
  43. abschnitte->release();
  44. auswahlRahmen->release();
  45. kFenster->release();
  46. mFenster->release();
  47. bildschirm->release();
  48. schrift->release();
  49. }
  50. // nicht constant
  51. bool Programm::addAbschnitt( const char *name, Abschnitt *abschnitt )
  52. {
  53. bool hat = 0;
  54. for( int i = 0; i < abschnittAnzahl; i++ )
  55. {
  56. if( this->name->z( i )->istGleich( name ) )
  57. {
  58. hat = 1;
  59. break;
  60. }
  61. }
  62. if( hat )
  63. {
  64. abschnitt->release();
  65. return 0;
  66. }
  67. Knopf *k = new Knopf();
  68. k->setStyle( Knopf::Style::Normal );
  69. k->setSize( 150, 20 );
  70. k->setPosition( 16, abschnittAnzahl * 30 + 5 );
  71. k->setSchriftZ( schrift->getThis() );
  72. k->setText( name );
  73. k->setMausEreignisParameter( this );
  74. k->setMausEreignis( programmAbschnittME );
  75. kFenster->addMember( k );
  76. this->name->add( new Text( name ), abschnittAnzahl );
  77. knopf->add( k, abschnittAnzahl );
  78. abschnitte->add( abschnitt, abschnittAnzahl );
  79. abschnittAnzahl++;
  80. abschnitt->setFenster( (Fenster*)mFenster->getThis() );
  81. if( sichtbar < 0 )
  82. {
  83. sichtbar = 0;
  84. auswahlRahmen->setPosition( 0, 0 );
  85. abschnitt->setSichtbar( 1 );
  86. }
  87. kFenster->setVSBMax( abschnittAnzahl * 30 );
  88. return 1;
  89. }
  90. bool Programm::removeAbschnitt( const char *name )
  91. {
  92. for( int i = 0; i < abschnittAnzahl; i++ )
  93. {
  94. if( this->name->z( i )->istGleich( name ) )
  95. {
  96. if( sichtbar == i )
  97. abschnitte->z( i )->setSichtbar( 0 );
  98. this->name->remove( i );
  99. kFenster->removeMember( knopf->z( i ) );
  100. knopf->remove( i );
  101. abschnitte->remove( i );
  102. abschnittAnzahl--;
  103. if( sichtbar >= abschnittAnzahl )
  104. sichtbar = abschnittAnzahl - 1;
  105. if( sichtbar > i )
  106. sichtbar--;
  107. if( sichtbar >= 0 && !abschnitte->z( sichtbar )->istSichtbar() )
  108. abschnitte->z( i )->setSichtbar( 1 );
  109. auswahlRahmen->setPosition( auswahlRahmen->getX(), sichtbar * 30 );
  110. kFenster->setVSBMax( abschnittAnzahl * 30 );
  111. return 1;
  112. }
  113. }
  114. return 0;
  115. }
  116. bool Programm::renameAbschnitt( const char *name, const char *newName )
  117. {
  118. for( int i = 0; i < abschnittAnzahl; i++ )
  119. {
  120. if( this->name->z( i )->istGleich( name ) )
  121. {
  122. this->name->z( i )->setText( newName );
  123. knopf->z( i )->setText( newName );
  124. return 1;
  125. }
  126. }
  127. return 0;
  128. }
  129. bool Programm::abschnittAuswählen( const char *name )
  130. {
  131. for( int i = 0; i < abschnittAnzahl; i++ )
  132. {
  133. if( this->name->z( i )->istGleich( name ) )
  134. {
  135. if( sichtbar == i )
  136. break;
  137. abschnitte->z( sichtbar )->setSichtbar( 0 );
  138. sichtbar = i;
  139. abschnitte->z( i )->setSichtbar( 1 );
  140. auswahlRahmen->setPosition( auswahlRahmen->getX(), sichtbar * 30 );
  141. return 1;
  142. }
  143. }
  144. return 0;
  145. }
  146. bool Programm::abschnittMausEreignis( void *obj, MausEreignis me )
  147. {
  148. if( me.id == ME_RLinks )
  149. abschnittAuswählen( ( (Knopf*)obj )->zText()->getText() );
  150. return 1;
  151. }
  152. // constant
  153. Text *Programm::getSichtbarAbschnittName() const
  154. {
  155. if( sichtbar >= abschnittAnzahl )
  156. return 0;
  157. return name->get( sichtbar );
  158. }
  159. Text *Programm::zSichtbarAbschnittName() const
  160. {
  161. if( sichtbar >= abschnittAnzahl )
  162. return 0;
  163. return name->z( sichtbar );
  164. }
  165. // Reference Counting
  166. Programm *Programm::getThis()
  167. {
  168. ref++;
  169. return this;
  170. }
  171. Programm *Programm::release()
  172. {
  173. ref--;
  174. if( !ref )
  175. delete this;
  176. return 0;
  177. }
  178. // Ereignis
  179. bool programmAbschnittME( void *p, void *obj, MausEreignis me )
  180. {
  181. if( p )
  182. return ( (Programm*)p )->abschnittMausEreignis( obj, me );
  183. return 0;
  184. }