<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<!--
#**************************************************************
#  
#  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>
  <title>Apache OpenOffice %PRODUCT_RELEASE% SDK - Overview</title>
  <link rel="stylesheet" type="text/css" href="docs/sdk_styles.css">
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <meta name="author" content="J&uuml;rgen Schmidt">
  <meta name="created" content="2004-12-14">
</head>
<body class="sdkbody">

<table class="table1" cellpadding=0>
  <tr style="background-image:url(docs/images/sdk_head-2.png)"> 
    <td colspan="3" align="left"><img src="docs/images/sdk_head-1.png" width="800" height="120" usemap="#Map" border="0"></td>
  </tr>
  <tr> 
    <td colspan="3"><img  class="nothing30" src="docs/images/nada.gif"></td>
  </tr>
  <tr> 
    <td colspan="3"> 
      <table class="table2">
        <tr> 
          <td><img class="nothing8" src="docs/images/nada.gif"></td>
          <td> 
            <p>Apache OpenOffice %PRODUCT_RELEASE% software is a complete, feature-rich
              office productivity suite that provides, in combination with this 
			  SDK, all the essential tools for building and deploying custom 
			  solutions that build on, or integrate with, the Apache OpenOffice %PRODUCT_RELEASE% suite 
			  of products.</p>
            <p>The SDK is a development kit for Apache OpenOffice %PRODUCT_RELEASE%, which 
			  eases the development of office components. It provides a set of 
			  libraries, binaries, header, and IDL files which have final API's 
			  and can only be extended with new functionality. This set of libraries
			  and binaries is the minimum set of functions needed to use system 
			  abstraction for base functionality and for using UNO (Universal 
			  Network Objects) component technology. The UNO component model is the
			  base of the whole Office API. The SDK provides everything necessary 
			  to use the Office API from external programs (e.g. Java, C++) or to 
			  extend the Office functionality with new components (e.g. new filter 
			  components, CalcAddin functions). It is compatible over several 
			  versions because the API remains unaffected and will only be extended
			  with new functions.</p>
            <p>The SDK provides the basic building blocks for external developers 
			  to develop components in any language for which a binding exists. 
			  Currently, there are language bindings for Apache OpenOffice %PRODUCT_RELEASE% Basic, Java, 
			  and different C++ compilers on different platforms, for Apache OpenOffice %PRODUCT_RELEASE%,
			  thus covering the two most commonly used programming languages. There 
			  will be no limit for office automation in heterogeneous environments.
			  Currently supported platforms of the SDK are Linux, Solaris (sparc, 
			  x86), and Windows.</p>
            <p>The SDK also contains <a href="docs/common/ref/com/sun/star/module-ix.html" title="link to the IDL reference documentation"> reference</a> documentation 
              for the API and a complete <a href="http://wiki.services.openoffice.org/wiki/Documentation/DevGuide" title="link to the Developer's Guide in the Wiki">Developer's Guide</a> is availbale online in the Apache OpenOffice Wiki, with 
			  lots of examples, which introduce the API, explain the concepts behind
			  it, and make it possible for all users to quickly get started with 
			  the Office API.</p>
          </td>
          <td><img class="nothing8" src="docs/images/nada.gif"></td>
        </tr>
        <tr> 
          <td><img class="nothing8" src="docs/images/nada.gif"></td>
          <td><img class="line" src="docs/images/sdk_line-1.gif"></td>
          <td><img class="nothing8" src="docs/images/nada.gif"></td>
        </tr>
        <tr> 
          <td><img class="nothing8" src="docs/images/nada.gif"></td>
          <td> 
             <table class="table3">
              <tr valign="top"> 
                <td colspan="4" class="head1">Content</td>
              </tr>
              <tr> 
			    <td colspan="4"><img class="nothing8" src="docs/images/nada.gif"></td>
              </tr>
              <tr valign="top"> 
                <td class="content4"><img src="docs/images/arrow-1.gif"></td>
                <td colspan="2"><a href="docs/install.html" title="link to the installation guide">Installation Guide</a></td>
                <td class="content70">An overview of all necessary 
				installation steps (e.g. environment variables) to use this SDK.</td>
              </tr>
              <tr valign="middle"> 
                <td><img class="nothing10" src="docs/images/nada.gif"></td>
                <td colspan="3"><img class="line" src="docs/images/sdk_line-1.gif"></td>
              </tr>
              <tr valign="top"> 
                <td class="content4"><img src="docs/images/arrow-1.gif"></td>
                <td colspan="2"><a href="http://wiki.services.openoffice.org/wiki/Documentation/DevGuide" title="link to the Developer's Guide in the Wiki">Developer's Guide</a></td>
                <td class="content70">Detailed documentation, explaining the Apache OpenOffice %PRODUCT_RELEASE% 
				API and the concepts behind it, with a rich set of examples, 
				implemented mainly in Java. This documentation is online in the 
				Apache OpenOffice Wiki.</td>
              </tr>
              <tr valign="top"> 
                <td class="content4"><img src="docs/images/arrow-1.gif"></td>
                <td colspan="2"><a href="docs/common/ref/com/sun/star/module-ix.html" title="link to the IDL reference documentation">IDL Reference</a></td>
                <td class="content70">Complete Apache OpenOffice %PRODUCT_RELEASE% API reference.</td>
              </tr>
              <tr valign="top"> 
                <td class="content4"><img src="docs/images/arrow-1.gif"></td>
                <td colspan="2"><a href="docs/java/ref/index.html" title="link to the Java UNO runtime API reference documentation">Java UNO Runtime Reference </a></td>
                <td class="content70">Reference documentation of the Java UNO runtime API.</td>
              </tr>
              <tr valign="top"> 
                <td class="content4"><img src="docs/images/arrow-1.gif"></td>
                <td colspan="2"><a href="docs/cpp/ref/names/index.html" title="link to the C++ API reference documentation">C++ Reference</a></td>
                <td class="content70">Reference documentation of the C++ UNO runtime and a 
				set of C/C++ base and helper functions and classes to abstract from
				the system layer.</td>
              </tr>
              <tr valign="middle"> 
                <td><img class="nothing10" src="docs/images/nada.gif"></td>
                <td colspan="3"><img class="line" src="docs/images/sdk_line-1.gif"></td>
              </tr>
              <tr valign="top"> 
                <td class="content4"><img src="docs/images/arrow-1.gif"></td>
                <td colspan="2"><a href="docs/tools.html" title="link to the tools overview page">Development Tools</a></td>
                <td class="content70">Overview and a short description of the UNO 
				development tools.</td>
              </tr>
              <tr valign="top"> 
                <td class="content4"><img src="docs/images/arrow-1.gif"></td>
                <td colspan="2"><a href="examples/examples.html" title="link to the examples overview page">Examples</a></td>
                <td class="content70">A collection of examples in different 
				programming languages (Java, C++, Basic, OLE, CLI).</td>
              </tr>
              <tr valign="middle"> 
                <td><img class="nothing10" src="docs/images/nada.gif"></td>
                <td colspan="3"><img class="line" src="docs/images/sdk_line-1.gif"></td>
              </tr>
              <tr valign="top"> 
                <td class="content4"><img src="docs/images/arrow-1.gif"></td>
                <td colspan="2"><a href="http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=office" title="link to the  OASIS Open Office XML Format TC (online)">OASIS Open Document Format for Office Applications (OpenDocument) TC</a></td>
                <td class="content70">Link to the OASIS Open Document Format for 
				Office Applications (OpenDocument) Technical Committee where you 
				can find the latest information about the OASIS Open Document XML 
				file format which is the default document format 
				for Apache OpenOffice %PRODUCT_RELEASE%.</td>
              </tr>
              <tr valign="top"> 
                <td class="content4"><img src="docs/images/arrow-1.gif"></td>
                <td colspan="2"><a href="http://xml.openoffice.org/xml_specification.pdf" title="link to the OpenOffice.org XML File Format Specification">OpenOffice.org XML File Format</a></td>
                <td class="content70">Specification of the initial OpenOffice.org XML File Format.</td>
              </tr>
              <tr valign="middle"> 
                <td><img class="nothing10" src="docs/images/nada.gif"></td>
                <td colspan="3"><img class="line" src="docs/images/sdk_line-1.gif"></td>
              </tr>
              <tr valign="top"> 
                <td class="content4"><img src="docs/images/arrow-1.gif"></td>
                <td colspan="2"><a href="LICENSE" title="link to the SDK license file">License</a></td>
                <td class="content70">The license for the Apache OpenOffice %PRODUCT_RELEASE% SDK.</td>
              </tr>
              <tr valign="middle"> 
                <td><img class="nothing10" src="docs/images/nada.gif"></td>
                <td colspan="3"><img class="line" src="docs/images/sdk_line-1.gif"></td>
              </tr>
              <tr valign="top"> 
			    <td colspan="4"><img class="nothing8" src="docs/images/nada.gif"></td>
              </tr>
              <tr valign="top"> 
                <td colspan="4" class="head1">Additional Resources</td>
              </tr>
              <tr valign="top"> 
			    <td colspan="4"><img class="nothing8" src="docs/images/nada.gif"></td>
              </tr>
              <tr valign="middle"> 
                <td class="content4"><img class="arrow" src="docs/images/arrow-1.gif"></td>
                <td width="5%"><a target="_blank" href="http://www.openoffice.org/" title="link to the Apache OpenOffice homepage (online)"><img class="appicon" src="docs/images/ooo-main-app_32.png"></a></td>
                <td width="21%"><a target="_blank" href="http://www.openoffice.org/" title="link to the Apache OpenOffice homepage (online)">Apache OpenOffice&#153;</a></td>
                <td class="content70">Open Source community project of office-productivity software.</td>
              </tr>
            </table>
          </td>
          <td><img class="nothing8" src="docs/images/nada.gif"></td>
        </tr>
      </table>
    </td>
  </tr>
  <tr> 
    <td colspan="3"><img class="nothing30" src="docs/images/nada.gif"></td>
  </tr>
  <tr> 
    <td colspan="3"><img class="line" src="docs/images/sdk_line-1.gif"></td>
  </tr>
  <tr> 
    <td colspan="3"> 
      <div class="centertext">
	<p><img class="apachelogo" src="docs/images/odk-footer-logo.gif" title="Apache Feather" alt="Apache Feather" />
            Copyright &copy; 2013 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache, the Apache feather logo, Apache OpenOffice and OpenOffice.org are trademarks of The Apache Software Foundation. Other names may be trademarks of their respective owners.<p>
      </div>
    </td>
  </tr>
</table>
<map name="Map">
  <area shape="rect" coords="10,68,400,105" href="http://www.openoffice.org">
</map>
</body>
</html>
