...
Każda wtyczka może sama zdefiniować elementy ulubione, które będą dostępne dla użytkownika - dostarcza ona opis elementów oraz reguły ich wyświetlania w gadżecie lub stronie startowej.
Moduł <favourites>
Moduł favourites umożliwia wtyczką rejestrację własnych obiektów typu , które odpowiedzialne są za dostarczanie:
- definicji elementów (także w postaci drzewa) - elementy, które wyświetlane są użytkownikowi podczas budowy zestawów
- obiektów renderujących - przygotowujących dane do wyświetlenia
Zależności
Zależność do wtyczki favourites powinna być opcjonalna (wtyczka powinna działać, nawet jeżeli favourites nie są zainstalowane). W tym celu zależność należy zdefiniować z <optional>true</optional>:
Code Block | ||||
---|---|---|---|---|
| ||||
|
...
Należy stworzyć klasę implementującą interfejs
java
<dependency>
<groupId>com.suncode.plugin</groupId>
<artifactId>favourites</artifactId>
<version>1.0.0-SNAPSHOT</version>
<optional>true</optional>
<scope>provided</scope>
</dependency> |
Implementacja handler'a
W pierwszej kolejności należy stworzyć klasę implementującą interfejs :
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
public class ExampleFavouriteHandler implements FavouriteHandler {
@Override
public boolean supports(String type) {
return "test".equals(type) || "test-sub".equals(type);
}
@Override
public Collection<Definition> getDefinitions() {
List<Definition> definitions = new ArrayList<Definition>();
Definition definition = new Definition("test");
definition.setName("TEST - Nazwa");
definition.setDescription("TEST - Opis");
definition.setTypeDescription("TEST - Typ");
definition.setCountable(false);
definitions.add(definition);
NestedDefinition nestedDefinition = new NestedDefinition(definition.getType(), "test-sub");
nestedDefinition.setName("TEST-SUB - Nazwa");
nestedDefinition.setDescription("TEST-SUB - Opis");
nestedDefinition.setTypeDescription("TEST-SUB - Typ");
nestedDefinition.setCountable(true);
nestedDefinition.setParameter(RandomStringUtils.randomAlphabetic(5));
definitions.add(nestedDefinition);
return definitions;
}
@Override
public FavouritesRenderer getRenderer(FavouriteElement favourite) {
ExampleFavouriteRenderer renderer = plugin.getContext().getBean(ExampleFavouriteRenderer.class);
renderer.setFavourite(favourite);
return renderer;
}
} |
Komentarze do pliku:
4-5: informujemy jakie typy definicji wspieramy - jesteśmy ich autorami i potrafimy je narysować
12-17: element ulubiony typu test
19-25: element ulubiony typu test-sub - jest on zagnieżdżony w elemencie test, co spowoduje stworzenie struktury drzewa z oknie wyboru
24: zapisujemy dowolne dodatkowe informacje w parametrze, który później może służyć np. do budowania linków
32-34: pobieramy obiekt renderera z kontekstu (komponent ma scope=prototype)
Tip |
---|
Klasa handlera zdefiniowana w module <favourites> zostanie stworzona z wykorzystaniem kontekstu wtyczki, dzięki czemu możliwe jest standardowe korzystanie z adnotacji @Component. |
Powyższy kod definicji będzie skutkował dodaniem 2 nowych elementów ulubionych do wyboru w postaci drzewa:
Implementacja obiektu renderującego
Obiekt odpowiedzialny za narysowanie elementów w gadżecie to .
Warning |
---|
Obiekt FavouritesRendererSupport nie jest ThreadSafe - zawsze musimy stworzyć nową instancję tej klasy zwracając ją w metodzie getRenderer(FavouriteElement favourite) |
Tip | ||
---|---|---|
Istnieje obiekt pomocniczy który dostarcza domyślne zachowanie rysowania pozwalając na łatwe przeciążenie.
|
Implementacja takiego obiektu może wyglądać tak:
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
@Component
@Scope(value="prototype")
public class ExampleFavouriteRenderer extends FavouritesRendererSupport {
@Override
public boolean shouldRender() {
return true;
}
@Override
public String renderDescription() {
return "Parametr:" + getFavourite().getParameter();
}
@Override
public String renderCount() {
return RandomStringUtils.randomNumeric(3);
}
@Override
public String renderAction() {
FavouriteElement element = getFavourite();
if("test".equals(element.getType())){
return "";
}
return getAnchor("Logout.do", "Logout");
}
} |
Komentarze do pliku:
1-2: komponent prototype
12: odczytujemy parametr tego elementu
23-26: możemy podejmować decyzje na podstawie aktualnego elementu
Deklaracja modułu <favourites>
Ostatnim krokiem jest deklaracja modułu <favoruites> w pliku suncode-plugin.xml:
Code Block | ||||
---|---|---|---|---|
| ||||
<favourites key="favourite-entry" handler="com.suncode.plugin.example.ExampleFavouriteHandler"/> |
Wyświetlana lista ulubionych
Tak skonfigurowany zestaw ulubionych:
Tak wygląda w gadżecie pulpitu: