Hm.
Du solltest es vielleicht eventuell zuerst mal mit einem einfacheren Beispiel probieren. Zwei Sachen die mir aber aufgefallen sind. Du musst bei ViewParts die in Comp Apps verwendet werden die Eigenschaft AllowMultipe beim Extension Point der View angeben. Sonst funktioniert das nicht.
Eine View sollte also so definiert sein:
<extension
point="org.eclipse.ui.views">
<view
allowMultiple="true"
category="test"
class="viewPartClass"
id="viewId"
name="Testview"
restorable="true">
</view>
Dann sollte sie auch in CA's funktionieren.
Zweitens wenn du Eigenschaften von einem Viewpart zum Anderen übertragen willst, brauchst du ein WSDL, dass du im Designer erstellen kannst und dann in Eclipse importieren musst. Dieses WSDL und deine Handler Klassen musst du dann im Extension Point com.ibm.rcp.propertybroker.PropertyBrokerDefinitions angeben. Das ist aber im Tutorial genau beschrieben.
Nein nur mit WSDL alleine geht noch gar nichts. Die Komponenten müssen auch dann die Aktionen implementieren. Du musst dazu den Erweiterungpunkt
com.ibm.rcp.propertybroker.PropertyBrokerDefinitions erweitern. Ist auch im Tutorial beschreiben.
<extension
point="com.ibm.rcp.propertybroker.PropertyBrokerDefinitions">
<handler
class="HandleAktionen"
file="WSDL/wsdl.wsdl"
owner="HandleAktionen"
type="SWT_ACTION">
</handler>
</extension>
public class HandleAktionen implements IHandler {
public void addHandlerListener(IHandlerListener arg0) {
// TODO Auto-generated method stub
}
public void dispose() {
// TODO Auto-generated method stub
}
Dann muss es natürlich die Klasse HandleAktionen geben. Die ca. so aussehen soll. Kann jetzt nicht sagen, ob die Klasse ganz richtig ist, da ich sie aus einem meiner Projekte rauskopiert habe und anonymisiert, bzw vereinfacht habe. Der ViewPart AktionenView muss natürlich dann die Methode showAktionen haben. In meinem Fall.
public Object execute(ExecutionEvent arg0) throws ExecutionException {
final PropertyChangeEvent pce = (PropertyChangeEvent) arg0.getTrigger();
Display.getDefault().asyncExec(new Runnable() {
public void run(){
String targetViewId = pce.getWireDefinition().getTargetEntityId();
IViewPart part=SWTHelper.locateView(targetViewId);
if (part instanceof AktionenView){
if(pce.getPropertyValue().getProperty().getName().equals("Name1")){
((AktionenView)part).showAktionen((String)pce.getPropertyValue().getValue());
}
}
}
});
return null;
}
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
}
public boolean isHandled() {
// TODO Auto-generated method stub
return true;
}
public void removeHandlerListener(IHandlerListener arg0) {
// TODO Auto-generated method stub
}
}
Wenn du Noteskomponenten hast, dann musst du eine Notesaktion hinzufügen die mit dem WSDL verknüpft ist. Siehe Screenshot
So ich habe dass mal schnell durchgeschaut. 2 Probleme fallen einmal auf:
Erstens in deinem Plugin.xml ist der Eintrag owner falsch. Der Ownereintrag bewirkt, dass das hier beschriebene WSDL nur bei einem bestimmten ViewPart zieht. Stell dir vor, du hast in deinem Plugin mehrere ViewParts und mehrere WSDL, da ja jeder Viewpart andere Aktionen hat. MIt dem Owner steuerst du welches WSDL zu welchem Viewpart gehört.
Deine Plugin.xml sollte also so aussehen:
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>
<extension
id="DataView"
name="DataView"
point="org.eclipse.ui.views">
<view
allowMultiple="true"
class="sampleplugin.views.DataView"
id="DataView Plug-in.view1"
name="DataView"/>
</extension>
<extension
point="com.ibm.rcp.propertybroker.PropertyBrokerDefinitions">
<handler
class="sampleplugin.actions.ActionHandle"
file="WSDL/DataView.wsdl"
owner="DataView Plug-in.view1"
type="SWT_ACTION">
</handler>
</extension>
</plugin>
Mit dieser Änderung sollten eigentlich dann die Aktion beim Viewpart angezeigt werden. Probier es am besten gleich aus.
Dann ist aber auf jeden Fall noch ein Fehler in der AktionenHandleKlasse.
Du hast das offensichtlich ein zu eines kopiert, aber natürlich gehört es an dein Beispiel angepasst.
public Object execute(ExecutionEvent arg0) throws ExecutionException {
final PropertyChangeEvent propertyChangeEvent = (PropertyChangeEvent) arg0.getTrigger();
Display.getDefault().asyncExec(new Runnable() {
public void run() {
String targetViewId = propertyChangeEvent.getWireDefinition().getTargetEntityId();
IViewPart dataView = SWTHelper.locateView(targetViewId);
if (dataView instanceof DataView){
if(propertyChangeEvent.getPropertyValue().getProperty().getName().equals("SampleNsfProperty")){
((DataView)dataView).showAktionen((String)propertyChangeEvent.getPropertyValue().getValue());
}
}
}
});
return null;
}
Ich habe Name1 durch SampleNsfProperty ersetzt.
Ich hoffe, dass du damit einen Schritt weiter bist.
Grüße
Ralf