/**************************************************************
 *
 * 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.
 *
 *************************************************************/


#ifndef INCLUDED_ORG_OPENOFFICE_SHEET_ADDIN_XCALCADDIN_IDL
#define INCLUDED_ORG_OPENOFFICE_SHEET_ADDIN_XCALCADDIN_IDL

#include <com/sun/star/beans/XPropertySet.idl>
#include <com/sun/star/sheet/AddIn.idl>


module org {
  module openoffice {
      module sheet {
        module addin {
	  /** Interface with your additional methods.

              You may declare several methods. Each method may have
              any number of arguments after xOptions.
              Furthermore, you could replace the name of the service and
              the interface, but only if you want to replace this name in all
              your project files. This example will work with tNeccessaryhe default
              names.
              Interface names should start with an X prefix.
           */
	  interface XCalcAddins
	  {
            /** Declare your methods:
                This is where you could add the declarations of your methods.
                If you want to learn more about
                the IDL syntax including the base types, you could
                visit the following web page:
                http://www.openoffice.org/project/udk/common/man/idl_syntax.html .
             */
            long getMyFirstValue(
                 /** Parameters:
                     You could insert further arguments after the
                     parameter xOptions.
                  */
                 [in] com::sun::star::beans::XPropertySet xOptions
            );

            long getMySecondValue(
                 /** Parameters:
                     You could insert further arguments after the
                     parameter xOptions.
                  */
                 [in] com::sun::star::beans::XPropertySet xOptions,
                 [in] long intDummy
            );
       };

       service CalcAddins
	   {
            /** Exported interfaces:
                This is where you put all interfaces that this service exports. The service
                supports its main interface only.
             */
           interface XCalcAddins;

           /** Necessary base service.
               All add-ins must implement this service
            */
           service com::sun::star::sheet::AddIn;
       };
        };
      };
    };
};

#endif
