RCP Sichtbarkeit von Toolbar-Elementen

dzim

Top Contributor
Nachdem ich mein Problem mit Features erst einmal erledigt habe, musste ich feststellen, dass trotz aller Versuche unliebsame Dependencies - und damit Toolbar- und Menu-Items - zu vermeiden, durch die das org.eclipse.ui.workbench-Plugin die Annotation- und Editor-Navigation-Elemente sichtbar sind (Hinweis: das Plugin wird durch das RCP Feature bereit gestellt).
Ich finde es zwar ein wenig seltsam, dass ein Plugin-basierter Export das nicht hervorruft, aber das mag an der "Black Magic" des PDE-Exports liegen, der bei Feature-basierten Exports noch etwas genauer, oder was auch immer, arbeitet.

Meine Frage ist nun: Gibt es einen programmatischen oder sonst wie gearteten Ansatz, die Aktivierung der entsprechenden ActionSets zu verhindern?
Im Kontext meiner Anwendung sind diese Items nicht nur störend sondern falsch.

Vielen Dank, wie immer, vorab,
Daniel
 

Wildcard

Top Contributor
Vieles lässt sich über den activities/capabilities Extension Point ausblenden. Die Extension fungiert als ein Filter auf plugin.xmls
 

dzim

Top Contributor
Hm.
Also ich hab ein bisschen mit Plugin-Spy herumgesucht und folgende Einträge in die plugin.xml der Applikation eingefügt:
Code:
   <extension
         point="org.eclipse.ui.activities">
      <activity
            id="myapp.rcp.pfs.activity"
            name="My Activity">
      </activity>
      <category
            id="myapp.rcp.pfs.activity.category"
            name="My Activities Category">
      </category>
      <categoryActivityBinding
            activityId="myapp.rcp.pfs.activity"
            categoryId="myapp.pfs.activity.category">
      </categoryActivityBinding>
      <defaultEnablement
            id="myapp.rcp.pfs.activity">
      </defaultEnablement>
      <activityPatternBinding
            activityId="myapp.rcp.pfs.activity"
            isEqualityPattern="true"
            pattern="org.eclipse.ui.workbench/org.eclipse.ui.edit.text.actionSet.annotationNavigation">
      </activityPatternBinding>
   </extension>

Aber irgendwie tut sich da nichts. Einen Blog-Eintrag vom Lars Vogel folgend bin ich da auch nicht auf einen Grünen Zweig gekommen. Muss das isEqualityPattern-Attribut vielleicht doch false sein? Oder ist einfach nur die ID für das Ziel im Pattern falsch?
 

dzim

Top Contributor
Ich hatte länger keine Zeit mehr, mich um das Thema zu kümmern, aber jetzt wieder...
Ich hab noch mal geschaut: Also das "defaultEnablement"-Element habe ich wieder entfernt, sonst weiß ich gerade nicht, was du mit "Die activity muss disabled sein um Dinge auszublenden, nicht enabled." meinst. Kannst du dass konkretisieren?
 
G

Gonzo17

Gast
Wenn du defaultEnablement für eine activity nutzt, dann bedeutet das, dass sie enabled ist. Wozu man das genau nutzt kann ich dir nicht sagen, aber auf jeden Fall solltest du das defaultEnablement einfach weg lassen und die entsprechenden activities sind disabled.
 

dzim

Top Contributor
Thx Gonzo. Das muss also bedeuten, das mit der ID was nicht stimmt, denn sonst wären die Items ja nicht mehr da...
 

Wildcard

Top Contributor
Die Activity kann ein 'enabledWhen' Kind haben. Mach dort mal eine Expression die auf false evaluiert. 'not' sollte genügen.
Ausserdem würde ich empfehlen den Runtime Workspace beim Start löschen zu lassen, falls das defaultEnablement dort persistiert wurde.
 
G

Gonzo17

Gast
Probier mal bei pattern sowas wie org.eclipse.ui.* oder org.eclipse.ui.workbench.*, vielleicht hilft das. Dann wüsstest du zumindest, dass es tut. :)
 

dzim

Top Contributor
@Wildcard: Ich hab das mit dem not-Element mal probiert - leider ohne Fortschritte ("ArrayIndexOutOfBoundsException:0" wenn man unter "not" nichts definiert :) ). Ich hab dann mal versucht, das Ganze anders anzugehen und das not weggelassen, das ganze mit einem "with" für "activeEditorId" gepaart und dafür eine nie auftretende ID verwendet (s.u.). Mit dem selben Ergebnis.

@Gonzo: Ich müsste dazu aber wieder mit Patterns (also isEqualityPattern=false) arbeiten, oder? Schieße ich mir aber nicht ins Knie, wenn ich "org.eclipse.ui.workbench.*" nutze? ;-) Da bliebe ja fast nix mehr übrig... Wenn es funktioniert.

Hier mal der Auszug aus der plugin.xml in seiner gegenwärtigen Fassung:
Code:
   <extension
         point="org.eclipse.ui.activities">
      <category
            id="myapp.rcp.pfs.activity.category"
            name="My Activities Category">
      </category>
      <activity
            id="myapp.rcp.pfs.activity"
            name="My  Activity: Disable Workbench Item">
         <enabledWhen>
            <not>
               <with
                     variable="activeEditorId">
                  <equals
                        value="impossible.editor-id">
                  </equals>
               </with>
             </not>
         </enabledWhen>
      </activity>
      <categoryActivityBinding
            activityId="myapp.rcp.pfs.activity"
            categoryId="myapp.rcp.pfs.activity.category">
      </categoryActivityBinding>
      <activityPatternBinding
            activityId="myapp.rcp.pfs.activity"
            isEqualityPattern="true"
            pattern="org.eclipse.ui.workbench/org.eclipse.ui.edit.text.gotoLastEditPosition">
      </activityPatternBinding>
      <defaultEnablement
            id="myapp.rcp.pfs.activity">
      </defaultEnablement>
   </extension>
 
G

Gonzo17

Gast
@Gonzo: Ich müsste dazu aber wieder mit Patterns (also isEqualityPattern=false) arbeiten, oder? Schieße ich mir aber nicht ins Knie, wenn ich "org.eclipse.ui.workbench.*" nutze? ;-) Da bliebe ja fast nix mehr übrig... Wenn es funktioniert.


Probiers einfach aus. :) Den entsprechenden Eintrag zu ändern und die Applikation zu starten sollte ja in einer Minute getan sein. Ob zu viel fehlt siehst du ja dann auch recht schnell. Aber du siehst wenigstens, dass es funktioniert. :) Oder funktionierts jetzt auch so? Dann is ja auch ok.
 

dzim

Top Contributor
Code:
<activityPatternBinding activityId="myapp.rcp.pfs.activity" isEqualityPattern="false" pattern="org\.eclipse\.ui\.workbench/org\.eclipse\.ui\.edit\.text\.*"></activityPatternBinding>
Hat leider auch nichts gebracht. isEqualityPattern=true wäre hier auch eher sinnlos, da der String dann ja so wie er gegeben ist verwendet wird. Und ne ID die auf nem Asterix endet, gibt es IMHO nicht ;-)
 
G

Gonzo17

Gast
Hat leider auch nichts gebracht.

Probiers doch mal (testweise) tatsächlich einfach erstmal so:

Code:
<activityPatternBinding activityId="myapp.rcp.pfs.activity" pattern="org\.eclipse\.ui\.workbench\.*"></activityPatternBinding>

Wenn man isEqualityPattern weg lässt, ist es per default auf false glaube ich. Zumindest hab ichs eben noch nie gesetzt und es tut das, was ich erwarte.

Wenn das immer noch nicht klappt, solltest du vielleicht die activityId prüfen, muss natürlich die gleiche sein wie bei deiner festgelegten Activity. Scheint aber nach dem, was du weiter oben gepostet hast, so zu sein.
 

dzim

Top Contributor
Naja, rechts daneben ist so ein "Browse..." Button - ich geh mal davon aus, das der die richtigen IDs verlinkt.
Ich hab jetzt mal noch weiter ausgeholt, Google befragt und bin bei folgenden Seiten hängen geblieben:
1) FAQ How do I add activities to my plug-in? - Eclipsepedia
2) Help - Eclipse SDK
3) Developer Papercuts Tips around Eclipse and Android programming

Ein paar Bug- und Newsgruppeneinträge waren auch mit bei - aber nichts hilft.
Ich habe sogar mit der großen Keule ausgeholt und den Unteren Teil von Link 2 rekonstruiert, nachdem ich mich sowieso schon mit der Expressions-API mal beschäftigt habe. Ergebnis... Naja, ihr könnt euch's denken...
Ich vermute, dass es vielleicht Probleme bei Activities in Kombination mit ActionSets gibt (ein Newsgruppeneintrag von 2007 zielte auch in diese Richtung).
Ich habe mal noch ein zweites activityPatternBinding hinzugefügt und dort auch das andere ActionSet eingetragen. Aber das Ergebnis - nun ja.
Auch mit dem Pattern ".*/org\.eclipse\.ui\..*[A|a]ctionSet.*" (mal diesmal ohne isEqualityPattern) passiert nichts.

Gerade habe ich noch das hier gefunden - vielleicht bringt's ja was (wobei der Ansatz eigentlich der ist, den ich ja schon mal verfolgt habe...).
 
G

Gonzo17

Gast
Also du kannst nochmal den ganz großen Hammer schwingen und das hier probieren:

Code:
<activityPatternBinding activityId="myapp.rcp.pfs.activity" pattern=".*"></activityPatternBinding>

Habs eben mal bei probiert und dann ist eben tatsächlich alles weg, was nicht programmatisch hinzugefügt wurde. Falls das nicht bei dir klappt, weiß ich ehrlich gesagt grad auch nicht, könnte aber heute Abend daheim nochmal schauen und evtl ein kleines Beispiel basteln, mit es bei mir funktioniert und das dann uploaden (falls dir das hilft).

Edit:
Sehe auch gerade, dass das Pattern falsch ist (beachte den roten Punkt):

Code:
<activityPatternBinding activityId="myapp.rcp.pfs.activity" isEqualityPattern="false" pattern="org\.eclipse\.ui\.workbench/org\.eclipse\.ui\.edit\.text\.[COLOR="Red"][B][SIZE="6"].[/SIZE][/B][/COLOR]*"></activityPatternBinding>

Ob das jetzt immer noch das richtige Pattern ist, kann ich dir nicht sagen, aber ohne den Punkt wirds wohl falsch sein.
 
Zuletzt bearbeitet von einem Moderator:

dzim

Top Contributor
So. Ich hab tatsächlich mal eine Minute gefunden, das zu testen...
".*" - Erwartungsgemäß startet die App dann nicht mehr (could not find Perspective... blabla)

Bezüglich des Punktes: "\." ecaped glaub ich einfach einen "echten" Punkt, wie in org.eclipse[...], bedeutet "\..*" = "Ein Punkt gefolgt von beliebig vielen beliebigen Zeichen". Soweit mein Stand. Alternativ kann man glaub ich auch "[.]" schreiben.
 

dzim

Top Contributor
Heureka!
Ich hab keine Ahnung wieso, aber jetzt geht es! Die nervigen Toolbar-Items sind weg!

Ich habe mich an den unteren Link aus dem Post [post=14]#14[/post] und eure Anmerkungen gehalten und den Extension Point wie folgt aufgebaut:
HTML:
   <extension
         point="org.eclipse.ui.activities">
      <category
            id="myapp.rcp.pfs.activity.category"
            name="My Activities Category">
      </category>
      <activity
            id="myapp.rcp.pfs.activity"
            name="My Activity: Disable Workbench Annotation Navigation">
         <enabledWhen>
            <with variable="activePartId">    
               <equals value="com.sequenom.ivd.actitivities.unwantedActionSet">   
               </equals>
            </with>
            <!--
            <reference
                  definitionId="myapp.rcp.pfs.activities.default">
            </reference>
            -->
         </enabledWhen>
      </activity>
      <categoryActivityBinding
            activityId="myapp.rcp.pfs.activity"
            categoryId="myapp.rcp.pfs.activity.category">
      </categoryActivityBinding>
      <!--
      <activityPatternBinding
            activityId="myapp.rcp.pfs.activity"
            pattern="org.eclipse.ui.*[A|a]ctionSet.*">
      -->
      <activityPatternBinding
            activityId="myapp.rcp.pfs.activity"
            pattern="org\.eclipse\.ui\.edit\.text\..*">
      </activityPatternBinding>
      <activityPatternBinding
            activityId="myapp.rcp.pfs.activity"
            pattern="org\.eclipse\.ui\.navigate\..*">
      </activityPatternBinding>
   </extension>

Thumps up guys!
Das war 'ne scwere Geburt!
 

dzim

Top Contributor
Nun ja... Anfangs ist gut... Ich arbeite bereits seit über 2 Jahren mit der API - aber manche Teile sind dann eben doch mal Neuland...
 
K

kdig

Gast
Hallo

ich hoffe ihr könnt mir bei meinem Activity Problem weiterhelfen.
wenn ich meine activity mit einer eine enabledWhen Bedingung wieder aktivieren will erscheint folgende Fehlermeldung:

!ENTRY org.eclipse.ui 2 2 2011-12-01 10:50:50.652
!MESSAGE Perspective Offline Perspective has been made into a local copy

Die Activity soll die offlinePerspective nur anzeigen, wenn der nutzer sich nicht registriert hat. Beim starten gibt es noch keine fehlermeldung. meldet sich der nutzer aber wieder ab kommt die obige Meldung.
Wenn man sich dann noch mal registriert und abmeldet kommt die Exception, dass es keine "corresponding perspective extension" gibt.

<extension
point="org.eclipse.ui.activities">
<activity
id="myApp.activities.offlinePerspective"
name="offline Perspective">
<enabledWhen>
<with
variable="myApp.source.isRegister">
<equals
value="FALSE">
</equals>
</with>
</enabledWhen>

</activity>
<activityPatternBinding
activityId="myApp.activities.offlinePerspective"
pattern="myApp/myApp.offlinePerspective">
</activityPatternBinding>
</extension>

ich hoffe ihr könnt mir weiterhelfen
Gruß
kdig
 

Ähnliche Java Themen


Oben