METAFONT Editor
Individuln bakalsk projekt

Ale Vancl 
z 1996 - duben 1997



ZADN LOHY

Jedn se o prosted pro "rsovn" ..vektorov  grafika.
Prosted by zrove mlo obsahovat jednoduch  textov editor.
To co by bylo narsovno, by se zrove  objevilo v editovanm  souboru ve form METAFONTovho  textu.
Zamilo by se jen na uritou st jazyka  METAFONTu.
Program by ml bt navren tak,
aby jej bylo  mono postupn roziovat a ml by sestvat z nkolika
vcemn nezvislch celk.

 Progrmovac jazyk: C++
 OS: MS-DOS


1. PRUKA UIVATELE
1.1. vod
Tato kapitola obsahuje nkter obecn informace o programu METAFONT Editor.
Seznmte se zde s jednotlivmi stmi aplikace a s metodami,
jak mezi sebou tyto sti pracuj.

1.2. Obecn informace 
METAFONT Editor je program spojujc jednoduch grafick editor spolu s textovm editorem nad prostedm METAFONTu.
V jeho grafick sti lze editovat jednoduch objekty (body, resp. ry ).
Tyto objekty lze  transformovat do textov sti ve form zdrojovho textu METAFONTu, kde lze provdt jejich dal editaci.
Nslednou transformac z textovho editoru do grafickho editoru lze prohldnout pedbnou podobu vslednho obrzku a provdt dal editaci.

METAFONT Editor si neklade za cl bt komplexnm prostedkem pro tvorbu obrzk v METEAFONTu a zastoupit tak jeho msto, spe se pokou bt prostedkem pro zkladn editaci (zadvn bod) s monost zobrazit zrove zdrojov text i piblinou podobu vslednho obrzku.
Jak se dozvte dle, je voln METEAFONTu dokonce nezbytnou soust transformanho procesu.
Pro sprvn bh aplikace je nutn mt ve stejnm adresi jako je mfeditor.exe i soubor mfeditor.mf.
O vznamu tohoto souboru v zvru kapitoly.

1.3. Sputn
Program METAFONT Editor se spout pkazem mfeditor.exe [/m=metafont.exe ][ filename.mf],
kde nepovinn parametr metafont.exe je jmno METAFONTu (nap. bmf186.exe),
kter se pouije pi transformaci grafika --> text.
Defaultn se pouije mf.exe".
Program byl testovn a je funkn s tmito METAFONTy : mf186, bmf186 a mf386.
 Nepovinn parametr filename.mf je jmno souboru se zdrojovm textem METEAFONTu.
 Nezadte-li jmno souboru, pouije se jmno default.mf.
Program lze samozejm spoutt takt z rznch filemanaer jako jsou nap.
Volkov Commander, Manaer602 a jim podobn.
METAFONT Editor je tak mon provozovat pod MS Windows jako DOS aplikaci.
Nedoporuuji vak spoutt v prosted MS Windows METAFONT Editor "v okn".
Funknost nebude sice nijak vrazn naruena, ale doba odezvy na jednotliv udlosti se nepimen prothne.
Program byl testovn pod OS MS DOS 6.22 ( MS Windows 95 ) na potai s procesorem 486-DX2/66 s 4(16) MB pamti.

1.4. Ovldn
Pro chod aplikace je nutn mt sputn ovlada myi. 
Grafick st aplikace se ovld zejmna pomoc myi a textov st naopak pevn pomoc klvesnice.

Vznam jednotlivch klves probereme podrobnji pi popisu textovho editoru.
Menu aplikace se d ovldat pomoc klvesnice i myi  zpsobem bnm  z vtiny aplikac.  

1.5. Popis jednotlivch funkc menu
Menu programu m nsledujc podobu

File  
 Transform

File - popup menu File v sob skrv  nsledujc funkce:
New	 -vytvoen novho vstupnho souboru se zdrojovm textem. 
Open -oteven ji existujcho souboru.
Save 	 - uloen obsahu textovho okna na disk.
Close - zaven otevenho souboru.
         Exit	 - ukonen  bhu aplikace.

V tto verzi chyb monost volby jmna souboru za bhu aplikace.
Vechny provdn akce probhaj nad souborem zadanm jako parametr filename.mf
pi sputn aplikace (mfeditor.exe filename.mf),
nebo nad souborem dafault.mf, pokud parametr filename.mf nebyl zadn.
Aplikace jet nen po strnce interaktivn prce se soubory pipravena,
protoe se domnvm, e rutina kolem komfortnho otevrn soubor nen
hlavnm kolem projektu.  
Jednotliv poloky menu maj tento vznam:

File   

New - oteve soubor filename.mf (default.mf) bez ohledu na jeho existenci.
      Pokud existuje, bude otevenm zruen a pokud neexistuje, bude vytvoen.
      Pokud se nepoda z njakho dvodu soubor otevt, program ppne.

Open - oteve ji existujc soubor filename.mf (default.mf).
      Pi nespnm oteven (nap. soubor neexistuje) program opt ppne.

Save - ulo obsah textovho editoru do ji otevenho souboru filename.mf (default.mf).
      Nespch je opt signalizovn ppnutm.

Close - zave oteven soubor filename.mf (default.mf).
      Nespch je opt signalizovn ppnutm.

Exit - ukon bh aplikace.
      Bh aplikace lze t ukonit stiskem Alt X.
      Pokud je oteven njak soubor, bude uzaven.
      Program se nept na uloen a ani automatick ukldn nen implementovno.
      Je tedy dleit vdy ped ukonenm aplikace prci uloit.

Transform
"-->" - transformuje grafiku na text
"<--" - transformuje text na grafiku
Podrobnji v stech o grafickm i textovm editoru. 

Jak ji bylo eeno, menu se ovld bu my, nebo z klvesnice.
Popis klves jen velmi strun.

F10 - vvoln menu, Enter a ipky maj bn vznam.

1.6. Vlastn prce s programem
Prce s programem je pomrn jednoduch, je vak teba popsat alespo zkladn prvky ovldn.
Hlavnm skalm je myslm fakt, e lze ob sti programu (textovou i grafickou) ovldat zrove a vcemn nezvisle.
Me tak dochzet k jist nekonzistenci dat mezi obma polovinami.
Toto by se mohlo zdt omezujc, ale nen tomu tak, pokud se pracuje jistm zpsobem, kter bude popsn ne.

1.6.1. Grafick editor
Ovldn grafick sti aplikace je pln zvisl na myi.
Kreslit lze pouze body.
Toto omezen bylo soust poadavku zadavatele a vychz i z filozofie METAFONTu. 
Kreslen a editace bodu - stiskem levho tlatka myi nad grafickm oknem se nakresl na pslunm mst bod.
Veker editace takto umstnho bodu je omezena pouze na zmnu jeho polohy, kter se provd stiskem pravho tlatka myi v tsnm okol ji umstnho bodu.
Tento bod se zru a pi ptm stisku levho tlatka se umst na novou pozici.

1.6.2. Textov editor
Textov editor se ovld pevn pomoc klvesnice.
Levm tlatkem myi lze pouze mnit polohu kursoru v textu.
Ovldn z klvesnice je bn jako u vtiny editor, tedy klvesy Enter, BackSpace, ipky, PgUp, PgDn, Home, End maj bn vznam a nemyslm si, e je zajmav popisovat podrobn jejich funkci.
Zajmav je mazn dk Ctrl+Y a oznaovn a koprovn blok.
Bloky jsou v tto verzi implementovny pouze jako st jednoho dku.
Blok se oznauje stiskem klvesy Alt a souasnm stiskem ipky.
Blok se do klipboardu kopruje pomoc Ctrl+Ins.
Vkldn bloku Alt + Ins.

Nkter omezen textovho editoru.
Dlka dku je omezena na 80 znak a poet dk je omezen na 100.

1.6.3. Proses transformace
Transformac nazvm proces, kdy se z grafick podoby generuje text, nebo naopak kdy se z textu generuje grafika.
Proces transformace grafika --> text se odehrv pmo uvnit programu, bez vyuit vnjch zdroj.
Kad bod  je po svm nakreslen pouze v grafick sti.
Jeho transformac se penese textov informace o jeho umstn tak do textovho okna a to tak, e na pozici kursoru.
V textovm okn lze tuto informaci libovoln mnit, tak aby nebyla poruena syntax METAFONTu. 
Transformace text --> grafika.
Tato akce se odehrv za pispn vlastnho METAFONTu ( viz. Parametr /m=metafont.exe ).
Obsah textovho okna se pedlo METAFONTu jako zdrojov text a podle toho, jestli METAFONT uspje, nebo nikoli, objev se v grafickm okn pslun vstup.
V ppad spchu se zobraz obrzek a nkter body (viz. dle).
Pokud METAFONT neuspje, zobraz se v grafickm okn chybov hlen METAFONTu a to tak, e na prv dce se zobraz prvn chyba a dl se zobraz zbytek log souboru generovanho METAFONTem.
V takovm ppad je teba upravit zdrojov text tak, aby byla odstranna pslun chyba.
Toto je vak vc znalosti METAFONTu, nikoli vc METAFONT Editoru. 
Te  bych se rd zmnil o tom, kdy a jak je mono pevst definice jednotlivch bod z textu do grafiky.
K tomuto elu slou makro mfshow zn, kde n je slo pslunho bodu.
Voln tohoto makra je automaticky generovno pro kad bod, kter se transformuje z grafiky do textu.
Odstrannm voln tohoto makra v textov sti se stane to, e nebude pi transformaci textu do grafiky penesena informace o poloze bodu a ztrat se tak monost jeho editace v grafickm okn.
Optovnm zpisem makra se tato monost obnov.
V tomto procesu hraje vznamnou roli soubor mfedit.mf.
Prv v nm je definovno makro mfshow zn, kter provd to, e do log souboru tvoenho pi voln METAFONTu vypisuje definice bod ve tvaru zn= a na dal dek (( (x,y), kde n pedstavuje slo bodu a x,y jeho souadnice.
Navc je v souboru definovno makro mfbye, kter se pouv jako ukonovac sekvence pi tvorb souboru pedkldanho METAFONTu jako zdroj pi transformaci text --> grafika.

Pozn.
Pi transformaci grafika --> text se pen jen body, jejich poloha byla zmnna. Tzn. Pen se vechny nov body + body, kter byly pvodn peneseny transformac text --> grafika a byly zeditovny.



2. PRUKA PROGRAMTORA
2.1. Obecn informace
V programtorsk pruce se dotete, z jakch modul je aplikace MFEditor sloena, jak spolu jednotliv moduly komunikuj, a jak se daj znovupout v jinch aplikacch.
Ke  kadmu modulu existuje vdy soubor jm_modulu.h s popisem jednotlivch td danho modulu a soubor jm_modulu.cpp se zdrojovmi texty v jazyku C++.
Vechny peklady probhaly pod pekladaem BorlandC v.3.1 na procesoru 486 DX2 s 16MB RAM pod OS MS DOS.

Moduly z nich aplikace sestv jsou tyto:
mouse      	- ovldn myi.
keyboard  	- ovldn klvesnice
window    	- modul popisujc okna a jejich vzjemnou komunikaci.
app           	- aplikan modul. Spojuje v sob vechny ti pedchoz moduly.
file            	- prce se soubory. 
text        	- modul pracujc se soubory
editwnd    	- odvozen od modulu window. Popisuje chovn grafickho a textovho editovacho okna .
mf_elem   	- popisy jednotlivch objekt odpovdajcch objektm METAFONTu.
main         	- hlavn st cel aplikace. Spojuje v sob ve ve zmnn.

a navc hlavikov soubory
defs.h       - nkter definice pouvan v cel aplikaci.
events.h   - popis struktury udlost a zprv. Je poteba v modulu window.

a knihovna 
graphics.h - knihovna s grafickmi rutinami. Rozen o far verzi egevga.bgi.

V nsledujcch kapitolch podrobn probereme vechny zmiovan moduly.


2.2. Modul  MOUSE 
ovldn myi
V modulu se nachzej tyto definice:

struct TMouseEvent
 {
   word X,Y;
   clock_t EV_Time;
 };

Pomocn struktura. Popisuje udlost myi.
 X,Y     - poloha.
 EV_Time - as vzniku udlosti.

class TMouse
{
    bool  is_mouse;
    int   int_mouse;          
    word  buttons;            
    void  CallMouse( byte sluzba, word& par1, word& par2, word& par3, word& par4);
    TMouseEvent timewatch[6];
    bool  swtch[3];           
    int   dblclik;            

  public:
    bool IsMouse();
    bool DoubleClick(word Button);
    void Show();
    void Hide();
    void Position(word& x, word& y,bool& btn1,bool& btn2,bool& btn3);
    void Press(word co,word& kolik, word& x, word& y);
    void UnPress(word co,word& kolik, word& x, word& y);

    void ResetPress();

    void RelPosition(word& x, word& y);
    void Set_G_Cursor(word hsx, word hsy, int * gcursor);
    void SetArrow();
  void SetKriz();
    void SetPosition(word x, word y);
    void SetBorder(word x1,word y1,word x2, word y2);

    TMouse(int karta);
   ~TMouse();
};

bool  is_mouse
promnnou nastavuje konstroktor TMouse().
M  hodnotu 0, pokud se my nepodailo inicializovat.
V opanm ppad m hodnotu 1.
    
int   int_mouse
peruen myi.
Standardn 33h.
Vtina ovlada myi se ve na toto peruen.

word buttons
poet tlatek myi.
Nastavuje konstruktor myi Tmouse() podle potu tlatek podporovanch ovladem myi.
Ne nutn odpovd skutenmu potu tlatek.
            
void  CallMouse( byte sluzba, word& par1, word& par2, word& par3, word& par4);
voln slueb myi pes peruen.
	byte  sluzba - typ poadovan sluby 0x00 - 0x0F
	word  par1  - par4 jsou doplujc parametry voln.
        Navc se v tchto parametrech umsuj nvratov hodnoty.
CallMouse(..) pracuje tak, e napln registry procesoru pslunmi hodnotami a vyvol peruen s hodnotou int_mouse (zde 33h).
Nvratov hodnoty jsou uloeny do par1 .. par4 podle typu sluby (viz. sysman, nebo  podobn literatura popisujc jednotliv peruen procesoru)

TMouseEvent timewatch[6] 
pole esti udlost od myi, resp. jejich polohy a asu.
Souvis tsn s promnnou bool  swtch[3].
Ob promnn zavdm kvli testovatelnosti doubleclick.
Pro kad ze t tlatek myi je v promnn swtch[i] uloena hodnota bu   1, nebo 0.
Index i zde pedstavuje pslun slo_tlatka i=0 lev, i=1 prav, i=2 prostedn.
Hodnota swtch[i] slou jako pomocn index do pole timewatch[j].
Index j v tomto poli tak souvis s tlatky.
j=0,1 - lev,  j=2,3 - prav  j=4,5 - prostedn.
V promnn timewatch jsou pro kad tlatko myi uloeny asov daje o dvou poslednch stiscch toho kterho tlatka (jejich poloha a as) podle indexu j.

   LeftButton = 0, RightButton = 1, MiddleButton = 2;
   timewatch[0],[1] dva po sob jdouc stisky levho tlatka
   timewatch[2],[3] dva po sob jdouc stisky pravho tlatka
   timewatch[4],[5] dva po sob jdouc stisky prostednho tlatka
	    [i],[i+y] i=2*..Button,y=0/1=swtch[..Button]

Cel mechanismus funguje nsledovn:
Pokud se zjist, e dolo ke stisku tlatka myi (viz. TMouse::Pressed(..)) zape se tento daj (X,Y,as) do pslun poloky pole timewatch.
Index se zjist tak, e k i=slo_tlatka se pite swtch[i] a toto slo se pouije jako index do pole timewatch.
Nsledn dojde k "peklapnut" promnn swtch[i], kde i odpovd  stisknutmu tlatku.
Tzn. pi ptm zpisu pro toto tlatko se pouije druh z jeho index do pole timewatch.
Tento cel apart slou k tomu, aby se dalo zjistit, dolo-li k doubleclicku (viz. TMouse::DoubleClick()).

Nevhody:
   1) Nelze zjistit, jestli nhodou nedolo nap. k stisku lev-prav-lev.
     Pokud by se toto stihlo v ase menm, ne je dblclick (viz. ne), nejednalo by se o skuten doubleclick, ale program by to tak interpretoval.
     Nicmn as stanoven jako horn hranice pro doubleclick je dostaten mal na to, aby bylo reln mon v tomto intervalu stisknout tikrt libovoln tlatko.
   2) DoubleClick(..) ztrat svj inek, pokud nebude dostaten dlouho teno pomoc Press().
     Buhuel TMouse nen implementovna asynchronn a  tak zde vznikaj problmy.
     Nap. s tm, e pokud dlouho nebude teno pomoc Press(),
     mohlo by dojt k tomu, e se nkter stisky ztrat (viz. TMouse::Press()).  Je teba vzt v vahu, e hodnota asu se aktualizuje v okamiku ten pomoc Press(),
     nikoli pmo v okamiku stisku.

int dblclik
maximaln as pro doubleclick.
Je-li rozdl as dvou po sob jdoucch stisk pro danou klvesu  vet jak tato  hodnota, nepovauje se toto za doubleclick.


Veejn metody tdy TMouse:

bool IsMouse()
vrac hodnotu uloenou v is_mouse.

bool DoubleClick(word Button)
Button - slo tlatka:  LeftButton = 0, RightButton = 1, MiddleButton = 2;
Funkce vrac 0 v ppad, e dva nsledujc stisky tlatka Button   byly od sebe asov vzdleny o vce ne TMouse::dblclik, nebo k nim dolo na jinch souadnicch.
Zjist se to jednoduchm porovnnm pslunch hodnot v promnn timewatch.
(viz. TMouse.timewatch)

Nsledujc funkce a po SetBorder(..) vyuvaj TMouse::CallMouse(..)


void Show()
zobraz kurzor myi.

void Hide()
skryje kurzor myi.

void Position(word& x, word& y,bool& btn1,bool& btn2,bool& btn3);
Vrac x,y pozici myi.
Pro kad tlatko btn1-btn3 vrac 0 nen-li stlaeno a hodnotu nenulovou, je-li v danm okamiku stlaeno.

void Press(word co,word& kolik, word& x, word& y);
Volnm tto funkce jako parametr v promnn co oekv slo tlatka.
V promnn kolik vrac poet stisk danho tlatka od poslednho ten pomoc Press().
x,y jsou souadnice poslednho stisku.

Nevhodou je, e pokud dojde k nkolika rychlm stiskm dve, ne dojde k novmu vyvoln metody Press(), me se mi nkolik stisk ztratit.
Tuto situaci lze zjistit tak, e po voln Press() bude hodnota kolik > 1.
Nelze vak ji nijak zjistit, jak byly pedchoz stisky.
Plat  zde podobn vc jako u metody DoubleClick().
Sice se teoreticky me stt, e se nkter stisk ztrat, ale v praxi nedochz ke stiskm tak asto.
Je teba tedy dbt toho, aby se aplikace vracela k voln metody TMouse::Press() pokud mono pravideln a co nejatji.
Pokud se tato metoda uke jako nevhodn (nap. pi programovn her), je teba pout njak modul, kter zpracovv udlosti od myi asynchronn.

 Press() vynuluje poet stisk a navc nastav pslun hodnoty do promnnch timewatch a swtch. (viz. timewatch, DoubleClick())

void UnPress(word co,word& kolik, word& x, word& y);
Metoda je podobn metod Press(), jen s tm rozdlem, e obsahuje  poet uvolnn pslunho tlatka od doby poslednho ten pomoc UnPress().

void ResetPress();
Vymae z obsluhy peruen informace o stiscch klves.

void RelPosition(word& x, word& y);
Vrac relativn pozici myi od poslednho teni touto funkc.
Pozn. vrac word, ale relativn souadnice mohou bt i zporn.
Vsledek je tedy nutno petypovat na int.

void Set_G_Cursor(word hsx, word hsy, int * gcursor);
Nastavuje grafick kursor.
hsx,hsy  urujc, na kter bod kursoru se m  vztahovat daj o pozici. 0,0 = lev horn roh
gcursor ukazatel na definici kursoru (viz. sysman, nebo jin podobn literatura zabvajc se podrobneji peruenmi)

void SetArrow();
Nastav kurzor do tvaru ipky.
Vyuv k tomu Set_G_Cursor();

void SetKriz();
Nastav kurzor do tvaru ke.
Vyuv k tomu Set_G_Cursor();

void SetPosition(word x, word y);
Nastav my na danou pozici x,y.

void SetBorder(word x1,word y1,word x2, word y2);
Nastav hranice oblasti, v n se me my pohybovat.
x1,y1- lev horn a x2,y2 - prav doln roh oblasti. 



TMouse(int karta);
Konstruktor.
Parametr karta je id grafick karty (viz. graphics.h - standardn hlavikov  soubor) 
Tento konstruktor pln nkter datov poloky tdy TMouse.
Do promnn is_mouse pstupn pes metodu  IsMouse() dv 1, nebo 0 podle toho, jestli je, nebo nen instalovn ovlada  myi.
 (viz. is_mouse)

~TMouse();
Destruktor. Zad, aby se my korektn ukryla a pot zru tdu TMouse.


2.3. Modul KEYBOARD
ovldn klvesnice
Tda Keyboard implementuje jednoduch interface pro prci s klvesnic.

Interface td a metody jsou napsny v Borland C++ 3.1, nzkorovov rutiny v Turbo Assembleru 3.0.
Modul pouv instrukce procesoru 386 a lze ho pout pro vechny modely.

Tda Keyboard:
Vyuv pouze sluby BIOSu.
ten klves je mon jen tak, e se neustle metodou Pressed() testuje, zda nebyla stisknuta njak klvesa.
Pokud ano, pak se mus zavolat metoda Read().
Tento postup naprosto nevyhovuje pro poteby  udlostmi zenho programovn a je vhodn jen pro ty nejjednodu aplikace.
V tomto reimu nelze vyut monosti  pedefinovn klvesnice a implementovat tak napklad  nrodn podporu.
Klvesnice pracuje s 16-bitovmi kdy klves.
Nich 8 bit uruje ASCII kd, kter klvesa generuje.
Tento kd je dleit pro aplikan program.
Vych 8 bit udv tzv. scan kd, urujc pozici klvesy na klvesnici.
Kad klvesa m piazen svj scan kd.
Klvesnice rozeznv ti typy klves:
znakov:
Tyto klvesy obvykle generuj znaky (i dc), tedy znaky  s ASCII kdy mezi 1 a 255.
Scan kdy tchto klves uruj pozici klvesy na klvesnici.
rozen:
Tyto klvesy negeneruj ASCII kd.
Pat sem napklad  funkn a kurzorov klvesy, klvesy Delete, PgUp, Home apod.
Tyto klvesy generuj vdy nulov ASCII kd.
Scan  kd zde u neodr pozici klvesy na klvesnici, ale uruje vlastn jaksi rozen kd.
Napklad stisk  F1 a Alt-F1 generuje rzn scan kdy, pestoe se jedn vdy o stejnou klvesu.
peazovae:
Jsou to klvesy Shift, Alt, Ctrl, CapsLock, NumLock,  ScrollLock, SysReq a Pause.
Tyto klvesy maj tak sv scan kdy, ale neukldaj se do bufferu klvesnice.
Jejich stisk zpsobuje pouze zmnu pznak v internch promnnch BIOSu.
Pat sem tak tzv. akcentov klvesy (viz dle), kter umouj generovat znaky s diakritikou.

 Pznaky stavu peazova klvesnice maj nsledujc vznam:
    
 Symbol. jmno masky 
  Bit 
  Vznam                   
  KF_RIGHTSHIFT         
0 
 Prav Shift              
  KF_LEFTSHIFT           
1  
 Lev Shift               
  KF_CTRL                
2   
 Ctrl (lev nebo prav)   
  KF_ALT                 
3   
 Alt (lev nebo prav)    
  KF_SRCOLL             
4   
 Scroll LockLock          
  KF_NUM                
5 
 Num Lock                 
  KF_CAPS                
6 
 Caps Lock                
  KF_INSERT            
7 
 I nsert                   
  KF_LEFTCTRL         
8
 Lev Ctrl                
  KF_LEFTALT            
9 
 Lev Alt                 
  KF_SYSREQ             
A 
 SysReq                   
  KF_PAUSE             
B 
 Pause                    
  KF_RIGHTCTRL        
C 
 Prav Ctrl               
  KF_RIGHTALT           
D 
 Prav Alt                
  KF_SHIFT               
E   
 Shift (lev nebo prav)  


Pro popis pedefinovn klvesnice se pouv nsledujc datov struktura:
Tato struktura obsahuje nkolik poloek:
      near ptr Normal;
      near ptr Shifted;
      near ptr Accent;
      near ptr LowUp;
      word LowUpSize;

   Pevod klves se provd podle scan kd, aby bylo mon se vyhnout  ppadn interferenci s dve instalovanm rezidentnm ovladaem  klvesnice.
   Chov-li se tento ovlada "slun" a dodruje jist pravidla,   pak by nemlo dochzet k dnm problmm.
   Pevdt lze pouze znakov  klvesy zkladnho bloku klvesnice.
   Jejich scan kdy jsou 1 a 53 - viz.  schma klvesnice:

Esc


F1
F2
F3
F4

F5
F6
F7
F8

F9
F10
F11
F12

~   
!
@
#
$
%
^
&
*
(
)
_
+
|
Bspc

`     29
1    02
2    03
3    04
4    05
5    06
6    07
7   08
8   09
9   0A
0   0B
-    0C
=   0D
\    2B
    

 Tab
Q
W
E
R
T
Y
U
I
O
P
{
}
       

 
10
11
12
13
14
15
16
17
18
19
[   1A
]   1B
       

 Caps
A
S
D
F
G
H
J
K
L
:
"
            Enter     

   Lock
1E
1F
20
21
22
23
24
25
26
;     27
'     28
           

 Shift
Z
X
C
V
B
N
M
<
>
?
  Shift


2C
2D
2E
2F
30
31
32
,     33
.     34
/    35
             
Ctrl  


Alt
                                Space               
Alt   
     
Ctrl


Ukazatele Normal a Shifted ukazuj na tabulky velk 54 byt.
Kad byte tabulky obsahuje ASCII kd, kter m vracet klvesa s pslunm scan kdem.
Scan kdu 24 tedy odpovd 24-t byte tabulky a jeho hodnota je  ASCII kd, kter m klvesa vygenerovat.
Pokud je hodnota bytu 0, pak se ponech pvodn hodnota.
Tuto hodnotu je vhodn pout u klves, kter negeneruj potebn znaky (Enter, Backspace, Tab apod.) Prvn tabulka je urena pro ppad, e nen stisknut Shift, druh pro ppad, e je stisknut.
Jsou-li stisknuty peazovae Ctrl nebo Alt, pevod se neprovede.
Je-li stisknut Caps Lock, pak zle na stavu peazove Shift.
Nen-li Shift stisknut, pak se pro pevod pouije prvn tabulka a vygenerovan znak se pak pevede na velk.
Pokud je Shift stisknut, pouije se druh tabulka a vsledn znak se pevede na mal.
   Pro pevod mezi malmi a velkmi znaky se pouv dvojit tabulka, na  kterou ukazuje ukazatel LowUp a poet poloek je LowUpSize (skuten velikost tabulky je LowUpSize*2).
   Prvn st tabulky obsahuje mal znaky a druh odpovdajc velk znaky.
   Pi pevodu z malch znak na velk se  v prvn sti vyhled mal znak a pokud se najde, pevede na odpovdajc velk znak.
   Pi pevodu z velkch znak na mal se to provede opan.

Tda TKeyboard:

class TKeyboard
{
  public:

    byte ErrorCode;

    _cdecl TKeyboard();
    _cdecl ~TKeyboard();
    _cdecl word Read();
    _cdecl bool Pressed();
    _cdecl byte AltToASCII( word code );
    _cdecl void Flush();
};

Tda Keyboard obsahuje jedinou veejnou datovou poloku:
byte ErrorCode;
Tato promnn indikuje, zda inicializace klvesnice probhla v podku.
Pi inicializaci implicitnm konstruktorem Keyboard() je jej hodnota vdy ERR_OK, kter signalizuje, e je ve v podku.



 Tda Keyboard obsahuje tyto veejn funkce, konstruktory a destruktor:

Keyboard();
Implicitn konstruktor.
Inicializuje podporu klvesnice, kter neumouje asynchronn obsluhu klvesnice.
Po instalaci se automaticky vyprzdn buffer klvesnice.

~Keyboard();
Destruktor. Provd odinstalovn podpory klvesnice a vyprzdn buffer klvesnice.

word Read();
Vrt kd klvesy z bufferu klvesnice.
Metoda pouv sluby BIOSu a  neprovd se zde dn transformace kd klves.
Nen-li v bufferu dn  znak, pak se bude na stisk klvesy ekat (program se zablokuje a do stisku njak klvesy).
Ped volnm tto metody je vhodn nejdve zavolat metodu Pressed(), m se otestuje, zda v bufferu klvesnice njak klvesa je.
Pokud tam nen, bude se ekat tak dlouho, dokud njak klvesa nebude stisknuta.

bool Pressed();
Metoda vrac 1, pokud je v bufferu klvesnice alespo jedna klvesa.
Jinak, je-li buffer przdn, vrac 0.

byte AltToASCII( word code );
Pevede kd klvesy "Alt-znak" reprezentovan kdem code na "znak".
Pro   klvesu "Alt-X" napklad vrt ASCII hodnotu "X" (tedy 0x58).
Pokud je  v code neplatn kd, vrt 0.

void Flush();
Vyprzdn buffer klvesnice.

Navc v souboru keyboard.h jsou definovny konstanty pro identifikaci jednotlivch klves.


2.4. Modul WINDOW
modul popisujc okna a jejich vzjemnou komunikaci.
Dokumentace k modulu WINDOW je rozdlena na dv sti.
Uivatelsk st je urena tm, kte by modul WINDOW chtli pouvat ve svch aplikacch.
Programtorsk st jde vce do hloubky a podrobnji se zabv implementac metod pouitch pi programovn modulu WINDOW.
Ve tet sti nazvan NEDOSTATKY A ZLEPEN diskutuji nkter nedostatky modulu WINDOW.

2.4.1. UIVATELSK  ST                           
2.4.1.1. Obecn informace
  Ne popsan tdy jsou zkladem graficky orientovanho uivatelskho prosted, jen me slouit jako zklad pro tvorbu aplikac nad tmto prostedm.
  Jsou zde implementovny zejmna zklady pro vstup na obrazovku, pro pijmn a oeten jednotlivch udlost a je zde kompletn navrena jak struktura zprv a udlost, tak vzjemn komunikace mezi jednotlivmi objekty.
  Objekty zde rozumm zejmna okna a aplikace.
 Dal moduly pipojovan k tomuto jsou:

defs.h          - definice nkterch maker, konstant
events.h      - definice typ udlost a zprv
keyboard.h - modul pro prci s klvesnic
mouse.h      - modul pro prci s my

 O vech modulech se mete podrobnji dovdt z jednotlivch kapitol tto dokumentace.    




2.4.1.2. Popis jednotlivch td
Nsleduj jednotliv tdy a popis jejich metod:
2.4.1.2.1. TWindowClass
Tda TWindowClass je zkladem ddinosti.
Tato tda je ist virtuln a zavd se zejmna z dvod definovn komunikace mezi jednotlivmi okny aplikace a vlastn aplikac (viz. modul APP)

class TWindowClass
{
   friend TGroupWindow;

 protected:
      virtual void Repaint();
      virtual void Paint()=0;
      
      int X, Y, W, H;
      int AbsX, AbsY;    
      word Flags;
      int Pattern;
      int Color;
      int BKColor;
      hWindow  hNext;
      hGroupWindow hParent;

	    	     bool SendMessage( word id, hWindow to, word wparam, long lparam );
      virtual bool SendEvent( EVENT&, hWindow );
      virtual void SetAbsXY();
	            bool In( EVENT& );
      virtual bool HandleMouse( EVENT& );
      virtual bool HandleKey( EVENT& );

public:
      TWindowClass();
      virtual ~TWindowClass();
	        
      int SayWidth();
	    int SayHeight();
	    int SayColor();
	    int SayBKColor();
      int SayAbsX();
      int SayAbsY();
   
   virtual bool    HandleEvent( EVENT& );
	            hWindow GetNext();
};

Ptelem tdy TWindowClass je tda TGroupWindow.
Datov poloky tdy TWindowClass jsou nsledujc:

int X, Y, W, H, AbsX, AbsY;
X,Y  jsou relativn souadnice okna vzhledem k rodiovi. 
AbsX, AbsY jsou absolutn souadnice na obrazovce.
Sv absolutn souadnice si pot kad okno samo z absolutnch souadnic rodiovskho okna prostm pitenm X resp Y k tmto souadnicm.
Dle, pokud nebude uvedeno jinak, je rodiovskm oknem myleno to okno, na kter se odkazuje kad okno pomoc datov poloky hParent (viz. ne),  nikoli okno rodiovsk ve smyslu ddinosti.
W,H jsou ka a vka okna

  word Flags;
   tato poloka se pouv pro nastaven nkterch specifickch pznak pro dan okno.
   (viz.window.h konstanty FLG_????)


int Color,BKColor;
   zkladn barvy okna.
   Kadmu oknu je pidlena dvojice barev Color je barva  poped a BKColor barva pozad.

int Pattern;
   vplov znak.
   Pouv se k vyplnn vnitku okna.

hWindow  hNext;
   ukazatel na bratra (dalho potomka na stejn rovni od jednoho rodiovskho okna).
   Ble Programtorsk st kapitola :Vztahy rodi-potomek, bratr-bratr (ne v tomto dokumentu).

hGroupWindow hParent;
ukazatel na rodiovsk okno.
Ble Programtorsk st - kap.2 Vztahy rodi-potomek, bratr-bratr

lenskmi metodami tdy TWindowClass jsou nsledujc funkce:

virtual void Repaint();
zajiuje voln Paint().

virtual void Paint()=0;
pro tdu TWindowClass je przn.
Jak ji bylo eeno, TWindowClass je tda  ist virtuln a elem jej existence je pouze monost budovat dal hierarchii ddinosti.
Od tdy TWindowClass nelze tvoit dn instance.

bool SendMessage( word id, hWindow to, word wparam, long lparam );
pole zprvu 'id' (standardn zprvy zanaj EV_ a jsou definovny v events.h) oknu identifikovanmu ukazatelem 'to'.
Parametry wParam a lParam je mon pouvat jako pdavn informace k dan zprv.
Typicky lParam lze pout jako far pointer na datovou strukturu obsahujc potebn doplkov informace.
Je teba provdt vhodn petypovn.
lParam je typu long !
SendMessage ek, dokud adrest njakm zpsobem zprvu neoet.
Pokud se adrestovi poda danou zprvu zpracovat, vrt kladnou hodnotu a v ppad nespchu vrac nulu.
Typickm  pouitm jsou msta, kde rodiovsk okno postupn vyaduje od svch potomk uritou innost s tm, e ho zajm, jak ten kter z nich na danou zprvu reagoval.
Pole jim tedy uritou zprvu pomoc SendMessage() a podle nvratov hodnoty zjist, jak synovsk okno na danou zprvu reagovalo.

virtual bool SendEvent( EVENT& ev, hWindow to );
   Pole udlost 'ev' oknu 'to'.
   Udlost je nejen zprva, ale teba stisk myi nebo klvesy.
   Zprva je tedy jen jeden typ udlosti.
   Definice zprv a udlost viz. events.h.

virtual void SetAbsXY();
   Nastav sv absolutn souadnice tak, e k absolutnm souadnicm svho rodie pite sv relativn X a Y.

bool In( EVENT& ev);
   Testuje, zde udlost od myi obsaen v ev je uvnit, i mimo okno.
   V ppad spchu vrac TRUE, jinak vrac FALSE.

virtual void HandleMouse( EVENT& );
   Oeten udlosti od myi.
   Tato funkce by nemla bt volna pmo, ale z  veejn fce.
   HandleEvent(EVENT& ev).

virtual bool HandleKey( EVENT& );
   Oeten udlosti z klvesnice.
   Podobn jako HandleMouse() v ppad spchu vrac TRUE, jinak vrac FALSE.
   Takt tato fce. by mla bt volna pouze z HAndleEvent(EVENT& ev)


TWindowClass();
   implicitn konstruktor.
    Pln datov poloky takto:
     Flags = FLG_NO;
     hParent = NULL;
     hNext = NULL;
     Color = 0xF;
     BKColor=0xF;
     Pattern = EMPTY_FILL;
     X = Y = 0;
     W = H = 1;

virtual ~TWindowClass();
   destruktor.
   Nem dnou speciln funkci.

byte SayColor();
byte SayBKColor();
   vrac barvy danho okna.

virtual byte SayWidth();
virtual byte SayHeight();
   vrac ku (vku) okna.
   Datov poloka Width (Height).

virtual byte SayAbsX();
virtual byte SayAbsY();
      vrac absolutn souadnici X (Y) okna.

virtual bool HandleEvent( EVENT& ev);
   hlavn funkce pro zpracovn udlost.
   Parametr ev je udlost v systmu  bu udlost od myi, od klvesnice, nebo njak zprva  (MESSAGE viz. events.h).
   HandleEvent() je urena k dalmu pedefinovn u potomk (ve smyslu  ddinosti).
   Roztiuje udlosti podle jejich typu.
   Oeten udlost od myi postupuje metod HandleMouse(), udlosti od klvesnice metod HandleKey() a zprvy (MESSAGE) zpracovva sama.
   TWindowClass sama o sob reaguje na vechny zprvy tak, e je ignoruje, tzn. nem dnou z ve zmiovanch metod pedefinovanou.
   Ve vech ppadech vrac TRUE, jako e udlost je zpracovna.
   Pokud si budu u zddnho objektu pt, aby mi reagoval na nkter typy udlost, musm mu pedefinovat pslunou metodu.
   Mechanismus, jakm se to provd, je ble popsn nap. u td TDesktop, TGroupWindow, nebo TWindow.

hWindow GetNext();
   vrac ukazatel na sourozence ( hNext ).
   Pokud nem dnho, vrac NULL.

hGroupWindow GetParent();
   vrac ukazatel na rodie ( hParent ).
   Pokud nem dnho, vrac NULL.
   Rodi je typu TGroupWindow, nebo nkter od tohoto typu odvozen.


2.4.1.2.2. TGroupWindow
Tda TGroupWindow je pmm potomkem TWindowClass.
Je tak ist virtuln tdou a slou jako zklad ddinosti pro okna, je mohou mt sama potomky.
Myleno potomky ve smyslu okna rznch typ, vnoench do jednoho spolenho rodiovskho okna.

class TGroupWindow : public TWindowClass
{
  protected:
    hWindow hChild;

    virtual void SetAbsXY();
    virtual void Repaint();
    virtual bool HandleMouse( EVENT& );
    virtual bool HandleKey( EVENT& );

  public:

    TGroupWindow();
    ~TGroupWindow();

    virtual bool HandleEvent( EVENT& );
	          void InsertWindow( hWindow );
	          void DeleteWindow( hWindow );
	          bool RemoveWindow( hWindow );
	          void SetActiveWindow( hWindow );

    hWindow GetChild();
};

Z datovch struktur oproti TWindowClass zde pibv hChild typu  hWindow ( TWindowClass* ).
Obsahuje bu NULL, pokud okno nem dn synovsk okna, nebo ukazatel na prvn okno v seznamu syn.
Organizace u synovskch oken je vytvoena tak, e kad okno-syn obsahuje ukazatel na svho rodie a svho bratra (nsledujcho syna jednoho rodie).
 Ble Programtorsk st - kapitola Vztahy rodi-potomek, bratr-bratr

lenskmi metodami jsou nsledujc funkce:

virtual void SetAbsXY();
pedefinovan metoda tdy TWindowClass.
Stejn jako v TWindowClass nastav sv absolutn souadnice a navc vechny sv syny donut, aby si kad z nich pepotal sv vlastn absolutn souadnice.
Funkce m rekurzivn charakter, co znamen, e se v synovskm okn vyvol SetAbsXY() a pokud je toto synovsk okno typu TGroupWindow, nebo od nj odvozen pes hierarchi ddinosti, zavol tut metodu i svch ppadnch potomk.

virtual void Repaint();
pedefinovan metoda tdy TWindowClass.
Projde vechna sv synovsk  okna a zavol jejich Repaint().
Tm se docl toho, e pokud chceme pekreslovat okno tdy TGroupWindow, nebo nkter tdy od tto zddn, nemusme se starat o sprvn nakreslen synovskch oken.
Tuto starost za ns vye TGroupWindow::Repaint().
Ble Programtorsk st - kapitola Metody pro kreslen oken









bool Inside( EVENT &ev );

tuto metodu zavd a tda TGroupWindow.
Funkce vrac TRUE, jestlie udlost od myi padla dovnit okna a FALSE v opanm ppad.
Svou funknost se podob fci.
In(EVENT &ev), ale m ponkud jin cl.
Zatmco In() vrac TRUE, pokud udlost od myi "padla kamkoli na okno", Inside() vrac TRUE pouze pokud odlost padla dovnit okna, m se mysl to, e okno me mt njak rmeek, jeho vka a ka mohou bt rznch, pedem nadefinovanch rozmr a tedy zabraj uritou plochu okna.
Na zbytku plochy okna ( uvnit tohoto rmeku) mohou bt umstna nap. synovsk okna.
Pokud oknu pijde udlost od myi a "tref" se do rmeku ( In() vrt TRUE, ale Inside() vrac  FALSE), nen teba postupovat tuto udlost ppadnm synovskm oknm..
Tm se zajiuje tak to, aby se zprvy uren "rmeku" nepostupovaly  ke zpracovn synovskm oknm.
Ble Programtorsk st - kapitola  Udlosti a jejich zpracovn

TGroupWindow();
Implicitn konstruktor.
Pln datov poloky stejn jako konstruktor tdy TWindowClass a poloku hChild pln hodnotou NULL.

~TGroupWindow();
 Implicitn destruktor.
 Nepln dnou zvltn funkci.

virtual bool HandleEvent( EVENT& );
metoda HandleEvent( EVENT& ) je pedefinovna tak, aby se veker udlosti oetily na sprvnm mst.
Star se o to, aby doruila pslun zprvy i potomkm, pokud je neum zpracovat sama.
Ble Programtorsk st - kapitola Udlosti a jejich zpracovn

void InsertWindow( hWindow hw);
do seznamu potomk zaad nov okno na nj ukazuje ukazatel hw.
Zaad ho na zatek  seznamu syn.

void DeleteWindow( hWindow hw);
ze seznamu syn nejprve vyad to synovsk okno,  na ne ukazuje hw a pot zavol  jeho destruktor.

bool RemoveWindow( hWindow hw );
pouze odstran okno hw  ze seznamu syn.
Neuvoluje jej  fyzicky z pamti volnm destruktoru.

void SetActiveWindow( hWindow hw);
jako aktivn okno nastav svho syna, na nej ukazuje hw.

void SetNextWindow();
jako aktivnho syna nastav bezprostednho bratra prv aktivnho okna a aktivn okno zaad na konec seznamu syn.

hWindow GetChild();
vrac ukazatel na prvnho syna, pokud jej m, jinak vrac NULL.

Rozdl mezi TWindowClass a TGroupWindow zpov v tom, e TGroupWindow je rozenm TWindowClass o monost zavst oknu jako potomky dal okna.


2.4.1.2.3. TDesktop
Tda TDesktop je pmm potomkem tdy TGroupWindow a m v GUI zvltn lohu.
Zavd se jako pm komunikan most mezi aplikac a jejmi jednotlivmi okny.
Stv se hlavnm oknem aplikace a vechna nov okna se vkldaj bu jako synovsk okna desktopu, nebo jinho, ji existujcho okna, kter bylo nutn vloeno ji zmnnm postupem.
Kad okno tak m zarueno, e m definovanho rodie ( hParent ), jm je na nejvy rovni desktop.
( viz kapitola Vazba modulu window na aplikan modul ).

class TDesktop : public TGroupWindow
{
   friend class TApplication;

   protected:

      virtual void Paint();
      virtual bool HandleMouse(EVENT& );
   public:

      TDesktop(int x,int y,int w,int h);
      virtual ~TDesktop();

};

Ptelem tdy TDesktop je tda TApplication (viz. modul APP).

Tda Tdesktop nezavd dn nov datov poloky, jen pedefinovv nkter  metody tdy TGroupWindow.

virtual void Paint();
  jednodue se nakresl pomoc definovanch barev a s pslunm vplovm  vzorem.

TDesktop(byte x,byte y,byte w,byte h);
  konstruktor.
  x,y jsou souadnice levho hornho rohu a w,h jsou ka a  vka.

~TDesktop();
  destruktor. Nem dnou zvltn funkci.

Tda TDesktop ji nen ist virtuln.
Lze od n tedy tvoit instance.
Nem vak dn vt smysl tvoit vce instanc tto tdy, nebo tdy od tto odvozen v jedn aplikaci.
Tda TDesktop dd chovn tdy TGroupWindow.
Um tedy pracovat se seznamem syn a zpracovvat nkter standardn udlosti. Pokud bychom chtli, aby tda TDesktop reagovala na udlosti od myi, nebo klvesnice njakou zvltn funkc, museli bychom pedefinovat jej pslun metody.


2.4.1.2.4. TMenuItem

Tda TMenuItem je potomkem tdy TWindowClass.
Tda TMenuItem se zavd pro potebu tvorby menu v aplikaci.
Jednotliv instance tdy se stvaj polokami  menu.
Kad instance tak automaticky zskv vechny vhody zddn po td TWindowClass.
Tzn. aplikace me  s jednotlivmi polokami menu komunikovcat jako s jinmi okny a stejn tak kad MenuItem me jako kterkoli jin okno komunikovat s aplikac.
Rodiovskm oknem kadho MenuItemu je instance tdy TMenu.

class TMenuItem: public TWindowClass
{

     char *Text;
     word HotKey;
     word Message;
     hPopupMenu PopupMenu;

     bool HandleMouse(EVENT& );
     bool HandleKey(EVENT& );
     void Paint();
     void PaintInv();


  public:

     bool HandleEvent(EVENT& );
     void RePaint(bool ); //0-standard, 1-inverzne
     hMenuItem GetNext();
     TMenuItem( char *txt,word hk,word message,int x, int y,int w,int h, hPopupMenu);
     TMenuItem( char *txt,word hk,word message,int x, int y,int h, hPopupMenu);
    ~TMenuItem();

};

Datov poloky zaveden ve td TMenuItem jsou:
char *Text     - text pslun danmu MenuItemu.
word HotKey - klvesa, na kterou pslun MenuItem reaguje.
M stejn  vznam jako kliknut my na danm MenuItemu. 
word Message- zprva, kterou MenuItem generuje a posl aplikaci ke zpracovn pokud je aktivovn (my, nebo klvesou).

Z metod to jsou:

bool HandleMouse( EVENT& );
Pokud pijde udlost od myi a je to stisk levho tlatka, pole MunuItem svoji Message aplikaci.

bool HandleKey(EVENT& );
Pokud je stisknut Enter, pole MunuItem svoji Message aplikaci.

void Paint();
popisuje jakm zpsobem se m dan MenuItem kreslit.

bool HandleEvent( EVENT &ev );
Pokud pijde udlost od klvesnice a kd klvesy odpovd hodnot HotKey, pole MenuItem svoji Message aplikaci.
Jinak se zavol TWindowClass::HandleEvent().




TMenuItem( char *txt,word hk,word message,int x, int y,int w,int h, hPopupMenu PopupMenu);
TMenuItem( char *txt,word hk,word message,int x, int y,int h, hPopupMenu);
konstruktory. Pln data takto:

Text=txt;
HotKey=hk;
Message=message;
X=x;
Y=0;
W=w; pro prvn
W=strlen( txt )+2; pro druhou variantu 
H=1;
Pattern=' ';

Prvn varianta se uplatn pokud je MenuItem vkldn do PopupMenu a druh pokud do Menu.

2.4.1.2.5. TMenu

Tda TMenu je potomkem tdy TGroupWindow.
Ve spojen s tdou TMenuItem je prostedkem k budovn aplikanho menu.
Idea je takov, e instance TMenu obsahuje jako sv synovsk okna instance tdy TMenuItem se vemi metodami tak, jak byly popsny ve. 

class TMenu:public TGroupWindow
{
   friend class TApplication;

      int WW;
    
      bool HandleKey( EVENT& );
      bool HandleMouse( EVENT& );
      void Paint();

   protected:
      hMenuItem  ActiveItem;
      hPopupMenu ActivePopup;


   public:
      TMenu(int x,int y,int w,int h);
      virtual ~TMenu();
      bool HandleEvent( EVENT& );
      void Repaint();
      void InsertItem( char* txt,word hk,word message,hPopupMenu );
      int SayAbsX();
      int SayAbsY();
};

Ptelem tdy TMenu je tda TApplication.

Jako datovou poloku si pidv
byte WW. M smysl pouze jako pomocn promnn pi budovn menu.

Metody:

bool HandleKey( EVENT &ev );
pokud pijde udlost od klvesnice, postoup ji menu postupn svm synovskm oknm (zde MenuItemm).
Pokud nkter z nich udlost oet, vrac TMenu TRUE, jinak vrac FALSE.

void Paint();
Nakresl pouze rovnou linku.
Na n se pak budou kreslit jednotliv MenuItemy - viz. metoda TGroupWindow::Repaint() )..

TMenu(byte x,byte y,byte w,byte h);
konstruktor.
 Udv polohu a velikost menu.

~TMenuClass();
destruktor.
 Nem dnou zvltn funkci.

void InsertItem( char *txt,word hk,word message );
nejzajmavj metoda tdy TMenuClass.
 V podstat se jedn o voln TGroupWindow::InsertWindow(), jen s tm rozdlem, e poloha potomk (jednotlivch MenuItem) se pesn pot tak, aby jednotliv MenuItemy  byly na jedn dce tsn vedle sebe.
  Parametry ve voln slou jako parametry pro voln konstruktoru TMenuItem(txt,hk,message).


2.4.1.2.6. TPopupMenu

Tda TPopupMenu je potomkem tdy TMenu.
 Podobn jako TMenu i TPopupMenu slou k prci se systmem aplikanch menu a zce souvis s tdou TMenuItem, ale m ponkud jin chovn ne tda TMenu.
  Zatmco u instance tdy TMenu se pedpokld, e bude plnit lohu statickho menu, ( ili bhem aplikace bude stle viditeln), u instanc tdy TPopupMenu je idea naprosto opan.
   Aplikace m jednu instanci tdy TMenu.
    Tato instance v sob obsahuje jako synovsk okna instance tdy TMenuItem.
     Kad z MenuItem m bu definovanou njakou konkrtn zprvu (Message), nebo Instance tdy TPopupMenu je

class TPopupMenu: public TMenu
{
  friend class TApplication;

   int HH;
   void* image;

   void Paint();
   void Hyde();
   bool HandleMouse(EVENT& );

 public:

   bool HandleEvent(EVENT& );
   void Repaint();
   TPopupMenu(int x,int y);
  ~TPopupMenu();
   void InsertItem(char* txt,word hk,word message,hPopupMenu);
};

void Paint();
Ulo do pamti obraz toho co pekryje, nakresl obdlnk pslun velikosti a pak nech vykreslit vechny sv potomky.

void Hyde();
Pekresl se tm, co uloil jako obraz.

bool HandleMouse(EVENT& );
Oeten udlost od myi.
 
bool HandleEvent(EVENT& );
Pedefinovv metodu tak, aby odpovdala na pslun udlosti.



2.4.2. PROGRAMTORSK  ST                      
2.4.2.1. Hierarchie ddinosti

Zkladem ddinosti je tda TWindowClass.
 Dle se odvozuj tdy takto:

TWindowClass (*) - pro okna bez potomk (dalch oken, nebo tlatek)

TWindowClass ( TMenuItem
TWindowClass ( TGroupWindow (*) - pro okna s potomky
TWindowClass ( TGroupWindow ( TDesktop
TWindowClass ( TGroupWindow ( TApplication - popsno v modulu APP
TWindowClass ( TGroupWindow ( TMenu
TWindowClass ( TGroupWindow ( TMenu ( TPopupMenu

Tdy oznaen (*) jsou ist virtuln.
 Nelze od nich tedy tvoit dn  instance.
  Slou pouze jako zklad pro dal ddinost.




2.4.2.2. Vztahy rodi-potomek, bratr-bratr
Tda TGroupWindow zavd monost vkldat do rodiovskho okna dal okna, jako okna synovsk.
 T zabezpeuje organizaci v systmu tchto oken a jejich vzjemnou komunikaci.

Okno-rodi m poloku hChild. hChild je ukazatelem na prvnho syna.
 Pokud okno-rodi nem dn potomky, je tento ukazatel NULL.
Synovsk okna se okna rodiovskho vkldaj metodou InsertWindow(hWindow hWnd).
 Pokud rodi  nem doposud dnho potomka, piad se do jeho hChild ukazatel na  vkldan synovsk okno a do hNext (ukazatel na bratra) vkldanho (tedy synovskho) okna  se piad NULL.
   Pokud ji rodi potomka m, piad se do jeho hChild ukazatel na syna jako  v pedchozm ppad, ale synovsk okno si jako hNext dosad pvodn hChild svho rodie.
    V obou ppadech se synovskmu oknu piad jako hParent ukazatel na rodie, kterm je nyn okno jeho metodu InsertWindow volme.
     Postupnm pidvnm oken tedy vznik jednosmrn spojov seznam synovskch oken, kde vdy nov okno se zaad na zatek seznamu.
      Okno-rodi m ukazatel na prvn okno v seznamu, co je nap. dleit i pro oetovn  udlost.
       Kad okno-syn m ukazatel na rodie, co se vyuv nap. pro posln zprv.
        Posledn ze syn m ukazatel hNext rovn NULL.

2.4.2.3. Udlosti a jejich zpracovn

Udlost rozumme jak udlost od myi, nebo klvesnice, tak i zprvu (Message), kterou posl jedno okno druhmu jako uritou informaci, nebo dost.
 Hlavnmi metodami pro posln udlost  jsou  metody SendEvent(EVENT& ev, hWindow to) a SendMessage(word MESSAGE, hWindow to, word wParam, long lParam).
  SendEvent() pole udlost ev adrestovi to.
   Udlost m pevn definovan tvar (viz. events.h) a lze z n urit, je-li to udlost od myi, klvesnice, nebo je-li to zprva.
    Naproti tomu SendMessage jen vytvo udlost s identifikac MESSAGE a pslunou datovou strukturu udlosti napln touto identifikac a dalmi informacemi a pot odelou pomoc SendEvent().

SendEvent() funguje tak, e pokud je adrest NULL (tedy aplikace), ped okno udlost svmu rodiovskmu oknu k dalmu zpracovn.
 Tmto zpsobem zprva "probubl"  a k aplikaci a ta ji  zpracuje svou metodou HandleEvent().
  Pokud je adrest rzn od NULL,  provede se pm zavoln veejn metody HandleEvent() danho adresta.
    Je teba dbt toho, aby se zprvy poslaly pouze skuten existujcm  objektm, jinak me dojt ke zhroucen systmu.
     Skutenost, e je teba toto  ohldat nem dn zvltn dopad, protoe vtina zprv smuje bu rodiovi (hParent), aplikaci (NULL), nebo sob sammu (this).
      Ukazatel na rodie je definovn vdy a na aplikaci se odkazujeme pomoc NULL.
       Lze si pedstavit, e nastane poteba poslat zprvy potomkm, nebo sourozencm.
        V tomto ppad bude nutn provst kontrolu existence adresta.

Udlosti se zpracovvaj v metod HandleEvent().
 Kad udlost m identifikaci ID a podle n se d poznat, jedn-li se o udlost od myi, klvesnice, nebo  je-li to njak zprva.
  Udlosti od myi se oetuj v metod HandleMouse(), udlosti od klvesnice v metod HandleKey() a zprvy jako takov pmo v metod HandleEvent().
   Pokud okno m umt reagovat na njakou zprvu, je teba pepsat HandleEvent() tak, aby se zde pslun zprva zachytila a vyvolala se jej ppadn obsluha.
    Pokud pijde njak zprva, kterou HandleEvent() "nezn", postupuje se tak, e se vyvol metoda HandleEvent()  pedka v hierarchii ddinosti.
     Tm se doshne toho, e mm nap. tdu  TGroupWindow, kter reaguje nap. na zprvu EV_SELFCLOSE.
      Chceme-li okno, kter bude umt reagovat na nmi definovanou zprvu EV_NEW a zrove na EV_SELFCLOSE, odvodme nov okno od TGroupWindow a pedefinujeme mu HanleEvent() tak, e na zprvu EV_NEW zareaguje nmi definovanm zpsobem a vrt TRUE.
       Na ostatn zprvy nebude reagovat, ale zavol metodu TGroupWindow::HandleEvent().
        Tam se ji um reagovat na EV_SELFCLOSE a tedy i nae nov okno um reagovat na EV_SELFCLOSE.
         Tato metoda je velmi prost a inn.

2.4.2.4. Metody pro kreslen oken

Pro kreslen oken maj vznam dv metody.
 Paint() a Repaint().
  Metoda Repaint() popisuje, jakm zpsobem se budou kreslit ppadn potomci a star se vyvoln metody Paint(), kter se oproti tomu star jen o to, jak se nakresl ta konkrtn instance, ani by zde bylo rozhodujc, jestli m synovsk okna nebo ne.

POZOR! V tto verzi jsou podporovna jen nepekrvajc se okna.
 Neumm oezvat ppadn potomky.

2.4.2.5. Vazba modulu window na aplikan modul

Tda TApplication je odvozena od tdy TGroupWindow.
 Na prvn pohled by se mohlo zdt, e je to neuven rozhodnut, ale dky tto skutenosti jsme zskali siln komunikan prostedek mezi aplikac a  jednotlivmi okny, ani bychom povolili oknm pmo pistupovat k aplikaci.
  Okna jako takov nemaj o aplikaci dnou povdomost v tom smyslu, e by znala kteroukoli z jejich metod.
   Komunikace s aplikac se provd tak, e jako adrest v metod SendEvent() resp. SendMessage() se uvede NULL.
    Aplikace  m specieln upravenou metodu SendEvent() tak, aby za adresta NULL  povaovala sebe.
     Vlastn posln zprv bylo popsno v kapitole Udlosti a jejich zpracovn  v tomto oddle.
Aplikace m tedy od TGroupWindow zddnou monost komunikace s okny.
 Jako  hlavn potomci aplikace se zavd Desktop a Menu.
  Desktop je potom "prapedek"  vech dalch oken.
   Se znikem Desktopu zanik i cel hierarchie aplikanch  oken.
    Desktop se ru spolu s Menu a pi voln destruktoru aplikace.
     Desktop  m jako svho rodie aplikaci a me j tedy poslat zprvy jako ktermukoli jinmu oknu.


2.4.3. NEDOSTATKY  A  ZLEPEN                    
* Nedostatkem je fakt, e se neprovd oeten na existenci objektu,  ktermu poslm zprvu.
 Tato problematika byla diskutovna v  Udlosti a jejich zpracovn.
* TGroupWindow a TWindow Paint a Repaint nejsou napsan tak zcela pesn podle  toho co k dokumentace.
 Neum oezvat synovsk okna.
  V tto verzi nen doposud tento fakt odstrann z dvod asovch.
* Pout TwindowClass jako tdu, kter um poslat zprvy nen tak pln nejlep, protoe mechanismu mohou vyuvat i objekty, kter nejsou pmo okny.
 Bylo by rozumn vythnout tuto vlastnost v hierarchii ddinosti jet o rove ve.



2.5. Modul APP
aplikan modul.
 Spojuje v sob vechny ti pedchoz moduly.

Zavd se tda Tapplication
 
class TApplication : public TGroupWindow
{
  protected:

   bool        Finish;
   hDesktop    Desktop;
   hKeyboard   Keyboard;
   hMouse      Mouse;
   hMenu       Menu;

	    bool SendMessage( word id, hWindow to, word wparam, long lparam );
   virtual bool SendEvent( EVENT&, hWindow );

	    bool HandleMouse( EVENT& );
   virtual bool HandleKey( EVENT& );
	    void FinishApp();
           void Paint();
   virtual void InitMenu();

public:
    TApplication();
   ~TApplication();

    virtual bool HandleEvent(EVENT& );
    virtual void Run();
};
  

bool        Finish;
Logick promnn.
 V okamiku, kdy je jej hodnota TRUE, aplikace kon.

hDesktop    Desktop;
Ukazatel na Desktop.
 Desktop je zkladnm oknem aplikace.

hKeyboard   Keyboard;
hMouse        Mouse;
hMenu          Menu;
Ukazatele na jednotliv instance klvesnice, myi a menu.

bool SendMessage( word id, hWindow to, word wparam, long lparam );
Pokud je adrest to roven NULL, zpracuje zprvu sama aplikace.

virtual bool SendEvent( EVENT&, hWindow );
Podobn jako SendMessage().

bool HandleMouse( EVENT& );
virtual bool HandleKey( EVENT& );
Oeten myi a klvesnice.
 Podrobn bylo popsno ve pi popisu TgroupWindow::Handle.. a je myslm zbyten podrobn se rozepisovat o jednotlivch udlostech a reakcch na n.

void FinishApp();
Ukonovac metoda.
 Zajiuje korektn uvolnn pamti, zruen grafiky ...

void Paint();
Opt nic pevratnho proti TGroupWindow.

void InitMenu();
Vytvo zkladn menu, kter um pouze reagovat na Alt X a tak ukonit aplikaci.
 
TApplication();
~TApplication();
Konstruktor a destruktor nepinej tak nic zajmavho.

virtual bool HandleEvent(EVENT& );
Bn HandleEvent().

virtual void Run();
Provede potebn inicializace (nap. inicializaci Desktopu) a spust hlavn smyku programu ve kter se oetuj postupn udlosti od klvesnice a od myi, tvo z nich zprvy a ty pak posl jednotlivm stem aplikace.
 Kon, kdy pijde udlost EV_FINISHAPP.
	

2.6. Modul FILE
prce se soubory. 

Tento modul zavd jedinou tdu TFile.
 Tato tda se star o prci se soubory.

class TFile
{
  char  Name[14];
  char  Path[MAXPATH];

  FILE* streem;

 public:
   TFile();
   TFile(char* FileName,char* Path="");
  ~TFile();
   FILE* GetFileHandle();

   bool CreateFile();
   bool OpenFile(char* Acs);
   bool CloseFile();
   bool DeleteFile();
   bool SeekStart();
   bool WriteLn(char* Line, int Pos=0);
   bool ReadLn(char* Line, bool First=FALSE);
};

char  Name[14];
char  Path[MAXPATH];
jsou datov poloky urujc jmno souboru Name, resp. cestu k souboru Path.


TFile();
TFile(char* FileName,char* Path="");
Konstruktory.

~TFile();
Destruktor nepln dnou zvltn funkci.

FILE* GetFileHandle();
Vrac ukazatel na soubor.
  Pokud nen soubor oteven vrac NULL.

bool CreateFile();
bool OpenFile(char* Acs);
bool CloseFile();
bool DeleteFile();
Funkce se zjevnm vznamem.
 Akce se vdy tk souboru Path/Name.

bool SeekStart();
Pesune se na zatek souboru.

bool WriteLn(char* Line, int Pos=0);
Zape do souboru dek.
 Jestlie Pos != 0  zapisuje se na aktuln pozici.

bool ReadLn(char* Line, bool First=FALSE);
Ze souboru pete jeden dek.
 Jestlie First == True, zane se tenm na zatku souboru, jinak te od aktuln pozice.




2.7. Modul EDITWND
popis chovn grafickho a textovho editovacho okna.

Zavd dv tdy TEeditWindow pro grafick okno a TTextEditWindow pro textov okno.

Tda TeditWindow.

class TEditWindow: public TGroupWindow
{
   word   WhatDraw;
   struct viewporttype viewinfo;

   TMFElement *Elements,*ActiveElement;
   int pomx,pomy,PointCounter;

   void Paint();
   void GetViewSettings();
   void RestoreViewSettings();
   void ViewErrorLog(TFile* LogFile);
   void ProcessLine(char* Line, int LineNumber);
   void SetMode(int mode);

   TMFElement* NewElement();
   void DeleteAll();

 protected:
   virtual bool HandleMouse( EVENT& );
   virtual bool HandleKey( EVENT& );
   virtual bool Inside( EVENT& );
	   void InsertElement(TMFElement* elem);
	   void DeleteElement(TMFElement* elem);
	   void Repaint();
	   void Export(); 
	   void Import(TFile* File);

 public:
		     TEditWindow();
           ~TEditWindow();

   virtual bool HandleEvent(EVENT& ev);
};


Tda TEditWindow je pmm potomkem tdy TGroupWindow.
Je oknem ve smyslu, e reaguje na udlosti a navc obsahuje spojov seznam tzv. Element.
 Kad element vznikne nakreslenm bodu v grafickm okn a udruje informaci o sv poloze.
  Navc kad element v, jak se m kreslit a jak vypad jeho textov podoba v METAFONTu.
   Prvn vlastnosti vyuv metoda Repaint() a druh metoda Export() tdy TEditWindow.
    Oboje je popsno podrobnji ne.

Z datovch poloek to jsou:

word   WhatDraw;
k, co se bude kreslit.
 Dv monosti Dot, nebo Line.

struct viewporttype viewinfo;
Pomocn promnn.
 Pouv se pi  Paint().

TMFElement *Elements,*ActiveElement;
Ukazatele na prvn (aktivn) element.
 Element je objekt typu odvozenho od TMFElement(viz. Modul MF_ELEM).

int PointCounter;
Potadlo bod.
 Pamatuje si slo poslednho vloenho bodu.

void Paint();
Pedefinovan metoda.
 Nen na n nic zvltnho.

void GetViewSettings();
void RestoreViewSettings();
Do promnn viewinfo ulo informace o nastaven obrazovky, resp. obnov z uloenho nastaven obrazovky.

void ViewErrorLog(TFile* LogFile);
V ppad, e pi transformaci text --> grafika dolo k chyb, zobraz EditWindow error log METAFONTu a k tomuto elu se pouv tato funkce.
 V promnn LogFile se pedv ukazatel na Tfile, kde je uloena informace o otevenm log souboru.

void ProcessLine(char* Line, int LineNumber);
Pouv se pi importu trasformovanho textu.
 Pi transformaci text --> grafika vznik log soubor a v nm METAFONT popisuje ve specilnm formtu ztransformovan obrzek.
  Tento log soubor se te po dcch metodou Import(...) a kad dek se analyzuje metodou ProcessLine(...).

void DeleteAll();
Zru vechny elementy.

virtual bool HandleMouse( EVENT& );
virtual bool HandleKey( EVENT& );
virtual bool Inside( EVENT& );
Popisovat tyto metody povauji za zbyten.
 Byly popsny ve.
  Zmnila se konkrtn funknost, nikoli vznam.

void InsertElement(TMFElement* elem);
Do seznamu element vlo nov elem.
 Seznam elelment je uspodn podobn jako seznam synovskch oken (viz. TgroupWindow::InsertWindow)

void DeleteElement(TMFElement* elem);
Zru ze seznamu element element elem.

void Repaint();
Pekresluje se tak, e vem elementm pole zprvu, aby se pekreslily.
 Kad element v, jak se kreslit a proto se svou metodou Paint() nakresl.

void Export(); 
Metoda slou jako prvn fze transformace grafika --> text.
 Vytvo se pomocn textov struktura a ta se pln dek po dku tak, e EditWindow prochz postupn elementy a pt se jich na textovou podobu.
  Kad element si pamatuje, jestli byl editovn a pokud ano vrt svou textovou podobu, pokud editovn nebyl, vrac NULL.
   Tuto strukturu pak ped TextEdit oknu a to z n vytvo zdrojov text pro METAFONT.

void Import(TFile* File);
Tato metoda slou naopak jako druh fze transformce text --> grafika.
 File obsahuje log soubor METAFONTu a Import ho projde dek po dku a hled v nm pslun etzce a ty pak konvertuje bu na body, nebo z nich pmo kresl vznikl obrzek.

TEditWindow();
~TEditWindow();
virtual bool HandleEvent(EVENT& ev);
Myslm, e tyto metody opt nepotebuj podrobnj koment.

Tda TTextEditWindow.

Tato tda popisuje chovn textovho okna.

class TTextEditWindow: public TGroupWindow, public TText
{
   int CorX   , CorY   , FontSizeX, FontSizeY;
   int CharsX , CharsY; 

   TPosition BlockStart, BlockEnd;
   char ClipBoard[LINELENGTH+1];

   bool EditText(KEY PressedKey);

   void Paint();
   bool MoveCursor(int NewX, int NewY);
   void ShowCursor();
   void HideCursor();
   void OutTextXY(int x, int y, char* Text);
   void Write(TFile* File, bool Overwrite = TRUE);
   void Read(TFile* File);
   void DeleteAll();

 protected:
   virtual bool HandleMouse( EVENT& );
   virtual bool HandleKey( EVENT& );
   virtual bool Inside( EVENT& );
	   void Repaint();
	   void Repaint(int fromline, int toline, int fromX = 0 , int toX = MAXINT);
	   void EditBlock(word KeyCode);
	   void Import(TSimpleText* SText);
	   void Export();
 public:
	    TTextEditWindow();
   virtual ~TTextEditWindow();

   virtual bool HandleEvent(EVENT& ev);
};

Tda je pmm potomkem td TgroupWindow a Ttext.

int CorX   , CorY   , FontSizeX, FontSizeY;
int CharsX , CharsY; 
Datov poloky jejich pouit je nsledujc.
CorX, CorY - slou pro zapamatovn si prvnho zobrazenho sloupce (dku).
FontSizeX, FontSiceY -  velikosti fontu pouitho pro vpis v textovm okn.

TPosition BlockStart, BlockEnd;
char ClipBoard[LINELENGTH+1];
Promnn pouit pro oznaovn a koprovn bloku.

 bool EditText(KEY PressedKey);
Hlavn metoda. Podle stitn klvesy edituje text v okn.

bool MoveCursor(int NewX, int NewY);
Pesune kurzor na posici NewX, NewY.
 Vrac TRUE pokud se poda.

void ShowCursor();
void HideCursor();
Zobrazuje a skrv korzor.
 Dleit pi Repaint().

void OutTextXY(int x, int y, char* Text);
Na logickch souadnicch x,y vype text Text.

void Write(TFile* File, bool Overwrite = TRUE);
void Read(TFile* File);
Nate soubor resp. zape obsah do souboru.

void DeleteAll();
Smae vechny dky.

virtual bool HandleMouse( EVENT& );
virtual bool HandleKey( EVENT& );
virtual bool Inside( EVENT& );
Tyto metody zejm nen teba komentovat.

void Repaint();
void Repaint(int fromline, int toline, int fromX = 0 , int toX = MAXINT);
Repaint pekresl ve a Repaint(int fromline, int toline, int fromX = 0 , int toX = MAXINT) jen od dku fromline do dku toline, pop. od sloupce fromX do sloupce toX.

void Import(TSimpleText* SText);
Metoda zajiujc druhou st transformace grafika --> text.
 SText je ukazatel na strukturu vytvoenou v TeditWindow::Export().

void Export();
Metoda zajiujc prvn st transformace text --> grafika.
 Vytvo soubor se zdrojovm textem a ten pak nech zpracovat METAFONTem.
  Oteve log soubor vytvoen bhem METAFONTu a pokud METAFONT vrt 0 (OK) pole zprvu s ukazatelem na oteven log soubor edit oknu a to spust svj Import.
   Pokud METAFONT vrt hodnotu > 0, pole se edit oknu jin zprva, opt s ukazatelem na oteven soubor a TEditWindow zavol svou metodu ViewErrorLog.

TTextEditWindow();
virtual ~TTextEditWindow();
virtual bool HandleEvent(EVENT& ev);
Uveden metody maj shodn vznam jako u vech pedchozch.


2.8. Modul MAIN
hlavn st cel aplikace. 
Tento modul je jednotcm prvkem cel aplikace.
 Spojuje v sob vechny moduly.
Obsahuje jedinou tdu TMFEDapp odvozenou od TApplication.

class TMFEdApp : public TApplication
{
   hTFile      		EditedFile;  
   hEditWindow 		EditWindow;
   hTextEditWindow      TextEditWindow;
   hInfoWindow 		InfoWindow;

   void InitMenu();
   virtual bool OpenFile(hTFile File,char* Acs);
   virtual bool CloseFile(hTFile File);
   virtual bool CreateFile(hTFile File);

  public:
   TMFEdApp();
   TMFEdApp(char*);
  ~TMFEdApp();
   bool HandleEvent(EVENT& );
   void Run();
};

hTFile EditedFile;  
Ukazate na editovan textov soubor.

hEditWindow EditWindow;
Ukazatel na EditWindow ( grafick okno aplikace).

hTextEditWindow	TextEditWindow;
Ukazatel na TextEditWindow ( textov okno aplikace ).

void InitMenu();
Pedefinovan metoda TApplication.
 Popisuje, jak m vypadat aplikan menu.

virtual bool OpenFile(hTFile File,char* Acs);
virtual bool CloseFile(hTFile File);
virtual bool CreateFile(hTFile File);
Metody pracujc se souborem tak, jak naznauje jejich nzev.

TMFEdApp();
TMFEdApp(char* FileName);
~TMFEdApp();
Konstruktory a destruktor.

bool HandleEvent(EVENT& );
M opt zejm vznam.


2.9. Hlavikov soubor defs.h
Obsahuje definice pouvan v cel aplikaci. 

2.10. Hlavikov soubor events.h
Popisuje strukturu udlost a zprv a navc obsahuje definice jednotlivch udlost. 


3. ZVR   
Zvrem bych se zamil na jednotliv cle projektu a jejich splnn.
 Pokusm se t naznait nkter zkladn nedostatky a cesty jejich een.
  Tak se pokusm nastnit mon smry dalho vvoje.

Podvme-li se zpt na zadn    .. prosted pro rsovn ..vektorov grafika.... zrove jednoduch textov editor..." myslm, e obou cl bylo a na nkter omezen dosaeno.
 
Vektorov grafika se omezila na body a ry.
 Bhem vvoje se ukzalo, e pro reln pouit s METAFONTem sta dokonce jen body.
  ry jsem ponechal pro komfortnj zadvn spojnice dvou bod a pro demonstraci toho, e pidat kreslen koleek, obdlnk ... by nebylo obtn.
   Nejednalo by se vak o rozen v pravm smyslu slova.
    Funknost aplikace by se nijak nezmnila, jen by pibyla jednoduchost v zadvn netrivilnch objekt.

Co se te omezen textovho editoru, jsou zde zejmna tyto problmy.
 
* Nevhodn navren vnitn implementace z hlediska asov nronosti akc jako je pidn, nebo ubrn dku textu.
 Natst je implementace uzavena uvnit funkc s rozumnm rozhranm a tedy pepsnm vnitku tchto nkolika funkc by se problm odstranil.

* Druhou zvanou chybu vidm v pekreslovn textu pi editaci.
 Akoli jsem se snail minimalizovat velikost pekreslovan plochy, nezbylo mi nap.
  v ppad smazn prvnho dku nic, ne pekreslit ve.
   Vezmeme-li v vahu, e se jedn dov o 40 dk, je ji zdren znateln (netestoval jsem na procesoru rychlejm ne 486DX2/66).
    Na Pentiu se teba problm odstran sm, co ovem nen een.
     eenm by bylo posouvat zbyl dky jako bitmapu, co by si vydalo dal pam a sloitj een.

* Posledn velk problm je v prci s bloky.
 Je mon koprovat blok jen z jednoho dku, pouze na samostatn dek.
  Navc chyb koprovn vce dk najednou.


Na druhou stranu v poadavku byl jednoduch textov editor, tak si myslm, e hlavnm elem nebyl komfort, ale funknost.


Dle ze zadn cituji To co by bylo narsovno, by se zrove  objevilo v editovanm  souboru ve form METAFONTovho  textu"
Tuto st zadn bych vidl jako majoritn problm celho projektu.
 V  tto oblasti si nejsem vdom dnch zvanjch omezen.
  Snad jen jedin a spe kosmetick vada.
   Pokud po transformaci text --> grafika chci zeditovat njak bod, zstane po bodu a jeho sle na ploe stopa v barv pozad.
    Problm se odstran tm, e se provede transformace na text a zpt.

A posledn st zadn "Program by ml bt navren tak, aby jej bylo  mono postupn roziovat a ml by sestvat z nkolika  vcemn nezvislch celk.
" Domnvm se, e tohoto bodu bylo dosaeno beze zbytku.
 Program je psn pln v objektovm duchu a je rozdlen podle jednotlivch dlch kol t do jednotlivch modul.
  Roziitelnost nen problm.
   Dokonce myslm, e modul window (spolu s mouse, keyboard a file) mohou slouit po mench, spe kosmetickch pravch za zklad jakkoli aplikace vyadujc programovn zen udlostmi a njak okenn systm.


pln zvrem bych rd podkoval vedoucmu projektu  Mgr. Vladanovi Majerechovi za hodnotn rady bhem procesu vvoje.




V Doln Brusnici 21.4.1997
Ale Vancl, autor projektu                                                                        _____________________________

























