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



[start=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.


[start=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. 
----



[start=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?]]
----



[start=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.
