<html>
<!--***********************************************************
 * 
 * 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.
 * 
 ***********************************************************-->
	<head>
		<title>Oracle Report Builder</title>
	</head>
	<body>	
	<h1>Oracle Report Builder</h1>
	<p>This file contains important information about the installation.</p>
	<p>This software offered by Oracle will enhance Oracle Open Office and OpenOffice.org software. The following features will be added:</p>
	<ul>
		<li><p>In a Base database document, in the Reports window, you now have an additional choice to &quot;Create Report in Design View&quot;.</p></li>
		<li><p>An interactive window allows you to create a database report	by drag-and-drop, with visual feedback.</p></li>
		<li><p>All reports created by Report Builder can also be edited in the Report Builder window. </p></li>
		</ul>
		<p>You find more information about installation and usage of the extension in the following paragraphs of this readme file.</p>
		<h2>Notes on Installation</h2>
		<h3>System Requirements</h3>
		<ul>
			<li><p>A recent version of Oracle Open Office or OpenOffice.org</p></li>
			<li><p>A recent version of the Java(TM) 	Runtime Environment</p></li>
		</ul>
		<h3>Installing</h3>
			<p>You need administrator rights to install a shared extension	for all users on your network. You do not need administrator rights	to install a user extension for your own use only.</p>
			<p>Double-click the extension file (*.oxt) in your system's file browser or choose <b>Tools &gt; Extension Manager</b>and click <B>Add</B>.</P>
		<h3>Uninstalling</h3>
		<p>Choose Tools &gt; Extension Manager, click the Oracle Report Builder entry, then click Remove.</P>
		<h2>Using the Extension</h2>
		<p>You find complete instructions on using the Oracle Report Builder in the application help that is installed with Oracle Open Office or OpenOffice.org. Press F1 to open the Help Viewer, then enter the words "Report Builder" in the	Index text box.</p>
</body>
</html>