/**************************************************************
 * 
 * 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 __com_sun_star_sdb_QueryDesign_idl__ 
#define __com_sun_star_sdb_QueryDesign_idl__ 

#ifndef __com_sun_star_frame_XController_idl__ 
#include <com/sun/star/frame/XController.idl>
#endif
#ifndef __com_sun_star_lang_XInitialization_idl__ 
#include <com/sun/star/lang/XInitialization.idl>
#endif
#ifndef __com_sun_star_frame_XDispatchProvider_idl__ 
#include <com/sun/star/frame/XDispatchProvider.idl>
#endif
#ifndef __com_sun_star_form_FormController_idl__ 
#include <com/sun/star/form/FormController.idl>
#endif

module com {  module sun {  module star {  module sdb { 

//============================================================================= 
/** implements a component which allows the creation of SQL statements.

	<p>This service implements a user interface for creating SQL statements either through a graphical design
	interface or simply to enter the SQL statement directly.</p>

	<p>The design view of the QueryDesign is divided into two parts. The first part contains the table windows 
	where columns can be selected for the SQL statement. The second part contains the columns which should appear 
	in the selection of the SQL statement or criterias which narrow the query.</p>

    <h3>Operation Modes</h3>

    <p>A <code>QueryDesign</code> component has 3 operation modes, which control what kind of object is edited:
    <ul><li><a name="query_mode"></a><b>Query Mode</b>
        <p>In <code>Query Mode</code>, the designer is used to modify an existing or create a new client-side
        query.</p></li>

        <li><a name="view_mode"</a><b>View Mode</b>
        <p>In <code>View Mode</code>, the designer is used to modify an existing or create a new server-side
        view.</p>
        <p>The view which is being designed must support the <type scope="com::sun::star::sdbcx">XAlterView</type>
        interface, except when a new view is being designed. In the latter case, the designer closes itself
        automatically when <code>XAlterView</code> is not supported, and the view has been saved.</p></li>

        <li><a name="command_mode"</a><b>Command Mode</b>
        <p>In <code>Command Mode</code>, the designer is used to design an standalone SQL command.</p>
        <p>The client of the designer is then responsible to listen at changes in the
        <member>ActiveCommand</member> and <member>EscapeProcessing</member> members, which are updated
        every time the user saves the command.</p></li>
    </ul></p>

    <h3><a name="initialization"></a>Initialization</h3>

    <p>Initialization is done using the <type scope="com::sun::star::lang">XInitialization</type> interface,
    which expects a sequence of objects being either <type scope="com::sun::star::beans">NamedValue</type>s or
    <type scope="com::sun::star::beans">PropertyValue</type>s. The following parameters are supported at
    initialization time:
	<ul>
		<li><b>Frame</b><br/>
		has to be an <type scope="com::sun::star::frame">XFrame</type> interface specifying the frame to plug the
		QueryDesign component into.<br/>
        This parameter is mandatory.
		</li>

        <li><a name="data_source"></a><b>DataSourceName</b><br/>
		specifies the name of the globally registered <type>DataSource</type> for which a query, view, or SQL
        command is to be designed.<br/>
        The DataSourceName may be omitted if and only if a valid <a href="#active_connection">ActiveConnection</a>
        parameter is present.<br/>
        If both <code>DataSourceName</code> and <code>ActiveConnection</code> are present, the former
        is ignored.
		</li>

        <li><a name="active_connection"></a><b>ActiveConnection</b><br/>
        specifies the connection to work with.<br/>
        May be ommitted if and only if a valid <a href="#data_source">DataSourceName</a> parameter is supplied.
        </li>

        <li><a name="command"></a><b>Command</b><br/>
        specifies the name of the query or view to design, or, in case of the <a href="#command_type">CommandType</a>
        being <member>CommandType::COMMAND</member>, the initial SQL command.<br/>
        If this parameter is not present, a new query/view will be designed, respectively the initial
        command will be empty.
        </li>

        <li><a name="command_type"></a><b>CommandType</b><br/>
        specifies the type of object which should be designed. The following options are
        supported:
        <ul><li><member>CommandType::QUERY</member> specifies the designer should operate in
            <a href="#query_mode">query mode</a>, that is, an existing client-side query should be
            designed, or a new query should be created, depending on the presence of the
            <a href="#command">Command</a> parameter.<br/>
            If the <a href="#data_source">DataSourceName</a> parameter is present, the query is
            looked up in the specified data source. Otherwise, the designer tries to determine
            the data source which the <a href="#active_connection">ActiveConnection</a> belongs
            to, and looks up the query there.</li>

            <li><member>CommandType::COMMAND</member> specifies the designer should operate in
            <a href="#command_mode">command mode</a>, that is, a standalone SQL command
            should be designed. When the user attempts to save the designed SQL statement,
            the <member>ActiveCommand</member> and <member>EscapeProcessing</member> properties
            of the designer are updated.</li>

            <li><member>CommandType::TABLE</member> specifies the designer should operate in
            <a href="#view_mode">view mode</a>, that is, an existing or a new
            server-side view should be designed, depending on the presence of the
            <a href="#command">Command</a> parameter.<br/>
            If the <a href="#data_source">DataSourceName</a> parameter is present, the view is
            looked up in a newly created connection for the specified data source. Otherwise,
            it is looked up in the connection given as <a href="#active_connection">ActiveConnection</a>.</li>
        </ul>
        If not present, this parameter defaults to <member>CommandType::QUERY</member>.
        </li>

        <li><b>EscapeProcessing</b><br/>
        Specifies whether or not escape processing should be initially enabled in the query designer. If set
        to <FALSE/>, then the designer can operate in text view only (as opposed to the graphical view). The
        <a href="#graphical_design">GraphicalDesign</a> parameter will be ignored then, and assumed to be <FALSE/>.<br/>
        If not present, <TRUE/> is assumed for this parameter.</li>

		<li><a name="graphical_design"></a><b>GraphicalDesign</b><br/>
		This value indicates whether the designer should be opened in the graphical design view
        (<TRUE/>) or in the text view (<FALSE/>).<br/>
        If not present, <FALSE/> is assumed for this parameter.
		</li>
	</ul>
    </p>

    <p>There's a number of legacy settings which are recognized for compatibility reasons, though
    you're discouraged from using them:
    <ul>
        <li><b>CurrentQuery</b><br/>
        is the same as Command, and implies a <a href="#command_type">CommandType</a> of
        <member>CommandType::QUERY</member></li>

        <li><b>QueryDesignView</b><br/>
        is the same as <a href="#graphical_design">GraphicalDesign</a>.</li>

        <li><b>IndependentSQLCommand</b><br/>
        is the same as Command, and implies a <a href="#command_type">CommandType</a> of
        <member>CommandType::COMMAND</member></li>

        <li><b>CreateView</b><br/>
        implies a <a href="#command_type">CommandType</a> of <member>CommandType::TABLE</member></li>
    </ul>

	@see com::sun::star::sdb::ContentLoader
*/

published service QueryDesign
{
	/** allows the component to be plugged into frames.
	*/
	interface com::sun::star::frame::XController;

	/** is used to initialize the QueryDesign.

        <p>See chapter <a href="#initialization">Initialization</a> for details.</p>
	*/
	interface com::sun::star::lang::XInitialization;

    /** reflects the designed SQL command at the moment it was last saved by the user.
    */
    [readonly, property] string ActiveCommand;

    /** specifies whether the user enabled escape processing for the statement being designed.

        @see DataAccessDescriptor::EscapeProcessing
        @since OOo 2.4
    */
    [readonly, property, optional] boolean EscapeProcessing;
};
 
//============================================================================= 
}; }; }; }; 
 
#endif
