Files
libreoffice/dbaccess/source/ui/browser/unodatbr.cxx

2564 lines
106 KiB
C++
Raw Normal View History

2000-10-26 13:46:14 +00:00
/*************************************************************************
*
* $RCSfile: unodatbr.cxx,v $
*
* $Revision: 1.32 $
2000-10-26 13:46:14 +00:00
*
* last change: $Author: fs $ $Date: 2001-02-20 09:06:08 $
2000-10-26 13:46:14 +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 _SVX_GRIDCTRL_HXX
#include <svx/gridctrl.hxx>
#endif
#ifndef _SBA_UNODATBR_HXX_
#include "unodatbr.hxx"
#endif
#ifndef _SBA_GRID_HXX
#include "sbagrid.hxx"
#endif
#ifndef _SVTREEBOX_HXX
#include <svtools/svtreebx.hxx>
#endif
2001-01-09 14:52:33 +00:00
#ifndef _TOOLKIT_HELPER_VCLUNOHELPER_HXX_
2001-01-09 14:52:33 +00:00
#include <toolkit/unohlp.hxx>
#endif
2000-10-26 13:46:14 +00:00
#ifndef _COM_SUN_STAR_FORM_XLOADABLE_HPP_
#include <com/sun/star/form/XLoadable.hpp>
#endif
#ifndef _SV_MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _SFXDISPATCH_HXX //autogen
#include <sfx2/dispatch.hxx>
#endif
#ifndef _SV_MULTISEL_HXX //autogen
#include <tools/multisel.hxx>
#endif
2001-01-09 14:52:33 +00:00
#ifndef _COM_SUN_STAR_SDB_XQUERIESSUPPLIER_HPP_
#include <com/sun/star/sdb/XQueriesSupplier.hpp>
#endif
2000-10-26 13:46:14 +00:00
#ifndef _URLOBJ_HXX //autogen
#include <tools/urlobj.hxx>
#endif
#ifndef _SFXINTITEM_HXX //autogen
#include <svtools/intitem.hxx>
#endif
2001-01-09 14:52:33 +00:00
#ifndef _SV_WAITOBJ_HXX
#include <vcl/waitobj.hxx>
#endif
2000-10-26 13:46:14 +00:00
#ifndef _SV_SVAPP_HXX //autogen
#include <vcl/svapp.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef _SV_WRKWIN_HXX //autogen
#include <vcl/wrkwin.hxx>
#endif
#ifndef _COM_SUN_STAR_SDB_COMMANDTYPE_HPP_
#include <com/sun/star/sdb/CommandType.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
#include <com/sun/star/sdbc/DataType.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XCONNECTION_HPP_
#include <com/sun/star/sdbc/XConnection.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
#include <com/sun/star/beans/XPropertySet.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XGRIDCOLUMNFACTORY_HPP_
#include <com/sun/star/form/XGridColumnFactory.hpp>
#endif
#ifndef _COM_SUN_STAR_FORM_XFORM_HPP_
#include <com/sun/star/form/XForm.hpp>
#endif
#ifndef _COM_SUN_STAR_AWT_TEXTALIGN_HPP_
#include <com/sun/star/awt/TextAlign.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XVIEWSSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XViewsSupplier.hpp>
#endif
2001-02-14 13:37:35 +00:00
#ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBCX_XDROP_HPP_
#include <com/sun/star/sdbcx/XDrop.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_XCOMPLETEDCONNECTION_HPP_
#include <com/sun/star/sdb/XCompletedConnection.hpp>
#endif
2000-10-26 13:46:14 +00:00
#ifndef _COM_SUN_STAR_CONTAINER_XNAMECONTAINER_HPP_
#include <com/sun/star/container/XNameContainer.hpp>
#endif
#ifndef _COM_SUN_STAR_FRAME_FRAMESEARCHFLAG_HPP_
#include <com/sun/star/frame/FrameSearchFlag.hpp>
#endif
#ifndef _COM_SUN_STAR_SDBC_XDATASOURCE_HPP_
#include <com/sun/star/sdbc/XDataSource.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_XQUERYDEFINITIONSSUPPLIER_HPP_
#include <com/sun/star/sdb/XQueryDefinitionsSupplier.hpp>
#endif
#ifndef _COM_SUN_STAR_UI_XEXECUTABLEDIALOG_HPP_
#include <com/sun/star/ui/XExecutableDialog.hpp>
#endif
#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HPP_
#include <com/sun/star/beans/PropertyValue.hpp>
#endif
2000-10-26 13:46:14 +00:00
#ifndef _SVX_ALGITEM_HXX //autogen
#include <svx/algitem.hxx>
#endif
#ifndef _COM_SUN_STAR_SDB_COMMANDTYPE_HPP_
#include <com/sun/star/sdb/CommandType.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_XRESULTSETACCESS_HPP_
#include <com/sun/star/sdb/XResultSetAccess.hpp>
#endif
2001-01-09 14:52:33 +00:00
#ifndef _COM_SUN_STAR_LANG_DISPOSEDEXCEPTION_HPP_
#include <com/sun/star/lang/DisposedException.hpp>
#endif
2000-11-09 13:42:09 +00:00
#ifndef _COM_SUN_STAR_SDBC_SQLWARNING_HPP_
#include <com/sun/star/sdbc/SQLWarning.hpp>
#endif
#ifndef _COM_SUN_STAR_SDB_SQLCONTEXT_HPP_
#include <com/sun/star/sdb/SQLContext.hpp>
#endif
2000-10-26 13:46:14 +00:00
#ifndef _COMPHELPER_TYPES_HXX_
#include <comphelper/types.hxx>
#endif
#ifndef DBAUI_DBTREEMODEL_HXX
2000-10-26 13:46:14 +00:00
#include "dbtreemodel.hxx"
#endif
#ifndef DBACCESS_UI_DBTREEVIEW_HXX
2000-10-26 13:46:14 +00:00
#include "dbtreeview.hxx"
#endif
2000-10-26 13:46:14 +00:00
#ifndef _SVLBOXITM_HXX
#include <svtools/svlbitm.hxx>
#endif
#ifndef _SV_SPLIT_HXX
#include <vcl/split.hxx>
#endif
#ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
#include "dbustrings.hrc"
#endif
#ifndef _DBU_RESOURCE_HRC_
#include "dbu_resource.hrc"
#endif
#ifndef _DBAUI_MODULE_DBU_HXX_
#include "moduledbu.hxx"
#endif
#ifndef DBACCESS_SBA_GRID_HRC
#include "sbagrid.hrc"
#endif
#ifndef DBACCESS_UI_BROWSER_ID_HXX
#include "browserids.hxx"
#endif
#ifndef _DBU_REGHELPER_HXX_
#include "dbu_reghelper.hxx"
2000-10-26 13:46:14 +00:00
#endif
2001-01-09 14:52:33 +00:00
#ifndef _CPPUHELPER_EXTRACT_HXX_
#include <cppuhelper/extract.hxx>
#endif
#ifndef _DBHELPER_DBEXCEPTION_HXX_
#include <connectivity/dbexception.hxx>
#endif
#ifndef _VCL_STDTEXT_HXX
#include <vcl/stdtext.hxx>
#endif
#ifndef DBAUI_DBTREELISTBOX_HXX
#include "dbtreelistbox.hxx"
#endif
#ifndef _DBA_DBACCESS_HELPID_HRC_
2000-11-30 15:55:19 +00:00
#include "dbaccess_helpid.hrc"
#endif
2001-01-09 14:52:33 +00:00
#ifndef _COM_SUN_STAR_UTIL_XFLUSHABLE_HPP_
#include <com/sun/star/util/XFlushable.hpp>
2000-12-08 20:16:38 +00:00
#endif
#ifndef _DBAUI_QUERYDESIGNACCESS_HXX_
#include "querydesignaccess.hxx"
#endif
2001-01-30 07:32:01 +00:00
#ifndef _DBAUI_LISTVIEWITEMS_HXX_
#include "listviewitems.hxx"
#endif
2001-02-16 15:00:13 +00:00
#ifndef _CPPUHELPER_IMPLBASE2_HXX_
#include <cppuhelper/implbase2.hxx>
#endif
#ifndef DBAUI_TOKENWRITER_HXX
#include "TokenWriter.hxx"
#endif
#ifndef DBAUI_DBEXCHANGE_HXX
#include "dbexchange.hxx"
#endif
2000-10-26 13:46:14 +00:00
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::sdb;
using namespace ::com::sun::star::sdbc;
using namespace ::com::sun::star::sdbcx;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::util;
using namespace ::com::sun::star::frame;
2000-10-26 13:46:14 +00:00
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::ui;
using namespace ::com::sun::star::task;
2001-01-09 14:52:33 +00:00
using namespace ::com::sun::star::form;
using namespace ::com::sun::star::io;
using namespace ::dbtools;
// .........................................................................
namespace dbaui
{
// .........................................................................
2000-10-26 13:46:14 +00:00
//==================================================================
//= SbaTableQueryBrowser
//==================================================================
// -------------------------------------------------------------------------
extern "C" void SAL_CALL createRegistryInfo_OBrowser()
{
static OMultiInstanceAutoRegistration< SbaTableQueryBrowser > aAutoRegistration;
}
// -------------------------------------------------------------------------
void SafeAddPropertyListener(const Reference< XPropertySet > & xSet, const ::rtl::OUString& rPropName, XPropertyChangeListener* pListener)
{
Reference< XPropertySetInfo > xInfo = xSet->getPropertySetInfo();
if (xInfo->hasPropertyByName(rPropName))
xSet->addPropertyChangeListener(rPropName, pListener);
}
// -------------------------------------------------------------------------
void SafeRemovePropertyListener(const Reference< XPropertySet > & xSet, const ::rtl::OUString& rPropName, XPropertyChangeListener* pListener)
{
Reference< XPropertySetInfo > xInfo = xSet->getPropertySetInfo();
if (xInfo->hasPropertyByName(rPropName))
xSet->removePropertyChangeListener(rPropName, pListener);
}
//-------------------------------------------------------------------------
::rtl::OUString SAL_CALL SbaTableQueryBrowser::getImplementationName() throw(RuntimeException)
{
return getImplementationName_Static();
}
//-------------------------------------------------------------------------
::comphelper::StringSequence SAL_CALL SbaTableQueryBrowser::getSupportedServiceNames() throw(RuntimeException)
{
return getSupportedServiceNames_Static();
}
// -------------------------------------------------------------------------
::rtl::OUString SbaTableQueryBrowser::getImplementationName_Static() throw(RuntimeException)
{
2001-01-05 11:08:57 +00:00
return ::rtl::OUString::createFromAscii("org.openoffice.comp.dbu.ODatasourceBrowser");
2000-10-26 13:46:14 +00:00
}
//-------------------------------------------------------------------------
::comphelper::StringSequence SbaTableQueryBrowser::getSupportedServiceNames_Static() throw(RuntimeException)
{
::comphelper::StringSequence aSupported(1);
2000-11-08 08:27:29 +00:00
aSupported.getArray()[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdb.DataSourceBrowser");
2000-10-26 13:46:14 +00:00
return aSupported;
}
//-------------------------------------------------------------------------
Reference< XInterface > SAL_CALL SbaTableQueryBrowser::Create(const Reference<XMultiServiceFactory >& _rxFactory)
{
::vos::OGuard aGuard(Application::GetSolarMutex());
2000-10-26 13:46:14 +00:00
return *(new SbaTableQueryBrowser(_rxFactory));
}
//------------------------------------------------------------------------------
SbaTableQueryBrowser::SbaTableQueryBrowser(const Reference< XMultiServiceFactory >& _rM)
:SbaXDataBrowserController(_rM)
,m_pTreeModel(NULL)
,m_pTreeView(NULL)
,m_pSplitter(NULL)
2001-01-09 14:52:33 +00:00
,m_pCurrentlyDisplayed(NULL)
2000-10-26 13:46:14 +00:00
{
// calc the title for the load stopper
// sal_uInt32 nTitleResId;
// switch (m_xDefinition->GetKind())
// {
// case dbTable : nTitleResId = STR_TBL_TITLE; break;
// case dbQuery : nTitleResId = STR_QRY_TITLE; break;
// default : DBG_ERROR("OpenDataObjectThread::run : invalid object !");
// }
// String sTemp = String(ModuleRes(nTitleResId));
// sTemp.SearchAndReplace('#', m_xDefinition->Name());
// m_sLoadStopperCaption = String(ModuleRes(RID_STR_OPEN_OBJECT));
// m_sLoadStopperCaption += ' ';
// m_sLoadStopperCaption += sTemp;
}
//------------------------------------------------------------------------------
SbaTableQueryBrowser::~SbaTableQueryBrowser()
{
}
//------------------------------------------------------------------------------
void SAL_CALL SbaTableQueryBrowser::dispose()
{
::vos::OGuard aGuard(Application::GetSolarMutex());
// doin' a lot of VCL stuff here -> lock the SolarMutex
// reset the content's tree view: it holds a reference to our model which is to be deleted immediately,
// and it will live longer than we do.
2001-01-09 14:52:33 +00:00
if (getBrowserView())
getBrowserView()->setTreeView(NULL);
// clear the user data of the tree model
SvLBoxEntry* pEntryLoop = m_pTreeModel->First();
while (pEntryLoop)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(pEntryLoop->GetUserData());
if(pData)
{
2001-01-09 14:52:33 +00:00
Reference<XConnection> xCon(pData->xObject,UNO_QUERY);
if(xCon.is())
{
Reference< XComponent > xComponent(xCon, UNO_QUERY);
if (xComponent.is())
{
Reference< ::com::sun::star::lang::XEventListener> xEvtL((::cppu::OWeakObject*)this,UNO_QUERY);
xComponent->removeEventListener(xEvtL);
}
::comphelper::disposeComponent(pData->xObject);
}
delete pData;
}
pEntryLoop = m_pTreeModel->Next(pEntryLoop);
}
2001-01-09 14:52:33 +00:00
m_pCurrentlyDisplayed = NULL;
// clear the tree model
2000-10-26 13:46:14 +00:00
delete m_pTreeModel;
m_pTreeModel = NULL;
// remove the container listener from the database context
Reference< XContainer > xDatasourceContainer(m_xDatabaseContext, UNO_QUERY);
if (xDatasourceContainer.is())
xDatasourceContainer->removeContainerListener(this);
SbaXDataBrowserController::dispose();
2000-10-26 13:46:14 +00:00
}
2000-10-26 13:46:14 +00:00
//------------------------------------------------------------------------------
sal_Bool SbaTableQueryBrowser::Construct(Window* pParent)
{
if (!SbaXDataBrowserController::Construct(pParent))
return sal_False;
try
{
Reference< XContainer > xDatasourceContainer(m_xDatabaseContext, UNO_QUERY);
if (xDatasourceContainer.is())
xDatasourceContainer->addContainerListener(this);
else
DBG_ERROR("SbaTableQueryBrowser::Construct: the DatabaseContext should allow us to be a listener!");
}
catch(Exception&)
{
DBG_ERROR("SbaTableQueryBrowser::Construct: could not create (or start listening at) the database context!");
}
2000-10-26 13:46:14 +00:00
// some help ids
2001-01-09 14:52:33 +00:00
if (getBrowserView() && getBrowserView()->getVclControl())
2000-10-26 13:46:14 +00:00
{
// create controls and set sizes
2001-01-09 14:52:33 +00:00
const long nFrameWidth = getBrowserView()->LogicToPixel( Size( 3, 0 ), MAP_APPFONT ).Width();
2000-10-26 13:46:14 +00:00
2001-01-09 14:52:33 +00:00
m_pSplitter = new Splitter(getBrowserView(),WB_HSCROLL);
2000-10-26 13:46:14 +00:00
m_pSplitter->SetPosSizePixel( Point(0,0), Size(nFrameWidth,0) );
m_pSplitter->SetBackground( Wallpaper( Application::GetSettings().GetStyleSettings().GetDialogColor() ) );
m_pSplitter->Show();
2001-01-09 14:52:33 +00:00
m_pTreeView = new DBTreeView(getBrowserView(),m_xMultiServiceFacatory, WB_TABSTOP);
2000-10-26 13:46:14 +00:00
m_pTreeView->Show();
m_pTreeView->SetPreExpandHandler(LINK(this, SbaTableQueryBrowser, OnExpandEntry));
2000-11-30 15:55:19 +00:00
m_pTreeView->SetHelpId(HID_CTL_TREEVIEW);
2000-10-26 13:46:14 +00:00
2001-01-09 14:52:33 +00:00
m_pTreeView->SetContextMenuHandler(LINK(this, SbaTableQueryBrowser, OnListContextMenu));
// a default pos for the splitter, so that the listbox is about 80 (logical) pixels wide
2001-01-09 14:52:33 +00:00
m_pSplitter->SetSplitPosPixel( getBrowserView()->LogicToPixel( Size( 80, 0 ), MAP_APPFONT ).Width() );
2001-01-09 14:52:33 +00:00
getBrowserView()->setSplitter(m_pSplitter);
getBrowserView()->setTreeView(m_pTreeView);
2000-10-26 13:46:14 +00:00
// fill view with data
m_pTreeModel = new DBTreeListModel;
2000-10-26 13:46:14 +00:00
m_pTreeView->setModel(m_pTreeModel);
m_pTreeView->setSelectHdl(LINK(this, SbaTableQueryBrowser, OnSelectEntry));
initializeTreeModel();
2000-10-26 13:46:14 +00:00
// TODO
2001-01-09 14:52:33 +00:00
getBrowserView()->getVclControl()->GetDataWindow().SetUniqueId(UID_DATABROWSE_DATAWINDOW);
getBrowserView()->getVclControl()->SetHelpId(HID_CTL_TABBROWSER);
getBrowserView()->SetUniqueId(UID_CTL_CONTENT);
if (getBrowserView()->getVclControl()->GetHeaderBar())
getBrowserView()->getVclControl()->GetHeaderBar()->SetHelpId(HID_DATABROWSE_HEADER);
2000-12-08 20:16:38 +00:00
InvalidateFeature(ID_BROWSER_EXPLORER);
2000-10-26 13:46:14 +00:00
}
return sal_True;
}
// -------------------------------------------------------------------------
sal_Bool SbaTableQueryBrowser::InitializeForm(const Reference< ::com::sun::star::sdbc::XRowSet > & _rxForm)
{
2001-01-09 14:52:33 +00:00
if(!m_pCurrentlyDisplayed)
return sal_True;
// this method set all format settings from the orignal table or query
2000-10-26 13:46:14 +00:00
try
{
// we send all properties at once, maybe the implementation is clever enough to handle one big PropertiesChanged
// more effective than many small PropertyChanged ;)
2001-01-09 14:52:33 +00:00
Sequence< ::rtl::OUString> aProperties(3);
Sequence< Any> aValues(3);
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
OSL_ENSURE(pData,"No user data set at the currently displayed entry!");
Reference<XPropertySet> xTableProp(pData->xObject,UNO_QUERY);
OSL_ENSURE(xTableProp.is(),"No table available!");
2000-10-26 13:46:14 +00:00
// is the filter intially applied ?
2001-01-09 14:52:33 +00:00
aProperties.getArray()[0] = PROPERTY_APPLYFILTER;
aValues.getArray()[0] = xTableProp->getPropertyValue(PROPERTY_APPLYFILTER);
// the initial filter
aProperties.getArray()[1] = PROPERTY_FILTER;
aValues.getArray()[1] = xTableProp->getPropertyValue(PROPERTY_FILTER);
// the initial ordering
aProperties.getArray()[2] = PROPERTY_ORDER;
aValues.getArray()[2] = xTableProp->getPropertyValue(PROPERTY_ORDER);
Reference< XMultiPropertySet > xFormMultiSet(_rxForm, UNO_QUERY);
xFormMultiSet->setPropertyValues(aProperties, aValues);
2000-10-26 13:46:14 +00:00
}
catch(Exception&)
2000-10-26 13:46:14 +00:00
{
DBG_ERROR("SbaTableQueryBrowser::InitializeForm : something went wrong !");
return sal_False;
}
return sal_True;
}
//------------------------------------------------------------------------------
sal_Bool SbaTableQueryBrowser::InitializeGridModel(const Reference< ::com::sun::star::form::XFormComponent > & xGrid)
{
try
{
2000-11-23 11:27:21 +00:00
Reference< ::com::sun::star::form::XGridColumnFactory > xColFactory(xGrid, UNO_QUERY);
Reference< XNameContainer > xColContainer(xGrid, UNO_QUERY);
// first we have to clear the grid
2000-10-26 13:46:14 +00:00
{
2000-11-23 11:27:21 +00:00
Sequence< ::rtl::OUString > aNames = xColContainer->getElementNames();
const ::rtl::OUString* pBegin = aNames.getConstArray();
const ::rtl::OUString* pEnd = pBegin + aNames.getLength();
for (; pBegin != pEnd;++pBegin)
xColContainer->removeByName(*pBegin);
2000-10-26 13:46:14 +00:00
}
2001-01-09 14:52:33 +00:00
// set the formats from the table
if(m_pCurrentlyDisplayed)
{
Sequence< ::rtl::OUString> aProperties(3);
Sequence< Any> aValues(3);
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
Reference<XPropertySet> xTableProp(pData->xObject,UNO_QUERY);
OSL_ENSHURE(xTableProp.is(),"No table available!");
aProperties.getArray()[0] = PROPERTY_FONT;
aValues.getArray()[0] = xTableProp->getPropertyValue(PROPERTY_FONT);
aProperties.getArray()[1] = PROPERTY_ROW_HEIGHT;
aValues.getArray()[1] = xTableProp->getPropertyValue(PROPERTY_ROW_HEIGHT);
aProperties.getArray()[2] = PROPERTY_TEXTCOLOR;
aValues.getArray()[2] = xTableProp->getPropertyValue(PROPERTY_TEXTCOLOR);
Reference< XMultiPropertySet > xFormMultiSet(xGrid, UNO_QUERY);
xFormMultiSet->setPropertyValues(aProperties, aValues);
}
2000-11-23 11:27:21 +00:00
// get the formats supplier of the database we're working with
Reference< ::com::sun::star::util::XNumberFormatsSupplier > xSupplier = getNumberFormatter()->getNumberFormatsSupplier();
2000-10-26 13:46:14 +00:00
2000-11-23 11:27:21 +00:00
Reference<XConnection> xConnection;
Reference<XPropertySet> xProp(getRowSet(),UNO_QUERY);
2001-02-14 13:37:35 +00:00
::cppu::extractInterface(xConnection,xProp->getPropertyValue(PROPERTY_ACTIVECONNECTION));
2000-11-23 11:27:21 +00:00
OSL_ENSHURE(xConnection.is(),"A ActiveConnection should normaly exists!");
2000-10-26 13:46:14 +00:00
2000-11-23 11:27:21 +00:00
Reference<XChild> xChild(xConnection,UNO_QUERY);
Reference<XPropertySet> xDataSourceProp(xChild->getParent(),UNO_QUERY);
sal_Bool bSupress = ::cppu::any2bool(xDataSourceProp->getPropertyValue(PROPERTY_SUPPRESSVERSIONCL));
2000-10-26 13:46:14 +00:00
2000-11-23 11:27:21 +00:00
// insert the column into the gridcontrol so that we see something :-)
::rtl::OUString aCurrentModelType;
Reference<XColumnsSupplier> xSupCols(getRowSet(),UNO_QUERY);
Reference<XNameAccess> xColumns = xSupCols->getColumns();
Sequence< ::rtl::OUString> aNames = xColumns->getElementNames();
const ::rtl::OUString* pBegin = aNames.getConstArray();
const ::rtl::OUString* pEnd = pBegin + aNames.getLength();
2000-10-26 13:46:14 +00:00
2000-11-23 11:27:21 +00:00
Reference<XPropertySet> xColumn;
for (sal_uInt16 i=0; pBegin != pEnd; ++i,++pBegin)
{
// Typ
// first get type to determine wich control we need
2001-02-14 13:37:35 +00:00
::cppu::extractInterface(xColumn,xColumns->getByName(*pBegin));
2000-11-23 11:27:21 +00:00
// ignore the column when it is a rowversion one
if(bSupress && xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_ISROWVERSION)
&& ::cppu::any2bool(xColumn->getPropertyValue(PROPERTY_ISROWVERSION)))
continue;
sal_Bool bIsFormatted = sal_False;
sal_Bool bFormattedIsNumeric = sal_True;
sal_Int32 nType = comphelper::getINT32(xColumn->getPropertyValue(PROPERTY_TYPE));
switch(nType)
{
// TODO : die Strings fuer die Column-Typen irgendwo richtig platzieren
case DataType::BIT:
aCurrentModelType = ::rtl::OUString::createFromAscii("CheckBox");
break;
case DataType::BINARY:
case DataType::VARBINARY:
case DataType::LONGVARBINARY:
aCurrentModelType = ::rtl::OUString::createFromAscii("TextField");
break;
case DataType::VARCHAR:
case DataType::LONGVARCHAR:
case DataType::CHAR:
bFormattedIsNumeric = sal_False;
// _NO_ break !
default:
aCurrentModelType = ::rtl::OUString::createFromAscii("FormattedField");
bIsFormatted = sal_True;
break;
}
Reference< XPropertySet > xCurrentCol = xColFactory->createColumn(aCurrentModelType);
xCurrentCol->setPropertyValue(PROPERTY_CONTROLSOURCE, makeAny(*pBegin));
xCurrentCol->setPropertyValue(PROPERTY_LABEL, makeAny(*pBegin));
if (bIsFormatted)
{
if (xSupplier.is())
xCurrentCol->setPropertyValue(::rtl::OUString::createFromAscii("FormatsSupplier"), makeAny(xSupplier));
xCurrentCol->setPropertyValue(PROPERTY_FORMATKEY, xColumn->getPropertyValue(PROPERTY_FORMATKEY));
xCurrentCol->setPropertyValue(::rtl::OUString::createFromAscii("TreatAsNumber"), ::cppu::bool2any(bFormattedIsNumeric));
}
// default value
if (nType == DataType::BIT)
{
Any aDefault; aDefault <<= ((sal_Int16)STATE_DONTKNOW);
if(xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_DEFAULTVALUE))
aDefault <<= (comphelper::getString(xColumn->getPropertyValue(PROPERTY_DEFAULTVALUE)).toInt32() == 0) ? (sal_Int16)STATE_NOCHECK : (sal_Int16)STATE_CHECK;
xCurrentCol->setPropertyValue(PROPERTY_DEFAULTSTATE, aDefault);
}
// transfer properties from the definition to the UNO-model :
// ... the hidden flag
xCurrentCol->setPropertyValue(PROPERTY_HIDDEN, xColumn->getPropertyValue(PROPERTY_HIDDEN));
// ... the initial colum width
xCurrentCol->setPropertyValue(PROPERTY_WIDTH, xColumn->getPropertyValue(PROPERTY_WIDTH));
// ... horizontal justify
2001-02-14 13:37:35 +00:00
sal_Int32 nAlign;
xColumn->getPropertyValue(PROPERTY_ALIGN) >>= nAlign;
xCurrentCol->setPropertyValue(PROPERTY_ALIGN, makeAny(sal_Int16(nAlign)));
2000-11-23 11:27:21 +00:00
// ... the 'comment' property as helptext (will usually be shown as header-tooltip)
Any aDescription; aDescription <<= ::rtl::OUString();
if(xColumn->getPropertySetInfo()->hasPropertyByName(PROPERTY_DESCRIPTION))
aDescription <<= comphelper::getString(xColumn->getPropertyValue(PROPERTY_DESCRIPTION));
xCurrentCol->setPropertyValue(PROPERTY_HELPTEXT, xColumn->getPropertyValue(PROPERTY_DESCRIPTION));
xColContainer->insertByName(*pBegin, makeAny(xCurrentCol));
}
2000-10-26 13:46:14 +00:00
}
catch(Exception&)
2000-10-26 13:46:14 +00:00
{
DBG_ERROR("SbaTableQueryBrowser::InitializeGridModel : something went wrong !");
return sal_False;
}
return sal_True;
}
//------------------------------------------------------------------------------
ToolBox* SbaTableQueryBrowser::CreateToolBox(Window* _pParent)
{
ToolBox* pTB = NULL;
Reference<XPropertySet> xProp(getRowSet(),UNO_QUERY);
if(xProp.is())
{
sal_Int32 nType;
xProp->getPropertyValue(::rtl::OUString::createFromAscii("CommandType")) >>= nType;
sal_uInt16 nResId = 0;
switch (nType)
{
case CommandType::TABLE : nResId = RID_BRW_TAB_TOOLBOX; break;
case CommandType::QUERY : nResId = RID_BRW_QRY_TOOLBOX; break;
case CommandType::COMMAND: nResId = RID_BRW_QRY_TOOLBOX; break;
default : return NULL;
}
pTB = new ToolBox(_pParent, ModuleRes(nResId));
if (!pTB)
return NULL;
}
return pTB;
}
2001-01-09 14:52:33 +00:00
// -----------------------------------------------------------------------------
Reference<XPropertySet> getColumnHelper(SvLBoxEntry* _pCurrentlyDisplayed,const Reference<XPropertySet>& _rxSource)
{
Reference<XPropertySet> xRet;
if(_pCurrentlyDisplayed)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(_pCurrentlyDisplayed->GetUserData());
Reference<XColumnsSupplier> xColumnsSup(pData->xObject,UNO_QUERY);
Reference<XNameAccess> xNames = xColumnsSup->getColumns();
::rtl::OUString aName;
_rxSource->getPropertyValue(PROPERTY_NAME) >>= aName;
if(xNames.is() && xNames->hasByName(aName))
2001-02-14 13:37:35 +00:00
::cppu::extractInterface(xRet,xNames->getByName(aName));
2001-01-09 14:52:33 +00:00
}
return xRet;
}
2000-10-26 13:46:14 +00:00
// -----------------------------------------------------------------------
void SbaTableQueryBrowser::propertyChange(const PropertyChangeEvent& evt)
{
SbaXDataBrowserController::propertyChange(evt);
2001-01-09 14:52:33 +00:00
try
{
Reference< XPropertySet > xSource(evt.Source, UNO_QUERY);
if (!xSource.is())
return;
// one of the many properties which require us to update the definition ?
// a column's width ?
else if (evt.PropertyName.equals(PROPERTY_WIDTH))
{ // a column width has changed -> update the model
// (the update of the view is done elsewhere)
Reference<XPropertySet> xProp = getColumnHelper(m_pCurrentlyDisplayed,xSource);
if(xProp.is())
{
if(!evt.NewValue.hasValue())
xProp->setPropertyValue(PROPERTY_WIDTH,makeAny((sal_Int32)227));
else
xProp->setPropertyValue(PROPERTY_WIDTH,evt.NewValue);
}
}
// a column's 'visible' state ?
else if (evt.PropertyName.equals(PROPERTY_HIDDEN))
{
Reference<XPropertySet> xProp = getColumnHelper(m_pCurrentlyDisplayed,xSource);
if(xProp.is())
xProp->setPropertyValue(PROPERTY_HIDDEN,evt.NewValue);
}
// a columns alignment ?
else if (evt.PropertyName.equals(PROPERTY_ALIGN))
{
Reference<XPropertySet> xProp = getColumnHelper(m_pCurrentlyDisplayed,xSource);
2001-02-14 13:37:35 +00:00
try
2001-01-09 14:52:33 +00:00
{
2001-02-14 13:37:35 +00:00
if(xProp.is())
{
if(evt.NewValue.hasValue())
xProp->setPropertyValue(PROPERTY_ALIGN,evt.NewValue);
else
xProp->setPropertyValue(PROPERTY_ALIGN,makeAny((sal_Int32)0));
}
}
catch(Exception&)
{
OSL_ASSERT(0);
2001-01-09 14:52:33 +00:00
}
}
// a column's format ?
else if ( (evt.PropertyName.equals(PROPERTY_FORMATKEY))
&& (TypeClass_LONG == evt.NewValue.getValueTypeClass())
)
{
// update the model (means the definition object)
Reference<XPropertySet> xProp = getColumnHelper(m_pCurrentlyDisplayed,xSource);
if(xProp.is())
xProp->setPropertyValue(PROPERTY_FORMATKEY,evt.NewValue);
}
// some table definition properties ?
// the height of the rows in the grid ?
else if (evt.PropertyName.equals(PROPERTY_ROW_HEIGHT))
{
if(m_pCurrentlyDisplayed)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
Reference<XPropertySet> xProp(pData->xObject,UNO_QUERY);
OSL_ENSHURE(xProp.is(),"No table available!");
sal_Bool bDefault = !evt.NewValue.hasValue();
if (bDefault)
xProp->setPropertyValue(PROPERTY_ROW_HEIGHT,makeAny((sal_Int32)45));
else
xProp->setPropertyValue(PROPERTY_ROW_HEIGHT,evt.NewValue);
}
}
// // the font of the grid ?
else if (evt.PropertyName.equals(PROPERTY_FONT))
{
if(m_pCurrentlyDisplayed)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
Reference<XPropertySet> xProp(pData->xObject,UNO_QUERY);
OSL_ENSHURE(xProp.is(),"No table available!");
xProp->setPropertyValue(PROPERTY_FONT,evt.NewValue);
}
}
// // the text color of the grid ?
else if (evt.PropertyName.equals(PROPERTY_TEXTCOLOR))
{
if(m_pCurrentlyDisplayed)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
Reference<XPropertySet> xProp(pData->xObject,UNO_QUERY);
OSL_ENSHURE(xProp.is(),"No table available!");
xProp->setPropertyValue(PROPERTY_TEXTCOLOR,evt.NewValue);
}
}
// // the filter ?
else if (evt.PropertyName.equals(PROPERTY_FILTER))
{
if(m_pCurrentlyDisplayed)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
Reference<XPropertySet> xProp(pData->xObject,UNO_QUERY);
OSL_ENSHURE(xProp.is(),"No table available!");
xProp->setPropertyValue(PROPERTY_FILTER,evt.NewValue);
}
}
// the sort ?
else if (evt.PropertyName.equals(PROPERTY_ORDER))
{
if(m_pCurrentlyDisplayed)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
Reference<XPropertySet> xProp(pData->xObject,UNO_QUERY);
OSL_ENSHURE(xProp.is(),"No table available!");
xProp->setPropertyValue(PROPERTY_ORDER,evt.NewValue);
}
}
// the appliance of the filter ?
else if (evt.PropertyName.equals(PROPERTY_APPLYFILTER))
{
if(m_pCurrentlyDisplayed)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
Reference<XPropertySet> xProp(pData->xObject,UNO_QUERY);
OSL_ENSHURE(xProp.is(),"No table available!");
xProp->setPropertyValue(PROPERTY_APPLYFILTER,evt.NewValue);
}
}
}
2001-02-05 08:50:37 +00:00
catch(Exception& e)
2001-01-09 14:52:33 +00:00
{
OSL_ASSERT(0);
}
2000-10-26 13:46:14 +00:00
}
// -----------------------------------------------------------------------
sal_Bool SbaTableQueryBrowser::suspend(sal_Bool bSuspend) throw( RuntimeException )
{
if (!SbaXDataBrowserController::suspend(bSuspend))
return sal_False;
2001-01-09 14:52:33 +00:00
if(m_pCurrentlyDisplayed)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
try
{
Reference<XFlushable> xFlush(pData->xObject,UNO_QUERY);
if(xFlush.is())
xFlush->flush();
}
catch(DisposedException&)
{
OSL_ENSURE(0,"Object already disposed!");
}
catch(Exception&)
{
}
}
2000-10-26 13:46:14 +00:00
return sal_True;
}
// -------------------------------------------------------------------------
void SAL_CALL SbaTableQueryBrowser::statusChanged( const FeatureStateEvent& _rEvent ) throw(RuntimeException)
2000-10-26 13:46:14 +00:00
{
// search the external dispatcher causing this call
Reference< XDispatch > xSource(_rEvent.Source, UNO_QUERY);
for ( SpecialSlotDispatchersIterator aLoop = m_aDispatchers.begin();
aLoop != m_aDispatchers.end();
++aLoop
)
{
if (_rEvent.FeatureURL.Complete == getURLForId(aLoop->first).Complete)
{
DBG_ASSERT(xSource.get() == aLoop->second.get(), "SbaTableQueryBrowser::statusChanged: inconsistent!");
m_aDispatchStates[aLoop->first] = _rEvent.IsEnabled;
implCheckExternalSlot(aLoop->first);
break;
}
}
DBG_ASSERT(aLoop != m_aDispatchers.end(), "SbaTableQueryBrowser::statusChanged: don't know who sent this!");
}
2000-10-26 13:46:14 +00:00
// -------------------------------------------------------------------------
void SbaTableQueryBrowser::implCheckExternalSlot(sal_Int32 _nId)
{
// check if we have to hide this item from the toolbox
2001-01-09 14:52:33 +00:00
ToolBox* pTB = getBrowserView()->getToolBox();
if (pTB)
{
sal_Bool bHaveDispatcher = m_aDispatchers[_nId].is();
if (bHaveDispatcher != pTB->IsItemVisible(_nId))
bHaveDispatcher ? pTB->ShowItem(_nId) : pTB->HideItem(_nId);
}
2000-10-26 13:46:14 +00:00
// and invalidate this feature in general
InvalidateFeature(_nId);
}
// -------------------------------------------------------------------------
void SAL_CALL SbaTableQueryBrowser::disposing( const EventObject& _rSource ) throw(RuntimeException)
{
// search the external dispatcher causing this call in our map
Reference< XDispatch > xSource(_rSource.Source, UNO_QUERY);
2001-01-09 14:52:33 +00:00
if(xSource.is())
2000-10-26 13:46:14 +00:00
{
2001-01-09 14:52:33 +00:00
for ( SpecialSlotDispatchersIterator aLoop = m_aDispatchers.begin();
aLoop != m_aDispatchers.end();
++aLoop
)
2000-10-26 13:46:14 +00:00
{
2001-01-09 14:52:33 +00:00
if (aLoop->second.get() == xSource.get())
{
SpecialSlotDispatchersIterator aPrevious = aLoop;
--aPrevious;
2001-01-09 14:52:33 +00:00
// remove it
m_aDispatchers.erase(aLoop);
m_aDispatchStates.erase(aLoop->first);
2001-01-09 14:52:33 +00:00
// maybe update the UI
implCheckExternalSlot(aLoop->first);
// continue, the same XDispatch may be resposible for more than one URL
aLoop = aPrevious;
}
}
}
else
{
Reference<XConnection> xCon(_rSource.Source, UNO_QUERY);
if(xCon.is())
{ // our connection is in dispose so we have to find the entry equal with this connection
// and close it what means to collapse the entry
// get the top-level representing the removed data source
SvLBoxEntry* pDSLoop = m_pTreeView->getListBox()->FirstChild(NULL);
while (pDSLoop)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(pDSLoop->GetUserData());
if(pData && pData->xObject == xCon)
{
// we set the conenction to null to avoid a second disposing of the connection
pData->xObject = NULL;
closeConnection(pDSLoop,sal_False);
break;
}
2001-01-09 14:52:33 +00:00
pDSLoop = m_pTreeView->getListBox()->NextSibling(pDSLoop);
}
}
2001-01-09 14:52:33 +00:00
else
SbaXDataBrowserController::disposing(_rSource);
}
}
// -------------------------------------------------------------------------
void SbaTableQueryBrowser::attachFrame(const Reference< ::com::sun::star::frame::XFrame > & _xFrame) throw( RuntimeException )
{
// clear all old dispatches
for ( ConstSpecialSlotDispatchersIterator aLoop = m_aDispatchers.begin();
aLoop != m_aDispatchers.end();
++aLoop
)
{
if (aLoop->second.is())
{
try
{
aLoop->second->removeStatusListener(this, getURLForId(aLoop->first));
}
catch (Exception&)
{
DBG_ERROR("SbaTableQueryBrowser::attachFrame: could not remove a status listener!");
}
2000-10-26 13:46:14 +00:00
}
}
m_aDispatchers.clear();
m_aDispatchStates.clear();
SbaXDataBrowserController::attachFrame(_xFrame);
// get the dispatchers for the external slots
Reference< XDispatchProvider > xProvider(m_xCurrentFrame, UNO_QUERY);
DBG_ASSERT(xProvider.is(), "SbaTableQueryBrowser::attachFrame: no DispatchPprovider !");
if (xProvider.is())
2000-10-26 13:46:14 +00:00
{
sal_Int32 nExternalIds[] = { ID_BROWSER_FORMLETTER, ID_BROWSER_INSERTCOLUMNS, ID_BROWSER_INSERTCONTENT };
for (sal_Int32 i=0; i<sizeof(nExternalIds)/sizeof(nExternalIds[0]); ++i)
2000-10-26 13:46:14 +00:00
{
URL aURL = getURLForId(nExternalIds[i]);
m_aDispatchers[nExternalIds[i]] = xProvider->queryDispatch(aURL, ::rtl::OUString::createFromAscii("_parent"), FrameSearchFlag::PARENT);
if (m_aDispatchers[nExternalIds[i]].get() == static_cast< XDispatch* >(this))
// as the URL is one of our "supported features", we may answer the request ourself if nobody out there
// is interested in.
m_aDispatchers[nExternalIds[i]].clear();
// assume te general availability of the feature. This is overruled if there is no dispatcher for the URL
m_aDispatchStates[nExternalIds[i]] = sal_True;
if (m_aDispatchers[nExternalIds[i]].is())
{
try
{
m_aDispatchers[nExternalIds[i]]->addStatusListener(this, aURL);
}
2001-01-09 14:52:33 +00:00
catch(DisposedException&)
{
OSL_ENSURE(0,"Object already disposed!");
}
catch(Exception&)
{
DBG_ERROR("SbaTableQueryBrowser::attachFrame: could not attach a status listener!");
}
}
implCheckExternalSlot(nExternalIds[i]);
2000-10-26 13:46:14 +00:00
}
}
}
// -------------------------------------------------------------------------
void SbaTableQueryBrowser::addModelListeners(const Reference< ::com::sun::star::awt::XControlModel > & _xGridControlModel)
{
SbaXDataBrowserController::addModelListeners(_xGridControlModel);
Reference< XPropertySet > xCols(_xGridControlModel, UNO_QUERY);
if (xCols.is())
{
xCols->addPropertyChangeListener(PROPERTY_ROW_HEIGHT, (XPropertyChangeListener*)this);
xCols->addPropertyChangeListener(PROPERTY_FONT, (XPropertyChangeListener*)this);
xCols->addPropertyChangeListener(PROPERTY_TEXTCOLOR, (XPropertyChangeListener*)this);
}
}
// -------------------------------------------------------------------------
void SbaTableQueryBrowser::removeModelListeners(const Reference< ::com::sun::star::awt::XControlModel > & _xGridControlModel)
{
SbaXDataBrowserController::removeModelListeners(_xGridControlModel);
Reference< XPropertySet > xSourceSet(_xGridControlModel, UNO_QUERY);
if (xSourceSet.is())
{
xSourceSet->removePropertyChangeListener(PROPERTY_ROW_HEIGHT, (XPropertyChangeListener*)this);
xSourceSet->removePropertyChangeListener(PROPERTY_FONT, (XPropertyChangeListener*)this);
xSourceSet->removePropertyChangeListener(PROPERTY_TEXTCOLOR, (XPropertyChangeListener*)this);
}
}
// -------------------------------------------------------------------------
String SbaTableQueryBrowser::getURL() const
{
return String();
}
// -----------------------------------------------------------------------
void SbaTableQueryBrowser::InvalidateFeature(sal_uInt16 nId, const Reference< ::com::sun::star::frame::XStatusListener > & xListener)
{
SbaXDataBrowserController::InvalidateFeature(nId, xListener);
}
//------------------------------------------------------------------------------
void SbaTableQueryBrowser::AddColumnListener(const Reference< XPropertySet > & xCol)
{
SbaXDataBrowserController::AddColumnListener(xCol);
SafeAddPropertyListener(xCol, PROPERTY_WIDTH, (XPropertyChangeListener*)this);
SafeAddPropertyListener(xCol, PROPERTY_HIDDEN, (XPropertyChangeListener*)this);
SafeAddPropertyListener(xCol, PROPERTY_ALIGN, (XPropertyChangeListener*)this);
SafeAddPropertyListener(xCol, PROPERTY_FORMATKEY, (XPropertyChangeListener*)this);
}
//------------------------------------------------------------------------------
void SbaTableQueryBrowser::RemoveColumnListener(const Reference< XPropertySet > & xCol)
{
SbaXDataBrowserController::RemoveColumnListener(xCol);
SafeRemovePropertyListener(xCol, PROPERTY_WIDTH, (XPropertyChangeListener*)this);
SafeRemovePropertyListener(xCol, PROPERTY_HIDDEN, (XPropertyChangeListener*)this);
SafeRemovePropertyListener(xCol, PROPERTY_ALIGN, (XPropertyChangeListener*)this);
SafeRemovePropertyListener(xCol, PROPERTY_FORMATKEY, (XPropertyChangeListener*)this);
}
//------------------------------------------------------------------------------
void SbaTableQueryBrowser::AddSupportedFeatures()
{
SbaXDataBrowserController::AddSupportedFeatures();
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:Title")] = ID_BROWSER_TITLE;
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:DataSourceBrowser/FormLetter")] = ID_BROWSER_FORMLETTER;
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:DataSourceBrowser/InsertColumns")] = ID_BROWSER_INSERTCOLUMNS;
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:DataSourceBrowser/InsertContent")] = ID_BROWSER_INSERTCONTENT;
2001-01-09 14:52:33 +00:00
m_aSupportedFeatures[ ::rtl::OUString::createFromAscii(".uno:DataSourceBrowser/ToggleExplore")] = ID_BROWSER_EXPLORER;
2000-10-26 13:46:14 +00:00
// TODO reenable our own code if we really have a handling for the formslots
// ControllerFeature( ::rtl::OUString::createFromAscii("private:FormSlot/moveToFirst"), SID_FM_RECORD_FIRST ),
// ControllerFeature( ::rtl::OUString::createFromAscii("private:FormSlot/moveToLast"), SID_FM_RECORD_LAST ),
// ControllerFeature( ::rtl::OUString::createFromAscii("private:FormSlot/moveToNew"), SID_FM_RECORD_NEW ),
// ControllerFeature( ::rtl::OUString::createFromAscii("private:FormSlot/moveToNext"), SID_FM_RECORD_NEXT ),
// ControllerFeature( ::rtl::OUString::createFromAscii("private:FormSlot/moveToPrev"), SID_FM_RECORD_PREV )
2000-10-26 13:46:14 +00:00
}
//------------------------------------------------------------------------------
FeatureState SbaTableQueryBrowser::GetState(sal_uInt16 nId)
{
FeatureState aReturn;
// (disabled automatically)
2000-12-08 20:16:38 +00:00
if (ID_BROWSER_EXPLORER == nId)
2001-01-09 14:52:33 +00:00
{ // this slot is available even if no form is loaded
2000-12-08 20:16:38 +00:00
aReturn.bEnabled = sal_True;
aReturn.aState = ::cppu::bool2any(haveExplorer());
return aReturn;
}
2000-10-26 13:46:14 +00:00
try
{
// no chance without a view
2001-01-09 14:52:33 +00:00
if (!getBrowserView() || !getBrowserView()->getVclControl())
2000-10-26 13:46:14 +00:00
return aReturn;
// no chance without valid models
2001-01-09 14:52:33 +00:00
if (isValid() && !isValidCursor() && nId != ID_BROWSER_CLOSE) // the close button should always be enabled
2000-10-26 13:46:14 +00:00
return aReturn;
// no chance while loading the form
if (PendingLoad())
return aReturn;
switch (nId)
{
case ID_BROWSER_INSERTCOLUMNS:
case ID_BROWSER_INSERTCONTENT:
case ID_BROWSER_FORMLETTER:
2000-10-26 13:46:14 +00:00
{
// the slot is enabled if we have an external dispatcher able to handle it,
// and the dispatcher must have enabled the slot in general
if (m_aDispatchers[nId].is())
aReturn.bEnabled = m_aDispatchStates[nId];
else
aReturn.bEnabled = sal_False;
// for the Insert* slots, we need at least one selected row
if (ID_BROWSER_FORMLETTER != nId)
2001-01-09 14:52:33 +00:00
aReturn.bEnabled = aReturn.bEnabled && getBrowserView()->getVclControl()->GetSelectRowCount();
2000-10-26 13:46:14 +00:00
// disabled for native queries which are not saved within the database
// 67706 - 23.08.99 - FS
2000-10-26 13:46:14 +00:00
Reference< XPropertySet > xDataSource(getRowSet(), UNO_QUERY);
try
{
aReturn.bEnabled = aReturn.bEnabled && xDataSource.is();
if (xDataSource.is())
{
sal_Int32 nType = ::comphelper::getINT32(xDataSource->getPropertyValue(PROPERTY_COMMANDTYPE));
aReturn.bEnabled = aReturn.bEnabled && ((::comphelper::getBOOL(xDataSource->getPropertyValue(PROPERTY_USE_ESCAPE_PROCESSING)) || (nType == ::com::sun::star::sdb::CommandType::QUERY)));
}
}
2001-01-09 14:52:33 +00:00
catch(DisposedException&)
{
OSL_ENSURE(0,"Object already disposed!");
}
catch(Exception&)
2000-10-26 13:46:14 +00:00
{
}
}
break;
case ID_BROWSER_TITLE:
{
Reference<XPropertySet> xProp(getRowSet(),UNO_QUERY);
sal_Int32 nCommandType = CommandType::TABLE;
xProp->getPropertyValue(PROPERTY_COMMANDTYPE) >>= nCommandType;
String sTitle;
switch (nCommandType)
{
case CommandType::TABLE:
sTitle = String(ModuleRes(STR_TBL_TITLE)); break;
case CommandType::QUERY:
2001-01-09 14:52:33 +00:00
case CommandType::COMMAND:
2000-10-26 13:46:14 +00:00
sTitle = String(ModuleRes(STR_QRY_TITLE)); break;
default:
DBG_ASSERT(0,"Unbekannte DBDef Art");
}
::rtl::OUString aName;
xProp->getPropertyValue(PROPERTY_COMMAND) >>= aName;
String sObject(aName.getStr());
sTitle.SearchAndReplace('#',sObject);
aReturn.aState <<= ::rtl::OUString(sTitle);
aReturn.bEnabled = sal_True;
}
break;
case ID_BROWSER_TABLEATTR:
case ID_BROWSER_ROWHEIGHT:
case ID_BROWSER_COLATTRSET:
case ID_BROWSER_COLWIDTH:
2001-01-09 14:52:33 +00:00
aReturn.bEnabled = getBrowserView() && getBrowserView()->getVclControl() && isValid() && isValidCursor();
2000-10-26 13:46:14 +00:00
// aReturn.bEnabled &= getDefinition() && !getDefinition()->GetDatabase()->IsReadOnly();
break;
case ID_BROWSER_EDITDOC:
aReturn = SbaXDataBrowserController::GetState(nId);
// aReturn.bEnabled &= !getDefinition()->IsLocked();
// somebody is modifying the definition -> no edit mode
break;
2001-01-09 14:52:33 +00:00
case ID_BROWSER_CLOSE:
aReturn.bEnabled = sal_True;
break;
2000-10-26 13:46:14 +00:00
default:
return SbaXDataBrowserController::GetState(nId);
}
}
catch(Exception& e)
{
#if DBG_UTIL
String sMessage("SbaXDataBrowserController::GetState(", RTL_TEXTENCODING_ASCII_US);
sMessage += String::CreateFromInt32(nId);
sMessage.AppendAscii(") : catched an exception ! message : ");
sMessage += (const sal_Unicode*)e.Message;
DBG_ERROR(ByteString(sMessage, gsl_getSystemTextEncoding()).GetBuffer());
#else
e; // make compiler happy
#endif
}
;
return aReturn;
}
//------------------------------------------------------------------------------
void SbaTableQueryBrowser::Execute(sal_uInt16 nId)
{
switch (nId)
{
2000-12-08 20:16:38 +00:00
case ID_BROWSER_EXPLORER:
toggleExplorer();
break;
2000-10-26 13:46:14 +00:00
case ID_BROWSER_EDITDOC:
SbaXDataBrowserController::Execute(nId);
break;
case ID_BROWSER_INSERTCOLUMNS:
case ID_BROWSER_INSERTCONTENT:
case ID_BROWSER_FORMLETTER:
2001-01-09 14:52:33 +00:00
if (getBrowserView() && isValidCursor())
2000-10-26 13:46:14 +00:00
{
// the URL the slot id is assigned to
URL aParentUrl = getURLForId(nId);
2000-10-26 13:46:14 +00:00
// let the dispatcher execute the slot
Reference< XDispatch > xDispatch(m_aDispatchers[nId]);
if (xDispatch.is())
2000-10-26 13:46:14 +00:00
{
// set the properties for the dispatch
// first fill the selection
2001-01-09 14:52:33 +00:00
SbaGridControl* pGrid = getBrowserView()->getVclControl();
2000-10-26 13:46:14 +00:00
MultiSelection* pSelection = (MultiSelection*)pGrid->GetSelection();
Sequence< sal_Int32 > aSelection;
2000-10-26 13:46:14 +00:00
if (pSelection != NULL)
{
aSelection.realloc(pSelection->GetSelectCount());
long nIdx = pSelection->FirstSelected();
sal_Int32 i = 0;
while (nIdx >= 0)
{
aSelection[i++] = nIdx+1;
nIdx = pSelection->NextSelected();
}
}
Reference< XResultSet > xCursorClone;
try
{
Reference< XResultSetAccess > xResultSetAccess(getRowSet(),UNO_QUERY);
if (xResultSetAccess.is())
xCursorClone = xResultSetAccess->createResultSet();
}
2001-01-09 14:52:33 +00:00
catch(DisposedException&)
{
OSL_ENSURE(0,"Object already disposed!");
}
catch(Exception&)
{
DBG_ERROR("SbaTableQueryBrowser::Execute(ID_BROWSER_?): could not clone the cursor!");
}
2000-10-26 13:46:14 +00:00
Reference<XPropertySet> xProp(getRowSet(),UNO_QUERY);
2000-10-26 13:46:14 +00:00
try
{
Sequence< PropertyValue> aProps(5);
aProps[0] = PropertyValue(PROPERTY_DATASOURCENAME, -1, xProp->getPropertyValue(PROPERTY_DATASOURCENAME), PropertyState_DIRECT_VALUE);
aProps[1] = PropertyValue(PROPERTY_COMMAND, -1, xProp->getPropertyValue(PROPERTY_COMMAND), PropertyState_DIRECT_VALUE);
aProps[2] = PropertyValue(PROPERTY_COMMANDTYPE, -1, xProp->getPropertyValue(PROPERTY_COMMANDTYPE), PropertyState_DIRECT_VALUE);
aProps[3] = PropertyValue(::rtl::OUString::createFromAscii("Selection"), -1, makeAny(aSelection), PropertyState_DIRECT_VALUE);
aProps[4] = PropertyValue(::rtl::OUString::createFromAscii("Cursor"), -1, makeAny(xCursorClone), PropertyState_DIRECT_VALUE);
xDispatch->dispatch(aParentUrl, aProps);
}
catch(Exception&)
{
DBG_ERROR("SbaTableQueryBrowser::Execute(ID_BROWSER_?): could not dispatch the slot (caught an exception)!");
}
2000-10-26 13:46:14 +00:00
}
}
break;
2001-01-09 14:52:33 +00:00
case ID_BROWSER_CLOSE:
{
Reference<XComponent> xComp(m_xCurrentFrame,UNO_QUERY);
::comphelper::disposeComponent(xComp);
}
break;
2000-10-26 13:46:14 +00:00
default:
SbaXDataBrowserController::Execute(nId);
break;
}
}
// -------------------------------------------------------------------------
void SbaTableQueryBrowser::implAddDatasource(const String& _rDbName, Image& _rDbImage,
String& _rQueryName, Image& _rQueryImage, String& _rTableName, Image& _rTableImage)
{
// initialize the names/images if necessary
if (!_rQueryName.Len())
_rQueryName = String(ModuleRes(RID_STR_QUERIES_CONTAINER));
if (!_rTableName.Len())
_rTableName = String(ModuleRes(RID_STR_TABLES_CONTAINER));
if (!_rQueryImage)
_rQueryImage = Image(ModuleRes(QUERYFOLDER_TREE_ICON));
if (!_rTableImage)
_rTableImage = Image(ModuleRes(TABLEFOLDER_TREE_ICON));
if (!_rDbImage)
_rDbImage = Image(ModuleRes(IMG_DATABASE));
// add the entry for the data source
SvLBoxEntry* pDatasourceEntry = m_pTreeView->getListBox()->InsertEntry(_rDbName, _rDbImage, _rDbImage, NULL, sal_False);
pDatasourceEntry->SetUserData(new DBTreeListModel::DBTreeListUserData);
// the child for the queries container
SvLBoxEntry* pQueries = m_pTreeView->getListBox()->InsertEntry(_rQueryName, _rQueryImage, _rQueryImage, pDatasourceEntry, sal_True);
DBTreeListModel::DBTreeListUserData* pQueriesData = new DBTreeListModel::DBTreeListUserData;
pQueriesData->bTable = sal_False;
pQueries->SetUserData(pQueriesData);
// the child for the tables container
SvLBoxEntry* pTables = m_pTreeView->getListBox()->InsertEntry(_rTableName, _rTableImage, _rTableImage, pDatasourceEntry, sal_True);
DBTreeListModel::DBTreeListUserData* pTablesData = new DBTreeListModel::DBTreeListUserData;
pTablesData->bTable = sal_True;
pTables->SetUserData(pTablesData);
}
// -------------------------------------------------------------------------
void SbaTableQueryBrowser::initializeTreeModel()
{
if (m_xDatabaseContext.is())
{
Image aDBImage, aQueriesImage, aTablesImage;
String sQueriesName, sTablesName;
// fill the model with the names of the registered datasources
Sequence< ::rtl::OUString > aDatasources = m_xDatabaseContext->getElementNames();
const ::rtl::OUString* pBegin = aDatasources.getConstArray();
const ::rtl::OUString* pEnd = pBegin + aDatasources.getLength();
for (; pBegin != pEnd; ++pBegin)
implAddDatasource(*pBegin, aDBImage, sQueriesName, aQueriesImage, sTablesName, aTablesImage);
}
}
// -------------------------------------------------------------------------
sal_Bool SbaTableQueryBrowser::populateTree(const Reference<XNameAccess>& _xNameAccess, SvLBoxEntry* _pParent, const Image& _rImage)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(_pParent->GetUserData());
if(pData)
pData->xObject = _xNameAccess;
try
{
Sequence< ::rtl::OUString > aNames = _xNameAccess->getElementNames();
const ::rtl::OUString* pBegin = aNames.getConstArray();
const ::rtl::OUString* pEnd = pBegin + aNames.getLength();
for (; pBegin != pEnd; ++pBegin)
m_pTreeView->getListBox()->InsertEntry(*pBegin, _rImage, _rImage, _pParent, sal_False);
}
catch(Exception&)
{
DBG_ERROR("SbaTableQueryBrowser::populateTree: could not fill the tree");
return sal_False;
}
return sal_True;
}
//------------------------------------------------------------------------------
IMPL_LINK(SbaTableQueryBrowser, OnListContextMenu, const CommandEvent*, _pEvent)
{
PopupMenu aContextMenu(ModuleRes(MENU_BROWSERTREE_CONTEXT));
Point aPosition;
SvLBoxEntry* pEntry = NULL;
SvLBoxEntry* pOldSelection = NULL;
if (_pEvent->IsMouseEvent())
{
aPosition = _pEvent->GetMousePosPixel();
// ensure that the entry which the user clicked at is selected
pEntry = m_pTreeView->getListBox()->GetEntry(aPosition);
OSL_ENSURE(pEntry,"No current entry!");
if (pEntry && !m_pTreeView->getListBox()->IsSelected(pEntry))
{
pOldSelection = m_pTreeView->getListBox()->FirstSelected();
m_pTreeView->getListBox()->Select(pEntry);
}
}
else
{
// use the center of the current entry
pEntry = m_pTreeView->getListBox()->GetCurEntry();
OSL_ENSURE(pEntry,"No current entry!");
aPosition = m_pTreeView->getListBox()->GetEntryPos(pEntry);
aPosition.X() += m_pTreeView->getListBox()->GetOutputSizePixel().Width() / 2;
aPosition.Y() += m_pTreeView->getListBox()->GetEntryHeight() / 2;
}
// disable entries according to the currently selected entry
// does the datasource which the selected entry belongs to has an open connection ?
2001-01-09 14:52:33 +00:00
SvLBoxEntry* pDSEntry = m_pTreeView->getListBox()->GetRootLevelParent(pEntry);
DBTreeListModel::DBTreeListUserData* pDSData =
pDSEntry
? static_cast<DBTreeListModel::DBTreeListUserData*>(pDSEntry->GetUserData())
: NULL;
if (!pDSData || !pDSData->xObject.is())
{ // no -> disable the connection-related menu entries
aContextMenu.EnableItem(ID_TREE_CLOSE_CONN, sal_False);
aContextMenu.EnableItem(ID_TREE_REBUILD_CONN, sal_False);
}
2001-01-09 14:52:33 +00:00
// enable menu entries
if(pEntry)
{
SvLBoxEntry* pTemp = m_pTreeView->getListBox()->GetParent(pEntry);
2001-02-14 13:37:35 +00:00
// 1. for tables
SvLBoxEntry* pTables = m_pTreeView->getListBox()->GetEntry(pDSEntry,1);
2001-02-16 15:00:13 +00:00
2001-02-14 13:37:35 +00:00
aContextMenu.EnableItem(ID_TREE_TABLE_CREATE_DESIGN, (pTables == pEntry || pTables == pTemp));
2001-02-16 15:00:13 +00:00
sal_Bool bPasteAble = (pTables == pEntry || pTables == pTemp);
if(bPasteAble)
{
TransferableDataHelper aTransferData(TransferableDataHelper::CreateFromSystemClipboard());
bPasteAble = aTransferData.HasFormat(SOT_FORMATSTR_ID_SBA_DATAEXCHANGE);
}
aContextMenu.EnableItem(ID_TREE_TABLE_PASTE, bPasteAble);
aContextMenu.EnableItem(ID_TREE_TABLE_EDIT, (pTables != pEntry && pTables == pTemp));
aContextMenu.EnableItem(ID_TREE_TABLE_DELETE, (pTables != pEntry && pTables == pTemp));
aContextMenu.EnableItem(ID_TREE_TABLE_COPY, (pTables != pEntry && pTables == pTemp));
2001-02-14 13:37:35 +00:00
// 2. for queries
2001-01-09 14:52:33 +00:00
SvLBoxEntry* pQueries = m_pTreeView->getListBox()->GetEntry(pDSEntry,0);
2001-02-05 08:50:37 +00:00
aContextMenu.EnableItem(ID_TREE_QUERY_CREATE_DESIGN, (pQueries == pEntry || pQueries == pTemp));
aContextMenu.EnableItem(ID_TREE_QUERY_CREATE_TEXT, (pQueries == pEntry || pQueries == pTemp));
2001-02-16 15:00:13 +00:00
aContextMenu.EnableItem(ID_TREE_QUERY_EDIT, (pQueries != pEntry && pQueries == pTemp));
aContextMenu.EnableItem(ID_TREE_QUERY_DELETE, (pQueries != pEntry && pQueries == pTemp));
aContextMenu.EnableItem(ID_TREE_QUERY_COPY, (pQueries != pEntry && pQueries == pTemp));
2001-01-09 14:52:33 +00:00
}
// rebuild conn not implemented yet
aContextMenu.EnableItem(ID_TREE_REBUILD_CONN, sal_False);
if (!m_xMultiServiceFacatory.is())
// no ORB -> no administration dialog
aContextMenu.EnableItem(ID_TREE_ADMINISTRATE, sal_False);
// no disabled entries
aContextMenu.RemoveDisabledEntries();
sal_Bool bReopenConn = sal_False;
2001-01-09 14:52:33 +00:00
USHORT nPos = aContextMenu.Execute(m_pTreeView->getListBox(), aPosition);
// restore the old selection
if (pOldSelection)
m_pTreeView->getListBox()->Select(pOldSelection);
2001-01-09 14:52:33 +00:00
switch (nPos)
{
case ID_TREE_ADMINISTRATE:
try
{
// the parameters:
Sequence< Any > aArgs(2);
// the parent window
aArgs[0] <<= PropertyValue(
::rtl::OUString::createFromAscii("ParentWindow"), 0,
makeAny(VCLUnoHelper::GetInterface(m_pTreeView->getListBox()->Window::GetParent())), PropertyState_DIRECT_VALUE);
// the initial selection
SvLBoxEntry* pTopLevelSelected = m_pTreeView->getListBox()->GetCurEntry();
while (pTopLevelSelected && m_pTreeView->getListBox()->GetParent(pTopLevelSelected))
pTopLevelSelected = m_pTreeView->getListBox()->GetParent(pTopLevelSelected);
::rtl::OUString sInitialSelection;
if (pTopLevelSelected)
sInitialSelection = m_pTreeView->getListBox()->GetEntryText(pTopLevelSelected);
aArgs[1] <<= PropertyValue(
::rtl::OUString::createFromAscii("InitialSelection"), 0,
makeAny(sInitialSelection), PropertyState_DIRECT_VALUE);
// create the dialog
Reference< XExecutableDialog > xAdminDialog;
xAdminDialog = Reference< XExecutableDialog >(
m_xMultiServiceFacatory->createInstanceWithArguments(::rtl::OUString::createFromAscii("com.sun.star.sdb.DatasourceAdministrationDialog"),
aArgs), UNO_QUERY);
// execute it
if (xAdminDialog.is())
xAdminDialog->execute();
}
catch(::com::sun::star::uno::Exception&)
{
}
break;
case ID_TREE_REBUILD_CONN:
bReopenConn = sal_True;
case ID_TREE_CLOSE_CONN:
{
closeConnection(pDSEntry);
}
2001-01-09 14:52:33 +00:00
break;
2001-02-14 13:37:35 +00:00
case ID_TREE_TABLE_CREATE_DESIGN:
2001-02-05 08:50:37 +00:00
case ID_TREE_QUERY_CREATE_DESIGN:
case ID_TREE_QUERY_CREATE_TEXT:
2001-01-09 14:52:33 +00:00
case ID_TREE_QUERY_EDIT:
2001-02-14 13:37:35 +00:00
case ID_TREE_TABLE_EDIT:
2001-01-09 14:52:33 +00:00
{
::osl::MutexGuard aGuard(m_aEntryMutex);
2001-02-14 13:37:35 +00:00
// get all needed properties for design
2001-01-09 14:52:33 +00:00
Reference<XConnection> xConnection; // supports the service sdb::connection
2001-02-16 15:00:13 +00:00
if(!secureConnection(pDSEntry,pDSData,xConnection))
break;
2001-02-14 13:37:35 +00:00
::rtl::OUString sCurrentObject;
if ((ID_TREE_QUERY_EDIT == nPos || ID_TREE_TABLE_EDIT == nPos) && pEntry)
2001-01-09 14:52:33 +00:00
{
// get the name of the query
2001-01-30 07:32:01 +00:00
SvLBoxItem* pQueryTextItem = pEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING);
if (pQueryTextItem)
2001-02-14 13:37:35 +00:00
sCurrentObject = static_cast<SvLBoxString*>(pQueryTextItem)->GetText();
2001-01-09 14:52:33 +00:00
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(pEntry->GetUserData());
if(!pData)
2001-01-09 14:52:33 +00:00
{
// the query has not been accessed before -> create it's user data
pData = new DBTreeListModel::DBTreeListUserData;
pData->bTable = sal_False;
2001-01-09 14:52:33 +00:00
Reference<XNameAccess> xNameAccess;
2001-02-14 13:37:35 +00:00
if(ID_TREE_TABLE_EDIT == nPos)
{
Reference<XTablesSupplier> xSup(xConnection,UNO_QUERY);
if(xSup.is())
xNameAccess = xSup->getTables();
}
else
{
Reference<XQueriesSupplier> xSup(xConnection,UNO_QUERY);
if(xSup.is())
xNameAccess = xSup->getQueries();
}
2001-01-30 07:32:01 +00:00
SvLBoxItem* pTextItem = pEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING);
if (pTextItem)
2001-02-14 13:37:35 +00:00
sCurrentObject = static_cast<SvLBoxString*>(pTextItem)->GetText();
2001-01-09 14:52:33 +00:00
2001-02-14 13:37:35 +00:00
if(xNameAccess.is() && xNameAccess->hasByName(sCurrentObject) &&
::cppu::extractInterface(pData->xObject,xNameAccess->getByName(sCurrentObject))) // remember the table or query object
pEntry->SetUserData(pData);
else
{
delete pData;
pData = NULL;
2001-01-09 14:52:33 +00:00
}
}
}
2001-02-14 13:37:35 +00:00
ODesignAccess* pDispatcher = NULL;
sal_Bool bEdit = sal_False;
switch(nPos)
{
case ID_TREE_TABLE_EDIT:
bEdit = sal_True; // run through
case ID_TREE_TABLE_CREATE_DESIGN:
pDispatcher = new OTableDesignAccess(m_xMultiServiceFacatory) ;
break;
case ID_TREE_QUERY_EDIT:
bEdit = sal_True; // run through
case ID_TREE_QUERY_CREATE_DESIGN:
case ID_TREE_QUERY_CREATE_TEXT:
pDispatcher = new OQueryDesignAccess(m_xMultiServiceFacatory) ;
break;
}
2001-02-16 15:00:13 +00:00
::rtl::OUString aDSName;
SvLBoxItem* pTextItem = pDSEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING);
if (pTextItem)
aDSName = static_cast<SvLBoxString*>(pTextItem)->GetText();
2001-02-14 13:37:35 +00:00
if (bEdit)
pDispatcher->edit(aDSName, sCurrentObject, xConnection);
else
2001-02-14 13:37:35 +00:00
pDispatcher->create(aDSName, xConnection,nPos == ID_TREE_QUERY_CREATE_DESIGN);
2001-01-09 14:52:33 +00:00
}
break;
case ID_TREE_QUERY_DELETE:
if(pDSEntry)
{
if(QueryBox(getBrowserView()->getVclControl(),ModuleRes(QUERY_BRW_DELETE_QUERY)).Execute() == RET_YES)
{
Reference<XQueryDefinitionsSupplier> xSet;
try
{
::rtl::OUString aName;
2001-01-30 07:32:01 +00:00
SvLBoxItem* pTextItem = pDSEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING);
2001-01-09 14:52:33 +00:00
if (pTextItem)
aName = static_cast<SvLBoxString*>(pTextItem)->GetText();
2001-02-14 13:37:35 +00:00
::cppu::extractInterface(xSet,m_xDatabaseContext->getByName(aName));
2001-01-09 14:52:33 +00:00
}
catch(Exception&)
{ }
if(xSet.is())
{
Reference<XNameContainer> xNames(xSet->getQueryDefinitions(),UNO_QUERY);
if(xNames.is())
{
try
{
2001-01-30 07:32:01 +00:00
SvLBoxItem* pTextItem = pEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING);
2001-01-09 14:52:33 +00:00
if (pTextItem)
xNames->removeByName(static_cast<SvLBoxString*>(pTextItem)->GetText().GetBuffer());
}
catch(Exception&)
{
}
}
}
}
}
break;
2001-02-14 13:37:35 +00:00
case ID_TREE_TABLE_DELETE:
2001-02-16 15:00:13 +00:00
case ID_TREE_TABLE_COPY:
2001-02-14 13:37:35 +00:00
{
::osl::MutexGuard aGuard(m_aEntryMutex);
Reference<XConnection> xConnection; // supports the service sdb::connection
2001-02-16 15:00:13 +00:00
if(!secureConnection(pDSEntry,pDSData,xConnection))
2001-02-14 13:37:35 +00:00
break;
2001-02-16 15:00:13 +00:00
// get all needed properties for design
2001-02-14 13:37:35 +00:00
Reference<XTablesSupplier> xSup(xConnection,UNO_QUERY);
OSL_ENSURE(xSup.is(),"NO XTablesSuppier!");
2001-02-16 15:00:13 +00:00
::rtl::OUString aName;
SvLBoxItem* pTextItem = pEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING);
if (pTextItem)
aName = static_cast<SvLBoxString*>(pTextItem)->GetText();
if(ID_TREE_TABLE_DELETE == nPos)
2001-02-14 13:37:35 +00:00
{
2001-02-16 15:00:13 +00:00
Reference<XDrop> xDrop(xSup,UNO_QUERY);
if(xDrop.is() && QueryBox(getBrowserView()->getVclControl(),ModuleRes(QUERY_BRW_DELETE_TABLE)).Execute() == RET_YES)
2001-02-14 13:37:35 +00:00
{
2001-02-16 15:00:13 +00:00
try
{
if(aName.getLength())
xDrop->dropByName(aName);
}
catch(SQLException& e)
{
showError(SQLExceptionInfo(e));
}
catch(Exception&)
{
}
2001-02-14 13:37:35 +00:00
}
2001-02-16 15:00:13 +00:00
}
else
{
Reference<XNameAccess> xTables = xSup->getTables();
if(xTables.is() && xTables->hasByName(aName))
2001-02-14 13:37:35 +00:00
{
2001-02-16 15:00:13 +00:00
Reference<XPropertySet> xTable;
xTables->getByName(aName) >>= xTable;
if(xTable.is())
{
::std::auto_ptr<ORTFImportExport> pRtf(new ORTFImportExport(xTable,xConnection,getORB(),getNumberFormatter()));
::std::auto_ptr<OHTMLImportExport> pHtml(new OHTMLImportExport(xTable,xConnection,getORB(),getNumberFormatter()));
// the owner ship goes to ODataClipboard
ODataClipboard* pData = new ODataClipboard(pHtml,pRtf);
Reference< ::com::sun::star::datatransfer::XTransferable> xRef = pData;
pData->CopyToClipboard();
}
2001-02-14 13:37:35 +00:00
}
2001-02-16 15:00:13 +00:00
}
}
break;
case ID_TREE_QUERY_COPY:
{
::osl::MutexGuard aGuard(m_aEntryMutex);
Reference<XConnection> xConnection; // supports the service sdb::connection
if(!secureConnection(pDSEntry,pDSData,xConnection))
break;
Reference<XQueriesSupplier> xSup(xConnection,UNO_QUERY);
OSL_ENSURE(xSup.is(),"NO XQueriesSupplier!");
::rtl::OUString aName;
SvLBoxItem* pTextItem = pEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING);
if (pTextItem)
aName = static_cast<SvLBoxString*>(pTextItem)->GetText();
Reference<XNameAccess> xQueries = xSup->getQueries();
if(xQueries.is() && xQueries->hasByName(aName))
{
Reference<XPropertySet> xQuery;
xQueries->getByName(aName) >>= xQuery;
if(xQuery.is())
{
::std::auto_ptr<ORTFImportExport> pRtf(new ORTFImportExport(xQuery,xConnection,getORB(),getNumberFormatter()));
::std::auto_ptr<OHTMLImportExport> pHtml(new OHTMLImportExport(xQuery,xConnection,getORB(),getNumberFormatter()));
// the owner ship goes to ODataClipboard
ODataClipboard* pData = new ODataClipboard(pHtml,pRtf);
Reference< ::com::sun::star::datatransfer::XTransferable> xRef = pData;
pData->CopyToClipboard();
}
}
}
break;
case ID_TREE_TABLE_PASTE:
{
TransferableDataHelper aTransferData(TransferableDataHelper::CreateFromSystemClipboard());
if(aTransferData.HasFormat(SOT_FORMATSTR_ID_SBA_DATAEXCHANGE))
{
::com::sun::star::datatransfer::DataFlavor aFlavor;
SotExchange::GetFormatDataFlavor(SOT_FORMATSTR_ID_SBA_DATAEXCHANGE,aFlavor);
Sequence<PropertyValue> aSeq;
aTransferData.GetAny(aFlavor) >>= aSeq;
if(aSeq.getLength())
2001-02-14 13:37:35 +00:00
{
}
}
}
break;
}
return 1L; // handled
}
//------------------------------------------------------------------------------
IMPL_LINK(SbaTableQueryBrowser, OnExpandEntry, SvLBoxEntry*, _pParent)
{
if (_pParent->HasChilds())
// nothing to to ...
return 1L;
2001-01-09 14:52:33 +00:00
::osl::MutexGuard aGuard(m_aEntryMutex);
SvLBoxEntry* pFirstParent = m_pTreeView->getListBox()->GetRootLevelParent(_pParent);
OSL_ENSHURE(pFirstParent,"SbaTableQueryBrowser::OnExpandEntry: No rootlevelparent!");
DBTreeListModel::DBTreeListUserData* pData = static_cast< DBTreeListModel::DBTreeListUserData* >(_pParent->GetUserData());
OSL_ENSHURE(pData,"SbaTableQueryBrowser::OnExpandEntry: No user data!");
2001-01-30 07:32:01 +00:00
SvLBoxString* pString = static_cast<SvLBoxString*>(pFirstParent->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING));
OSL_ENSHURE(pString,"SbaTableQueryBrowser::OnExpandEntry: No string item!");
2001-01-09 14:52:33 +00:00
if(pData->bTable)
{
2001-01-09 14:52:33 +00:00
// it could be that we already have a connection
DBTreeListModel::DBTreeListUserData* pFirstData = static_cast<DBTreeListModel::DBTreeListUserData*>(pFirstParent->GetUserData());
Reference<XConnection> xConnection(pFirstData->xObject,UNO_QUERY);
if(!pFirstData->xObject.is())
2000-12-08 20:16:38 +00:00
{
WaitObject aWaitCursor(getBrowserView());
2001-01-09 14:52:33 +00:00
xConnection = connect(pString->GetText());
pFirstData->xObject = xConnection;
2000-12-08 20:16:38 +00:00
}
2001-01-09 14:52:33 +00:00
if(xConnection.is())
{
2001-01-09 14:52:33 +00:00
Reference<XTablesSupplier> xTabSup(xConnection,UNO_QUERY);
if(xTabSup.is())
{
2001-01-09 14:52:33 +00:00
Image aImage(ModuleRes(TABLE_TREE_ICON));
populateTree(xTabSup->getTables(),_pParent,aImage);
2001-02-14 13:37:35 +00:00
Reference<XContainer> xCont(xTabSup->getTables(),UNO_QUERY);
if(xCont.is())
// add as listener to know when elements are inserted or removed
xCont->addContainerListener(this);
}
2001-01-09 14:52:33 +00:00
Reference<XViewsSupplier> xViewSup(xConnection,UNO_QUERY);
if(xViewSup.is())
{
2001-01-09 14:52:33 +00:00
Image aImage(ModuleRes(VIEW_TREE_ICON));
populateTree(xViewSup->getViews(),_pParent,aImage);
2001-02-14 13:37:35 +00:00
Reference<XContainer> xCont(xViewSup->getViews(),UNO_QUERY);
if(xCont.is())
// add as listener to know when elements are inserted or removed
xCont->addContainerListener(this);
}
}
else
return 0L;
// 0 indicates that an error occured
}
else // we have to expand the queries
{
2001-01-09 14:52:33 +00:00
Any aValue;
try
{
aValue = m_xDatabaseContext->getByName(pString->GetText());
}
catch(Exception&)
{ }
Reference<XQueryDefinitionsSupplier> xQuerySup;
2001-02-14 13:37:35 +00:00
if(::cppu::extractInterface(xQuerySup,aValue) && xQuerySup.is())
{
Image aImage(ModuleRes(QUERY_TREE_ICON));
2001-01-09 14:52:33 +00:00
Reference<XNameAccess> xNames = xQuerySup->getQueryDefinitions();
Reference<XContainer> xCont(xNames,UNO_QUERY);
if(xCont.is())
{
// add as listener to know when elements are inserted or removed
xCont->addContainerListener(this);
// remember the the nameaccess for elementRemoved or elementInserted
if(!pData->xObject.is())
pData->xObject = xCont;
}
populateTree(xNames,_pParent,aImage);
}
}
return 1L;
}
//------------------------------------------------------------------------------
sal_Bool SbaTableQueryBrowser::isSelected(SvLBoxEntry* _pEntry) const
{
2001-01-30 07:32:01 +00:00
SvLBoxItem* pTextItem = _pEntry ? _pEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING) : NULL;
if (pTextItem)
2001-01-30 07:32:01 +00:00
return static_cast<OBoldListboxString*>(pTextItem)->isEmphasized();
else
DBG_ERROR("SbaTableQueryBrowser::isSelected: invalid entry!");
return sal_False;
}
//------------------------------------------------------------------------------
void SbaTableQueryBrowser::select(SvLBoxEntry* _pEntry, sal_Bool _bSelect)
{
2001-01-30 07:32:01 +00:00
SvLBoxItem* pTextItem = _pEntry ? _pEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING) : NULL;
if (pTextItem)
{
2001-01-30 07:32:01 +00:00
static_cast<OBoldListboxString*>(pTextItem)->emphasize(_bSelect);
m_pTreeModel->InvalidateEntry(_pEntry);
}
else
DBG_ERROR("SbaTableQueryBrowser::select: invalid entry!");
}
//------------------------------------------------------------------------------
void SbaTableQueryBrowser::selectPath(SvLBoxEntry* _pEntry, sal_Bool _bSelect)
{
while (_pEntry)
{
select(_pEntry, _bSelect);
_pEntry = m_pTreeModel->GetParent(_pEntry);
}
}
2000-10-26 13:46:14 +00:00
//------------------------------------------------------------------------------
IMPL_LINK(SbaTableQueryBrowser, OnSelectEntry, SvLBoxEntry*, _pEntry)
{
2001-01-09 14:52:33 +00:00
::osl::MutexGuard aGuard(m_aEntryMutex);
2000-10-26 13:46:14 +00:00
// reinitialize the rowset
// but first check if it is necessary
2001-01-09 14:52:33 +00:00
// get all old properties
2000-10-26 13:46:14 +00:00
Reference<XPropertySet> xProp(getRowSet(),UNO_QUERY);
::rtl::OUString aOldName;
xProp->getPropertyValue(PROPERTY_COMMAND) >>= aOldName;
sal_Int32 nOldType;
xProp->getPropertyValue(PROPERTY_COMMANDTYPE) >>= nOldType;
Reference<XConnection> xOldConnection;
2001-02-14 13:37:35 +00:00
::cppu::extractInterface(xOldConnection,xProp->getPropertyValue(PROPERTY_ACTIVECONNECTION));
2000-10-26 13:46:14 +00:00
// the name of the table or query
2001-01-30 07:32:01 +00:00
SvLBoxString* pString = (SvLBoxString*)_pEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING);
2001-01-09 14:52:33 +00:00
OSL_ENSURE(pString,"There must be a string item!");
2000-10-26 13:46:14 +00:00
::rtl::OUString aName(pString->GetText().GetBuffer());
2001-01-09 14:52:33 +00:00
// get the entry for the tables or queries
2000-10-26 13:46:14 +00:00
SvLBoxEntry* pTables = m_pTreeModel->GetParent(_pEntry);
2001-01-09 14:52:33 +00:00
DBTreeListModel::DBTreeListUserData* pTablesData = static_cast<DBTreeListModel::DBTreeListUserData*>(pTables->GetUserData());
// get the entry for the datasource
2000-10-26 13:46:14 +00:00
SvLBoxEntry* pConnection = m_pTreeModel->GetParent(pTables);
2001-01-09 14:52:33 +00:00
DBTreeListModel::DBTreeListUserData* pConData = static_cast<DBTreeListModel::DBTreeListUserData*>(pConnection->GetUserData());
2000-10-26 13:46:14 +00:00
Reference<XConnection> xConnection(pConData->xObject,UNO_QUERY);
2001-01-09 14:52:33 +00:00
sal_Int32 nCommandType = pTablesData->bTable ? CommandType::TABLE : CommandType::QUERY;
2000-10-26 13:46:14 +00:00
2001-01-09 14:52:33 +00:00
// check if need to rebuild the rowset
2000-10-26 13:46:14 +00:00
sal_Bool bRebuild = xOldConnection != xConnection || nOldType != nCommandType || aName != aOldName;
Reference< ::com::sun::star::form::XLoadable > xLoadable(getRowSet(),UNO_QUERY);
bRebuild |= !xLoadable->isLoaded();
2000-10-26 13:46:14 +00:00
if(bRebuild)
{
2001-01-09 14:52:33 +00:00
try
{
2001-01-09 14:52:33 +00:00
// if table was selected before flush it
if(m_pCurrentlyDisplayed)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
Reference<XFlushable> xFlush(pData->xObject,UNO_QUERY);
if(xFlush.is())
xFlush->flush();
}
2001-01-09 14:52:33 +00:00
WaitObject aWaitCursor(getBrowserView());
// tell the old entry it has been deselected
selectPath(m_pCurrentlyDisplayed, sal_False);
m_pCurrentlyDisplayed = _pEntry;
// tell the new entry it has been selected
selectPath(m_pCurrentlyDisplayed, sal_True);
// get the name of the data source currently selected
::rtl::OUString sDataSourceName;
SvLBoxEntry* pEntry = m_pTreeView->getListBox()->GetRootLevelParent(m_pCurrentlyDisplayed);
if (pEntry)
{
2001-01-30 07:32:01 +00:00
SvLBoxItem* pTextItem = pEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING);
2001-01-09 14:52:33 +00:00
if (pTextItem)
sDataSourceName = static_cast<SvLBoxString*>(pTextItem)->GetText();
}
if(!xConnection.is())
{
xConnection = connect(sDataSourceName);
pConData->xObject = xConnection;
}
2001-02-06 08:43:00 +00:00
if(!xConnection.is())
{
unloadForm(sal_False,sal_False);
return 0L;
}
2001-01-09 14:52:33 +00:00
Reference<XNameAccess> xNameAccess;
switch(nCommandType)
{
case CommandType::TABLE:
{
// only for tables
if(!pTablesData->xObject.is())
{
Reference<XTablesSupplier> xSup(xConnection,UNO_QUERY);
if(xSup.is())
xNameAccess = xSup->getTables();
2001-01-09 14:52:33 +00:00
pTablesData->xObject = xNameAccess;
}
else
xNameAccess = Reference<XNameAccess>(pTablesData->xObject,UNO_QUERY);
}
break;
case CommandType::QUERY:
{
Reference<XQueriesSupplier> xSup(xConnection,UNO_QUERY);
if(xSup.is())
xNameAccess = xSup->getQueries();
}
break;
}
2001-01-09 14:52:33 +00:00
if(xNameAccess.is() && xNameAccess->hasByName(aName))
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
if(!pData)
{
DBTreeListModel::DBTreeListUserData* pTableData = new DBTreeListModel::DBTreeListUserData;
pTableData->bTable = pTablesData->bTable;
if(xNameAccess->getByName(aName) >>= pTableData->xObject) // remember the table or query object
m_pCurrentlyDisplayed->SetUserData(pTableData);
else
delete pTableData;
}
}
// the values allowing the RowSet to re-execute
xProp->setPropertyValue(PROPERTY_DATASOURCENAME,makeAny(sDataSourceName));
// set this _before_ setting the connection, else the rowset would rebuild it ...
xProp->setPropertyValue(PROPERTY_ACTIVECONNECTION,makeAny(xConnection));
xProp->setPropertyValue(PROPERTY_COMMANDTYPE,makeAny(nCommandType));
xProp->setPropertyValue(PROPERTY_COMMAND,makeAny(aName));
// the formatter depends on the data source we're working on, so rebuild it here ...
initFormatter();
// switch the grid to design mode while loading
getBrowserView()->getGridControl()->setDesignMode(sal_True);
InitializeForm(getRowSet());
2001-01-09 14:52:33 +00:00
// load the row set
{
FormErrorHelper aNoticeErrors(this);
if (xLoadable->isLoaded())
// reload does not work if not already loaded
xLoadable->reload();
else
xLoadable->load();
sal_Bool bLoadSuccess = !errorOccured();
// initialize the model
InitializeGridModel(getFormComponent());
// reload ...
// TODO: why this reload ... me thinks the GridModel can't handle beeing initialized when the form
// is already loaded, but I'm not sure ...
// have to change this, reloading is much too expensive ...
if (xLoadable->isLoaded() && bLoadSuccess)
xLoadable->reload();
FormLoaded(sal_True);
}
2001-01-09 14:52:33 +00:00
}
catch(Exception&)
{
// reset the values
xProp->setPropertyValue(PROPERTY_DATASOURCENAME,Any());
xProp->setPropertyValue(PROPERTY_ACTIVECONNECTION,Any());
}
2000-10-26 13:46:14 +00:00
}
return 0L;
}
2001-01-09 14:52:33 +00:00
// -----------------------------------------------------------------------------
SvLBoxEntry* SbaTableQueryBrowser::getNameAccessFromEntry(const Reference<XNameAccess>& _rxNameAccess)
{
SvLBoxEntry* pDSLoop = m_pTreeView->getListBox()->FirstChild(NULL);
SvLBoxEntry* pContainer = NULL;
while (pDSLoop)
{
pContainer = m_pTreeView->getListBox()->GetEntry(pDSLoop,0);
DBTreeListModel::DBTreeListUserData* pQueriesData = static_cast<DBTreeListModel::DBTreeListUserData*>(pContainer->GetUserData());
if(pQueriesData && pQueriesData->xObject.get() == _rxNameAccess.get())
break;
pContainer = m_pTreeView->getListBox()->GetEntry(pDSLoop,1);
DBTreeListModel::DBTreeListUserData* pTablesData = static_cast<DBTreeListModel::DBTreeListUserData*>(pContainer->GetUserData());
if(pTablesData && pTablesData->xObject.get() == _rxNameAccess.get())
break;
2001-01-09 14:52:33 +00:00
pDSLoop = m_pTreeView->getListBox()->NextSibling(pDSLoop);
pContainer = NULL;
}
return pContainer;
}
// -------------------------------------------------------------------------
void SAL_CALL SbaTableQueryBrowser::elementInserted( const ContainerEvent& _rEvent ) throw(RuntimeException)
{
2001-01-09 14:52:33 +00:00
Reference< XNameAccess > xNames(_rEvent.Source, UNO_QUERY);
// first search for a definition container where we can insert this element
SvLBoxEntry* pEntry = getNameAccessFromEntry(xNames);
if(pEntry) // found one
{
// insert the new entry into the tree
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(pEntry->GetUserData());
OSL_ENSURE(pData,"elementInserted: There must be user data for this type!");
Image aImage(ModuleRes(pData->bTable ? TABLE_TREE_ICON : QUERY_TREE_ICON));
SvLBoxEntry* pNewEntry = m_pTreeView->getListBox()->InsertEntry(::comphelper::getString(_rEvent.Accessor),
aImage, aImage, pEntry, sal_False);
if(pData->bTable)
{ // only insert userdata when we have a table because the query is only a commanddefinition object and not a query
DBTreeListModel::DBTreeListUserData* pNewData = new DBTreeListModel::DBTreeListUserData;
pNewData->bTable = pData->bTable;
2001-02-14 13:37:35 +00:00
::cppu::extractInterface(pNewData->xObject,_rEvent.Element);// remember the new element
2001-01-09 14:52:33 +00:00
pNewEntry->SetUserData(pNewData);
}
}
else if (xNames.get() == m_xDatabaseContext.get())
{ // a new datasource has been added to the context
// the name of the new ds
::rtl::OUString sNewDS;
_rEvent.Accessor >>= sNewDS;
2001-01-09 14:52:33 +00:00
// add new entries to the list box model
Image a, b, c; // not interested in reusing them
String d, e;
implAddDatasource(sNewDS, a, d, b, e, c);
}
else
SbaXDataBrowserController::elementInserted(_rEvent);
}
// -------------------------------------------------------------------------
void SAL_CALL SbaTableQueryBrowser::elementRemoved( const ContainerEvent& _rEvent ) throw(RuntimeException)
{
2001-01-09 14:52:33 +00:00
Reference< XNameAccess > xNames(_rEvent.Source, UNO_QUERY);
// get the top-level representing the removed data source
// and search for the queries and tables
SvLBoxEntry* pEntry = getNameAccessFromEntry(xNames);
if (pEntry)
{ // a query or table has been removed
String aName = ::comphelper::getString(_rEvent.Accessor).getStr();
if (m_pCurrentlyDisplayed && m_pTreeView->getListBox()->GetEntryText(m_pCurrentlyDisplayed) == aName)
{
// we need to remember the old value
SvLBoxEntry* pTemp = m_pCurrentlyDisplayed;
// unload
unloadForm(sal_False, sal_False); // don't dispose the connection, don't flush
2001-01-09 14:52:33 +00:00
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(pTemp->GetUserData());
2001-01-26 15:11:56 +00:00
OSL_ENSURE(pData,"elementRemoved: There must be user data!");
2001-01-09 14:52:33 +00:00
delete pData;
m_pTreeModel->Remove(pTemp);
}
else
{
// remove the entry from the model
SvLBoxEntry* pChild = m_pTreeModel->FirstChild(pEntry);
while(pChild)
{
if (m_pTreeView->getListBox()->GetEntryText(pChild) == aName)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(pChild->GetUserData());
delete pData;
m_pTreeModel->Remove(pChild);
break;
}
pChild = m_pTreeModel->NextSibling(pChild);
}
}
}
else if (xNames.get() == m_xDatabaseContext.get())
{ // a datasource has been removed from the context
// the name
::rtl::OUString sNewDS;
_rEvent.Accessor >>= sNewDS;
String sNewDatasource = sNewDS;
// get the top-level representing the removed data source
SvLBoxEntry* pDSLoop = m_pTreeView->getListBox()->FirstChild(NULL);
while (pDSLoop)
{
if (m_pTreeView->getListBox()->GetEntryText(pDSLoop) == sNewDatasource)
break;
pDSLoop = m_pTreeView->getListBox()->NextSibling(pDSLoop);
}
if (pDSLoop)
{
2001-01-17 07:16:53 +00:00
if (isSelected(pDSLoop))
{ // a table or query belonging to the deleted data source is currently beeing displayed.
2001-01-23 08:48:35 +00:00
OSL_ENSURE(m_pTreeView->getListBox()->GetRootLevelParent(m_pCurrentlyDisplayed) == pDSLoop, "SbaTableQueryBrowser::elementRemoved: inconsistence (1)!");
unloadForm();
2001-01-17 07:16:53 +00:00
}
else
OSL_ENSURE(
2001-01-23 08:48:35 +00:00
(NULL == m_pCurrentlyDisplayed)
|| (m_pTreeView->getListBox()->GetRootLevelParent(m_pCurrentlyDisplayed) != pDSLoop), "SbaTableQueryBrowser::elementRemoved: inconsistence (2)!");
2001-01-17 07:16:53 +00:00
2001-01-09 14:52:33 +00:00
// look for user data to delete
SvTreeEntryList* pList = m_pTreeModel->GetChildList(pDSLoop);
if(pList)
{
2001-01-09 14:52:33 +00:00
SvLBoxEntry* pEntryLoop = static_cast<SvLBoxEntry*>(pList->First());
while (pEntryLoop)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(pEntryLoop->GetUserData());
delete pData;
pEntryLoop = static_cast<SvLBoxEntry*>(pList->Next());
}
}
2001-01-09 14:52:33 +00:00
// remove the entry. This should remove all children, too.
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(pDSLoop->GetUserData());
delete pData;
m_pTreeModel->Remove(pDSLoop);
}
else
DBG_ERROR("SbaTableQueryBrowser::elementRemoved: unknown datasource name!");
}
else
SbaXDataBrowserController::elementRemoved(_rEvent);
}
// -------------------------------------------------------------------------
void SAL_CALL SbaTableQueryBrowser::elementReplaced( const ContainerEvent& _rEvent ) throw(RuntimeException)
{
2001-01-09 14:52:33 +00:00
Reference< XNameAccess > xNames(_rEvent.Source, UNO_QUERY);
SvLBoxEntry* pEntry = getNameAccessFromEntry(xNames);
if (pEntry)
{ // a table or query as been replaced
String aName = ::comphelper::getString(_rEvent.Accessor).getStr();
if (m_pCurrentlyDisplayed && m_pTreeView->getListBox()->GetEntryText(m_pCurrentlyDisplayed) == aName)
{
// we need to remember the old value
SvLBoxEntry* pTemp = m_pCurrentlyDisplayed;
unloadForm(sal_False); // don't dispose the connection
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(pTemp->GetUserData());
OSL_ENSURE(pData,"elementReplaced: There must be user data!");
if(pData->bTable)
{ // only insert userdata when we have a table because the query is only a commanddefinition object and not a query
2001-02-14 13:37:35 +00:00
::cppu::extractInterface(pData->xObject,_rEvent.Element);// remember the new element
2001-01-09 14:52:33 +00:00
}
else
{
delete pData;
pTemp->SetUserData(NULL);
}
}
else
{
// find the entry for this name
SvLBoxEntry* pChild = m_pTreeModel->FirstChild(pEntry);
while(pChild)
{
if (m_pTreeView->getListBox()->GetEntryText(pChild) == aName)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(pChild->GetUserData());
OSL_ENSURE(pData,"elementReplaced: There must be user data!");
if(pData->bTable)
{ // only insert userdata when we have a table because the query is only a commanddefinition object and not a query
2001-02-14 13:37:35 +00:00
::cppu::extractInterface(pData->xObject,_rEvent.Element);// remember the new element
2001-01-09 14:52:33 +00:00
}
else
{
delete pData;
pChild->SetUserData(NULL);
}
break;
}
pChild = m_pTreeModel->NextSibling(pChild);
}
}
}
else if (xNames.get() == m_xDatabaseContext.get())
{ // a datasource has been replaced in the context
DBG_ERROR("SbaTableQueryBrowser::elementReplaced: no support for replaced data sources!");
// very suspicious: the database context should not allow to replace data source, only to register
// and revoke them
}
else
SbaXDataBrowserController::elementReplaced(_rEvent);
}
// -------------------------------------------------------------------------
2001-01-09 14:52:33 +00:00
void SbaTableQueryBrowser::closeConnection(SvLBoxEntry* _pDSEntry,sal_Bool _bDisposeConnection)
{
DBG_ASSERT(_pDSEntry, "SbaTableQueryBrowser::closeConnection: invalid entry (NULL)!");
OSL_ENSHURE(m_pTreeView->getListBox()->GetRootLevelParent(_pDSEntry) == _pDSEntry, "SbaTableQueryBrowser::closeConnection: invalid entry (not top-level)!");
// if one of the entries of the given DS is displayed currently, unload the form
2001-01-09 14:52:33 +00:00
if (m_pCurrentlyDisplayed && (m_pTreeView->getListBox()->GetRootLevelParent(m_pCurrentlyDisplayed) == _pDSEntry))
unloadForm(_bDisposeConnection);
// collapse the query/table container
for (SvLBoxEntry* pContainers = m_pTreeModel->FirstChild(_pDSEntry); pContainers; pContainers= m_pTreeModel->NextSibling(pContainers))
{
m_pTreeView->getListBox()->Collapse(pContainers);
m_pTreeView->getListBox()->EnableExpandHandler(pContainers);
// and delete their children (they are connection-relative)
for (SvLBoxEntry* pElements = m_pTreeModel->FirstChild(pContainers); pElements; )
{
SvLBoxEntry* pRemove = pElements;
pElements= m_pTreeModel->NextSibling(pElements);
2001-01-09 14:52:33 +00:00
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(pRemove->GetUserData());
delete pData;
m_pTreeModel->Remove(pRemove);
}
}
// collapse the entry itself
m_pTreeView->getListBox()->Collapse(_pDSEntry);
// get the connection
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(_pDSEntry->GetUserData());
2001-01-09 14:52:33 +00:00
if(_bDisposeConnection) // and dispose/reset it
{
Reference< XComponent > xComponent(pData->xObject, UNO_QUERY);
if (xComponent.is())
{
Reference< ::com::sun::star::lang::XEventListener> xEvtL((::cppu::OWeakObject*)this,UNO_QUERY);
xComponent->removeEventListener(xEvtL);
}
::comphelper::disposeComponent(pData->xObject);
}
pData->xObject.clear();
}
// -------------------------------------------------------------------------
void SbaTableQueryBrowser::unloadForm(sal_Bool _bDisposeConnection, sal_Bool _bFlushData)
{
2001-01-09 14:52:33 +00:00
if (!m_pCurrentlyDisplayed)
// nothing to do
return;
2001-01-09 14:52:33 +00:00
SvLBoxEntry* pDSEntry = m_pTreeView->getListBox()->GetRootLevelParent(m_pCurrentlyDisplayed);
// de-select the path for the currently displayed table/query
2001-01-09 14:52:33 +00:00
if (m_pCurrentlyDisplayed)
{
if (_bFlushData)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(m_pCurrentlyDisplayed->GetUserData());
try
{
2001-02-14 13:37:35 +00:00
if(pData)
{
Reference<XFlushable> xFlush(pData->xObject, UNO_QUERY);
if(xFlush.is())
xFlush->flush();
}
}
catch (RuntimeException&)
{
OSL_ENSURE(sal_False, "SbaTableQueryBrowser::unloadForm: could not flush the data (caught a RuntimeException)!");
}
}
2001-01-09 14:52:33 +00:00
selectPath(m_pCurrentlyDisplayed, sal_False);
}
m_pCurrentlyDisplayed = NULL;
try
{
// get the active connection. We need to dispose it.
Reference< XPropertySet > xProp(getRowSet(),UNO_QUERY);
Reference< XConnection > xConn;
::cppu::extractInterface(xConn, xProp->getPropertyValue(PROPERTY_ACTIVECONNECTION));
#ifdef DEBUG
{
Reference< XComponent > xComp;
::cppu::extractInterface(xComp, xProp->getPropertyValue(PROPERTY_ACTIVECONNECTION));
}
#endif
// unload the form
Reference< XLoadable > xLoadable(getRowSet(), UNO_QUERY);
xLoadable->unload();
// clear the grid control
Reference< XNameContainer > xColContainer(getControlModel(), UNO_QUERY);
// first we have to clear the grid
{
Sequence< ::rtl::OUString > aNames = xColContainer->getElementNames();
const ::rtl::OUString* pBegin = aNames.getConstArray();
const ::rtl::OUString* pEnd = pBegin + aNames.getLength();
for (; pBegin != pEnd;++pBegin)
xColContainer->removeByName(*pBegin);
}
// dispose the connection
2001-01-09 14:52:33 +00:00
if(_bDisposeConnection)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(pDSEntry->GetUserData());
if(pData)
{
Reference< XComponent > xComponent(pData->xObject, UNO_QUERY);
if (xComponent.is())
{
Reference< ::com::sun::star::lang::XEventListener> xEvtL((::cppu::OWeakObject*)this,UNO_QUERY);
xComponent->removeEventListener(xEvtL);
}
pData->xObject = NULL;
}
::comphelper::disposeComponent(xConn);
}
}
catch(Exception&)
{
OSL_ENSURE(sal_False, "SbaTableQueryBrowser::unloadForm: could not reset the form");
}
}
2000-10-26 13:46:14 +00:00
// -------------------------------------------------------------------------
void SAL_CALL SbaTableQueryBrowser::initialize( const Sequence< Any >& aArguments ) throw(Exception, RuntimeException)
{
::vos::OGuard aGuard(Application::GetSolarMutex());
// doin' a lot of VCL stuff here -> lock the SolarMutex
// first initialize the parent
SbaXDataBrowserController::initialize( aArguments );
2001-01-09 14:52:33 +00:00
Reference<XConnection> xConnection;
PropertyValue aValue;
const Any* pBegin = aArguments.getConstArray();
const Any* pEnd = pBegin + aArguments.getLength();
2001-01-09 14:52:33 +00:00
::rtl::OUString aTableName,aCatalogName,aSchemaName;
sal_Bool bEsacpeProcessing = sal_True;
m_nDefaultCommandType = -1;
for(;pBegin != pEnd;++pBegin)
{
if((*pBegin >>= aValue) && aValue.Name == PROPERTY_DATASOURCENAME)
aValue.Value >>= m_sDefaultDataSourceName;
else if(aValue.Name == PROPERTY_COMMANDTYPE)
aValue.Value >>= m_nDefaultCommandType;
else if(aValue.Name == PROPERTY_COMMAND)
aValue.Value >>= m_sDefaultCommand;
2001-01-09 14:52:33 +00:00
else if(aValue.Name == PROPERTY_ACTIVECONNECTION)
2001-02-14 13:37:35 +00:00
::cppu::extractInterface(xConnection,aValue.Value);
2001-01-09 14:52:33 +00:00
else if(aValue.Name == PROPERTY_UPDATE_CATALOGNAME)
aValue.Value >>= aCatalogName;
else if(aValue.Name == PROPERTY_UPDATE_SCHEMANAME)
aValue.Value >>= aSchemaName;
else if(aValue.Name == PROPERTY_UPDATE_TABLENAME)
aValue.Value >>= aTableName;
else if(aValue.Name == PROPERTY_USE_ESCAPE_PROCESSING)
bEsacpeProcessing = ::cppu::any2bool(aValue.Value);
else if(aValue.Name == PROPERTY_SHOWTREEVIEW)
{
try
{
if(::cppu::any2bool(aValue.Value))
showExplorer();
else
hideExplorer();
}
catch(Exception&)
{
}
}
else if(aValue.Name == PROPERTY_SHOWTREEVIEWBUTTON)
{
try
{
if(!::cppu::any2bool(aValue.Value) && getView())
{
// hide the explorer and the separator
getView()->getToolBox()->HideItem(ID_BROWSER_EXPLORER);
getView()->getToolBox()->HideItem(getView()->getToolBox()->GetItemId(getView()->getToolBox()->GetItemPos(ID_BROWSER_EXPLORER)+1));
getView()->getToolBox()->ShowItem(ID_BROWSER_CLOSE);
}
}
catch(Exception&)
{
}
}
}
if(m_sDefaultDataSourceName.getLength() && m_sDefaultCommand.getLength() && m_nDefaultCommandType != -1)
{
SvLBoxEntry* pDataSource = m_pTreeView->getListBox()->GetEntryPosByName(m_sDefaultDataSourceName,NULL);
if(pDataSource)
{
m_pTreeView->getListBox()->Expand(pDataSource);
SvLBoxEntry* pCommandType = NULL;
if(CommandType::TABLE == m_nDefaultCommandType)
pCommandType = m_pTreeView->getListBox()->GetModel()->GetEntry(pDataSource,1);
else if(CommandType::QUERY == m_nDefaultCommandType)
pCommandType = m_pTreeView->getListBox()->GetModel()->GetEntry(pDataSource,0);
if(pCommandType)
{
// we need to expand the command
m_pTreeView->getListBox()->Expand(pCommandType);
SvLBoxEntry* pCommand = m_pTreeView->getListBox()->GetEntryPosByName(m_sDefaultCommand,pCommandType);
if(pCommand)
m_pTreeView->getListBox()->Select(pCommand);
}
2001-01-09 14:52:33 +00:00
else // we have a command and need to display this in the rowset
{
Reference<XPropertySet> xProp(getRowSet(),UNO_QUERY);
if(xProp.is())
{
Reference< ::com::sun::star::form::XLoadable > xLoadable(xProp,UNO_QUERY);
try
{
// the values allowing the RowSet to re-execute
xProp->setPropertyValue(PROPERTY_DATASOURCENAME,makeAny(m_sDefaultDataSourceName));
// set this _before_ setting the connection, else the rowset would rebuild it ...
if(xConnection.is())
xProp->setPropertyValue(PROPERTY_ACTIVECONNECTION,makeAny(xConnection));
xProp->setPropertyValue(PROPERTY_COMMANDTYPE,makeAny(m_nDefaultCommandType));
xProp->setPropertyValue(PROPERTY_COMMAND,makeAny(m_sDefaultCommand));
xProp->setPropertyValue(PROPERTY_UPDATE_CATALOGNAME,makeAny(aCatalogName));
xProp->setPropertyValue(PROPERTY_UPDATE_SCHEMANAME,makeAny(aSchemaName));
xProp->setPropertyValue(PROPERTY_UPDATE_TABLENAME,makeAny(aTableName));
xProp->setPropertyValue(PROPERTY_USE_ESCAPE_PROCESSING,::cppu::bool2any(bEsacpeProcessing));
// the formatter depends on the data source we're working on, so rebuild it here ...
initFormatter();
// switch the grid to design mode while loading
getBrowserView()->getGridControl()->setDesignMode(sal_True);
InitializeForm(getRowSet());
{
FormErrorHelper aHelper(this);
// load the row set
if (xLoadable->isLoaded())
// reload does not work if not already loaded
xLoadable->reload();
else
xLoadable->load();
// initialize the model
InitializeGridModel(getFormComponent());
Reference< ::com::sun::star::form::XLoadable > xLoadable(getRowSet(),UNO_QUERY);
if (xLoadable->isLoaded() && !errorOccured())
xLoadable->reload();
}
FormLoaded(sal_True);
}
catch(Exception&)
{
}
}
}
}
}
}
2000-12-08 20:16:38 +00:00
// -------------------------------------------------------------------------
sal_Bool SbaTableQueryBrowser::haveExplorer() const
{
return m_pTreeView && m_pTreeView->IsVisible();
}
// -------------------------------------------------------------------------
void SbaTableQueryBrowser::hideExplorer()
{
if (!haveExplorer())
return;
2001-01-09 14:52:33 +00:00
if (!getBrowserView())
2000-12-08 20:16:38 +00:00
return;
m_pTreeView->Hide();
m_pSplitter->Hide();
2001-01-09 14:52:33 +00:00
getBrowserView()->Resize();
2000-12-08 20:16:38 +00:00
InvalidateFeature(ID_BROWSER_EXPLORER);
}
// -------------------------------------------------------------------------
void SbaTableQueryBrowser::showExplorer()
{
if (haveExplorer())
return;
2001-01-09 14:52:33 +00:00
if (!getBrowserView())
2000-12-08 20:16:38 +00:00
return;
m_pTreeView->Show();
m_pSplitter->Show();
2001-01-09 14:52:33 +00:00
getBrowserView()->Resize();
2000-12-08 20:16:38 +00:00
InvalidateFeature(ID_BROWSER_EXPLORER);
}
2001-02-16 15:00:13 +00:00
// -----------------------------------------------------------------------------
sal_Bool SbaTableQueryBrowser::secureConnection(SvLBoxEntry* _pDSEntry,void* pDSData,Reference<XConnection>& _xConnection)
{
if(_pDSEntry)
{
DBTreeListModel::DBTreeListUserData* pData = static_cast<DBTreeListModel::DBTreeListUserData*>(pDSData);
::rtl::OUString aDSName;
SvLBoxItem* pTextItem = _pDSEntry->GetFirstItem(SV_ITEM_ID_BOLDLBSTRING);
if (pTextItem)
aDSName = static_cast<SvLBoxString*>(pTextItem)->GetText();
if (pData)
_xConnection = Reference<XConnection>(pData->xObject,UNO_QUERY);
if(!_xConnection.is() && pData)
{
_xConnection = connect(aDSName);
pData->xObject = _xConnection; // share the conenction with the querydesign
}
}
return _xConnection.is();
}
// .........................................................................
} // namespace dbaui
// .........................................................................
2000-10-26 13:46:14 +00:00