<!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">
Edit your ivy files easily in eclipse with the <a href="index.html">IvyDE</a> Plugin editor.
<a href="index.html">IvyDE</a> brings creation wizard, html preview and completion for Ivy xml tag, attributes but also for attributes' values!
Choose an organisation and browse thru its projects and revisions.

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

IvyDE comes with a wizard that allows you to create an ivy.xml file for your project.
To open the wizard choose File->New->Other in the Eclipse menu (Ctrl+N by default)
The Ivy wizard is accessible in the category Other. Select it then 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 have to select the targeted project. (This is already set if you access the wizard thanks right click menu on your project root folder)</li>
	<li> File name: the ivy file name. (ivy.xml by default and its better to keep it in most of case)</li>
	<li> Organisation: the component owner name. (your company name or the company that provides the component if you are writing ivy.xml file for 3rd party jars). Note 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 <a href="../../../history/latest-milestone/index.html">Ivy documentation for more details</a>)</li>
</ol>
When the form is correctly filled you can press Finish button. Eclipse will automatically open the Ivy <a href="#editor">editor</a>.


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

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


The Ivy's eclipse editor provides xml syntax coloration, tag completion, tag's attribute names completion, and for dependency and configuration tag value completion.

Completion comes with contextual help. The completion popup is displayed when hitting simultaneously the CTRL and the SPACE keys.


<b>Available completions:</b><ul>
	<li><b>Xml structure</b>: allows you quickly to insert the good tag at its 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 show available attributes for the enclosing tag.
	    
	    <center><img src="images/completion2.jpg"/></center>
	    
	</li>
	<li><b>Attributes values</b>: when your cursor is placed in the quote of an attribute value the completion shows available values for the matching attribute.
		<br/>
		<ul>Available value completion
			<li> <i>info:</i> organisation (pref based), module (eclipse project name),  </li>
			<li> <i>info/ivyauthor: </i>name (pref 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 not set Ivy uses the ivyconf set in the <a href="preferences.html">Eclipse Ivy preference page</a>. conf values are computed from current ivy.xml file and the dependency ivy.xml file if any.
			    
			    <center><img src="images/completion4.jpg"/></center>
			
			</li>
		</ul>
	</li>
</ul>

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