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.