// 
//     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.
//

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

1. link:#How_to_add.2Fcreate_a_FAQ_entry[How to add/create a FAQ entry]
1. link:#Logging_on[Logging on]
2. link:#Adding_a_Question[Adding a Question]
3. link:#Adding_the_Answer[Adding the Answer]
4. link:#What_To_Do_About_Long_Lines_of_Text[What To Do About Long Lines of Text]
5. link:#Tip:_Formatting[Tip: Formatting]
6. link:#Apache_Migration_Information[Apache Migration Information]

== How to add/create a FAQ entry

==== Logging on

1. When you are here for the first time ever, link:https://netbeans.org/people/new[create your NetBeans account] and link:mailto:NETBEANS-WEBTEAM_WW@oracle.com?Subject=Wiki%20editing%20rights[send us a request for Wiki editing rights] specifying your NetBeans account.
2. Once you hear back from us link:http://netbeans.org/people/signup[login to netbeans.org] again.
3. Go to the FAQ site index (click "User FAQ" in the left column).
4. Click on the “edit page” tab to go to the edit window. This window can look a little scary at first, but don't worry, you don't have to change that much to get an entry added to the FAQ. Note: *Please do not delete existing content on this page.* Just *add your question* as follows:

==== Adding a Question

1. Scroll down to the section where you want to enter your FAQ item. A section starts with either a single `!` or a double `!!`.
2. Once you have reached the section you want, add another line below that looks just like this, but contains the *question* that you want to add.
[source,java]
----

* [[FaqTweedleDeeDumRefactoring|How can I refactor a tweedledeedum?]]
----

How do you read this line?

* The star at the beginning places a bullet at the beginning of the list item.  It must be followed by a space.
* The first part in the double-brackets ("FaqTweedleDeeDumRefactoring" or "FaqHowToAsk") is the page name. It must be a wiki word: A wiki word should be CamelCase and be something short and descriptive. Look at other entries to get an idea. Good wiki words look like "HowToAsk", "HowToConfigure" or "WhatIsTheUpdateCenter", etc. It ends in a square bracket.  
* For user-FAQ entries, all user-faq entries should start with "Faq", as in "FaqHowToAsk".  
* Names of all _plugin-developer_ FAQ items should start with "DevFaq", as in "DevFaqLookup".  This keeps the FAQs organized and searchable and allows the link:http://deadlock.netbeans.org/hudson/job/faqsuck/lastSuccessfulBuild/artifact/other/faqsuck/build/faq.html[giant developer FAQ page] to be built.
* In the middle there is a `|` between the question and the page title as a separator.
* The second part is the question. It starts with a square bracket.
* Note that the `link:_.asciidoc[ ]` braces make the entire thing a link to the actual answer page.


3. Click the Save button to save the page (or click Cancel to discard your changes).

==== Adding the Answer

1. Now you are back to view mode of the FAQ index page. Scroll down and find your question as one of the bullet items in the list - It will be red. Click on your new (red) link.

2. This will bring you to another edit window for the *answer page*. You can use the code below as a template for starting out your answer page, and fill in your own question (the same that you just entered into the FAQ index!) and answer.

[source,java]
----

====How can I refactor a tweedledeedum?====
Problem: Everytime I try to refactor a tweedledeedum, it starts burning.

Solution: You have to paint the tweedledeedum green first. 
----


3. Finally, add information at the bottom of the FAQ that tells what version of NetBeans and what OS platform the FAQ works with. Just add the versions and platforms that you know are right. If "See also:" information is useful, add it here also.

[source,java]
----

--
Applies to: NetBeans IDE 6.0 and 6.1
Platforms: All
See also: [[NetBeansUserFAQ| How can I refactor two tweedledeedums?]]
----


4. That's it. Click Save to save the page when you are done editing the answer.

==== What To Do About Long Lines of Text

If your FAQ entry includes `<pre>` tags (or you use the wiki convention of putting a space at the beginning of a line to do the same thing), _avoid long lines of text_.  The FAQs are built every night into a link:http://deadlock.netbeans.org/hudson/job/faqsuck/lastSuccessfulBuild/artifact/other/faqsuck/build/faq.html[giant HTML page].  To keep it possible to print the entire FAQ on normal paper, please break up lines longer than 80 characters, or use ``` tags instead of `<pre>` (and make sure there are some whitespace characters in long lines) so that they can be formatted reasonably.  

If your example does not have any lines > 80 characters, `<pre>` tags are fine.

==== Tip: Formatting

You can click on the Help tab (right beside the Edit tab) at any time to get help on *formatting* of the text. You won't lose your changes when switching between the help tab and the edit tab, so don't worry about that.

Now, start adding those FAQs!!

Source: link:http://blogs.sun.com/LongLiveThePepper/entry/adding_items_to_the_vwp[JB's Blog]

=== 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/HowToAddFAQEntries[http://wiki.netbeans.org/HowToAddFAQEntries] , 
that was last modified by NetBeans user Jkovalsky 
on 2015-08-28T15:47:14Z.


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