Jedną z bibliotek TUI jest Turbo Vision opracowane przez firmę Borland wydane pierwotnie w wersji dla Pascala oraz C++. Z pomocą tej biblioteki firma opracowała IDE dla swoich produktów z początku lat dziewięćdziesiątych. Szersze upowszechnienie nie miało miejsca ze względu na premierę pierwszych "pełnometrażowych" systemów Windows.
Okazuje się jednak, że Turbo Vision żyje do dzisiaj. Firma Borland udostępniła jeszcze w latach dziewięćdziesiątych pełen kod źródłowy dla wersji C++ na licencji public domain. Zaczęły go dalej rozwijać grupki pasjonatów, w pierwszej kolejności łatając kilka poważnych dziur bezpieczeństwa, a także tworząc porty na wszystkie popularniejsze systemy operacyjne. TVision wykorzystano m.in. w środowisku RHIDE (djgpp) oraz we Free Pascal Compilerze.
TUI potrzebuję do napisania pewnego programu do zarządzania użytkownikami na serwerze. W grudniu, z braku odpowiedniej biblioteki, zabrałem się za pisanie własnej, lecz skoro TVision się odnalazło, projekt idzie do piachu :). Pamiętając jeszcze obsługę mego znaleziska z czasów Turbo Pascala, a także posiłkując się przykładami, zacząłem pisać rzeczoną aplikację właśnie w nim.
Istnieje kilka "klonów" TVision powstałych po upublicznieniu kodu źródłowego. Największe wrażenie robi rhtvision będące rozszerzeniem portu użytego przy budowie środowiska RHIDE. Biblioteka dostępna jest na wiele systemów: Windows, Linux, FreeBSD, QNX, Solaris oraz DOS. Posiada wsparcie dla Unicode, różnych terminali, nowe komponenty oraz dodatki w stylu wbudowanej obsługi plików konfiguracyjnych. Oczywiście generowane interfejsy są eleganckie oraz intuicyjne w użyciu. Problemy sprawia instalacja, ponieważ ostatnia stabilna wersja (2.0.3) ukazała się w 2003 roku i tej za Chiny nie udało mi się skompilować. Autor pracuje obecnie nad wersją 2.1.0, której snapshoty są publicznie dostępne. Tutaj musiałem po jego ściągnięciu nałożyć jeden patch i kompilować wszystko z dodatkową flagą -fpermissive (GCC 4.1). Na szczęście w końcu się udało i mogłem przystąpić do zabawy.
Turbo Vision napisane jest w C++ i mocno wykorzystuje paradygmat programowania obiektowego. Hierarchia klas jest dobrze sprecyzowana, a dzięki dziedziczeniu programista może modyfikować różne aspekty zachowania interfejsu. Pracę rozpoczynamy od stworzenia klasy pochodnej od TApplication, w której nadpisujemy metody initStatusLine(), initMenuBar() oraz handleEvent(). Dwie pierwsze odpowiadają za stworzenie paska statusu u dołu ekranu oraz menusów u góry. Trzecia to metoda obsługi zdarzeń, gdzie możemy dowolnie oprogramować różne akcje generowane przez interfejs. Poniżej przedstawiony jest sposób tworzenia własnego menu:
TMenuBar * TUserist::initMenuBar(TRect r) { r.a.y++; r.b.y = r.a.y+1; return new TMenuBar(r, *new TSubMenu("Use~r~ist", kbNoKey)+ *new TMenuItem("~L~ista uzytkownikow", cmNone, kbF3, hcNoContext, "F3")+ *new TMenuItem("~P~referencje", cmNone, kbF4, hcNoContext, "F4")+ newLine()+ *new TMenuItem("~W~yjscie", cmQuit, kbCtrlX, hcNoContext, "Ctrl-X")+ *new TSubMenu("~O~kno", kbNoKey)+ *new TMenuItem("~N~astepne", cmNext, kbNoKey, hcNoContext, "")+ *new TMenuItem("~P~oprzednie", cmPrev, kbNoKey, hcNoContext, "")+ *new TMenuItem("~Z~amknij", cmClose, kbNoKey, hcNoContext, "")+ newLine()+ *new TMenuItem("~K~askada", cmCascade, kbNoKey, hcNoContext, "")+ *new TSubMenu("~P~omoc", kbNoKey)+ *new TMenuItem("~P~omoc", cmNone, kbF1, hcNoContext, "F1")+ *new TMenuItem("~O~ programie", cmAbout, kbF12, hcNoContext, "F12") ); } // end initMenuBar();
Podobna elegancja kodu cechuje resztę biblioteki. W przypisach znajdują się linki do screenshotów pokazujących, co osiągnąłem po zaledwie kilkudziesięciu minutach pracy, wliczając w to czas poświęcony na studiowanie dokumentacji oraz dostarczonych przykładów.






