Pagebreaks a tisk dokumentu

Title Pagebreaks a tisk dokumentu
Author Ji Krutil
Date 17. 3. 1999
Reference jkru5249@artax.karlin.mff.cuni.cz
File plpoint/docs/pagebreak.html
Project KTTV
Version $Id: pagebreak.html,v 1.2 1999/03/17 21:56:27 jehne Exp $

    Pohled z nadhledu

    Kazdy dokument ma povinne nastavene vlastnosti urcujici velikost stranky, okraje atp., takze je mozne urcit, kde se budou v tomto dokumentu zalamovat stranky.

    Zalamovani stranek probiha prubezne, ve stejnych casovych intervalech jako formatovani textu v odstavci a navic pri vytvoreni, zruseni, nebo zmene velikosti bloku.

    Zakladni princip

    Seznam vsech pagebreaku je v mainblocku. Je prubezne aktualizovan. Jedna se o seznam pozic pagebreaku vzhledem k zacatku dokumentu (v AU).

    Pri nacteni dokumentu se musi pagebreaky explicitne najit, a to se provede volanim metody FindPBsFromPos(0) tridy kMainblock. Tim se najdou jejich pozice od zacatku dokumentu.

    Pri vlozeni/smazani/preformatovani odstavce se zavola metoda FindPBsFromPos(x), kde x je zacatek inkriminovane zmenene oblasti. Pri zmene velikosti slidu se provede totez. Je potreba, aby se to stalo jeste pred prekreslenim, protoze prave pri prekreslovani se jiz musi objevit nova pozice pagebreaku.

    kMainblock::FindPBsFromPos(x)

  1. Najde se posledni platny pagebreak (pred pozici x).
  2. Podle velikosti papiru se spocita navrhovana pozice nasledujiciho pagebreaku.
  3. Trida kMainblock zavola sama na sebe SpecifyPBPos(p), kde p je navrhovana pozice v AU od zacatku dokumentu.
  4. Navratova hodnota teto metody je skutecna pozice pagebreaku. To je nyni posledni znamy pagebreak. Pokracuje se krokem 1 az do konce dokumentu.

    kBlock::SpecifyPBPos(x)

    Tato metoda je abstraktni ve tride kBlock. Kazdy z jejich potomku je predefinuje.

    kBlockList

  1. Najde svuj prislusny blok, kam patri x.
  2. Zavola na nej z=SpecifyPBPos(x-y), kde y je pozice zacatku bloku vzhledem k zacatku blocklistu.
  3. Vrati z+y
    kSlide

    Je-li x rovno velikosti stranky v AU, vrat velikost_slidu-1. (Tim je osetren pripad, kdy je slide "vyssi nez papir" - prvni pagebreak je na jeho zacatku a dalsi uz patri na jeho konec.) Jinak vrati 0. (Tehdy, kdyz se slide na novou stranku normalne vejde, takze ma byt pagebreak na jeho zacatku.)

    kParagraph

  1. Rozhodne, ktere radky se na konec stranky jeste vejdou (je-li pagebreak uprostred vysky radku).
  2. Vrati spodni okraj posledniho radku (vzhledem k zacatku odstavce), ktery se jeste vesel.
    Poznamka: Nevesel-li se ani jeden radek, mel by odstavec vratit 0. Vesly-li se naopak vsechny, mel byt vratit velikost-1. To kdyby jeste nekdy melo fungovat svazovani odstavce s nasledujicim, tak aby bylo poznat, jestli se tam odstavec bud vubec nevesel, nebo vesel cely.

    Princip tisku dokumentu

    Hajzlbaba pri spusteni tisku vyvola metodu mainblocku PrintDocument(a, b), coz znamena tisk od stranky a do stranky b.

    Mainblock v teto metode prochazi cyklem vsechny pozadovane strany a pro kazdou zavola nasledujici:

    kde x a y jsou pozice pagebreaku obklopujicich inkriminovanou stranku. Parametry k, l, m a n jsou nastaveny tak, aby pokryvaly celou tisnkutelnou oblast stranky. Popis objektu PSDriver je uveden dale.

    Tisk tedy funguje tak, ze se postupne vnoruji volani Print() a zaroven se nastavuji na strance oblasti pro aktualne zpracovavany objekt. Po dokonceni stranky je PSDriveru sdeleno, ze je hotova.

    Metoda Print(x, y)

    Tato metoda je ve tride kBlock abstraktni, zdedene tridy je deklaruji kazda jinak.

    kBlocklist

  1. Podle x a y najde bloky, kterych se usek tyka. Obe tyto souradnice jsou zadany vzhledem k zacatku tohoto blocklistu. Dale zjisti pomoci PSDriver.GetRange oblast stranky urcenou tomuto blocklistu.
  2. Pro vsechny tyto bloky postupne pomoci PSDriver.SetRange() nastavi obdelnik na strance, ktery odpovida danemu bloku a pote zavola Print na tento blok s prislusnymi parametry odpovidajicimi tomu, odkud kam se ma blok vytisknout. Pro spravne nastaveni vyrezu na strance (ktery zaroven urcuje pocatek souradnicove soustavy pro prikazy tisku) je treba absolutni souradnice vyrezu na strance vypocitat ze stavajiciho vyrezu daneho celemu blocklistu a souradnici tisteneho bloku v bloklistu.
    kSlide

    Nastaveni parametru x a y by melo pokryvat celou plochu slidu, jinak je neco spatne. Slide se vytiskne pomoci volani metod objektu PSDriver (souradnice a orezavani jsou jiz nastaveny).

    kParagraph

  1. Podle parametru x a y se zjisti, ktere radky se vlastne maji tisknout.
  2. Radky se postupne pomoci volani metod PSDriver tisknou. Pouzivaji se souradnice vzhledem k zacatku tistene oblasti (tzn, ze kdyz se netiskne odstavec od 1. radku, musi se pozice 1. tisteneho radku odecist od pozice aktualniho radku v odstavci).

    PSDriver

    Jedna se o objekt, ktery umi "kreslit do PostScriptu". Nabizi metody pro vsechny potrebne elementarni vystupy (elipsa, obdelnik, cara, text). Odstavec ci slide pomoci techto metod tisknou svuj obsah. Samotny PSDriver prislusne objekty preklada do PostScriptu a posila na zadany vystup.

    Vystup je zadan v konstruktoru jmenem a identifikaci, zda se jedna o jmeno souboru ci tiskarny.

    Instance PSDriveru je vytvorena az v okamziku, kdy uzivatel spusti tisk. Pote jsou do nej posilany prikazy, stranky jsou ukoncovany a nakonec je znicen. V destruktoru po sobe uklidi.