2001-02-05 08:35:57 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
|
|
|
* $RCSfile: querycontroller.cxx,v $
|
|
|
|
*
|
2004-09-09 08:49:48 +00:00
|
|
|
* $Revision: 1.94 $
|
2001-02-05 08:35:57 +00:00
|
|
|
*
|
2004-09-09 08:49:48 +00:00
|
|
|
* last change: $Author: rt $ $Date: 2004-09-09 09:49:48 $
|
2001-02-05 08:35:57 +00:00
|
|
|
*
|
|
|
|
* The Contents of this file are made available subject to the terms of
|
|
|
|
* either of the following licenses
|
|
|
|
*
|
|
|
|
* - GNU Lesser General Public License Version 2.1
|
|
|
|
* - Sun Industry Standards Source License Version 1.1
|
|
|
|
*
|
|
|
|
* Sun Microsystems Inc., October, 2000
|
|
|
|
*
|
|
|
|
* GNU Lesser General Public License Version 2.1
|
|
|
|
* =============================================
|
|
|
|
* Copyright 2000 by Sun Microsystems, Inc.
|
|
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License version 2.1, as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
|
|
* MA 02111-1307 USA
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* Sun Industry Standards Source License Version 1.1
|
|
|
|
* =================================================
|
|
|
|
* The contents of this file are subject to the Sun Industry Standards
|
|
|
|
* Source License Version 1.1 (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.openoffice.org/license.html.
|
|
|
|
*
|
|
|
|
* Software provided under this License is provided on an AS IS basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
|
|
|
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
|
|
|
|
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
|
|
|
|
* See the License for the specific provisions governing your rights and
|
|
|
|
* obligations concerning the Software.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
|
|
|
|
*
|
|
|
|
* Copyright: 2000 by Sun Microsystems, Inc.
|
|
|
|
*
|
|
|
|
* All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s): _______________________________________
|
|
|
|
*
|
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
#ifndef DBAUI_QUERYCONTROLLER_HXX
|
|
|
|
#include "querycontroller.hxx"
|
|
|
|
#endif
|
|
|
|
#ifndef DBAUI_QUERYVIEW_HXX
|
|
|
|
#include "queryview.hxx"
|
|
|
|
#endif
|
|
|
|
#ifndef _DBAU_REGHELPER_HXX_
|
|
|
|
#include "dbu_reghelper.hxx"
|
|
|
|
#endif
|
|
|
|
#ifndef _SFXSIDS_HRC
|
|
|
|
#include <sfx2/sfxsids.hrc>
|
|
|
|
#endif
|
2002-08-19 07:01:32 +00:00
|
|
|
#ifndef _DBU_QRY_HRC_
|
|
|
|
#include "dbu_qry.hrc"
|
2001-02-05 08:35:57 +00:00
|
|
|
#endif
|
|
|
|
#ifndef DBACCESS_UI_BROWSER_ID_HXX
|
|
|
|
#include "browserids.hxx"
|
|
|
|
#endif
|
2001-08-23 13:39:09 +00:00
|
|
|
#ifndef DBAUI_QUERYCONTAINERWINDOW_HXX
|
|
|
|
#include "querycontainerwindow.hxx"
|
|
|
|
#endif
|
2001-02-05 08:35:57 +00:00
|
|
|
#ifndef DBAUI_QUERYVIEW_TEXT_HXX
|
|
|
|
#include "QueryTextView.hxx"
|
|
|
|
#endif
|
2001-02-05 15:17:40 +00:00
|
|
|
#ifndef DBAUI_QUERYDESIGNVIEW_HXX
|
2001-02-05 08:35:57 +00:00
|
|
|
#include "QueryDesignView.hxx"
|
2001-02-05 15:17:40 +00:00
|
|
|
#endif
|
2001-02-05 08:35:57 +00:00
|
|
|
#ifndef _COMPHELPER_TYPES_HXX_
|
|
|
|
#include <comphelper/types.hxx>
|
|
|
|
#endif
|
2001-04-24 13:28:56 +00:00
|
|
|
#ifndef _SV_MSGBOX_HXX
|
|
|
|
#include <vcl/msgbox.hxx>
|
|
|
|
#endif
|
2001-02-05 08:35:57 +00:00
|
|
|
#ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
|
|
|
|
#include "dbustrings.hrc"
|
|
|
|
#endif
|
|
|
|
#ifndef _CONNECTIVITY_DBTOOLS_HXX_
|
|
|
|
#include <connectivity/dbtools.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDB_XSQLQUERYCOMPOSERFACTORY_HPP_
|
|
|
|
#include <com/sun/star/sdb/XSQLQueryComposerFactory.hpp>
|
|
|
|
#endif
|
2004-03-19 11:12:55 +00:00
|
|
|
#ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_
|
|
|
|
#include <com/sun/star/beans/PropertyAttribute.hpp>
|
|
|
|
#endif
|
2002-04-02 05:40:36 +00:00
|
|
|
#ifndef _COM_SUN_STAR_FRAME_XLOADEVENTLISTENER_HPP_
|
|
|
|
#include <com/sun/star/frame/XLoadEventListener.hpp>
|
|
|
|
#endif
|
2001-04-24 13:28:56 +00:00
|
|
|
#ifndef _COM_SUN_STAR_SDBCX_XVIEWSSUPPLIER_HPP_
|
|
|
|
#include <com/sun/star/sdbcx/XViewsSupplier.hpp>
|
|
|
|
#endif
|
2001-02-05 08:35:57 +00:00
|
|
|
#ifndef _COM_SUN_STAR_FRAME_FRAMESEARCHFLAG_HPP_
|
|
|
|
#include <com/sun/star/frame/FrameSearchFlag.hpp>
|
|
|
|
#endif
|
2001-03-15 07:29:16 +00:00
|
|
|
#ifndef _COMPHELPER_EXTRACT_HXX_
|
|
|
|
#include <comphelper/extract.hxx>
|
2001-02-05 08:35:57 +00:00
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDB_COMMANDTYPE_HPP_
|
|
|
|
#include <com/sun/star/sdb/CommandType.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef DBAUI_DLGSAVE_HXX
|
|
|
|
#include "dlgsave.hxx"
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_CONTAINER_XCHILD_HPP_
|
|
|
|
#include <com/sun/star/container/XChild.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDB_XQUERIESSUPPLIER_HPP_
|
|
|
|
#include <com/sun/star/sdb/XQueriesSupplier.hpp>
|
|
|
|
#endif
|
2001-03-14 09:35:11 +00:00
|
|
|
#ifndef _COM_SUN_STAR_SDB_XQUERYDEFINITIONSSUPPLIER_HPP_
|
|
|
|
#include <com/sun/star/sdb/XQueryDefinitionsSupplier.hpp>
|
|
|
|
#endif
|
2001-02-05 08:35:57 +00:00
|
|
|
#ifndef _COM_SUN_STAR_CONTAINER_XNAMECONTAINER_HPP_
|
|
|
|
#include <com/sun/star/container/XNameContainer.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDBCX_XDATADESCRIPTORFACTORY_HPP_
|
|
|
|
#include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDBCX_XDROP_HPP_
|
|
|
|
#include <com/sun/star/sdbcx/XDrop.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDBCX_XAPPEND_HPP_
|
|
|
|
#include <com/sun/star/sdbcx/XAppend.hpp>
|
|
|
|
#endif
|
2001-02-06 12:22:12 +00:00
|
|
|
#ifndef _COM_SUN_STAR_SDB_SQLCONTEXT_HPP_
|
|
|
|
#include <com/sun/star/sdb/SQLContext.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDBC_SQLWARNING_HPP_
|
|
|
|
#include <com/sun/star/sdbc/SQLWarning.hpp>
|
|
|
|
#endif
|
2001-04-24 13:28:56 +00:00
|
|
|
#ifndef _COM_SUN_STAR_SDBC_XROW_HPP_
|
|
|
|
#include <com/sun/star/sdbc/XRow.hpp>
|
|
|
|
#endif
|
2001-02-05 08:35:57 +00:00
|
|
|
#ifndef _DBHELPER_DBEXCEPTION_HXX_
|
|
|
|
#include <connectivity/dbexception.hxx>
|
|
|
|
#endif
|
2001-06-15 08:55:48 +00:00
|
|
|
#ifndef _COM_SUN_STAR_UI_DIALOGS_XEXECUTABLEDIALOG_HPP_
|
|
|
|
#include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
|
2001-02-05 08:35:57 +00:00
|
|
|
#endif
|
|
|
|
#ifndef DBAUI_TABLECONNECTIONDATA_HXX
|
|
|
|
#include "TableConnectionData.hxx"
|
|
|
|
#endif
|
|
|
|
#ifndef DBAUI_QYDLGTAB_HXX
|
|
|
|
#include "adtabdlg.hxx"
|
|
|
|
#endif
|
|
|
|
#ifndef DBAUI_QUERYVIEWSWITCH_HXX
|
|
|
|
#include "QueryViewSwitch.hxx"
|
|
|
|
#endif
|
|
|
|
#ifndef _COMPHELPER_STREAMSECTION_HXX_
|
|
|
|
#include <comphelper/streamsection.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef _COMPHELPER_BASIC_IO_HXX_
|
|
|
|
#include <comphelper/basicio.hxx>
|
|
|
|
#endif
|
|
|
|
#ifndef DBAUI_TABLEFIELDDESC_HXX
|
|
|
|
#include "TableFieldDescription.hxx"
|
|
|
|
#endif
|
|
|
|
#ifndef DBAUI_QUERY_TABLEWINDOWDATA_HXX
|
|
|
|
#include "QTableWindowData.hxx"
|
|
|
|
#endif
|
|
|
|
#ifndef _COMPHELPER_SEQSTREAM_HXX
|
|
|
|
#include <comphelper/seqstream.hxx>
|
|
|
|
#endif
|
2001-04-23 08:30:31 +00:00
|
|
|
#ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
|
|
|
|
#include <toolkit/helper/vclunohelper.hxx>
|
|
|
|
#endif
|
2001-02-05 08:35:57 +00:00
|
|
|
#ifndef _COM_SUN_STAR_IO_XACTIVEDATASOURCE_HPP_
|
|
|
|
#include <com/sun/star/io/XActiveDataSource.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_IO_XACTIVEDATASINK_HPP_
|
|
|
|
#include <com/sun/star/io/XActiveDataSink.hpp>
|
|
|
|
#endif
|
2001-02-05 15:17:40 +00:00
|
|
|
#ifndef DBAUI_QUERY_TABLEWINDOW_HXX
|
|
|
|
#include "QTableWindow.hxx"
|
|
|
|
#endif
|
2001-02-23 14:04:37 +00:00
|
|
|
#ifndef _DBAUI_SQLMESSAGE_HXX_
|
|
|
|
#include "sqlmessage.hxx"
|
|
|
|
#endif
|
2001-07-16 06:56:28 +00:00
|
|
|
#ifndef DBAUI_TOOLS_HXX
|
|
|
|
#include "UITools.hxx"
|
|
|
|
#endif
|
2002-02-06 06:57:18 +00:00
|
|
|
#ifndef DBAUI_QUERYTABLEVIEW_HXX
|
|
|
|
#include "QueryTableView.hxx"
|
|
|
|
#endif
|
2002-10-08 06:26:17 +00:00
|
|
|
#ifndef _SV_SVAPP_HXX
|
|
|
|
#include <vcl/svapp.hxx>
|
|
|
|
#endif
|
2004-03-19 11:12:55 +00:00
|
|
|
#ifndef _SVTOOLS_LOCALRESACCESS_HXX_
|
|
|
|
#include <svtools/localresaccess.hxx>
|
|
|
|
#endif
|
2001-02-05 08:35:57 +00:00
|
|
|
|
|
|
|
extern "C" void SAL_CALL createRegistryInfo_OQueryControl()
|
|
|
|
{
|
|
|
|
static ::dbaui::OMultiInstanceAutoRegistration< ::dbaui::OQueryController > aAutoRegistration;
|
|
|
|
}
|
|
|
|
|
2002-04-02 05:40:36 +00:00
|
|
|
namespace dbaui
|
|
|
|
{
|
2002-10-04 11:32:24 +00:00
|
|
|
using namespace ::connectivity;
|
2003-04-15 15:04:18 +00:00
|
|
|
#if OSL_DEBUG_LEVEL > 1
|
2002-10-04 11:32:24 +00:00
|
|
|
namespace
|
|
|
|
{
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void insertParseTree(SvTreeListBox* _pBox,::connectivity::OSQLParseNode* _pNode,SvLBoxEntry* _pParent = NULL)
|
|
|
|
{
|
|
|
|
::rtl::OUString rString;
|
|
|
|
if (!_pNode->isToken())
|
|
|
|
{
|
|
|
|
// Regelnamen als rule: ...
|
|
|
|
rString = ::rtl::OUString::createFromAscii("RULE_ID: ");
|
|
|
|
rString += ::rtl::OUString::valueOf( (sal_Int32)_pNode->getRuleID());
|
|
|
|
rString+= ::rtl::OUString::createFromAscii("(");
|
|
|
|
rString += OSQLParser::RuleIDToStr(_pNode->getRuleID());
|
|
|
|
rString+= ::rtl::OUString::createFromAscii(")");
|
|
|
|
|
|
|
|
|
|
|
|
_pParent = _pBox->InsertEntry(rString,_pParent);
|
|
|
|
|
|
|
|
// einmal auswerten wieviel Subtrees dieser Knoten besitzt
|
|
|
|
sal_uInt32 nStop = _pNode->count();
|
|
|
|
// hol dir den ersten Subtree
|
|
|
|
for(sal_uInt32 i=0;i<nStop;++i)
|
|
|
|
insertParseTree(_pBox,_pNode->getChild(i),_pParent);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// ein Token gefunden
|
|
|
|
// tabs fuer das Einruecken entsprechend nLevel
|
|
|
|
|
|
|
|
switch (_pNode->getNodeType())
|
|
|
|
{
|
|
|
|
|
|
|
|
case SQL_NODE_KEYWORD:
|
2003-08-18 14:05:54 +00:00
|
|
|
{
|
|
|
|
rString+= ::rtl::OUString::createFromAscii("SQL_KEYWORD:");
|
|
|
|
::rtl::OString sT = OSQLParser::TokenIDToStr(_pNode->getTokenID());
|
|
|
|
rString += ::rtl::OUString(sT,sT.getLength(),RTL_TEXTENCODING_UTF8);
|
2002-10-04 11:32:24 +00:00
|
|
|
break;}
|
|
|
|
|
|
|
|
case SQL_NODE_COMPARISON:
|
|
|
|
{rString+= ::rtl::OUString::createFromAscii("SQL_COMPARISON:");
|
|
|
|
rString += _pNode->getTokenValue(); // haenge Nodevalue an
|
|
|
|
// und beginne neu Zeile
|
|
|
|
break;}
|
|
|
|
|
|
|
|
case SQL_NODE_NAME:
|
|
|
|
{rString+= ::rtl::OUString::createFromAscii("SQL_NAME:");
|
|
|
|
rString+= ::rtl::OUString::createFromAscii("\"");
|
|
|
|
rString += _pNode->getTokenValue();
|
|
|
|
rString+= ::rtl::OUString::createFromAscii("\"");
|
|
|
|
|
|
|
|
break;}
|
|
|
|
|
|
|
|
case SQL_NODE_STRING:
|
|
|
|
{rString += ::rtl::OUString::createFromAscii("SQL_STRING:'");
|
|
|
|
rString += _pNode->getTokenValue();
|
|
|
|
break;}
|
|
|
|
|
|
|
|
case SQL_NODE_INTNUM:
|
|
|
|
{rString += ::rtl::OUString::createFromAscii("SQL_INTNUM:");
|
|
|
|
rString += _pNode->getTokenValue();
|
|
|
|
break;}
|
|
|
|
|
|
|
|
case SQL_NODE_APPROXNUM:
|
|
|
|
{rString += ::rtl::OUString::createFromAscii("SQL_APPROXNUM:");
|
|
|
|
rString += _pNode->getTokenValue();
|
|
|
|
break;}
|
|
|
|
|
|
|
|
case SQL_NODE_PUNCTUATION:
|
|
|
|
{rString += ::rtl::OUString::createFromAscii("SQL_PUNCTUATION:");
|
|
|
|
rString += _pNode->getTokenValue(); // haenge Nodevalue an
|
|
|
|
break;}
|
|
|
|
|
|
|
|
case SQL_NODE_AMMSC:
|
|
|
|
{rString += ::rtl::OUString::createFromAscii("SQL_AMMSC:");
|
|
|
|
rString += _pNode->getTokenValue(); // haenge Nodevalue an
|
|
|
|
|
|
|
|
break;}
|
|
|
|
|
|
|
|
default:
|
|
|
|
OSL_ASSERT("OSQLParser::ShowParseTree: unzulaessiger NodeType");
|
|
|
|
rString += _pNode->getTokenValue();
|
|
|
|
}
|
|
|
|
_pBox->InsertEntry(rString,_pParent);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2003-04-15 15:04:18 +00:00
|
|
|
#endif // OSL_DEBUG_LEVEL
|
2001-02-05 08:35:57 +00:00
|
|
|
|
|
|
|
using namespace ::com::sun::star::uno;
|
|
|
|
using namespace ::com::sun::star::io;
|
|
|
|
using namespace ::com::sun::star::beans;
|
|
|
|
using namespace ::com::sun::star::frame;
|
|
|
|
using namespace ::com::sun::star::util;
|
|
|
|
using namespace ::com::sun::star::lang;
|
|
|
|
using namespace ::com::sun::star::container;
|
|
|
|
using namespace ::com::sun::star::sdbcx;
|
|
|
|
using namespace ::com::sun::star::sdbc;
|
|
|
|
using namespace ::com::sun::star::sdb;
|
2001-06-15 08:55:48 +00:00
|
|
|
using namespace ::com::sun::star::ui::dialogs;
|
2001-04-23 08:30:31 +00:00
|
|
|
using namespace ::com::sun::star::awt;
|
2001-02-05 08:35:57 +00:00
|
|
|
using namespace ::dbtools;
|
2002-04-02 05:40:36 +00:00
|
|
|
|
2001-02-05 08:35:57 +00:00
|
|
|
using namespace ::comphelper;
|
|
|
|
|
2002-05-06 09:02:23 +00:00
|
|
|
namespace
|
|
|
|
{
|
2004-09-09 08:49:48 +00:00
|
|
|
void switchDesignModeImpl(OQueryController* _pController,OQueryContainerWindow* _pWindow,sal_Bool& _rbDesign)
|
2002-05-06 09:02:23 +00:00
|
|
|
{
|
|
|
|
if ( !_pWindow->switchView() )
|
|
|
|
{
|
|
|
|
_rbDesign = !_rbDesign;
|
|
|
|
_pWindow->switchView();
|
|
|
|
}
|
2004-09-09 08:49:48 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
Reference< drafts::com::sun::star::frame::XLayoutManager > xLayoutManager = _pController->getLayoutManager(_pController->getFrame());
|
|
|
|
|
|
|
|
if ( xLayoutManager.is() )
|
|
|
|
{
|
|
|
|
xLayoutManager->lock();
|
|
|
|
static ::rtl::OUString s_sDesignToolbar(RTL_CONSTASCII_USTRINGPARAM("private:resource/toolbar/designobjectbar"));
|
|
|
|
static ::rtl::OUString s_sSqlToolbar(RTL_CONSTASCII_USTRINGPARAM("private:resource/toolbar/sqlobjectbar"));
|
|
|
|
if ( _rbDesign )
|
|
|
|
{
|
|
|
|
xLayoutManager->destroyElement( s_sSqlToolbar );
|
|
|
|
xLayoutManager->createElement( s_sDesignToolbar );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
xLayoutManager->destroyElement( s_sDesignToolbar );
|
|
|
|
xLayoutManager->createElement( s_sSqlToolbar );
|
|
|
|
}
|
|
|
|
xLayoutManager->unlock();
|
|
|
|
}
|
|
|
|
}
|
2002-05-06 09:02:23 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-02-05 08:35:57 +00:00
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
::rtl::OUString SAL_CALL OQueryController::getImplementationName() throw( RuntimeException )
|
|
|
|
{
|
|
|
|
return getImplementationName_Static();
|
|
|
|
}
|
|
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
::rtl::OUString OQueryController::getImplementationName_Static() throw( RuntimeException )
|
|
|
|
{
|
|
|
|
return ::rtl::OUString::createFromAscii("org.openoffice.comp.dbu.OQueryDesign");
|
|
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
|
Sequence< ::rtl::OUString> OQueryController::getSupportedServiceNames_Static(void) throw( RuntimeException )
|
|
|
|
{
|
|
|
|
Sequence< ::rtl::OUString> aSupported(1);
|
|
|
|
aSupported.getArray()[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdb.QueryDesign");
|
|
|
|
return aSupported;
|
|
|
|
}
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
Sequence< ::rtl::OUString> SAL_CALL OQueryController::getSupportedServiceNames() throw(RuntimeException)
|
|
|
|
{
|
|
|
|
return getSupportedServiceNames_Static();
|
|
|
|
}
|
|
|
|
// -------------------------------------------------------------------------
|
|
|
|
Reference< XInterface > SAL_CALL OQueryController::Create(const Reference<XMultiServiceFactory >& _rxFactory)
|
|
|
|
{
|
|
|
|
return *(new OQueryController(_rxFactory));
|
|
|
|
}
|
2001-08-15 12:19:03 +00:00
|
|
|
DBG_NAME(OQueryController);
|
2001-02-05 08:35:57 +00:00
|
|
|
// -----------------------------------------------------------------------------
|
2001-02-28 09:18:26 +00:00
|
|
|
OQueryController::OQueryController(const Reference< XMultiServiceFactory >& _rM)
|
|
|
|
: OJoinController(_rM)
|
2001-02-05 08:35:57 +00:00
|
|
|
,m_bDesign(sal_False)
|
|
|
|
,m_bDistinct(sal_False)
|
|
|
|
,m_bViewAlias(sal_False)
|
|
|
|
,m_bViewTable(sal_False)
|
|
|
|
,m_bViewFunction(sal_False)
|
|
|
|
,m_bEsacpeProcessing(sal_True)
|
|
|
|
,m_pSqlIterator(NULL)
|
|
|
|
,m_nSplitPos(-1)
|
|
|
|
,m_nVisibleRows(0x400)
|
2001-04-24 13:28:56 +00:00
|
|
|
,m_bCreateView(sal_False)
|
2004-03-19 11:12:55 +00:00
|
|
|
,m_bIndependent( sal_False )
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
2001-08-15 12:19:03 +00:00
|
|
|
DBG_CTOR(OQueryController,NULL);
|
2002-09-27 10:26:33 +00:00
|
|
|
m_pParseContext = new svxform::OSystemParseContext();
|
2001-02-14 13:54:12 +00:00
|
|
|
m_pSqlParser = new OSQLParser(_rM,m_pParseContext);
|
2001-02-05 08:35:57 +00:00
|
|
|
InvalidateAll();
|
2004-03-19 11:12:55 +00:00
|
|
|
|
|
|
|
registerProperty( PROPERTY_ACTIVECOMMAND, PROPERTY_ID_ACTIVECOMMAND, PropertyAttribute::READONLY | PropertyAttribute::BOUND,
|
|
|
|
&m_sStatement, ::getCppuType( &m_sStatement ) );
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
2004-03-19 11:12:55 +00:00
|
|
|
|
2001-02-05 08:35:57 +00:00
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
OQueryController::~OQueryController()
|
|
|
|
{
|
2001-08-15 12:19:03 +00:00
|
|
|
DBG_DTOR(OQueryController,NULL);
|
2004-08-02 15:16:32 +00:00
|
|
|
if ( !getBroadcastHelper().bDisposed && !getBroadcastHelper().bInDispose )
|
|
|
|
{
|
|
|
|
OSL_ENSURE(0,"Please check who doesn't dispose this component!");
|
|
|
|
// increment ref count to prevent double call of Dtor
|
|
|
|
osl_incrementInterlockedCount( &m_refCount );
|
|
|
|
dispose();
|
|
|
|
}
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
2001-04-06 12:47:18 +00:00
|
|
|
void OQueryController::deleteIterator()
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
|
|
|
if(m_pSqlIterator)
|
|
|
|
{
|
|
|
|
delete m_pSqlIterator->getParseTree();
|
|
|
|
m_pSqlIterator->dispose();
|
|
|
|
delete m_pSqlIterator;
|
2001-04-06 12:47:18 +00:00
|
|
|
m_pSqlIterator = NULL;
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
2001-04-06 12:47:18 +00:00
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void OQueryController::disposing()
|
|
|
|
{
|
|
|
|
deleteIterator();
|
2001-02-05 08:35:57 +00:00
|
|
|
|
2001-02-14 13:54:12 +00:00
|
|
|
delete m_pSqlParser;
|
|
|
|
delete m_pParseContext;
|
|
|
|
|
2001-10-05 05:49:21 +00:00
|
|
|
clearFields();
|
|
|
|
OTableFields().swap(m_vUnUsedFieldsDesc);
|
2001-02-05 08:35:57 +00:00
|
|
|
|
|
|
|
m_pView = NULL;
|
|
|
|
|
|
|
|
::comphelper::disposeComponent(m_xComposer);
|
2001-03-01 14:17:55 +00:00
|
|
|
OJoinController::disposing();
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
2001-10-05 05:49:21 +00:00
|
|
|
void OQueryController::clearFields()
|
|
|
|
{
|
|
|
|
OTableFields().swap(m_vTableFieldDesc);
|
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
2002-04-03 12:57:14 +00:00
|
|
|
FeatureState OQueryController::GetState(sal_uInt16 _nId) const
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
|
|
|
FeatureState aReturn;
|
2001-03-20 07:15:49 +00:00
|
|
|
aReturn.bEnabled = sal_True;
|
2001-02-05 08:35:57 +00:00
|
|
|
// (disabled automatically)
|
|
|
|
|
|
|
|
switch (_nId)
|
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
case ID_BROWSER_EDITDOC:
|
|
|
|
if ( m_bIndependent )
|
|
|
|
aReturn.bEnabled = sal_False;
|
|
|
|
else
|
|
|
|
aReturn = OJoinController::GetState( _nId );
|
|
|
|
break;
|
|
|
|
|
2001-02-05 08:35:57 +00:00
|
|
|
case ID_BROWSER_ESACPEPROCESSING:
|
|
|
|
aReturn.aState = ::cppu::bool2any(!m_bEsacpeProcessing);
|
2004-03-19 11:12:55 +00:00
|
|
|
aReturn.bEnabled = !m_bIndependent && ( m_pSqlIterator != NULL ) && !m_bDesign;
|
2002-02-06 06:57:18 +00:00
|
|
|
break;
|
2004-09-09 08:49:48 +00:00
|
|
|
case SID_RELATION_ADD_RELATION:
|
2002-08-19 07:01:32 +00:00
|
|
|
aReturn.bEnabled = isEditable() && m_bDesign && m_vTableData.size() > 1;
|
2001-02-05 08:35:57 +00:00
|
|
|
break;
|
|
|
|
case ID_BROWSER_SAVEASDOC:
|
2004-03-19 11:12:55 +00:00
|
|
|
aReturn.bEnabled = !m_bIndependent && !m_bCreateView && (!m_bDesign || !(m_vTableFieldDesc.empty() || m_vTableData.empty()));
|
2001-02-05 08:35:57 +00:00
|
|
|
break;
|
|
|
|
case ID_BROWSER_SAVEDOC:
|
2002-08-19 07:01:32 +00:00
|
|
|
aReturn.bEnabled = isModified() && (!m_bDesign || !(m_vTableFieldDesc.empty() || m_vTableData.empty()));
|
2001-02-05 08:35:57 +00:00
|
|
|
break;
|
|
|
|
case SID_PRINTDOCDIRECT:
|
|
|
|
break;
|
|
|
|
case ID_BROWSER_CUT:
|
2002-08-19 07:01:32 +00:00
|
|
|
aReturn.bEnabled = isEditable() && getContainer() && getContainer()->isCutAllowed();
|
2001-02-05 08:35:57 +00:00
|
|
|
break;
|
|
|
|
case ID_BROWSER_COPY:
|
2001-08-23 13:39:09 +00:00
|
|
|
aReturn.bEnabled = getContainer() && getContainer()->isCopyAllowed();
|
2001-02-05 08:35:57 +00:00
|
|
|
break;
|
|
|
|
case ID_BROWSER_PASTE:
|
2002-08-19 07:01:32 +00:00
|
|
|
aReturn.bEnabled = isEditable() && getContainer() && getContainer()->isPasteAllowed();
|
2001-02-05 08:35:57 +00:00
|
|
|
break;
|
|
|
|
case ID_BROWSER_SQL:
|
2001-03-14 09:35:11 +00:00
|
|
|
aReturn.bEnabled = m_bEsacpeProcessing && m_pSqlIterator;
|
2001-02-05 08:35:57 +00:00
|
|
|
aReturn.aState = ::cppu::bool2any(m_bDesign);
|
|
|
|
break;
|
2004-09-09 08:49:48 +00:00
|
|
|
case SID_BROWSER_CLEAR_QUERY:
|
2002-08-19 07:01:32 +00:00
|
|
|
aReturn.bEnabled = isEditable() && (m_sStatement.getLength() || !m_vTableData.empty());
|
2001-02-05 08:35:57 +00:00
|
|
|
break;
|
2004-09-09 08:49:48 +00:00
|
|
|
case SID_QUERY_VIEW_FUNCTIONS:
|
|
|
|
case SID_QUERY_VIEW_TABLES:
|
|
|
|
case SID_QUERY_VIEW_ALIASES:
|
2001-08-23 13:39:09 +00:00
|
|
|
aReturn.aState = ::cppu::bool2any(getContainer() && getContainer()->isSlotEnabled(_nId));
|
2002-04-02 06:09:02 +00:00
|
|
|
aReturn.bEnabled = m_bDesign;
|
2001-02-05 08:35:57 +00:00
|
|
|
break;
|
2004-09-09 08:49:48 +00:00
|
|
|
case SID_QUERY_DISTINCT_VALUES:
|
2002-08-19 07:01:32 +00:00
|
|
|
aReturn.bEnabled = m_bDesign && isEditable();
|
2001-02-05 08:35:57 +00:00
|
|
|
aReturn.aState = ::cppu::bool2any(m_bDistinct);
|
|
|
|
break;
|
|
|
|
case ID_BROWSER_QUERY_EXECUTE:
|
|
|
|
aReturn.bEnabled = sal_True;
|
|
|
|
break;
|
2004-09-09 08:49:48 +00:00
|
|
|
case SID_DB_QUERY_PREVIEW:
|
|
|
|
aReturn.bEnabled = sal_True;
|
|
|
|
aReturn.aState <<= ::cppu::bool2any(getContainer() && getContainer()->getPreviewFrame().is());
|
|
|
|
break;
|
2003-04-15 15:04:18 +00:00
|
|
|
#if OSL_DEBUG_LEVEL > 1
|
2002-10-04 11:32:24 +00:00
|
|
|
case ID_EDIT_QUERY_SQL:
|
|
|
|
break;
|
2002-12-12 12:44:48 +00:00
|
|
|
case ID_EDIT_QUERY_DESIGN:
|
|
|
|
break;
|
2002-10-04 11:32:24 +00:00
|
|
|
#endif
|
2002-04-02 06:09:02 +00:00
|
|
|
case ID_BROWSER_ADDTABLE:
|
|
|
|
if ( !m_bDesign )
|
|
|
|
{
|
|
|
|
aReturn.bEnabled = sal_False;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
// run through
|
2001-02-28 09:18:26 +00:00
|
|
|
default:
|
|
|
|
aReturn = OJoinController::GetState(_nId);
|
|
|
|
break;
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
return aReturn;
|
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
2004-09-09 08:49:48 +00:00
|
|
|
void OQueryController::Execute(sal_uInt16 _nId, const Sequence< PropertyValue >& aArgs)
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
|
|
|
switch(_nId)
|
|
|
|
{
|
|
|
|
case ID_BROWSER_ESACPEPROCESSING:
|
|
|
|
m_bEsacpeProcessing = !m_bEsacpeProcessing;
|
2001-10-23 11:30:27 +00:00
|
|
|
setModified(sal_True);
|
2001-02-07 12:32:20 +00:00
|
|
|
InvalidateFeature(ID_BROWSER_SQL);
|
2001-02-05 08:35:57 +00:00
|
|
|
break;
|
|
|
|
case ID_BROWSER_SAVEASDOC:
|
|
|
|
case ID_BROWSER_SAVEDOC:
|
2001-04-24 13:28:56 +00:00
|
|
|
doSaveAsDoc(ID_BROWSER_SAVEASDOC == _nId);
|
2001-05-08 13:04:19 +00:00
|
|
|
// check we have a view and if we could saved it correctly
|
|
|
|
if(m_bCreateView && !isModified())
|
2001-04-24 13:28:56 +00:00
|
|
|
closeTask();
|
2001-02-05 08:35:57 +00:00
|
|
|
break;
|
2004-09-09 08:49:48 +00:00
|
|
|
case SID_RELATION_ADD_RELATION:
|
2002-02-06 06:57:18 +00:00
|
|
|
{
|
|
|
|
OJoinDesignView* pView = getJoinView();
|
|
|
|
if( pView )
|
|
|
|
static_cast<OQueryTableView*>(pView->getTableView())->createNewConnection();
|
|
|
|
}
|
|
|
|
break;
|
2001-02-05 08:35:57 +00:00
|
|
|
case SID_PRINTDOCDIRECT:
|
|
|
|
break;
|
|
|
|
case ID_BROWSER_CUT:
|
2001-08-23 13:39:09 +00:00
|
|
|
getContainer()->cut();
|
2001-02-05 08:35:57 +00:00
|
|
|
break;
|
|
|
|
case ID_BROWSER_COPY:
|
2001-08-23 13:39:09 +00:00
|
|
|
getContainer()->copy();
|
2001-02-05 08:35:57 +00:00
|
|
|
break;
|
|
|
|
case ID_BROWSER_PASTE:
|
2001-08-23 13:39:09 +00:00
|
|
|
getContainer()->paste();
|
2001-02-05 08:35:57 +00:00
|
|
|
break;
|
|
|
|
case ID_BROWSER_SQL:
|
2001-09-27 05:19:05 +00:00
|
|
|
if(getContainer()->checkStatement())
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2001-02-14 13:54:12 +00:00
|
|
|
::rtl::OUString aErrorMsg;
|
2004-03-19 11:12:55 +00:00
|
|
|
setStatement_fireEvent( getContainer()->getStatement() );
|
2001-03-14 09:35:11 +00:00
|
|
|
if(!m_sStatement.getLength() && m_pSqlIterator)
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
|
|
|
// change the view of the data
|
|
|
|
delete m_pSqlIterator->getParseTree();
|
|
|
|
m_pSqlIterator->setParseTree(NULL);
|
|
|
|
m_bDesign = !m_bDesign;
|
2004-09-09 08:49:48 +00:00
|
|
|
switchDesignModeImpl(this,getContainer(),m_bDesign);
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2001-08-13 07:34:13 +00:00
|
|
|
::connectivity::OSQLParseNode* pNode = m_pSqlParser->parseTree(aErrorMsg,m_sStatement,m_bDesign);
|
2001-02-05 08:35:57 +00:00
|
|
|
// m_pParseNode = pNode;
|
|
|
|
if(pNode)
|
|
|
|
{
|
|
|
|
delete m_pSqlIterator->getParseTree();
|
|
|
|
m_pSqlIterator->setParseTree(pNode);
|
|
|
|
m_pSqlIterator->traverseAll();
|
2001-02-23 14:04:37 +00:00
|
|
|
SQLWarning aWarning = m_pSqlIterator->getWarning();
|
|
|
|
if(aWarning.Message.getLength())
|
|
|
|
showError(SQLExceptionInfo(aWarning));
|
2001-02-05 08:35:57 +00:00
|
|
|
else
|
|
|
|
{
|
2001-02-23 14:04:37 +00:00
|
|
|
const OSQLTables& xTabs = m_pSqlIterator->getTables();
|
2001-02-28 09:18:26 +00:00
|
|
|
if( m_pSqlIterator->getStatementType() != SQL_STATEMENT_SELECT && m_pSqlIterator->getStatementType() != SQL_STATEMENT_SELECT_COUNT || xTabs.begin() == xTabs.end())
|
2001-02-23 14:04:37 +00:00
|
|
|
{
|
2002-05-15 09:15:12 +00:00
|
|
|
ModuleRes aModuleRes(STR_QRY_NOSELECT);
|
|
|
|
String sTmpStr(aModuleRes);
|
|
|
|
::rtl::OUString sError(sTmpStr);
|
|
|
|
showError(SQLException(sError,NULL,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("S1000")),1000,Any()));
|
2001-02-23 14:04:37 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// change the view of the data
|
|
|
|
m_bDesign = !m_bDesign;
|
2004-03-19 11:12:55 +00:00
|
|
|
::rtl::OUString sNewStatement;
|
|
|
|
pNode->parseNodeToStr( sNewStatement, getMetaData() );
|
|
|
|
setStatement_fireEvent( sNewStatement );
|
2001-08-23 13:39:09 +00:00
|
|
|
getContainer()->SaveUIConfig();
|
2004-09-09 08:49:48 +00:00
|
|
|
switchDesignModeImpl(this,getContainer(),m_bDesign);
|
2001-02-23 14:04:37 +00:00
|
|
|
}
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-05-15 09:15:12 +00:00
|
|
|
ModuleRes aModuleRes(STR_QRY_SYNTAX);
|
|
|
|
String sTmpStr(aModuleRes);
|
|
|
|
::rtl::OUString sError(sTmpStr);
|
2002-05-06 09:02:23 +00:00
|
|
|
showError(SQLException(sError,NULL,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("S1000") ),1000,Any()));
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch(SQLException& e)
|
|
|
|
{
|
|
|
|
::dbtools::SQLExceptionInfo aInfo(e);
|
|
|
|
showError(aInfo);
|
|
|
|
}
|
|
|
|
catch(Exception&)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
if(m_bDesign)
|
2002-04-02 06:09:02 +00:00
|
|
|
{
|
2001-02-05 08:35:57 +00:00
|
|
|
InvalidateFeature(ID_BROWSER_ADDTABLE);
|
2004-09-09 08:49:48 +00:00
|
|
|
InvalidateFeature(SID_RELATION_ADD_RELATION);
|
2002-04-02 06:09:02 +00:00
|
|
|
}
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
break;
|
2004-09-09 08:49:48 +00:00
|
|
|
case SID_BROWSER_CLEAR_QUERY:
|
2001-04-30 12:02:01 +00:00
|
|
|
{
|
2002-08-19 07:01:32 +00:00
|
|
|
getUndoMgr()->EnterListAction( String( ModuleRes(STR_QUERY_UNDO_TABWINDELETE) ), String() );
|
2001-08-23 13:39:09 +00:00
|
|
|
getContainer()->clear();
|
2002-08-19 07:01:32 +00:00
|
|
|
getUndoMgr()->LeaveListAction();
|
2001-04-30 12:02:01 +00:00
|
|
|
|
2004-03-19 11:12:55 +00:00
|
|
|
setStatement_fireEvent( ::rtl::OUString() );
|
2001-04-30 12:02:01 +00:00
|
|
|
if(m_bDesign)
|
|
|
|
InvalidateFeature(ID_BROWSER_ADDTABLE);
|
|
|
|
}
|
2001-02-05 08:35:57 +00:00
|
|
|
// InvalidateFeature(ID_BROWSER_QUERY_EXECUTE);
|
|
|
|
break;
|
2004-09-09 08:49:48 +00:00
|
|
|
case SID_QUERY_VIEW_FUNCTIONS:
|
|
|
|
case SID_QUERY_VIEW_TABLES:
|
|
|
|
case SID_QUERY_VIEW_ALIASES:
|
2001-08-23 13:39:09 +00:00
|
|
|
getContainer()->setSlotEnabled(_nId,!getContainer()->isSlotEnabled(_nId));
|
2001-10-23 11:30:27 +00:00
|
|
|
setModified(sal_True);
|
2001-02-05 08:35:57 +00:00
|
|
|
break;
|
2004-09-09 08:49:48 +00:00
|
|
|
case SID_QUERY_DISTINCT_VALUES:
|
2001-02-05 08:35:57 +00:00
|
|
|
m_bDistinct = !m_bDistinct;
|
2001-08-13 07:34:13 +00:00
|
|
|
setModified(sal_True);
|
2001-02-05 08:35:57 +00:00
|
|
|
break;
|
|
|
|
case ID_BROWSER_QUERY_EXECUTE:
|
2002-04-02 05:40:36 +00:00
|
|
|
if ( getContainer()->checkStatement() )
|
2001-04-02 09:18:50 +00:00
|
|
|
executeQuery();
|
2001-02-05 08:35:57 +00:00
|
|
|
break;
|
2004-09-09 08:49:48 +00:00
|
|
|
case SID_DB_QUERY_PREVIEW:
|
|
|
|
try
|
|
|
|
{
|
|
|
|
Reference<XFrame> xXFrame( getContainer()->getPreviewFrame());
|
|
|
|
if ( xXFrame.is() )
|
|
|
|
{
|
|
|
|
::comphelper::disposeComponent( xXFrame );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
Execute(ID_BROWSER_QUERY_EXECUTE,Sequence< PropertyValue >());
|
|
|
|
}
|
|
|
|
catch(Exception&)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
break;
|
2001-02-05 08:35:57 +00:00
|
|
|
case ID_QUERY_ZOOM_IN:
|
|
|
|
{
|
|
|
|
// m_aZoom *= Fraction(1,10);
|
2001-08-23 13:39:09 +00:00
|
|
|
// static_cast<OQueryViewSwitch*>(getView())->zoomTableView(m_aZoom);
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case ID_QUERY_ZOOM_OUT:
|
|
|
|
{
|
|
|
|
// if(m_aZoom != Fraction(1,1))
|
|
|
|
// m_aZoom /= Fraction(1,10);
|
2001-08-23 13:39:09 +00:00
|
|
|
// static_cast<OQueryViewSwitch*>(getView())->zoomTableView(m_aZoom);
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
break;
|
2003-04-15 15:04:18 +00:00
|
|
|
#if OSL_DEBUG_LEVEL > 1
|
2002-12-12 12:44:48 +00:00
|
|
|
case ID_EDIT_QUERY_DESIGN:
|
2002-10-04 11:32:24 +00:00
|
|
|
case ID_EDIT_QUERY_SQL:
|
|
|
|
{
|
|
|
|
::rtl::OUString aErrorMsg;
|
2004-03-19 11:12:55 +00:00
|
|
|
setStatement_fireEvent( getContainer()->getStatement() );
|
2002-10-04 11:32:24 +00:00
|
|
|
::connectivity::OSQLParseNode* pNode = m_pSqlParser->parseTree( aErrorMsg, m_sStatement, m_bDesign );
|
|
|
|
if ( pNode )
|
|
|
|
{
|
|
|
|
Window* pView = getView();
|
|
|
|
ModalDialog* pWindow = new ModalDialog(pView);
|
2004-09-09 08:49:48 +00:00
|
|
|
pWindow->SetPosSizePixel(::Point(0,0),pView->GetSizePixel());
|
2002-10-04 11:32:24 +00:00
|
|
|
SvTreeListBox* pTreeBox = new SvTreeListBox(pWindow);
|
2004-09-09 08:49:48 +00:00
|
|
|
pTreeBox->SetPosSizePixel(::Point(0,0),pView->GetSizePixel());
|
2002-10-04 11:32:24 +00:00
|
|
|
|
2002-12-12 12:44:48 +00:00
|
|
|
if ( _nId == ID_EDIT_QUERY_DESIGN )
|
|
|
|
{
|
|
|
|
::connectivity::OSQLParseNode* pTemp = pNode ? pNode->getChild(3)->getChild(1) : NULL;
|
|
|
|
// no where clause found
|
|
|
|
if ( pTemp && !pTemp->isLeaf() )
|
|
|
|
{
|
|
|
|
::connectivity::OSQLParseNode * pCondition = pTemp->getChild(1);
|
|
|
|
if ( pCondition ) // no where clause
|
|
|
|
{
|
|
|
|
::connectivity::OSQLParseNode::negateSearchCondition(pCondition);
|
|
|
|
::connectivity::OSQLParseNode *pNodeTmp = pTemp->getChild(1);
|
|
|
|
|
|
|
|
::connectivity::OSQLParseNode::disjunctiveNormalForm(pNodeTmp);
|
|
|
|
pNodeTmp = pTemp->getChild(1);
|
|
|
|
::connectivity::OSQLParseNode::absorptions(pNodeTmp);
|
|
|
|
pNodeTmp = pTemp->getChild(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2002-10-04 11:32:24 +00:00
|
|
|
insertParseTree(pTreeBox,pNode);
|
|
|
|
|
|
|
|
pTreeBox->Show();
|
|
|
|
pWindow->Execute();
|
|
|
|
|
|
|
|
delete pTreeBox;
|
|
|
|
delete pWindow;
|
|
|
|
delete pNode;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
#endif
|
2001-02-28 09:18:26 +00:00
|
|
|
default:
|
2004-09-09 08:49:48 +00:00
|
|
|
OJoinController::Execute(_nId,aArgs);
|
2001-02-28 09:18:26 +00:00
|
|
|
return; // else we would invalidate twice
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
InvalidateFeature(_nId);
|
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
2004-08-02 15:16:32 +00:00
|
|
|
void OQueryController::impl_initialize( const Sequence< Any >& aArguments )
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
2004-08-02 15:16:32 +00:00
|
|
|
OJoinController::impl_initialize(aArguments);
|
2001-02-05 08:35:57 +00:00
|
|
|
|
2001-07-18 07:51:19 +00:00
|
|
|
PropertyValue aValue;
|
|
|
|
const Any* pBegin = aArguments.getConstArray();
|
|
|
|
const Any* pEnd = pBegin + aArguments.getLength();
|
2001-02-05 08:35:57 +00:00
|
|
|
|
2001-07-18 07:51:19 +00:00
|
|
|
for(;pBegin != pEnd;++pBegin)
|
|
|
|
{
|
|
|
|
if (!(*pBegin >>= aValue))
|
|
|
|
continue;
|
2001-02-05 08:35:57 +00:00
|
|
|
|
2001-07-18 07:51:19 +00:00
|
|
|
if (0 == aValue.Name.compareToAscii(PROPERTY_ACTIVECONNECTION))
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
2001-08-14 11:08:52 +00:00
|
|
|
Reference< XConnection > xConn;
|
|
|
|
aValue.Value >>= xConn;
|
|
|
|
if ( xConn.is() )
|
|
|
|
initializeConnection( xConn );
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
2001-07-18 07:51:19 +00:00
|
|
|
else if(0 == aValue.Name.compareToAscii(PROPERTY_CURRENTQUERY))
|
|
|
|
{
|
|
|
|
aValue.Value >>= m_sName;
|
2001-04-24 13:28:56 +00:00
|
|
|
}
|
2001-07-18 07:51:19 +00:00
|
|
|
else if(0 == aValue.Name.compareToAscii(PROPERTY_QUERYDESIGNVIEW))
|
|
|
|
{
|
|
|
|
m_bDesign = ::cppu::any2bool(aValue.Value);
|
|
|
|
}
|
|
|
|
else if(0 == aValue.Name.compareToAscii(PROPERTY_CREATEVIEW))
|
|
|
|
{
|
|
|
|
m_bCreateView = ::cppu::any2bool(aValue.Value);
|
|
|
|
}
|
2004-03-19 11:12:55 +00:00
|
|
|
else if ( 0 == aValue.Name.compareToAscii( PARAM_INDEPENDENT_SQL_COMMAND ) )
|
|
|
|
{
|
|
|
|
m_bIndependent = sal_True;
|
|
|
|
m_bEsacpeProcessing = sal_True;
|
|
|
|
|
|
|
|
::rtl::OUString sNewStatement;
|
|
|
|
aValue.Value >>= sNewStatement;
|
|
|
|
setStatement_fireEvent( sNewStatement );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( m_bIndependent )
|
|
|
|
{
|
|
|
|
OSL_ENSURE( m_sName.getLength() == 0, "OQueryController::initialize: both a query name and an independent SQL command?" );
|
|
|
|
OSL_ENSURE( !m_bCreateView, "OQueryController::initialize: create a view, *and* an independent SQL command?" );
|
|
|
|
m_sName = ::rtl::OUString();
|
|
|
|
m_bCreateView = sal_False;
|
2001-07-18 07:51:19 +00:00
|
|
|
}
|
2001-02-23 14:04:37 +00:00
|
|
|
|
2001-08-14 11:08:52 +00:00
|
|
|
if ( !ensureConnected( sal_False ) )
|
2001-07-18 07:51:19 +00:00
|
|
|
{ // we have no connection so what else should we do
|
|
|
|
m_bDesign = sal_False;
|
|
|
|
if(m_bCreateView)
|
2001-03-14 09:35:11 +00:00
|
|
|
{
|
2001-10-08 06:32:36 +00:00
|
|
|
{
|
|
|
|
String aMessage(ModuleRes(RID_STR_CONNECTION_LOST));
|
|
|
|
ODataView* pWindow = getView();
|
|
|
|
InfoBox(pWindow, aMessage).Execute();
|
|
|
|
}
|
2001-07-18 07:51:19 +00:00
|
|
|
throw SQLException();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// we need a datasource
|
2001-08-14 11:08:52 +00:00
|
|
|
if(isConnected())
|
2001-07-18 07:51:19 +00:00
|
|
|
{
|
|
|
|
// now we have to check if our database supports views
|
|
|
|
if(m_bCreateView)
|
|
|
|
{
|
2001-09-27 08:48:57 +00:00
|
|
|
// we only supply views when the connection is a XViewsSupplier
|
|
|
|
Reference<XViewsSupplier> xViewsSup(getConnection(),UNO_QUERY);
|
|
|
|
if(!xViewsSup.is())
|
2001-07-18 07:51:19 +00:00
|
|
|
{ // we can't create views so we ask if the user wants to create a query instead
|
|
|
|
m_bCreateView = sal_False;
|
|
|
|
sal_Bool bClose = sal_False;
|
|
|
|
{
|
|
|
|
String aTitle(ModuleRes(STR_QUERYDESIGN_NO_VIEW_SUPPORT));
|
|
|
|
String aMessage(ModuleRes(STR_QUERYDESIGN_NO_VIEW_ASK));
|
|
|
|
ODataView* pWindow = getView();
|
|
|
|
OSQLMessageBox aDlg(pWindow,aTitle, aMessage,WB_YES_NO|WB_DEF_YES,OSQLMessageBox::Query);
|
|
|
|
bClose = aDlg.Execute() == RET_NO;
|
2001-04-24 13:28:56 +00:00
|
|
|
}
|
2001-07-18 07:51:19 +00:00
|
|
|
if(bClose)
|
|
|
|
throw Exception();
|
2001-04-24 13:28:56 +00:00
|
|
|
}
|
2001-03-14 09:35:11 +00:00
|
|
|
}
|
2001-07-18 07:51:19 +00:00
|
|
|
}
|
2001-08-14 11:08:52 +00:00
|
|
|
|
|
|
|
OSL_ENSURE(getDataSource().is(),"OQueryController::initialize: need a datasource!");
|
|
|
|
|
2001-04-24 13:28:56 +00:00
|
|
|
try
|
|
|
|
{
|
2001-08-14 11:08:52 +00:00
|
|
|
if(!m_xFormatter.is() && haveDataSource())
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
2001-03-14 09:35:11 +00:00
|
|
|
Reference< XNumberFormatsSupplier> xSupplier;
|
2001-08-14 11:08:52 +00:00
|
|
|
::cppu::extractInterface(xSupplier, getDataSource()->getPropertyValue(PROPERTY_NUMBERFORMATSSUPPLIER));
|
2001-03-14 09:35:11 +00:00
|
|
|
if(xSupplier.is())
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
2001-03-14 09:35:11 +00:00
|
|
|
m_xFormatter = Reference< ::com::sun::star::util::XNumberFormatter >(getORB()
|
|
|
|
->createInstance(::rtl::OUString::createFromAscii("com.sun.star.util.NumberFormatter")), UNO_QUERY);
|
|
|
|
m_xFormatter->attachNumberFormatsSupplier(xSupplier);
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
2001-03-14 09:35:11 +00:00
|
|
|
OSL_ENSURE(m_xFormatter.is(),"No NumberFormatter!");
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
2001-08-23 13:39:09 +00:00
|
|
|
getContainer()->initialize();
|
2002-05-06 09:02:23 +00:00
|
|
|
resetImpl();
|
2004-09-09 08:49:48 +00:00
|
|
|
switchDesignModeImpl(this,getContainer(),m_bDesign);
|
2001-02-06 08:31:46 +00:00
|
|
|
getUndoMgr()->Clear();
|
2001-10-23 11:30:27 +00:00
|
|
|
|
2004-03-19 11:12:55 +00:00
|
|
|
if ( ( m_bDesign )
|
|
|
|
&& ( ( !m_sName.getLength() && !m_bIndependent )
|
|
|
|
|| ( !m_sStatement.getLength() && m_bIndependent )
|
|
|
|
)
|
|
|
|
)
|
|
|
|
{
|
|
|
|
Application::PostUserEvent( LINK( this, OQueryController, OnExecuteAddTable ) );
|
|
|
|
}
|
|
|
|
|
2001-02-06 08:31:46 +00:00
|
|
|
setModified(sal_False);
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
2001-10-08 06:32:36 +00:00
|
|
|
catch(SQLException& e)
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
2001-04-03 13:16:03 +00:00
|
|
|
OSL_ENSURE(sal_False, "OQueryController::initialize: caught an exception!");
|
2001-10-08 06:32:36 +00:00
|
|
|
// we caught an exception so we switch to text only mode
|
|
|
|
{
|
|
|
|
m_bDesign = sal_False;
|
|
|
|
getContainer()->initialize();
|
|
|
|
ODataView* pWindow = getView();
|
|
|
|
OSQLMessageBox(pWindow,e).Execute();
|
|
|
|
}
|
|
|
|
throw;
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
2004-03-19 11:12:55 +00:00
|
|
|
void OQueryController::updateTitle()
|
2002-10-31 13:59:53 +00:00
|
|
|
{
|
2004-08-02 15:16:32 +00:00
|
|
|
::rtl::OUString sName = m_sName;
|
|
|
|
if ( !sName.getLength() )
|
2002-10-31 13:59:53 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
if ( !m_bIndependent )
|
2002-10-31 13:59:53 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
if ( !sName.getLength() )
|
|
|
|
{
|
|
|
|
String aDefaultName = String( ModuleRes( m_bCreateView ? STR_VIEW_TITLE : STR_QRY_TITLE ) );
|
|
|
|
aDefaultName = aDefaultName.GetToken( 0, ' ' );
|
|
|
|
sName = ::dbtools::createUniqueName( getElements(),aDefaultName );
|
|
|
|
}
|
|
|
|
String sTitlePrefix = String( ModuleRes( m_bCreateView ? STR_VIEWDESIGN : STR_QUERYDESIGN ) );
|
2004-08-02 15:16:32 +00:00
|
|
|
sName += sTitlePrefix;
|
2002-10-31 13:59:53 +00:00
|
|
|
}
|
2004-03-19 11:12:55 +00:00
|
|
|
|
2002-10-31 13:59:53 +00:00
|
|
|
}
|
2004-08-02 15:16:32 +00:00
|
|
|
OGenericUnoController::setTitle(sName);
|
2002-10-31 13:59:53 +00:00
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
2001-02-05 08:35:57 +00:00
|
|
|
void OQueryController::setQueryComposer()
|
|
|
|
{
|
2001-08-14 11:08:52 +00:00
|
|
|
if(isConnected())
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
2001-08-14 11:08:52 +00:00
|
|
|
Reference< XSQLQueryComposerFactory > xFactory(getConnection(), UNO_QUERY);
|
2001-02-05 08:35:57 +00:00
|
|
|
OSL_ENSURE(xFactory.is(),"Connection doesn't support a querycomposer");
|
|
|
|
if (xFactory.is())
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
m_xComposer = xFactory->createQueryComposer();
|
2001-08-23 13:39:09 +00:00
|
|
|
getContainer()->setStatement(m_sStatement);
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
catch (Exception&)
|
|
|
|
{
|
|
|
|
m_xComposer = NULL;
|
|
|
|
}
|
|
|
|
OSL_ENSURE(m_xComposer.is(),"No querycomposer available!");
|
2001-08-14 11:08:52 +00:00
|
|
|
Reference<XTablesSupplier> xTablesSup(getConnection(), UNO_QUERY);
|
2001-04-06 12:47:18 +00:00
|
|
|
deleteIterator();
|
2001-08-14 11:08:52 +00:00
|
|
|
m_pSqlIterator = new ::connectivity::OSQLParseTreeIterator(xTablesSup->getTables(),getMetaData(),NULL,m_pSqlParser);
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
2001-08-23 13:39:09 +00:00
|
|
|
sal_Bool OQueryController::Construct(Window* pParent)
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
2001-08-23 13:39:09 +00:00
|
|
|
// TODO: we have to check if we should create the text- or the design- view
|
|
|
|
|
|
|
|
m_pView = new OQueryContainerWindow(pParent,this,m_xMultiServiceFacatory);
|
|
|
|
|
|
|
|
return OSingleDocumentController::Construct(pParent);
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
2001-08-23 13:39:09 +00:00
|
|
|
|
2001-02-05 08:35:57 +00:00
|
|
|
// -----------------------------------------------------------------------------
|
2001-08-23 13:39:09 +00:00
|
|
|
OJoinDesignView* OQueryController::getJoinView()
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
2001-08-23 13:39:09 +00:00
|
|
|
return getContainer()->getDesignView();
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void OQueryController::AddSupportedFeatures()
|
|
|
|
{
|
2001-04-24 13:28:56 +00:00
|
|
|
OJoinController::AddSupportedFeatures();
|
2002-04-22 07:53:02 +00:00
|
|
|
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:SaveAs")] = SID_SAVEASDOC;
|
2004-09-09 08:49:48 +00:00
|
|
|
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:SbaNativeSql")] = ID_BROWSER_ESACPEPROCESSING;
|
|
|
|
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:DBViewFunctions")] = SID_QUERY_VIEW_FUNCTIONS;
|
|
|
|
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:DBViewTableNames")] = SID_QUERY_VIEW_TABLES;
|
|
|
|
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:DBViewAliases")] = SID_QUERY_VIEW_ALIASES;
|
|
|
|
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:DBDistinctValues")] = SID_QUERY_DISTINCT_VALUES;
|
|
|
|
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:DBChangeDesignMode")] = ID_BROWSER_SQL;
|
|
|
|
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:DBClearQuery")] = SID_BROWSER_CLEAR_QUERY;
|
|
|
|
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:SbaExecuteSql")] = ID_BROWSER_QUERY_EXECUTE;
|
|
|
|
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:DBAddRelation")] = SID_RELATION_ADD_RELATION;
|
|
|
|
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:DBQueryPreview")] = SID_DB_QUERY_PREVIEW;
|
2003-04-15 15:04:18 +00:00
|
|
|
#if OSL_DEBUG_LEVEL > 1
|
2004-09-09 08:49:48 +00:00
|
|
|
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:DBShowParseTree")] = ID_EDIT_QUERY_SQL;
|
|
|
|
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:DBMakeDisjunct")] = ID_EDIT_QUERY_DESIGN;
|
2002-10-04 11:32:24 +00:00
|
|
|
#endif
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void OQueryController::setModified(sal_Bool _bModified)
|
|
|
|
{
|
2001-02-28 09:18:26 +00:00
|
|
|
OJoinController::setModified(_bModified);
|
2004-09-09 08:49:48 +00:00
|
|
|
InvalidateFeature(SID_BROWSER_CLEAR_QUERY);
|
2001-02-05 08:35:57 +00:00
|
|
|
InvalidateFeature(ID_BROWSER_SAVEASDOC);
|
|
|
|
InvalidateFeature(ID_BROWSER_QUERY_EXECUTE);
|
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void SAL_CALL OQueryController::disposing( const EventObject& Source ) throw(RuntimeException)
|
|
|
|
{
|
2002-10-08 06:26:17 +00:00
|
|
|
::vos::OGuard aGuard(Application::GetSolarMutex());
|
|
|
|
|
2001-06-08 07:42:26 +00:00
|
|
|
Reference< XFrame > xSource(Source.Source, UNO_QUERY);
|
2001-08-23 13:39:09 +00:00
|
|
|
if (xSource.is() && getContainer())
|
2001-06-08 07:42:26 +00:00
|
|
|
{
|
|
|
|
if (xSource.get() == m_xCurrentFrame.get())
|
|
|
|
{ // our frame is beeing disposed -> close the preview window (if we have one)
|
2001-10-26 13:24:46 +00:00
|
|
|
Reference<XFrame> xXFrame( getContainer()->getPreviewFrame());
|
|
|
|
::comphelper::disposeComponent( xXFrame );
|
2001-06-08 07:42:26 +00:00
|
|
|
}
|
2001-08-23 13:39:09 +00:00
|
|
|
else if (xSource.get() == getContainer()->getPreviewFrame().get())
|
2001-06-08 07:42:26 +00:00
|
|
|
{
|
2001-08-23 13:39:09 +00:00
|
|
|
getContainer()->disposingPreview();
|
2001-06-08 07:42:26 +00:00
|
|
|
}
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
2001-06-08 07:42:26 +00:00
|
|
|
|
|
|
|
OJoinController::disposing(Source);
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
2001-08-14 11:08:52 +00:00
|
|
|
void OQueryController::reconnect(sal_Bool _bUI)
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
2001-04-06 12:47:18 +00:00
|
|
|
deleteIterator();
|
2001-02-05 08:35:57 +00:00
|
|
|
::comphelper::disposeComponent(m_xComposer);
|
2001-03-14 09:35:11 +00:00
|
|
|
|
2001-08-14 11:08:52 +00:00
|
|
|
OJoinController::reconnect( _bUI );
|
|
|
|
|
|
|
|
if (isConnected())
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
2001-02-28 09:18:26 +00:00
|
|
|
// we hide the add table dialog because the tables in it are from the old connection
|
|
|
|
if(m_pAddTabDlg)
|
|
|
|
m_pAddTabDlg->Hide();
|
|
|
|
InvalidateFeature(ID_BROWSER_ADDTABLE);
|
|
|
|
setQueryComposer();
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
2001-03-14 09:35:11 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if(m_bDesign)
|
|
|
|
{
|
|
|
|
m_bDesign = sal_False;
|
|
|
|
// don't call Execute(SQL) because this changes the sql statement
|
2004-09-09 08:49:48 +00:00
|
|
|
switchDesignModeImpl(this,getContainer(),m_bDesign);
|
2001-03-14 09:35:11 +00:00
|
|
|
}
|
|
|
|
InvalidateAll();
|
|
|
|
}
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
2004-08-02 15:16:32 +00:00
|
|
|
void OQueryController::saveViewSettings(Sequence<PropertyValue>& _rViewProps)
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
2001-10-05 05:49:21 +00:00
|
|
|
OTableFields::const_iterator aFieldIter = m_vTableFieldDesc.begin();
|
2001-10-23 11:30:27 +00:00
|
|
|
sal_Int32 nCount = 0;
|
|
|
|
for(;aFieldIter != m_vTableFieldDesc.end();++aFieldIter)
|
|
|
|
{
|
|
|
|
if(!(*aFieldIter)->IsEmpty())
|
|
|
|
++nCount;
|
|
|
|
}
|
2004-08-02 15:16:32 +00:00
|
|
|
|
|
|
|
sal_Int32 nLen = _rViewProps.getLength();
|
|
|
|
|
|
|
|
_rViewProps.realloc( nLen + 2 + (nCount != 0 ? 1 : 0) );
|
|
|
|
PropertyValue *pIter = _rViewProps.getArray() + nLen;
|
|
|
|
|
|
|
|
if ( nCount != 0 )
|
2001-05-02 12:57:57 +00:00
|
|
|
{
|
2004-08-02 15:16:32 +00:00
|
|
|
pIter->Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Fields"));
|
|
|
|
|
|
|
|
Sequence<PropertyValue> aFields(nCount);
|
|
|
|
PropertyValue *pFieldsIter = aFields.getArray();
|
|
|
|
// the fielddata
|
|
|
|
aFieldIter = m_vTableFieldDesc.begin();
|
|
|
|
for(sal_Int32 i = 1;aFieldIter != m_vTableFieldDesc.end();++aFieldIter,++i)
|
|
|
|
{
|
|
|
|
if ( !(*aFieldIter)->IsEmpty() )
|
|
|
|
{
|
|
|
|
pFieldsIter->Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Field")) + ::rtl::OUString::valueOf(i);
|
|
|
|
(*aFieldIter)->Save(*pFieldsIter++);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pIter->Value <<= aFields;
|
|
|
|
++pIter;
|
2001-05-02 12:57:57 +00:00
|
|
|
}
|
2004-08-02 15:16:32 +00:00
|
|
|
|
|
|
|
pIter->Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SplitterPosition"));
|
|
|
|
pIter->Value <<= m_nSplitPos;
|
|
|
|
++pIter;
|
|
|
|
pIter->Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VisibleRows"));
|
|
|
|
pIter->Value <<= m_nVisibleRows;
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
2004-08-02 15:16:32 +00:00
|
|
|
void OQueryController::loadViewSettings(const Sequence<PropertyValue>& _rViewProps)
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
2004-08-02 15:16:32 +00:00
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
// Liste loeschen
|
|
|
|
OTableFields().swap(m_vTableFieldDesc);
|
|
|
|
|
|
|
|
const PropertyValue *pIter = _rViewProps.getConstArray();
|
|
|
|
const PropertyValue *pEnd = pIter + _rViewProps.getLength();
|
|
|
|
for (; pIter != pEnd; ++pIter)
|
2001-02-05 08:35:57 +00:00
|
|
|
{
|
2004-08-02 15:16:32 +00:00
|
|
|
if ( pIter->Name == ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SplitterPosition")) )
|
|
|
|
{
|
|
|
|
pIter->Value >>= m_nSplitPos;
|
|
|
|
}
|
|
|
|
else if ( pIter->Name == ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VisibleRows")) )
|
2001-02-07 11:44:13 +00:00
|
|
|
{
|
2004-08-02 15:16:32 +00:00
|
|
|
pIter->Value >>= m_nVisibleRows;
|
|
|
|
}
|
|
|
|
else if ( pIter->Name == ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Fields")) )
|
|
|
|
{
|
|
|
|
Sequence<PropertyValue> aFields;
|
|
|
|
pIter->Value >>= aFields;
|
|
|
|
m_vTableFieldDesc.reserve(aFields.getLength() + 1);
|
|
|
|
const PropertyValue *pFieldIter = aFields.getConstArray();
|
|
|
|
const PropertyValue *pFieldEnd = pFieldIter + aFields.getLength();
|
|
|
|
for (; pFieldIter != pFieldEnd; ++pFieldIter)
|
2001-10-23 11:30:27 +00:00
|
|
|
{
|
|
|
|
OTableFieldDescRef pData = new OTableFieldDesc();
|
2004-08-02 15:16:32 +00:00
|
|
|
pData->Load(*pFieldIter);
|
2001-10-23 11:30:27 +00:00
|
|
|
m_vTableFieldDesc.push_back(pData);
|
|
|
|
}
|
2001-02-07 11:44:13 +00:00
|
|
|
}
|
|
|
|
}
|
2001-02-05 08:35:57 +00:00
|
|
|
}
|
2001-03-01 12:29:19 +00:00
|
|
|
|
2001-02-05 15:17:40 +00:00
|
|
|
// -----------------------------------------------------------------------------
|
2001-03-01 12:29:19 +00:00
|
|
|
OTableWindowData* OQueryController::createTableWindowData()
|
|
|
|
{
|
|
|
|
return new OQueryTableWindowData();
|
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
2001-04-24 13:28:56 +00:00
|
|
|
Reference<XNameAccess> OQueryController::getElements() const
|
2001-03-14 09:35:11 +00:00
|
|
|
{
|
2001-04-24 13:28:56 +00:00
|
|
|
Reference<XNameAccess> xElements;
|
|
|
|
if(m_bCreateView)
|
|
|
|
{
|
2001-08-14 11:08:52 +00:00
|
|
|
Reference<XViewsSupplier> xConSup(getConnection(),UNO_QUERY);
|
2001-04-24 13:28:56 +00:00
|
|
|
if(xConSup.is())
|
|
|
|
xElements = xConSup->getViews();
|
|
|
|
}
|
2001-03-14 09:35:11 +00:00
|
|
|
else
|
|
|
|
{
|
2001-08-14 11:08:52 +00:00
|
|
|
Reference<XQueriesSupplier> xConSup(getConnection(),UNO_QUERY);
|
2001-04-24 13:28:56 +00:00
|
|
|
if(xConSup.is())
|
|
|
|
xElements = xConSup->getQueries();
|
|
|
|
else
|
|
|
|
{
|
2001-08-14 11:08:52 +00:00
|
|
|
Reference<XQueryDefinitionsSupplier> xSup(getDataSource(),UNO_QUERY);
|
2001-04-24 13:28:56 +00:00
|
|
|
if(xSup.is())
|
|
|
|
xElements = xSup->getQueryDefinitions();
|
|
|
|
}
|
2001-03-14 09:35:11 +00:00
|
|
|
}
|
2001-04-24 13:28:56 +00:00
|
|
|
return xElements;
|
2001-03-14 09:35:11 +00:00
|
|
|
}
|
2002-04-02 05:40:36 +00:00
|
|
|
|
|
|
|
//typedef ::cppu::ImplHelper1< XLoadEventListener > OQueryControllerLoadListener_BASE;
|
|
|
|
//class OQueryControllerLoadListener : public OQueryControllerLoadListener_BASE
|
|
|
|
//{
|
|
|
|
// OQueryController* m_pController;
|
|
|
|
//public:
|
|
|
|
// OQueryControllerLoadListener(OQueryController* _pController) : m_pController(_pController)
|
|
|
|
// {
|
|
|
|
// OSL_ENSURE(m_pController,"Controller can not be NULL!");
|
|
|
|
// }
|
|
|
|
// // -----------------------------------------------------------------------------
|
|
|
|
// virtual void SAL_CALL disposing( const EventObject& Source ) throw (RuntimeException)
|
|
|
|
// {
|
|
|
|
// }
|
|
|
|
// // -----------------------------------------------------------------------------
|
|
|
|
// // XLoadEventListener
|
|
|
|
// virtual void SAL_CALL loadFinished( const Reference< XFrameLoader >& aLoader ) throw (RuntimeException)
|
|
|
|
// {
|
|
|
|
// }
|
|
|
|
// // -----------------------------------------------------------------------------
|
|
|
|
// virtual void SAL_CALL loadCancelled( const Reference< XFrameLoader >& aLoader ) throw (RuntimeException)
|
|
|
|
// {
|
|
|
|
// m_pController->Execute(ID_BROWSER_CLOSE);
|
|
|
|
// }
|
|
|
|
//};
|
2001-03-14 09:35:11 +00:00
|
|
|
// -----------------------------------------------------------------------------
|
2001-04-02 09:18:50 +00:00
|
|
|
void OQueryController::executeQuery()
|
|
|
|
{
|
|
|
|
// we don't need to check the connection here because we already check the composer
|
|
|
|
// which can't live without his connection
|
2004-03-19 11:12:55 +00:00
|
|
|
::rtl::OUString sTranslatedStmt = translateStatement( false );
|
2001-08-13 07:34:13 +00:00
|
|
|
|
2004-08-02 15:16:32 +00:00
|
|
|
::rtl::OUString sDataSourceName = getDataSourceName();
|
|
|
|
if ( sDataSourceName.getLength() && sTranslatedStmt.getLength() )
|
2001-04-02 09:18:50 +00:00
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2001-08-23 13:39:09 +00:00
|
|
|
getContainer()->showPreview(m_xCurrentFrame);
|
2004-09-09 08:49:48 +00:00
|
|
|
InvalidateFeature(SID_DB_QUERY_PREVIEW);
|
2001-06-08 07:42:26 +00:00
|
|
|
|
2002-04-02 05:40:36 +00:00
|
|
|
// Reference< XFrame > xBeamer = getContainer()->getPreviewFrame();
|
|
|
|
// Reference< XLoadEventListener> xLoadEvtL = new OQueryControllerLoadListener(this);
|
|
|
|
// xBeamer->addFrameActionListener( xLoadEvtL );
|
|
|
|
|
2001-04-02 09:18:50 +00:00
|
|
|
URL aWantToDispatch;
|
|
|
|
aWantToDispatch.Complete = ::rtl::OUString::createFromAscii(".component:DB/DataSourceBrowser");
|
|
|
|
|
2001-06-08 07:42:26 +00:00
|
|
|
::rtl::OUString sFrameName = FRAME_NAME_QUERY_PREVIEW;
|
2002-04-02 05:40:36 +00:00
|
|
|
// | FrameSearchFlag::CREATE
|
2001-04-02 09:18:50 +00:00
|
|
|
sal_Int32 nSearchFlags = FrameSearchFlag::CHILDREN;
|
|
|
|
|
2002-04-02 05:40:36 +00:00
|
|
|
Reference< XDispatch> xDisp;
|
|
|
|
Reference< XDispatchProvider> xProv(m_xCurrentFrame->findFrame(sFrameName,nSearchFlags),UNO_QUERY);
|
2001-04-02 09:18:50 +00:00
|
|
|
if(!xProv.is())
|
|
|
|
{
|
2004-08-02 15:16:32 +00:00
|
|
|
xProv.set(m_xCurrentFrame,UNO_QUERY);
|
2001-04-02 09:18:50 +00:00
|
|
|
if (xProv.is())
|
|
|
|
xDisp = xProv->queryDispatch(aWantToDispatch, sFrameName, nSearchFlags);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
xDisp = xProv->queryDispatch(aWantToDispatch, sFrameName, FrameSearchFlag::SELF);
|
|
|
|
}
|
|
|
|
if (xDisp.is())
|
|
|
|
{
|
|
|
|
Sequence< PropertyValue> aProps(10);
|
|
|
|
aProps[0].Name = PROPERTY_DATASOURCENAME;
|
2004-08-02 15:16:32 +00:00
|
|
|
aProps[0].Value <<= sDataSourceName;
|
2001-04-02 09:18:50 +00:00
|
|
|
|
|
|
|
aProps[1].Name = PROPERTY_COMMANDTYPE;
|
|
|
|
aProps[1].Value <<= CommandType::COMMAND;
|
|
|
|
|
|
|
|
aProps[2].Name = PROPERTY_COMMAND;
|
|
|
|
aProps[2].Value <<= sTranslatedStmt;
|
|
|
|
|
|
|
|
aProps[3].Name = PROPERTY_SHOWTREEVIEW;
|
|
|
|
aProps[3].Value = ::cppu::bool2any(sal_False);
|
|
|
|
|
|
|
|
aProps[4].Name = PROPERTY_SHOWTREEVIEWBUTTON;
|
|
|
|
aProps[4].Value = ::cppu::bool2any(sal_False);
|
|
|
|
|
|
|
|
aProps[5].Name = PROPERTY_ACTIVECONNECTION;
|
2001-08-14 11:08:52 +00:00
|
|
|
aProps[5].Value <<= getConnection();
|
2001-04-02 09:18:50 +00:00
|
|
|
|
|
|
|
aProps[6].Name = PROPERTY_UPDATE_CATALOGNAME;
|
|
|
|
aProps[6].Value <<= m_sUpdateCatalogName;
|
|
|
|
|
|
|
|
aProps[7].Name = PROPERTY_UPDATE_SCHEMANAME;
|
|
|
|
aProps[7].Value <<= m_sUpdateSchemaName;
|
|
|
|
|
|
|
|
aProps[8].Name = PROPERTY_UPDATE_TABLENAME;
|
|
|
|
aProps[8].Value <<= m_sUpdateTableName;
|
|
|
|
|
|
|
|
aProps[9].Name = PROPERTY_USE_ESCAPE_PROCESSING;
|
|
|
|
aProps[9].Value = ::cppu::bool2any(m_bEsacpeProcessing);
|
|
|
|
|
|
|
|
xDisp->dispatch(aWantToDispatch, aProps);
|
|
|
|
// check the state of the beamer
|
|
|
|
// be notified when the beamer frame is closed
|
|
|
|
Reference< XComponent > xComponent(m_xCurrentFrame->findFrame(sFrameName,nSearchFlags), UNO_QUERY);
|
|
|
|
if (xComponent.is())
|
|
|
|
{
|
2001-08-23 13:39:09 +00:00
|
|
|
OSL_ENSURE(Reference< XFrame >(xComponent, UNO_QUERY).get() == getContainer()->getPreviewFrame().get(),
|
2001-06-08 07:42:26 +00:00
|
|
|
"OQueryController::executeQuery: oops ... which window do I have here?");
|
2002-04-02 05:40:36 +00:00
|
|
|
Reference< XEventListener> xEvtL((::cppu::OWeakObject*)this,UNO_QUERY);
|
2001-04-02 09:18:50 +00:00
|
|
|
xComponent->addEventListener(xEvtL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
OSL_ENSURE(0,"Couldn't create a beamer window!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch(const Exception&)
|
|
|
|
{
|
|
|
|
OSL_ENSURE(0,"Couldn't create a beamer window!");
|
|
|
|
}
|
|
|
|
}
|
2001-04-24 13:28:56 +00:00
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
2001-10-01 10:57:41 +00:00
|
|
|
sal_Bool OQueryController::askForNewName(const Reference<XNameAccess>& _xElements,sal_Bool _bSaveAs)
|
2001-04-24 13:28:56 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
OSL_ENSURE( !m_bIndependent, "OQueryController::askForNewName: not to be called when designing an independent statement!" );
|
|
|
|
if ( m_bIndependent )
|
|
|
|
return sal_False;
|
|
|
|
|
2001-10-01 10:57:41 +00:00
|
|
|
sal_Bool bRet = sal_True;
|
2001-04-24 13:28:56 +00:00
|
|
|
sal_Bool bNew = 0 == m_sName.getLength();
|
2001-09-25 12:28:23 +00:00
|
|
|
bNew = bNew || _bSaveAs || (_xElements.is() && !_xElements->hasByName(m_sName));
|
2001-04-24 13:28:56 +00:00
|
|
|
if(bNew)
|
|
|
|
{
|
2001-07-16 06:56:28 +00:00
|
|
|
Reference<XDatabaseMetaData> xMetaData;
|
2001-08-14 11:08:52 +00:00
|
|
|
if(isConnected())
|
|
|
|
xMetaData = getMetaData();
|
2001-04-24 13:28:56 +00:00
|
|
|
String aDefaultName;
|
|
|
|
if(_bSaveAs && !bNew)
|
|
|
|
aDefaultName = String(m_sName);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
String aName = String(ModuleRes(m_bCreateView ? STR_VIEW_TITLE : STR_QRY_TITLE));
|
|
|
|
aName = aName.GetToken(0,' ');
|
2001-08-14 11:08:52 +00:00
|
|
|
if(m_bCreateView && isConnected())
|
2001-07-16 06:56:28 +00:00
|
|
|
aDefaultName = ::dbaui::createDefaultName(xMetaData,_xElements,aName);
|
|
|
|
else
|
|
|
|
aDefaultName = String(::dbtools::createUniqueName(_xElements,aName));
|
2001-04-24 13:28:56 +00:00
|
|
|
}
|
|
|
|
|
2001-07-16 06:56:28 +00:00
|
|
|
|
2001-04-24 13:28:56 +00:00
|
|
|
OSaveAsDlg aDlg(
|
2002-07-09 11:48:40 +00:00
|
|
|
getView(),
|
|
|
|
m_bCreateView ? CommandType::TABLE : CommandType::QUERY,
|
|
|
|
_xElements,
|
|
|
|
xMetaData,
|
|
|
|
getConnection(),
|
|
|
|
aDefaultName,
|
2001-04-24 13:28:56 +00:00
|
|
|
_bSaveAs ? SAD_OVERWRITE : SAD_DEFAULT);
|
|
|
|
|
2001-10-01 10:57:41 +00:00
|
|
|
if(bRet = (aDlg.Execute() == RET_OK))
|
2001-04-24 13:28:56 +00:00
|
|
|
{
|
|
|
|
m_sName = aDlg.getName();
|
|
|
|
if(m_bCreateView)
|
|
|
|
{
|
|
|
|
m_sUpdateCatalogName = aDlg.getCatalog();
|
2001-10-01 10:57:41 +00:00
|
|
|
m_sUpdateSchemaName = aDlg.getSchema();
|
2001-04-24 13:28:56 +00:00
|
|
|
}
|
|
|
|
}
|
2001-10-01 10:57:41 +00:00
|
|
|
else if(!_bSaveAs)
|
2001-09-25 12:28:23 +00:00
|
|
|
m_sName = ::rtl::OUString(); // reset the name because we don't want to save it
|
2001-04-24 13:28:56 +00:00
|
|
|
}
|
2001-10-01 10:57:41 +00:00
|
|
|
return bRet;
|
2001-04-24 13:28:56 +00:00
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void OQueryController::doSaveAsDoc(sal_Bool _bSaveAs)
|
|
|
|
{
|
2004-08-02 15:16:32 +00:00
|
|
|
OSL_ENSURE(isEditable(),"Slot ID_BROWSER_SAVEDOC should not be enabled!");
|
|
|
|
if ( !m_bIndependent && !haveDataSource() )
|
2001-04-24 13:28:56 +00:00
|
|
|
{
|
2001-07-18 07:51:19 +00:00
|
|
|
String aMessage(ModuleRes(STR_DATASOURCE_DELETED));
|
|
|
|
String sTitle(ModuleRes(STR_STAT_WARNING));
|
|
|
|
OSQLMessageBox aMsg(getView(),sTitle,aMessage);
|
|
|
|
aMsg.Execute();
|
2004-03-19 11:12:55 +00:00
|
|
|
return;
|
2001-07-18 07:51:19 +00:00
|
|
|
}
|
2004-03-19 11:12:55 +00:00
|
|
|
|
|
|
|
Reference<XNameAccess> xElements = getElements();
|
|
|
|
if(xElements.is())
|
2001-07-18 07:51:19 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
if(!getContainer()->checkStatement())
|
|
|
|
return;
|
|
|
|
|
|
|
|
::rtl::OUString sTranslatedStmt = translateStatement();
|
|
|
|
if ( m_bIndependent )
|
2001-04-24 13:28:56 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
setModified( sal_False );
|
|
|
|
// this is all we need to do here. translateStatement implicitly set our m_sStatement, and
|
|
|
|
// notified it, and that's all
|
|
|
|
return;
|
|
|
|
}
|
2001-10-02 07:30:19 +00:00
|
|
|
|
2004-03-19 11:12:55 +00:00
|
|
|
if ( sTranslatedStmt.getLength() )
|
|
|
|
{
|
|
|
|
// first we need a name for our query so ask the user
|
|
|
|
// did we get a name
|
|
|
|
if ( !askForNewName(xElements,_bSaveAs) || !m_sName.getLength() )
|
|
|
|
return;
|
2001-04-24 13:28:56 +00:00
|
|
|
|
2004-03-19 11:12:55 +00:00
|
|
|
SQLExceptionInfo aInfo;
|
|
|
|
try
|
2001-04-26 12:34:47 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
sal_Bool bNew = ( 0 == m_sName.getLength() )
|
|
|
|
|| ( _bSaveAs )
|
|
|
|
|| ( !xElements->hasByName( m_sName ) );
|
|
|
|
|
|
|
|
Reference<XPropertySet> xQuery;
|
|
|
|
if ( bNew ) // just to make sure the query already exists
|
2001-04-24 13:28:56 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
// drop the query, in case it already exists
|
|
|
|
if ( xElements->hasByName( m_sName ) )
|
2001-04-24 13:28:56 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
Reference<XDrop> xNameCont(xElements,UNO_QUERY);
|
|
|
|
if(xNameCont.is())
|
|
|
|
xNameCont->dropByName(m_sName);
|
2001-07-18 07:51:19 +00:00
|
|
|
else
|
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
Reference<XNameContainer> xCont(xElements,UNO_QUERY);
|
|
|
|
if(xCont.is())
|
|
|
|
xCont->removeByName(m_sName);
|
2001-07-18 07:51:19 +00:00
|
|
|
}
|
2004-03-19 11:12:55 +00:00
|
|
|
}
|
2001-04-24 13:28:56 +00:00
|
|
|
|
2004-03-19 11:12:55 +00:00
|
|
|
// create a new (empty, uninitialized) query
|
|
|
|
Reference<XDataDescriptorFactory> xFact(xElements,UNO_QUERY);
|
|
|
|
if(xFact.is())
|
|
|
|
{
|
|
|
|
xQuery = xFact->createDataDescriptor();
|
|
|
|
// to set the name is only allowed when the query is new
|
|
|
|
xQuery->setPropertyValue(PROPERTY_NAME,makeAny(m_sName));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Reference<XSingleServiceFactory> xSingleFac(xElements,UNO_QUERY);
|
|
|
|
OSL_ENSURE(xSingleFac.is(),"OQueryController::doSaveAsDoc: No XSingleServiceFactory available!");
|
|
|
|
if ( xSingleFac.is() )
|
|
|
|
xQuery = xQuery.query( xSingleFac->createInstance() );
|
|
|
|
}
|
|
|
|
OSL_ENSURE(xQuery.is(),"OQueryController::doSaveAsDoc: Create query failed!");
|
2001-04-24 13:28:56 +00:00
|
|
|
|
2004-03-19 11:12:55 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
xElements->getByName(m_sName) >>= xQuery;
|
|
|
|
}
|
2001-04-24 13:28:56 +00:00
|
|
|
|
2004-03-19 11:12:55 +00:00
|
|
|
xQuery->setPropertyValue(PROPERTY_COMMAND,makeAny(sTranslatedStmt));
|
2001-04-26 12:34:47 +00:00
|
|
|
|
2004-03-19 11:12:55 +00:00
|
|
|
// some properties are only valid for a query object
|
|
|
|
if(m_bCreateView)
|
|
|
|
{
|
|
|
|
xQuery->setPropertyValue(PROPERTY_CATALOGNAME,makeAny(m_sUpdateCatalogName));
|
|
|
|
xQuery->setPropertyValue(PROPERTY_SCHEMANAME,makeAny(m_sUpdateSchemaName));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
xQuery->setPropertyValue(PROPERTY_UPDATE_TABLENAME,makeAny(m_sUpdateTableName));
|
|
|
|
xQuery->setPropertyValue(PROPERTY_UPDATE_CATALOGNAME,makeAny(m_sUpdateCatalogName));
|
|
|
|
xQuery->setPropertyValue(PROPERTY_UPDATE_SCHEMANAME,makeAny(m_sUpdateSchemaName));
|
|
|
|
xQuery->setPropertyValue(PROPERTY_USE_ESCAPE_PROCESSING,::cppu::bool2any(m_bEsacpeProcessing));
|
|
|
|
|
|
|
|
// now we save the layout information
|
|
|
|
getContainer()->SaveUIConfig();
|
2004-08-02 15:16:32 +00:00
|
|
|
Sequence<PropertyValue> aWindows;
|
|
|
|
saveTableWindows(aWindows);
|
|
|
|
saveViewSettings(aWindows);
|
|
|
|
xQuery->setPropertyValue(PROPERTY_LAYOUTINFORMATION,makeAny(aWindows));
|
2004-03-19 11:12:55 +00:00
|
|
|
}
|
|
|
|
|
2004-08-02 15:16:32 +00:00
|
|
|
if(bNew)
|
2004-03-19 11:12:55 +00:00
|
|
|
{
|
|
|
|
Reference<XAppend> xAppend(xElements,UNO_QUERY);
|
|
|
|
if(xAppend.is())
|
2001-07-18 07:51:19 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
xAppend->appendByDescriptor(xQuery);
|
2001-07-18 07:51:19 +00:00
|
|
|
}
|
2004-03-19 11:12:55 +00:00
|
|
|
else
|
2001-07-18 07:51:19 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
Reference<XNameContainer> xCont(xElements,UNO_QUERY);
|
|
|
|
if(xCont.is())
|
|
|
|
xCont->insertByName(m_sName,makeAny(xQuery));
|
2001-07-18 07:51:19 +00:00
|
|
|
}
|
2004-03-19 11:12:55 +00:00
|
|
|
|
2004-08-02 15:16:32 +00:00
|
|
|
if ( m_bCreateView )
|
2001-07-18 07:51:19 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
Reference<XPropertySet> xProp2;
|
2004-08-02 15:16:32 +00:00
|
|
|
if ( xElements->hasByName(m_sName) )
|
|
|
|
xProp2.set(xElements->getByName(m_sName),UNO_QUERY);
|
|
|
|
if ( !xProp2.is() ) // correct name and try again
|
2004-03-19 11:12:55 +00:00
|
|
|
{
|
2004-08-02 15:16:32 +00:00
|
|
|
sal_Bool bUseCatalogInSelect = ::dbtools::isDataSourcePropertyEnabled(getDataSource(),PROPERTY_USECATALOGINSELECT,sal_True);
|
|
|
|
sal_Bool bUseSchemaInSelect = ::dbtools::isDataSourcePropertyEnabled(getDataSource(),PROPERTY_USESCHEMAINSELECT,sal_True);
|
|
|
|
m_sName = ::dbtools::composeTableName(getMetaData(),xQuery,sal_False,::dbtools::eInDataManipulation,bUseCatalogInSelect,bUseSchemaInSelect);
|
2004-03-19 11:12:55 +00:00
|
|
|
}
|
|
|
|
// now check if our datasource has set a tablefilter and if append the new table name to it
|
|
|
|
::dbaui::appendToFilter(getConnection(),m_sName,getORB(),getView()); // we are not interessted in the return value
|
2001-07-18 07:51:19 +00:00
|
|
|
}
|
2001-04-26 12:34:47 +00:00
|
|
|
}
|
2004-03-19 11:12:55 +00:00
|
|
|
setModified(sal_False);
|
|
|
|
}
|
|
|
|
catch(SQLContext& e)
|
|
|
|
{
|
|
|
|
m_sName = ::rtl::OUString();
|
|
|
|
aInfo = SQLExceptionInfo(e);
|
|
|
|
}
|
|
|
|
catch(SQLWarning& e)
|
|
|
|
{
|
|
|
|
m_sName = ::rtl::OUString();
|
|
|
|
aInfo = SQLExceptionInfo(e);
|
|
|
|
}
|
|
|
|
catch(SQLException& e)
|
|
|
|
{
|
|
|
|
m_sName = ::rtl::OUString();
|
|
|
|
aInfo = SQLExceptionInfo(e);
|
|
|
|
}
|
|
|
|
catch(Exception&)
|
|
|
|
{
|
|
|
|
m_sName = ::rtl::OUString();
|
|
|
|
OSL_ENSURE(0,"OQueryController::doSaveAsDoc: Query could not be inserted!");
|
2001-04-24 13:28:56 +00:00
|
|
|
}
|
2004-03-19 11:12:55 +00:00
|
|
|
showError(aInfo);
|
|
|
|
|
|
|
|
// update the title of our window
|
|
|
|
updateTitle();
|
2001-04-26 12:34:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
2004-03-19 11:12:55 +00:00
|
|
|
::rtl::OUString OQueryController::translateStatement( bool _bFireStatementChange )
|
2001-04-26 12:34:47 +00:00
|
|
|
{
|
|
|
|
// now set the properties
|
2004-03-19 11:12:55 +00:00
|
|
|
setStatement_fireEvent( getContainer()->getStatement(), _bFireStatementChange );
|
2001-04-26 12:34:47 +00:00
|
|
|
::rtl::OUString sTranslatedStmt;
|
|
|
|
if(m_sStatement.getLength() && m_xComposer.is() && m_bEsacpeProcessing)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
::rtl::OUString aErrorMsg;
|
2002-02-06 06:57:18 +00:00
|
|
|
|
2002-02-04 12:46:56 +00:00
|
|
|
::connectivity::OSQLParseNode* pNode = m_pSqlParser->parseTree( aErrorMsg, m_sStatement, m_bDesign );
|
2001-04-26 12:34:47 +00:00
|
|
|
if(pNode)
|
2001-04-24 13:28:56 +00:00
|
|
|
{
|
2001-04-26 12:34:47 +00:00
|
|
|
pNode->parseNodeToStr( sTranslatedStmt,
|
2001-08-14 11:08:52 +00:00
|
|
|
getMetaData());
|
2001-04-26 12:34:47 +00:00
|
|
|
delete pNode;
|
2001-04-24 13:28:56 +00:00
|
|
|
}
|
2001-04-26 12:34:47 +00:00
|
|
|
m_xComposer->setQuery(sTranslatedStmt);
|
|
|
|
sTranslatedStmt = m_xComposer->getComposedQuery();
|
|
|
|
}
|
|
|
|
catch(SQLException& e)
|
|
|
|
{
|
|
|
|
::dbtools::SQLExceptionInfo aInfo(e);
|
2001-04-24 13:28:56 +00:00
|
|
|
showError(aInfo);
|
2002-04-02 05:40:36 +00:00
|
|
|
// an error occured so we clear the statement
|
|
|
|
sTranslatedStmt = ::rtl::OUString();
|
2001-04-24 13:28:56 +00:00
|
|
|
}
|
2001-04-02 09:18:50 +00:00
|
|
|
}
|
2001-04-26 12:34:47 +00:00
|
|
|
else if(!m_sStatement.getLength())
|
|
|
|
{
|
2002-05-15 09:15:12 +00:00
|
|
|
ModuleRes aModuleRes(STR_QRY_NOSELECT);
|
|
|
|
String sTmpStr(aModuleRes);
|
|
|
|
::rtl::OUString sError(sTmpStr);
|
2002-05-06 09:02:23 +00:00
|
|
|
showError(SQLException(sError,NULL,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("S1000") ),1000,Any()));
|
2001-04-26 12:34:47 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
sTranslatedStmt = m_sStatement;
|
|
|
|
|
|
|
|
return sTranslatedStmt;
|
2001-04-02 09:18:50 +00:00
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
2001-10-23 11:30:27 +00:00
|
|
|
short OQueryController::saveModified()
|
|
|
|
{
|
2004-08-02 15:16:32 +00:00
|
|
|
vos::OGuard aSolarGuard( Application::GetSolarMutex() );
|
|
|
|
::osl::MutexGuard aGuard(m_aMutex);
|
2001-10-23 11:30:27 +00:00
|
|
|
short nRet = RET_YES;
|
2004-03-19 11:12:55 +00:00
|
|
|
if ( !isConnected() || !isModified() )
|
|
|
|
return nRet;
|
|
|
|
|
|
|
|
if ( !m_bDesign
|
|
|
|
|| ( !m_vTableFieldDesc.empty()
|
|
|
|
&& !m_vTableData.empty()
|
|
|
|
)
|
|
|
|
)
|
2001-10-23 11:30:27 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
String sMessageText( ModuleRes( STR_QUERY_SAVEMODIFIED ) );
|
|
|
|
String sObjectType;
|
|
|
|
{
|
|
|
|
::svt::OLocalResourceAccess aLocalRes( ModuleRes( RSC_QUERY_OBJECT_TYPE ), RSC_RESOURCE );
|
|
|
|
sObjectType = String( ResId( m_bIndependent ? 3 : m_bCreateView ? 2 : 1 ) );
|
|
|
|
}
|
|
|
|
sMessageText.SearchAndReplace( String::CreateFromAscii( "$object$" ), sObjectType );
|
|
|
|
|
|
|
|
QueryBox aQry( getView(), WB_YES_NO_CANCEL | WB_DEF_YES, sMessageText );
|
|
|
|
|
2001-10-23 11:30:27 +00:00
|
|
|
nRet = aQry.Execute();
|
|
|
|
if(nRet == RET_YES)
|
|
|
|
{
|
|
|
|
doSaveAsDoc(sal_False);
|
2004-03-19 11:12:55 +00:00
|
|
|
nRet = ( ( ( m_bIndependent )
|
|
|
|
|| ( m_sName.getLength() != 0 )
|
|
|
|
)
|
|
|
|
&& ( !isModified() )
|
|
|
|
)
|
|
|
|
? RET_YES : RET_CANCEL;
|
2001-10-23 11:30:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return nRet;
|
|
|
|
}
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void OQueryController::resetImpl()
|
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
bool bValid = false;
|
2004-08-02 15:16:32 +00:00
|
|
|
Sequence< PropertyValue > aLayoutInformation;
|
2004-03-19 11:12:55 +00:00
|
|
|
|
2001-10-23 11:30:27 +00:00
|
|
|
// get command from the query if a query name was supplied
|
2004-03-19 11:12:55 +00:00
|
|
|
if ( !m_bIndependent )
|
2001-10-23 11:30:27 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
if ( m_sName.getLength() )
|
2001-10-23 11:30:27 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
OSL_ENSURE( !m_bCreateView, "OQueryController::resetImpl can not support a name for a view!" );
|
|
|
|
Reference< XNameAccess > xQueries = getElements();
|
|
|
|
if ( xQueries.is() )
|
2001-10-23 11:30:27 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
Reference< XPropertySet > xProp;
|
|
|
|
if( xQueries->hasByName( m_sName ) && ( xQueries->getByName( m_sName ) >>= xProp ) && xProp.is() )
|
2001-10-23 11:30:27 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
::rtl::OUString sNewStatement;
|
|
|
|
xProp->getPropertyValue( PROPERTY_COMMAND ) >>= sNewStatement;
|
|
|
|
setStatement_fireEvent( sNewStatement );
|
|
|
|
xProp->getPropertyValue( PROPERTY_USE_ESCAPE_PROCESSING ) >>= m_bEsacpeProcessing;
|
|
|
|
m_bDesign = m_bDesign && m_bEsacpeProcessing;
|
|
|
|
bValid = true;
|
|
|
|
|
|
|
|
try
|
2001-10-23 11:30:27 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
xProp->getPropertyValue( PROPERTY_LAYOUTINFORMATION ) >>= aLayoutInformation;
|
|
|
|
}
|
|
|
|
catch( const Exception& )
|
|
|
|
{
|
|
|
|
OSL_ENSURE( sal_False, "OQueryController::resetImpl: could not retrieve the layout information from the query!" );
|
2001-10-23 11:30:27 +00:00
|
|
|
}
|
|
|
|
}
|
2004-03-19 11:12:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
bValid = true;
|
|
|
|
// assume that we got all necessary information during initialization
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( bValid )
|
|
|
|
{
|
|
|
|
// load the layoutInformation
|
|
|
|
if ( aLayoutInformation.getLength() )
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2004-08-02 15:16:32 +00:00
|
|
|
// load the layoutInformation
|
|
|
|
|
|
|
|
loadTableWindows(aLayoutInformation);
|
|
|
|
loadViewSettings(aLayoutInformation);
|
2004-03-19 11:12:55 +00:00
|
|
|
}
|
|
|
|
catch(Exception&)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( m_sStatement.getLength() )
|
|
|
|
{
|
|
|
|
setQueryComposer();
|
|
|
|
if ( m_bEsacpeProcessing )
|
|
|
|
{
|
|
|
|
::rtl::OUString aErrorMsg;
|
|
|
|
::connectivity::OSQLParseNode* pNode = m_pSqlParser->parseTree(aErrorMsg,m_sStatement,m_bDesign);
|
|
|
|
// m_pParseNode = pNode;
|
|
|
|
if(pNode)
|
2001-10-23 11:30:27 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
if(m_pSqlIterator)
|
2001-10-23 11:30:27 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
delete m_pSqlIterator->getParseTree();
|
|
|
|
m_pSqlIterator->setParseTree(pNode);
|
|
|
|
m_pSqlIterator->traverseAll();
|
|
|
|
SQLWarning aWarning = m_pSqlIterator->getWarning();
|
|
|
|
if(aWarning.Message.getLength())
|
2001-10-23 11:30:27 +00:00
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
showError(SQLExceptionInfo(aWarning));
|
2001-10-23 11:30:27 +00:00
|
|
|
m_bDesign = sal_False;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-03-19 11:12:55 +00:00
|
|
|
delete pNode;
|
|
|
|
m_bDesign = sal_False;
|
2001-10-23 11:30:27 +00:00
|
|
|
}
|
|
|
|
}
|
2004-03-19 11:12:55 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
String aTitle(ModuleRes(STR_SVT_SQL_SYNTAX_ERROR));
|
|
|
|
OSQLMessageBox aDlg(getView(),aTitle,aErrorMsg);
|
|
|
|
aDlg.Execute();
|
|
|
|
m_bDesign = sal_False; // the statement can't be parsed so we show the text view
|
|
|
|
}
|
2001-10-23 11:30:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2004-03-19 11:12:55 +00:00
|
|
|
|
2001-10-23 11:30:27 +00:00
|
|
|
if(!m_pSqlIterator)
|
|
|
|
setQueryComposer();
|
|
|
|
OSL_ENSURE(m_pSqlIterator,"No SQLIterator set!");
|
|
|
|
|
|
|
|
getContainer()->setNoneVisbleRow(m_nVisibleRows);
|
|
|
|
}
|
2004-03-19 11:12:55 +00:00
|
|
|
|
2001-10-23 11:30:27 +00:00
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void OQueryController::reset()
|
|
|
|
{
|
|
|
|
resetImpl();
|
|
|
|
getContainer()->reset();
|
|
|
|
getUndoMgr()->Clear();
|
|
|
|
}
|
2004-03-19 11:12:55 +00:00
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void OQueryController::setStatement_fireEvent( const ::rtl::OUString& _rNewStatement, bool _bFireStatementChange )
|
|
|
|
{
|
|
|
|
Any aOldValue = makeAny( m_sStatement );
|
|
|
|
m_sStatement = _rNewStatement;
|
|
|
|
Any aNewValue = makeAny( m_sStatement );
|
|
|
|
|
|
|
|
sal_Int32 nHandle = PROPERTY_ID_ACTIVECOMMAND;
|
|
|
|
if ( _bFireStatementChange )
|
|
|
|
fire( &nHandle, &aNewValue, &aOldValue, 1, sal_False );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
IMPL_LINK( OQueryController, OnExecuteAddTable, void*, pNotInterestedIn )
|
|
|
|
{
|
2004-09-09 08:49:48 +00:00
|
|
|
Execute( ID_BROWSER_ADDTABLE,Sequence<PropertyValue>() );
|
2004-03-19 11:12:55 +00:00
|
|
|
return 0L;
|
|
|
|
}
|
2004-09-09 08:49:48 +00:00
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void OQueryController::loadSubToolbar(const Reference< drafts::com::sun::star::frame::XLayoutManager >& _xLayoutManager)
|
|
|
|
{
|
|
|
|
OGenericUnoController::loadSubToolbar(_xLayoutManager);
|
|
|
|
switchDesignModeImpl(this,getContainer(),m_bDesign);
|
|
|
|
}
|
2001-10-23 11:30:27 +00:00
|
|
|
// -----------------------------------------------------------------------------
|
2002-04-02 05:40:36 +00:00
|
|
|
} // namespace dbaui
|
2002-04-03 12:57:14 +00:00
|
|
|
// -----------------------------------------------------------------------------
|