Projektowanie Graficznych Interfejsów Użytkownika Robert Szmurło

Podobne dokumenty
Projektowanie Graficznych Interfejsów Użytkownika. Robert Szmurło

Programowanie obiektowe

Projektowanie Graficznych Interfejsów Użytkownika Robert Szmurło

Kompleksowe tworzenie aplikacji klasy Desktop z wykorzystaniem SWT i

Wzorce architektoniczne

Wprowadzenie do programowania aplikacji mobilnych

Omówienie wzorców wykorzystywanych w Prism 5.0. Dominika Różycka

Programowanie obiektowe

Projektowanie obiektowe oprogramowania Wykład 7 wzorce czynnościowe (2) Wiktor Zychla 2018

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Forum Client - Spring in Swing

Projektowanie Graficznych Interfejsów Użytkownika Robert Szmurło

Tworzenie aplikacji Web Alicja Zwiewka. Page 1

Temat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Wprowadzenie do projektu QualitySpy

ASP.NET MVC. Grzegorz Caban 20 stycznia 2009

Wzorce projektowe cz. II. Wzorce projektowe cz. II 1/35

Budowa aplikacji ASP.NET z wykorzystaniem wzorca MVC

Analiza i projektowanie aplikacji Java

Programowanie komponentowe 5

Poznaj ASP.NET MVC. Kamil Cieślak Microsoft Student Partner

Warstwa integracji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

Projektowanie Zorientowane na Dziedzinę. ang. Domain Driven Design

Leszek Stasiak Zastosowanie technologii LINQ w

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Architektura interfejsu użytkownika

Usługi analityczne budowa kostki analitycznej Część pierwsza.

Projektowanie oprogramowania. Warstwa integracji z bazą danych oparta na technologii ORM Platforma Java EE Autor: Zofia Kruczkiewicz

Wstęp - Prosta aplikacja internetowa w technologii Java EE 5. Programowanie komponentowe 1

Zdarzenia Klasa Application Powiadomienia Toast AlertDialog

Dokumentacja projektu Makao karciana gra sieciowa

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

Web frameworks do budowy aplikacji zgodnych z J2EE

Programowanie obiektowe

Web frameworks do budowy aplikacji zgodnych z J2EE. Jacek Panachida

Budowanie aplikacji biznesowych przy użyciu. Presentation Foundation i wzorca MVVM

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Programowanie zorientowane obiektowo. Mateusz Kołecki

Wzorce prezentacji internetowych

Wstęp [2/2] Wbrew częstemu przekonaniu, nie są one gotowymi rozwiązaniami, to tylko półprodukty rozwiązania.

Wzorce logiki dziedziny

Dokumentacja techniczna. Młodzieżowe Pośrednictwo Pracy

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Projektowanie Graficznych Interfejsów Użytkownika Robert Szmurło

Wskazówki projektowe. Programowanie Obiektowe Mateusz Cicheński

Zaawansowane programowanie w C++ (PCP)

Technologie dla aplikacji klasy enterprise. Wprowadzenie. Marek Wojciechowski

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

DLIBRA & DRUPAL DWA SYSTEMY, JEDNA WITRYNA

1 Wprowadzenie do J2EE

problem w określonym kontekście siły istotę jego rozwiązania

I. Raport wykonywalności projektu

Programowanie Zespołowe

Warstwa prezentacji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

OBC01/TOPMOB Projektowanie w języku Objective-C

Grzegorz Ruciński. Warszawska Wyższa Szkoła Informatyki Promotor dr inż. Paweł Figat

Podstawy programowania III WYKŁAD 4

Wypożyczalnia VIDEO. Technologie obiektowe

16) Wprowadzenie do raportowania Rave

Lokalizacja Oprogramowania

Języki i paradygmaty programowania doc. dr inż. Tadeusz Jeleniewski

Instrukcja laboratoryjna

Komunikator internetowy w C#

Tworzenie bazy danych na przykładzie Access

Architektura nowoczesnych aplikacji internetowych

Serwery aplikacji. dr Radosław Matusik. radmat

MVC w praktyce tworzymy system artykułów. cz. 1

WZORCE LOGIKI APLIKACJI Reużywalne składniki wymagań

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

LK1: Wprowadzenie do MS Access Zakładanie bazy danych i tworzenie interfejsu użytkownika

Laboratorium Technologii Informacyjnych. Projektowanie Baz Danych

Zrąb JavascriptMVC. Krzysztof Płocharz. 6 kwiecień Uniwersytet Warszawski

Plan. Aplikacja. Architektura aplikacji. Architektura aplikacji Tworzenie aplikacji Application Builder podstawy

WYKŁAD 1 ANGULARJS CZĘŚĆ 1

Przykładowa implementacja

Java JMX. Marcin Werla. Monitorowanie i zarządzanie usługami sieciowymi w Javie. mwerla@man.poznan.pl PCSS/Poznań JUG

Programowanie MorphX Ax

Międzyplatformowy interfejs systemu FOLANessus wykonany przy użyciu biblioteki Qt4

Podstawy Programowania 2

Wprowadzenie do systemów informacyjnych

Przygotowanie do nowoczesnego programowania po stronie przeglądarki. (HTML5, CSS3, JS, wzorce, architektura, narzędzia)

Zagadnienia (1/3) Data-flow diagramy przepływów danych ERD diagramy związków encji Diagramy obiektowe w UML (ang. Unified Modeling Language)

Szczególne problemy projektowania aplikacji internetowych. Jarosław Kuchta Projektowanie Aplikacji Internetowych

Backend Administratora

Wykład 1 Inżynieria Oprogramowania

Diagramy maszyn stanowych, wzorce projektowe Wykład 5 część 1

Podstawy wzorca MVC MODEL KON- TROLER WIDOK. Odpowiada za wyświetlenie danych użytkownikowi. Zawiera dane aplikacji oraz jej logikę.

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Full Stack JavaScript z Angular i Nest. Dni: 5. Opis: Adresaci szkolenia

Aplikacje RMI Lab4

LABORATORIUM 8,9: BAZA DANYCH MS-ACCESS

Plan. Wprowadzenie. Co to jest APEX? Wprowadzenie. Administracja obszarem roboczym

Szkolenie. IBM Lotus - Podstawy projektowania aplikacji w Domino Designer 8.5. Strona szkolenia Terminy szkolenia Rejestracja na szkolenie Promocje

Technologie internetowe ASP.NET Core. Paweł Rajba

Języki i paradygmaty programowania - 1

Transkrypt:

Projektowanie Graficznych Interfejsów Użytkownika Robert Szmurło LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 1

Wzorce Projektowe Nie ma złotego środka spełniającego wszystkie wymagania. skala projektu liczba deweloperów stopień skomplikowania Wzorzec projektowy w inżynierii oprogramowania, uniwersalne, sprawdzone w praktyce rozwiązanie często pojawiających się, powtarzalnych problemów projektowych. (za wikipedią :-) Po co mówimy o wzorcach? chcemy np. zrozumieć różne style architektoniczne chcemy w zespole architektów i programistów posługiwać się wspólną terminologią przecież nie chce nam się za każdym razem tłumaczyć jak odseparować prezentację :-) LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 2

Wzorce projektowe Przykłady: Wzorzec (?) MVC Model View Controller przetrwał próbę czasu (ponad 35 lat, lata 70) sprawdza się w separacji Logiki Biznesowej od Logiki Prezentacji. stosuje się go zazwyczaj do rozwiązań bazodanowych, a nie do specjalistycznych aplikacji opartych na technologii bogaty klient ( rich client ) Wzorzec singleton Wzorzec fabryki i wiele innych... LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 3

Wzorce projektowe Wzorce projektowe w GUI: Model Widok Kontroler (MVC) (osobny wzorzec projektowy czy raczej ich zbiór?) Zawiadomienie (Notification) Kontroler zarządzający (Supervising controller) Pasywny widok (Passive View) Model prezentacji (Presentation Model) Sumator zdarzeń (scalacz) (Event aggregator) Sterownik okna (Window Driver) Synchronizacja przepływu (Flow Synchronization) Synchronizacja obserwatora (Observer Synchronization) Selektor prezentacji (Presentation Chooser) Oddzielona prezentacja (Separated Presentation) Głównym źródłem niniejszego opracowania wzorców jest praca: Martin Fowler, Development of Further Patterns of Enterprise Application Architecture http://www.martinfowler.com/eaadev/ (Link: 20.03.2007) LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 4

Wzorzec 1: Formularze i Kontrolki Architektura promowana w latach 90-tych dla aplikacji klient-serwer głównie w narzędziach takich jak Visual Basic, Delphi czy PowerBuilder. Bardzo praktyczna podczas prototypowania, ze względu na natychmiastowe efekty. Program przykładowy: (na podstawie Martin Fowler, Development of Further Patterns of Enterprise Application Architecture ) Zbiór stacji pomiarowych pewnej wartości, raportujemy dla każdej stacji: wartość zmierzoną wartość progową różnicę LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 5

Zadania formularza Formularz (widok) jest specyficzny dla naszej aplikacji, ale używa pewnych ogólnych kontrolek. Formularz jest odpowiedzialny za: układ kontrolek na ekranie, logikę formularza (widoku), która nie może być w łatwy sposób zrealizowana wewnątrz kontrolek. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 6

Wyświetlane dane Najczęściej dane wyświetlane na ekranie pochodzą z jakiejś bazy danych (SQL). Dane te występują w trzech zasadniczych kopiach (stanach): 1. w rzeczywistej bazie na serwerze (lub lokalnym pliku), kopię tę możemy nazwać stanem rekordu. 2. w pamięci operacyjnej związanej z naszą aplikacją w postaci jakiegoś zbioru danych (RecordSet), którą nazwiemy stanem sesji. 3. na ekranie w komponentach GUI, którą określimy stanem ekranowym. Jednym z kluczowych elementów architektury GUI jest synchronizacja danych pomiędzy stanami ekranowym i sesji. W naszym pierwszym wzorcu wykorzystuje się do tego wbudowany w niektóre kontrolki mechanizm: DataBinding. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 7

Databinding szczegóły Podstawowa idea data binding zapewnia synchronizację między tym co znajduje się na ekranie a tym co znajduje się w recordset'ie. Każda zmiana na ekranie automatycznie propaguje się do recordsetu i odwrotnie. Koncepcja ładowania z sesji (recorsetu) do kontrolek tylko podczas pierwszego pokazywania. (zapobiega zapętleniu się uaktualnień :-) Kontrolka jest podpięta do kolumny w tabeli lub kwerendzie zazwyczaj za pomocą pola atrybutu (property). Większa część funkcjonalności związanej z Data Binding jest zaimplementowana w bibliotece, którą wykorzystujemy. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 8

Demo w Delphi RecordSet Mechanizm Data Binding Kontrolka LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 9

Specyficzne wymagania aplikacji Niestety bardzo często standardowe kontrolki nie udostępniają jakiejś funkcjonalności, która jest związana z logiką naszej konkretnej aplikacji. W naszym przypadku jest to logika związana z kolorem w jakim ma być wyświetlona różnica między wartościami zmierzonymi i zadanymi. W przypadku znacznych odchyłek ma być to kolor czerwony. Są dwa zasadnicze rozwiązania: 1. za każdym razem gdy zmieni się wartość kontrolki różnicy, możemy informować o tym formularz (klasę widoku), który następnie pobierze aktualną wartość z kontrolki i na jej podstawie podejmie odpowiednią decyzję o kolorze. (Wzorzec GUI: Formularz i Kontrolka) do tego kontrolki mają specjalne zdarzenia (events), do których podpina się formularz. Takie rozwiązanie wykorzystuje wzorzec obserwatora. 2. tworzymy naszą własną kontrolkę, która rozszerza funkcjonalność kontrolki standardowej o dodatkową opcję koloru. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 10

Analiza procesu edycji z wykorzystaniem Form Diagram klas Diagram sekwencji dla przypadku gdy użytkownik wprowadza nową wartość. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 11

Podsumowanie Formularz i Kontrolka Podsumujmy pierwszy wzorzec oparty na formularzu i kontrolkach: Programiści tworzą formularze (widoki) specjalizowane dla naszej aplikacji, ale wykorzystują do tego uniwersalne kontrolki. Formularz definiuje układ kontrolek na ekranie. Formularz obserwuje kontrolki za pośrednictwem metod, które są połączone ze zdarzeniami generowanymi przez kontrolki. Proste edycje danych na ekranie są obsługiwane przez mechanizm Data Binding. Bardziej złożone modyfikacje są realizowane w metodach obsługi zdarzeń w formularzu. Problemy: wydajność, transakcje, wzajemne blokowanie, walidacja, dla klikaczy... :-) LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 12

Wzorzec MVC cd Struktura Modelu MVC Kontroler cd MVC Obserwator Model Kontroler «realize» Model «interface» Obserwator + uaktualnij() : void Widok «realize» Widok Wiele odmian LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 13

Motywacja- czyli potrzeby rynku Interfejs użytkownika ale i nie tylko interfejs zmienia się bardzo często. (nowe strony, zmiana kolejności, zmiana organizacji elementów na ekranie, nowe kolumny w bazie, nowe tabele,... ) W niektórych sytuacjach system wyświetla tą samą informację, ale w innej formie (widoki). Projekt efektywnego (też efektownego?) interfejsu w HTML wymaga specjalnych kwalifikacji? Rzadko spotyka się osoby, które potrafią projektować strony internetowe i jednocześnie logikę biznesową. Interfejs składa się zasadniczo z dwóch elementów: wyświetlania i uaktualniania. Kod interfejsu użytkownika zależy od specyfiki sprzętowej (np. PDA, WebForms, WindowForms) Tworzenie automatycznych testów interfejsu użytkownika jest pracochłonne i trudniejsze od testów logiki biznesowej. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 14

Odseparowana Prezentacja (ang. Separated Presentation) Koncepcja której podstawą jest odseparowanie obiektów dziedziny dla której stworzona jest aplikacja, czyli obiektów użytkownika, od widoków prezentacji realizowanych za pomocą elementów GUI. Obiekty dziedziny (użytkownika) w koncepcji tej powinny być całkowicie niezależne i nie powinny odwoływać się do prezentacji. Więcej, powinny w naturalny sposób obsługiwać wiele interfejsów jednocześnie. GUI 2 WEB GUI 1 Linia Komend Model LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 15

Model. (obiekty dziedziny) Widok. Potrafi poinformować o swoim stanie. Potrafi uaktualnić swój stan. MVC Moduły Tu już operujemy na obiektach a nie na RecordSet'ie Zarządza zachowaniem się danych w dziedzinie dla której została stworzona aplikacja. Zajmuje się tylko wyświetlaniem informacji. Ma wiedzę co trzeba wyświetlić i jak w danym momencie. Kontroler. Interpretuje zainicjowane akcje oraz wprowadzone przez użytkownika dane. Ma wiedzę potrzebną aby kontrolować sekwencje widoków. Uwaga! W aplikacji jest wiele par widok, kontroler. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 16

Model Widok - Kontroler Koncepcja klasyczna model jest elementem niezależnym występuje dwustronna zależność między kontrolerem a widokiem Koncepcja: Martin Fowler model nadal niezależny programista zazwyczaj nie używa bezpośrednio zależności między kontrolerem a widokiem, komunikację automatyzują różne narzędzia i wzorce, które informują widok o zmianach modelu cd Struktura Modelu MVC Kontroler Model Widok LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 17

Model wywodzi się ze Smalltalka. Tradycyjny model MVC Zakładamy, że mamy kontrolki dedykowane do naszej aplikacji. Bardzo podobne do Data Binding, ale bez zdarzeń (events), oraz tym razem widok obserwuje model, a nie formularz obserwuje kontrolki. (czyli też wzorzec Obserwator) LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 18

MVC ze specyficznymi kontrolkami W specjalistycznych kontrolkach umieszczamy dodatkową funkcjonalność: np. tablicę kolorów fontu, dla pewnej wartości z zakresu 0 do 1. w ten sposób model musi udostępniać dodatkową informację o nowym wskaźniku LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 19

Pośredni model prezentacji (intermediate presentation model) Tworzymy model dla widoku, czyli pewien obiekt tłumaczący wartości z dziedziny aplikacji na dziedzinę interfejsu użytkownika. Model prezentacji przechowuje i udostępnia konkretne informacje związane bezpośrednio z interfejsem użytkownika: czyli np. kolor. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 20

MVC kontra Architektura Warstwowa Porównanie architektury warstwowej z MVC mylona przez wielu autorów z MVC, nowa w stosunku do MVC: koncepcja trzech warstw pochodzi z lat 90: html prezentacja application server database bardziej można ją porównać z wzorcem model aplikacji lub z wzorcem model prezentacji LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 21

Powiadomienie (Notification) Obiekt zbierający informacje o błędach lub innych wiadomościach związanych z dziedziną aplikacji, który następnie jest przekazywany do warstwy (modułu) prezentacji. Moduł prezentacji następnie może wyświetlić odpowiednie komunikaty zawarte w obiekcie Notification. W najprostszej postaci Notification jest zbiorem napisów. Kiedy używać? Np. w przypadku gdy walidacja wykonywana jest warstwie, która nie ma dostępu do prezentacji. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 22

Kontroler nadzorujący (supervising controller) Wzorzec wykorzystuje kontroler do obsługi komunikatów pochodzących od użytkownika (koncepcja klasyczna), oraz do obsługi złożonej logiki prezentacji (w naszym przypadku do określenia koloru). Niezmiernie ważny w testach automatycznych. 1 2 LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 23

Widok pasywny (passive view) Cała funkcjonalność: reakcja na komunikaty użytkownika i zarządzanie prezentacją włącznie z logiką aplikacji specyficzną dla dziedziny jest realizowana przez kontroler. Najczęściej stosowany w aplikacjach typu rich client ze względu na możliwość stworzenia automatycznych testów. 1 3 2 LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 24

Model prezentacji (presentation model) 1 Umożliwia reprezentację stanu i zachowania prezentacji niezależnie od kontrolek GUI używanych na ekranie. Oznacza, to że stan ekranu nie znajduje się w kontrolkach lecz w modelu. Model prezentacji może odwoływać się do wielu obiektów dziedziny aplikacji. Nie jest zatem fasadą obiektów dziedziny Model prezentacji można uznać za pewną 'abstrakcję' niezależną od platformy GUI (GUI framework) 2 LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 25

Synchronizacja przepływu (flow synchronization) Używany w sytuacjach gdy w kilku widokach pokazujemy dane pochodzące z tego samego źródła. Jeżeli na jednym ekranie użytkownik zmieni wartość jakiegoś pola wówczas formularz uaktualnia kopię sesji (czyli np. Recordset) a następnie samodzielnie wymusza pozostałe okna, które pokazują tą samą informację aby się odświeżyły. Rozwiązanie stosuje się dla małych aplikacji. Typowym przykładem jest program z głównym oknem, oraz szeregiem okien modalnych dostępnych z głównego. Problem z wzorcem tym polega na tym, że wprowadzamy zbyt duże zależności pomiędzy widokami. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 26

Synchronizacja obserwująca (observer synchronization) Synchronizacja wielu okien. Każde okno obserwuje pewien współdzielony zbiór danych z obszaru dziedziny. Jeden z głównych wzorców składowych MVC. Źródło: http://www.martinfowler.com/eaadev/mediatedsynchronization.html LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 27

Synchronizacja obserwatora (kod w C#) Dziedzina aplikacji Prezentacja 1) class DomainObject { 2) public void SignalChanged() 3) { 4) if (Changed!= null) Changed(this, null); 5) } 6) public event DomainChangeHandler Changed; 7) 8) public delegate void DomainChangeHandler( DomainObject source, EventArgs e); 9) } 10) 11) class Album : DomainObject { 12) //... 13) public string Title 14) { 15) get { return _title; } 16) set 17) { 18) _title = value; 19) SignalChanged(); 20) } 1 21) } 22) string _title; 23) } 2 1) class FrmAlbum { 2) //... 3) public FrmAlbum(Album album) 4) { 5) InitializeComponent(); 6) this._album = album; 7) observedomain(); 8) load(); 3 9) } 10) private Album _album; 11) private void observedomain() 12) { 13) _album.changed += 14) new DomainChangeHandler(Subject_Changed); 15) foreach (Performer p in _album.performers) 16) p.changed += 17) new DomainChangeHandler(Subject_Changed); 18) } 19) private void Subject_Changed( 20) DomainObject source, EventArgs e) 21) { 22) load(); 23) } 24) } 6 4 5 LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 28

Selektor prezentacji (presentation chooser) Wybiera ekran (formularz) odpowiedni dla konkretnego obiektu z dziedziny aplikacji. Stosowany w sytuacji, gdy w danym momencie musimy wyświetlić różne formularze dla różnych aktualnie wybranych obiektów. Edycja jest różna dla pozycji muzyki klasycznej a inna dla muzyki popularnej. LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 29

Selektor prezentacji (presentation chooser) Tworzymy osobną klasę, która na podstawie obiektu dziedziny decyduje w którym oknie trzeba go wyświetlić. Rozwiązanie związane z wzorcem Fabryka. class Presentation Chooser class Presentation Chooser Dziedzina ObjDziedzina_1 ObjDziedzina ObjDziedzina_2 ObjDziedzina_3 Formularz 1 - object: ObjDziedzina_ 1 PresentationChooser Formularz 2 - object: ObjDziedzina_ 2 Formularz 3 - object: ObjDziedzina_ 3 FormularzGłówny pyta się w jakim oknie wyświetlić dany obiekt. Formularz FormularzGlowny - listobjects: list<objdziedzina> LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 30

Interakcja Dziękuję za uwagę. Chcemy być coraz lepsi! Jeżeli coś cię zainteresowało napisz e-maila: robert@iem.pw.edu.pl Jeżeli coś cię bardzo znudziło napisz e-maila: robert@iem.pw.edu.pl Jeżeli zauważyłeś błąd napisz e-maila: robert@iem.pw.edu.pl LATO 2007 Projektowanie Graficznych Interfejsów Użytkownika 31