Notify

Notify

Instaluj Notify wersja 0.92
dla Firefoksa 1.5 i 2.0

Dokumentacja projektowa

Spis treści:

Analiza obiektowa zadania

W projekcie wykorzystano następujące klasy:

Klasy odpowiadające za interfejs są dosyć czytelne, warto za to omówić backend Notify.

NotifySitesPreferences zawiera funkcje wywoływane z głównego okna - dodające/usuwające strony z listy stron obserwowanych/"kalendarzowych" (które są przechowywane w tablicach, będących polami CNotify). Obiekt klasy NotifySitesPreferences jest polem NotifyPreferences.

NotifyPreferences rejestruje funkcję, która będzie wywoływana za każdym razem, gdy zmieni się któraś z wartości gałęzi preferencji Notify. W zależności od wartości która się zmieniła, zostaną przeprowadzone zmiany w odpowiednich obiektach. Obiekt klasy NotifyPreferences jest polem CNotify, i (tak samo jak NotifySitesPreferences i NotifyAlarm) zawiera pole parent - referencję na macierzysty obiekt CNotify.

Klasy NotifyWatchSite i NotifyCalendarSite zawierają metody wykorzystywane w serializacji: toString() oraz loadFromString(), umożliwiające zapis/odczyt obiektu z tekstu. NotifySitesPreferences korzysta z nich, by stworzyć 2 łańcuchy opisujące strony obserwowane i "kalendarzowe", oba postaci:
"dane_strony_1|dane_strony_2|...|dane_strony_n".
Tablice ObservedSites oraz CalendarSites są polami CNotify i zawierają obiekty klas NotifyWatchSite/NotifyCalendarSite (agregacja).

Kolejną klasą, której obiekt jest polem CNotify, jest NotifyAlarm. Odpowiada za "wszczęcie alarmu" - czyli obecnie: otwarcie strony, sygnał dźwiękowy i/lub komunikat w zasobniku (tray).

CNotify jest elementem, który łączy to wszystko w całość. Podczas startu inicjuje:

Po czym następuje pierwsze sprawdzenie, czy obserwowane strony się nie zmieniły, albo czy trzeba pokazać którąś ze stron z "kalendarza". Odpowiada za to metoda checkSites(). Takie sprawdzanie jest potem wywoływane cyklicznie dzięki wspomnianemu wcześniej timerowi.

Mechanizm działania metody CNotify.checkSites() jest prosty:

Jak widać, w projekcie intensywnie korzystamy z mechanizmu kompozycji.

Projekt obiektowy

UML Class Diagram

Przepływ danych

Sytuacja Przepływ danych
Timer - sygnał do sprawdzenia stron CNotify.checkSites(): dla każdego obiektu NotifyWatchSite z ObservedSites tworzy się obiekt XMLHttpRequest, który ściąga daną stronę. Asynchroniczne wywołania metody CNotify.siteChecked() porównują dane o stronie z wcześniej zapisanymi - jeśli strona się zmieniła, informujemy użytkownika - CNotify.Alarm.alarm() i zapisujemy zmiany - CNotify.Prefs.sites.saveObservedSites().
Po zainicjowaniu ściągania obserwowanych stron sprawdzamy każdą stronę z "kalendarza" - jeśli trzeba którąś wyświetlić, robimy to - CNotify.Alarm.alarm(). Na koniec (jeśli otworzyliśmy którąś stronę i zmieniliśmy jej atrybut Opened) zapisujemy zmiany: CNotify.Prefs.sites.saveCalendarSites().
Zmiana preferencji w oknie opcji (lub przez about:config) Zostaje wywołana metoda NotifyPreferences.observe().
W zależności, która preferencja się zmieniła, wywołujemy:
"calendarSites", "observedSites":
refreshSites()
"sound", "tray", "open":
refreshAlarms()
"period":
refreshTimer()
Metody te zmieniają odpowiednie pola obiektu CNotify (do którego dostęp mamy przez właściwość parent), tak by Notify zachowywało się zgodnie z oczekiwaniami użytkownika (tj. uaktualniamy listę monitorowanych stron, modyfikujemy sposób alarmowania itp.)
Dodanie monitorowanej strony w głównym oknie NotifySitesWindow.addObservedSite():
Pobieramy z interfejsu adres strony. Jeśli jest poprawny, wywołujemy metodę CNotify.Prefs.sites.addObservedSite(), która modyfikuje preferencję "extensions.notify.observedSites". Zmiana jest rejestrowana przez NotifyPreferences.observe(), która wywołuje metodę refreshSites(). Skutek jest taki, że kolekcja CNotify.ObservedSites zawiera już po tym wywołaniu nowy obiekt NotifyWatchSite odpowiadający nowej stronie.
Na koniec wywołujemy własną metodę loadObservedSites(), uaktualniając listę monitorowanych stron w interfejsie.

Przepływ danych w ostatniej sytuacji jest analogiczny jak przy usuwaniu stron, oraz dodawaniu/usuwaniu stron "kalendarzowych".

Inne zastosowania

Następujące klasy są na tyle uniwersalne, że nadają się do wykorzystania w innych projektach:

Przedstawiona dokumentacja odpowiada wersji 0.8 rozszerzenia.