Hallo Thorben,
Stefans Antwort stimmt - direkter Zugriff auf das "aktuelle Element" ist nicht ohne weiteres möglich.
Über einen kleinen Umweg sollte es trotzdem funktionieren wenn ich nichts übersehen habe.
Im CC besteht über den WebeditUIAgent schonmal die Möglichkeit, an die aktuelle Seitenreferenz zu kommen, da sollte es also direkt gehen.
Im SA ist es etwas schwieriger. Die Idee ist folgendermaßen:
Erstellung eines JavaClientPermanentPlugins, das in seiner setUp-Methode sowohl einen ModelListener (Modeltyp SelectionModel#EDITORIAL) als auch einen selbst zu implementierenden ClientService registriert (per ClientServiceRegistryAgent). Der ClientService wäre dabei ganz einfach gestrickt und fungiert dabei als eine Art "Clipboard", in den der ModelListener jeweils das aktuell im SA selektierte Objekt "hineinlegt". Im DAP kannst Du dann über diesen ClientService das selektierte Objekt abfragen und entspr. auswerten.
Mal ein paar entsprechende Codeschnipsel (musst Du natürlich auf die entsprechenden einzelnen Klassen aufteilen):
//PermanentPlugin - to be referenced as <public>component in module.xml
public class MySiteArchitectPermanentPlugin implements JavaClientPermanentPlugin {
@Override
public void setUp(BaseContext context) {
ClientServiceRegistryAgent clientServiceRegistryAgent = context.requestSpecialist(ClientServiceRegistryAgent.TYPE);
MyClipboardService clipboardService = new MyClipboardServiceImpl();
clientServiceRegistryAgent.registerClientService(MyClipboardService.class, clipboardService);
ModelService modelService = context.requireSpecialist(ServicesBroker.TYPE).getService(ModelService.class);
modelService.addModelListener(SelectionModel.EDITORIAL, new MySelectionModelModelListener(clipboardService));
}
}
...
class MySelectionModelModelListener implements ModelListener<SelectionModel> {
private final MyClipboardService clipboard;
public MySelectionModelModelListener(MyClipboardService clipboard) {
this.clipboard = clipboard;
}
@Override
public void modelChanged(SelectionModel selectionModel) {
clipboard.setCurrentElement(selectionModel.getElement());
}
}
}
...
//Interface for the self implemented "clipboard"
public interface MyClipboardService {
void setCurrentElement(IDProvider element);
IDProvider getCurrentElement();
}
...
// clipboard implementation
public class MyClipboardServiceImpl {
private IDProvider currentElement=null;
public void setCurrentElement(IDProvider element){
currentElement=element;
}
public IDProvider getCurrentElement(){
return currentElement;
}
}
...
//Accessing the currently selected element from other places - like DAP:
IDProvider currentElement = broker.requireSpecialist(ServicesBroker.TYPE).getService(MyClipboardService.class).getCurrentElement();
Siehe auch hier.
Um einen einheitlichen Zugriff im DAP zu haben (und dort keine Fallunterscheidung zwischen den Clients machen zu müssen), bietet sich noch eine minimale Implementierung eines WebEditPermanentPlugins an, das denselben Service registriert - allerdings mit einer sehr viel einfacheren Implementierung, die letztlich nur an den WebEditUIAgent delegiert (also ohne ModelListener usw.). Dadurch greift das DAP dann einfach immer auf den ClientService zu.
Wichtig ist, dass die beiden PermanentPlugins dann in getrennten Klassen implementiert werden, weil sonst im CC die Klassen des ModelListeners nicht gefunden werden (die dort ja auch nicht benötigt werden).
Viele Grüße
Michael