EditAction, OpenAction nutzbar machen

Alles zu NetBeans als RCP-Platform

Moderator: wegus

Antworten
WeserLinux
Beiträge: 89
Registriert: 16.03.2012, 10:46
Wohnort: Niedersachsen

EditAction, OpenAction nutzbar machen

Beitrag von WeserLinux » 25.11.2014, 14:02

Hallo Zusammen

ich habe eine NB 7.3 Applikation mit einem BeanTreeView im Explorer-Mode, um eine Projekt-Struktur abzubilden. Die einzelnen Nodes (AbstractNodes) des Baumes habe ich mit unterschiedlichen Aktions belegt. Aufgebaut werden die Nodes mit einer ChildFactory<Path>.

Nun möchte ich gerne die existierenden SystemAction EditAction und/oder OpenAction nutzen, um die lesbaren Dateien (z.B. txt) hinter den Nodes im Editor-Bereich zu öffnen. Eingebunden habe ich die SystemAction in der Node Klasse in getActions() mit

Code: Alles auswählen

actions.add(SystemAction.get(OpenAction.class));
actions.add(SystemAction.get(EditAction.class));
Die Actions erscheinen auch im Context-Menü, sind aber disabled. Meine Frage, was muss noch getan werden, damit EditAction und OpenAction einwandfrei ausgeführt werden???

Interessant ist, wenn ich im Project eine Suche nach *.txt Dateien starte (FindAction), kann ich per Doppelklick diese Dateien prima öffnen vom Such-Ergebnis-Fenster aus. Über diesen Weg ist alles alles prima eingerichtet im NB System :)


Danke für eure Hilfe


Olaf

Benutzeravatar
nigjo
Beiträge: 606
Registriert: 08.09.2009, 09:43
Wohnort: Aachen
Kontaktdaten:

Re: EditAction, OpenAction nutzbar machen

Beitrag von nigjo » 26.11.2014, 10:41

Hi

Du brauchst für die OpenAction ein OpenCookie (Tipp: verwende OpenSupport) und für EditAction ein EditCookie im Lookup des Nodes damit die Actions aktiviert werden.

Wenn du beides gleichzeitig verwenden möchtest solltest du dir vielleicht EditorSupport anschauen. Viele Dinge sind auch in der Editor API Übersicht beschrieben.

Gruß
Jens

ps: Du solltest dein eigenes Node als FilterNode implementieren und das OriginalNode des DataObject der Datei als "original" einsetzen. Dann bekommst du den EditorSupport (wie bei dir von *.txt-Dateien) gratis mit dabei.
Man sollte seine Werkzeuge kennen. Ansonsten haut man sich mit dem Hammer nur auf die Finger.

--
NetBeans Certified Engineer - Java Getriebe

WeserLinux
Beiträge: 89
Registriert: 16.03.2012, 10:46
Wohnort: Niedersachsen

Re: EditAction, OpenAction nutzbar machen

Beitrag von WeserLinux » 26.11.2014, 21:25

Hallo Jens,

vielen Dank für die Tipps.

Ganz einfach hat es geklappt, einen neuen Action MyOpenAction für die entsprechenden Datei-Nodes zu bauen und dann einfach

Code: Alles auswählen

import org.openide.cookies.EditCookie;
.
.
Path source =   //Meine Datei....
EditCookie cookie = DataObject.find(FileUtil.toFileObject(source.toFile())).getCookie(EditCookie.class);
 if (cookie != null) {
 	cookie.edit();
 }
auszuführen. Klappt super. Oder habe ich mir da etwas zu einfach gemacht?

Was ist eigentlich der Unterschied zwischen EditCookie und OpenCookie? Bei der Ausführung sieht das Ergebnis (die im Editor-Mode geöffnete Datei) ziemlich gleich aus.

Danke nochmal

Olaf

Benutzeravatar
nigjo
Beiträge: 606
Registriert: 08.09.2009, 09:43
Wohnort: Aachen
Kontaktdaten:

Re: EditAction, OpenAction nutzbar machen

Beitrag von nigjo » 27.11.2014, 08:20

WeserLinux hat geschrieben:Klappt super. Oder habe ich mir da etwas zu einfach gemacht?
Um ehrlich zu sein: Ja.

Du bastelst dir eine eigene Fickellösung für etwas, das bereits in "besserer" Form verfügbar ist. Du solltest dir keine eigene Action erstellen mit der du dann doch wieder das machst, was das EditCookie im Lookup deines Nodes schon automatisch macht. Das ganze sollte eigentlich auch funktionieren ohne dass du eine eigene Klasse erstellen musst.

Im nicht aneinander vorbei zu reden versuche ich mal zu beschreiben, was du bisher hast:

1. Du hast für Textdateien (*.txt) einen eigenen Node in dem du getActions überschrieben hast.
2. Ich vermute mal, dass dein Node von AbstractNode oder BeanNode abgeleitet ist.
3. Der Node hat kein oder ein minimales Lookup.

Was ich an dieser Konstellation ändern würde ist auf jeden Fall die Node-Klasse. Leite deine Nodeklasse von FilterNode ab. Dem Konstruktor übergibst du den Node der Textdatei

Code: Alles auswählen

Node org = DataObject.find(textFileObject).getNodeDelegate();
MeinTextNode node = new MeinTextNode(org);
Wenn du eigenen Actions brauchst kannst du auch einfach getActions überschreiben und deine Action ergänzen.

Code: Alles auswählen

public class MeinTextNode extends FilterNode {
  public MeinTextNode(Node original){
    super(original);
  }
  @Override
  public Action[] getActions(boolean context) {
    List<Action> actions = new ArrayList<>();
    actions.addAll(Arrays.asList(super.getActions(context)));
    
    //add Separator
    actions.add(null);
    actions.add(new MeineSonstigeAction());
    
    return actions.toArray(new Action[actions.size()]);
  }
}
Damit brauchst du dich um OpenCookie bzw. EditCookie keine Gedanken mehr zu machen, weil das alles schon vom Original-Node erschlagen wird.
WeserLinux hat geschrieben:Was ist eigentlich der Unterschied zwischen EditCookie und OpenCookie? Bei der Ausführung sieht das Ergebnis (die im Editor-Mode geöffnete Datei) ziemlich gleich aus.
Einen EditCookie brauchst du für die EditAction, damit diese im Kontextmenü als aktiv angezeigt wird. Er öffnet (in der Regel) einen textbasierten Editor wie man ihn aus der IDE her kennt. Das OpenCookie brauchst du für die OpenAction um diese zu aktivieren. Was tatsächlich in diesen "Cookies" (ober nach den neueren Begriffsdefinitionen "Capabilities") passiert ist sehr unterschiedlich. Wenn sich beim "öffnen" der Texteditor zeigen soll werden EditAction und OpenAction sehr wahrscheinlich das gleiche machen. Aber wenn du dir zum Beispiel properties-Dateien oder auch Swing-Panel die mit dem Matisse-Editor erstellt wurden anschaust, wirst du feststellen, dass "open" und "edit" durchaus unterschiedliche Ansichten einer Datei öffnen können.

Wenn "open" und "edit" das Gleiche machen würde ich mir einfach die "edit"-Action sparen da sie keinen Mehrwert hat.

Gruß
Jens
Man sollte seine Werkzeuge kennen. Ansonsten haut man sich mit dem Hammer nur auf die Finger.

--
NetBeans Certified Engineer - Java Getriebe

Antworten