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ż:
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:
  1. Tworzymy podklasę klasy Shell (to będzie Prezenter).
  2. Tworzymy Widok dla Prezenter (np. z podręcznego menu w przeglądarce klas wybieramy polecenie New View).
  3. 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.

  4. Jako wartość atrybutu layoutManagerClass widoku naszego okienka (ShellView - nie jego składników) wybieramy (z listy) FramingLayout.
  5. 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.
  6. 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: 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.
  7. Ż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).
  8. 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