|
|
|
|
|
|
Browser jest budowany na podstawie taba. Ogólne informacje zawarte w tabie:
Nagłówek
| Pole | Opis | Wartość | Wartość domyślna |
| BROWSER_TYPE | Typ browsera, który determinuje
rodzaj stosowanego grida oraz profil akcji. | [STANDARD|EDITABLE|GROUP_BY] | STANDARD |
| FIELDSORDER | Kolejność wyświetlanych kolumn | ABSOLUTE(<nazwa pola taba>+) | Pola wymienione w tabie w kolejności linii |
| LINE_ATTRIB | Kolor linii | wyrażenie autfun oparte na polach rekordu dające w wyniku odpowiedni kolor wiersza | null |
| ORDERSBAR | Pasek wyszukiwania | [TRUE|FALSE] | FALSE |
| TITLE | Nazwa okna browsera | "<nazwa okna>" | "Spis" |
| TOOLBAR_TYPE | Typ paska narzędzi | [NONE|SMALL|BIG] | BIG |
| VERT_CURSORS | Pionowy pasek przewijania | [TRUE|FALSE] | TRUE |
Macierz opisu pól
Część z pól opisywanych w tej części zostaje wyświetlona jako kolumny browsera. Opis dotyczy właściwości kolumn. Poniżej znajduje się lista atrybutów kolumny.
| Atrybut | Opis |
| ATTRIB | atrybuty wyświetlania
|
| AUTFUN | wyrażenie, którego wynik jest wartością pola |
| EDILEN | szerokość kolumny |
| ID | identyfikator kolumny |
| LEN | szerokość kolumny (jeśli nieobecne EDILEN) |
| MASK | sposób wyświetlania wartości |
| NAME | nazwa kolumny |
| TYPE | typ wartości w kolumnie |
| VIS | widoczność kolumny |
| Wygląd na ekranie | Komentarz do wyglądu na ekranie |
| <--- Nazwa okna; Ikonka "z łapką" to wejście do parametryzacji browsera <--- Wiersz nagłówków <--- Kolejne pozycje (rekordy) przeglądanej tabeli <--- |
| Zapis w języku konfiguracji |
//---------------------------------------------------------------------------
// S Ł O W N I K typów okresu
//---------------------------------------------------------------------------
TAB VOC_TOKRES
TITLE="Typ okresu"
BASE=VOC_TOKRES
RECEDIT=VOC_TOKRES_EDIT
BASETYPE=SEP
TOOLBAR_TYPE=NONE
SIZE=40 10
POS=100 10
ORDERS=
{
ID FIELDS LABEL ;
ID ( ID ) "Id" ;
KOD ( KOD) "Kod" ;
}
{
ID LEN TYPE ATTRIB NAME ;
ID 8 INT - "Id" VIS=HIDE ;
KOD 1 STRING (CAPITAL) "Kod typu okresu" ;
NAZWA 30 STRING - "Pełna nazwa typu okresu";
}
TAB VOC_TOKRES_EDIT extends VOC_TOKRES;
TITLE="Okresy"
LAYOUT=TCP( KOD NAZWA )
{;
}
|
| Komentarz do zapisu w języku konfiguracji |
TAB- to identyfikator typu blokuVOC_TOKRES- to identyfikator obiektu TABTITLE- to identyfikator atrybutu: tytuł TAB"Typ okresu"- to wartość atrybutu "tytuł TAB" (Tytuł okna edycji rekordu)BASE- to identyfikator bazy z serwera baz danych (lub pliku dyskowego)VOC_TOKRES- to nazwa bazy z serwera baz danychBASETYPE- to identyfikator typu serwera baz danychSEP- to identyfikator oznaczający, że serwerem jest serwerQ-SEPTOOLBAR_TYPE- to typ paska narzędzi (gdy przyjmie wartość NONE - pasek się nie ukaże)SIZE- to identyfikator atrybutu wymiaru okna, w którym ukaże się browserPOS- to identyfikator atrybutu pozycji ekranowej okna, w którym ukaże się browserORDERS- to identyfikator bloku definiowania uporządkowań tabeli ................. |
| Wygląd na ekranie | Komentarz do wyglądu na ekranie |
|
<--- Nazwa okna; Ikonka "z łapką" to wejście do parametryzacji browsera
<--- Pasek ikonek, po najechaniu myszką ikonka "uwypukla się" (patrz
lornetka) i po pewnej chwili pojawia się "dymek pomocy"
<--- Wiersz nagłówków
<--- Kolejne pozycje (rekordy) przeglądanej tabeli
<---
|
| Zapis w języku konfiguracji |
TAB PRZELEWY
TITLE="Przelewy - Spis"
BASE=PRZELEWY
BASETYPE=SEP
SIZE=0 50
BROWSER_ACTIONS=+FULL_SET +F10MENU
LINE_ATTRIB=(COLOR=~isNull(DATAP)?0:(isNull(DATE)?16711680:174592))
// czarny czerwony zielony
RECEDIT=PRZELEW_EDIT
ORDERS=
{
ID FIELDS LABEL VIS ;
ID ( ID ) "Id" - ;
MIESIAC ( MIESIAC POSZLO DATAP ID ) "W/g czasu" - ;
WIERZYC ( KOD_WIERZ ID ) "W/g wierzycieli" -;
}
{
ID LEN TYPE NAME ;
ID 8 INT "Id" VIS=HIDE ;
DATAP 8 INT "Data przelewu" MASK=DATE ;
DATAW 8 INT "Data wystawienia" MASK=DATE ;
KOD_WIERZ 10 STRING "Kod wierzyciela" EVH=VocKopWierz(VOC_WIERZ,KOD);
NAZWA_WIERZ 104 STRING "Nazwa wierzyciela" VIS=SHOW MASK=SDESC(26 4);
NAZWA_B_WIERZ 30 STRING "Nazwa banku" VIS=SHOW;
KONTO_WIERZ 50 STRING "Konto wierzyciela" MASK=SDESC(25 2) VIS=SHOW;
BANK_MOJ 10 STRING "Nasz bank" EVH=VocKopMoj(VOC_BANK,KOD);
NAZWA_MOJ 54 STRING "Nasza nazwa" VIS=SHOW MASK=SDESC(26 4);
NAZWA_B_MOJ 30 STRING "Nazwa banku" VIS=SHOW;
KONTO_B_MOJ 50 STRING "Numer konta" VIS=SHOW MASK=SDESC(25 2);
KWOTA 8 DOUBLE "Kwota" MASK=MONEY;
SLOWNIE 180 STRING "Słownie" MASK=SDESC(30 3) AUTFUN=money2words(KWOTA);
TYTULEM 81 STRING "Tytułem" MASK=SDESC(30 3);
ROWPLA 1 INT "Rodzaj transakcji" MASK=RADIOH("Przelew"=0 "Wpłata gotówkowa"=1) DEFVALUE=0;
POSZLO 1 INT "W drodze do banku" MASK=RADIOH("Tak"=1 "Nie"=0) DEFVALUE=0;
UWAGI 30 STRING "Uwagi" ;
WALUTA 3 STRING "Kod waluty" DEFVALUE="PLN";
MIESIAC 3 STRING "Dotyczy miesiąca" ;
DATE 8 INT "Data wydrukowania" MASK=DATE ;
TIDUZU 1 STRING "Typ identyfikatora uzupełniającego" EVH=Voc(VOC_TIDUZU,KOD);
NIP 13 STRING "NIP" DEFVALUE=sysfield("SYS_EDIT", "NIP") VIS=SHOW;
IDUZU 20 STRING "Identyfikator uzupełniający";
TYWPLA 1 STRING "Typ wpłaty" EVH=Voc(VOC_TYWPLA,KOD);
DEKLARACJA 20 STRING "Deklaracja";
NRDEKLARACJI 2 STRING "Numer deklaracji" EVH=Voc(VOC_NRDEKL,KOD);
OKRES 2 STRING "Okres";
TOKRES 1 STRING "Typ okresu" EVH=Voc(VOC_TOKRES,KOD);
NROKRESU 4 STRING "Numer okresu";
SYMFOR 6 STRING "Symbol formularza" EVH=Voc(VOC_SYMFOR,KOD);
OPISOKR 7 STRING "Opis okresu";
}
|
| Komentarz do zapisu w języku konfiguracji |
TAB- to identyfikator typu blokuPRZELEWY- to identyfikator obiektu TABTITLE- to identyfikator atrybutu: tytuł TAB"Przelewy - Spis"- to wartość atrybutu "tytuł TAB" (Tytuł okna edycji rekordu)BASE- to identyfikator bazy z serwera baz danych (lub pliku dyskowego)PRZELEWY- to nazwa bazy z serwera baz danychBASETYPE- to identyfikator typu serwera baz danychSEP- to identyfikator oznaczający, że serwerem jest serwerQ-SEPSIZE- to identyfikator atrybutu wymiaru okna, w którym ukaże się browserBROWSER_ACTIONS- to identyfikator atrybutu standardowych akcji przypisanych do browsera+FULL_SET +F10MENU- to wartość tego atrybutu (wszystkie standardowe akcje i elementF10 - Przetwarzanie)LINE_ATTRIB- to identyfikator atrybutu linii (atrybutu dowolnego zdefiniowanego dalej w formule)(COLOR=~isNull(DATAP........)- to formuła definiowania atrybutu COLOR (wyświetlania linii / wiersza browsera)RECEDIT- to identyfikator opisu elementuEdirecwywoływanego do edycji rekordu tabeliPRZELEW_EDIT- to wartość tego identyfikatora. (Opis elementuEdirecnależy pobrać z obiektu o nazwie PRZELEW_EDIT)ORDERS- to identyfikator bloku definiowania uporządkowań tabeli ................. |
Informacje dotyczące wyglądu browsera są konfigurowane na dwóch poziomach. Ustawienia wprowadzone przez twórce aplikacji, zawarte w tabach browserów, mają charakter pierwotny. Browser jest wyświetlany zgodnie z tymi ustawieniami na samym początku.
Każdy użytkownik może przedefiniowywać ustawienia danego browsera. Wszelkie zmiany, których dokona są zapisywane w jego przestrzeni parametrów. Pomimo zmiany ustawień wedle własnych upodobań zawsze istnieje możliwość powrotu do ustawień pierwotnych.
Menadżer ustawień
Klasy związane z ustawieniami browsera znajdują się pakiecie qline.browser.properties. Za operowanie ustawieniami na najwyższym poziomie jest odpowiedzialny menadżer ustawień. Menadżer jest reprezentowany przez obiekt klasy BrowserPropertiesManager. Umożliwia on:
Zapis i odczyt ustawień
Wszystkie ustawienia browserów danego użytkownika zapisane są w bloku Browser jego lokalnej przestrzeni parametrów. Ustawienia browsera stanowią jeden blok identyfikowany nazwą taba browsera. Pociąga to za sobą fakt, że jeśli używamy tego samego taba przy wyświetlaniu browserów w różnych miejscach aplikacji, to będą współdzieliły ustawienia. Właściwość ta jest raczej pożądana, gdy w wielu miejscach używamy dokładnie tego samego taba (np. kartoteka firm i słownik firm).
Ustawienia pojedynczego browsera podzielone są na grupy:
Zaczytywanie i zapis ustawień są konfigurowalne. Browser pełnoekranowy zawsze zapisuje i zaczytuje swoje ustawienia. W przypadku browserów wklejonych w masce BROWSER możemy podać parametr SAVECONFIG=[ALL,RECENT,LAYOUT,PROPERTIES], przy czym trzy ostatnie wartości można łączyć za pomocną znaku |. Parametr wskazuje, które grupy ustawień mają być zapisywane. Domyślne zachowanie określone jest w parametrze SaveInnerBrowserParams w pliku qline.txt. W przypadku braku tego parametru przyjmuję się pierwotnie wartość LAYOUT. Przy projektowaniu okien warto mieć na względzie efektywność, gdyż wiele historii w jednym oknie mogłoby decydować o wolnym pojawianiu się okna na ekranie.
Ustawienia są zaczytywane przy konstrukcji browsera, a zapisywane przy usuwaniu z drzewa komponentów. W żadnym innym momencie życia browsera operacje te nie są dokonywane automatycznie. Ustawienia są zaczytywane i zapisywane oddzielnie dla każdej grupy. Grupy ustawień LAYOUT i PROPERTIES rzadko ulegają zmianie. Oddzielne rozpatrywanie pozwala na efektywne wykorzystywanie lokalnego cache'a parametrów. Wszystkie ustawienia są przetrzymywane w pamięci podczas pracy browsera.
Moduł ma właściwość wersjonowania. Często dochodzi do modyfikacji informacji zapamiętywanych dla browsera, pojawiają się nowe możliwości i wymagania.
Pojawia się problem dwojaki. Dostosowanie zaczytywania parametrów do sytuacji braku niektórych pól lub struktur jest wysoce nieefektywne i należy go uniknąć.
Po drugie struktura może zostać niemal całkowicie zmieniona w nowym module.
Z obu tych względów wersja modułu ustawień, dla którego zostały one zapamiętane w takiej postaci jest również przechowywana.
Jeśli ustawienia te zostaną zaczytane i wersja modułu będzie różna od zapisanej to ustawienia te zostaną zignorowane i użyte zostaną dla browsera ustawienia pierwotne.
Przy zapisie ustawień zostaną one nadpisane zgodnie z nową wersją modułu.
Jedynym wymogiem pozostaje słabe założenie, że moduł zaczytuje zawsze rekord parametrów i konroluje pole Version.
W obecnej wersji 1.1. Wersjonowanie zostało wyłączone ze względów efektywnościowych. Przy pojawieniu się następnej wersji można ponownie uruchomić mechanizm, który
poprawnie będzie nadpisywał poprzednie ustawienia, zakładając że brak znacznika wersji oznacza wersję starą.
Okno właściwości browsera
Ustawienia browsera na poziomie użytkownika aplikacji mogą być modyfikowane dwojako. Zmiana szerokości i kolejności kolumn dostępna jest za pomocą odpowiedniego przeciągania myszą i jest obsługiwana przez grida. Drugą możliwość stanowi edycja właściwości poprzez wywołanie okna ustawień browsera.
Okno ustawień pozwala na konfigurację ustawień kolumn i okna browsera. Jest ono dostępne pod ikoną ustawień okna znajdującą się w prawym górnym rogu okna.
Pierwsz zakładka umożliwia modyfikację właściwości okna browsera. Są to dokładnie te ustawienia, które zapamiętywane są bloku Layout.
Druga zakładka pozwala na zmianę ustawień każdej z kolumn. Za zbiór dostępnych kolumn jest przyjmowana wartość pola nagłówka FIELDSORDER.
Ustawienia kolumny pokrywają się z atrybutami dostępnymi w tabie.
Kolumny ukryte pozostają w obecne w bloku layout, są zaczytywane i zapisywane.
Po dokonaniu odpowiednich zmian jest możliwe:
Eksport ustawień browsera do pliku
Wygodnym sposobem odpowiedniej konfiguracji wyglądu browsera jest jego zmodyfikowanie na ekranie i późniejszy eksport wprowadzonych ustawień do pliku w postaci taba. Jest to szczególnie wygodne przy konfiguracji czcionek i kolorów.
Eksport jest dostępny z poziomu okna konfiguracji browsera. Jest on dokonywany względem taba browsera. Tworzony tab rozszerza bieżący. W nowym tabie są zapisywane tylko te ustawienia, które muszą nadpisać lub dospecyfikować wartości bazowe.
Domyślnie tab ma nazwę o postaci <nazwa taba browsera>_VIEW. Nazwę tę można zmienić przy zapisywaniu taba. Nowy tab jest zapisywany do wskazanego pliku. Możliwe jest zapisywanie w trybie doklejania, co pozwala na szybkie wyeksportowanie ustawień wielu browserów do jednego pliku, a następnie odpowiedniego poprawienia plików qcon.
Dokładne omówienie eksportu ustawień
Pionowy kontroler przewijania
Nieznajomość bieżącej liczby rekordów w każdej chwili pracy z tabelą nie pozwala na zastosowanie pionowego paska przewijania. W to miejsce został zaproponowany kontroler przewijania, którego punkt bierny znajduje się w środku obszaru pracy. Odchylenie od środka powoduje przewijanie rekordów w kierunku odchylenia i z prędkością proporcjonalną do tego odchylenia. Działanie paska dla spisu można konfigurować za pomocą parametrów browsera
Plik konfiguracyjny
Menadżer jest konfigurowany za pomocą pliku zewnętrznego browser_action.cfg.
Opisuje on:
Opis akcji dla typu browsera
Tablica rekordów Actions zawiera opisy kolejnych akcji. Dla akcji definiujemy:
Rekord tablic Sets zawiera opisy zbiorów akcji. Opis każdego zbioru składa się z identyfikatorów akcji lub nazw innych zbiorów.
Zbiór akcji jest sumą zbioru wymienionych identyfikatorów i wymienionych innych zbiorów akcji. Struktura zawierania zbiorów musi być acykliczna.
Przykładowo:
Sets =
{
MODIFY_SET = array
{
"INSERT";
"INSERT_MODIFY";
"DELETE";
"MODIFY";
};
};
Tablica Sequence opisuje sekwencję akcji, które zostaną umieszczone na toolbarze.
Akcja jest przedstawiana na toolbarze za pomocą ikony. Jeśli akcja nie ma przyporządkowanej ikony, to nie zostanie umieszczona na toolbarze pomimo obecności w sekwencji.
Przykładowo:
Sequence = array
{
"INSERT";
"DELETE";
"MODIFY";
"EYE_VIEW";
"ORDER_CHANGE";
"F2MENU";
}
Interfejs akcji
Akcja browsera jest opisywana przez pojedynczą klasę implementującą interfejs BrowserAction. Metody interfejsu:
Akcje należące do biblioteki znajdują się w pakiecie qline.browser.action.
Dla klas realizujących akcje o podobnym przebiegu (np. akcje na zaznaczonych) zdefiniowano pomocnicze klasy abstrakcyjne.
W zależności od rodzaju akcje zostały pogrupowane w podpakiety: standard, selection, multi.
Ponieważ nowozdefiniowane akcje są w pliku konfiguracyjnym wskazywane z pełną kwalifikacją pakietów,
więc mogą być definiowane w dowolnych pakietów.
Zarządzanie akcjami w aplikacji
Menadżer akcji browserów aplikacji (BrowserActionHolder) jest singletonem. Konfiguracja akcji jest zaczytywana z pliku browser_actions.cfg przy tworzeniu się instancji klasy menadżera. Analizowana jest wyłącznie część dotycząca odpowiedniego typu klienta (zgodnie z wpisem w qline.txt). Cały proces następuje przy zaczytywaniu konfiguracji aplikacji.
Ropatrywanie wszystkich profili rozpoczyna się od topologicznego uporządkowania ich zgodnie z relacją dziedziczenia sprecyzowaną przez opcjonalne pole BaseProfile. Zawiera ono profil bazowy, z którego przepisywana jest cała zawartość. Wymienione w aktualnym profilu synonimiczne struktury nadpisują bazowe. Graf dziedziczenia musi być acykliczny, w przeciwnym przypadku zgłaszany jest błąd.
Etapy analizy konfiguracji dla każdego profilu:
Akcja pobrana z menadżera jest wgrywana zgodnie z nazwą. Obiekt załadowanej klasy jest zapamiętywany w celach optymalizacyjnych. W ten sposób wgrywane są jedynie te operacje, które są potrzebne.
Zarządzanie akcjami w browserze
Browser jest budowany na podstawie informacji zawartych w tabie. Pole BROWSER_TYPE taba browsera zawiera nazwę profilu akcji. Determinuje zarówno typ browsera, jak i dostępne w nim operacje. Każdy browser ma obiekt klasy BrowserActionManager zarządzający wszelkimi akcjami browsera. Akcje dla danego browsera pochodzą z trzech typów definicji:
Dodatkowo występują zasady specjalne:
Wszystkie akcje wymienione jako pozycje menu browsera zostają dodane do ogólnego zbioru akcji browsera. Infomacje prezentacyjne pochodzącą z kolumn opisujących akcje browsera, które mają tą samą nazwę co pola definiujące akcję w bloku Actions profilu (SHORTCUT,HELP,ICON). W ten sposób nie ma potrzeby oddzielnego uzupełniania skrótów klawiszowych i pozycji paska narzędzi przez różne moduły.
Akcja browsera może też być tworzona w kodzie. Należy sporządzić klasę implementującą interfejs BrowseraAction, która zawiera kod akcji. Następnie należy zastosować BasicBrowserActionWrapper w celu połączenia definicji akcji z informacjami prezentacyjnymi. Tak zdefiniowaną akcję można dodać do zbioru akcji za pomocą metody addAction menadzęra akcji.
Akcje pochodzące z definicji BROWSER_ACTIONS oraz z F2 menu posiadają identyfikatory: Dla akcji mających swoje identyfikary możliwe są oparacje:
Budowanie paska narzędzi
Pasek narzędzi umożliwia dostęp do akcji za pomocą myszy. W zależności od bieżących ustawień browsera pasek może być:
Do paska dodawane są wyłącznie akcje mające skojarzoną ikonę i zdefiniowane w następujących miejscach:
Ikony dodawane są w kolejności powyższych kategorii, a w ramach kategorii odpowiednio według:
Schemat przygotowania akcji browsera
W konstruktorze okna browsera budowany jest menadżer akcji BrowserActionManager. Operacje są wykonywane w następującej kolejności
Szczęgólną rolę pełni w browserze menu główne dostępne pod klawiszem [F2]. Menu jest zwykłym blokiem typu MENU, ale część informacji jest w nim szczególnie traktowana.
Funkcje menu: