Návrhová dokumentace

Author Martin Vidner
Date created 24.3.1999
Project KTTV
CVS $Header: /home/projekt/cvs/plpoint/docs/design.html,v 2.7 1999/04/13 15:52:35 einstein Exp $

Úvod

(proč tohle číst)

Nejdřív si přečtěte uživatelskou příručku.

Vývojové prostředí

(Kdyby se mi zítra zbořil disk, tak si tady přečtu, co si musím nainstalovat, v jaké verzi, odkud se to dá stáhnout, případně jak se to musí upravit, aby to pro nás fungovalo.)

Systém vyvíjíme na Linuxu v X Windows. Pro grafické rozhraní používáme multiplatformní knihovnu wxWindows, konkrétně její instanci nad knihovnou gtk+, wxGTK.

Programovací jazyk je C++, snažíme se vyhýbat jeho exotickým vlastnostem jako jsou vícenásobná dědičnost, výjimky, RTTI. Šablonám jsme se ale neubránili.

Na správu verzí máme CVS.

Pro automatické generování dokumentace tříd máme nástroj Perceps od Marka Peskina. Šablony pro jeho výstup původně pocházejí od Malcolma Wilkinse.

Linux
Red Hat 5.2, odkudkoliv
X Windows
XFree86, odkudkoliv
C++
EGCS (egcs-1.0.3a-14.i386.rpm)
wxWindows
wxGTK-1.99.4-1.i386.rpm
gtk+
??? zmatek ve verzích (gtk 1.0 vs 1.1 vs 1.2)
Perceps
verze 3.4.1, viz homepage. Lokální kopie: vidla/home/projekt/archiv/perceps341.tgz. Z celého balíku je potřeba jenom hlavní spustitelný soubor. Musí se v něm ale opravit cesta k Perlu z /bin/perl na /usr/bin/perl. Opravený soubor je připravený v vidla/home/projekt/archiv/perceps. Dejte si ho do nějakého adresáře v cestě, třeba /usr/local/bin.

Šablony jsou pod CVS, v adresáři plpoint/docs-tmpl. Generovaná dokumentace má v CVS svůj adresář plpoint/docs-gen. Protože je generovaná, nebude v CVS ona sama, ale jen několik řídících souborů.

Vygeneruje se z plpoint/source příkazem make doc

(doplinit hyperlinky na stažení ze světa, popř. z naší lokální kopie)

Komponenty systému

Systém KTTV se dělí na tyto základní části:

Stavba editoru prezentací

Jádrem programu je hlavní okno obsahující menu a pruhy nástrojů. Pomocí tohoto okna je editoru předávána většina neklávesových povelů. Hlavní program zobrazuje toto okno, zachycuje a distribuuje události, zprostředkovává otevírání a ukládání souborů, tisk souborů, nastavení vzhledu stránky atd.

Každému otevřenému dokumentu odpovídá jeden mainblock spravovaný manažerem TPM. Ten k dokumentu přistupuje jako k seznamu pod sebou seřazených bloků. Tyto bloky jsou trojího druhu: seznam bloků (blocklist), odstavec a slide.

Blocklist je opět seznamem bloků (mainblock je jeho speciálním případem). Další blocklist odpovídá každému textovému rámečku ve slidu. Tak může vzniknout stromová struktura bloků, kde listy jsou odstavce textu a slidy.

O editaci odstavců se stará textový editor, o editaci slidů editor slidů. V programu jsou také použity další pomocné objekty, které ovšem slouží většinou jen pro vnitřní potřeby jedné z hlavních zde uvedených komponent.

Součástí editace slidů je okno tzv. Vzorkovníků. Jedná se o sady objektů dříve vytvořených editorem slidů, které lze pojmenovat, uložit do samostatného souboru a později (i v jiných dokumentech) tyto objekty opakovaně vkládat do slidů a následně je upravovat. Na tomto se podílejí hlavní program (okno vzorkovníku), editor slidů (ukládání objektů do vzorkovníku a kopírování ze vzorkovníku) a parser (ukládání a načítání vzorokovníků z disku).

Poslední samostatnou komponentou programu je parser. Ten slouží k načítání souborů z disku a jejich převodu do vnitřní datové reprezentace v paměti. Umí také naopak tuto vnitřní reprezentaci používanou k editaci uložit do souboru.

Textový editor

Textový editor má na starosti editaci konkrétního odstavce. Ten je v něm interně rozdělen na řádky, které obsahují kromě textu také vložené formátovací značky. Jednou za určitou časovou periodu dojde k přeformátování textu v odstavci.

Události vyvolávané uživatelem odchytává TPM a podle toho, o jakou událost jde a jaký blok dokumentu je právě aktivní, tyto události buď sám zpracuje nebo je distribuuje editoru slidů či textovému editoru. Textový editor má k dispozici výřez obrazovky, do něhož kreslí pomocí relativních souřadnic. Vše, co přesahuje tento obdélník, je ořezáno.

S TPM spolupracuje textový editor tak, že od něj dostává informace o událostech a informaci o tom, že se má editace aktuálního odstavce ukončit. Dále je schopen podat informaci o výšce zpracovávaného odstavce, přeformátovat se a vykreslit se.

Přechod na jiný blok může uživatel provést buď pomocí myši (TPM to sdělí textovému editoru) nebo pomocí pohybu kurzoru klávesami (editor to oznámí TPM). Při změně aktuálního odstavce je vždy vyvoláno přeformátování (i když ještě neuběhla stanovená doba).

Popis rozhraní pro práci s označenou oblastí textu

Popis rozhraní mezi editorem slidů a editorem textu pro vkládání, editaci, změnu velikosti a změnu měřítka textového rámečku
Obsah textového rámečku je blocklist, který ovšem nemůže obsahovat slidy, ale jen další blocklisty či odstavce. Tomuto blocklistu patří jeden manažer TPM, který se o něj stará podobně jako o mainblock. Editaci odstavců provádí textový editor.

Textový rámeček může změnit svou velikost dvěma způsoby. Buď zásahem uživatele nebo přemístěním plovoucího klíčového bodu - tehdy dojde pouze k přeformátování textu, nebo vnější změnou rozměru slidu - tehdy se celý obsah slidu zvětší. S ním se zvětší i rozměry textového rámečku i velikost písma v něm. Zároveň také dojde k přeformátování textu. Oba uvedené způsoby změny je schopen textový editor provést.

Textový editor je také schopen na požádání vytisknout část odstavce do zadaného device contextu. Popis tisku je uveden v dokumentu Pagebreaks a tisk dokumentu.

Slidy

Editor slidů podobně jako textový editor dostane od TPM výřez obrazovky, v němž pracuje. V něm si zavádí vlastní souřadnou soustavu, jejíž jednotka je zlomkem skutečné šířky slidu. Je-li tedy změněna velikost celého slidu, jeho obsah se podle toho také zvětší či zmenší. S takovou změnou je zároven i změněna velikost písem použitých v textových rámečcích (to ale dělá textový editor).

S manažerem TPM editor slidů spolupracuje poměrně jednoduše: umí získat a ztratit ohnisko, umí se překreslit, přeformátovat (viz minulý odstavec) a umí zpracovávat události přicházející od uživatele.

Slide také nabízí funkci pro tisk (celého slidu).

Se vzorkovníky se pracuje takto: v rámci KTTV mají samostatné okno, ve kterém se vzorkovník vybere. Jakmile uživatel zvolí ve vzorkovníku konkrétní objekt určený ke vložení do slidu, je tato informace předána editoru slidů jako událost. Součástí této informace je i ukazatel na příslušný objekt. Editor slidů přejde do režimu vkládání ze vzorkovníku a po kliknutí na určené místo vybraný objekt zkopíruje do slidu.

Parser

Parser poskytuje své služby prostřednictvím jediné instance třídy paParser.

Při čtení dokumentu ze souboru jsou data zpracovávána "po vrstvách", přičemž se mění ze znaků na události (paEvent) prostřednictvím lexikálního analyzátoru (SGML_Lexer a paLexer), dále na stromovou hierarchii elementů (paElement) prostřednictvím parseru SGML (paSGMLParser) a nakonec na reprezentaci použitelnou přímo při editaci prostřednictvím hlavního parseru.

Lexikální analyzátor a parser SGML jsou navrženy obecně, bez vazby na konkrétní aplikaci jako třeba KTTV nebo HTML. Parser SGML však potřebuje znát některé konkrétní údaje, aby mohl správně postavit strom elementů. Asi nejzřejmějším příkladem je odlišení prázdných elementů od kontejnerů (<HR> vs. <H1>...<H1>). K tomu slouží třída paSGMLElementSet, jejíž instanci dostává paSGMLParser od paParser-u.

Rozhraní komponent

(později možná odkazy na vnitřní návrh komponent)