Dolphinowe jak by tu ...
Na tej stronie zamieszczam (w miarę wolnego czasu) odpowiedzi na zadawane mi pytania
dotyczące Dolphina i MVP.
Jak zdefiniować menu?
Jak sprawić by przyciski/polecenia z menu były (nie)aktywne?
Jak stworzyć główne okno programu podzielone na kilka części i sprawić,
by te części automatycznie dostosowywały swój rozmiar do rozmiaru okna?
Początek strony
Jak zdefiniować menu?
W bardzo intuicyjny sposób. W View Composerze wybrać Draw|Menu|Menu Bar (lub Context Menu),
podwójnie klikając w wyświetlane pola określać ich nazwy i związane z nimi polecenia (nazwy
bezargumentowych metod w definiowanym prezenterze). Następnie wyjść z edytora menu klikając
na OK. Uwaga: menu będzie widoczne, jeśli z widokiem zwiążemy prezenter będący podklasą
klasy Shell.
Początek strony
Jak sprawić by przyciski/polecenia z menu były (nie)aktywne?
Ponieważ:
- zarówno przyciski jak i polecenia menu służą do wywoływania
pojedynczych, bezargumentowych metod ze związanego z widokiem
prezentera,
- to czy są aktualnie aktywne powinno zależeć jedynie od samego polecenia
(a nie od tego czy wywołanie polecenia jest związane z elementem
menu, czy z przyciskiem),
wprowadzono w Dolphinie mechanizm pozwalający uaktywniać polecenia, a nie
przeciski, czy polecenia menu. To jest oczywiście bardziej naturalne, jeśli np.
operacja usuwania jest w danej sytuacji niedostępna, to wystarczy tylko to
opisać, nie trzeba już się zastanawiać z jakich menu i poprzez jakie przyciski
ta operacja jest dostępna.
Realizacja:
Domyślnie dostępne są wszystkie komendy zdefiniowane w prezenterze
(p. Presenter>>queryCommand:) i oczywiście niezdefiniowane komendy są niedostępne.
Jeśli chcemy warunkowo zezwalać na wykonywanie pewnych komend, to
musimy zdefiniować (w tworzonym Prezenterze) metodę queryCommand:.
Ta metoda dostaje jako parametr obiekt opisujący komendę. Metoda command
tego obiektu daje (jako Symbol) nazwę komendy. Dla tych komend, których
dostępność chcemy zmieniać, należy skorzystać z metody enabled: w celu
poinformowania interfejsu, czy w obecnej sytuacji te komendy są dostępne.
Oto przykładowa definicja metody queryCommand wzięta z załączonego do Dolphina
przykładowego programu (Education Center->Dolphin Tutorials->Personal Money Application):
queryCommand: aCommandQuery
"Enters details about a potential command for the receiver into
aCommandQuery"
super queryCommand: aCommandQuery.
(#(editTransaction removeTransaction) includes: aCommandQuery command)
ifTrue: [ aCommandQuery enabled: self hasSelectedTransaction ]
Najpierw wołana jest standardowa realizacja tej metody udostępniająca wszystkie
zaimplementowane komendy (super queryCommand: aCommandQuery). Następnie
dla dwu metod (o nazwach #editTransaction i #removeTransaction) ich dostępność jest
ustalana na podstawie jakiegoś warunku (tu akurat na podstawie tego, czy użytkownik
wybrał jakąś pozycje z listy transakcji).
A oto realizacja metody queryCommand w prezenterze:
Presenter>>queryCommand: aCommandQuery
"Enters details about a potential command for the receiver into aCommandQuery"
(self respondsTo: aCommandQuery command) ifTrue: [
aCommandQuery beEnabled ].
(Metoda Object>>respondsTo: selector stwierdza, czy obiekt rozumie
komunikat selector, czyli czy zdefiniowano w tym obiekcie metodę
obsługującą ten komunikat.)
Początek strony
Jak stworzyć główne okno programu podzielone na kilka części i sprawić,
by te części automatycznie dostosowywały swój rozmiar do rozmiaru okna?
Typowe tworzenie głównych okienek aplikacji w Dolphinie:
- Tworzymy podklasę klasy Shell (to będzie Prezenter).
- Tworzymy Widok dla Prezenter (np. z podręcznego menu w
przeglądarce klas wybieramy polecenie New View).
- Dodajemy stosowną liczbę kontenerów (tyle ile części głównego
okna chcemy mieć) - ze skrzynki z przyborami (Resources Toolbox,
wywołujemy ją przez Ctrl/T) wybieramy:
CompositePresenter.Container View
i umieszczamy w naszym oknie.
Teraz zapewnimy, że nasze podwidoki będą automatycznie dostosowywać
swój rozmiar do rozmiaru całego okienka.
- Jako wartość atrybutu layoutManagerClass widoku naszego okienka (ShellView
- nie jego składników) wybieramy (z listy) FramingLayout.
- Zaglądamy do wartości atrybutu arragement podwidoków (czyli tym razem
ContainerView, a nie ShellView). Jest tam zapisane a FramingConstraints.
Teraz robimy rzecz dalece nieoczywistą:
Wpisujemy self zamiast dotychczasowej zawartości i wywołujemy inspektora
obiektów (Ctrl/I) aby ustalić jak nasz podwidok ma być wyświetlany
w ramach okienka. Pojawia się okno inspektora obiektów z podanymi atrybutami
takimi jak leftFraming czy leftOffset.
- Ustalamy jak chcemy wyświetlać podwidok w ramach okna, robimy to po kolei
dla wszystkich jego boków. Np. żeby powiedzieć, że nasz podwidok ma mieć
prawą krawędź o 10 pixeli na lewo od krawędzi całego okna należy:
- jako rightFraming wpisać #fixedParentRight
- jako rightOffset wpisać -10
Uwaga: po każdej zmianie _koniecznie_ trzeba naciskąc ctrl/S, inaczej zmiana
nie będzie zapisana, nie będzie też generowane ostrzeżenie.
Po ustawieniu wszystkich parametrów zamykamy okienko inspektora obiektów.
Pełną listę wartości, które można wpisywac można znaleźć w metodzie klasowej
FramingConstaints>>initialize.
- Żeby zobaczyć efekt zmian należy uczynić podwidok widzialnym (np. ustawiając
wartość atrybutu hasBorder) i wyświetlić całe okienko naciskając F5 (dopóki tego
nie zrobimy ułożenie podwidoku w oknie projektowym może nie uwzględniać
wprowadzonych przez nas zmian).
- Zapisujemy nasz widok (File|Save As), Dolphin pokaże hierarchię klas
z zaznaczonym naszym Prezenterem, należy tylko dopisać poniżej
nazwę widoku.
Początek strony