<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:foaf="http://xmlns.com/foaf/0.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns="http://purl.org/rss/1.0/">
  <channel rdf:about="http://www.planetnetbeans.org/de/">
    <title>Planet NetBeans</title>
    <link>http://www.planetnetbeans.org/de/</link>
    <description>Planet NetBeans - http://www.planetnetbeans.org/de/</description>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////source_talk_tage_2008_in_goettingen/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////php_welche_ide_wird_es_werden/index.html" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/continuous_integration_im_kampf_gegen" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/glassfish_vortrag_in_berlin" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_autoupdatecenter_per_ant_script_updaten_teil_ii/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_platform_uebersetzung_als_plugin/not_cached/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_platform_uebersetzung_als_plugin/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_access_warnungen_in_wrapper_bibliotheken_deaktiveren/not_cached/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_access_warnungen_in_wrapper_bibliotheken_deaktiveren/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////-1e9d96439e/not_cached/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////-1e9d96439e/index.html" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/ejb_artikel_im_javaspektrum" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_vorbelegen_von_optionseigenschaften_des_autoupdater/not_cached/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_vorbelegen_von_optionseigenschaften_des_autoupdater/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_neustart_der_netbeans_platform/not_cached/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_neustart_der_netbeans_platform/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_branding_shortcuts_oder_keymap/not_cached/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_branding_shortcuts_oder_keymap/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_nodeaction_und_selection_management/not_cached/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_nodeaction_und_selection_management/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_minimaler_einsatz_fuer_drag_and_drop_von_nodes/not_cached/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_minimaler_einsatz_fuer_drag_and_drop_von_nodes/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_notfall_branding_nb_61_plattform_zu_90_auf_deutsch/not_cached/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_notfall_branding_nb_61_plattform_zu_90_auf_deutsch/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_topcomponent_und_paletten_wie_ich_sie_zusammen_brachte/not_cached/index.html" />
        <rdf:li rdf:resource="http://www.jroller.com/berni/entry/netbeans_6_1_beta" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/software_quality_environment_f%C3%BCr_netbeans" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/deutsche_lokalisierung_von_netbeans_6" />
        <rdf:li rdf:resource="http://www.jroller.com/berni/entry/package_templates" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/netbeans_day_in_z%C3%BCrich" />
        <rdf:li rdf:resource="http://karussell.wordpress.com/?p=38" />
        <rdf:li rdf:resource="http://www.jroller.com/beaver/entry/nugm_vortrag_leichtgewichtige_java_ee" />
        <rdf:li rdf:resource="http://karussell.wordpress.com/?p=35" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/java_ee_h%C3%A4resie" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/nug" />
        <rdf:li rdf:resource="http://karussell.wordpress.com/2008/01/13/kein-editor-in-netbeans/" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/weihnachtsgeschenk_fuer_netbeans_fan_gesucht" />
        <rdf:li rdf:resource="http://www.jroller.com/beaver/entry/netbeans_day_2007_in_frankfurt" />
        <rdf:li rdf:resource="http://karussell.wordpress.com/2007/12/09/tastaturkurzel-fur-netbeans-60/" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/netbeans_tag_in_frankfurt" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////magic_13949712720901forosx/not_cached/index.html" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/kommich_jetzim_fernseh" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////meine_lieblings_tastenkuerzel_in_netbeans_60/not_cached/index.html" />
        <rdf:li rdf:resource="http://www.sepix.de/blogs/blogrittner/blog/archive////update_auf_leisen_sohlen_rc1/not_cached/index.html" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/kostenloses_plattformbuchkapitel" />
        <rdf:li rdf:resource="http://www.jroller.com/berni/entry/my_top_netbeans_plugins" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/subversive_elemente_in_m%C3%BCnchen" />
        <rdf:li rdf:resource="http://www.jroller.com/berni/entry/depend_target_int_netbeans" />
        <rdf:li rdf:resource="http://www.jroller.com/beaver/entry/jboss_4_2_x_server" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/ides_tomaten_und_faule_eier1" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/java_im_bierglas_mit_lederhosen" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/ides_tomaten_und_faule_eier" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/netbeans_tag_in_z%C3%BCrich" />
        <rdf:li rdf:resource="http://www.jroller.com/berni/entry/pmd_more_rules_2" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/leinen_los_f%C3%BCr_die_deutsche" />
        <rdf:li rdf:resource="http://www.jroller.com/berni/entry/pmd_custom_ruleset" />
        <rdf:li rdf:resource="http://www.jroller.com/berni/entry/find_keys" />
        <rdf:li rdf:resource="http://www.jroller.com/berni/entry/build_script_for_grails_application" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/netbeans_day_z_uuml_rich" />
        <rdf:li rdf:resource="http://blogs.sun.com/seapegasus/entry/jax_07_in_wiesbaden" />
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////source_talk_tage_2008_in_goettingen/index.html">
    <title>JNBB - Joschs NetBeans Blog: Source Talk Tage 2008 in Göttingen</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////source_talk_tage_2008_in_goettingen/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;&lt;img src="http://www.sepix.de/blogs/blogrittner/uploads/RTEmagicC_0323011faf.jpg.jpg" alt="" height="112" width="600" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Dieses Jahr ist es wieder soweit. Die &lt;a title="Source Talk Tage 2008" href="http://www.sourcetalk.de/2008/programm.php" target="_blank" class="external-link-new-window"&gt;Source Talk Tage&lt;/a&gt; im Mathematischen Institut in Göttingen laufen an. Von Dienstag, 23. September bis Donnerstag,
    25. September 2008 gibt es wieder spannende Themen wie eLearning, OpenSolaris und Java. &lt;/p&gt; &lt;p class="bodytext"&gt;Es werden einige "bekannte Gesichter" rund um die Blog Scene der NetBeans Community anwesend sein. &lt;a title="Blog" href="http://blogs.sun.com/roumen/" target="_blank" class="external-link-new-window"&gt;Roman Strobl&lt;/a&gt; (er war schon mal mit Geertjan da) will uns zeigen, was OpenSolaris als Betriebssystem so spannend macht und &lt;a title="Blog"
    href="http://eppleton.com/blog/?cat=3" target="_blank" class="external-link-new-window"&gt;Anton Epple&lt;/a&gt; führt in die RCP Programmierung mit NetBeans 6.5 ein. &lt;/p&gt; &lt;p class="bodytext"&gt;Ich selbst werde auch am Mittwoch und Donnerstag rein schauen. Würde mich freuen eine volles Haus vorzufinden :-) &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt;</content:encoded>
    <dc:date>2008-08-28T16:20:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////php_welche_ide_wird_es_werden/index.html">
    <title>JNBB - Joschs NetBeans Blog: PHP - welche IDE wird es werden?</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////php_welche_ide_wird_es_werden/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Nun ist es raus, &lt;a title="Opens external link in new window" href="http://www.eclipse.org/pdt/" target="_blank" class="external-link-new-window"&gt;PDT for Eclipse&lt;/a&gt; wird auf Dezember verschoben. Zu viele Probleme sind da gewachsen und das PDT soll produktiv noch nicht einsetzbar sein. &lt;/p&gt; &lt;p class="bodytext"&gt;Vernünftige PHP-Entwicklungsumgebungen gab es ja bisher noch gar nicht (meine persönliche Meinung). Nur &lt;a title="Opens
    external link in new window" href="http://www.zend.com/de/" target="_blank" class="external-link-new-window"&gt;Zend&lt;/a&gt; bot etwas an. Einige IDEs boten Integrationen an, die meistens über das Syntax Highlighting nicht hinauskamen und als Höhepunkt gerade mal eine Verknüpfung zur Online Doku boten. &lt;/p&gt; &lt;p class="bodytext"&gt;Mit &lt;a title="NetBeans PHP 6.5 Infos" href="http://wiki.netbeans.org/NewAndNoteWorthyMilestone2NB65#section-NewAndNoteWorthyMilestone2NB65-PHP" target="_blank"
    class="external-link-new-window"&gt;NetBeans&lt;/a&gt; erwächst langsam vielleicht ein Licht am Streifen des Horizonts nach der Sonnenfinsternis ;-) - Es mag noch nicht so viele Features geben wie in Eclipse PDT, doch eines kristalisiert sich heraus: Das was geht wirkt robust, einheitlich und sauber in die IDE integriert. &lt;/p&gt; &lt;p class="bodytext"&gt;PHP ist nicht meine Primärsprache, aber NetBeans ist inzwischen auch für PHP meine Primär-IDE geworden. Dank an die Entwickler, die das Projekt so
    voran treiben. &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;br /&gt;Beste Grüße,&lt;br /&gt;&#160; Josch. &lt;/p&gt; &lt;p class="bodytext"&gt;Links: &lt;a title="Code templates in PHP" href="http://blogs.sun.com/netbeansphp/entry/generate_constructor_getters_and_setters" target="_blank" class="external-link-new-window"&gt;Code templates in PHP&lt;/a&gt;, &lt;a title="Semantic coloring in PHP" href="http://blogs.sun.com/netbeansphp/entry/improving_semantic_coloring_continue" target="_blank"
    class="external-link-new-window"&gt;Semantic(!) coloring&lt;/a&gt;, &lt;a title="FTP support in PHP Projects" href="http://blogs.sun.com/netbeansphp/entry/ftp_support_added" target="_blank" class="external-link-new-window"&gt;FTP support&lt;/a&gt;, &lt;a title="Free PHP interpreter in project" href="http://blogs.sun.com/netbeansphp/entry/project_specific_php_interpreter_possible" target="_blank" class="external-link-new-window"&gt;PHP Interpreter frei wählbar&lt;/a&gt; &lt;/p&gt; &lt;p
    class="bodytext"&gt;&#160;&lt;/p&gt;</content:encoded>
    <dc:date>2008-08-28T15:48:00+00:00</dc:date>
  </item>
  <item rdf:about="http://blogs.sun.com/seapegasus/entry/continuous_integration_im_kampf_gegen">
    <title>Seapegasus Blog: Continuous Integration Im Kampf Gegen Den Golem</title>
    <link>http://blogs.sun.com/seapegasus/entry/continuous_integration_im_kampf_gegen</link>
    <content:encoded>&lt;p&gt; Es ist vielleicht eine vergessene Tatsache, aber wenn bei NetBeans ein Engineer es schafft, trotz aller Tests und Checks die Build zu vermurksen, dann wird derjenige zur Strafe von dem furchterregenden &lt;a href="http://weblogs.java.net/blog/timboudreau/archive/2006/03/the_netbeans_go.html"&gt;Prager Golem&lt;/a&gt; heimgesucht! (Nein, ich weiss nicht wer ihn gerade zu Besuch hat, wir harmlosen Tech Writer machen ja nie nie nie was an der Build kaputt... :-D)
    &lt;/p&gt;&lt;p&gt; Hat Eure Firma auch so nette Traditionen? Falls Ihr Euch für Eure wachsenden Team-Projekte gerade nach Werkzeugen für automatisierte Builds und automatisierte Tests umseht, dann lege ich Euch diesen Vortrag zum Stichwort &lt;a href="http://de.wikipedia.org/wiki/Kontinuierliche_Integration"&gt;Permanente Integration&lt;/a&gt; ans Herz: &lt;/p&gt; &lt;blockquote&gt;In München findet am 19. September das erste &lt;b&gt;Continuous Integration Camp&lt;/b&gt; statt. Veranstalter ist die
    &lt;b&gt;NetBeans User Gruppe der JUG München&lt;/b&gt;. Mit dem Meeting wollen wir die Möglichkeit zum Erfahrungsaustausch und zu Diskussionen darüber bieten, was möglich und was sinnvoll ist. &lt;a href="http://haug-server.dyndns.org/confluence/display/NUGM/Continuous+Integration+Camp"&gt;Weitere Informationen findet Ihr im WIKI der JUGM&lt;/a&gt;.&lt;/blockquote&gt; &lt;p&gt;Es gibt einen Vortrag von Toni Epple und eine konkrete Fallstudie. Einfach per Email anmelden und dann am 19.9. (Freitag
    Nachmittag) ab nach Heimstetten. Gebt dem Golem keine Chance! ;-)&lt;/p&gt;</content:encoded>
    <dc:date>2008-08-27T15:23:05+00:00</dc:date>
  </item>
  <item rdf:about="http://blogs.sun.com/seapegasus/entry/glassfish_vortrag_in_berlin">
    <title>Seapegasus Blog: GlassFish-Vortrag in Berlin</title>
    <link>http://blogs.sun.com/seapegasus/entry/glassfish_vortrag_in_berlin</link>
    <content:encoded>&lt;p&gt;Wie &lt;a href="http://blogs.sun.com/arungupta/"&gt;Arun&lt;/a&gt; schon auf Englisch angekündigt hat, gibt es im September einen &lt;a href="http://blogs.sun.com/arungupta/entry/glassfish_berlin_brandenburg_jug_and"&gt;Vortrag über den GlassFish Application Server&lt;/a&gt; zusammen mit der Berlin-Brandenburg JUG.&lt;/p&gt; &lt;p&gt; Mittwoch, 3. September&lt;br /&gt; 17:30 - ca. 19:30&lt;br /&gt; Zimmer FR5516, Technische Universität Berlin&lt;br /&gt; Franklinstrasse 28/29
    (&lt;a href="http://maps.google.de/maps?f=q&amp;amp;hl=de&amp;amp;geocode=&amp;amp;q=franklinstr,+28+berlin&amp;amp;sll=51.151786,10.415039&amp;amp;sspn=8.32859,26.345215&amp;amp;ie=UTF8&amp;amp;z=16&amp;amp;iwloc=addr"&gt;Stadtplan&lt;/a&gt;)&lt;br /&gt; 10587 Berlin&lt;br /&gt; &lt;/p&gt; &lt;p&gt;Bitte &lt;a href="https://www.xing.com/app/events?op=detail;id=240568"&gt;meldet Euch vorher via XING&lt;/a&gt; an! Dort findet Ihr auch die &lt;a
    href="https://www.xing.com/app/events?op=detail;id=240568"&gt;Beschreibung&lt;/a&gt;. Arun hält den Vortrag auf Englisch.&lt;/p&gt;</content:encoded>
    <dc:date>2008-08-22T13:54:07+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_autoupdatecenter_per_ant_script_updaten_teil_ii/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: AutoUpdateCenter per Ant-Script updaten - Teil II</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_autoupdatecenter_per_ant_script_updaten_teil_ii/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Ich hatte vergangenen Monat darüber &lt;a href="http://www.sepix.de/blogs/blogrittner/blog/archive/2008/july/31/-1e9d96439e/index.html" class="external-link-new-window" title="AutoUpdate Dateien automatisch kopieren"&gt;berichtet&lt;/a&gt;, wie man ein UpdateCenter automatisch per Ant-Script über ftp auf den Server pushen kann. &lt;/p&gt; &lt;p class="bodytext"&gt;Ich hatte da schon Bedenken geäußert das ftp-Kennwort im Build-Script zu hinterlegen und zeigte
    die Möglichkeit auf das Kennwort in den private.properties einzupflegen. Damit fließt das Kennwort nicht in die Versionierung und bleibt (so lange lokal kein fremder Zugriff besteht) geheim. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man das Kennwort gar nicht speichern will, gibt es den input-Task, mit dem das Ant-Script stoppt, ein Abfrage-Diaolg startet und damit das Kennwort setzen kann. &lt;/p&gt; &lt;p class="bodytext"&gt;Man braucht nur drei Zeilen dem Build-Script hizuzufügen und das Target
    distribute-dev bei depends anpassen: &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;/p&gt;&lt;div class="indent"&gt;&lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="-distribute-prompt-for-ftppass" unless="dev.ftp.password"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;input addproperty="dev.ftp.password" message="Kennwort für das Update-Center:"/&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/target&gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;target name="distribute-dev"
    depends="-distribute-prompt-for-ftppass" description="Distributes to developers and testers"&gt;&lt;/pre&gt; &lt;p&gt;&lt;/p&gt; &lt;p class="bodytext"&gt;Das war es auch schon. Wenn das Kennwort nicht in einer Property-Datei hinterlegt wurde, kommt der Dialog.&#160;Bei richtig hinterlegtem Kennwort oder bei korrekter Eingabe wird dann alles notwendige auf den Server kopiert. &lt;/p&gt; &lt;p class="bodytext"&gt;Man sollte nur beachten, dass die Kennworteingabe nicht durch ein Password-Field erfolgt.
    D.h. bei der Eingabe sieht man das Kennwort! &lt;/p&gt; &lt;p class="bodytext"&gt;Mit einem eigenen InputHandler wäre das lösbar. &lt;a title="Sourceforge Projekt für einen Ant InputHandler" href="https://sourceforge.net/project/showfiles.php?group_id=103509" target="_blank" class="external-link-new-window"&gt;Hier findet sich eine Quelle&lt;/a&gt;, die einen PasswordInputHandler implementiert hat (Download-Datei ist antinput.zip). &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160;
    Josch.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content:encoded>
    <dc:date>2008-08-08T07:29:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_platform_uebersetzung_als_plugin/not_cached/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: Plattform Übersetzung als Plugin</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_platform_uebersetzung_als_plugin/not_cached/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Wie ich schon in einem &lt;a href="http://www.sepix.de/blogs/blogrittner/blog/archive/2008/june/20/beandev_notfall_branding_nb_61_plattform_zu_90_auf_deutsch/index.html" class="external-link-new-window" title="BeanDev: Notfall-Branding - NB 6.1 Plattform zu 90% auf Deutsch"&gt;älteren Blog-Eintrag&lt;/a&gt; geschrieben hatte, ist es möglich eine Programm-Suite mit einem Branding so zu versehen, dass man eine Übersetzung der Plattform hat. &lt;/p&gt; &lt;p
    class="bodytext"&gt;Bei dem Verfahren gibt es einen bedeutenden Nachteil: Nur per ZIP-Distribution wird die Übersetzung installiert. Der Anwender kann nicht darüber entscheiden, ob er diese Sprache haben will und kann das auch nicht zurücknehmen (außer er löscht die JAR-Dateien aus dem ./locale-Ordner. &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;a title="Tonny Kohars Blog" href="http://blogs.kiyut.com/tonny/" target="_blank" class="external-link-new-window"&gt;Tonny Kohar&lt;/a&gt; zeigt in seinem Blog,
    wie man &lt;a title="Netbeans platform localization as plugins" href="http://blogs.kiyut.com/tonny/2008/08/06/netbeans-platform-localization-as-plugins/" target="_blank" class="external-link-new-window"&gt;für eigene Projekte ein Plugin&lt;/a&gt; erstellen kann, um eine Sprachvariante installierbar zu machen. &lt;/p&gt; &lt;p class="bodytext"&gt;Das beschriebene Build-Script ist aber sehr auf das Projekt zugeschnitten und skizziert nur den Aufbau. Ich habe mich mal der Sache angenommen und ein
    Build-Script erstellt, dass generell für alle Projekte verwendet werden kann. Außerdem halte ich mich an die Suite-Branding Konvention die lokalisierten Bundle.properties im branding-Ordner (und nicht unter src) zu halten. Das vereinfacht die Integration in das bestehende Build-System von NetBeans. &lt;/p&gt; &lt;p class="bodytext"&gt;Wie Tonny auch schon schreibt, reicht es, erst ein normales Modul zu erstellen. Ich gebe dem Modul immer den Namen der Suite mit der Endung -l10n.Ggf. kann man aber auch
    das Sprachkennzeichen verwenden (z.B. deDE), damit man später unterschieldiche Übersetzungen in getrennten Installationen anbieten kann. &lt;/p&gt; &lt;p class="bodytext"&gt;In der Files Ansicht des Explorers lege ich dann den branding-Ordner an. Im Gegensatz zur Suite wird der branding-Ordner in einem Module nicht automatisch vom Build-Script erkannt. Suite-Projekte starten ein speziellen Build-Abschnitt, wenn der branding-Ordner existiert. &lt;/p&gt; &lt;p class="bodytext"&gt;Unter dem
    branding-Ordner werden nun die Abschnitte der Übersetzungen für die Module abgelegt. Core weicht da ein wenig vom Standard ab, aber die Modul-Übersetzungen der Plattform heißen vom Ordner immer wie die zu erzeugenden Übersetzungs-JAR-Dateien: &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;img src="http://www.sepix.de/fileadmin/l10n-proj-aufbau.JPG" alt="" height="425" width="389" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Unter core und modules werden nun für die Platform-Module die
    Bundle_xx_XX.properties-Dateien, ein paar Helpset-Dateien und Bildchen eingefügt. Ich hatte schon mal was vorbereitet (allerdings ohne _de_DE-Anhängsel an den Bundle-Dateien): Ein ZIP-Archiv &lt;a href="http://www.sepix.de/fileadmin/modules.zip" class="download" title="Initiates file download"&gt;findet sich hier&lt;/a&gt;. &lt;/p&gt; &lt;p class="bodytext"&gt;Im Prinzip sollte es so aussehen: &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;img src="http://www.sepix.de/fileadmin/l10n-proj-aufbau-details.JPG"
    alt="" height="554" width="363" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Jetzt geht es ans Eingemachte. Das Build-Script muss erweitert werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Dafür nun Build.xml öffnen (findet sich am schnellsten in der Projektansicht unter Important Files). &lt;/p&gt; &lt;p class="bodytext"&gt;Direkt unter dem ersten import geht es los. Zunächst benötigen wir die Eigenschaften aus dem Suite-Projekt, damit wir den Application-Namen bekommen: &lt;/p&gt; &lt;pre&gt;&#160; &#160;
    &amp;lt;property file="${suite.dir}/nbproject/project.properties" prefix="prjsuite"/&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Dann erzeugen wir ein kleines Makro, damit die Tipparbeit für die Module nicht ausufert: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;macrodef name="sub-jar"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;attribute name="dep"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;attribute name="module" default="modules"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;
    &amp;lt;sequential&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;jar jarfile="${locale.dir}/@{dep}_${app.name}.jar" compress="${build.package.compress}"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset dir="branding/@{module}/@{dep}.jar/"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/jar&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;/sequential&gt;&lt;br /&gt;&#160;&#160;&#160;
    &amp;lt;/macrodef&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Nun&#160; hängen wir uns in das Target build-init ein, um zwei Variablen zu füllen: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="build-init" depends="harness.build-init"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;property name="locale.dir" value="${basedir}/build/cluster/modules/locale/"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;property name="app.name" value="${prjsuite.app.name}"/&gt;&lt;br
    /&gt;&#160;&#160;&#160; &amp;lt;/target&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Dabei ist locale.dir das Zielverzeichnis für die Übersetzungen und app.name holt sich einfach den Wert aus den Suite-Properties. &lt;/p&gt; &lt;p class="bodytext"&gt;Nun hängen wir uns in das jar-Target, erzeugen das locale.dir und basteln schon für das core.jar die erste Übersetzung. Da kann ich das Makro nicht verwenden, weil der Zielname der Übersetzung anders als die JAR-Datei heißen soll: &lt;/p&gt;
    &lt;pre&gt;&#160;&#160; &amp;lt;target name="jar" depends="projectized-common.jar"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;mkdir dir="${locale.dir}"/&gt;&lt;br /&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;!-- Sonderbehandlung für das core-package --&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;jar jarfile="${locale.dir}/org-netbeans-core_${app.name}.jar" compress="${build.package.compress}"&gt;&lt;br
    /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset dir="branding/core/core.jar/"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/jar&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Nun folgen die restlichen Übersetzungen aus dem modules-Ordner. Das funktioniert sehr gut mit dem Makro. Hier ein Auszug: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;!-- Lokalisierung für die modules packages --&gt;&lt;br
    /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;sub-jar dep="org-jdesktop-layout"/&gt; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;sub-jar dep="org-netbeans-api-progress"/&gt; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;sub-jar dep="org-netbeans-api-visual"/&gt; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;sub-jar dep="org-netbeans-core-execution"/&gt; &lt;/pre&gt; &lt;p class="bodytext"&gt;Als letztes in diesem Target kopiere ich die
    fertigen Archive in das Suite-Projekt. Das ist nicht unbedingt notwendig, erleichtert aber das Erstellen von ZIP-Distributionen mit fertig übersetzten Archiven: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;!-- Kopieren der JAR-Dateien in das Suite locale Verzeichnis--&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;copy todir="${cluster}/modules/locale/" &gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset
    dir="${locale.dir}"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;exclude name="${module.jar.basename}"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/fileset&gt;&#160;&#160;&#160; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/copy&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/target&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Somit ist zumindest die Erstellung der übersetzten
    Dateien automatisiert in ein extra Modul implementiert. Aber installierbar ist das noch nicht. Ich verlasse mich da ganz auf die Fähigkeiten von Tonny und übernehme sein erweitertes Target nbm: &lt;/p&gt; &lt;pre&gt; &amp;lt;target name="nbm" depends="projectized-common.nbm"&gt;&lt;br /&gt; &amp;lt;property name="nbm-expand" value="nbm-expand"/&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- 1: NBM Datei extrahieren --&gt;&lt;br /&gt; &amp;lt;unjar src="build/${nbm}" dest="build/${nbm-expand}"&gt;&lt;br /&gt;
    &amp;lt;patternset&gt;&lt;br /&gt; &amp;lt;exclude name="META-INF/**"/&gt;&lt;br /&gt; &amp;lt;/patternset&gt;&lt;br /&gt; &amp;lt;/unjar&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- 2: Übersetzugen in den passenden Ordner packen --&gt;&lt;br /&gt; &amp;lt;copy todir="build/${nbm-expand}/netbeans/modules/locale/" &gt;&lt;br /&gt; &amp;lt;fileset dir="${cluster}/modules/locale/" /&gt;&lt;br /&gt; &amp;lt;/copy&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- 3: Nun wieder als JAR zusammensetzen --&gt;&lt;br /&gt;
    &amp;lt;jar jarfile="build/${nbm}" compress="true"&gt;&lt;br /&gt; &amp;lt;fileset dir="build/${nbm-expand}" /&gt;&lt;br /&gt; &amp;lt;/jar&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- 4: Signieren, wenn gewünscht --&gt;&lt;br /&gt; &amp;lt;antcall target="sign-nbm" /&gt;&lt;br /&gt; &amp;lt;/target&gt;&#160;&#160;&#160; &lt;/pre&gt; &lt;p class="bodytext"&gt;Für das optionale Signieren fehlt noch: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="sign-nbm" if="keystore"&gt;&lt;br
    /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;signjar jar="build/${nbm}" keystore="${keystore}" storepass="${storepass}" alias="${nbm_alias}" /&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/target&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Und das war es auch schon! &lt;/p&gt; &lt;p class="bodytext"&gt;Das Modul kann nun ganz normal im Update-Center publiziert werden. Es können weitere Sprachen hinzugefügt werden. Nur funktioniert es nicht, dass man mehrere Module mit unterschiedlichen Sprachen
    installieren kann. Dazu müsste man das Makro umprogrammieren und dort ein Lokalisierungskennzeichen (z.B. _deDE) hinzufügen: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;jar jarfile="${locale.dir}/@{dep}_${app.name}_deDE.jar" compress="${build.package.compress}"&gt;&lt;br /&gt; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset dir="branding/@{module}/@{dep}.jar/"/&gt;&lt;br /&gt; &#160;&#160;&#160;&#160;&#160;&#160;
    &amp;lt;/jar&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Vielleicht kann man sich dazu auch ein Symbol in den project.properties anlegen. Man darf nur die Sonderbehandlung von core.jar nicht vergessen! &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;&lt;a href="http://www.sepix.de/fileadmin/build.xml" class="download" title="Initiates file download"&gt;Hier noch mal das komplette Build.xml Script&lt;/a&gt;, wo alle Module der NetBeans-Plaform übersetzt werden. &lt;/p&gt;
    &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;/p&gt;</content:encoded>
    <dc:date>2008-08-07T05:27:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_platform_uebersetzung_als_plugin/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: Plattform Übersetzung als Plugin</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_platform_uebersetzung_als_plugin/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Wie ich schon in einem &lt;a href="http://www.sepix.de/blogs/blogrittner/blog/archive/2008/june/20/beandev_notfall_branding_nb_61_plattform_zu_90_auf_deutsch/index.html" class="external-link-new-window" title="BeanDev: Notfall-Branding - NB 6.1 Plattform zu 90% auf Deutsch"&gt;älteren Blog-Eintrag&lt;/a&gt; geschrieben hatte, ist es möglich eine Programm-Suite mit einem Branding so zu versehen, dass man eine Übersetzung der Plattform hat. &lt;/p&gt; &lt;p
    class="bodytext"&gt;Bei dem Verfahren gibt es einen bedeutenden Nachteil: Nur per ZIP-Distribution wird die Übersetzung installiert. Der Anwender kann nicht darüber entscheiden, ob er diese Sprache haben will und kann das auch nicht zurücknehmen (außer er löscht die JAR-Dateien aus dem ./locale-Ordner. &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;a title="Tonny Kohars Blog" href="http://blogs.kiyut.com/tonny/" target="_blank" class="external-link-new-window"&gt;Tonny Kohar&lt;/a&gt; zeigt in seinem Blog,
    wie man &lt;a title="Netbeans platform localization as plugins" href="http://blogs.kiyut.com/tonny/2008/08/06/netbeans-platform-localization-as-plugins/" target="_blank" class="external-link-new-window"&gt;für eigene Projekte ein Plugin&lt;/a&gt; erstellen kann, um eine Sprachvariante installierbar zu machen. &lt;/p&gt; &lt;p class="bodytext"&gt;Das beschriebene Build-Script ist aber sehr auf das Projekt zugeschnitten und skizziert nur den Aufbau. Ich habe mich mal der Sache angenommen und ein
    Build-Script erstellt, dass generell für alle Projekte verwendet werden kann. Außerdem halte ich mich an die Suite-Branding Konvention die lokalisierten Bundle.properties im branding-Ordner (und nicht unter src) zu halten. Das vereinfacht die Integration in das bestehende Build-System von NetBeans. &lt;/p&gt; &lt;p class="bodytext"&gt;Wie Tonny auch schon schreibt, reicht es, erst ein normales Modul zu erstellen. Ich gebe dem Modul immer den Namen der Suite mit der Endung -l10n.Ggf. kann man aber auch
    das Sprachkennzeichen verwenden (z.B. deDE), damit man später unterschieldiche Übersetzungen in getrennten Installationen anbieten kann. &lt;/p&gt; &lt;p class="bodytext"&gt;In der Files Ansicht des Explorers lege ich dann den branding-Ordner an. Im Gegensatz zur Suite wird der branding-Ordner in einem Module nicht automatisch vom Build-Script erkannt. Suite-Projekte starten ein speziellen Build-Abschnitt, wenn der branding-Ordner existiert. &lt;/p&gt; &lt;p class="bodytext"&gt;Unter dem
    branding-Ordner werden nun die Abschnitte der Übersetzungen für die Module abgelegt. Core weicht da ein wenig vom Standard ab, aber die Modul-Übersetzungen der Plattform heißen vom Ordner immer wie die zu erzeugenden Übersetzungs-JAR-Dateien: &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;img src="http://www.sepix.de/fileadmin/l10n-proj-aufbau.JPG" alt="" height="425" width="389" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Unter core und modules werden nun für die Platform-Module die
    Bundle_xx_XX.properties-Dateien, ein paar Helpset-Dateien und Bildchen eingefügt. Ich hatte schon mal was vorbereitet (allerdings ohne _de_DE-Anhängsel an den Bundle-Dateien): Ein ZIP-Archiv &lt;a href="http://www.sepix.de/fileadmin/modules.zip" class="download" title="Initiates file download"&gt;findet sich hier&lt;/a&gt;. &lt;/p&gt; &lt;p class="bodytext"&gt;Im Prinzip sollte es so aussehen: &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;img src="http://www.sepix.de/fileadmin/l10n-proj-aufbau-details.JPG"
    alt="" height="554" width="363" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Jetzt geht es ans Eingemachte. Das Build-Script muss erweitert werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Dafür nun Build.xml öffnen (findet sich am schnellsten in der Projektansicht unter Important Files). &lt;/p&gt; &lt;p class="bodytext"&gt;Direkt unter dem ersten import geht es los. Zunächst benötigen wir die Eigenschaften aus dem Suite-Projekt, damit wir den Application-Namen bekommen: &lt;/p&gt; &lt;pre&gt;&#160; &#160;
    &amp;lt;property file="${suite.dir}/nbproject/project.properties" prefix="prjsuite"/&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Dann erzeugen wir ein kleines Makro, damit die Tipparbeit für die Module nicht ausufert: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;macrodef name="sub-jar"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;attribute name="dep"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;attribute name="module" default="modules"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;
    &amp;lt;sequential&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;jar jarfile="${locale.dir}/@{dep}_${app.name}.jar" compress="${build.package.compress}"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset dir="branding/@{module}/@{dep}.jar/"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/jar&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;/sequential&gt;&lt;br /&gt;&#160;&#160;&#160;
    &amp;lt;/macrodef&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Nun&#160; hängen wir uns in das Target build-init ein, um zwei Variablen zu füllen: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="build-init" depends="harness.build-init"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;property name="locale.dir" value="${basedir}/build/cluster/modules/locale/"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;property name="app.name" value="${prjsuite.app.name}"/&gt;&lt;br
    /&gt;&#160;&#160;&#160; &amp;lt;/target&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Dabei ist locale.dir das Zielverzeichnis für die Übersetzungen und app.name holt sich einfach den Wert aus den Suite-Properties. &lt;/p&gt; &lt;p class="bodytext"&gt;Nun hängen wir uns in das jar-Target, erzeugen das locale.dir und basteln schon für das core.jar die erste Übersetzung. Da kann ich das Makro nicht verwenden, weil der Zielname der Übersetzung anders als die JAR-Datei heißen soll: &lt;/p&gt;
    &lt;pre&gt;&#160;&#160; &amp;lt;target name="jar" depends="projectized-common.jar"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;mkdir dir="${locale.dir}"/&gt;&lt;br /&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;!-- Sonderbehandlung für das core-package --&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;jar jarfile="${locale.dir}/org-netbeans-core_${app.name}.jar" compress="${build.package.compress}"&gt;&lt;br
    /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset dir="branding/core/core.jar/"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/jar&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Nun folgen die restlichen Übersetzungen aus dem modules-Ordner. Das funktioniert sehr gut mit dem Makro. Hier ein Auszug: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;!-- Lokalisierung für die modules packages --&gt;&lt;br
    /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;sub-jar dep="org-jdesktop-layout"/&gt; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;sub-jar dep="org-netbeans-api-progress"/&gt; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;sub-jar dep="org-netbeans-api-visual"/&gt; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;sub-jar dep="org-netbeans-core-execution"/&gt; &lt;/pre&gt; &lt;p class="bodytext"&gt;Als letztes in diesem Target kopiere ich die
    fertigen Archive in das Suite-Projekt. Das ist nicht unbedingt notwendig, erleichtert aber das Erstellen von ZIP-Distributionen mit fertig übersetzten Archiven: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;!-- Kopieren der JAR-Dateien in das Suite locale Verzeichnis--&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;copy todir="${cluster}/modules/locale/" &gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset
    dir="${locale.dir}"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;exclude name="${module.jar.basename}"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/fileset&gt;&#160;&#160;&#160; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/copy&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/target&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Somit ist zumindest die Erstellung der übersetzten
    Dateien automatisiert in ein extra Modul implementiert. Aber installierbar ist das noch nicht. Ich verlasse mich da ganz auf die Fähigkeiten von Tonny und übernehme sein erweitertes Target nbm: &lt;/p&gt; &lt;pre&gt; &amp;lt;target name="nbm" depends="projectized-common.nbm"&gt;&lt;br /&gt; &amp;lt;property name="nbm-expand" value="nbm-expand"/&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- 1: NBM Datei extrahieren --&gt;&lt;br /&gt; &amp;lt;unjar src="build/${nbm}" dest="build/${nbm-expand}"&gt;&lt;br /&gt;
    &amp;lt;patternset&gt;&lt;br /&gt; &amp;lt;exclude name="META-INF/**"/&gt;&lt;br /&gt; &amp;lt;/patternset&gt;&lt;br /&gt; &amp;lt;/unjar&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- 2: Übersetzugen in den passenden Ordner packen --&gt;&lt;br /&gt; &amp;lt;copy todir="build/${nbm-expand}/netbeans/modules/locale/" &gt;&lt;br /&gt; &amp;lt;fileset dir="${cluster}/modules/locale/" /&gt;&lt;br /&gt; &amp;lt;/copy&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- 3: Nun wieder als JAR zusammensetzen --&gt;&lt;br /&gt;
    &amp;lt;jar jarfile="build/${nbm}" compress="true"&gt;&lt;br /&gt; &amp;lt;fileset dir="build/${nbm-expand}" /&gt;&lt;br /&gt; &amp;lt;/jar&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- 4: Signieren, wenn gewünscht --&gt;&lt;br /&gt; &amp;lt;antcall target="sign-nbm" /&gt;&lt;br /&gt; &amp;lt;/target&gt;&#160;&#160;&#160; &lt;/pre&gt; &lt;p class="bodytext"&gt;Für das optionale Signieren fehlt noch: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="sign-nbm" if="keystore"&gt;&lt;br
    /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;signjar jar="build/${nbm}" keystore="${keystore}" storepass="${storepass}" alias="${nbm_alias}" /&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/target&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Und das war es auch schon! &lt;/p&gt; &lt;p class="bodytext"&gt;Das Modul kann nun ganz normal im Update-Center publiziert werden. Es können weitere Sprachen hinzugefügt werden. Nur funktioniert es nicht, dass man mehrere Module mit unterschiedlichen Sprachen
    installieren kann. Dazu müsste man das Makro umprogrammieren und dort ein Lokalisierungskennzeichen (z.B. _deDE) hinzufügen: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;jar jarfile="${locale.dir}/@{dep}_${app.name}_deDE.jar" compress="${build.package.compress}"&gt;&lt;br /&gt; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset dir="branding/@{module}/@{dep}.jar/"/&gt;&lt;br /&gt; &#160;&#160;&#160;&#160;&#160;&#160;
    &amp;lt;/jar&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Vielleicht kann man sich dazu auch ein Symbol in den project.properties anlegen. Man darf nur die Sonderbehandlung von core.jar nicht vergessen! &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;&lt;a href="http://www.sepix.de/fileadmin/build.xml" class="download" title="Initiates file download"&gt;Hier noch mal das komplette Build.xml Script&lt;/a&gt;, wo alle Module der NetBeans-Plaform übersetzt werden. &lt;/p&gt;
    &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;/p&gt;</content:encoded>
    <dc:date>2008-08-07T05:27:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_access_warnungen_in_wrapper_bibliotheken_deaktiveren/not_cached/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: Access-Warnungen in Wrapper-Bibliotheken deaktiveren</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_access_warnungen_in_wrapper_bibliotheken_deaktiveren/not_cached/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Eingebundene Wrapper-Bibliotheken nutzen teilweise andere JAR-Bibliotheken, die man selbst im Wrapper nicht nutzt und damit erst gar nicht einbindet.&#160; &lt;/p&gt; &lt;p class="bodytext"&gt;Die NetBeans-Plattform erkennt aber diese Abhängigkeiten und die fehlende Zugriffsmöglichkeit der Bibliothek im Wrapper. &lt;/p&gt; &lt;p class="bodytext"&gt;Im Build-Log erhält man dann beispielsweise folgende Warnungen: &lt;/p&gt; &lt;pre&gt;Warning:
    com.ibm.media.parser.video.MpegParser cannot access com.ms.security.PermissionID&lt;br /&gt;Warning: com.ibm.media.parser.video.MpegParser cannot access com.ms.security.PolicyEngine&lt;br /&gt;Warning: com.ibm.media.protocol.CloneableSourceStreamAdapter$PushStreamSlave cannot access com.ms.security.PermissionID&lt;br /&gt;Warning: com.ibm.media.protocol.CloneableSourceStreamAdapter$PushStreamSlave cannot access com.ms.security.PolicyEngine&lt;/pre&gt; &lt;p class="bodytext"&gt;Wenn diese fehlenden
    Zugriffsmöglichkeiten bewusst akzeptiert werden sollen und man die Warnungen aus dem Log entfernt haben möchte, muss man die project.properties anpassen. &lt;/p&gt; &lt;p class="bodytext"&gt;Zuständig für das Deaktivieren der Warnungen ist die Eigenschaft module.jar.verifylinkageignores und erwartet einen &lt;a title="Wikipedia: Regulärer Ausdruck" href="http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck" target="_blank" class="external-link-new-window"&gt;Regulären Ausdruck&lt;/a&gt;. &lt;/p&gt;
    &lt;p class="bodytext"&gt;Beispiel (z.B. für das Java Media Framework): &lt;/p&gt; &lt;pre&gt;module.jar.verifylinkageignores=(com.(ibm|sun).media..*)|(javax.media.rtp.rtcp.SourceDescription)&lt;/pre&gt; &lt;p class="bodytext"&gt;Diese Eigenschaft wird übrigens vom Ant-Target "verify-class-linkage" im Build-Script verwendet. Der Task "verifyclasslinkage" nutzt den zugewiesenen Wert als ignore-Liste der Klassennamen. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p
    class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;/p&gt;</content:encoded>
    <dc:date>2008-08-05T06:44:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_access_warnungen_in_wrapper_bibliotheken_deaktiveren/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: Access-Warnungen in Wrapper-Bibliotheken deaktiveren</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_access_warnungen_in_wrapper_bibliotheken_deaktiveren/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Eingebundene Wrapper-Bibliotheken nutzen teilweise andere JAR-Bibliotheken, die man selbst im Wrapper nicht nutzt und damit erst gar nicht einbindet.&#160; &lt;/p&gt; &lt;p class="bodytext"&gt;Die NetBeans-Plattform erkennt aber diese Abhängigkeiten und die fehlende Zugriffsmöglichkeit der Bibliothek im Wrapper. &lt;/p&gt; &lt;p class="bodytext"&gt;Im Build-Log erhält man dann beispielsweise folgende Warnungen: &lt;/p&gt; &lt;pre&gt;Warning:
    com.ibm.media.parser.video.MpegParser cannot access com.ms.security.PermissionID&lt;br /&gt;Warning: com.ibm.media.parser.video.MpegParser cannot access com.ms.security.PolicyEngine&lt;br /&gt;Warning: com.ibm.media.protocol.CloneableSourceStreamAdapter$PushStreamSlave cannot access com.ms.security.PermissionID&lt;br /&gt;Warning: com.ibm.media.protocol.CloneableSourceStreamAdapter$PushStreamSlave cannot access com.ms.security.PolicyEngine&lt;/pre&gt; &lt;p class="bodytext"&gt;Wenn diese fehlenden
    Zugriffsmöglichkeiten bewusst akzeptiert werden sollen und man die Warnungen aus dem Log entfernt haben möchte, muss man die project.properties anpassen. &lt;/p&gt; &lt;p class="bodytext"&gt;Zuständig für das Deaktivieren der Warnungen ist die Eigenschaft module.jar.verifylinkageignores und erwartet einen &lt;a title="Wikipedia: Regulärer Ausdruck" href="http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck" target="_blank" class="external-link-new-window"&gt;Regulären Ausdruck&lt;/a&gt;. &lt;/p&gt;
    &lt;p class="bodytext"&gt;Beispiel (z.B. für das Java Media Framework): &lt;/p&gt; &lt;pre&gt;module.jar.verifylinkageignores=(com.(ibm|sun).media..*)|(javax.media.rtp.rtcp.SourceDescription)&lt;/pre&gt; &lt;p class="bodytext"&gt;Diese Eigenschaft wird übrigens vom Ant-Target "verify-class-linkage" im Build-Script verwendet. Der Task "verifyclasslinkage" nutzt den zugewiesenen Wert als ignore-Liste der Klassennamen. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p
    class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;/p&gt;</content:encoded>
    <dc:date>2008-08-05T06:44:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////-1e9d96439e/not_cached/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: AutoUpdate Dateien automatisch kopieren</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////-1e9d96439e/not_cached/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Das Build System mit Ant ist so vielfältig zu konfigurieren, da klappt auch ein FTP-Upload der AutoUpdate-Dateien auf den eigenen Server. &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;br /&gt;Zunächst muss man die &lt;a title="Commons Net Download Seite" href="http://commons.apache.org/downloads/download_net.cgi" target="_blank" class="external-link-new-window"&gt;Apache Commons Net&lt;/a&gt; in den Ant-Classpath hinzufügen. Das geht seit NetBeans 6.0 sehr leicht
    über den Options-Dialog. Die Binary-Versions von commons-net extrahieren und in den gewünschten Pfad kopieren. &lt;/p&gt; &lt;p class="bodytext"&gt;Nun in NetBeans den Options-Dialog öffnen, auf Miscellaneous wechseln und in der Ant-Registerzunge dem Classpath die JAR-Datei hinzufügen. &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;img src="http://www.sepix.de/fileadmin/Options-Ant-Classpath.PNG" alt="" height="466" width="630" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Von nun an hat man die zusätzlichen
    Tasks, die in commons-net-x.x.x.jar definiert sind. Ein Task davon ist &lt;a title="Dokumentation zum ftp-TAsk von Ant" href="http://ant.apache.org/manual/OptionalTasks/ftp.html" target="_blank" class="external-link-new-window"&gt;ftp&lt;/a&gt;. &lt;/p&gt; &lt;p class="bodytext"&gt;Nun das Build-Script der gewünschten NetBeans Application Platform öffnen (findet sich unter Important Files) und folgendes Target hinzufügen: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="distribute-dev"
    description="Distri to developers"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;tstamp/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;ftp&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; server="ftp.myserver.de"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; userid="thebuilduser"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; password="theuserpwd"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    remotedir="/updates/dev/myapp"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; verbose="true"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; passive="true"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset dir="build/updates" casesensitive="yes"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;include name="**/*.nbm"/&gt;&lt;br
    /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;include name="**/updates.xml"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/fileset&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;/ftp&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/target&gt; &lt;/pre&gt; &lt;p class="bodytext"&gt;&lt;/p&gt;&lt;div class="indent"&gt;Da das Build-Script aber auch versioniert wird und es ggf. nicht erwünscht ist, dass irgendwo in einem
    Repository das Kennwort rumschwirrt, sollte man eine Konstante in den private properties dafür anlegen. Diese Eigenschaften findet man in der Files-Ansicht des Projektes unter nbproject/private/private.properties. Dort einfach folgende Zeile hinzufügen: &lt;p&gt;&lt;/p&gt; &lt;pre&gt;dev.ftp.password=myv3rys3cr3tpassw0rd&lt;/pre&gt; &lt;p class="bodytext"&gt;und das Target des Ant-Scriptes anpassen: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    password="${dev.ftp.password}"&lt;/pre&gt; &lt;p class="bodytext"&gt;(Übrigens hilft hier das Autovervollständigen der NetBeans IDE) &lt;/p&gt; &lt;p class="bodytext"&gt;Jetzt muss man zunächst im Kontext-Menü der Application "Create NBMs" aufrufen, damit alle Dateien im build/updates Ordner erzeugt werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Nun kann man mit der rechten Maustaste in der Projects-Ansicht auf das Build-Script klicken und Run Target -&gt; distribute-dev aufrufen. &lt;/p&gt; &lt;p
    class="bodytext"&gt;&lt;img src="http://www.sepix.de/fileadmin/RunTarget.PNG" alt="" height="565" width="532" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn alle Daten passen, werden die Dateien auf den ftp-Server kopiert. &lt;/p&gt; &lt;p class="bodytext"&gt;Möchte man sich den Schritt mit dem Menüaufruf von "Create NBMs" sparen, trägt man in das&#160;Target einfach die Abhängigkeit zu dem nbms-Target ein: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="distribute-dev" depends="nbms"
    description="Distri to developers"&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Somit erzeugt distribute-dev zunächst immer die aktuellen Updater-Dateien und kopiert sie dann auf den Server. &lt;/p&gt; &lt;p class="bodytext"&gt;Das war es auch schon und beste Grüße,&lt;br /&gt;&#160; Josch.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content:encoded>
    <dc:date>2008-07-31T09:17:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////-1e9d96439e/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: AutoUpdate Dateien automatisch kopieren</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////-1e9d96439e/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Das Build System mit Ant ist so vielfältig zu konfigurieren, da klappt auch ein FTP-Upload der AutoUpdate-Dateien auf den eigenen Server. &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;br /&gt;Zunächst muss man die &lt;a title="Commons Net Download Seite" href="http://commons.apache.org/downloads/download_net.cgi" target="_blank" class="external-link-new-window"&gt;Apache Commons Net&lt;/a&gt; in den Ant-Classpath hinzufügen. Das geht seit NetBeans 6.0 sehr leicht
    über den Options-Dialog. Die Binary-Versions von commons-net extrahieren und in den gewünschten Pfad kopieren. &lt;/p&gt; &lt;p class="bodytext"&gt;Nun in NetBeans den Options-Dialog öffnen, auf Miscellaneous wechseln und in der Ant-Registerzunge dem Classpath die JAR-Datei hinzufügen. &lt;/p&gt; &lt;p class="bodytext"&gt;&lt;img src="http://www.sepix.de/fileadmin/Options-Ant-Classpath.PNG" alt="" height="466" width="630" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Von nun an hat man die zusätzlichen
    Tasks, die in commons-net-x.x.x.jar definiert sind. Ein Task davon ist &lt;a title="Dokumentation zum ftp-TAsk von Ant" href="http://ant.apache.org/manual/OptionalTasks/ftp.html" target="_blank" class="external-link-new-window"&gt;ftp&lt;/a&gt;. &lt;/p&gt; &lt;p class="bodytext"&gt;Nun das Build-Script der gewünschten NetBeans Application Platform öffnen (findet sich unter Important Files) und folgendes Target hinzufügen: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="distribute-dev"
    description="Distri to developers"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;tstamp/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;ftp&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; server="ftp.myserver.de"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; userid="thebuilduser"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; password="theuserpwd"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    remotedir="/updates/dev/myapp"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; verbose="true"&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; passive="true"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;fileset dir="build/updates" casesensitive="yes"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;include name="**/*.nbm"/&gt;&lt;br
    /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;include name="**/updates.xml"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/fileset&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &amp;lt;/ftp&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/target&gt; &lt;/pre&gt; &lt;p class="bodytext"&gt;&lt;/p&gt;&lt;div class="indent"&gt;Da das Build-Script aber auch versioniert wird und es ggf. nicht erwünscht ist, dass irgendwo in einem
    Repository das Kennwort rumschwirrt, sollte man eine Konstante in den private properties dafür anlegen. Diese Eigenschaften findet man in der Files-Ansicht des Projektes unter nbproject/private/private.properties. Dort einfach folgende Zeile hinzufügen: &lt;p&gt;&lt;/p&gt; &lt;pre&gt;dev.ftp.password=myv3rys3cr3tpassw0rd&lt;/pre&gt; &lt;p class="bodytext"&gt;und das Target des Ant-Scriptes anpassen: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    password="${dev.ftp.password}"&lt;/pre&gt; &lt;p class="bodytext"&gt;(Übrigens hilft hier das Autovervollständigen der NetBeans IDE) &lt;/p&gt; &lt;p class="bodytext"&gt;Jetzt muss man zunächst im Kontext-Menü der Application "Create NBMs" aufrufen, damit alle Dateien im build/updates Ordner erzeugt werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Nun kann man mit der rechten Maustaste in der Projects-Ansicht auf das Build-Script klicken und Run Target -&gt; distribute-dev aufrufen. &lt;/p&gt; &lt;p
    class="bodytext"&gt;&lt;img src="http://www.sepix.de/fileadmin/RunTarget.PNG" alt="" height="565" width="532" /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn alle Daten passen, werden die Dateien auf den ftp-Server kopiert. &lt;/p&gt; &lt;p class="bodytext"&gt;Möchte man sich den Schritt mit dem Menüaufruf von "Create NBMs" sparen, trägt man in das&#160;Target einfach die Abhängigkeit zu dem nbms-Target ein: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;target name="distribute-dev" depends="nbms"
    description="Distri to developers"&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Somit erzeugt distribute-dev zunächst immer die aktuellen Updater-Dateien und kopiert sie dann auf den Server. &lt;/p&gt; &lt;p class="bodytext"&gt;Das war es auch schon und beste Grüße,&lt;br /&gt;&#160; Josch.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;</content:encoded>
    <dc:date>2008-07-31T09:17:00+00:00</dc:date>
  </item>
  <item rdf:about="http://blogs.sun.com/seapegasus/entry/ejb_artikel_im_javaspektrum">
    <title>Seapegasus Blog: EJB-Artikel im JavaSpektrum</title>
    <link>http://blogs.sun.com/seapegasus/entry/ejb_artikel_im_javaspektrum</link>
    <content:encoded>&lt;p&gt; Auf ans Kiosk: NetBeans-Dream-Team-Mitglied Adam Bien hat einen weiteren berühmt-berüchtigten EJB 3-Artikel geschrieben, diesmal bekommt Ihr ihn im &lt;a href="http://www.sigs-datacom.de/sd/publications/js/2008/04/index.htm"&gt;JavaSpektrum-Magazin&lt;/a&gt; zu Gesicht.&lt;/p&gt; &lt;p&gt; Eine &lt;a href="http://www.sigs-datacom.de/sd/publications/pub_article_show.htm?&amp;amp;AID=2336&amp;amp;Table=sd_article"&gt;Zusammenfassung&lt;/a&gt; findet Ihr hier online; für den
    vollen Inhalt (inklusive NetBeans-Bildschirmphotos) kauft Ihr das Magazin — oder Ihr ladet für zwoenhalb Euro das PDF runter. &lt;/p&gt; &lt;p&gt;&amp;lt;WÄÄBUNG&gt;Unterstützt einen Entwickler, kauft ein PDF!&amp;lt;/WÄÄBUNG&gt; :-D (Adam, kriegst Du da was von?)&lt;/p&gt; &lt;p&gt; Dass ich so lange nicht geblogt habe, lag übrigens daran dass ich "kurz" in Island war. :) Und danach hat sich der &lt;a href="http://de.wikipedia.org/wiki/Dungeons_&amp;amp;_Dragons"&gt;D&amp;amp;D&lt;/a&gt;-Floh in mein
    Ohr gesetzt. Also, d.h. konkret, ich habe mich überreden lassen, es demnächst zumindest mal zu probieren. Ich hatte bisher erst einmal eine Uraltversion vom &lt;a href="http://de.wikipedia.org/wiki/Das_Schwarze_Auge"&gt;Schwarzen Auge&lt;/a&gt; gespielt (mein armer Typie befindet sich immer noch im Limbo in irgendeinem aventurischen Wald, umzingelt von Orks), und hab mir noch keine endgültige Meinung über modernere Editionen gebildet. Mal sehen! Jetzt erst mal eine suuupi-Hintergrundstory erfinden. Es
    muss etwas besseres geben als "ich bin Vollwaise, alle hassen mich, und ein Ork hat meine Hausaufgaben gefressen"...! ;-) &lt;/p&gt;</content:encoded>
    <dc:date>2008-07-23T16:43:49+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_vorbelegen_von_optionseigenschaften_des_autoupdater/not_cached/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: Vorbelegen von Optionseigenschaften des Autoupdater</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_vorbelegen_von_optionseigenschaften_des_autoupdater/not_cached/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Es ist nur eine Kleinigkeit, aber mit der Umstellung in NetBeans 6.0 von der &lt;a title="NetBeans Optios API (Deprecated)" href="http://bits.netbeans.org/dev/javadoc/org-openide-options/org/openide/options/package-summary.html" target="_blank" class="external-link-new-window"&gt;Options-API&lt;/a&gt; auf die &lt;a title="NetBeans preferences API" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/doc-files/preferences.html"
    target="_blank" class="external-link-new-window"&gt;Preferences-API&lt;/a&gt; kann man relativ einfach auch Einstellungen fremder Module beeinflussen. &lt;/p&gt; &lt;p class="bodytext"&gt;So brauche ich für meine Plattform-Entwicklungen kürzere Prüfungsintervalle für das Autoupdate. Als Standard ist "Wöchentlich" vorgegeben. Sinnvoller für Anwendungen im Kundenbereich ist aber eine tägliche Prüfung auf Updates. &lt;/p&gt; &lt;p class="bodytext"&gt;Folgender 5-Zeiler im Module-Installer der restored() -
    Methode, löst das Problem, ohne ggf. vom Benutzer eingestellte Werte zu überschreiben &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; final String AU = "/org/netbeans/modules/autoupdate";&lt;br /&gt;&#160;&#160;&#160; final Preferences root = NbPreferences.root();&lt;br /&gt;&#160;&#160;&#160; if ( root.node (AU).get ("period", null) == null)&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; root.node (AU).put ("period", "1");&lt;br /&gt;&#160;&#160;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Dabei sind
    folgende Werte im Quelltext des Autoupdater definiert: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; public static final int EVERY_STARTUP = 0;&lt;br /&gt;&#160;&#160;&#160; public static final int EVERY_DAY = 1;&lt;br /&gt;&#160;&#160;&#160; public static final int EVERY_WEEK = 2;&lt;br /&gt;&#160;&#160;&#160; public static final int EVERY_2WEEKS = 3;&lt;br /&gt;&#160;&#160;&#160; public static final int EVERY_MONTH = 4;&lt;br /&gt;&#160;&#160;&#160; public static final int NEVER = 5;&lt;/pre&gt; &lt;p
    class="bodytext"&gt;Wenn man schon auf NetBeans 6.1 entwickelt, gibt es noch eine zusätzliche Möglichkeit den Standardwert des Autoupdaters vorzugeben. Man kann das Intervall als System-Eigenschaft dem NetBeans-Launcher mitgeben. Entweder direkt auf der Kommandozeile oder in etc/app.conf (im harness-Ordner): &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;Täglich auf Updates testen: &lt;/p&gt; &lt;pre&gt;-J-Dplugin.manager.check.interval=EVERY_DAY &lt;/pre&gt; &lt;p
    class="bodytext"&gt;Die Konstanten sind (wie oben) EVERY_STARTUP, EVERY_DAY, EVERY_WEEK, EVERY_2WEEKS, EVERY_MONTH oder NEVER. Alternativ kann man auch die Minutenzahl angeben (was im Optionsdialog nicht funktioniert). Alle halbe Stunde auf Updates testen: &lt;/p&gt; &lt;pre&gt;-J-Dplugin.manager.check.interval=30 &lt;/pre&gt; &lt;p class="bodytext"&gt;Wenn man nicht nur auf Updates, sondern auch auf neue Plugins testen möchte, muss man folgende Option setzen (seit NetBeans 6.0): &lt;/p&gt;
    &lt;pre&gt;-J-Dplugin.manager.check.new.plugins=true &lt;/pre&gt; &lt;p class="bodytext"&gt;Dann erscheint der Balloon-Tooltip auch dann, wenn neue Plugins im Update-Center auftauchen, die noch nicht installiert wurden. Das lässt sich natürlich auch im Module-Installer festlegen (was aber nicht zuverlässig funktionieren muss, wenn das Intervall EVERY_STARTUP ist): &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;pre&gt;public void restored() {&lt;br /&gt;&#160; [...]&lt;br /&gt;&#160;
    System.getProperties().put ("plugin.manager.check.new.plugins", "true");&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;/p&gt;</content:encoded>
    <dc:date>2008-07-18T07:05:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_vorbelegen_von_optionseigenschaften_des_autoupdater/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: Vorbelegen von Optionseigenschaften des Autoupdater</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_vorbelegen_von_optionseigenschaften_des_autoupdater/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Es ist nur eine Kleinigkeit, aber mit der Umstellung in NetBeans 6.0 von der &lt;a title="NetBeans Optios API (Deprecated)" href="http://bits.netbeans.org/dev/javadoc/org-openide-options/org/openide/options/package-summary.html" target="_blank" class="external-link-new-window"&gt;Options-API&lt;/a&gt; auf die &lt;a title="NetBeans preferences API" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/doc-files/preferences.html"
    target="_blank" class="external-link-new-window"&gt;Preferences-API&lt;/a&gt; kann man relativ einfach auch Einstellungen fremder Module beeinflussen. &lt;/p&gt; &lt;p class="bodytext"&gt;So brauche ich für meine Plattform-Entwicklungen kürzere Prüfungsintervalle für das Autoupdate. Als Standard ist "Wöchentlich" vorgegeben. Sinnvoller für Anwendungen im Kundenbereich ist aber eine tägliche Prüfung auf Updates. &lt;/p&gt; &lt;p class="bodytext"&gt;Folgender 5-Zeiler im Module-Installer der restored() -
    Methode, löst das Problem, ohne ggf. vom Benutzer eingestellte Werte zu überschreiben &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; final String AU = "/org/netbeans/modules/autoupdate";&lt;br /&gt;&#160;&#160;&#160; final Preferences root = NbPreferences.root();&lt;br /&gt;&#160;&#160;&#160; if ( root.node (AU).get ("period", null) == null)&#160; {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; root.node (AU).put ("period", "1");&lt;br /&gt;&#160;&#160;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Dabei sind
    folgende Werte im Quelltext des Autoupdater definiert: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; public static final int EVERY_STARTUP = 0;&lt;br /&gt;&#160;&#160;&#160; public static final int EVERY_DAY = 1;&lt;br /&gt;&#160;&#160;&#160; public static final int EVERY_WEEK = 2;&lt;br /&gt;&#160;&#160;&#160; public static final int EVERY_2WEEKS = 3;&lt;br /&gt;&#160;&#160;&#160; public static final int EVERY_MONTH = 4;&lt;br /&gt;&#160;&#160;&#160; public static final int NEVER = 5;&lt;/pre&gt; &lt;p
    class="bodytext"&gt;Wenn man schon auf NetBeans 6.1 entwickelt, gibt es noch eine zusätzliche Möglichkeit den Standardwert des Autoupdaters vorzugeben. Man kann das Intervall als System-Eigenschaft dem NetBeans-Launcher mitgeben. Entweder direkt auf der Kommandozeile oder in etc/app.conf (im harness-Ordner): &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;Täglich auf Updates testen: &lt;/p&gt; &lt;pre&gt;-J-Dplugin.manager.check.interval=EVERY_DAY &lt;/pre&gt; &lt;p
    class="bodytext"&gt;Die Konstanten sind (wie oben) EVERY_STARTUP, EVERY_DAY, EVERY_WEEK, EVERY_2WEEKS, EVERY_MONTH oder NEVER. Alternativ kann man auch die Minutenzahl angeben (was im Optionsdialog nicht funktioniert). Alle halbe Stunde auf Updates testen: &lt;/p&gt; &lt;pre&gt;-J-Dplugin.manager.check.interval=30 &lt;/pre&gt; &lt;p class="bodytext"&gt;Wenn man nicht nur auf Updates, sondern auch auf neue Plugins testen möchte, muss man folgende Option setzen (seit NetBeans 6.0): &lt;/p&gt;
    &lt;pre&gt;-J-Dplugin.manager.check.new.plugins=true &lt;/pre&gt; &lt;p class="bodytext"&gt;Dann erscheint der Balloon-Tooltip auch dann, wenn neue Plugins im Update-Center auftauchen, die noch nicht installiert wurden. Das lässt sich natürlich auch im Module-Installer festlegen (was aber nicht zuverlässig funktionieren muss, wenn das Intervall EVERY_STARTUP ist): &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;pre&gt;public void restored() {&lt;br /&gt;&#160; [...]&lt;br /&gt;&#160;
    System.getProperties().put ("plugin.manager.check.new.plugins", "true");&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;/p&gt;</content:encoded>
    <dc:date>2008-07-18T07:05:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_neustart_der_netbeans_platform/not_cached/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: Neustart der NetBeans-Platform</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_neustart_der_netbeans_platform/not_cached/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Leider gibt es laut Mailing-Liste keine offizielle Möglichkeit die NetBeans-Plattform aus dem Programm heraus neu zu starten. &lt;/p&gt; &lt;p class="bodytext"&gt;Also muss man sich behelfen und die Sache "zu Fuß" durchziehen. &lt;/p&gt; &lt;p class="bodytext"&gt;Am besten erzeugt man sich mit dem Assistenten eine CallableSystemAction mit dem Namen "SystemRestartAction", setzt sie unter die Kategorie "System", und fügt sie als Global Menu Item im Menü "File"
    hinter den Menüeintrag "Exit" ein. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man noch ein schönes Icon hat, kann man es noch im Assistenten hinterlegen, nur ein Tastenkürzel würde ich nicht vergeben. &lt;/p&gt; &lt;p class="bodytext"&gt;Der Assistent erzeugt nun eine Java-Klasse mit dem Namen (wie sollte es anders sein) SystemRestartAction. Nur die performAction-Methode muss noch implementiert werden: &lt;/p&gt; &lt;pre&gt;import java.io.File;&lt;br /&gt;import java.io.FileNotFoundException;&lt;br
    /&gt;import java.io.IOException;&lt;br /&gt;import org.openide.LifecycleManager;&lt;br /&gt;import org.openide.util.Exceptions;&lt;/pre&gt; &lt;pre&gt;&#160; [...]&lt;/pre&gt; &lt;pre&gt;&#160; public void performAction() {&lt;br /&gt;&#160;&#160;&#160; String systemName = NbBundle.getMessage(SystemRestartAction.class, "CTL_SystemFileName");&lt;br /&gt;&#160;&#160;&#160; String homePath = System.getProperty("netbeans.home", ".");&lt;br /&gt;&#160;&#160;&#160; File base = new
    File(homePath).getParentFile();&lt;br /&gt;&#160;&#160;&#160; File bin = new File(base, "bin");&lt;br /&gt;&#160;&#160;&#160; final File execution = new File(bin, systemName);&lt;br /&gt;&#160;&#160;&#160; if ( execution.exists() ) {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void run() {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {&lt;br
    /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; new ProcessBuilder(execution.getAbsolutePath()).start();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (IOException ex) {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Exceptions.printStackTrace(ex);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;
    }));&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; LifecycleManager.getDefault().exit();&lt;br /&gt;&#160;&#160;&#160; } else {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; Exceptions.printStackTrace(new FileNotFoundException ("Can't find the launcher " + execution.getAbsolutePath()));&lt;br /&gt;&#160;&#160;&#160; }&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Der Bundle.properties-Wert "CTL_SystemFileName" muss den Namen der ausführbaren Launcher-Datei tragen.&#160;Unter Windows und für
    NetBeans wäre das netbeans.exe. Damit sieht man schon die wichtigste Einschränkung dieser Methode: sie ist abhängig von dem installierten Betriebssystem. Das zweite (nicht so gravierende) Problem ist, dass man&#160;wissen muss wie der Launcher heißt. &lt;/p&gt; &lt;p class="bodytext"&gt;Die OS-Abhängigkeit kann man mildern, wenn man per &lt;a title="API-Doc: org.openide.util.Utilities" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html" target="_blank"
    class="external-link-new-window"&gt;org.openide.util.Utilities&lt;/a&gt; die Betriebssysteme abfragt. Die Methoden wären &lt;a title="API-Doc: isMac" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#isMac()" target="_blank" class="external-link-new-window"&gt;isMac()&lt;/a&gt;, &lt;a title="API-Doc: isWindows()" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#isWindows()" target="_blank"
    class="external-link-new-window"&gt;isWindows()&lt;/a&gt; und &lt;a title="API-Doc: isUnix" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#isUnix()" target="_blank" class="external-link-new-window"&gt;isUnix()&lt;/a&gt;. Wobei man isUnix und isMac zusammenfassen kann, da der Launcher für die beiden Systeme identisch ist. &lt;/p&gt; &lt;p class="bodytext"&gt;Damit könnte man folgende Abfrage realisieren: &lt;/p&gt; &lt;pre&gt; String systemName = &lt;br /&gt;
    NbBundle.getMessage (SystemRestartAction.class, &lt;br /&gt; Utilities.isWindows() &lt;br /&gt; ? "CTL_SystemFileName.Windows" &lt;br /&gt; : "CTL_SystemFileName.MacOrUnix");&lt;/pre&gt; &lt;p class="bodytext"&gt;In der Bundle.properties steht dann für die NetBeans-IDE: &lt;/p&gt; &lt;pre&gt;CTL_SystemFileName.Windows=netbeans.exe&lt;br /&gt;CTL_SystemFileName.MacOrUnix=netbeans&lt;/pre&gt; &lt;p class="bodytext"&gt;Für die eigene Plattform-Anwendung muss man dann natürlich den eigenen
    Applikationsnamen aus der "Standalone Application" nehmen. Das ist in den Projekt-Eigenschaften der Branding-Name im Abschnitt "Build". &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch. &lt;/p&gt; &lt;pre&gt;&#160;&lt;/pre&gt;</content:encoded>
    <dc:date>2008-07-07T14:54:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_neustart_der_netbeans_platform/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: Neustart der NetBeans-Platform</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_neustart_der_netbeans_platform/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Leider gibt es laut Mailing-Liste keine offizielle Möglichkeit die NetBeans-Plattform aus dem Programm heraus neu zu starten. &lt;/p&gt; &lt;p class="bodytext"&gt;Also muss man sich behelfen und die Sache "zu Fuß" durchziehen. &lt;/p&gt; &lt;p class="bodytext"&gt;Am besten erzeugt man sich mit dem Assistenten eine CallableSystemAction mit dem Namen "SystemRestartAction", setzt sie unter die Kategorie "System", und fügt sie als Global Menu Item im Menü "File"
    hinter den Menüeintrag "Exit" ein. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man noch ein schönes Icon hat, kann man es noch im Assistenten hinterlegen, nur ein Tastenkürzel würde ich nicht vergeben. &lt;/p&gt; &lt;p class="bodytext"&gt;Der Assistent erzeugt nun eine Java-Klasse mit dem Namen (wie sollte es anders sein) SystemRestartAction. Nur die performAction-Methode muss noch implementiert werden: &lt;/p&gt; &lt;pre&gt;import java.io.File;&lt;br /&gt;import java.io.FileNotFoundException;&lt;br
    /&gt;import java.io.IOException;&lt;br /&gt;import org.openide.LifecycleManager;&lt;br /&gt;import org.openide.util.Exceptions;&lt;/pre&gt; &lt;pre&gt;&#160; [...]&lt;/pre&gt; &lt;pre&gt;&#160; public void performAction() {&lt;br /&gt;&#160;&#160;&#160; String systemName = NbBundle.getMessage(SystemRestartAction.class, "CTL_SystemFileName");&lt;br /&gt;&#160;&#160;&#160; String homePath = System.getProperty("netbeans.home", ".");&lt;br /&gt;&#160;&#160;&#160; File base = new
    File(homePath).getParentFile();&lt;br /&gt;&#160;&#160;&#160; File bin = new File(base, "bin");&lt;br /&gt;&#160;&#160;&#160; final File execution = new File(bin, systemName);&lt;br /&gt;&#160;&#160;&#160; if ( execution.exists() ) {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; public void run() {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {&lt;br
    /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; new ProcessBuilder(execution.getAbsolutePath()).start();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (IOException ex) {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Exceptions.printStackTrace(ex);&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;
    }));&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; LifecycleManager.getDefault().exit();&lt;br /&gt;&#160;&#160;&#160; } else {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; Exceptions.printStackTrace(new FileNotFoundException ("Can't find the launcher " + execution.getAbsolutePath()));&lt;br /&gt;&#160;&#160;&#160; }&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Der Bundle.properties-Wert "CTL_SystemFileName" muss den Namen der ausführbaren Launcher-Datei tragen.&#160;Unter Windows und für
    NetBeans wäre das netbeans.exe. Damit sieht man schon die wichtigste Einschränkung dieser Methode: sie ist abhängig von dem installierten Betriebssystem. Das zweite (nicht so gravierende) Problem ist, dass man&#160;wissen muss wie der Launcher heißt. &lt;/p&gt; &lt;p class="bodytext"&gt;Die OS-Abhängigkeit kann man mildern, wenn man per &lt;a title="API-Doc: org.openide.util.Utilities" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html" target="_blank"
    class="external-link-new-window"&gt;org.openide.util.Utilities&lt;/a&gt; die Betriebssysteme abfragt. Die Methoden wären &lt;a title="API-Doc: isMac" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#isMac()" target="_blank" class="external-link-new-window"&gt;isMac()&lt;/a&gt;, &lt;a title="API-Doc: isWindows()" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#isWindows()" target="_blank"
    class="external-link-new-window"&gt;isWindows()&lt;/a&gt; und &lt;a title="API-Doc: isUnix" href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#isUnix()" target="_blank" class="external-link-new-window"&gt;isUnix()&lt;/a&gt;. Wobei man isUnix und isMac zusammenfassen kann, da der Launcher für die beiden Systeme identisch ist. &lt;/p&gt; &lt;p class="bodytext"&gt;Damit könnte man folgende Abfrage realisieren: &lt;/p&gt; &lt;pre&gt; String systemName = &lt;br /&gt;
    NbBundle.getMessage (SystemRestartAction.class, &lt;br /&gt; Utilities.isWindows() &lt;br /&gt; ? "CTL_SystemFileName.Windows" &lt;br /&gt; : "CTL_SystemFileName.MacOrUnix");&lt;/pre&gt; &lt;p class="bodytext"&gt;In der Bundle.properties steht dann für die NetBeans-IDE: &lt;/p&gt; &lt;pre&gt;CTL_SystemFileName.Windows=netbeans.exe&lt;br /&gt;CTL_SystemFileName.MacOrUnix=netbeans&lt;/pre&gt; &lt;p class="bodytext"&gt;Für die eigene Plattform-Anwendung muss man dann natürlich den eigenen
    Applikationsnamen aus der "Standalone Application" nehmen. Das ist in den Projekt-Eigenschaften der Branding-Name im Abschnitt "Build". &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch. &lt;/p&gt; &lt;pre&gt;&#160;&lt;/pre&gt;</content:encoded>
    <dc:date>2008-07-07T14:54:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_branding_shortcuts_oder_keymap/not_cached/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: Branding - Shortcuts oder Keymap?</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_branding_shortcuts_oder_keymap/not_cached/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Der deklarative Ansatz, die NetBeans-Plattform zu konfigurieren ist sehr praktisch, hat aber auch so seine Tücken. Der Vorteil ist unbestreitbar. Ohne die compilierten Class-Dateien anfassen zu müssen, kann man in XML- und Bundle-Dateien alle "Branding"-Arbeiten durchführen. Allerdings gibt es inzwischen recht verstreute Einrichtungsmöglichkeiten und sind teilweise auch als historisch zu bezeichnen. &lt;/p&gt; &lt;p class="bodytext"&gt;Ein Bereich sind die
    Tastenkürzel, die man Aktionen der NetBeans-Oberfläche zuweisen kann. Ein populärer Bereich ist, in der layer.xml, der Shortcuts-Folder. &lt;/p&gt; &lt;p class="bodytext"&gt;Zunächst benötigt man natürlich eine Action-Klasse, die selbst im Actions-Abschnitt deklariert sein sollte: &lt;/p&gt; &lt;pre&gt;&amp;lt;filesystem&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;folder name="Actions"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Window"&gt;&lt;br /&gt;&#160; &#160;
    &#160; &#160; &#160; &#160; &amp;lt;file name="de-sepix-demo-QueryAction.instance"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &#160; &amp;lt;/folder&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/folder&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Nun kann man im Shortcuts-Folder ein Tastenkürzel zuweisen: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;folder name="Shortcuts"&gt;&lt;br /&gt;&#160; &#160; &#160; &#160; &amp;lt;file name="CS-Q.instance­"&gt;&lt;br /&gt;&#160; &#160; &#160; &#160; &#160; &#160;
    &amp;lt;attr name="instanceClass­"&lt;br /&gt;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; stringvalue="de.sepix.demo.QueryAction"/&gt;&lt;br /&gt;&#160; &#160; &#160; &#160; &amp;lt;/file&gt;&lt;br /&gt;&#160; &#160; &amp;lt;/folder&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Somit ist Strg+Umschalt+Q der Aktion "QueryAction" zugewiesen. Die eingentümliche Syntax für das Tastenkürzel wird in &lt;a title="Utilities.stringToKey"
    href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#stringToKey%28java.lang.String%29" target="_blank" class="external-link-new-window"&gt;Utilities.stringToKey&lt;/a&gt; beschrieben. &lt;/p&gt; &lt;p class="bodytext"&gt;Allerdings hat dieses Verfahren einige Nachteile. Das Tastenkürzel ist global einmalig zugewiesen (kann&#160;also nicht Tastatur-Profilen zugewiesen werden) und wird für den Anwender nicht sichtbar im Menü angezeigt.&#160; &lt;/p&gt; &lt;p
    class="bodytext"&gt;Wenn man nämlich die QueryAction (hier z.B.) im&#160;Window-Menü einfügt: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;folder name="Menu"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Window"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;file name="QueryAction.shadow"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;attr
    name="originalFile" &lt;br /&gt;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; stringvalue=&lt;br /&gt;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; "Actions/Window/de-sepix-demo-QueryAction.instance"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/file&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;erscheint zwar der Menüeintrag, aber ohne die Tastenkürzel-Information, dass der Anwender die Eintrag auch
    per Strg+Umschalt+Q aufrufen kann. &lt;/p&gt; &lt;p class="bodytext"&gt;Eine schönere Methode ist es, dem Anwender die Tastenkürzel über Keymaps zur Verfügung zu stellen. Damit kann der Nutzer die Tastenkürzel bequem im Options-Dialog verwalten und sieht diese auch immer in den Menüs zugewiesen: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;folder name="Keymaps"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Sepix"&gt;&lt;br
    /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;file name="CS-Q.shadow"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;attr name="originalFile" &lt;br /&gt; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160; stringvalue="Actions/Window/de-sepix-demo-QueryAction.instance"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    &amp;lt;/file&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;&#160; &#160; &#160; &#160; &#160;&#160; &lt;br /&gt;Nun erscheint automatisch im Options-Dialog zusätzlich zur NetBeans-Keymap auch die Sepix-Keymap. &lt;/p&gt; &lt;p class="bodytext"&gt;Aber der Anwender muss erst explizit die Keymap "Sepix" auswählen. Aber auch das kann man vorgeben: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;folder name="Keymaps"&gt;&lt;br /&gt; &amp;lt;attr name="currentKeymap" stringvalue="Sepix"/&gt;&lt;br
    /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Sepix"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;file name="CS-Q.shadow"&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Mit dem Attribut "currentKeymap" wird die Standard-Keymap vorbelegt. &lt;/p&gt; &lt;p class="bodytext"&gt;Will man beim Brandig die NetBeans-Keymap vor dem Anwender verstecken, nutzt man dafür das Standard-Verfahren: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;folder
    name="Keymaps"&gt;&lt;br /&gt; &amp;lt;folder name="NetBeans_hidden"/&gt;&lt;br /&gt; &amp;lt;attr name="currentKeymap" stringvalue="Sepix"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Sepix"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;file name="CS-Q.shadow"&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Mit diesem Verfahren kann man für den Anwender bequem zu verwaltende Tastaturkürzel einrichten. &lt;/p&gt; &lt;p
    class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt;</content:encoded>
    <dc:date>2008-07-02T07:23:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_branding_shortcuts_oder_keymap/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: Branding - Shortcuts oder Keymap?</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_branding_shortcuts_oder_keymap/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Der deklarative Ansatz, die NetBeans-Plattform zu konfigurieren ist sehr praktisch, hat aber auch so seine Tücken. Der Vorteil ist unbestreitbar. Ohne die compilierten Class-Dateien anfassen zu müssen, kann man in XML- und Bundle-Dateien alle "Branding"-Arbeiten durchführen. Allerdings gibt es inzwischen recht verstreute Einrichtungsmöglichkeiten und sind teilweise auch als historisch zu bezeichnen. &lt;/p&gt; &lt;p class="bodytext"&gt;Ein Bereich sind die
    Tastenkürzel, die man Aktionen der NetBeans-Oberfläche zuweisen kann. Ein populärer Bereich ist, in der layer.xml, der Shortcuts-Folder. &lt;/p&gt; &lt;p class="bodytext"&gt;Zunächst benötigt man natürlich eine Action-Klasse, die selbst im Actions-Abschnitt deklariert sein sollte: &lt;/p&gt; &lt;pre&gt;&amp;lt;filesystem&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;folder name="Actions"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Window"&gt;&lt;br /&gt;&#160; &#160;
    &#160; &#160; &#160; &#160; &amp;lt;file name="de-sepix-demo-QueryAction.instance"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; &#160; &amp;lt;/folder&gt;&lt;br /&gt;&#160;&#160;&#160; &amp;lt;/folder&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Nun kann man im Shortcuts-Folder ein Tastenkürzel zuweisen: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;folder name="Shortcuts"&gt;&lt;br /&gt;&#160; &#160; &#160; &#160; &amp;lt;file name="CS-Q.instance­"&gt;&lt;br /&gt;&#160; &#160; &#160; &#160; &#160; &#160;
    &amp;lt;attr name="instanceClass­"&lt;br /&gt;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; stringvalue="de.sepix.demo.QueryAction"/&gt;&lt;br /&gt;&#160; &#160; &#160; &#160; &amp;lt;/file&gt;&lt;br /&gt;&#160; &#160; &amp;lt;/folder&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Somit ist Strg+Umschalt+Q der Aktion "QueryAction" zugewiesen. Die eingentümliche Syntax für das Tastenkürzel wird in &lt;a title="Utilities.stringToKey"
    href="http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/Utilities.html#stringToKey%28java.lang.String%29" target="_blank" class="external-link-new-window"&gt;Utilities.stringToKey&lt;/a&gt; beschrieben. &lt;/p&gt; &lt;p class="bodytext"&gt;Allerdings hat dieses Verfahren einige Nachteile. Das Tastenkürzel ist global einmalig zugewiesen (kann&#160;also nicht Tastatur-Profilen zugewiesen werden) und wird für den Anwender nicht sichtbar im Menü angezeigt.&#160; &lt;/p&gt; &lt;p
    class="bodytext"&gt;Wenn man nämlich die QueryAction (hier z.B.) im&#160;Window-Menü einfügt: &lt;/p&gt; &lt;pre&gt;&#160;&#160;&#160; &amp;lt;folder name="Menu"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Window"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;file name="QueryAction.shadow"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;attr
    name="originalFile" &lt;br /&gt;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; stringvalue=&lt;br /&gt;&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; "Actions/Window/de-sepix-demo-QueryAction.instance"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;/file&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;erscheint zwar der Menüeintrag, aber ohne die Tastenkürzel-Information, dass der Anwender die Eintrag auch
    per Strg+Umschalt+Q aufrufen kann. &lt;/p&gt; &lt;p class="bodytext"&gt;Eine schönere Methode ist es, dem Anwender die Tastenkürzel über Keymaps zur Verfügung zu stellen. Damit kann der Nutzer die Tastenkürzel bequem im Options-Dialog verwalten und sieht diese auch immer in den Menüs zugewiesen: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;folder name="Keymaps"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Sepix"&gt;&lt;br
    /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;file name="CS-Q.shadow"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;attr name="originalFile" &lt;br /&gt; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160; stringvalue="Actions/Window/de-sepix-demo-QueryAction.instance"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;
    &amp;lt;/file&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;&#160; &#160; &#160; &#160; &#160;&#160; &lt;br /&gt;Nun erscheint automatisch im Options-Dialog zusätzlich zur NetBeans-Keymap auch die Sepix-Keymap. &lt;/p&gt; &lt;p class="bodytext"&gt;Aber der Anwender muss erst explizit die Keymap "Sepix" auswählen. Aber auch das kann man vorgeben: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;folder name="Keymaps"&gt;&lt;br /&gt; &amp;lt;attr name="currentKeymap" stringvalue="Sepix"/&gt;&lt;br
    /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Sepix"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;file name="CS-Q.shadow"&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Mit dem Attribut "currentKeymap" wird die Standard-Keymap vorbelegt. &lt;/p&gt; &lt;p class="bodytext"&gt;Will man beim Brandig die NetBeans-Keymap vor dem Anwender verstecken, nutzt man dafür das Standard-Verfahren: &lt;/p&gt; &lt;pre&gt;&#160; &#160; &amp;lt;folder
    name="Keymaps"&gt;&lt;br /&gt; &amp;lt;folder name="NetBeans_hidden"/&gt;&lt;br /&gt; &amp;lt;attr name="currentKeymap" stringvalue="Sepix"/&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;folder name="Sepix"&gt;&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &amp;lt;file name="CS-Q.shadow"&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;Mit diesem Verfahren kann man für den Anwender bequem zu verwaltende Tastaturkürzel einrichten. &lt;/p&gt; &lt;p
    class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt;</content:encoded>
    <dc:date>2008-07-02T07:23:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_nodeaction_und_selection_management/not_cached/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: NodeAction und Selection Management</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_nodeaction_und_selection_management/not_cached/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Eine nette Klasse, um Nodes mit Aktionen zu versehen ist die NodeAction-Klasse. Und soweit man sich an die Standard-Tutorials hält, wird man erstmal keine Probleme haben - insbesondere wenn sich alles in einem View innerhalb TopComponent läuft. &lt;/p&gt; &lt;p class="bodytext"&gt;NodeAction funktioniert aber nur, wenn das zugeordnete Modell des ExplorerManager mit dem Selection Management der NetBeans Plattform verknüpft ist. Dabei ist es letztendlich
    irrelevant, ob z.B. ein BeanTreeView-Eintrag visuell markiert ist. Wenn der ExplorerManager von seiner Umwelt abgeschnitten ist, klappt es nicht mit einer NodeAction. &lt;/p&gt; &lt;p class="bodytext"&gt;Sehr schnell bekommt man das mit, wenn man ein ExplorerManager und zugehöriges View in einer schlichten Panel-Komponente hat. Zwar funktioniert alles erstmal wie erwartet, sogar NodeActions die per &lt;/p&gt; &lt;pre&gt;&#160; @Override&lt;br /&gt;&#160; public Action[] getActions(boolean context)
    {&lt;br /&gt;&#160; &#160; return new Action[] {myNodeAction}&lt;br /&gt;&#160; }&lt;br /&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;an einen Knoten gebunden werden, zeigen sich im Popup, sind aktiv und werden sogar ausgeführt. &lt;/p&gt; &lt;p class="bodytext"&gt;Leider stellt man dann im Debugger fest, dass das übergebene Node-Array in der performAction-Methode immer leer ist. &lt;/p&gt; &lt;pre&gt;&#160; &#160; @Override&lt;br /&gt;&#160;&#160;&#160; protected void performAction(Node[] nodes) {&lt;br
    /&gt;&#160;&#160;&#160;&#160;&#160; for (Node node : nodes) {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ( node.canDestroy() ) {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Node parent = node.getParentNode();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; parent.getChildren().remove(new Node[]{node});&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160; }&lt;/pre&gt; &lt;p
    class="bodytext"&gt;Obige performAction-Methode würde nie etwas ausführen. &lt;/p&gt; &lt;p class="bodytext"&gt;Wie bekommt man aber nun NodeAction dazu, zu erkennen, welche Knoten im ExplorerManager ausgewählt wurden? &lt;/p&gt; &lt;p class="bodytext"&gt;Hier eine Möglichkeit: &lt;/p&gt; &lt;p class="bodytext"&gt;Das Panel sollte das Interface Lookup.Provider implementieren und, ähnlich wie in den Tutorials zu TopComponents, ein Lookup (generiert aus einem ExplorerManager) zurückgeben: &lt;/p&gt;
    &lt;pre&gt;public class MyTestPanel extends JPanel &lt;br /&gt;&#160; &#160; &#160; &#160; &#160; implements ExplorerManager.Provider, Loopup.Provider {&lt;br /&gt;&#160; private ExplorerManager myNodeModel = new ExplorerManager();&lt;br /&gt;&#160; private BeanTreeView tree = new BeanTreeView();&lt;br /&gt;&#160; private Lookup lookup;&lt;br /&gt;&#160; public MyTestPanel () {&lt;br /&gt;&#160; &#160; initComponents();&lt;br /&gt;&#160; &#160; myNodeModel = new ExplorerManager();&lt;br /&gt;&#160;
    &#160; lookup = ExplorerUtils.createLookup(explorerManager, new ActionMap());&lt;br /&gt;&#160; &#160; myNodeModel .setRootContext(new MyRootNode());&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public ExplorerManager getExplorerManager() {&lt;br /&gt;&#160;&#160;&#160; return myNodeModel;&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public Lookup getLookup() {&lt;br /&gt;&#160;&#160;&#160; return lookup;&lt;br /&gt;&#160; }&lt;br /&gt;&#160; [...]&lt;br /&gt;}&lt;/pre&gt; &lt;p
    class="bodytext"&gt;Das BeanTreeView benötigt das Interface ExplorerManager.Provider, ansonsten hat das View kein Model. Die Implementation von Lookup.Provider nutzen wir nun in der TopComponent, in der wir unser TestPanel einfügen: &lt;/p&gt; &lt;pre&gt;public class TestTopComponent extends TopComponent {&lt;br /&gt;&#160; TestPanel tp = new TestPanel();&lt;br /&gt;&#160;&#160;public TestTopComponent() {&lt;br /&gt;&#160; &#160; add (tp);&lt;br /&gt;&#160; &#160;
    associateLookup(tp.getLookup()));&lt;br /&gt;&#160; } &lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Das war es auch schon, der Rest läuft automatisch. Die Methode associateLookup reicht das erzeugte Lookup aus unserem Panel durch die getLookup-Methode von TestTopComponent heraus (getLookup ist schon in TopComponent implementiert).&#160; &lt;/p&gt; &lt;p class="bodytext"&gt;Es wird aber die Regel sein, dass TopComponents eigene Lookups benötigen oder gar mehrere Panels mit Lookups nutzen. Dabei
    hilft aber ProxyLookup: &lt;/p&gt; &lt;pre&gt;public class TestTopComponent extends TopComponent {&lt;br /&gt; TestPanel tp = new TestPanel();&lt;br /&gt;&#160; InstanceContent content = new InstanceContent();&lt;br /&gt;&#160; public TestTopComponent() {&lt;br /&gt;&#160; &#160; add (tp);&lt;br /&gt;&#160; &#160; associateLookup(&lt;br /&gt;&#160; &#160; &#160; new ProxyLookup (&lt;br /&gt;&#160; &#160; &#160; &#160; new AbstractLookup (instanceContent), &lt;br /&gt;&#160; &#160; &#160; &#160;
    tp.getLookup())&lt;br /&gt;&#160; &#160; );&lt;br /&gt;&#160; } &lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Jetzt kann man selber in content seine Objekte speichern, die man global zur Verfügung stellen will und verliert nicht die Verbindung&#160;zu den selektierten Nodes in TestPanel. &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;br /&gt;&lt;/p&gt;</content:encoded>
    <dc:date>2008-06-27T06:05:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_nodeaction_und_selection_management/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: NodeAction und Selection Management</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_nodeaction_und_selection_management/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Eine nette Klasse, um Nodes mit Aktionen zu versehen ist die NodeAction-Klasse. Und soweit man sich an die Standard-Tutorials hält, wird man erstmal keine Probleme haben - insbesondere wenn sich alles in einem View innerhalb TopComponent läuft. &lt;/p&gt; &lt;p class="bodytext"&gt;NodeAction funktioniert aber nur, wenn das zugeordnete Modell des ExplorerManager mit dem Selection Management der NetBeans Plattform verknüpft ist. Dabei ist es letztendlich
    irrelevant, ob z.B. ein BeanTreeView-Eintrag visuell markiert ist. Wenn der ExplorerManager von seiner Umwelt abgeschnitten ist, klappt es nicht mit einer NodeAction. &lt;/p&gt; &lt;p class="bodytext"&gt;Sehr schnell bekommt man das mit, wenn man ein ExplorerManager und zugehöriges View in einer schlichten Panel-Komponente hat. Zwar funktioniert alles erstmal wie erwartet, sogar NodeActions die per &lt;/p&gt; &lt;pre&gt;&#160; @Override&lt;br /&gt;&#160; public Action[] getActions(boolean context)
    {&lt;br /&gt;&#160; &#160; return new Action[] {myNodeAction}&lt;br /&gt;&#160; }&lt;br /&gt;&lt;/pre&gt; &lt;p class="bodytext"&gt;an einen Knoten gebunden werden, zeigen sich im Popup, sind aktiv und werden sogar ausgeführt. &lt;/p&gt; &lt;p class="bodytext"&gt;Leider stellt man dann im Debugger fest, dass das übergebene Node-Array in der performAction-Methode immer leer ist. &lt;/p&gt; &lt;pre&gt;&#160; &#160; @Override&lt;br /&gt;&#160;&#160;&#160; protected void performAction(Node[] nodes) {&lt;br
    /&gt;&#160;&#160;&#160;&#160;&#160; for (Node node : nodes) {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ( node.canDestroy() ) {&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Node parent = node.getParentNode();&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; parent.getChildren().remove(new Node[]{node});&lt;br /&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; }&lt;br /&gt;&#160;&#160;&#160; }&lt;/pre&gt; &lt;p
    class="bodytext"&gt;Obige performAction-Methode würde nie etwas ausführen. &lt;/p&gt; &lt;p class="bodytext"&gt;Wie bekommt man aber nun NodeAction dazu, zu erkennen, welche Knoten im ExplorerManager ausgewählt wurden? &lt;/p&gt; &lt;p class="bodytext"&gt;Hier eine Möglichkeit: &lt;/p&gt; &lt;p class="bodytext"&gt;Das Panel sollte das Interface Lookup.Provider implementieren und, ähnlich wie in den Tutorials zu TopComponents, ein Lookup (generiert aus einem ExplorerManager) zurückgeben: &lt;/p&gt;
    &lt;pre&gt;public class MyTestPanel extends JPanel &lt;br /&gt;&#160; &#160; &#160; &#160; &#160; implements ExplorerManager.Provider, Loopup.Provider {&lt;br /&gt;&#160; private ExplorerManager myNodeModel = new ExplorerManager();&lt;br /&gt;&#160; private BeanTreeView tree = new BeanTreeView();&lt;br /&gt;&#160; private Lookup lookup;&lt;br /&gt;&#160; public MyTestPanel () {&lt;br /&gt;&#160; &#160; initComponents();&lt;br /&gt;&#160; &#160; myNodeModel = new ExplorerManager();&lt;br /&gt;&#160;
    &#160; lookup = ExplorerUtils.createLookup(explorerManager, new ActionMap());&lt;br /&gt;&#160; &#160; myNodeModel .setRootContext(new MyRootNode());&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public ExplorerManager getExplorerManager() {&lt;br /&gt;&#160;&#160;&#160; return myNodeModel;&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public Lookup getLookup() {&lt;br /&gt;&#160;&#160;&#160; return lookup;&lt;br /&gt;&#160; }&lt;br /&gt;&#160; [...]&lt;br /&gt;}&lt;/pre&gt; &lt;p
    class="bodytext"&gt;Das BeanTreeView benötigt das Interface ExplorerManager.Provider, ansonsten hat das View kein Model. Die Implementation von Lookup.Provider nutzen wir nun in der TopComponent, in der wir unser TestPanel einfügen: &lt;/p&gt; &lt;pre&gt;public class TestTopComponent extends TopComponent {&lt;br /&gt;&#160; TestPanel tp = new TestPanel();&lt;br /&gt;&#160;&#160;public TestTopComponent() {&lt;br /&gt;&#160; &#160; add (tp);&lt;br /&gt;&#160; &#160;
    associateLookup(tp.getLookup()));&lt;br /&gt;&#160; } &lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Das war es auch schon, der Rest läuft automatisch. Die Methode associateLookup reicht das erzeugte Lookup aus unserem Panel durch die getLookup-Methode von TestTopComponent heraus (getLookup ist schon in TopComponent implementiert).&#160; &lt;/p&gt; &lt;p class="bodytext"&gt;Es wird aber die Regel sein, dass TopComponents eigene Lookups benötigen oder gar mehrere Panels mit Lookups nutzen. Dabei
    hilft aber ProxyLookup: &lt;/p&gt; &lt;pre&gt;public class TestTopComponent extends TopComponent {&lt;br /&gt; TestPanel tp = new TestPanel();&lt;br /&gt;&#160; InstanceContent content = new InstanceContent();&lt;br /&gt;&#160; public TestTopComponent() {&lt;br /&gt;&#160; &#160; add (tp);&lt;br /&gt;&#160; &#160; associateLookup(&lt;br /&gt;&#160; &#160; &#160; new ProxyLookup (&lt;br /&gt;&#160; &#160; &#160; &#160; new AbstractLookup (instanceContent), &lt;br /&gt;&#160; &#160; &#160; &#160;
    tp.getLookup())&lt;br /&gt;&#160; &#160; );&lt;br /&gt;&#160; } &lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Jetzt kann man selber in content seine Objekte speichern, die man global zur Verfügung stellen will und verliert nicht die Verbindung&#160;zu den selektierten Nodes in TestPanel. &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;br /&gt;&lt;/p&gt;</content:encoded>
    <dc:date>2008-06-27T06:05:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_minimaler_einsatz_fuer_drag_and_drop_von_nodes/not_cached/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: Minimaler Einsatz für Drag and Drop von Nodes</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_minimaler_einsatz_fuer_drag_and_drop_von_nodes/not_cached/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Es funktioniert fast überall in den aktuellen Versionen der NetBeans IDE: Man kann in den Baumansichten die Elemente anklicken und mit gehaltener linker Maustaste an eine andere Position verschieben. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man das auch für die eigenen BeanTreeView-Komponenten haben will, muss man ein paar Methoden implementieren bzw. überschreiben, damit das funktioniert. &lt;/p&gt; &lt;p class="bodytext"&gt;In diesem "Kochrezept" habe ich
    ein sehr einfaches Modell gewählt, nur einen Root-Node mit einer einfachen Hierachie. Der Root-Node kann sogar ausgeblendet werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Man erzeugt&#160;ein JPanel oder TopComponent und implementiert&#160; ExplorerManager.Provider. Die Methode getExplorerManager liefert einen Standard-ExplorerManager: &lt;/p&gt; &lt;pre&gt;public class Test extends ToComponent &lt;br /&gt; implements ExplorerManager.Provider {&lt;br /&gt;&#160; private ExplorerManager em = new
    ExplorerManager();&lt;br /&gt;&#160; public Test() {&lt;br /&gt;&#160; &#160; super();&lt;br /&gt;&#160; &#160; initComponenents();&lt;br /&gt;&#160; &#160; getExplorerManager().setRootContextNode (new RootNode());&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public ExplorerManager getExplorerManager() {&lt;br /&gt;&#160; &#160; return em;&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; // ...&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;In initComponents() fügt man dieser Komponente z.B.
    einem BeanTreeView hinzu, damit man überhaupt etwas von diesem Beispiel hat.&lt;br /&gt;&lt;br /&gt;Nun benötigen wir die Klasse RootNode, die von AbstractNode abgeleitet wird und ein spezielles Children-Object an AbstractNode weiterreicht.&#160;Dies ist die erste Vorraussetzung, damit die untergeordneten Nodes überhaupt eine benutzerdefinierte Reihenfolge erhalten: &lt;/p&gt; &lt;pre&gt;public class RootNode extends AbstractNode {&lt;br /&gt;&#160; public RootNode() {&lt;br /&gt;&#160;&#160;&#160;
    super (new RootChildren());&lt;br /&gt;&#160; }&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Zwar ist RootNode noch nicht fertig, aber werfen wir mal einen Blick auf RootChildren: &lt;/p&gt; &lt;pre&gt;public class RootChildren extends Index.ArrayChildren{&lt;br /&gt;&#160; public RootChildren() {&lt;br /&gt;&#160;&#160;&#160; super();&lt;br /&gt;&#160; }&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Natürlich hätte oben in RootNode auch ein super (new Index.ArrayChildren()); gereicht (zumal
    RootChildren schon fertig ist), aber wenn man das für eigene Projekte erweitern will, ist es besser man hat eine größere Kontrolle über das Children-Modell. &lt;/p&gt; &lt;p class="bodytext"&gt;Index.ArrayChildren implementiert alle Verwaltungsaufgaben, um Positionen von Knoten zu managen. Das Drag and Drop UI der Views benötigen diese Implementation, um die Knoten anhand von Anwenderaktionen anzuordnen. &lt;/p&gt; &lt;p class="bodytext"&gt;Bis jetzt wurde also erst die Wurzel des Baumes definiert, und
    wie die untergeordneten Knoten im Container (Index.ArrayChildren) dieser RootNode gehalten werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Jetzt also zu den ChildNodes: &lt;/p&gt; &lt;pre&gt;public class ChildNode extends AbstractNode {&lt;br /&gt;&#160; private InstanceContent content;&lt;br /&gt;&lt;br /&gt;&#160; public ChildNode (NodeData data) {&lt;br /&gt;&#160;&#160;&#160; this (data, new InstanceContent());&lt;br /&gt;&#160; }&lt;br /&gt;&#160; &lt;br /&gt;&#160; public ChildNode (NodeData data,
    InstanceContent content) {&lt;br /&gt;&#160;&#160;&#160; super (Children.LEAF, new AbstractLookup (content));&lt;br /&gt;&#160;&#160;&#160; this.content = content;&lt;br /&gt;&#160;&#160;&#160; content.add(data);&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public NodeData getData() {&lt;br /&gt;&#160;&#160;&#160; return getLookup().lookup(NodeData.class);&lt;br /&gt;&#160; }&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Die obigen Konstruktoren entsprechen meinem Lieblingsaufbau von Nodes,
    die nur im Arbeitsspeicher gehalten werden. Das ist keine Vorraussetzung, um die Knoten per Drag and Drop zu verschieben. &lt;/p&gt; &lt;p class="bodytext"&gt;Allerdings muss nun noch folgende Methode ChildNode hinzugefügt werden: &lt;/p&gt; &lt;pre&gt;&#160; @Override&lt;br /&gt;&#160; public boolean canCut() {&lt;br /&gt;&#160;&#160;&#160; return true;&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Wenn ChildNode bei canCut immer false zurückgibt (und das ist in AbstractNode so
    festgelegt), funktioniert schon der erste Drag-Schritt nicht. In NetBeans wird Drag and Drop im Prinzip als Cut and Paste abgebildet. &lt;/p&gt; &lt;p class="bodytext"&gt;Damit wir später auch die Nodes unterscheiden können, implementieren wir getName() neu: &lt;/p&gt; &lt;pre&gt;&#160; @Override&lt;br /&gt;&#160; public String getName() {&lt;br /&gt;&#160;&#160;&#160; return getData().getName();&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Um die Sache lauffähig zu machen, brauchen wir
    noch NodeData: &lt;/p&gt; &lt;pre&gt;public class NodeData {&lt;br /&gt;&#160; private String name;&lt;br /&gt;&#160; public NodeData (String name) {&lt;br /&gt;&#160; &#160; this.name = name;&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public String getName() {&lt;br /&gt;&#160; &#160; return this.name;&lt;br /&gt;&#160; }&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Jetzt können wir endlich unsere&#160;Knoten im Constructor von der Klasse Test anlegen: &lt;/p&gt; &lt;pre&gt;&#160; public
    Test() {&lt;br /&gt;&#160; &#160; super();&lt;br /&gt;&#160; &#160; initComponenents();&lt;br /&gt;&#160; &#160; Node root = new RootNode(); &lt;br /&gt;&#160; &#160; getExplorerManager().setRootContextNode (root);&lt;br /&gt;&#160;&#160; &lt;br /&gt;&#160; &#160; root.getChildren().add (new Node[] {&lt;br /&gt;&#160; &#160; &#160; new ChildNode (new NodeData ("Erster Knoten")),&lt;br /&gt;&#160; &#160; &#160; new ChildNode (new NodeData ("Zweiter Knoten")),&lt;br /&gt; &#160; &#160; &#160; new
    ChildNode (new NodeData ("Dritter Knoten")),&lt;br /&gt; &#160; &#160; &#160; new ChildNode (new NodeData ("Letzter!!")),&lt;br /&gt; &#160; &#160; });&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Zwar wird es nicht gern gesehen die add()-Methode zu verwenden, im Falle von Index.Children und diesem Test ist es aber durchaus legitim. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man nun daraus ein fertiges Beispielprogramm gebastelt hat, wird man feststellen, dass das UI schon grundsätzlich
    reagiert. Man kann die Knoten per DnD ziehen und dabei zuschauen, wie das BeanTreeView am Zielort eine passende "Einfügemarke" anzeigt.&#160; &lt;/p&gt; &lt;p class="bodytext"&gt;Tja, aber das Fallenlassen funktioniert noch nicht. Der Mauszeiger straft uns auch mit einem Verbotszeichen. &lt;/p&gt; &lt;p class="bodytext"&gt;Damit das Drag and Drop schlussendlich wirklich funktioniert, muss man dem BeanTreeView über das Cookie-Set des übergeordneten Knotens den Children-Container bekanntgeben. In diesem
    Fall ist der übergeordnete Knoten natürlich unsere RootNode-Klasse. Dort fügen wir folgende Methode noch ein: &lt;/p&gt; &lt;pre&gt;&#160; @Override&lt;br /&gt;&#160; public Cookie getCookie (Class clazz) {&lt;br /&gt;&#160;&#160;&#160; Children ch = getChildren();&lt;br /&gt;&lt;br /&gt;&#160;&#160;&#160; if (clazz.isInstance(ch)) {&lt;br /&gt;&#160; &#160; &#160; // hier den Children-Container bekannt machen:&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; return (Cookie) ch;&lt;br /&gt;&#160;&#160;&#160;
    }&lt;br /&gt;&#160;&#160;&#160; return super.getCookie(clazz);&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Das hätte AbstractNode auch selber machen können... &lt;/p&gt; &lt;p class="bodytext"&gt;Jetzt funktioniert es endlich auch mit dem Drop-Teil von Drag and Drop. &lt;/p&gt; &lt;p class="bodytext"&gt;Hier nochmal die Zusammenfassung: &lt;/p&gt; &lt;p class="bodytext"&gt;Der Children-Container muss ein Index-ArrayChildren sein, damit benutzerdefinierte Positionen festgelegt werden
    können. Ansonsten wären die Nodes nur nach festen Kriterien sortiert. &lt;/p&gt; &lt;p class="bodytext"&gt;Damit der Drag-Teil überhaupt startet, muss in den Nodes canCut überschrieben werden und true zurückgeben. &lt;/p&gt; &lt;p class="bodytext"&gt;Und für den Drop-Teil muss das View (hier BeanTreeView) auf den Children-Container zugreifen können, um anhand des Interfaces überhaupt ermitteln zu können, dass Nodes angeordnet werden können. &lt;/p&gt; &lt;p class="bodytext"&gt;Das war es auch schon.
    Viel Spaß mit dem Kochrezept und dem Ergebnis eines modernen UIs. &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt;</content:encoded>
    <dc:date>2008-06-26T08:45:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_minimaler_einsatz_fuer_drag_and_drop_von_nodes/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: Minimaler Einsatz für Drag and Drop von Nodes</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_minimaler_einsatz_fuer_drag_and_drop_von_nodes/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Es funktioniert fast überall in den aktuellen Versionen der NetBeans IDE: Man kann in den Baumansichten die Elemente anklicken und mit gehaltener linker Maustaste an eine andere Position verschieben. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man das auch für die eigenen BeanTreeView-Komponenten haben will, muss man ein paar Methoden implementieren bzw. überschreiben, damit das funktioniert. &lt;/p&gt; &lt;p class="bodytext"&gt;In diesem "Kochrezept" habe ich
    ein sehr einfaches Modell gewählt, nur einen Root-Node mit einer einfachen Hierachie. Der Root-Node kann sogar ausgeblendet werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Man erzeugt&#160;ein JPanel oder TopComponent und implementiert&#160; ExplorerManager.Provider. Die Methode getExplorerManager liefert einen Standard-ExplorerManager: &lt;/p&gt; &lt;pre&gt;public class Test extends ToComponent &lt;br /&gt; implements ExplorerManager.Provider {&lt;br /&gt;&#160; private ExplorerManager em = new
    ExplorerManager();&lt;br /&gt;&#160; public Test() {&lt;br /&gt;&#160; &#160; super();&lt;br /&gt;&#160; &#160; initComponenents();&lt;br /&gt;&#160; &#160; getExplorerManager().setRootContextNode (new RootNode());&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public ExplorerManager getExplorerManager() {&lt;br /&gt;&#160; &#160; return em;&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; // ...&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;In initComponents() fügt man dieser Komponente z.B.
    einem BeanTreeView hinzu, damit man überhaupt etwas von diesem Beispiel hat.&lt;br /&gt;&lt;br /&gt;Nun benötigen wir die Klasse RootNode, die von AbstractNode abgeleitet wird und ein spezielles Children-Object an AbstractNode weiterreicht.&#160;Dies ist die erste Vorraussetzung, damit die untergeordneten Nodes überhaupt eine benutzerdefinierte Reihenfolge erhalten: &lt;/p&gt; &lt;pre&gt;public class RootNode extends AbstractNode {&lt;br /&gt;&#160; public RootNode() {&lt;br /&gt;&#160;&#160;&#160;
    super (new RootChildren());&lt;br /&gt;&#160; }&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Zwar ist RootNode noch nicht fertig, aber werfen wir mal einen Blick auf RootChildren: &lt;/p&gt; &lt;pre&gt;public class RootChildren extends Index.ArrayChildren{&lt;br /&gt;&#160; public RootChildren() {&lt;br /&gt;&#160;&#160;&#160; super();&lt;br /&gt;&#160; }&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Natürlich hätte oben in RootNode auch ein super (new Index.ArrayChildren()); gereicht (zumal
    RootChildren schon fertig ist), aber wenn man das für eigene Projekte erweitern will, ist es besser man hat eine größere Kontrolle über das Children-Modell. &lt;/p&gt; &lt;p class="bodytext"&gt;Index.ArrayChildren implementiert alle Verwaltungsaufgaben, um Positionen von Knoten zu managen. Das Drag and Drop UI der Views benötigen diese Implementation, um die Knoten anhand von Anwenderaktionen anzuordnen. &lt;/p&gt; &lt;p class="bodytext"&gt;Bis jetzt wurde also erst die Wurzel des Baumes definiert, und
    wie die untergeordneten Knoten im Container (Index.ArrayChildren) dieser RootNode gehalten werden. &lt;/p&gt; &lt;p class="bodytext"&gt;Jetzt also zu den ChildNodes: &lt;/p&gt; &lt;pre&gt;public class ChildNode extends AbstractNode {&lt;br /&gt;&#160; private InstanceContent content;&lt;br /&gt;&lt;br /&gt;&#160; public ChildNode (NodeData data) {&lt;br /&gt;&#160;&#160;&#160; this (data, new InstanceContent());&lt;br /&gt;&#160; }&lt;br /&gt;&#160; &lt;br /&gt;&#160; public ChildNode (NodeData data,
    InstanceContent content) {&lt;br /&gt;&#160;&#160;&#160; super (Children.LEAF, new AbstractLookup (content));&lt;br /&gt;&#160;&#160;&#160; this.content = content;&lt;br /&gt;&#160;&#160;&#160; content.add(data);&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public NodeData getData() {&lt;br /&gt;&#160;&#160;&#160; return getLookup().lookup(NodeData.class);&lt;br /&gt;&#160; }&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Die obigen Konstruktoren entsprechen meinem Lieblingsaufbau von Nodes,
    die nur im Arbeitsspeicher gehalten werden. Das ist keine Vorraussetzung, um die Knoten per Drag and Drop zu verschieben. &lt;/p&gt; &lt;p class="bodytext"&gt;Allerdings muss nun noch folgende Methode ChildNode hinzugefügt werden: &lt;/p&gt; &lt;pre&gt;&#160; @Override&lt;br /&gt;&#160; public boolean canCut() {&lt;br /&gt;&#160;&#160;&#160; return true;&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Wenn ChildNode bei canCut immer false zurückgibt (und das ist in AbstractNode so
    festgelegt), funktioniert schon der erste Drag-Schritt nicht. In NetBeans wird Drag and Drop im Prinzip als Cut and Paste abgebildet. &lt;/p&gt; &lt;p class="bodytext"&gt;Damit wir später auch die Nodes unterscheiden können, implementieren wir getName() neu: &lt;/p&gt; &lt;pre&gt;&#160; @Override&lt;br /&gt;&#160; public String getName() {&lt;br /&gt;&#160;&#160;&#160; return getData().getName();&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Um die Sache lauffähig zu machen, brauchen wir
    noch NodeData: &lt;/p&gt; &lt;pre&gt;public class NodeData {&lt;br /&gt;&#160; private String name;&lt;br /&gt;&#160; public NodeData (String name) {&lt;br /&gt;&#160; &#160; this.name = name;&lt;br /&gt;&#160; }&lt;br /&gt;&lt;br /&gt;&#160; public String getName() {&lt;br /&gt;&#160; &#160; return this.name;&lt;br /&gt;&#160; }&lt;br /&gt;}&lt;/pre&gt; &lt;p class="bodytext"&gt;Jetzt können wir endlich unsere&#160;Knoten im Constructor von der Klasse Test anlegen: &lt;/p&gt; &lt;pre&gt;&#160; public
    Test() {&lt;br /&gt;&#160; &#160; super();&lt;br /&gt;&#160; &#160; initComponenents();&lt;br /&gt;&#160; &#160; Node root = new RootNode(); &lt;br /&gt;&#160; &#160; getExplorerManager().setRootContextNode (root);&lt;br /&gt;&#160;&#160; &lt;br /&gt;&#160; &#160; root.getChildren().add (new Node[] {&lt;br /&gt;&#160; &#160; &#160; new ChildNode (new NodeData ("Erster Knoten")),&lt;br /&gt;&#160; &#160; &#160; new ChildNode (new NodeData ("Zweiter Knoten")),&lt;br /&gt; &#160; &#160; &#160; new
    ChildNode (new NodeData ("Dritter Knoten")),&lt;br /&gt; &#160; &#160; &#160; new ChildNode (new NodeData ("Letzter!!")),&lt;br /&gt; &#160; &#160; });&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Zwar wird es nicht gern gesehen die add()-Methode zu verwenden, im Falle von Index.Children und diesem Test ist es aber durchaus legitim. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man nun daraus ein fertiges Beispielprogramm gebastelt hat, wird man feststellen, dass das UI schon grundsätzlich
    reagiert. Man kann die Knoten per DnD ziehen und dabei zuschauen, wie das BeanTreeView am Zielort eine passende "Einfügemarke" anzeigt.&#160; &lt;/p&gt; &lt;p class="bodytext"&gt;Tja, aber das Fallenlassen funktioniert noch nicht. Der Mauszeiger straft uns auch mit einem Verbotszeichen. &lt;/p&gt; &lt;p class="bodytext"&gt;Damit das Drag and Drop schlussendlich wirklich funktioniert, muss man dem BeanTreeView über das Cookie-Set des übergeordneten Knotens den Children-Container bekanntgeben. In diesem
    Fall ist der übergeordnete Knoten natürlich unsere RootNode-Klasse. Dort fügen wir folgende Methode noch ein: &lt;/p&gt; &lt;pre&gt;&#160; @Override&lt;br /&gt;&#160; public Cookie getCookie (Class clazz) {&lt;br /&gt;&#160;&#160;&#160; Children ch = getChildren();&lt;br /&gt;&lt;br /&gt;&#160;&#160;&#160; if (clazz.isInstance(ch)) {&lt;br /&gt;&#160; &#160; &#160; // hier den Children-Container bekannt machen:&lt;br /&gt;&#160;&#160;&#160;&#160;&#160; return (Cookie) ch;&lt;br /&gt;&#160;&#160;&#160;
    }&lt;br /&gt;&#160;&#160;&#160; return super.getCookie(clazz);&lt;br /&gt;&#160; }&lt;/pre&gt; &lt;p class="bodytext"&gt;Das hätte AbstractNode auch selber machen können... &lt;/p&gt; &lt;p class="bodytext"&gt;Jetzt funktioniert es endlich auch mit dem Drop-Teil von Drag and Drop. &lt;/p&gt; &lt;p class="bodytext"&gt;Hier nochmal die Zusammenfassung: &lt;/p&gt; &lt;p class="bodytext"&gt;Der Children-Container muss ein Index-ArrayChildren sein, damit benutzerdefinierte Positionen festgelegt werden
    können. Ansonsten wären die Nodes nur nach festen Kriterien sortiert. &lt;/p&gt; &lt;p class="bodytext"&gt;Damit der Drag-Teil überhaupt startet, muss in den Nodes canCut überschrieben werden und true zurückgeben. &lt;/p&gt; &lt;p class="bodytext"&gt;Und für den Drop-Teil muss das View (hier BeanTreeView) auf den Children-Container zugreifen können, um anhand des Interfaces überhaupt ermitteln zu können, dass Nodes angeordnet werden können. &lt;/p&gt; &lt;p class="bodytext"&gt;Das war es auch schon.
    Viel Spaß mit dem Kochrezept und dem Ergebnis eines modernen UIs. &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt;</content:encoded>
    <dc:date>2008-06-26T08:45:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_notfall_branding_nb_61_plattform_zu_90_auf_deutsch/not_cached/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: Notfall-Branding - NB 6.1 Plattform zu 90% auf Deutsch</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_notfall_branding_nb_61_plattform_zu_90_auf_deutsch/not_cached/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Wenn man mit NetBeans 6.1 bereits entwickelt, ist es leider recht unschön, dass man keine lokalisierte Version zur Verfügung hat. &lt;/p&gt; &lt;p class="bodytext"&gt;Für einen Prototypen benötigte ich aber unbedingt eine, größtenteils, in das Deutsche übersetzte Plattform.&#160; &lt;/p&gt; &lt;p class="bodytext"&gt;Was man auf keinen Fall machen darf, ist das Localization Kit für NetBeans 6.0x zu installieren. Es werden dann die Module der plattform7
    installiert, was für RichClient Anwendungen der build-Tod ist. Da muss man erstmal wieder kräftig von Hand aufräumen. &lt;/p&gt; &lt;p class="bodytext"&gt;Ich habe mir also das platform7-de.nbm geschnappt, entpackt, alle jarFiles in&#160; Ordner gewandelt und alle Bundle_de.properties in Bundle.properties umbenannt. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man nun diese 41 lokalisierten Bundle-Ordner in das branding/modules - Verzeichnis kopiert hat man zumindest eine leidlich gute Übersetzung 90%
    aller plattformspezifischen Texte. Was nicht übersetzt ist, sind neue Labels der 6.1'er Version und die paar Texte, die schon bei 6.0.1 und 6.0 durchs Raster gefallen waren. &lt;/p&gt; &lt;p class="bodytext"&gt;Die Dateien muss man im File-Explorer (nicht Projects) unter branding einfügen. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;Hier das Archiv &lt;a href="http://www.sepix.de/fileadmin/modules.zip" target="_blank" title="Opens external link in current
    window"&gt;modules.zip&lt;/a&gt; mit den Bundle.properties. &lt;/p&gt; &lt;p class="bodytext"&gt;Ich muss aber darauf hinweisen, dass das nix für eine produktive Anwendung ist! &lt;/p&gt; &lt;p class="bodytext"&gt;Für meinen Prototypen hat es gereicht. :-) &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;br /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt;</content:encoded>
    <dc:date>2008-06-20T13:47:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_notfall_branding_nb_61_plattform_zu_90_auf_deutsch/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: Notfall-Branding - NB 6.1 Plattform zu 90% auf Deutsch</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_notfall_branding_nb_61_plattform_zu_90_auf_deutsch/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Wenn man mit NetBeans 6.1 bereits entwickelt, ist es leider recht unschön, dass man keine lokalisierte Version zur Verfügung hat. &lt;/p&gt; &lt;p class="bodytext"&gt;Für einen Prototypen benötigte ich aber unbedingt eine, größtenteils, in das Deutsche übersetzte Plattform.&#160; &lt;/p&gt; &lt;p class="bodytext"&gt;Was man auf keinen Fall machen darf, ist das Localization Kit für NetBeans 6.0x zu installieren. Es werden dann die Module der plattform7
    installiert, was für RichClient Anwendungen der build-Tod ist. Da muss man erstmal wieder kräftig von Hand aufräumen. &lt;/p&gt; &lt;p class="bodytext"&gt;Ich habe mir also das platform7-de.nbm geschnappt, entpackt, alle jarFiles in&#160; Ordner gewandelt und alle Bundle_de.properties in Bundle.properties umbenannt. &lt;/p&gt; &lt;p class="bodytext"&gt;Wenn man nun diese 41 lokalisierten Bundle-Ordner in das branding/modules - Verzeichnis kopiert hat man zumindest eine leidlich gute Übersetzung 90%
    aller plattformspezifischen Texte. Was nicht übersetzt ist, sind neue Labels der 6.1'er Version und die paar Texte, die schon bei 6.0.1 und 6.0 durchs Raster gefallen waren. &lt;/p&gt; &lt;p class="bodytext"&gt;Die Dateien muss man im File-Explorer (nicht Projects) unter branding einfügen. &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;Hier das Archiv &lt;a href="http://www.sepix.de/fileadmin/modules.zip" target="_blank" title="Opens external link in current
    window"&gt;modules.zip&lt;/a&gt; mit den Bundle.properties. &lt;/p&gt; &lt;p class="bodytext"&gt;Ich muss aber darauf hinweisen, dass das nix für eine produktive Anwendung ist! &lt;/p&gt; &lt;p class="bodytext"&gt;Für meinen Prototypen hat es gereicht. :-) &lt;/p&gt; &lt;p class="bodytext"&gt;Beste Grüße,&lt;br /&gt;&#160; Josch.&lt;br /&gt; &lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt; &lt;p class="bodytext"&gt;&#160;&lt;/p&gt;</content:encoded>
    <dc:date>2008-06-20T13:47:00+00:00</dc:date>
  </item>
  <item rdf:about="http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_topcomponent_und_paletten_wie_ich_sie_zusammen_brachte/not_cached/index.html">
    <title>JNBB - Joschs NetBeans Blog: BeanDev: TopComponent und Paletten (wie ich sie zusammen brachte)</title>
    <link>http://www.sepix.de/blogs/blogrittner/blog/archive////beandev_topcomponent_und_paletten_wie_ich_sie_zusammen_brachte/not_cached/index.html</link>
    <content:encoded>&lt;p class="bodytext"&gt;Seit sechs Monaten beschäftige ich mich damit, meine alten Projekte soweit umzubauen, dass diese relativ einfach in die NetBeans Plattform integriert werden können. Dieses Refactoring hat eigentlich nichts mit NB zu tun, es geht nur darum eine vernünftige Modularisierung zu erreichen. &lt;/p&gt; &lt;p class="bodytext"&gt;In den letzten drei Monaten habe ich schon verstärkt neue Projekte ausschließlich auf der NetBeans 6.0 (und nun 6.1) Plattform implementiert.
    Immer wieder stoße ich dabei auf Probleme, bei denen mir kein Buch, kein Tutorial und kein Wiki helfen will oder kann. &lt;/p&gt; &lt;p class="bodytext"&gt;Insbesondere die Tutorials, mit ihrem Anspruch sehr einfach aufgebaut sein zu wollen, schicken immer wieder auf den Irrweg und hinterlassen manchmal einen verstörten Programmierer mit verzweifeltem Gesichtsausdruck, ausgerauften Haaren und der letztendlichen Erkenntnis: So einfach ist das nun auch wieder nicht. &lt;/p&gt; &lt;p
    class="bodytext"&gt;Dazu gehören auch Paletten und ihre (nahezu mystische) Fähigkeit, sich automatisch einzublenden, wenn man ein TopComponent-Fenster öffnet. &lt;/p&gt; &lt;p class="bodytext"&gt;Jeder NB-Entwickler kennt die netten Helferlein, die z.B. beim Öffnen des Formeditors sich zusätzlich einblenden. So was wollte ich auch in meiner Anwendung haben. Es geht um eine Palette, die Funktionseinheiten für einen Query-Builder liefern s