<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<!--
   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.    
-->
<html>
<head>
	<script type="text/javascript">var xookiConfig = {level: 0};</script>	
	<script type="text/javascript" src="xooki/xooki.js"></script>
</head>
<body>
	<textarea id="xooki-source">
Apache IvyDE comes with an Ivy file editor that provides an editor that performs code completion for Ivy xml tags based on the real-time state of your repository.  It also packs with an Ivy file creation wizard and HTML preview.

<h1><a name="wizard"></a>Creation Wizard</h1>

To use the creation wizard, choose File > New > Other > IvyDE > Ivy file in the Eclipse menu (Ctrl+N by default). Select it and click Next.

<center><img src="images/wizard1.jpg"/></center>

The wizard contains only one page, and is very simple.

<center><img src="images/wizard2.jpg"/></center>

<ol><b>Wizard fields:</b>
	<li> Container: you must select a target project. (This is already set if you access the wizard through the context menu on your project root folder).</li>
	<li> File name: the Ivy file name (ivy.xml by default).</li>
	<li> Organisation: the component owner name. (your company name or the company that provides the component if you are writing an ivy.xml file for 3rd party jars). Note that this value can be set in the <a href="preferences.html">Ivy preference page.</a></li>
	<li> Module name: the component name.</li>
	<li> Status: the status of the project. (integration by default since we have just created its ivy file. Please refer to the <a href="../../../history/latest-milestone/index.html">Ivy documentation for more details</a>).</li>
</ol>

<h1><a name="editor"></a>Ivy Editor</h1>

<center><img src="images/editor1.jpg"/></center>

Apache IvyDE's Eclipse editor provides XML syntax coloration, tag completion, tag attribute name completion, and dependency and configuration tag value completion.

Completion comes with contextual help. The completion popup is displayed when through the CTRL + SPACE shortcut.

<b>Available completions:</b><ul>
	<li><b>XML structure</b>: Allows you quickly to insert valid tags at the right place. If the tag can have nested children, both notations, simple tag and open tag, are proposed.
	    
	    <center><img src="images/completion1.jpg"/></center>
	    
	</li>
	<li><b>Tag attributes</b>: When your cursor is placed in a tag bracket, the completion shows available attributes for the enclosing tag.
	    
	    <center><img src="images/completion2.jpg"/></center>
	    
	</li>
	<li><b>Attributes values</b>: When your cursor is placed inside the quotes of an attribute value, the completion shows available values for the matching attribute.
		<br/>
		<ul>Available value completion
			<li> <i>info:</i> organisation (preference based), module (Eclipse project name),  </li>
			<li> <i>info/ivyauthor: </i>name (preference based), url (pref based)</li>
			<li> <i>info/description: </i>homepage (pref based)</li>
			<li> <i>info/license: </i>name</li>
			<li> <i>info/repository: </i>name (the other attributes depend on it), url, ivys, pattern, artifacts</li>
			<li> <i>configurations/conf: </i> visibility,  deprecated, extends</li>
			<li> <i>publications/artifact: </i>type, conf, ext</li>
			<li> <i>dependencies/dependency: </i>org, name, rev are resolved thanks to Ivy using the ivyconf set in the <a href="cpc/edit.html">project Ivy preference page</a>. If not set to "default" Ivy uses its defaults resolvers configuration (ie Ivyrep + ibiblio), and if these are not set Ivy uses the ivyconf set in the <a href="preferences.html">Eclipse Ivy preference page</a>. conf values are computed from the current ivy.xml file and the dependency ivy.xml file if any.

			    <center><img src="images/completion4.jpg"/></center>
			
			</li>
		</ul>
	</li>
</ul>

<b>Change colors:</b> you can change the color used by the editor in the <a href="preferences.html#xmleditor">global preferences page</a>.

</textarea>
<script type="text/javascript">xooki.postProcess();</script>
</body>
</html>
