C dla każdego (cz. 25.)
ASL
W dzisiejszej części zajmiemy się obsługą systemowej biblioteki "asi.library".
Pewnie część z Was z ironicznym uśmiechem spogląda na nazwę "asl" i zastanawia
się, kto nas zmusił do takiego wyboru, skoro jest o wiele wygodniejsza
biblioteka "reqtools". Problem w tym, że to właśnie "asl" wchodzi w skład
systemu operacyjnego - można nad tym ubolewać, ale nie można tego zmienić.
Wśród potencjalnych użytkowników Waszych programów znajdą się i puryści,
uważający że należy korzystać tylko z rozwiązań systemowych. Opiszemy więc
"asl", aby zadowolić wszystkich - biblioteka ta nie jest zresztą aż taka zła,
począwszy od wersji 38 (OS 2.1). Zwolennicy "reqtools" mogą użyć RTPatcha lub
alternatywnych rozwiązań. Nie dają one idealnego efektu, ale "lepszy rydz...".
Biblioteka "asl" oferuje okna wyboru plików, czcionki i tryby wyświetlania.
Jak to zwykle bywa, zacząć należy od przydzielenia zasobów. Przyjdzie tu nam z
pomocą funkcja:
APTR AllocAslRequest( unsigned long reqType, struct Tagitem *tagList ); APTR
AllocAslRequestTags( unsigned long reqType, Tag Tagi, ... ) ;
Pierwszy argument ustala rodzaj potrzebnego nam okna wyboru. Może on przyjmować
następujące wartości:
ASL_FileRequest - wybór pliku lub katalogu.
ASL_FontRequest - wybór czcionki.
ASL_ScreenModeRequest - wybór trybu wyświetlania.
Uwaga: ASL_ScreenModeRequest i wszystko z nim związane jest dostępne dopiero od
wersji 38. biblioteki.
Do funkcji należy również przekazać tagi, o czym za chwilę.
W zależności od typu okna wyboru, wartość zwróconą przez AllocAslRequest()
należy interpretować jako strukturę "FileRequester", "FontRequester" albo
"ScreenModeRequester", wszystkie one są zdefiniowane w pliku "libraries/asi.h".
Struktury te są przeznaczone tylko do odczytu - nie wolno ich bezpośrednio
modyfikować.
Aby wyświetlić okno wyboru na ekranie, należy użyć funkcji:
BOOL AslRequest( APTR requester, struct TagItem *tagList ); BOOL
AslRequestTagsf APTR requester, Tag Tag1, ... );
Pierwszym parametrem jest wartość zwrócona przez AllocAsIRequest(), drugim -
tagi, które opiszemy za chwilę.
Funkcja wykonuje całość obsługi okna wyboru i powraca dopiero po jego
zamknięciu. Zwraca TRUE/FALSE w zależności od tego, czy użytkownik kliknął na
gadżet akceptujący czy odrzucający. FALSE może też oznaczać niemożność otwarcia
okna wyboru-od wersji 38. można to rozpoznać po niezerowej wartości funkcji
IoErr().
Gdy okno wyboru nie będzie nam już więcej potrzebne, należy zwrócić
przydzielone zasoby, używając funkcji:
void FreeAslRequest( APTR requester );
Jedynym argumentem jest wartość zwrócona przez AllocAslRequest().
Każdy z trzech typów okna wyboru ma własne tagi, wspólne dla funkcji
AllocAslRequest() i AslRequest(), o nazwach rozpoczynających się od "ASLFR_"
dla wyboru plików, "ASLFO_" dla wyboru czcionek oraz "ASLSM_" dla wyboru trybu
wyświetlania. Niektóre tagi pełnią we wszystkich trzech przypadkach te same
funkcje. Pomijając przedrostek, mają one te same nazwy, a nawet te same
wartości. Zaczniemy od omówienia najważniejszych tagów, z pominięciem
przedrostków:
Window, Screen, PubScreenName - ustalają, gdzie ma zostać otwarte okno wyboru.
W pierwszym przypadku podajemy adres okna macierzystego - okno wyboru zostanie
otwarte na tym samym ekranie. W pozostałych przypadkach (dostępnych od wersji
38. biblioteki) specyfikujemy bezpośrednio ekran, podając odpowiednio jego
adres bądź nazwę (o ile jest to ekran publiczny).
SleepWindow - podanie argumentu TRUE spowoduje zablokowanie okna macierzystego
na czas, gdy otwarte jest okno wyboru. Wymaga to podania taga "Window" (patrz
wyżej). Tag "SleepWindow" jest dostępny od wersji 38 biblioteki.
TitleText, PositiveText, NegativeText - tytuł okna oraz napisy w gadżetach do
akceptacji i odrzucenia wyboru.
File Requester
Najważniejszymi tagami, specyficznymi dla wyboru plików, są:
ASLFR_InitialFile, ASLFR_InitialDrawer, ASLFR_InitialPattern -
argumentami są napisy w gadżetach takie, jak nazwa pliku, nazwa katalogu,
wzorzec.
ASLFR_Flag1 - parametrem jest maska bitowa flag, z których najciekawsze to:
- FRF_DOSAVEMODE - oznacza, że okno ma służyć do wybrania pliku, który zostanie
zapisany (tag ten zmienia kolor okna wyboru i uniemożliwia podwójne klikanie na
nazwach istniejących już plików).
- FRF_DOMULTISELECT - umożliwia wybór więcej niż jednego pliku naraz.
- FRF_DOPATTERNS - powoduje wyświetlenie dodatkowego gadżetu z wzorcem.
ASLFR_Flag2 -jak poprzednio. Najciekawsze flagi to:
- FRF_DRAWERSONLY - powoduje niewyświetlanie plików.
- FRF_REJECTICONS - powoduje niewyświetlanie ikon.
Od wersji 38. biblioteki dostępne są osobne tagi dla każdej z wyżej
wymienionych flag, o nazwach "ASLFR_DoSaveMode", "ASLFR_DrawersOnly" itd.
Akceptują one argument typu BOOL.
Rezultaty działania funkcji AslRequest() odczytuje się bezpośrednio ze
struktury "FileRequester". Najważniejsze jej pola to:
fr_File, fr_Drawer - nazwa pliku i katalogu.
fr_NumArgs, fr_ArgList - ilość wybranych plików oraz wskaźnik na ich tablicę, w
formie struktury "WBArg" (patrz MA 1/97). Używane tylko przy
"FRF_DOMULTISELECT".
Font Requester
Przy wybieraniu czcionki, najważniejszymi tagami są:
ASLFO_InitialName, ASLFO_InitialSize, ASLFO_InitialStyle - nazwa, wielkość i
styl początkowo zaznaczonej czcionki (patrz MA 1/97).
ASLFO_MinHeight, ASLFO_MaxHeight- minimalna i maksymalna dopuszczalna wysokość
czcionki. Standardowo odpowiednio 5 i 24.
ASLFO_Flags - parametrem jest maska bitowa flag, z których najciekawsze to:
- FOF_DOSTYLE - powoduje wyświetlenie dodatkowego gadżetu wyboru stylu.
- FOF_FIXEDWIDTHONLY- powoduje wyświetlanie tylko czcionek o stałej szerokości
liter.
Analogicznie jak w przypadku wyboru plików, od wersji 38. biblio- teki dostępne
są osobne tagi dla każdej z wyżej wymienionych flag.
Rezultaty odczytujemy ze struktury "FontRequester". Interesujące nas pola to
"fo_Attr" lub "fo_TAttr", odpowiednio typu "TextAttr" i "TTextAttr" (patrz MA
1/97).
Screen Mode Requester
W jednej z pierwszych części naszego kursu (MA 8/95), kiedy otwieraliśmy po raz
pierwszy ekran, powiedzieliśmy, że najbardziej eleganckim rozwiązaniem byłoby
użycie okna wyboru. Rozwiązanie to jest również bardzo proste.
Najprzydatniejsze przy tej okazji tagi to:
ASLSM_DoWidth, ASLSM_DoHeight, ASLSM_DoDepth, ASLSM_DoOverscanType,
ASLSM_DoAutoScroll - powodują dodanie dodatkowych gadżetów do ustalania
szerokości, wysokości i głębokości ekranu, typu overscanu oraz tego, czy ekran
ma się automatycznie skrolować.
ASLSMJnitialDisplaylD, ASLSMJnitialDisplayWidth, ASLSM_lnitialDisplayHeight,
ASLSM_lnitialDisplayDepth,ASLSM_lnitialOverscanType, ASLSM_lnitialAutoScroll
- ustalają początkowe wartości poszczególnych
parametrów ekranu.
ASLSM_MinDepth, ASLSM_MaxDepth, ASLSM_MinWidth, ASLSM_MaxWidth,
ASLSM_MinHeight, ASLSM_MaxHeight-specyfikują minimalne i maksymalne
dopuszczalne parametry ekranu. Standardowo odpowiednio: 1,
24,16,16368,16,16384.
Wyniki działania funkcji AslRequest() są przechowywane w strukturze
"ScreenModeRequester". Interesuje nas tylko jej początek:
struct ScreenModeRequester
{
ULONG sm_DisplaylD;
ULONG sm_DisplayWidth;
ULONG sm_DisplayHeight;
UWORD sm_DisplayDepth;
UWORD sm_OverscanType;
BOOL sm_AutoScroll;
}
Przyjrzyjmy się teraz listingowi 21.
Aby wykorzystać pełnię jego możliwości,
potrzebna jest "asi.library" w wersji 38. lub wyższej. Program powinien działać
w ograniczonym zakresie również z wersją 37. biblioteki, nie mieliśmy jednak
okazji tego sprawdzić. Program otwiera najpierw na domyślnym ekranie publicznym
okno wyboru trybu wyświetlania, oferując wszystkie dodatkowe opcje, takie jak
rozmiar, głębokość itp. Następnie użytkownik ma okazję wybrać czcionkę oraz jej
styl. Uzyskawszy te informacje, program otwiera ekran o zadanej rozdzielczości
i czcionce. Na tym ekranie (o ile masz wersję 38. lub wyższą biblioteki "asl")
otwarte zostanie okno wyboru plików. Tu skończyło się nam natchnienie, więc po
wybraniu pliku program po prostu wypisuje na standardowe wyjście jego nazwę i
kończy działanie.