Dokumentace

15
Ostravská univerzita v Ostravě Fakulta přírodovědecká Katedra informatiky a počítačů Grafický rastrový editor přizpůsobený běhu na platformě Mac Semestrální úkol z předmětu GALPR Milan Vít 11. prosince 2010

Transcript of Dokumentace

Page 1: Dokumentace

Ostravská univerzita v OstravěFakulta přírodovědeckáKatedra informatiky a počítačů

Grafický rastrový editorpřizpůsobený běhu na platformě Mac

Semestrální úkol z předmětu GALPR

Milan Vít11. prosince 2010

Page 2: Dokumentace

Obsah1 Cíl projektu 3

2 Průběh projektu 32.1 Změny provedené 8. listopadu 2010 . . . . . . . . . . . . . . . . . . . . . . 32.2 Změny provedené 9. listopadu 2010 . . . . . . . . . . . . . . . . . . . . . . 42.3 Změny provedené 10. listopadu 2010 . . . . . . . . . . . . . . . . . . . . . 62.4 Změny provedené 13. listopadu 2010 . . . . . . . . . . . . . . . . . . . . . 82.5 Změny provedené 15. listopadu 2010 . . . . . . . . . . . . . . . . . . . . . 82.6 Změny provedené 19. listopadu 2010 . . . . . . . . . . . . . . . . . . . . . 102.7 Změny provedené 23. listopadu 2010 . . . . . . . . . . . . . . . . . . . . . 102.8 Změny provedené 6. prosince 2010 . . . . . . . . . . . . . . . . . . . . . . . 10

3 Vývojářská dokumentace 103.1 Třída Form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

3.1.1 Významné proměnné třídy Form . . . . . . . . . . . . . . . . . . . 103.1.2 Metody třídy Form . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

3.2 Třída FormConvolution . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.2.1 Metody třídy FormConvolution . . . . . . . . . . . . . . . . . . . . 11

3.3 Třída G Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.4 Třída G ButtonDragged . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3.4.1 Metody třídy G ButtonDragged . . . . . . . . . . . . . . . . . . . . 123.5 Třída G ButtonPressed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3.5.1 Metody třídy G ButtonPressed . . . . . . . . . . . . . . . . . . . . 123.6 Třída G ButtonReleased . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3.6.1 Metody třídy G ButtonReleased . . . . . . . . . . . . . . . . . . . 123.7 Třída G Canvas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.8 Třída G Color . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.9 Třída G Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133.10 Třída G Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

3.10.1 Metody třídy G Graphics . . . . . . . . . . . . . . . . . . . . . . . 133.11 Třída G History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3.11.1 Významné proměnné třídy G History . . . . . . . . . . . . . . . . . 143.11.2 Metody třídy G History . . . . . . . . . . . . . . . . . . . . . . . . 14

3.12 Třída G Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.13 Třída Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.14 Metody třídy Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2

Page 3: Dokumentace

1 Cíl projektu

Cílem projektu bylo vytvoření jednoduchého grafického editoru, jenž bude zvládat běžnérastrové operace, jakými je například nakreslení úsečky či obdélníku, a jenž bude plněpřizpůsobený běhu na platformě Mac. Přestože Java samotná, jak známo, je multiplat-formní, rozhraní aplikací napsaných v ní bohužel nerespektuje HIG1 a všeobecný „look &feel“ cílové platformy. Toto vše musí programátor ošetřit ručně.Co se editoru týče, ten by měl být schopen provedení základních rastrových operací, meziněž řadím použití nástrojů Pen, Line, Rectangle, Fill a Bézier. Samozřejmostí pak je výběrbarev a možnost otevření existujícího souboru.

2 Průběh projektu

Tato kapitola si klade za cíl věrně zdokumentovat průběžnou práci na projektu. V době,kdy započalo psaní této dokumentace, již můj editor, zvaný jednoduše Mion PaintingTool, zvládal kreslení úseček za použití Bresenhamova algoritmu (v kombinaci s Cohen-Sutherlandovým algoritmem pro zajištění, že úsečka bude vykreslena jen a pouze uvnitřokna a uživatelova žádost na vykreslení tedy nezpůsobí aplikační výjimku), jednoduchýchgeometrických objektů (obdélník, trojúhelník) a pochopitelně konvoluci. Co tedy zbýváke zdárnému dokončení?Dvě věci, především. Jednak je nutno vytvořit grafické uživatelské rozhraní, prostřed-nictvím kterého bude uživatel schopen editor ovládat. Toto rozhraní však musí splňovatpožadavky definované v Apple Human Interface Guidelines, menu aplikace tak napříkladnesmí být součástí okna.A konečně je nutno „zpacifikovat“ zdrojový kód editoru, zbavit jej všeho nepotřebnéhoa vhodným použitím techniky refaktoringu učinit zdrojový kód lépe spravovatelným apřehlednějším.

2.1 Změny provedené 8. listopadu 2010

První věcí, jež je do očí bijící, je text „Cviceni1“ (vizte obrázek 1 níže), jenž se zobrazív hlavním menu, napravo od symbolu jablíčka. Tento text má symbolizovat jméno aplikacea má poskytovat aplikační menu, tj. volby About, Preferences, Quit, a některé další.

Obrázek 1: Špatný text aplikačního menu

To lze napravit dvěma způsoby, výběr vhodného způsobu závisí zpravidla jen na relativnívelikosti aplikace.Máme-li totiž aplikaci relativně rozsáhlou, se spoustou resource souborů (tzn. souborůzpravidla datových, s logikou kódu nesouvisejících – obrázky, videa, soubory s překlady,

1Human Interface Guidelines, ⟨http://developer.apple.com⟩

3

Page 4: Dokumentace

apod.), je vhodné, zpravidla za použití systému na sestavování aplikací Ant, aplikaci „oba-lit“ tak, aby vypadala jako nativní aplikace – tzn., bude umístěna v adresářové struktuřes kořenovou složkou s příponou .app, v níž je složka Contents, atd. Popis této adresářovéstruktury není však rozsahem této dokumentace2.Co je však podstatné při použití výše zmíněné adresářové struktury a relevantní k na-šemu problému, je XML soubor Info.plist, konkrétně klíč zvaný CFBundleName. Tenumožňuje nastavit název programu, který se zobrazí v Docku a v aplikačním menu. Mo-difikovaný soubor Info.plist by vypadal zhruba takto (irelevantní klíče a hodnoty jsouvynechány):<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"

"http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict>

<key>CFBundleName</key><string>Mion Painting Tool</string>

</dict></plist>K této možnosti se ještě vrátíme na samotném konci vývojového procesu – v současnéchvíli je pro nás výhodnější využít možnosti druhé a tou je předání parametru virtuál-nímu stroji. To provedeme přidáním řetězce -Xdock:name="Mion Painting Tool" dospouštěcího skriptu.

2.2 Změny provedené 9. listopadu 2010

První práce na menu započaly a výsledkem je prakticky hotové menu File, obsahujícípoložky Open a Close. Předpokládám, že názvy mluví samy za sebe, a proto bych seraději věnoval samotné implementaci.Pro menu jsem zvolil služeb tříd JMenuBar a JMenu, pro samotné prvky menu pak třídAction a JMenuItem. Cílem dnešních úprav bylo zajištění zobrazení menu na správnépozici, tzn. vně okna, v horní liště k tomu určené, korektní přiřazení klasických klávesovýchzkratek a zjištění, které z dialogových oken pro výběr souboru je vhodnější na platforměMac použít.Pojďme se nejprve pobavit o klávesových zkratkách, ty je možné poměrně snadno definovatpoměrně snadno při vytváření položek menu následujícím způsobem:openMenuItem = new openActionClass ("Open",

KeyStroke.getKeyStroke (KeyEvent.VK_O, shortcutKeyMask));closeMenuItem = new closeActionClass ("Close",

KeyStroke.getKeyStroke (KeyEvent.VK_W, shortcutKeyMask));Klávesová zkratka je pak samozřejmě sestavena druhým parametrem, zatímco první pa-rametr udává nelokalizovaný název položky. Po přeložení a spuštění programu si všakvšimneme, že se menu vykreslí na nesprávné pozici, uvnitř okna. To by bylo správné

2Více informací je možno nalézt na ⟨http://developer.apple.com⟩

4

Page 5: Dokumentace

chování na většině platforem, nikoli však na systémech jablečných. Pro „odsunutí“ menudo horní lišty, tedy tam, kam správné menu patří, si můžeme pomoci opět buďto editacísouboru Info.plist, nebo předáním parametru -Dapple.laf.useScreenMenuBar=truevirtuálnímu stroji Javy – což je možnost, kterou prozatím použijeme.Pro správnou funkčnost položky Open musíme využít služeb některého z dialogů pro výběrsouboru, a Java nám dává na výběr rovnou dva: jeden z toolkitu Swing, a jeden ze staršíhoAwt.

Obrázek 2: Dialog pro výběr souboru z toolkitu Swing

Zřejmou, leč špatnou volbou by tedy mohl být výběr novějšího Swingového toolkitu. Pročšpatnou? Inu, Swingový dialog není schopen přizpůsobení se cílové platformě, a vypadátak na všech platformách prakticky stejně – bohužel, zároveň i stejně špatně. Pro dodrženísprávného vzhledu a chování dialogu musíme použít dialog z toolkitu Awt, což lze provéstnásledujícím kódem (irelevantní části vynechány):public class openActionClass extends AbstractAction {

public void actionPerformed (ActionEvent e) {FileDialog fileDialog = new FileDialog (new Frame (),

"Open File", FileDialog.LOAD);String file;

fileDialog.setVisible (true);

if (fileDialog.getFile () != null) {

5

Page 6: Dokumentace

file = fileDialog.getDirectory () + fileDialog.getFile ();graphic.showImage (file);G_repaint ();

}}

}

Obrázek 3: Dialog pro výběr souboru z toolkitu Awt

2.3 Změny provedené 10. listopadu 2010

Po včerejší práci na menu je čas zaměřit se na element, který je vizuálně umístěn přímo podmenu, a tím je samozřejmě nástrojová lištu. Pro vyhrazení samotného prostoru pro lištubudeme potřebovat jednu instanci třídy JToolBar, pro každé tlačítko pak instanci třídyJButton, dále pro výběr barvy využijeme služeb třídy JColorChooser a pro vytvořeníprázdného prostoru proměnlivé velikosti (pro odsunutí některých tlačítek na pravou stranulišty) statické metody createHorizontalGlue () třídy Box.Deklarace potřebných proměnných není nikterak zajímavá, vypadá zhruba takto:private JToolBar toolBar = new JToolBar ();private JButton pixelButton = new JButton ("Pixel");private JButton lineButton = new JButton ("Line");private JButton rectangleButton = new JButton ("Rectangle");

private JButton foregroundColorChooserButton = new JButton ("Foreground");private JButton backgroundColorChooserButton = new JButton ("Background");

6

Page 7: Dokumentace

Mnohem zajímavější je však nastavení funkčnosti jednotlivých tlačítek, základní funkčnostje zajištěna tímto kódem uvedeným níže. Pojďme si jej stručně popsat! První dvě částikódu uvádějí, které metody se mají zavolat v momentě, kdy uživatel s tlačítkem interaguje.Třetí část „naskládá“ všechna tlačítka do lišty a mezi tlačítka pro kreslení obdélníku avýběr barvy vloží prázdný prostor s proměnlivou šířkou (vždy maximální možnou), cožodsune tlačítka pro výběr barvy na pravou stranu okna. Poslední řádek třetí části zajistí,že uživatel nebude moci panel nástrojů přesouvat. Čtvrtá, jednořádková část pak umístínámi vytvořený panel nástrojů na „severní“ (tedy vrchní) stranu okna editoru.pixelButton.addActionListener (new pixelActionClass ());lineButton.addActionListener (new lineActionClass ());rectangleButton.addActionListener (new rectangleActionClass ());

foregroundColorChooserButton.addActionListener (new foregroundColorChooserActionClass ());

backgroundColorChooserButton.addActionListener (new backgroundColorChooserActionClass ());

toolBar.add (pixelButton);toolBar.add (lineButton);toolBar.add (rectangleButton);toolBar.add (Box.createHorizontalGlue ());toolBar.add (foregroundColorChooserButton);toolBar.add (backgroundColorChooserButton);toolBar.setFloatable (false);

getContentPane ().add (toolBar, BorderLayout.NORTH);Základní funkčnost však není naším cílem, my míříme výše. Problém s výše uve-deným kódem je jednoduchý – ač funguje na jedničku, výsledek vypadá na Macustrašně: tlačítka jsou příliš malá, namačkaná na sobě, a vůbec nevypadají jako kla-sická tlačítka z rozhraní Aqua. Tlačítkům však můžeme promluvit do duše metodouputClientProperty (String, String), kdy první parametr určuje název proměnné,kterou budeme měnit, a druhý parametr změněnou hodnotu.Které proměnné nás tedy budou zajímat, a které budeme měnit? První z nich je určitěJButton.buttonType, která udává právě vzhled tlačítka – my použijeme ve všech pří-padech hodnotu segmentedTextured, což vygeneruje ze tří tlačítek jedno velké, spojené.Druhá proměnná, která je pro nás zajímavá, je vlastnost JButton.segmentPosition,která nabývá hodnot first, middle, last a only a která určuje, zda je tlačítko ze sadysegmentedTextured první v řadě, uprostřed, na konci nebo jediné tlačítko v řadě.pixelButton.putClientProperty ("JButton.segmentPosition", "first");pixelButton.putClientProperty ("JButton.buttonType", "segmentedTextured");

lineButton.putClientProperty ("JButton.segmentPosition", "middle");lineButton.putClientProperty ("JButton.buttonType", "segmentedTextured");

rectangleButton.putClientProperty ("JButton.segmentPosition", "last");

7

Page 8: Dokumentace

rectangleButton.putClientProperty ("JButton.buttonType", "segmentedTextured");Po aplikování podobných metod pro všechna tlačítka bude výsledek vypadat přesně tak,jak jsme zamýšleli, a oko neznalého uživatele by nejspíš ani nepoznalo, že aplikace nenínativní, ale psaná v Javě (samozřejmě, pokud nepočítáme fakt, že se spouští pětkrát déle,než nativní aplikace).

2.4 Změny provedené 13. listopadu 2010

Představíme-li si množinu všech v minulosti vytvořených programů, zjistíme, že existujeaplikace ke splnění prakticky jakékoli úlohy – a i přes tuto neuvěřitelnou rozmanitostvětšina z těchto aplikací obsahuje jednu stejnou funkcionalitu. Tou je samozřejmě možnostvrátit poslední akci zpět, neboť člověk není tvor neomylný, a tak je jasné, že občas senějaká ta chybka přihodí.Pro implementaci historie si vytvoříme novou třídu G_History, která bude obsahovat dvěmetody: takeSnapshot () pro aktualizování stavu historie (voláme v momentě, kdy seplátno změní), a undo () pro obnovení uloženého stavu plátna. Pro uchovávání stavuplátna využíváme služeb třídy ArrayList, neboť na rozdíl od obyčejného pole umožňujedynamicky nové prvky přidávat, staré odebírat, a problém jí nedělá ani změna velikosticelého seznamu.Metoda takeSnapshot () si nejprve vytvoří nový BufferedImage s aktuálním stavemplátna, ten poté umístí do seznamu. Tuto kopii je nutno vytvořit, pokud bychom totižvolali history.add (original), do seznamu by se neumístil aktuální stav plátna, aleodkaz na plátno. To znamená, že pokud bychom se z takto vytvořeného seznamu poku-sili obnovit minulý stav, operace by skončila neúspěšně (a uživatel by skončil s pláčemv očích), neboť by seznam obsahoval jen n + 1 odkazů na aktuální podobu plátna, kde nje počet operací, které uživatel zatím provedl.Metoda undo () je pak veskrze jednoduchou metodou, která nejprve odebere z plátnaposlední přidaný stav (tj. současný stav), posléze obnoví „nový poslední“ (tj. předposlední)stav. Pokud metoda zjistí, že již v historii není nic k obnově, seznam s historií znovuinicializuje.

2.5 Změny provedené 15. listopadu 2010

Dnešní den se nese ve znaku oprav uživatelského rozhraní a též jedné nové funkce –o tom ale později. Rozhraní naší aplikace doposud nerespektovalo dvě zvyklosti grafickéhoprostředí Aqua: nástrojová lišta nebyla spojena se záhlavím okna, a tlačítka nástrojovélišty dostávala po kliknutí myší focus. První zmíněný problém lze snadno opravit, veskutečnosti stačí jediný řádek:this.getRootPane ().putClientProperty ("apple.awt.brushMetalLook",

Boolean.TRUE);Focus tlačítek je problém složitější, nicméně ne neřešitelný. Každému tlačítku musímepřiřadit vlastní implementaci MouseListeneru, což je řešení poněkud otravné, leč zcela

8

Page 9: Dokumentace

funkční, a v praxi vypadá zhruba takto (irelevantní a prázdné metody implementacevynechány):pixelButton.addMouseListener (new fixFocusClass ());

private class fixFocusClass implements MouseListener {public void mouseReleased (MouseEvent e) {

canvas.requestFocusInWindow ();}

public void mouseClicked (MouseEvent e) {canvas.requestFocusInWindow ();

}

public void mousePressed (MouseEvent e) {canvas.requestFocusInWindow ();

}}Tato implementace protokolu MouseListener zajistí, že při každém kliknutí na tlačítkov nástrojové liště i následném uvolnění tlačítka myši bude focus předán zpět plátnu.Novou funkčností je nástroj Pen, který uživateli umožňuje kreslit křivky pomocí myši nebotabletu. Pro implementaci nástroje bylo nejprve nutno přidat plátnu nový listener:canvas.addMouseMotionListener (new MouseAdapter () {

public void mouseDragged (MouseEvent evt) {G_Button button = G_Button.B_NONE;

if (evt.getButton () == MouseEvent.BUTTON1) {button = G_Button.B_LEFT;

}

if (evt.getButton () == MouseEvent.BUTTON2) {button = G_Button.B_RIGHT;

}

G_mouseDragged (button, evt.getX (), evt.getY ());}

});Metoda G_mouseDragged (MouseEvent) pak nedělá nic menšího, než že předá všechnupráci metodě buttonDragged (int, int, G_Graphics) ze třídy G_ButtonDragged –čistě z důvodu zpřehlednění kódu a zeštíhlení třídy Form, do níž v mém pojetí patří jenvěci, které se týkají čistě hlavního okna, a obsluha signálů z myši, klávesnice či jinýchvstupů patří jinam.Nástroj Pen pak pracuje jednoduše: při kliknutí si zapamatuje aktuální souřadnice kur-zoru jako počáteční souřadnice, při každém pohybu si jako koncové souřadnice uloží novéaktuální souřadnice, vykreslí úsečku a jako počáteční bod nastaví koncový bod.

9

Page 10: Dokumentace

2.6 Změny provedené 19. listopadu 2010

Od dnešního dne je editor schopen vykreslení Bézierových křivek. Implementace bylainspirována kódem v pseudo-jazyce, který je uveden ve skriptech. Mimoto je nyní velikosthistorie omezena na deset položek, neboť současná implementace je mimořádně paměťověnáročná.

2.7 Změny provedené 23. listopadu 2010

Do projektu byla přidána pravděpodobně poslední třída – FormConvolution. Ta zajišťujevykreslení dialogového okna, jenž umožňuje zadání konvoluční masky. Dialogové oknoobsahuje kromě popisku též devět textových políček pro samotné zadání hodnot masky, atlačítko pro potvrzení a provedení konvoluce. Po stisknutí potvrzovacího tlačítka se dialo-gové okno nezavře, pro případ, že by bylo potřebné či žádoucí aplikovat více konvolučníchmasek.Zároveň došlo k jemné změně v hlavním okně, to se nyní neskládá ze dvou prvků, ale zetří – k nástrojové liště a plátnu přibyla ještě jedna instance třídy JPanel, která sloužíjako vizuální oddělovač právě dvou výše zmíněných prvků. K hlavnímu oknu aplikace bylnavíc napojen WindowFocusListener, který sleduje, zda je okno aplikace v popředí, činikoli, a podle této informace nastaví oddělovači správnou barvu – tmavě šedou, je-li oknov popředí, světle šedou, je-li okno v pozadí. Možná se jedná o drobnost – ale zcela jistědrobnost, která uživatele potěší.

2.8 Změny provedené 6. prosince 2010

Aplikace nyní podporuje převod plátna do stupňů šedi, doplněno též bylo hlavní menu,které nyní umožňuje volání kteréhokoli nástroje a podporuje vyhledávání v menu.

3 Vývojářská dokumentace

Následuje vývojářská dokumentace tříd, metod a významných proměnných, které nebylysoučástí dodaného frameworku a byly tedy mnou dopsány. Třídy i metody jsou řazenyabecedně.

3.1 Třída Form

Třída obsahuje vše potřebné k vykreslení hlavního okna aplikace, menu aplikace a předáníobsluhy kliknutí patřičným třídám.

3.1.1 Významné proměnné třídy Form

G_Color borderColor určuje barvu okraje, na níž se zastaví vyplňování.

10

Page 11: Dokumentace

G_Color color určuje barvu, kterou bude většina nástrojů kreslit.G_Point[] coordinates je čtyřprvkové pole souřadnic, které si drží pozice bodů potřeb-ných pro vykreslení úsečky, obdélníku či křivky.boolean allLocationsSet nabývá pravdivostní hodnoty true v momentě, kdy je zadándostatečný počet bodů pro vykreslení.int[] kernel uchovává konvoluční masku.int activeTaskId si uchovává identifikátor aktuálně zvoleného nástroje.int leftX, rightX, topY, bottomY udržují limitní rozměry plátna.

3.1.2 Metody třídy Form

G mousePressed Metoda přijímá tři parametry – identifikátor stisknutého tlačítka,x-ovou a y-ovou souřadnici bodu, nad nímž bylo tlačítko stisknuto. Metoda nevrací žád-ný argument. Metoda předá obsluhu děje metodě buttonPressed (int, int) třídyG_ButtonPressed a zajistí překreslení plátna.

G mouseReleased Metoda přijímá tři parametry – identifikátor uvolněného tlačítka,x-ovou a y-ovou souřadnici bodu, nad nímž bylo tlačítko uvolněno. Metoda nevrací žád-ný argument. Metoda předá obsluhu děje metodě buttonReleased (int, int) třídyG_ButtonReleased a zajistí překreslení plátna.

G mouseDragged Metoda přijímá tři parametry – identifikátor drženého tlačítka,x-ovou a y-ovou souřadnici bodu, nad nímž se nachází kurzor. Metoda nevrací žád-ný argument. Metoda předá obsluhu děje metodě buttonDragged (int, int) třídyG_ButtonDragged a zajistí překreslení plátna.

init Metoda neakceptuje žádné parametry a nevrací žádné argumenty. Metoda nynízajistí vytvoření menu, panelu nástrojů, klávesových zkratek a správného vzhledu aplika-ce.

3.2 Třída FormConvolution

Třída obsahuje vše potřebné k vykreslení dialogového okna pro zadání konvoluční mas-ky.

3.2.1 Metody třídy FormConvolution

FormConvolution Konstruktor zajistí, že dialogové okno bude viditelné a zavolá me-todu pro inicializaci obsahu dialogového okna.

11

Page 12: Dokumentace

init Metoda zajistí nastavení titulku i správného vzhledu a chování okna, dále pakpopisků okna, devíti vstupních políček a potvrzovacího tlačítka.

3.3 Třída G Button

Tato řída nebyla změněna.

3.4 Třída G ButtonDragged

Třída zajišťuje obsluhu tažení myši se stisknutým tlačítkem, tzn. zpravidla pouze obsluhunástroje Pen.

3.4.1 Metody třídy G ButtonDragged

buttonDragged Metoda přijímá tři parametry, x-ovou a y-ovou souřadnici bodu, nadnímž je momentálně kurzor, a odkaz na instanci třídy G_Graphics, který je použit prozavolání kreslících metod.

3.5 Třída G ButtonPressed

Třída zajišťuje obsluhu stisknutí tlačítka myši.

3.5.1 Metody třídy G ButtonPressed

buttonPressed Metoda přijímá tři parametry, x-ovou a y-ovou souřadnici bodu, nadnímž bylo tlačítko stisknuto, a odkaz na instanci třídy G_Graphics, který je použit prozavolání kreslících metod. Metoda zajišťuje zpravidla korektní načtení počátečních sou-řadnic.

3.6 Třída G ButtonReleased

Třída zajišťuje obsluhu uvolnění tlačítka myši.

3.6.1 Metody třídy G ButtonReleased

buttonReleased Metoda přijímá tři parametry, x-ovou a y-ovou souřadnici bodu, nadnímž bylo tlačítko uvolněno, a odkaz na instanci třídy G_Graphics, který je použit pro za-volání kreslících metod. Metoda zajišťuje zpravidla korektní načtení koncových souřadnica vykreslení.

12

Page 13: Dokumentace

3.7 Třída G Canvas

Tato třída nebyla změněna.

3.8 Třída G Color

Do třídy byly doplněny přístupové metody.

3.9 Třída G Controls

Do rozhraní byla přidána nutnost implementovat metodu G_mouseDragged.

3.10 Třída G Graphics

Do třídy byly doplněny metody nutné pro vytvoření nástrojů pro kreslení.

3.10.1 Metody třídy G Graphics

putPixel Přetížená metoda přijímá šest parametrů: x-ovou, y-ovou souřadnici bo-du, červenou, zelenou a modrou barevnou složku pixelu a referenci na instanci třídyBufferedImage, do níž se má kreslit. Metoda je použita pro kreslení do dočasné bitmapyu konvoluce.

convolution Metoda přijímá dvojrozměrné pole masky jako parametr, toto pole je vběžných podmínkách zadáno z grafického uživatelského rozhraní.

drawLine Metoda přijímá pět parametrů, x-ovou a y-ovou souřadnici počátečního bo-du, x-ovou a y-ovou souřadnici koncového bodu a barvu úsečky, a způsobí úpravu těchtosouřadnic Cohen-Sutherlandovým algoritmem tak, aby bylo zajištěno, že úsečka nepřeté-ká přes okraje plátna. Následně metoda zavolá soukromou metodu drawLineBresenham,která již obsahuje samotnou implementaci Bresenhamova algoritmu pro vykreslení úseč-ky.

drawRectangle Metoda přijímá stejných pět parametrů, jako metoda drawLine, avšakmísto úsečky vykresluje obdélník.

drawCurve Metoda přijímá dva parametry, pole čtyř souřadnic (celkem osm hodnot)a barvu křivky.

fill Metoda přijímá čtyři parametry, x-ovou, y-ovou souřadnici bodu, barvu výplně abarvu okraje, na níž se má vyplňování zastavit. Pro vyplňování je použita rekurzivnísemínková metoda.

13

Page 14: Dokumentace

grayScale Metoda nepřijímá žádný parametr. Metoda zajistí převod plátna do stupňůšedi.

3.11 Třída G History

Třída obsahuje metody potřebné pro práci s historií.

3.11.1 Významné proměnné třídy G History

ArrayList<BufferedImage> history je proměnlivé pole udržující maximálně posledních10 stavů plátna.

3.11.2 Metody třídy G History

takeSnapshot Metoda nepřijímá žádný parametr. Metoda vloží do pole s historií ko-pii současného stavu plátna a zajistí, že historie není delší, než deset posledních stavůplátna.

undo Metoda nepřijímá žádný parametr. Obsahuje-li pole historie minulé stavy plátna,poslední (tj., aktuální) stav se odstraní a obnoví se nový poslední (tj. minulý) stav. Je-lihistorie prázdná, znovu se inicializuje.

3.12 Třída G Point

Třída se stará o správné uchování souřadnic a přístup k nim.

3.13 Třída Project

Třída se stará o zobrazení hlavního okna.

3.14 Metody třídy Project

main Nastaví okno definované v třídě Form jako viditelné.

Reference

[1] Apple Inc. Apple Human Interface Guidelines [online]. Poslední revize 20. 8. 2009[cit. 8. 11. 2010], ⟨http://developer.apple.com⟩.

[2] Apple Inc. Java Deployment Options for Mac OS X [online]. Poslední revize20. 10. 2010 [cit. 9. 11. 2010], ⟨http://developer.apple.com⟩.

14

Page 15: Dokumentace

[3] Apple Inc. Technical Note TN2196: New Control Styles available within J2SE5.0 on Mac OS X 10.5 [online]. Poslední revize 2. 11. 2007 [cit. 10. 11. 2010],⟨http://developer.apple.com⟩.

15