Szerkesztő:AttishOculus/A Squeak rendszer programozása/Squeak/A HTTPProxyEditor, mint modell
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
initializemetó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