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?


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