Integrace a rozvoj roz˛í°ení ExtBrain Communicator
Transkript
Č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
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...
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
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...
Synchroniza£ní modul pro Mozilla Thunderbird - ExtBrain
České vysoké učení technické v Praze
Fakulta elektrotechnická
Katedra počítačů
Č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á...
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 ...