// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= DevFaqCheckableActionPreferenceOption
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki DevFaqCheckableActionPreferenceOption
:description: Apache NetBeans wiki DevFaqCheckableActionPreferenceOption
:toc: left
:toc-title:
:syntax: true

= How do I make a checkable action that represents a preference option?

See 
link:http://bits.netbeans.org/dev/javadoc/org-openide-awt/org/openide/awt/Actions.html[org-openide-awt/org.openide.awt.Actions.checkbox(...)]

Here an example for a checkable action which represents the state of the "ignoreCase" property within the property file "org/netbeans/modules/diff.properties"
`

[source,xml]
----

   <folder name="Actions">
       <folder name="Diff">
           <file name="toggle-ignore-case-diff-option.instance">
               <attr bundlevalue="org.netbeans.modules.diff.Bundle#CTL_IgnoreCaseOptionAction" name="displayName"/>
               <attr name="Name" stringvalue="toggle-ignore-case-diff-option"/>
               <attr name="preferencesNode" stringvalue="/org/netbeans/modules/diff" />
               <attr name="preferencesKey" stringvalue="ignoreCase"/>
               <attr name="instanceCreate" methodvalue="org.openide.awt.Actions.checkbox"/>
           </file>
       </folder>
   </folder>
----

`

=== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/DevFaqCheckableActionPreferenceOption[http://wiki.netbeans.org/DevFaqCheckableActionPreferenceOption] , 
that was last modified by NetBeans user Markiewb 
on 2013-05-03T21:46:57Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
