Integrace a rozvoj roz˛í°ení ExtBrain Communicator

Transkript

Integrace a rozvoj roz˛í°ení ExtBrain Communicator
České vysoké učení technické v Praze
Fakulta elektrotechnická
Katedra počítačů
Diplomová práce
Integrace a rozvoj rozšíření ExtBrain Communicator
Bc. David Jirovec
Vedoucí práce: Ing. Tomáš Novotný
Studijní program: Elektrotechnika a informatika, strukturovaný, Navazující
magisterský
Obor: Výpočetní technika
14. května 2012
iv
v
Poděkování
Děkuji Ing. Tomáši Novotnému za vedení této práce, užitečné rady a nápady. Také děkuji
všem, kteří mě během tvorby této práce podporovali či jinak pomáhali.
vi
vii
Prohlášení
Prohlašuji, že jsem práci vypracoval samostatně a použil jsem pouze podklady uvedené
v přiloženém seznamu.
Nemám závažný důvod proti užití tohoto školního díla ve smyslu §60 Zákona č. 121/2000
Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých
zákonů (autorský zákon).
V Praze dne 14. 5. 2012
.............................................................
viii
Abstract
This work is concerned about further development of ExtBrain Communicator, extension
for Mozilla Thunderbird. Original version adds support for IM communication using Jabber
protocol. Result of this work should be fixing problems in original implementation, integration of other ExtBrain projects into ExtBrain Communicator and implementation of
further functionality, mainly notetaking module. Everything will be thoroughly tested by
users and carefully documented to allow easy further development.
Abstrakt
Tato práce se zabývá dalším rozvojem rozšíření ExtBrain Communicator pro Mozilla Thunderbird. Původní verze přidává podporu IM komunikace pomocí protokolu Jabber. Výsledkem této práce by mělo být opravení chyb ve stávající implementaci, integrování dalších
ExtBrain projektů do ExtBrain Communicator a implementace dalších funkcionalit. Vše
bude průběžně testováno uživateli a práce bude zdokumentována pro snadný další vývoj.
ix
x
Obsah
1 Úvod
1
2 Popis problému, specifikace cíle
2.1 Struktura práce . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Srovnání již existujících poznámek pro Mozilla Thunderbird
2.2.1 Messagenotesplus . . . . . . . . . . . . . . . . . . . .
2.2.2 QuickFox Notes . . . . . . . . . . . . . . . . . . . . .
2.2.3 ThunderNote . . . . . . . . . . . . . . . . . . . . . .
2.2.4 XNote++ . . . . . . . . . . . . . . . . . . . . . . . .
3
3
4
4
5
5
5
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 Analýza a návrh řešení
3.1 Architektura ExtBrain Communicator . . . . . . . . . . . . . . . . . . . . . .
3.1.1 Pohled na UI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.1.1 Seznam kontaktů . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.1.2 Tab s rozhovorem . . . . . . . . . . . . . . . . . . . . . . . .
3.1.1.3 Zobrazení historie rozhovorů . . . . . . . . . . . . . . . . . .
3.1.2 Pohled na vnitřní architekturu . . . . . . . . . . . . . . . . . . . . . .
3.1.2.1 Proces slučování kontaktů . . . . . . . . . . . . . . . . . . . .
3.1.2.2 Vyhledávání v kontaktech . . . . . . . . . . . . . . . . . . . .
3.1.3 Návrh vylepšení s použitím technologicky pokročilejších vlastností Mozilla Application Framework . . . . . . . . . . . . . . . . . . . . . . . .
3.1.3.1 Použití broadcaster / observer . . . . . . . . . . . . . . . . .
3.2 Další vývoj . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.1 Integrace ExtBrain Sync . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.2 Poznámky . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.3 Přidání párování kontaktů pro jiné protokoly než Jabber . . . . . . . .
3.2.4 Rozšíření kontaktů o podporu pro tagy . . . . . . . . . . . . . . . . . .
3.2.4.1 Editace tagů . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.4.2 Přiřazení tagů kontaktu . . . . . . . . . . . . . . . . . . . . .
3.2.4.3 Přehled vlastností a tagů přiřazených kontaktům . . . . . . .
3.2.4.4 Způsob uložení dat . . . . . . . . . . . . . . . . . . . . . . . .
3.2.5 Přidání podpory pro Snarl notifikace . . . . . . . . . . . . . . . . . . .
3.3 Použité nástroje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3.1 IntelliJ IDEA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3.2 Pencil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
xi
7
7
7
7
8
8
9
10
12
13
13
14
14
14
15
15
17
18
18
18
19
20
20
20
xii
OBSAH
3.3.3
Doplňky
3.3.3.1
3.3.3.2
3.3.3.3
3.3.3.4
3.3.3.5
3.3.3.6
3.3.3.7
3.3.3.8
3.3.3.9
3.3.3.10
v Thunderbirdu . . . . .
Console2 . . . . . . . . .
Developer Assistant . . .
DOM Inspector . . . . . .
Event Spy . . . . . . . . .
Exit Button Thunderbird
InspectorWidget . . . . .
JavaScript Debugger . . .
Lightning . . . . . . . . .
SQLite Manager . . . . .
ViewAbout . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
20
21
21
21
21
22
22
22
22
22
22
4 Realizace
4.1 Poznámky . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1.1 Uživatelské rozhraní . . . . . . . . . . . . . . . . . . .
4.1.1.1 Komponenta detailů poznámky . . . . . . . .
4.1.1.2 Komponenta detailů poznámek pro zobrazení
4.1.2 Uložení dat . . . . . . . . . . . . . . . . . . . . . . . .
4.1.2.1 SQLite a FTS4 . . . . . . . . . . . . . . . . .
4.1.2.2 Databáze pro poznámky . . . . . . . . . . . .
4.1.3 Synchronizace dat . . . . . . . . . . . . . . . . . . . .
4.1.4 Dohledávání e-mailu odkazovaného v poznámce . . . .
4.1.5 Lightning kalendáře . . . . . . . . . . . . . . . . . . .
4.1.6 Indikace poznámky u e-mailu . . . . . . . . . . . . . .
4.2 Přidání párování kontaktů pro jiné protokoly než Jabber . . .
4.3 Rozšíření kontaktů o podporu pro tagy . . . . . . . . . . . . .
4.3.1 Tag Editor . . . . . . . . . . . . . . . . . . . . . . . .
4.3.2 Rozšíření adresáře o zobrazení tagů ke kontaktům . . .
4.3.3 Konzistence dat . . . . . . . . . . . . . . . . . . . . . .
4.3.4 Práce s přidanými vlastnostmi kontaktu . . . . . . . .
4.3.4.1 JavaScript code module pro tag cache . . . .
4.4 Podpora pro Snarl . . . . . . . . . . . . . . . . . . . . . . . .
4.4.1 Implementace komponenty . . . . . . . . . . . . . . . .
4.4.2 Registrace komponenty . . . . . . . . . . . . . . . . .
.
.
.
u
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . . . .
. . . . .
. . . . .
e-mailu
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
23
23
23
24
26
26
27
28
29
29
30
31
31
32
33
34
35
35
36
36
36
37
5 Testování
5.1 Ukázky zpětné vazby k původnímu Communicatoru . . . . . . . . . . . .
5.1.1 Klávesová navigace v seznamu kontaktů . . . . . . . . . . . . . .
5.1.2 Problémy s otevíráním odkazu zobrazeného v tabu s rozhovorem
5.1.3 Práce s taby rozhovorů . . . . . . . . . . . . . . . . . . . . . . . .
5.1.4 Seznam kontaktů v hlavním okně - Show All . . . . . . . . . . .
5.1.5 Indikace nepřečtených zpráv . . . . . . . . . . . . . . . . . . . . .
5.1.6 Klávesa pro odeslání zprávy . . . . . . . . . . . . . . . . . . . . .
5.1.7 Skryté kontakty . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Ukázky zpětné vazby pro nově implementovanou funkcionalitu . . . . . .
5.2.1 Přidávání dependencí poznámek . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
39
39
39
40
40
40
41
41
41
41
41
OBSAH
5.3
xiii
5.2.2 Automatické ukládání poznámek . . . . . . .
5.2.3 Zobrazení poznámky přímo v okně s e-mailem
5.2.4 Rozdělení poznámek do více účtů . . . . . . .
5.2.5 Seznam autorů poznámky . . . . . . . . . . .
5.2.6 Klávesové zkratky . . . . . . . . . . . . . . .
Srovnání s existujícími řešeními . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
42
43
43
43
43
44
6 Závěr
45
6.1 Další možný vývoj práce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
A Seznam použitých zkratek
49
B Instalační příručka
B.1 Instalace Mozilla Tunderbird . . . . . . . . . . . . . . . . . . . . . . . . . . .
B.2 Instalace ExtBrain Communicator . . . . . . . . . . . . . . . . . . . . . . . .
B.3 Nastavení ExtBrain Communicator . . . . . . . . . . . . . . . . . . . . . . . .
51
51
51
51
C Obsah přiloženého CD
55
xiv
OBSAH
Seznam obrázků
2.1
2.2
2.3
2.4
Messagenotesplus
QuickFox Notes .
ThunderNote . .
XNote++ . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
5
6
6
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
3.10
3.11
3.12
Seznam kontaktů . . . . . . . . . . . . . . . . . .
Rozhovor s kontaktem . . . . . . . . . . . . . . .
Historie rozhovorů . . . . . . . . . . . . . . . . .
Obsluha příchozí zprávy . . . . . . . . . . . . . .
Počáteční zpracování kontaktů . . . . . . . . . .
Zpracování kontaktů z rosteru . . . . . . . . . . .
Vytváření regulárního výrazu . . . . . . . . . . .
Generování regulárního výrazu v JavaScript Shell
Poznámky . . . . . . . . . . . . . . . . . . . . . .
Tag Editor . . . . . . . . . . . . . . . . . . . . . .
Contact Tags . . . . . . . . . . . . . . . . . . . .
Ukázka nevhodné notifikace . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7
8
9
10
11
12
12
13
16
17
18
20
4.1
4.2
4.3
4.4
4.5
4.6
4.7
4.8
4.9
Hlavní UI poznámek . . . . . . . . .
Poznámka u e-mailu . . . . . . . . .
Více poznámek u e-mailu . . . . . .
Class diagram detailů poznámky . .
Schéma databáze pro poznámky . . .
Finální verze editoru tagů . . . . . .
Finální verze tagů v editaci kontaktu
Rozšířené zobrazení kontaktů . . . .
Snarl notifikace . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
24
25
26
27
28
32
33
34
37
B.1
B.2
B.3
B.4
Nastavení
Nastavení
Nastavení
Nastavení
. . . . . . . . .
IM účty . . . .
připojení . . .
další nastavení
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
52
52
53
53
ExtBrain
ExtBrain
ExtBrain
ExtBrain
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Communicator
Communicator
Communicator
Communicator
.
.
.
.
xv
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
xvi
SEZNAM OBRÁZKŮ
Kapitola 1
Úvod
Téma této diplomové práce je Integrace a rozvoj rozšíření ExtBrain Communicator. ExtBrain
Communicator (dále Communicator) je rozšíření pro poštovního klienta Mozilla Thunderbird
(dále Thunderbird), jehož původní verze přidává do Thunderbirdu podporu IM protokolu
Jabber. Tato práce má za účel využít další ExtBrain projekty, smysluplně je do Communicatoru integrovat a implementovat další funkcionalitu.
Toto téma jsem si zvolil proto, že jsem již pracoval na prvotní implementaci Communicatoru a práce mi přišla zajímavá a užitečná. Těší mě, že od té doby Communicator prošel
dalším vývojem a další vývoj bude pravděpodobně následovat i po této práci.
1
2
KAPITOLA 1. ÚVOD
Kapitola 2
Popis problému, specifikace cíle
Tato práce navazuje na předchozí projekty zabývající se tvorbou rozšíření ExtBrain Communicator pro opensource poštovního klienta Mozilla Thunderbird. Prvotní verze, na které
tato práce staví, obsahuje vlastní implementaci protokolu Jabber a umožňuje rozhovory mezi
dvěma uživateli. V hlavním okně Mozilla Thunderbird Communicator přidává postranní panel zobrazující kontakty ze zvolených adresářů a z Jabber účtů a následně tyto kontakty
spojuje podle IM účtů vyplněných v kontaktech z adresáře.
Původní verze není plně kompatibilní s aktuálními verzemi Mozilla Thunderbird a obsahuje množství chyb a nedodělků. Tyto problémy byly řešeny zpočátku této práce v rámci
seznamování se s Communicatorem.
Cílem této práce je integrování dalších rozšíření z rodiny projektů ExtBrain, zejména
ExtBrain Sync, který se zabývá synchronizací a verzováním dat. Jako úložiště pro ExtBrain
Sync je možné použít libovolný e-mailový server podporující protokol IMAP. Samotný ExtBrain Sync tuto funkcionalitu prezentuje modulem pro synchronizaci kontaktů z adresáře.
Kromě integrace jiných projektů se tato práce zabývá také implementací dalších rozšíření,
zejména se jedná modul pro správu poznámek. Tyto poznámky mohou odkazovat na emailové zprávy a mohou záviset na jiných poznámkách. Poznámky je také možné volně
převádět na události a úkoly.
Vývoj každé funkcionality začíná návrhem uživatelského rozhraní, způsobu uložení dat
a architektury. Prvotní implementace je předána k testování skupině dobrovolníků a podle
zpětné vazby probíhají další iterace vývoje.
2.1
Struktura práce
Analýza i realizace jsou rozděleny do několika částí. Každá část v analýze obsahuje prvotní
návrh dané funkcionality a v případě pozdějšího většího přepracování i případné změny.
Realizace pak obsahuje popis implementace finální verze funkcionality. V kapitole testování
je k nalezení zpětná vazba od uživatelů a úvahy pro řešení podnětů.
3
4
2.2
KAPITOLA 2. POPIS PROBLÉMU, SPECIFIKACE CÍLE
Srovnání již existujících poznámek pro Mozilla Thunderbird
Celý ExtBrain Communicator rozšiřuje Mozilla Thunderbird o velké množství nové funkcionality a prakticky neexistuje srovnatelný produkt. Jelikož stěžejní částí této práce je implementace poznámkového modulu pro Thunderbird, jsou zde proto srovnány implementace
poznámek pro Thunderbird.
2.2.1
Messagenotesplus
Messagenotesplus[1] se zabývá čistě poznámkami k e-mailům a nenabízí žádnou možnost
synchronizace dat. Jako úložiště je použita databáze SQLite.
Rozšíření přidává nový sloupec do seznamu e-mailů, tento sloupec indikuje, zda je k emailu připojena poznámka. Dále přidává pod zobrazený e-mail editovatelný box s poznámkou. Ukázka použití Messagenotesplus je na obrázku 2.1.
Obrázek 2.1: Messagenotesplus
2.2. SROVNÁNÍ JIŽ EXISTUJÍCÍCH POZNÁMEK PRO MOZILLA THUNDERBIRD 5
2.2.2
QuickFox Notes
QuickFox[2] Notes nabízí správu poznámek pro Mozilla Firefox a Thunderbird. Uživatelské
rozhraní tohoto rozšíření není do hostitelské aplikace příliš zaintegrované, rozšíření má vlastní
okno, které je možné vidět na obrázku 2.2. Není možné přiřazovat poznámky k e-mailům.
Obrázek 2.2: QuickFox Notes
Jako úložiště slouží buď záložky (bookmarks) nebo SQLite databáze. Uložení poznámek
v záložkách najde uplatnění v Mozilla Firefox a v tomto případě je pak možné poznámky jednoduše synchronizovat pomocí některého z dostupných rozšíření pro synchronizaci záložek.
SQLite databázi je pak možné použít i v Thunderbirdu.
QuickFox Notes umožňují vlastní synchronizaci s mnoha různými typy úložišť, mezi nejznámější patří Evernote, Google Docs a Dropbox.
2.2.3
ThunderNote
ThunderNote[3] je velmi jednoduché rozšíření nepříliš integrované do uživatelského Mozilla
Thunderbird. Veškerá práce s ním probíhá v samostatném okně, které je možné vidět na
obrázku 2.3. Není možné přiřazovat poznámky k e-mailům.
Jako úložiště je použit XML soubor. Poznámky je možné synchronizovat se službou
Helipad.
2.2.4
XNote++
XNote++[4] je rozšíření zaměřené pouze na poznámky k e-mailům. Do seznamu e-mailů
přidá nový sloupec, který indikuje přítomnost poznámky. Samotná poznámka se zobrazuje
jako plovoucí okno bez okraje. Ukázka je na obrázku 2.4.
XNote++ ukládá každou poznámku jako samostatný soubor, kde název je message ID
daného e-mailu. Přímo v XNote++ není podpora pro synchronizaci poznámek.
6
KAPITOLA 2. POPIS PROBLÉMU, SPECIFIKACE CÍLE
Obrázek 2.3: ThunderNote
Obrázek 2.4: XNote++
Kapitola 3
Analýza a návrh řešení
3.1
3.1.1
3.1.1.1
Architektura ExtBrain Communicator
Pohled na UI
Seznam kontaktů
Původní ExtBrain Communicator se zaměřuje na IM komunikaci přes protokol Jabber. Do
hlavního okna Mozilla Thunderbird přidává seznam s kontakty z IM účtů a kontakty z adresáře sloučené podle Jabber ID kontaktu. Seznam kontaktů je vidět na obrázku 3.1.
Obrázek 3.1: Seznam kontaktů
Zleva doprava, odshora dolů je možné vidět:
∙ Tlačítko pro změnu stavu.
7
8
KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ
∙ Vyhledávací box.
∙ Seznam kontaktů.
∙ Tlačítko pro vytvoření nového kontaktu.
∙ Checkbox pro zobrazení všech kontaktů / pouze kontaktů s ne-offline stavem.
3.1.1.2
Tab s rozhovorem
Po otevření rozhovoru s kontaktem se zobrazí nový tab, který je na obrázku 3.2. Zde jsou
kromě běžných prvků pro IM aplikace také viditelné dva comboboxy. První slouží pro přepnutí odchozího účtu uživatele Communicatoru, druhý pro přepnutí příchozího účtu druhého
uživatele. V případě, že je kontakt svázaný s více IM účty, comboboxy umožňují zvolit, který
bude aktuálně používaný. Pokud je třeba, přepne se při změně účtu v jednom boxu i účet
v druhém. Tento případ nastává, pokud je zvolena kombinace účtů, které spolu nemohou
komunikovat.
Obrázek 3.2: Rozhovor s kontaktem
3.1.1.3
Zobrazení historie rozhovorů
ExtBrain Communicator při zobrazení historie IM rozděluje všechny zprávy do rozhovorů.
Rozhovor je definován jako množina odeslaných nebo přijatých zpráv, mezi nimiž neuply-
3.1. ARCHITEKTURA EXTBRAIN COMMUNICATOR
9
nula doba delší než nějaká stanovená konstanta. Toto zvyšuje přehlednost při dohledávání
konkrétních informací v historii. Okno s historií je vidět na obrázku 3.3. Sloupec Messages
zde obsahuje počet zpráv v rozhovoru.
Obrázek 3.3: Historie rozhovorů
3.1.2
Pohled na vnitřní architekturu
Komunikaci přes Jabber protokol obstarává vlastní implementace protokolu v JavaScriptu,
kterou mají na starosti zejména prototypy XMPP a XMPPSocket.
Ukládání načtených a spojených kontaktů má na starost objekt contactList, kde stojí
za zmínění nejvíce properties contacts obsahující pole všech načtených kontaktů a jidMap,
což je asociativní pole kontaktů uložených podle klíče, kterým je Jabber ID kontaktu. Tyto
kontakty jsou instancemi prototypu Contact, který pro každý nabízí další podpůrné funkce.
Při otevření nového tabu s rozhovorem je jeho uživatelské rozhraní dynamicky vygenerováno objektem chatBox, který také obstarává další logiku pro tuto část uživatelského
rozhraní.
Příklad typické obsluhy příchozí události je zobrazen na sekvenčním diagramu 3.4. V
tomto případě se jedná o příchozí zprávu, na diagramu jsou objekty:
∙ XMPPSocket - Má na starost odesílání a příjem dat přes TCP/IP protokol. Při
příchozích datech volá dataAvailable na XMPP.
10
KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ
Obrázek 3.4: Obsluha příchozí zprávy
∙ XMPP - Má na starost zpracování XML souborů používaných Jabber protokolem.
Určí konkrétní typ zprávy a rozhodne o dalším zpracování. V tomto případě se jedná
o zprávu <message/>, volá proto příslušnou metodu na objektu Jabber.
∙ Jabber - Zajišťuje základní obsluhu přijaté události a dále předává informace dalším
objektům, které mají o tuto událost zájem. V tomto případě se jedná o ChatBox.
∙ ChatBox - Pokud ještě není otevřený tab s rozhovorem pro daný kontakt, ChatBox
ho připraví, zapíše příchozí zprávu a čeká na reakci uživatele.
Přijaté a odeslané zprávy se ukládají do SQLite databáze. Její schéma je jednoduché,
obsahuje jednu tabulku se sloupci:
∙ fromjid - Jabber ID lokálního účtu
∙ tojid - Jabber ID vzdáleného účtu
∙ direction - obsahuje řetězec in nebo out podle toho, kterým směrem zpráva šla
∙ date - datum odeslání / přijetí zprávy
∙ message - text zprávy, včetně HTML formátování
3.1.2.1
Proces slučování kontaktů
Jelikož nemusí z předchozího popisu slučování kontaktů být zcela zřejmé, co tento proces
obnáší, bude zde popsán detailněji.
3.1. ARCHITEKTURA EXTBRAIN COMMUNICATOR
11
Obrázek 3.5: Počáteční zpracování kontaktů
Kontakt v adresáři může mít k sobě přiřazených několik Jabber ID. Po startu Thunderbirdu jsou tyto kontakty načteny a podle klíče Jabber ID uloženy do asociativního
contactList.jidMap. Po připojení k Jabber účtu je pak u všech příchozích dat kontrolováno Jabber ID odesílatele. Pokud se toto Jabber ID vyskytuje v jidMap, je zřejmé, že se
jedná o tentýž kontakt z adresáře.
Pokud je tedy v adresáři kontakt Josef Novák s přiřazeným Jabber ID [email protected],
pak po připojení k Jabber účtu a přijetí informace o přítomnosti kontaktu [email protected]
v tomto Jabber účtu ExtBrain Communicator tyto kontakty použije jako jedinou instanci.
Kontakt v adresáři může mít přiřazeno i více Jabber ID, například osobní a pracovní.
I v tomto případě se všechny tyto kontakty zobrazují v Communicator seznamu kontaktů jako
jedna instance kontaktu, což v důsledku zvyšuje přehlednost seznamu kontaktů a zvyšuje
komfort používání.
Tento proces začíná tím, že se po startu projdou všechny zvolené adresáře a pro všechny
kontakty v nich se zjišťuje, zda obsahují nějaká Jabber ID. Pokud ano, je kontakt vložen do
contactList.jidMap a klíčem je právě toto nalezené Jabber ID. Nakonec je kontakt vložen
do contactList.contacts, což je pole všech kontaktů bez ohledu na to, zda obsahují nějaké
Jabber ID nebo ne. Diagram aktivit pro tento proces je vidět na obrázku 3.5.
Po startu a načtení kontaktů většinou následuje připojení k Jabber účtům. Po připojení
k účtu Communicator začne přijímat informace o kontaktech z Jabber účtů, tzv. roster.
Zpracování dat z rosteru je na obrázku 3.6.
Další příchozí data a zprávy od takto zpracovaného kontaktu už využívají instanci Contact v contactList.jidMap.
12
KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ
Obrázek 3.6: Zpracování kontaktů z rosteru
Obrázek 3.7: Vytváření regulárního výrazu
3.1.2.2
Vyhledávání v kontaktech
Pro vyhledávání v seznamu kontaktů se používají regulární výrazy speciálně formulované pro
ignorování diakritických znamének a velkých / malých písmen. Je proto možné najít kontakt
„Čeněk“ zadáním „cenek“. Diagram vytváření takového regulárního výrazu je na obrázku 3.7.
Ukázka generování takového regulárního výrazu pro řetězec „Čeněk“ je na obrázku 3.8.
Pro tuto ukázku je použit JavaScript Shell.
3.1. ARCHITEKTURA EXTBRAIN COMMUNICATOR
13
Obrázek 3.8: Generování regulárního výrazu v JavaScript Shell
3.1.3
Návrh vylepšení s použitím technologicky pokročilejších vlastností
Mozilla Application Framework
Původní verze ExtBrain Communicator je psána s celkem širokým využitím možností Mozilla Application Frameworku. Vytknout by bylo možné nepoužívání broadcaster / observer
elementů.
3.1.3.1
Použití broadcaster / observer
Při změně stavu kontaktu event handler obsluhující tuto událost nastavuje změnu stavu
postupně ve všech částech uživatelského rozhraní, kde se tato informace vyskytuje.
Místo toho je elegantnější použít broadcasters / observers. Tato vlastnost Mozilla Application Framework má dvě možné implementace:
1. V XUL souborech je vytvořen nový element <broadcaster/>. Tomuto elementu se nastaví informace, například stav kontaktu. Místo ručního nastavování této informace se
prvkům, u kterých je to třeba, přidá atribut observes="broadcasterId". To způsobí,
že všechny atributy nastavené broadcasteru jsou automaticky přeneseny i na observer
element[5].
2. Použití observers bez XUL elementů, pomocí observer service[6].
Observer service je implementací interface nsIObserverService, kde dvě nejdůležitější
funkce jsou:
14
KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ
Listing 3.1: nsIObserverService
void addObserver(
in nsIObserver anObserver,
in string aTopic,
in boolean ownsWeak)
1
2
3
4
5
void notifyObservers(
in nsISupports aSubject,
in string aTopic,
in wstring someData)
6
7
8
9
aTopic je téma, ze kterého Observer přijímá zprávy. Observer implementující nsIObserver
může být prostý JavaScript objekt obsahující funkci observe, která se použije jako callback
funkce při přijatém upozornění na sledované téma.
Toto upozornění se odesílá právě pomocí funkce notifyObservers, navíc je možné připojit
k upozornění libovolný textový řetězec s detaily upozornění.
3.2
3.2.1
Další vývoj
Integrace ExtBrain Sync
ExtBrain Sync je rozšíření umožňující synchronizaci dat v Mozilla Thunderbird pomocí
IMAP protokolu, takže jako vzdálené úložiště lze použít jakýkoli e-mailový server podporující IMAP protokol. ExtBrain Sync je vyvíjen souběžně s touto prací a nové verze jsou
do ExtBrain Communicatoru průběžně integrovány. Původní ExtBrain Sync demonstruje
funkcionalitu na synchronizaci složek kontaktů v Mozilla Thunderbird, navíc ještě ke kontaktům přidává nové vlastnosti. Z těch jsou pro Communicator zajímavá zejména pole pro
IM účty, kde je možné definovat několik IM účtů protokolem (např. ICQ, Jabber), typem
(např. home, work) a samotnou adresou IM účtu. Oproti tomu v základní verzi podporuje
Mozilla Thunderbird pouze uložení jediné IM adresy bez udání typu protokolu.
3.2.2
Poznámky
Communicator přidává do Thunderbirdu podporu poznámek. Poznámka může být převedena na událost prostým nastavením počátečního a koncového data, případně převedena na
úkol. Poznámky je možné synchronizovat pomocí ExtBrain Sync. Prvotní návrh, co vše by
poznámka měla obsahovat, je:
∙ uuid - unikátní identifikátor
∙ body [F] - tělo zprávy v HTML
∙ subject [F] - předmět poznámky (plain text - použije se pro náhled v jednoduchých
seznamech; pokud není zadán, tak se při zobrazení jako subject dosadí body s ořezanými
html tagy)
∙ createdDate - datum a čas vytvoření
3.2. DALŠÍ VÝVOJ
15
∙ modifiedDate - datum a čas poslední změny
∙ authors [F] - seznam uživatelů, kteří se podíleli na zprávě, pokud aktuální uživatel v
seznamu není, připojí se na konec
∙ notifyDate - datum a čas pro zobrazení upozornění
∙ startDate - datum a čas začátku - pro zobrazení v kalendáři
∙ endDate datum a čas konce - pro zobrazení v kalendáři
∙ isFullDay - zobrazí se jako celodenní událost
∙ isTask - poznámka je úkol
∙ isCompleted - úkol je dokončen
∙ ordinal - hodnota pro vlastní řazení poznámek uživatelem
∙ priority - priorita
∙ tags [F] - seznam textových tagů
∙ dependsOn [F] - seznam uuids, na kterých úkol závisí
∙ messageIds [F] - seznam message-id/s, může být napojena na více emailu najednou;
email také může mít více poznámek
[F] značí, že na tyto hodnoty by se měl použít full text index pro rychlejší vyhledávání.
Poznámky, které jsou událostmi, má být možné zobrazit v Lightning kalendáři. Prvotní návrh
uživatelského rozhraní je na obrázku 3.9.
3.2.3
Přidání párování kontaktů pro jiné protokoly než Jabber
Původní Communicator v seznamu kontaktů v hlavním okně zobrazuje sloučené kontakty,
které mají v adresáři vyplněné Jabber ID odpovídající kontaktu z rosteru nějakého Jabber
účtu. Sloučení s ExtBrain Sync přidává další pole pro IM účty, konkrétně je možné nastavit
pro každý účet protokol (Jabber, ICQ...), typ (home, office...) a identifikátor uživatele v síti.
S protokolem Jabber je možné použít tzv. transporty, které umožňují transparentní komunikaci s uživateli z jiných sítí než Jabber pomocí Jabber účtu. Je proto vhodně přidat
funkcionalitu, která přidá do Communicatoru schopnost rozpoznat kontakty z transportů a
přiřadit je ke správnému kontaktu v adresáři.
3.2.4
Rozšíření kontaktů o podporu pro tagy
Communicator má za úkol do Thunderbirdu přidat podporu pro skupiny kontaktů. Kontakt
má mít možnost být ve více skupinách zároveň, proto je vhodnější tyto skupiny nazývat spíše
tag (štítek).
Pro každý tag lze nastavit:
16
KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ
Obrázek 3.9: Poznámky
3.2. DALŠÍ VÝVOJ
17
∙ upozorňování, pokud se kontakt s daným tagem připojí na IM
∙ upozorňování, že kontakt píše zprávu
∙ skrytí kontaktu v seznamu kontaktů
∙ označení kontaktu jako oblíbeného - v seznamu kontaktů se pak zobrazuje přednostně
na prvních pozicích nezávisle na způsobu řazení
3.2.4.1
Editace tagů
Návrh uživatelského rozhraní pro editaci tagů je na obrázku 3.10.
Obrázek 3.10: Tag Editor
Dialog obsahuje seznam tagů, pro každý tag je možné nastavit jeho vlastnosti do jednoho
ze tří stavů:
∙ Yes - zapnuto
∙ Don’t Care - nemá vliv
∙ No - vypnuto
Jednotlivé tagy lze pak pomocí drag and drop řadit. Pořadí určuje prioritu tagu. Více
o prioritě tagů bude uvedeno dále.
18
3.2.4.2
KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ
Přiřazení tagů kontaktu
Pro přiřazování tagů kontaktu slouží rozšíření dialogu pro editaci kontaktu na obrázku 3.11.
Obrázek 3.11: Contact Tags
Kontaktu se přiřadí tag zaškrtnutím checkboxu v tabulce s tagy. Výslednou hodnotou
každé vlastnosti je první Yes nebo No hodnota tagu, bráno podle nejvyšší priority. Pokud
žádná taková není nalezena, je dosazeno automatické No. Dále je ještě možné kontaktu
některé z těchto vlastností nastavit zvlášť na vlastní hodnotu nezávisle vůči aplikovaným
tagům.
3.2.4.3
Přehled vlastností a tagů přiřazených kontaktům
Aby bylo možné jednoduše zjistit tagy přiřazené více kontaktům a vlastnosti kontaktů s nimi
související, jsou do adresáře přidány nové sloupce zobrazující tyto informace.
3.2.4.4
Způsob uložení dat
Jednotlivé tagy a jejich vlastnosti jsou uloženy jako řetězec v preferencích pod klíčem
extbrain.xmpp.tags. Informace o tagu v tomto řetězci jsou ve formátu:
jménoTagu1,vlastnost1=hodnota,vlastnost2=hodnota
3.2. DALŠÍ VÝVOJ
19
Jednotlivé tagy jsou od sebe odděleny středníkem. Dále je třeba provést escape speciálních
znaků v názvu tagu.
V kontaktu jsou data uložena jako další vlastnosti karty kontaktu. Seznam tagů je uložen
v ExtBrainTags, kde jsou jednotlivé tagy odděleny středníkem a speciální znaky vyescapovány. Hodnoty ostatních vlastností jsou uloženy jako:
∙ ExtBrainNotifyConnected - upozornění na nově připojený kontakt (přechod z offline)
∙ ExtBrainNotifyAvailable - upozornění na kontakt, který přešel do available stavu
z jakéhokoliv jiného stavu
∙ ExtBrainNotifyComposing - upozornění, že kontakt píše zprávu
∙ ExtBrainStarred - kontakt označen jako oblíbený se zobrazuje v seznamu kontaktů
přednostně
∙ ExtBrainHidden - kontakt se v seznamu kontaktů nezobrazuje (je ale stále k nalezení
v adresáři)
3.2.5
Přidání podpory pro Snarl notifikace
Pro zobrazení některých informací v Thunderbirdu a také v původní verzi Communicatoru se používají oznámení s Alerts Service[7]. Služba se získá voláním
CS("@mozilla.org/alerts-service;1", Ci.nsIAlertsService) a poskytuje jedinou
funkci:
Listing 3.2: nsIAlertsService
1
2
3
4
5
void showAlertNotification(
in AString imageUrl, in AString title,
in AString text, [optional] in boolean textClickable,
[optional] in AString cookie, [optional] in nsIObserver alertListener,
[optional] in AString name);
Po zavolání této funkce se ve Windows z taskbaru poblíž hodin vysune notifikace s názvem
definovaným parametrem title, popisem z parametru text a ikonkou z parametru imageUrl.
Dále pokud má parametr textClickable hodnotu true, je po kliknutí na zobrazenou notifikaci
zavolán observer získaný z parametru alertListener a je mu předán řetězec z parametru
cookie. Parametr name se na Windows nepoužívá.
Tyto notifikace jsou ale na Windows vzhledově nekonzistentní se zbytkem systému, navíc
je jejich chování někdy nevyhovující. Jedním z těchto případů je, pokud je taskbar Windows
nastaven do svislého režimu a je zobrazena notifikace s dlouhým textem, jak je ukázáno na
obrázku 3.12.
Vysunutí této notifikace z taskbaru trvá 20 sekund. Pro tento typ je proto volitelně možné
použít Snarl, což je opensource nástroj pro zobrazování detailně nastavitelných a vzhledově
konzistentních notifikací na Windows. Po instalaci pak mohou Snarl pro zobrazování svých
notifikací používat jiné aplikace, některé Snarl podporují přímo od vývojářů, do jiných je
20
KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ
Obrázek 3.12: Ukázka nevhodné notifikace
podporu možné přidat doplňkem či rozšířením. Celkově je Snarl podobný jako například
Growl na Mac OS.
Implementace podpory Snarl do Communicatoru by měla být transparentní, zachovávat
stejné API jako původní alerts service a mělo by být možné za běhu přepínat mezi novou a
původní implementací.
3.3
3.3.1
Použité nástroje
IntelliJ IDEA
Jako vývojové prostředí bylo použito IntelliJ IDEA od společnosti Jetbrains. Toto IDE sice
nenabízí přímo podporu pro vývoj rozšíření pro Thunderbird, ale v porovnání s konkurenčními Eclipse a Netbeans má ke konci roku 2011 nejlepší podporu pro JavaScript.
Pro Eclipse existuje několik pluginů, které zjednodušují vývoj pro Thunderbird, žádný se
ale již několik let nevyvíjí. Eclipse má také slabší podporu pro JavaScript. Kontrola syntaxe
má problémy s konstrukty z novějších verzí JavaScriptu, například array comprehensions
z JavaScript 1.7. Užitečná volba go to definition pro skok na definici funkce volané v kódu
zde nefunguje.
Netbeans jsou na tom v tomto ohledu lépe. Nejaktuálnějším pluginem zjednodušujícím
vývoj pro Thunderbird je Foxbeans, který rozšiřuje uživatelské rozhraní Netbeans pro snadnou editaci některých konfiguračních souborů vyvíjených rozšíření a přidává podporu pro
schema XUL souborů. Netbeans si bez problému poradí i s nejnovější verzí JavaScriptu a
občas i se skokem na definici funkce.
IDEA zvládá nejnovější verze JavaScriptu také, přechod na definici funkce je často bez
problému. Tato funkce samozřejmě nemusí vždy fungovat správně a spolehlivě. Podpora pro
XUL soubory byla dodána naimportováním XUL schematu nalezeného na internetu.
3.3.2
Pencil
Pro prototypování uživatelského rozhraní je použit Pencil. Tato aplikace umožňuje rychlé
vytváření jednoduchých návrhů UI.
3.3.3
Doplňky v Thunderbirdu
Řazeno abecedně.
3.3. POUŽITÉ NÁSTROJE
3.3.3.1
21
Console2
Console2 je v podstatě vylepšenou verzí původní chybové konzole. Stejně jako původní verze
zabudovaná v Thunderbirdu zobrazuje informační hlášení týkající se běhu programu, varování, nastalé chyby a neošetřené výjimky. Console2 navíc oproti původní verzi umožňuje
pokročilejší filtrování a vyhledávání událostí.
3.3.3.2
Developer Assistant
Doplněk Developer Assistant obsahuje několik nástrojů pro snadnější vývoj a ladění doplňků.
Mezi nejvíce využívané při tvorbě této práce patří:
∙ JavaScript Shell - umožňuje interaktivní vykonávání JavaScriptových příkazů. Po zvolení okna je možné pracovat v něm s již existujícími objekty, což je užitečné pro ladění.
Shell také podporuje napovídání v kontextu na klávesu TAB.
∙ Real-time XUL Editor - jednoduchý editor uživatelského rozhraní v XUL. Nenabízí
žádné pokročilejší napovídání kódu, je ale užitečný pro doladění drobných nedostatků
v UI, kdy by jinak bylo potřeba pro zobrazení změn restartovat celý Thunderbird.
∙ JRX: real-time JavaScript RegExp evaluator - jednoduchý nástroj pro odladění regulárních výrazů přímo v Thunderbirdu.
3.3.3.3
DOM Inspector
Umožňuje procházení a editaci DOM struktury XML dokumentů. Obsahuje nástroj pro jednoduchý výběr uzlu v DOM Inspectoru kliknutím na odpovídající prvek UI v Thunderbirdu.
Naopak po výběru uzlu v DOM Inspectoru se odpovídající prvek pro přehlednost v UI zvýrazní.
DOM Inspector obsahuje několik pohledů na vybraný uzel, patří mezi ně:
∙ DOM Node - zobrazuje všechny atributy uzlu a jejich hodnoty.
∙ Box Model - obsahuje informace týkající se skutečné polohy a rozměrů prvku.
∙ XBL Bindings - zobrazuje seznam všech XBL Bindings aplikovaných na uzel a jejich
definici logicky zobrazenou v UI. Dále je možnost zobrazit přímo zdrojový kód Bindingu.
∙ CSS Rules - zobrazuje seznam všech CSS pravidel aplikovaných na uzel.
∙ Computed Style - zobrazuje seznam výsledných vypočítaných hodnot CSS.
∙ JavaScript Object - obsahuje pohled na uzel jako na JavaScript objekt.
3.3.3.4
Event Spy
Event Spy rozšiřuje možnosti DOM Inspectoru o zobrazení event listenerů připojených k uzlu
a na zobrazení událostí procházejících uzlem. Je možné události filtrovat podle typu a podle
fáze (Capturing, Bubbling, Target).
22
3.3.3.5
KAPITOLA 3. ANALÝZA A NÁVRH ŘEŠENÍ
Exit Button Thunderbird
Jednoduché tlačítko pro rychlé ukončení celého Thunderbirdu. Užitečné v situacích, kdy je
při vývoji a ladění otevřeno mnoho oken a jejich zavírání by bylo příliš zdržující.
3.3.3.6
InspectorWidget
Doplněk přidávající tlačítko pro rychlé otevření DOM Inspectoru. Po kliknutí na tlačítko je
možné rovnou vybrat prvek UI, který chce uživatel zobrazit v DOM Inspectoru. Tím odpadá
samostatné spouštění DOM Inspectoru a výběr cílového dokumentu.
3.3.3.7
JavaScript Debugger
Jedná se o debugger pro JavaScript v XUL aplikacích. Vývoj je ale zastaven a poslední verze
má problémy s konstrukty z novějších verzí JavaScriptu.
3.3.3.8
Lightning
Lightning přidává do Thunderbirdu správu kalendářů a úkolů. Toto rozšíření není přímo
použito pro vývoj, ale pokud je doinstalované, poznámky v něm zobrazují své události.
3.3.3.9
SQLite Manager
Thunderbird nabízí SQLite jako datové úložiště pod názvem mozStorage. SQLite Manager
je rozšíření pro Thunderbird, které umožňuje s těmito databázemi dále pracovat, procházet
a editovat je.
3.3.3.10
ViewAbout
Jednoduchý nástroj pro rychlý přístup k nastavení a informacím pro pokročilé uživatele a
vývojáře. V Mozilla Firefox jsou tato nastavení a informace přístupná na URL začínajících
about:, Thunderbird ale nemá adresní řádek a proto je přístup k některým z těchto dialogů
těžkopádný.
Kapitola 4
Realizace
4.1
Poznámky
Implementaci modulu pro správu poznámek je v této práci věnováno nejvíce pozornosti.
Oproti původnímu návrhu se po několika iteracích vývoje se ukázalo, že by bylo vhodné mít
možnost rozdělit si poznámky do několika různých složek (notebook) a každou složku navíc
synchronizovat s jiným úložištěm.
4.1.1
Uživatelské rozhraní
Finální verze uživatelského rozhraní poznámek je na obrázku 4.1. V levé části je vidět:
∙ Toolbar s comboboxem pro přepínání notebooků, zobrazením koše poznámek a tlačítkem pro další volby notebooku.
∙ Toolbar s tlačítkem pro aktivaci vlastního řazení poznámek, tlačítko s rychlými filtry
(pouze události, úkoly atd) a pole pro vyhledávání poznámek.
∙ Seznam poznámek v notebooku.
V pravé části je detail vybrané poznámky. Ten obsahuje:
∙ Tlačítka pro vytvoření nové poznámky, přechod na starší verze poznámky a smazání
poznámky.
∙ Pole pro zadání názvu (subject) a obsahu (body) poznámky. Obsah je možné formátovat pomocí tlačítek podobně jako při psaní e-mailu.
∙ Další volby: nastavení počátečního a koncového data, data upozornění, celodenní událost, úkol, splněný úkoly, priorita a tagy.
∙ Odkazy na související poznámky a e-maily. Ty je možné přidávat pomocí drag and
drop.
23
24
KAPITOLA 4. REALIZACE
Obrázek 4.1: Hlavní UI poznámek
Panel v pravém okraji okna pochází z Lightning, je v něm ale vidět zobrazená poznámka
/ událost.
Poznámky se zobrazují i u e-mailu, pokud je zde vytvořena závislost. Uživatelské rozhraní
je v tomto případě podobné, viz obrázek 4.2.
4.1.1.1
Komponenta detailů poznámky
Protože se zobrazení detailů poznámky používá jak v hlavním tabu s poznámkami, tak také
u e-mailových zpráv, není vhodné pro jejich definici používat definici v XUL souborech. Toto
řešení by vedlo k velké duplikaci kódu.
Bylo proto rozhodnuto implementovat znovupoužitelnou komponentu - detaily poznámky. Nejedná se přímo o XBL binding[8], protože si komponenta může dovolit závislost
na částech kódu Communicatoru.
Tato komponenta je implementována prototypem ExtbrainNoteDetails. Vytvoření nové
instance probíhá pomocí konstruktoru s parametry:
∙ name - Udává jméno instance komponenty. Používá se při notifikacích o změně stavu
poznámky.
∙ notebookProvider - Funkce pro zjištění notebooku, ke kterému bude příslušet nově
vytvořená poznámka.
4.1. POZNÁMKY
25
Obrázek 4.2: Poznámka u e-mailu
∙ dependencyViewProvider - Funkce přijímající parametr UUID se používá pro zobrazení závislé poznámky odkazované z poznámky zobrazené v komponentě.
API pro použití komponenty se skládá z funkcí:
∙ getNoteDetailsUI() - Vrací referenci na kořenový prvek uživatelského rozhraní.
∙ getNoteUUID() - Vrací UUID aktuálně zobrazené poznámky nebo null, pokud není
žádná poznámka načtena.
∙ setNoteByUUID(UUID) - Vyvolá načtení poznámky s daným UUID do uživatelského rozhraní.
Jak je vidět, v API není řešeno ukládání poznámky. To proto, že ukládání se děje automaticky při změně poznámky v UI.
Protože se poznámky mohou zobrazovat najednou ve více místech uživatelského rozhraní,
je nutné zajistit, aby zobrazované informace napříč celou aplikací byly konzistentní. Toto
je vyřešeno použitím Observer service, kde po uložení poznámky jsou notifikováni observeři
poslouchající na event extbrainNotesModified. Jako data přidružená k tomuto eventu je poslán
JSON serializovaný objekt, protože Observer service neumožňuje k eventu přidružit jiný
datový typ než string.
Objekt nese tyto informace:
26
KAPITOLA 4. REALIZACE
∙ name - Název instance detailů poznámky.
∙ UUID - UUID poznámky, které se změna týká.
∙ operation - Operace, která byla provedena: „c“ pro vytvoření nové poznámky, „u“ pro
změnu poznámky, „d“ pro odstranění poznámky.
Díky této notifikaci a přidruženým datům mohou všechny instance detailů poznámek při
změně dat okamžitě zareagovat a upravit zobrazovaná data podle potřeby.
4.1.1.2
Komponenta detailů poznámek pro zobrazení u e-mailu
Pro zobrazení poznámek u e-mailu, viz obrázek 4.2, je použita upravená verze komponenty
ExtbrainNoteDetails. To proto, že je navíc přidán seznam všech poznámek souvisejících
s daným e-mailem. Ten se zobrazuje pouze, pokud je poznámek více, jelikož se předpokládá,
že ve většině případů uživatelům jedna poznámka k e-mailu dostačuje a seznam poznámek
by tak zbytečně zabíral místo. Seznam poznámek u e-mailu je vidět na obrázku 4.3.
Obrázek 4.3: Více poznámek u e-mailu
Tato komponenta je implementována prototypem ExtbrainNoteDetailsCompactOverview,
který
je
potomkem
ExtbrainNoteDetails.
Jeho
API
obsahuje
funkci
setNotesByMessageHeader(header), která nastaví zobrazené poznámky podle hlavičky
předaného e-mailu.
Diagram s ExtbrainNoteDetails a ExtbrainNoteDetailsCompactOverview je na obrázku
4.4.
4.1.2
Uložení dat
Jako úložiště poznámek se používá SQLite, které je v XUL dobře podporované[9]. Pro full
text indexy je použito rozšíření FTS4[10].
4.1. POZNÁMKY
27
Obrázek 4.4: Class diagram detailů poznámky
4.1.2.1
SQLite a FTS4
FTS tabulky se na rozdíl od obyčejných vytvářejí příkazem:
CREATE VIRTUAL TABLE tableName USING fts4(column TEXT, column2 TEXT)
Kromě definované tabulky se pak v databázi vytvoří ještě několik dalších tabulek s příponami: _content, _docsize, _segdir, _segments a _stat.
V ukázkovém příkazu pro vytvoření tabulky jsou sice definovány datové typy sloupců, ale
v praxi je možné je vynechat, protože FTS nakonec se všemi daty zachází jako s textem. Na
FTS tabulkách také není možné použít obyčejné indexy. Obyčejný index je jen na implicitním
sloupci rowid.
Z tohoto důvodu je třeba použití správných SQL dotazů, aby byl naplno využit rychlostní
potenciál FTS tabulky. Je vhodné používat ve WHERE buď rowid s indexem nebo nějaký
s ostatních sloupců, kde se v tomto případě použije klíčové slovo MATCH.
SELECT * FROM tableName WHERE column MATCH ’query’
Místo jména sloupce je také možné použít jméno tabulky, prohledají se pak všechny
sloupce kromě rowid.
Volitelnou možností při vytváření FTS tabulky je tokenizer. Tokenizer se stará o rozdělení
vstupního textu na tokeny, z nichž se vytváří full text index. Pokud není žádný tokenizer zadán, použije se Simple tokenizer, který text pouze převádí na lowercase a odstraňuje speciální
znaky.
Užitečnou vlastností pro vyhledávání ve FTS tabulce je ignorování diakritiky. To by
mohl nabídnout ICU tokenizer, ten ale není v Thunderbird SQLite dodán. Místo toho nabízí
Thunderbird tokenizer Mozporter, který používá například Gloda1 .
Mozporter není možné rovnou používat s jakýmkoliv připojením k databázi, je nutné
Mozporter v připojení nejdříve zaregistrovat:
Listing 4.1: Mozporter
var mozporter = CI("@mozilla.org/messenger/fts3tokenizer;1"]
.createInstance(Ci.nsIFts3Tokenizer);
mozporter.registerTokenizer(connection) // instance mozIStorageConnection
1
2
3
1
Fulltextové vyhledávání v e-mailech implementované v Thunderbirdu
28
4.1.2.2
KAPITOLA 4. REALIZACE
Databáze pro poznámky
Databázové schéma je uvedeno na obrázku 4.5.
Obrázek 4.5: Schéma databáze pro poznámky
Tabulka noteFTS je jediná FTS tabulka. Hodnoty body, subject, authors a tags se ukládají do tabulky note i noteFTS. Důvod této redundance je, že byl nakonec použit Simple
tokenizer, který neřeší odstranění diakritiky.
Bylo zjištěno, že Mozporter tokenizer nevrací výsledky, pokud je při vyhledávání zadán
řetězec kratší než dva znaky[11]. Toto bylo ve filtru poznámek matoucí, byl proto použit
Simple tokenizer. Při vkládání dat i pro hledané řetězce je aplikována vlastní metoda pro
odstranění diakritiky. Navíc body ukládá data v HTML formátu a není žádoucí, aby vyhledávání bralo v úvahu HTML tagy použité pro formátování poznámky. Proto se před vložením
do body v tabulce noteFTS odstraní veškeré HTML s výjimkou URL odkazů v a:href. Podle
těch je pak stále možné vyhledávat.
Tabulka noteFTS se pak používá jen pro vyhledávání, původní data se získají pomocí
JOIN note tabulky s noteFTS, kde ftsFK v tabulce note se rovná rowid v tabulce noteFTS.
4.1. POZNÁMKY
4.1.3
29
Synchronizace dat
Pro synchronizaci dat je použit ExtBrain Sync, který byl původně určený pouze pro synchronizaci kontaktů s IMAP úložištěm. Jeho zobecněnou verzi je ale možné použít nejen pro
kontakty, ale i pro jakákoliv jiná data.
Pro synchronizaci poznámek pak stačilo vytvořit prototyp NotesSynchronization, který
implementuje rozhraní využívané synchronizací.
Toto zahrnuje funkce:
∙ makeSyncTable - pro správné rozdělení dat podle jejich přítomnosti v lokálním a
vzdáleném úložišti a podle verze.
∙ initialItemHandling - pro inicializování metadat doposud nikdy nesynchronizované
poznámky.
∙ deleteItem - pro smazání poznámky z lokálního úložiště. Tato poznámka byla smazána
ve vzdáleném úložišti a v lokálním mezi tím neproběhly žádné jiné změny.
∙ createItem - pro vytvoření poznámky v lokálním úložišti. V tomto případě se jedná
o nově příchozí poznámku ze vzdáleného úložiště.
∙ acceptChange - používá se například v případě, kdy lokální i vzdálená verze jsou
stejné, jen chybí synchronizační metadata.
∙ handleCollision - pokud nastane konflikt mezi lokálním a vzdáleným úložištěm, je
třeba konflikt vyřešit zde. Konflikt nastává pokud byla poznámka od poslední synchronizace změněna v lokálním i ve vzdáleném úložišti.
∙ serialize - stará se o serializaci poznámky na textový řetězec - zde je použit JSON.
∙ deserialize - stará se o deserializaci poznámky z textového řetězce.
ExtBrain Sync při synchronizaci ukládá do své databáze pro každý synchronizovaný
objekt (kontakt, poznámku) informace z aktuální verze objektu. Díky tomu je možné se
vracet k předchozím verzím objektu.
4.1.4
Dohledávání e-mailu odkazovaného v poznámce
Při synchronizaci poznámek se odkazované e-maily identifikují pomocí message ID, které je
globálně unikátní pro danou zprávu[12]. Pomocí message ID ale v Thunderbirdu není možné
zprávu rychle a jednoduše dohledat, pro tento případ se používá message URI, které má
pouze lokální význam pro danou instanci Thunderbirdu s jeho nastavením účtů.
Message ID může vypadat takto:
CAGYpOodhp_5dSq0JLASqMHKdj=P+09rVUAVWp-4QVkm3UxmjhQ@mail.gmail.com
Zatímco tvar message URI je následující:
30
KAPITOLA 4. REALIZACE
imap-message://dummydmmm%[email protected]/INBOX#1
V databázi se ukládá jak message ID, tak také message URI. V případě přiřazení e-mailu
k poznámce je známé message ID i message URI, takže se obě hodnoty mohou uložit do
databáze.
V případě, kdy přijde poznámka při synchronizaci ze vzdáleného úložiště, je uvedena
pouze informace o message ID. I kdyby bylo message URI uvedeno, nemuselo by odkazovat
na správnou zprávu. Po uložení zpráv ze synchronizace se message URI podle message ID
dohledá. Při tomto dohledávání by bylo třeba postupně projít všechny nastavené účty, složky
a zprávy a pro každou zprávu ověřit, zda není právě tou hledanou s daným message ID.
Toto by bylo při velkém počtu zpráv příliš náročné, proto se pro dohledání zpráv používá Gloda. Gloda je implementace full textového vyhledávání v e-mailových databázích
Thunderbirdu. Podobně jako vyhledávání v poznámkách je založena na SQLite a FTS.
Vyhledávání je v tomto případě asynchronní, po dokončení vyhledávání je zavolána callback funkce. Navíc i po dokončení je monitorován index a pro další přidané položky odpovídající hledaným je opět zavolána callback funkce.
Hledaný dotaz se vytvoří pomocí volání:
Listing 4.2: Gloda
1
2
var query = Gloda.newQuery(Gloda.NOUN_MESSAGE);
query.headerMessageID.apply(query, messageIds);
messageIds je pole message ID, ke kterým je třeba dohledat uložené zprávy. Nakonec je
třeba na query zavolat funkci getCollection a předat jí listener s callback funkcemi, které se
zavolají po dokončení vyhledávání nebo dalších změnách v indexu.
Tyto funkce jsou:
∙ onItemsAdded(aItems, aCollection) - přidání nového výsledku do indexu, aItems
obsahuje nové výsledky, aCollection kompletní výsledky hledání
∙ onItemsModified(aItems, aCollection) - změna výsledku v indexu
∙ onItemsRemoved(aItems, aCollection) - odstranění výsledku z indexu
∙ onQueryCompleted(aCollection) - dokončení vyhledávání
4.1.5
Lightning kalendáře
Pro zobrazování poznámek, které jsou zároveň událostmi v Lightning kalendáři, bylo třeba
implementovat komponentu s rozhraním calICalendar. Komponentu je pak třeba zaregistrovat v souboru chrome.manifest:
Listing 4.3: Lightning calendar
1
2
3
4
component {C54CC340−8B12−11E1−B0C4−0800200C9A66}
components/ExtbrainNotesCalendar.js
contract @mozilla.org/calendar/calendar;1?type=extbrainnotes
{C54CC340−8B12−11E1−B0C4−0800200C9A66}
4.2. PŘIDÁNÍ PÁROVÁNÍ KONTAKTŮ PRO JINÉ PROTOKOLY NEŽ JABBER
31
Kalendář samotný se pak do Ligtningu přidá po importu skriptu
resource://calendar/modules/calUtils.jsm jednoduše pomocí následujícího kódu:
Listing 4.4: Registrace Lightning calendar
var calendar = cal.getCalendarManager().createCalendar("extbrainnotes", uri);
calendar.name = "Notebook " + notebook.name;
cal.getCalendarManager().registerCalendar(calendar);
1
2
3
Přičemž extbrainnotes odpovídá řetězci z contract type při registraci komponenty a
URI jednoznačně identifikuje kalendář v rámci ExtBrain kalendářů. Zde se jedná o kombinaci
předpony, která zajišťuje, že URI je skutečně validní URI a jména notebooku, ke kterému se
vztahuje.
Zaregistrovaný kalendář pak při změně poznámek provede refresh všech jeho událostí.
4.1.6
Indikace poznámky u e-mailu
Do hlavního okna Thunderbirdu do přehledu e-mailů (threadTree) byl přidán nový sloupec,
který indikuje, zda je k e-mailu připojena nějaká poznámka. Přidávání nových sloupců do
přehledu e-mailů je velmi jednoduché.
Stačí přidat nový treecol element do threadTree v hlavním overlay Communicatoru
a dále implementovat vlastní column handler. To je objekt implementující interface
nsIMsgCustomColumnHandler, který obsahuje několik funkcí z nsITreeView a navíc ještě
funkce getSortStringForRow, getSortLongForRow a isString.
V tomto případě bylo důležité do funkce getCellProperties přidat kontrolu, zda daný
e-mail je propojen s poznámkami. Pokud ano, přidá se buňce property hasNotes. Tu je pak
dále možné stylovat pomocí CSS, v tomto případě je přidána ikonka poznámky.
Nakonec je třeba column handler zaregistrovat pro obsluhu tohoto sloupce. Registrace
se musí dít znovu po každém vytvoření MsgDBView, které se provádí například při změně
zobrazené složky. Při vytvoření MsgDBView jsou notifikováni observeři na topic MsgCreateDBView. Toto se děje následujícím kódem:
Listing 4.5: MsgCreateDBView
1
2
3
4
5
4.2
addObserver("MsgCreateDBView", function() {
gDBView.addColumnHandler("extbrainNotesThreadTreeColumn", {
// implementace nsIMsgCustomColumnHandler
});
})
Přidání párování kontaktů pro jiné protokoly než Jabber
Pro zjištění, zda kontakt pochází z transportu, se používají definované prefixy transportů
uložené v nastavení. Pro síť ICQ je to například:
extbrain.xmpp.transport.icq.defaultPrefix
32
KAPITOLA 4. REALIZACE
Pro ostatní sítě je definice podobná té pro ICQ, ale s odpovídajícím typem protokolu.
Každý kontakt, jehož server v identifikátoru kontaktu začíná tímto prefixem, je pak považován za kontakt z příslušného transportu a při párování v seznamu kontaktů se pro něj použije
uložený identifikátor pro tuto síť.
Dále je třeba dát si pozor na identifikátory kontaktů ze sítí, ve kterých se vyskytuje
znak @. Ten je v případě transportů escapován pomocí sekvence \40, takže v identifikátoru
kontaktu z transportu stále zůstává jen jeden znak @.
Pro kontakty z transportů bylo podobně jako pro kontakty ze sítě Jabber vytvořeno
asociativní pole, kam se kontakty ukládají. Toto pole je v contactList.transportMap, zde je
klíčem název protokolu, hodnotou je další asociativní pole obsahující samotné kontakty.
Kontakt [email protected] z transportu msn.extbrain.net bychom tak našli v
contactList.transportMap.msn["josef.novak\[email protected]"]. Při akcích jako slučování a rozdělování kontaktu je třeba brát v úvahu, že se jedná o kontakt z
transportu a práci s ním tomu přizpůsobit.
4.3
Rozšíření kontaktů o podporu pro tagy
Finální verze implementace je velmi podobná analýze. Implementovaný Tag Editor je na
obrázku 4.6, zobrazení tagů kontaktu na obrázku 4.7.
Obrázek 4.6: Finální verze editoru tagů
4.3. ROZŠÍŘENÍ KONTAKTŮ O PODPORU PRO TAGY
33
Obrázek 4.7: Finální verze tagů v editaci kontaktu
4.3.1
Tag Editor
Během implementace editoru tagů se sice ukázalo, že XUL jednoduše nepodporuje prvek UI
z návrhu na obrázku 3.10 - list položek, kde pro každou položku je několik sloupců hodnot
a touto hodnotou je navíc další prvek UI, v tomto případě menulist.
Nejblíže k tomuto popisu má richlistbox, ten ale nepodporuje více sloupců hodnot. Není
možné vložit více záhlaví listu, která by se zobrazila vedle sebe. Pokud jich více vloženo
je, zobrazují se pod sebou místo vedle sebe. Naopak vložení listhead nebo treecols, které se
obvykle používají pro seskupení záhlaví pro více sloupců, způsobí, že se záhlavím je pak
zacházeno jako s obyčejnou hodnotou v richlistboxu a při scrollování položkami se posouvá i
záhlaví. Toto se děje proto, že XBL Binding definuje jako záhlaví pouze prvek listheader.
Tento problém byl vyřešen vytvořením potomka původního XBL bindingu a definováním,
že jako položku záhlaví lze použít i treecols. Dále zůstával problém s tím, jak definovat více
sloupců hodnot. To bylo vyřešeno jednoduše tak, že všem záhlavím sloupců byla nastavena
stejná šířka a byla zrušena možnost měnit šířku sloupce. Stejně nastavené jsou i všechny
řádky.
Listing 4.6: richlistbox
1
<?xml version="1.0"?>
2
3
4
5
6
<bindings id="extbrainBindings"
xmlns="http://www.mozilla.org/xbl"
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:xbl="http://www.mozilla.org/xbl">
7
8
9
<binding id="richlistboxtreecols"
extends="chrome://global/content/bindings/richlistbox.xml#richlistbox">
10
11
12
13
<content>
<children includes="listheader"/>
<children includes="treecols"/>
34
14
15
16
17
18
19
20
KAPITOLA 4. REALIZACE
<xul:scrollbox allowevents="true" orient="vertical" anonid="main−box"
flex="1" style="overflow: auto;" xbl:inherits="dir,pack">
<children/>
</xul:scrollbox>
</content>
</binding>
</bindings>
Richlistbox nemá ani podporu pro jednodušší drag and drop, například indikaci, zda byl
přetahovaný prvek upuštěn před, za nebo na jiný prvek. Vzhledem k tomu, že v tomto případě
není třeba řešit, kdy je prvek upuštěn přímo na jiný prvek, ale zajímá nás jen, zda je upuštěn
před nebo za, zjišťuje se toto jednoduchým porovnáním, zda drop proběhl před polovinou
výšky prvku, nebo za polovinou.
4.3.2
Rozšíření adresáře o zobrazení tagů ke kontaktům
Ukázka seznamu kontaktů v adresáři rozšířených o informace o dalších vlastnostech je na
obrázku 4.8. Jména sloupců obsahují většinou jen jedno / dvou písmenné zkratky, po najetí
myší se zobrazí tooltip s celým textem. Tyto zkratky by bylo vhodnější nahradit nějakou
odpovídající grafickou symbolizací.
Obrázek 4.8: Rozšířené zobrazení kontaktů
O načítání uložených kontaktů a dodávání dat k zobrazení se stará object implementující
rozhraní nsIAbView a nsITreeView. Tento objekt je k nalezení v okně s adresářem a je
odkazovaný proměnnou gAbView a také jako tree.view seznamu kontaktů abResultsTree.
AbView zatím neposkytuje možnost rozšíření o další sloupce.
4.3. ROZŠÍŘENÍ KONTAKTŮ O PODPORU PRO TAGY
35
Jako jedno z řešení tohoto problému by mohlo být vytvoření wrapperu kolem abView,
který by pro nově přidané sloupce získával hodnoty definovaným způsobem a pro staré
sloupce by hodnoty získal z původního abView. Problém ale nastává v případě, kdy některá z funkcí v původním abView volá některou jinou funkci abView. Nezavolá se pak ta
nově vytvořená ve wrapperu, ale původní.
Proto byla nakonec zvolena cesta vlastní implementace abView v JavaScriptu podle zdrojového kódu původního abView s upravenými požadovanými funkcemi. Před použitím je
třeba odregistrovat starou factory a zaregistrovat novou se stejným class id a contract id :
Listing 4.7: Registrace factory
1
2
var abViewContractId = "@mozilla.org/addressbook/abview;1";
var abViewClassId = Components.ID(Cc[abViewContractId].number);
3
4
ExtbrainAbView.prototype.classID = abViewClassId;
5
6
7
8
9
Components.manager.nsIComponentRegistrar.unregisterFactory(
abViewClassId,
Components.manager.getClassObject(Cc[abViewContractId],
Ci.nsIFactory));
10
11
12
13
14
15
Components.manager.nsIComponentRegistrar.registerFactory(
abViewClassId,
"Extbrain AB View",
abViewContractId,
ExtbrainAbView.prototype._xpcom_factory);
4.3.3
Konzistence dat
Aby všechny části programu měly konzistentní data, potřebují při změně řetězce s tagy
uloženého v preferencích okamžitě zareagovat, načíst si ho znova a zapracovat změny.
Tohoto je možné docílit přidáním observeru na danou hodnotu v preferences. Observer
se přidává funkcí addObserver na preference service.
Observer je objekt implementující rozhraní nsIObserver. To má jedinou funkci:
void observe( in nsISupports aSubject, in string aTopic, in wstring aData );
4.3.4
Práce s přidanými vlastnostmi kontaktu
Nové vlastnosti kontaktu (ExtBrainNotifyConnected, ExtBrainNotifyAvailable, ExtBrainNotifyComposing, ExtBrainStarred, ExtBrainHidden) se používají zejména v IM části
ExtBrain Communicatoru. Jednoduše se získávají z objektu contact pomocí funkce
Contact.prototype.get(key). Ta pro klíč z výše zmíněných vrací vypočtenou efektivní
hodnotu s přihlédnutím k nastavení jak u kontaktu, tak také i u tagů na kontaktu.
Zde nastává problém, kdy při větším počtu kontaktů a tagů je tento výpočet efektivní
hodnoty časově náročný. Navíc se provádí velmi často, nejen při vyhledávání v kontaktech,
změně v seznamu kontaktů, ale třeba i jen při pouhém scrollování seznamem kontaktů nebo i
36
KAPITOLA 4. REALIZACE
přejetí myší přes seznam kontaktů. Při přejetí myší totiž tree se seznamem kontaktů překresluje pole, na kterém se kurzor vyskytuje a dotazuje se na efektivní hodnotu ExtBrainStarred
pro možnost vykreslení hvězdičky u kontaktu.
Ukládání již vypočtených efektivních hodnot u kontaktu by nebylo dobré řešení. Například při změně některého tagu by pak bylo nutné všechny kontakty projít a u každého
hodnoty přepočítat.
Předpočítání hodnot pro běh programu a získání efektivní hodnoty pro danou kombinaci
tagů je lepší řešení, ale při větším počtu tagů je výpočet všech možných kombinací zbytečná
zátěž, protože mnoho z nich se třeba nakonec ani nepoužije.
Nakonec byla proto implementována cache, která může být dotázána na efektivní hodnotu
pro kombinaci tagů. Pokud je hodnota pro tuto kombinaci již předpočítána, je výsledek
vrácen, pokud ne, vypočítá se, uloží a vrátí.
Jelikož je tato cache využívána v celém programu, je dobré zajistit, aby se pro každé okno
nevytvářela znovu. Nejjednodušší způsob, jak toto v XULu zajistit, je vytvořit pro uložení
těchto informací JavaScript code module.
4.3.4.1
JavaScript code module pro tag cache
JavaScript code module (dále JSM) je soubor s JavaScript kódem, který se do programu
nevkládá pomocí tagu <script/> v XUL souborech jak je obvyklé, místo toho se importuje
pomocí volání
Components.utils.import( url [, scope ] );
kde parametr url je url importovaného skriptu a scope určuje viditelnost naimportovaných
objektů, přičemž pokud se scope vynechá, je použit global scope[13].
V celém programu je pouze jedna instance objektů z tohoto souboru, proto je využití JSM
vhodné pro šetření zdrojů systému, nebo pro jednoduché předávání dat v celém programu,
i mezi různými okny.
V souboru je také třeba definovat proměnnou EXPORTED_SYMBOLS, jejíž hodnotou je pole
s názvy proměnných v souboru. Jen tyto proměnné jsou pak po importu souboru přístupné.
V tomto případě byl vytvořen JSM tagManager, který se stará o výpočet efektivních
hodnot z tagů a předávání jejich hodnot
4.4
4.4.1
Podpora pro Snarl
Implementace komponenty
Pro Snarl byla v JavaScriptu vytvořena nová implementace nsIAlertsService, která v závislosti na nastavení zobrazí příchozí notifikaci buď pomocí Snarl, nebo starým způsobem
pomocí alerts service. Tato implementace se Snarl notifikace stále podporuje vše, co podporuje i původní alerts service včetně callbacku při kliku na notifikaci. Ukázka notifikace je na
obrázku 4.9.
Pro připojení ke Snarl se používá TCP/IP protokol. Při zobrazení notifikace je Snarl
odeslána zpráva podle jeho SNP protokolu[14]
4.4. PODPORA PRO SNARL
37
Obrázek 4.9: Snarl notifikace
Listing 4.8: SNP
1
2
3
4
5
6
7
8
SNP/3.0\r\n
register?
app−sig=application/extbrain.communicator&
title=Extbrain Communicator\r\n
notify?
app−sig=application/extbrain.communicator&
title=nadpisNotifikace&text=textNotifikace\r\n
END\r\n
Toto volání nejprve Communicator ve Snarl zaregistruje a pak zobrazí notifikaci. Registraci je vhodné provádět pokaždé, protože pokud je Snarl mezi dvěma notifikacemi restartován, jsou registrace aplikací z minulé instance Snarl zrušeny. Pokud již aplikace registrována
je a zkusí se registrovat znovu, nic se neděje.
Dále je také možné připojit base64 zakódovaný obrázek. Pokud byl předán callback
observer, uloží se do seznamu callbacků pod unikátním id, které je pro notifikaci vytvořeno.
Po kliku na notifikaci obdrží Communicator zpět také id notifikace, které se klik týkal a je
notifikován příslušný observer.
4.4.2
Registrace komponenty
Nakonec je třeba zaregistrovat factory pro tuto novou implementaci alerts service. To se
provede následujícím kódem:
Listing 4.9: Registrace factory
1
2
var alertsServiceContractId = "@mozilla.org/alerts−service;1";
var alertsServiceClassId = Components.ID(Cc[alertsServiceContractId].number);
3
4
5
6
ExtbrainAlertsService.prototype.originalAlertsService =
CS(alertsServiceContractId, Ci.nsIAlertsService);
ExtbrainAlertsService.prototype.classID = alertsServiceClassId;
7
8
9
10
11
Components.manager.nsIComponentRegistrar.unregisterFactory(
alertsServiceClassId,
Components.manager.getClassObject(Cc[alertsServiceContractId],
Ci.nsIFactory));
12
13
14
15
16
Components.manager.nsIComponentRegistrar.registerFactory(
alertsServiceClassId,
"Extbrain Alerts Service",
alertsServiceContractId,
38
17
KAPITOLA 4. REALIZACE
ExtbrainAlertsService.prototype._xpcom_factory);
Nejdříve je třeba získat contract id alerts service. Dále se vytvoří instance původní alerts
service, která se předá nové alerts service pro případ, že se nebude Snarl používat. Následně
se odregistruje factory původní alerts service a zaregistruje se nová.
Kapitola 5
Testování
Práce byla testována během vývoje skupinou dobrovolníků, byly tak odhalovány chyby v nové
funkcionalitě i regrese starých chyb. Dále bylo získáno mnoho zpětné vazby vedoucí k přehodnocení některých implementačních detailů.
Pro seznam kontaktů byla vytvořena komponenta, která se v případě změny formátu
úložiště dat stará o migraci kontaktů na kompatibilní verzi. Toto bylo nutné, protože někteří
uživatelé již dlouhodobě používali původní verzi ExtBrain Communicatoru a nemožnost
migrace by znamenala příliš velkou ztrátu dat.
5.1
5.1.1
Ukázky zpětné vazby k původnímu Communicatoru
Klávesová navigace v seznamu kontaktů
Seznam kontaktů v hlavním okně podporuje pouze klávesovou navigaci kontakty v rámci
možností v základu implementovaných XUL Tree widgetem. To znamená změnu vybrané
položky šipkami, klávesami page up / down a home / end. Akce vyvolávané těmito klávesami
by bylo dobré zachytávat i v textboxu pro vyhledávání, aby nebylo nutné po zadání dotazu
do textboxu měnit focus pro výběr konkrétní z nalezených položek.
Řešení: Pokud je v textboxu pro vyhledávání kontaktu vyvolán keypress event s danými
klávesami, přepošle se event do tree s kontakty. Toto chování není v rámci Mozilla Thunderbird typické, ale zároveň uživatele nemate, naopak ho považují za intuitivní. Navíc se ještě
zachytává stisk klávesy enter, která vyvolá výchozí akci pro kontakt. Tyto akce jsou (řazeno
dle priority od nejvyšší):
1. Otevření IM rozhovoru, pokud má kontakt aktivní IM účet.
2. Psaní nové e-mailové zprávy, pokud má kontakt přiřazený e-mail.
3. Editace kontaktu.
Klávesa enter ve vyhledávacích textboxech (type=search) slouží běžně pro okamžité provedení hledání, jinak se hledání provede až po definovaném čase (atribut timeout). V tomto
39
40
KAPITOLA 5. TESTOVÁNÍ
případě je ale timeout nastaven na 1 ms, hledání je proto tedy okamžité a tak je možné
klávesu enter vyhradit pro jinou akci.
Dále byla přidána možnost zobrazení kontextového menu vybraného kontaktu během
toho, kdy je focus na vyhledávacím checkboxu pomocí klávesové zkratky. Pro tento případ
není žádná běžně používaná zkratka, pokud nechceme ztratit možnost otevřít kontextové
menu původního textboxu klávesovou zkratkou. Proto je tato zkratka ponechána konfigurovatelná, základní nastavení je CTRL+SPACE.
5.1.2
Problémy s otevíráním odkazu zobrazeného v tabu s rozhovorem
Jelikož průběh rozhovoru je zobrazen v elementu iframe, kliknutí na odkaz způsobovalo
otevření odkazu ve stávajícím iframe a zmizení textu rozhovoru.
Řešení: Jelikož podobný problém by při neošetření tohoto případu nastával i v e-mailu obsahujícím odkazy, byl prozkoumán iframe zobrazující e-mail v Thunderbirdu a bylo zjištěno,
že po kliknutí na iframe se volá funkce contentAreaClick. Tato funkce vyhodnotí nejen, že
kliknutí proběhlo na odkaz, který se otevře v externím prohlížeči, ale také provádí kontrolu,
zda odkaz nevede na nějakou stránku pro podvodné získání údajů uživatele (phishing).
5.1.3
Práce s taby rozhovorů
Taby nepodporují možnost zavření prostředním tlačítkem myši. Při změně tabu je focus na
něm, uživatelé by očekávali focus v zadávání textu zprávy.
Řešení: Zavírání tabu prostředním tlačítkem myši je v jiných aplikacích běžně implementováno a uživatelé ho tedy očekávají i zde. Proto byla tato funkce doplněna.
Po přepnutí na konkrétní tab s rozhovorem bylo doplněno automatické nastavení focusu
do zadávání zprávy. Problém v tomto případě nastává, pokud by změna tabu proběhla pomocí
klávesnice. Pokud uživatel prochází klávesami všechny taby, tato změna focusu znemožní
momentální opuštění tabu, například klávesami šipka. Tento případ užití ale patrně nenastává
často, žádná další zpětná vazba od uživatelů toto nevytýkala.
5.1.4
Seznam kontaktů v hlavním okně - Show All
Seznam kontaktů v hlavním okně obsahuje checkbox Show All. Pokud není zaškrtnutý, zobrazují se pouze kontakty, které nejsou offline nebo nesloučené s kontaktem z IM. Při filtrování
seznamu kontaktů se ale toto nastavení ignoruje a vyhledává se vždy ve všech kontaktech.
Toto chování může být žádoucí, některé uživatele ale mátlo, že se při vyhledávání zobrazují i offline kontakty, ačkoliv Show All není zaškrtnuté.
Řešení: Bylo přidáno nové nastavení, které umožňuje si zvolit, zda vyhledávání probíhá
ve všech kontaktech, či pouze v kontaktech s ne-offline stavem.
Pokud má vyhledávání probíhat ve všech kontaktech, Show All checkbox se při vyhledání automaticky zaškrtne a disabled se nastaví na true. Toto dává uživateli jasnou vizuální
zpětnou vazbu.
V případě opačné volby zůstává nastavení Show All checkboxu stejné vždy nezávisle na
tom, zda jsou kontakty filtrované nebo ne.
5.2. UKÁZKY ZPĚTNÉ VAZBY PRO NOVĚ IMPLEMENTOVANOU FUNKCIONALITU41
5.1.5
Indikace nepřečtených zpráv
Původní Communicator indikuje nepřečtenou zprávu pouze blikající ikonkou na tabu s rozhovorem pro daný kontakt a případně i nastavením stavu busy na hlavním tabu s rozhovory.
Použití stavu busy ale není zcela vhodné a celkově je indikace nedostatečná.
Řešení: Byla přidána indikace blikající ikonkou ke každému kontaktu v seznamu kontaktů,
který má nějakou nepřečtenou zprávu. Navíc je ta samá ikonka použita i na taby s rozhovory.
Dále bylo upraveno chování seznamu kontaktů tak, aby kontakty s nepřečtenými zprávami
zobrazoval přednostně na prvních pozicích nezávisle na způsobu řazení kontaktů. Dále se
přednostně zobrazují i kontakty, které sice nemají nepřečtené zprávy, je pro ně ale otevřen
tab s rozhovorem a tak je pravděpodobné, že k nim uživatel bude chtít mít rychlý přístup.
Dále pro byl pro lepší vizuální indikaci pro tyto kontakty přidán jiný odlišující styl písma.
Kontakty s nepřečtenou zprávou se zobrazují tučně a kontakty s otevřeným rozhovorem
kurzívou.
5.1.6
Klávesa pro odeslání zprávy
Původní Communicator umožňoval odeslání napsané IM zprávy pouze pomocí klávesové
kombinace CTRL+ENTER. Vytvoření nového řádku se provádělo klávesou ENTER. Tato
kombinace ale mnohým uživatelům nevyhovovala.
Řešení: Byla přidána další volba: ENTER pro odeslání a SHIFT+ENTER pro nový
řádek.
5.1.7
Skryté kontakty
Při aktivování možnosti hidden, která kontakt skrývá v seznamu kontaktů v hlavním okně již
bylo pro uživatele problematické zpětně dohledat, které kontakty jsou takto skryté, případně
jednoduše a přehledně zobrazit stav ostatních nově přidaných vlastností kontaktu.
Řešení: Zobrazení kontaktů v okně s adresářem obsahuje nové sloupce, které indikují
hodnoty těchto atributů. U těchto hodnot se ukázalo praktické rozlišovat nejen, zda je hodnota ve stavu povoleno / zakázáno, ale také, zda-li se do nějakého z těchto stavů dostala
buď nastavením hodnoty přímo kontaktu, nebo zděděním hodnoty z tagů aplikovaných na
kontaktu.
Proto se ikonky indikující stav hodnoty zobrazují pro případ, kdy je hodnota nastavena
přímo kontaktu, normálně. Pro případ, kdy je hodnota zděděna z tagů se ikonka zobrazuje
poloprůhledně.
5.2
5.2.1
Ukázky zpětné vazby pro nově implementovanou funkcionalitu
Přidávání dependencí poznámek
V původním návrhu bylo pro přidání dependence poznámky nebo souvisejícího e-mailu třeba
tento objekt označit a následně volbou Pick as Dependency nebo Pick as Related Message
42
KAPITOLA 5. TESTOVÁNÍ
z kontextového menu nebo toolbaru zkopírovat do schránky. Poté bylo třeba vložit tento
objekt do příslušného lisboxu pomocí volby v kontextovém menu. Tento postup byl však pro
mnoho uživatelů příliš těžkopádný.
Řešení: Nastavování dependencí pomocí drag and drop. V případě dependencí poznámek
se jedná o přetažení poznámky ze seznamu poznámek do listboxu závislostí v právě zobrazené
poznámce. Problém v tomto případě nastal u běžného chování tree widgetu, ve kterém jsou
poznámky zobrazeny. Tree totiž při drag akci zároveň přetahovanou položku vybere, což
způsobí načtení poznámky do detailů poznámky a tím pádem by nebylo možné vytvořit
závislost mezi dvěma různými poznámkami.
V úvahu přicházely dva způsoby vyřešení tohoto problému:
1. Upravit chování tree widgetu tak, aby drag akce nezpůsobila výběr položky. Toto se děje
proto, že drag akci předchází mousedown, na který se položka vybírá. Bylo by možné
změnit chování tak, aby výběr položky proběhl při click (mousedown a mouseup).
2. Nechat původní způsob výběru položky, ale při začátku drag and drop změnit aktuálně
vybranou položku na předchozí vybranou položku.
Oba tyto způsoby jsou nestandardní, nakonec byl zvolen druhý zmiňovaný, chování uživatelského rozhraní je tak konzistentnější s chováním celého Mozilla Thunderbird i zbytku
systému.
Související e-mailovou zprávu je možné pomocí drag and drop ze seznamu zpráv přetáhnout na tab poznámek. Po krátké prodlevě dojde k přepnutí na tento tab a e-mail je pak
možné vložit do listboxu se souvisejícími e-maily.
5.2.2
Automatické ukládání poznámek
Původní návrh počítal s tím, že změny v poznámce bude uživatel potvrzovat uložením poznámky. Při testování se ale toto ukázalo jako nevyhovující, uživatelé při rychlé práci s poznámkou a přepínáním mezi poznámkami zapomínali tlačítko save použít.
Řešení: Bylo zavedeno automatické ukládání poznámek, které se děje:
∙ V případě ztráty focusu prvku - pro subject, body, priority a tags - zobrazené v elementech editor pro body a textbox pro ostatní.
∙ Při přidání dependence a související zprávy okamžitě.
∙ Pro vlastnosti poznámky představované checkboxem a date / timepickerem okamžitě
po změně hodnoty.
Toto se pro uživatele ukázalo jako komfortnější, navíc je lze v případě provedení a automatického uložení nevyhovujících změn v poznámce použít možnost přechodu na předchozí
verzi poznámky.
5.2. UKÁZKY ZPĚTNÉ VAZBY PRO NOVĚ IMPLEMENTOVANOU FUNKCIONALITU43
5.2.3
Zobrazení poznámky přímo v okně s e-mailem
Původní návrh počítal se zobrazením a editací poznámek pouze v tabu s poznámkami. Toto
ale při testování uživatelé shledali nepraktickým. Bylo navrhováno přidat možnost editace
poznámky přímo k zobrazenému e-mailu.
Řešení: K zobrazenému e-mailu bylo toto zobrazení přidáno. Je zde také možné přímo
vytvořit novou poznámku související s tímto e-mailem. Pokud s e-mailem souvisí více poznámek, zobrazuje se také seznam těchto poznámek. Toto zobrazení funguje jak při otevření
náhledu e-mailu v přehledu e-mailů, tak také při otevření e-mailu v novém tabu nebo novém
okně.
Panel s poznámkou u e-mailu se automaticky zobrazuje pouze pokud již je k e-mailu
připojena nějaká poznámka, jinak je třeba ho otevřít nově přidaným tlačítkem k akcím emailu.
5.2.4
Rozdělení poznámek do více účtů
Původní návrh poznámek počítal s tím, že všechny poznámky se budou synchronizovat do
jedné složky v jednom úložišti. Toto se pro některé uživatele ukázalo být jako nepraktické.
Řešení: Přidání poznámkových bloků (notebook). Poznámka je vždy vázána na jeden
notebook a notebooku je možné nastavit synchronizaci s jedním úložištěm. Pro každý notebook je také možné nastavit, že je výchozí pro nově přidané poznámky k e-mailům z daného
e-mailového účtu. Dále se také vytváří Lightning kalendáře pro každý notebook zvlášť.
5.2.5
Seznam autorů poznámky
Testování ukázalo, že původní návrh - připojovat uživatele, podílejícího se na tvorbě / editaci
poznámky na konec seznamu autorů není ideální. Do sloupce „authors“ v seznamu poznámek
se málokomu z testujících vešel celý delší seznam autorů a ti poslední byli v zobrazení oříznuti.
Řešení: Poslední uživatel, který provedl změny v poznámce se připojí na začátek seznamu,
pak jsou jména těchto uživatelů viditelnější. Navíc oproti původnímu návrhu se také jméno
uživatele přesune na první pozici, pokud v seznamu již je a provede změny.
5.2.6
Klávesové zkratky
Původní návrh příliš neřešil klávesové zkratky, což ale uživatelům komplikovalo pohodlné
užívání poznámek.
Řešení: Pro formátování textu poznámky byly přidány běžně používané zkratky
CTRL+B pro tučné písmo, CTRL+I pro kurzívu a CTRL+U pro podržené písmo. Navíc
bylo přidáno odsazení pomocí klávesy TAB a předsazení pomocí SHIFT+TAB.
Dále byla přidána žádaná zkratka pro rychlé vytvoření poznámky při čtení e-mailu. Pro
tuto možnost je použita zkratka CTRL+SHIFT+N. Volba je také přístupná z menu „Zpráva“,
kde je klávesová zkratka viditelná.
44
5.3
KAPITOLA 5. TESTOVÁNÍ
Srovnání s existujícími řešeními
V porovnání s existujícími řešeními poznámek v Mozilla Thunderbird vyniká ExtBrain Communicator v tom, že umožňuje jak tvorbu samostatných poznámek, tak tvorbu poznámek
k e-mailům. V případě samostatných poznámek je také oproti QuickFox Notes a ThunderNote více integrovaný do uživatelského rozhraní Mozilla Thunderbird.
Použité úložiště dat je stejně jako u některých konkurenčních řešení SQLite. Díky použití
full text indexů FTS4 už z principu může Communicator při vyhledávání v poznámkách
nabídnout řádově vyšší rychlost.
Použitý způsob synchronizace dat využívá standardní protokol IMAP a data zde ukládá
do formátu JSON. Toto řešení je tak celkem univerzální a v rámci projektů ExtBrain již
existují prototypy pro synchronizaci těchto dat na mobilní telefon.
Kapitola 6
Závěr
Cíl práce lze považovat za splněný. Původní verze byla upravena pro nejnovější verzi Mozilla
Thunderbird a byly opraveny nedodělky a chyby.
Dále byl integrován ExtBrain Sync, který přináší rozšířenou správu a možnost synchronizace kontaktů. Bylo implementováno mnoho dalších rozdílných vylepšení týkajících se různých částí programu. Největší důraz byl kladen na modul pro správu poznámek, který navíc
využívá integrovaného ExtBrain Sync a umožňuje tak synchronizaci poznámek.
ExtBrain Communicator byl během vývoje důkladně testován uživateli, jejich připomínky
nebyly brány na lehkou váhu a na jejich základě byla často navržena další vylepšení.
Implementace veškeré funkcionality je zdokumentována, často je také uvedena právě
zpětná vazba uživatelů, která nakonec vedla k finálnímu stavu práce.
6.1
Další možný vývoj práce
Další vývoj práce bude pravděpodobně směřovat k nativní podpoře více různých typů IM
komunikačních protokolů, čili nejen Jabber a transporty. Jako další možný protokol by bylo
možné integrovat například i podporu posílání SMS zpráv přes internetové SMS brány. Dále
je v plánu přidání podpory pro audio a video hovory.
45
46
KAPITOLA 6. ZÁVĚR
Literatura
[1] Thunderbird Addons - Messagenotesplus.
https://addons.mozilla.org/cs/thunderbird/addon/messagenotesplus,
stav z 10. 5. 2012.
[2] Thunderbird Addons - QuickFox Notes.
https://addons.mozilla.org/cs/thunderbird/addon/quickfox-notes,
stav z 10. 5. 2012.
[3] Thunderbird Addons - ThunderNote.
https://addons.mozilla.org/cs/thunderbird/addon/thundernote,
stav z 10. 5. 2012.
[4] Thunderbird addons - XNote++.
https://addons.mozilla.org/cs/thunderbird/addon/xnotepp,
stav z 10. 5. 2012.
[5] Broadcasters and Observers.
https://developer.mozilla.org/en/XUL_Tutorial/Broadcasters_and_Observers,
stav z 10. 5. 2012.
[6] nsIObserverService.
https://developer.mozilla.org/en/NsIObserverService,
stav z 10. 5. 2012.
[7] nsIAlertsService.
https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIAlertsService,
stav z 10. 5. 2012.
[8] XBL bindings.
https://developer.mozilla.org/en/CSS/Getting_Started/XBL_bindings,
stav z 10. 5. 2012.
[9] Storage.
https://developer.mozilla.org/en/Storage,
stav z 10. 5. 2012.
[10] Sqlite fts3 and fts4 extensions.
https://sqlite.org/fts3.html,
stav z 10. 5. 2012.
47
48
LITERATURA
[11] Gloda.
https://developer.mozilla.org/en/Thunderbird/gloda,
stav z 10. 5. 2012.
[12] RFC 822.
https://tools.ietf.org/html/rfc822,
stav z 10. 5. 2012.
[13] Javascript code modules.
https://developer.mozilla.org/en/JavaScript_code_modules,
stav z 10. 5. 2012.
[14] Snarl api reference.
https://sites.google.com/site/snarlapp/developers/api-reference,
stav z 10. 5. 2012.
Příloha A
Seznam použitých zkratek
API Application Programming Interface
IM Instant messaging
UI User interface
URI Uniform Resource Identifier
URL Uniform Resource Locator
XBL XUL Binding Language
XML Extensible Markup Language
XUL XML User Interface Language
IMAP Internet Message Access Protocol
XMPP Extensible Messaging and Presence Protocol
HTML HyperText Markup Language
ICQ I Seek You
OS Operating System
IDE Integrated Development Environment
DOM Document Object Model
CSS Cascading Style Sheets
ID Identifier
UUID Universally Unique Identifier
JSON JavaScript Object Notation
SQL Structured Query Language
49
50
PŘÍLOHA A. SEZNAM POUŽITÝCH ZKRATEK
FTS Full Text Search
ICU International Components for Unicode
JSM JavaScript Code Modules
TCP/IP Transmission Control Protocol/Internet Protocol
SNP Snarl Network Protocol
SMS Short Message Service
Příloha B
Instalační příručka
B.1
Instalace Mozilla Tunderbird
Nejnovější verzi je možné stáhnout na adrese <http://thunderbird.mozilla.cz/>. Na
přiloženém CD ve složce install/ je k dispozici Mozilla Thunderbird 12.
Dále je vhodné nainstalovat doplněk Lightning, který rozšiřuje Thunderbird o kalendář a úkolníček. Lightning je k nalezení na adrese <https://addons.mozilla.org/cs/
thunderbird/addon/lightning/>, nebo stejně jako samotný Thunderbird ve složce install/ na přiloženém CD. Instalace doplňku se provádí v správci doplňků, případně stačí
jednoduše xpi soubor přetáhnout do okna Thunderbirdu.
B.2
Instalace ExtBrain Communicator
Instalační balíček ExtBrainCommunicator.xpi je k nalezení ve složce install/ na přiloženém CD a instaluje se stejně jako Lightning.
B.3
Nastavení ExtBrain Communicator
ExtBrain nastavení je přístupné z hlavní menu -> Nástroje -> ExtBrain. Toto menu je vidět
na obrázku B.1.
Na obrázku B.2 je nastavení adresářů pro zobrazování kontaktů v hlavním okně. Pod
výběrem adresářů je nastavení IM účtů.
Po přidání IM účtu je možné se připojit zvolením nějakého ne-offline stavu, jak je vidět
na obrázku B.3.
Další možnosti nastavení jsou v hlavní menu -> Nástroje -> Extbrain -> Preferences.
Zde je k nalezení přehled připojených ExtBrain Sync účtů a další drobná nastavení. Toto je
na obrázku B.4
51
52
PŘÍLOHA B. INSTALAČNÍ PŘÍRUČKA
Obrázek B.1: Nastavení ExtBrain Communicator
Obrázek B.2: Nastavení ExtBrain Communicator IM účty
B.3. NASTAVENÍ EXTBRAIN COMMUNICATOR
Obrázek B.3: Nastavení ExtBrain Communicator připojení
Obrázek B.4: Nastavení ExtBrain Communicator další nastavení
53
54
PŘÍLOHA B. INSTALAČNÍ PŘÍRUČKA
Příloha C
Obsah přiloženého CD
install/ Instalace Mozilly Thunderbird a doplňků.
source/ Zdrojové kódy projektu.
text/ Text diplomové práce v elektronické podobě.
text/source/ Zdrojové kódy textu diplomové práce.
55

Podobné dokumenty

Implementace protokolu XMPP v JavaScriptu

Implementace protokolu XMPP v JavaScriptu Prohlašuji, že jsem práci vypracoval samostatně a použil jsem pouze podklady uvedené v přiloženém seznamu. Nemám závažný důvod proti užitı́ tohoto školnı́ho dı́la ve smyslu §60 Zák...

Více

jak vytvářet mapu

jak vytvářet mapu www.weeklyosm.eu/cz/ lists.openstreetmap.org/listinfo/talk-cz wiki.openstreetmap.org/wiki/Cs:Main_Page wiki.openstreetmap.org/wiki/Map_Features wiki.openstreetmap.org/wiki/WikiProject_Czech_Republic

Více

Rozs20 s19 r20 ren19 ExtBrain Communicatoru o dals20 s19

Rozs20 s19 r20 ren19 ExtBrain Communicatoru o dals20 s19 volánı́ XPCOM objektů, volánı́ obsluhy událostı́, atd. Usnadňuje tak programátorovi integraci nových funkcionalit do Mozilly. Pro skriptovánı́ pod frameworkem XPFE je použı́ván JavaScript...

Více

Synchroniza£ní modul pro Mozilla Thunderbird - ExtBrain

Synchroniza£ní modul pro Mozilla Thunderbird - ExtBrain České vysoké učení technické v Praze Fakulta elektrotechnická Katedra počítačů

Více

České Vysoké Učení Technické v Praze Fakulta

České Vysoké Učení Technické v Praze Fakulta Každý vyhledávací modul vyhledává v jednom zdroji informací. Tyto zdroje se mohou velmi lišit, co do typu poskytovaných informací, tak do způsobu jejich uložení, formátu, tak i způsobu jejich získá...

Více

P°íloha E Instala£ní a uºivatelská p°íru£ka

P°íloha E Instala£ní a uºivatelská p°íru£ka E.0.3.3 P°ehled hlavní nabídky Po zvolení ú£tu se zobrazí hlavní nabídka, kterou ú£et nabízí. Na obrázcích E.6 a E.7 uvádím pro srovnání sloºky obou typ· ú£tu. M·ºeme listovat ve v²ech £láncích, v ...

Více