Ugrás a tartalomhoz

Szerkesztő:AttishOculus/A Squeak rendszer programozása/Squeak/A HTTPProxyEditor, mint modell

A Wikikönyvekből, a szabad elektronikus könyvtárból.

A Squeak ablakosztályok elemzése egy modellen keresztül

[szerkesztés]

Ez a Squeak rendszer egyik legnagyobb problémája: ok, megismertem a nyelv szintaxisát, az alapvető osztályokat, kiírtam dolgokat a Transcriptre, csináltam egy pár Morphot, rakosgattam és kiszíneztem őket, ahogy a tutorialok leírják, de merre tovább? Szeretnék csinálni pl. egy olyan ablakot, amiben tanulás közben definíciókat tudok feljegyezni, azokat csoportosítani, kikérdeztetni stb. Hogyan kezdjek hozzá? Ok, létrehozok egy ablakot, meg-subclassolom az ablakosztályt, csinálok egy saját ablakosztályt, felülírom az inicializálóját, hogy feltöltse magát a szükséges ablakelemekkel. De milyen ablakelemeket és hogyan tudok használni? Hogyan tölthetem fel az ablakot az ablakelemekkel?

Ezeknek a kérdéseknek a megválaszolására azt találtam ki, hogy fogok egy, a rendszerben már létező ablakosztályt, és azt veszem kiindulási alapnak. Legyen elég egyszerű és áttekinthető, de szolgáljon értelmes célt. Találtam is egy ilyet: ez a HTTPProxyEditor.

Ezt az ablakot a világ menüjéből lehet megnyitni, a "http proxy editor" menüponttal. Ellentétben a többi ablakkal (továbbiakban: program), mint pl. az IRC kliens, ez csak egyetlen osztályból áll. Ezt fogom modellként használni az ablakban futó programok készítésének megértéséhez.

A saját ablakosztály leszármaztatása

[szerkesztés]

Nyilván ez az első lépés. A modellünk a SystemWindow osztályból származtatja magát, ami nem egyfajta Window osztály leszármazottja, hanem maga az, amit én Window-nak neveztem volna, mert ennek az őse már a MorphicModel. Szóval ez minden, képernyőn látható ablakok közös őse.

Az osztálynak van néhány példányszintű változója, melyek közül kettő a beállítást tárolja, a többi pedig (a Widget végűek) az ablak elemeit jelentő objektumokat. Az osztálydefiníció a Proxy-Editor kategóriába sorolja ezt az osztályt.

Példányosítás

[szerkesztés]

A példányosítás természetesen, mint minden Morph-nál, működik a HTTPProxyEditor new metódushívással, majd ezt az új példányt az openInWorld metódushívással kirakjuk a világra, így az ablak látható lesz.

Az osztály viszont biztosít egy "hivatalos" módszert is a példányosításra (vagyis az ablak megnyitására), ez az osztályszintű open metódus.

Az open osztályszintű metódus

[szerkesztés]

Ez a metódus biztosítja a Squeak számára azt a felületet, amellyel a világ open... menüjében szereplő osztályokat a rendszer példányosítja.

A open... listára egyébként az osztályszintű inicializáló metódus veszi fel ezt az osztályt (amúgy ez vajon mikor fut le?), a TheWorldMenu globális objektum registerOpenCommand metódusának hívásával.

Ez a metódus végigmegy a világ elemein (World submorphs), és mindegyikre ellenőrzi, hogy ennek az osztálynak a példánya-e; ha igen, akkor aktiválja (window comeToFront), ha nem, akkor egy új példányt hoz létre a self new openInWorld üzenettel.

Inicializálás

[szerkesztés]

Ha a példány létrejött, akkor meghívódik az initialize metódusa. Ennél az osztálynál ez a következőket végzi el:

  • ősosztály initialize metódusának hívása
  • példányszintű változók inicializálása
  • ablak címének beállítása (self setLabel:)
  • ablak színének beállítása (self setWindowColor:)
  • ablak részeinek inicializálása
  • ablak részeinek kiszínezése
    • ezt azért fontos különválasztani, mert két esetben történik: inicializációkor és az ablak színének átállításakor, amikor a részek színeit is meg kell változtatni

Ablak részeinek (widget-ek) inicializálása

[szerkesztés]

A self addMorph:frame: üzenettel történik az egyes ablakelemek hozzáadása. A frame: paramétere egy olyan Rectangle, ami az ablak terjedelmét (0 @ 0 corner: 1 @ 1)-nek véve írja le a widget méretét. Ezt a Morph a saját addMorph:fullFrame: üzenete segítségével kezeli majd, ennek a paramétere egy LayoutFrame.

Magát a hozzáadandó Morph-ot az osztály createLabel:, createText: és createButtonLabel:action:help: metódusai hozzák létre.

A hozzáadandó widget-ek létrehozása

[szerkesztés]

Háromféle widget van az ablakban: a címke, a szövegmező és a gomb.

  • a címke osztálya: PluggableButtonMorph
  • a szövegmező osztálya: PluggableTextMorph
  • a gomb osztálya: SimpleButtonMorph