blob: ecff381019d96cbb37268479c41c9a2d03535a81 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- -*- xhtml -*- -->
<title>Platform Ribbon Bar Integration Tutorial for NetBeans Platform</title>
<meta name="AUDIENCE" content="NBUSER"/>
<meta name="TYPE" content="ARTICLE"/>
<meta name="EXPIRES" content="N"/>
<meta name="developer" content="geertjan.wielenga@oracle.com"/>
<meta name="indexed" content="y"/>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<meta name="description"
content="A guide to integrating a ribbon bar into the NetBeans Platform."/>
<link rel="stylesheet" type="text/css" href="https://netbeans.org/netbeans.css"/>
</head>
<!-- Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014 Oracle and/or its affiliates. All rights reserved. -->
<!-- Use is subject to license terms.-->
<body>
<h1><a name="top"></a>NetBeans Platform Ribbon Bar Integration Tutorial</h1>
<p>Microsoft Office introduced the concept of a ribbon bar, which Kirill Grouchnikov
made available to Java applications via his <a href="http://java.dzone.com/articles/flamingo-tutorial">Flamingo library</a>:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/briefcase_16.png"/></p>
<p>Based on this work,
Chris Bohme from <a href="http://pinkmatter.com/">PinkMatter Solutions</a> created an extensible ribbon bar for
NetBeans Platform applications. The work done by Chris Bohme has been open sourced and forms
the basis of this tutorial.</p>
<p><b class="notes">Note:</b> The instructions that follow focus on a lot of XML tags. None of these
need to be typed by hand. Instead, as described in the section entitled
"Using Annotations to Register the NetBeans Ribbon Bar", you do not need to use any XML tags at all
since these can be generated at compile-time by a NetBeans Platform annotation processor.
However, it helps to understand how the Ribbon integration works and therefore we begin by looking
at XML tags. Once you are familiar with them, you can simply forget about them, and use the annotations
instead.</p>
<p><strong class="notes">Note: </strong>This document uses NetBeans Platform 8.0 and
NetBeans IDE 8.0. If you
are using an earlier version, see <a href="74/nbm-ribbonbar.html">the previous version
of this document</a>.</p>
<p><b>Contents</b></p>
<p><img src="../images/articles/80/netbeans-stamp.png" class="stamp" width="114" height="114" alt="Content on this page applies to NetBeans IDE 8.0" title="Content on this page applies to NetBeans IDE 8.0"/></p>
<ul class="toc">
<li><a href="#intro">Getting to Know the Ribbon Bar</a></li>
<li><a href="#setup">Setting Up the NetBeans Ribbon Bar</a></li>
<li><a href="#features">Using the NetBeans Ribbon Bar Features</a>
<ul>
<li><a href="#appmenu">Application Menu</a></li>
<li><a href="#taskbar">Task Bar</a></li>
<li><a href="#taskpane">Task Pane</a></li>
<li><a href="#helpbutton">Help Button</a></li>
</ul>
</li>
<li><a href="#annotations">Using Annotations to Register the NetBeans Ribbon Bar</a></li>
<li><a href="#tooltip">Creating Ribbon Tooltips</a></li>
<li><a href="#api">Using the Ribbon API</a></li>
<li><a href="#customize-appmenu">Customizing the Application Menu</a></li>
<li><a href="#reading">Further Reading</a></li>
</ul>
<p><b>To follow this tutorial, you need the software and resources listed in the following
table.</b></p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">Software or Resource</th>
<th class="tblheader" scope="col">Version Required</th>
</tr>
<tr>
<td class="tbltd1"><a href="https://netbeans.org/downloads/index.html">NetBeans IDE</a></td>
<td class="tbltd1">version 8.0 or above</td>
</tr>
<tr>
<td class="tbltd1"><a href="http://java.sun.com/javase/downloads/index.jsp">Java Developer Kit (JDK)</a></td>
<td class="tbltd1">version 7 or above</td>
</tr>
</tbody>
</table>
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="intro"></a>Getting to Know the Ribbon Bar</h2>
<p>Chris Bohme extrapolated the NetBeans ribbon bar from
an application named <a href="http://netbeans.dzone.com/news/intelligence-gathering">Maltego</a>, created by himself
and others at PinkMatter Solutions.
Maltego is an artificial intelligence application. Take note of
the toolbar in the screenshot of Maltego below:</p>
<p><img src="http://netbeans.dzone.com/sites/all/files/Maltego3-small.png"/></p>
<p>Now, watch Chris Bohme's introduction to the NetBeans ribbon bar integration here:</p>
<p><iframe width="480" height="390" src="https://www.youtube.com/embed/SUILKGVntDQ" frameborder="0" allowfullscreen></iframe></p>
<p><b class="notes">Note:</b> The YouTube video above stops unexpectedly. Attempts are being made
to provide the full video, though the main points of the PinkMatter integration are already addressed
in the above.</p>
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="setup"></a>Setting Up the NetBeans Ribbon Bar</h2>
<p>The NetBeans ribbon bar is open sourced on java.net. In this section, you download
the sources that make up the ribbon bar integration. Taken together, the sources form
an application in themselves. When you run them, you see a basic NetBeans Platform
application that includes the ribbon bar. You are then shown how to set up your own
application to use the ribbon bar as a platform for integration into your own
application.</p>
<p class="tips">If you want to try out these instructions on an actual
application prior to trying them out on your own
sources, you can use the NetBeans Platform Paint
Application, which you can get from the Samples
category in the New Project wizard (Ctrl-Shift-N). That is the
example application that will be referred to throughout this
tutorial.</p>
<div class="indent">
<ol>
<li><p>Check out the NetBeans ribbon bar integration here:</p>
<p><a href="http://java.net/projects/nbribbonbar/">http://java.net/projects/nbribbonbar/</a></p>
<!-- <p><b class="notes">Note:</b> At the time of writing, 'nbribbonbar' is still a private project
in an incubator on java.net. If you click the above link and cannot access the sources, <a href="http://www.pinkmatter.co.za/Blog/tabid/65/EntryId/2/Netbeans-platform-ribbon-bar-library.aspx">go to this location</a>
instead, where they are found within a PinkMatter blog entry.</p>-->
</li>
<li><p>You should now have these folders on disk:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/suite-on-disk.png"/></p>
</li>
<li><p>Open the application into NetBeans IDE. You should now see this:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/suite-on-disk2.png"/></p></li>
<li><p>Run the application and explore the ribbon bar:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/rundemo-1.png"/></p>
<p>Above, you see the initial appearance of the demo application. It consists of the
NetBeans Platform modules, plus a module wrapping the Flamingo JARs, plus
a module providing NetBeans Platform integration code for the Flamingo JARs,
plus a test module showing how to use the other two modules to create a
ribbon bar.</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/rundemo-2.png"/></p>
<p>Above, you see the application menu. It is shown when you click on the
big icon top left in the application. Each action in the application menu
can expand, as shown above, depending on whether a folder is registered
or just an individual file.</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/rundemo-3.png"/></p>
<p>Above, you see a composite panel, constructed from the Ribbon API, as shown
towards the end of this tutorial, and registered in the application via
the <tt>layer.xml</tt> file.</p>
</li>
<li><p>Now let's set up our own application to use the ribbon bar. Right-click your own
application, go to Properties, and then choose Libraries. You should now see this:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/projprop1.png"/></p>
<p class="tips"> Depending on the modules you're using in your own application,
you will have different clusters included in the list above. For the
NetBeans Paint Application, which is the sample application used in this
tutorial, only the "platform" cluster is included.</p></li>
<li><p>Click Add Cluster and then browse to the top folder of the platform
that you checked out:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/projprop2.png"/></p>
<p>Click OK and you will see that you have the ribbon platform as a new cluster, with the
two modules selected that you need:</p>
<p><img style="border:1px solid black" alt="enable harness" src="../images/tutorials/ribbon/projprop3.png"/></p>
<p>Click OK to exit the Project Properties dialog.</p>
</li>
<li><p>Run the application and you should see the application menu, without any content, with
all the existing menus and toolbars removed:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/projprop4.png"/></p>
</li>
</ol>
<p>You have now set up your own application to use the PinkMatter ribbon integration. In the next
section, you will add actions from your application to the application menu, task bar,
and task panes of the ribbon.</p>
</div>
<!-- ===================================================================================== -->
<h2 class="tutorial"><a name="features"></a>Using the NetBeans Ribbon Bar Features</h2>
<p>Now that our ribbon bar is set up, we will use its features.</p>
<div class="indent">
<p><a name="appmenu"></a></p><h3 class="tutorial">Application Menu</h3>
<p>The application menu is one of the most visible differentiators
of the ribbon bar. It is accessed via the large button in the
top left of the application. In this section, you learn how to
add new items to the application menu.</p>
<ol>
<li><p>In the <tt>layer.xml</tt> of the Paint module in the Paint Application,
copy the content of the Menu/File folder into a new folder
named Ribbon/AppMenu:</p>
<pre class="examplecode">&lt;folder name="Ribbon"&gt;
&lt;folder name="AppMenu"&gt;
&lt;attr name="position" intvalue="0"/&gt;
&lt;file name="SaveAction.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/File/org-openide-actions-SaveAction.instance"/&gt;
&lt;attr name="position" intvalue="100"/&gt;
&lt;/file&gt;
&lt;file name="SeparatorAfterSave.instance"&gt;
&lt;attr name="instanceClass" stringvalue="javax.swing.JSeparator"/&gt;
&lt;attr name="position" intvalue="110"/&gt;
&lt;/file&gt;
&lt;file name="SeparatorBeforeExit.instance"&gt;
&lt;attr name="instanceClass" stringvalue="javax.swing.JSeparator"/&gt;
&lt;attr name="position" intvalue="3990"/&gt;
&lt;/file&gt;
&lt;file name="ExitAction.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/File/org-netbeans-core-actions-SystemExit.instance"/&gt;
&lt;attr name="position" intvalue="4000"/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;/folder&gt;</pre>
</li>
<li><p>Run the application and you should see this:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/runpaint-1.png"/></p>
<p class="tips">The icons used above and throughout this tutorial come from
the sources you downloaded from Kenai. One of the modules contains a folder
named "com.pinkmatter.test.flamingo.resources", which provides a very long
list of icons that you can use for many of the most commonly used actions
in your application.</p>
</li>
<li><p>It would be more idiomatic to place the Exit action, as well as an Options action, inside
buttons within the application menu. That "AppMenuFooter" folder exists for that
purpose Therefore, rewrite the layer entries above
to these:</p>
<pre class="examplecode">&lt;folder name="Ribbon"&gt;
&lt;folder name="AppMenu"&gt;
&lt;attr name="position" intvalue="0"/&gt;
&lt;file name="SaveAction.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/File/org-openide-actions-SaveAction.instance"/&gt;
&lt;attr name="position" intvalue="100"/&gt;
&lt;/file&gt;
&lt;/folder&gt;
<b>&lt;folder name="AppMenuFooter"&gt;
&lt;file name="org-netbeans-core-actions-SystemExit.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/File/org-netbeans-core-actions-SystemExit.instance"/&gt;
&lt;attr name="position" intvalue="100"/&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Exit.png"/&gt;
&lt;/file&gt;
&lt;file name="org-netbeans-modules-options-OptionsWindowAction.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/Window/org-netbeans-modules-options-OptionsWindowAction.instance"/&gt;
&lt;attr name="position" intvalue="200"/&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Tools.png"/&gt;
&lt;/file&gt;
&lt;/folder&gt;</b>
&lt;/folder&gt;</pre>
<li><p>Run the application again and you should see this:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/runpaint-2.png"/></p>
</li>
<li><p>By creating a subfolder within Ribbon/AppMenu, you can register an action that
expands to show the actions within its folder:</p>
<pre class="examplecode">&lt;folder name="Ribbon"&gt;
&lt;folder name="AppMenu"&gt;
&lt;file name="SaveAction.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/File/org-openide-actions-SaveAction.instance"/&gt;
&lt;attr name="position" intvalue="100"/&gt;
&lt;/file&gt;
<b>&lt;folder name="Print"&gt;
&lt;attr name="position" intvalue="200"/&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Print.png"/&gt;
&lt;folder name="Print Actions"&gt;
&lt;file name="org-netbeans-modules-print-action-PageSetupAction.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/File/org-netbeans-modules-print-action-PageSetupAction.instance"/&gt;
&lt;attr name="position" intvalue="100"/&gt;
&lt;attr name="description" bundlevalue="com.pinkmatter.test.flamingo.actions.Bundle#HINT_PageSetupAction"/&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Config.png"/&gt;
&lt;/file&gt;
&lt;file name="org-netbeans-modules-print-action-PrintAction.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/File/org-netbeans-modules-print-action-PrintAction.instance"/&gt;
&lt;attr name="position" intvalue="600"/&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Print.png"/&gt;
&lt;attr name="description" bundlevalue="com.pinkmatter.test.flamingo.actions.Bundle#HINT_PrintAction"/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;/folder&gt;</b>
&lt;file name="org-netbeans-modules-options-OptionsWindowAction.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/Window/org-netbeans-modules-options-OptionsWindowAction.instance"/&gt;
&lt;attr name="position" intvalue="200"/&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Tools.png"/&gt;
&lt;/file&gt;
&lt;file name="org-netbeans-core-actions-SystemExit.shadow"&gt;
&lt;attr name="position" intvalue="300"/&gt;
&lt;attr name="originalFile" stringvalue="Actions/File/org-netbeans-core-actions-SystemExit.instance"/&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Exit.png"/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;folder name="AppMenuFooter"&gt;
&lt;file name="org-netbeans-core-actions-SystemExit.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/File/org-netbeans-core-actions-SystemExit.instance"/&gt;
&lt;attr name="position" intvalue="100"/&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Exit.png"/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;/folder&gt;</pre> </li>
<li><p>Run the application again and you should see this:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/runpaint-3.png"/></p>
</li>
</ol>
<p>You have now used all the features of the ribbon bar's application menu.</p>
</div>
<div class="indent">
<p><a name="taskbar"></a></p><h3 class="tutorial">Task Bar</h3>
<p>The task bar is the small toolbar at the top of the application, above
the task panes. Each action registered in the task base causes a
toolbar button to be created. Folders registered in the task bar
cause drop-down buttons to be created from which the actions that are
children of the folder can be invoked.</p>
<ol>
<li><p>Rewrite the whole Ribbon folder to the following:</p>
<pre class="examplecode">&lt;folder name="Ribbon"&gt;
&lt;folder name="TaskBar"&gt;
&lt;file name="SaveAction.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/File/org-openide-actions-SaveAction.instance"/&gt;
&lt;attr name="position" intvalue="100"/&gt;
&lt;/file&gt;
&lt;folder name="Print"&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Print.png"/&gt;
&lt;attr name="position" intvalue="200"/&gt;
&lt;folder name="Print Actions"&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Print.png"/&gt;
&lt;file name="org-netbeans-modules-print-action-PageSetupAction.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/File/org-netbeans-modules-print-action-PageSetupAction.instance"/&gt;
&lt;attr name="position" intvalue="100"/&gt;
&lt;attr name="description" bundlevalue="com.pinkmatter.test.flamingo.actions.Bundle#HINT_PageSetupAction"/&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Config.png"/&gt;
&lt;/file&gt;
&lt;file name="org-netbeans-modules-print-action-PrintAction.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/File/org-netbeans-modules-print-action-PrintAction.instance"/&gt;
&lt;attr name="position" intvalue="600"/&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Print.png"/&gt;
&lt;attr name="description" bundlevalue="com.pinkmatter.test.flamingo.actions.Bundle#HINT_PrintAction"/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;folder name="Print Options"&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Tools.png"/&gt;
&lt;file name="org-netbeans-modules-options-OptionsWindowAction.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/Window/org-netbeans-modules-options-OptionsWindowAction.instance"/&gt;
&lt;attr name="position" intvalue="200"/&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Tools.png"/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;/folder&gt;
&lt;file name="org-netbeans-core-actions-SystemExit.shadow"&gt;
&lt;attr name="position" intvalue="300"/&gt;
&lt;attr name="originalFile" stringvalue="Actions/File/org-netbeans-core-actions-SystemExit.instance"/&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Exit.png"/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;/folder&gt;</pre>
</li>
<li><p>You should now see the task bar with the following content:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/runpaint-5.png"/></p>
<p>A drop-down button is created because you registered a folder:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/runpaint-4.png"/></p>
<p>Each drop-down button shows the actions registered as files with the folder:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/runpaint-6.png"/></p>
</li>
</ol>
<p>You have now used the ribbon task bar in your application.</p>
</div>
<div class="indent">
<p><a name="taskpane"></a></p><h3 class="tutorial">Task Pane</h3>
<p>The task pane is a pane within the tabbed toolbar of the application. Actions are
registered into a task pane via the Ribbon/TaskPanes folder. Each folder within
Ribbon/TaskPanes defines a new pane. For example, "Ribbon/TaskPanes/Tools" defines
a new task pane named "Tools". Each task pane is further split into separate containers.
For example, "Ribbon/TaskPanes/Tools/Use" could be a folder for registering actions that
can be used, while "Ribbon/TaskPanes/Tools/Change" could be a container for changing
or customizing features relating to Tools in the application.</p>
<ol>
<li><p>Rewrite the Ribbon folder in the <tt>layer.xml</tt> to the following:</p>
<pre class="examplecode">&lt;folder name="Ribbon"&gt;
&lt;folder name="TaskPanes"&gt;
&lt;folder name="Main"&gt;
&lt;folder name="File"&gt;
&lt;file name="SaveAction.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/File/org-openide-actions-SaveAction.instance"/&gt;
&lt;attr name="position" intvalue="100"/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;/folder&gt;
&lt;folder name="Tools"&gt;
&lt;folder name="Use"&gt;
&lt;attr name="position" intvalue="100"/&gt;
&lt;file name="org-netbeans-modules-print-action-PageSetupAction.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/File/org-netbeans-modules-print-action-PageSetupAction.instance"/&gt;
&lt;attr name="position" intvalue="100"/&gt;
&lt;attr name="description" bundlevalue="com.pinkmatter.test.flamingo.actions.Bundle#HINT_PageSetupAction"/&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Config.png"/&gt;
&lt;/file&gt;
&lt;file name="org-netbeans-modules-print-action-PrintAction.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/File/org-netbeans-modules-print-action-PrintAction.instance"/&gt;
&lt;attr name="position" intvalue="600"/&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Print.png"/&gt;
&lt;attr name="description" bundlevalue="com.pinkmatter.test.flamingo.actions.Bundle#HINT_PrintAction"/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;folder name="Change"&gt;
&lt;attr name="position" intvalue="200"/&gt;
&lt;file name="org-netbeans-modules-options-OptionsWindowAction.shadow"&gt;
&lt;attr name="originalFile" stringvalue="Actions/Window/org-netbeans-modules-options-OptionsWindowAction.instance"/&gt;
&lt;attr name="position" intvalue="200"/&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Tools.png"/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;/folder&gt;
&lt;/folder&gt;
&lt;/folder&gt;</pre>
</li>
<li><p>Run the application again and you should see this:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/runpaint-7.png"/></p>
</li>
</ol>
<p>You have now used task panes in your ribbon bar to organize actions into a tabbed toolbar.</p>
</div>
<div class="indent">
<p><a name="helpbutton"></a></p><h3 class="tutorial">Help Button</h3>
<p>The help button is always displayed top right in the ribbon bar.</p>
<ol>
<li><p>Rewrite the Ribbon folder as follows:</p>
<pre class="examplecode">&lt;folder name="Ribbon"&gt;
&lt;folder name="HelpButton"&gt;
&lt;file name="org-netbeans-core-actions-AboutAction.instance"&gt;
&lt;attr name="iconBase" stringvalue="org/netbeans/paint/resources/Info.png"/&gt;
&lt;/file&gt;
&lt;/folder&gt;
&lt;/folder&gt;</pre>
</li>
<li><p>Run the application again and you should see this, take note
of the small button on the right of the application:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/runpaint-8.png"/></p>
</li>
</ol>
</div>
<p>You now have used all the features of the ribbon bar in your own application.</p>
<!-- ======================================================================================== -->
<h2><a name="annotations"></a>Using Annotations to Register the NetBeans Ribbon Bar</h2>
<p>None of the XML tags described in previous sections needs to be typed anywhere, nor do
you even need to <i>see</i> any of it. Imagine that the Paint Application
has a "BucketAction". This is how the action
would be registered via annotations into the Ribbon folders shown above:</p>
<pre code="examplecode">@ActionID(category = "Paint",
id = "org.paint.bucket.BucketAction")
@ActionRegistration(displayName = "#CTL_BucketAction", iconBase="org/paint/bucket/bucket.png")
@ActionReferences({
<b>@ActionReference(path = "Ribbon/AppMenu", position = 0),
@ActionReference(path = "Ribbon/AppMenuFooter", position = 0),
@ActionReference(path = "Ribbon/TaskBar", position = 0),
@ActionReference(path = "Ribbon/TaskPanes/Main/File", position = 0)</b>
})
@Messages("CTL_BucketAction=Bucket")
public final class BucketAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// TODO implement action body
}
}</pre>
<p class="tips">When the module is compiled, the annotations in bold above will cause
the Ribbon folder to be created, as well as its subfolders, and register the action
into them.</p>
<!-- ======================================================================================== -->
<h2><a name="tooltip"></a>Creating Ribbon Tooltips</h2>
<p>In this section, you learn how to create tooltips in the ribbon bar. The PinkMatter
ribbon integration provides the attributes "description", "tooltipTitle", "tooltipFooter",
and "tooltipFooterIcon" to define the content of predefined tooltip placeholders in the ribbon bar.</p>
<div class="indent">
<ol>
<li><p>In the Actions folder, add the following attributes in bold to the
definition of the Save action:</p>
<pre class="examplecode">&lt;folder name="Actions"&gt;
&lt;folder name="File"&gt;
&lt;file name="org-openide-actions-SaveAction.instance"&gt;
&lt;attr name="instanceCreate" methodvalue="org.openide.awt.Actions.context"/&gt;
&lt;attr name="delegate" newvalue="org.openide.actions.SaveAction"/&gt;
&lt;attr name="selectionType" stringvalue="EXACTLY_ONE"/&gt;
&lt;attr name="surviveFocusChange" boolvalue="false"/&gt;
&lt;attr name="displayName" bundlevalue="org/openide/actions/Bundle#Save"/&gt;
&lt;attr name="noIconInMenu" boolvalue="false"/&gt;
&lt;attr name="iconBase" stringvalue="org/openide/resources/actions/save.png"/&gt;
&lt;attr name="type" stringvalue="org.openide.cookies.SaveCookie"/&gt;
<b>&lt;attr name="description" bundlevalue="org.netbeans.paint.Bundle#HINT_SaveAction"/&gt;
&lt;attr name="tooltipTitle" bundlevalue="org.netbeans.paint.Bundle#CTL_SaveActionTitle"/&gt;
&lt;attr name="tooltipFooter" bundlevalue="org.netbeans.paint.Bundle#HINT_HelpAction"/&gt;
&lt;attr name="tooltipFooterIcon" stringvalue="org/netbeans/paint/resources/Info.png"/&gt;</b>
&lt;/file&gt;
...
...
...</pre>
</li>
<li>
<p>Add the following keys to the <tt>Bundle.properties</tt> file in the main package, that is,
the <tt>Bundle.properties</tt> file referred to in the XML tags above:</p>
<pre class="examplecode">HINT_SaveAction=Save the image
HINT_HelpAction=If you still don't know whats going on, click the Help icon
CTL_SaveActionTitle=Save Image</pre>
</li>
<li><p>Run the application again and you should see this, when you hover
with the mouse over the Save button:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/runpaint-0.png"/></p>
</li>
</ol>
</div>
<p>You have now learned how to define tooltips in the ribbon bar.</p>
<!-- ======================================================================================== -->
<h2><a name="api"></a>Using the Ribbon API</h2>
<p>The NetBeans ribbon bar integration enables you to use the <a href="http://www.pushing-pixels.org/category/swing">Ribbon APIs</a>, as follows:</p>
<pre class="examplecode">
package org.netbeans.paint;
import com.pinkmatter.api.flamingo.ResizableIcons;
import javax.swing.JComboBox;
import org.pushingpixels.flamingo.api.common.CommandToggleButtonGroup;
import org.pushingpixels.flamingo.api.common.JCommandButton;
import org.pushingpixels.flamingo.api.common.JCommandButtonStrip;
import org.pushingpixels.flamingo.api.common.JCommandToggleButton;
import org.pushingpixels.flamingo.api.common.RichTooltip;
import org.pushingpixels.flamingo.api.common.icon.ResizableIcon;
import org.pushingpixels.flamingo.api.ribbon.JFlowRibbonBand;
import org.pushingpixels.flamingo.api.ribbon.JRibbonComponent;
public class FontRibbonBand extends JFlowRibbonBand {
public FontRibbonBand() {
super("Font", null);
JComboBox fontCombo = new JComboBox(new Object[]{
"Calibri ", "Columbus ",
"Consolas ", "Cornelius ",
"Cleopatra ", "Cornucopia ",
"Candella ", "Cambria "});
JRibbonComponent fontComboWrapper = new JRibbonComponent(fontCombo);
addFlowComponent(fontComboWrapper);
JComboBox sizeCombo = new JComboBox(new Object[]{"10 ","11 ","12 ","14 "});
JRibbonComponent sizeComboWrapper = new JRibbonComponent(sizeCombo);
addFlowComponent(sizeComboWrapper);
JCommandButtonStrip indentStrip = new JCommandButtonStrip();
JCommandButton indentLeftButton = new JCommandButton("",
getIcon("indent_left.gif"));
indentStrip.add(indentLeftButton);
JCommandButton indentRightButton = new JCommandButton("",
getIcon("indent_right.gif"));
indentStrip.add(indentRightButton);
addFlowComponent(indentStrip);
JCommandButtonStrip styleStrip = new JCommandButtonStrip();
JCommandToggleButton styleBoldButton = new JCommandToggleButton("",
getIcon("bold.gif"));
styleBoldButton.getActionModel().setSelected(true);
styleBoldButton.setActionRichTooltip(new RichTooltip("Bold", "Make the selected text bold"));
styleStrip.add(styleBoldButton);
JCommandToggleButton styleItalicButton = new JCommandToggleButton("",
getIcon("italics.gif"));
styleItalicButton.setActionRichTooltip(new RichTooltip("Italic", "Italicise the selected text"));
styleStrip.add(styleItalicButton);
JCommandToggleButton styleUnderlineButton = new JCommandToggleButton(
"", getIcon("underline.gif"));
styleUnderlineButton.setActionRichTooltip(new RichTooltip("Underline", "Underline the selected text"));
styleStrip.add(styleUnderlineButton);
JCommandToggleButton styleStrikeThroughButton = new JCommandToggleButton(
"", getIcon("strikethrough.gif"));
styleStrikeThroughButton.setActionRichTooltip(new RichTooltip("Strikethrough", "Strike the selected text"));
styleStrip.add(styleStrikeThroughButton);
addFlowComponent(styleStrip);
JCommandButtonStrip alignStrip = new JCommandButtonStrip();
CommandToggleButtonGroup alignGroup = new CommandToggleButtonGroup();
JCommandToggleButton alignLeftButton = new JCommandToggleButton("",
getIcon("justify_left.gif"));
alignLeftButton.getActionModel().setSelected(true);
alignGroup.add(alignLeftButton);
alignStrip.add(alignLeftButton);
JCommandToggleButton alignCenterButton = new JCommandToggleButton("",
getIcon("justify_center.gif"));
alignGroup.add(alignCenterButton);
alignStrip.add(alignCenterButton);
JCommandToggleButton alignRightButton = new JCommandToggleButton("",
getIcon("justify_right.gif"));
alignGroup.add(alignRightButton);
alignStrip.add(alignRightButton);
JCommandToggleButton alignFillButton = new JCommandToggleButton("",
getIcon("justify_justify.gif"));
alignGroup.add(alignFillButton);
alignStrip.add(alignFillButton);
addFlowComponent(alignStrip);
}
private static ResizableIcon getIcon(String name) {
return ResizableIcons.fromResource("org/netbeans/paint/resources/"+name);
}
}
</pre>
<p>The above is registered in the <tt>layer.xml</tt> file as follows:</p>
<pre class="examplecode">&lt;folder name="Ribbon"&gt;
&lt;folder name="TaskPanes"&gt;
&lt;folder name="Formatting"&gt;
&lt;file name="org-netbeans-paint-FontRibbonBand.instance"/&gt;
&lt;/folder&gt;
&lt;/folder&gt;
&lt;/folder&gt;</pre>
<p>Run the above and you should see this:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/runpaint-9.png"/></p>
<!-- ======================================================================================== -->
<h2><a name="customize-appmenu"></a>Customizing the Application Menu</h2>
<p>In this section, you use the standard NetBeans Platform branding mechanism
to change the texts and icon used in the application menu.</p>
<div class="indent">
<ol>
<li><p>Switch to the Files window and create the folder structure below
within the application's "branding" folder:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/customized-appmenu2.png"/></p>
<p>In other words, within "branding/modules", create this folder structure:</p>
<pre class="examplecode">com-pinkmatter-modules-flamingo.jar/com/pinkmatter/modules/flamingo</pre>
<p>Within that folder, create a file named <tt>Bundle.properties</tt>. Also, add
an icon of 24x24 pixels, with the name "app-button-icon24.png".
</li>
<li>
<p>In the <tt>Bundle.properties</tt> file that you created above,
add the following key/value pairs:<p>
<pre class="examplecode">LBL_AppMenuTitle=Main Menu
HINT_AppMenu=Click here to save, print or access other important features of the Paint Application
HINT_AppMenuHelp=Still don't get it? Click the Help icon</pre>
</li>
<li><p>Run the application again and you should see your icon used together with
your texts, when you hover
with the mouse over the application menu:</p>
<p><img alt="enable harness" src="../images/tutorials/ribbon/customized-appmenu.png"/></p>
</li>
</ol>
</div>
<p>You have now learned how to customize the application menu.</p>
<!-- ======================================================================================== -->
<h2><a name="reading"></a>Further Reading</h2>
<p>This concludes the NetBeans Platform Ribbon Bar Integration Tutorial.
This document has described
how to integrate a ribbon bar into a NetBeans Platform application.
For information about the ribbon bar, and other similar implementations, see the following resources:</p>
<ul>
<li><a href="http://java.net/projects/nbribbonbar/">http://java.net/projects/nbribbonbar/</a></li>
<li><a href="http://www.youtube.com/watch?v=SUILKGVntDQ">YouTube: NetBeans Ribbon Bar Integration Tutorial</a></li>
<li><a href="http://pinkmatter.com/">PinkMatter Solutions</a></li>
<li><a href="http://java.dzone.com/articles/flamingo-tutorial">Flamingo Tutorial</a></li>
<li><a href="http://netbeans.dzone.com/news/intelligence-gathering">Interview: Intelligence Gathering Software on the NetBeans Platform</a></li>
<li><a href="http://netbeans.dzone.com/news/office-laf-netbeans-platform">OfficeLAF for NetBeans Platform</a></li>
<li><a href="http://netbeans.dzone.com/how-create-tabbed-toolbar-on-nb">Tabbed Toolbar for NetBeans Platform</a></li>
</ul>
<!-- ======================================================================================== -->
<div class="feedback-box"><a href="https://netbeans.org/about/contact_form.html?to=3&amp;subject=Feedback: NetBeans Platform Ribbon Bar Tutorial 8.0">Send Us Your Feedback</a>
<br style="clear:both;" /></div>
</body>
</html>