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

Oracle Report Builder
=====================
This file contains important information about the installation.

This software offered by Oracle will enhance Oracle Open Office and OpenOffice.org software. The following features will be added:
* In a Base database document, in the Reports window, you now have an additional choice to "Create Report in Design View".
* An interactive window allows you to create a database report	by drag-and-drop, with visual feedback.
* All reports created by Report Builder can also be edited in the Report Builder window. 
		
You find more information about installation and usage of the extension in the following paragraphs of this readme file.

Notes on Installation
---------------------
		
System Requirements

* A recent version of Oracle Open Office or OpenOffice.org
* A recent version of the Java(TM) Runtime Environment
		
Installing

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.
* Double-click the extension file (*.oxt) in your system's file browser or choose Tools > Extension Manager and click Add.

Uninstalling
	
* Choose Tools > Extension Manager, click the Oracle Report Builder entry, then click Remove.

Using the Extension

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.

