diff options
Diffstat (limited to 'extensions/source/bibliography/datman.cxx')
-rw-r--r-- | extensions/source/bibliography/datman.cxx | 1834 |
1 files changed, 1834 insertions, 0 deletions
diff --git a/extensions/source/bibliography/datman.cxx b/extensions/source/bibliography/datman.cxx new file mode 100644 index 000000000000..9fa401a1620c --- /dev/null +++ b/extensions/source/bibliography/datman.cxx @@ -0,0 +1,1834 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_extensions.hxx" +#include <osl/mutex.hxx> +#include <tools/diagnose_ex.h> +#include <tools/urlobj.hxx> +#include <comphelper/processfactory.hxx> +#include <com/sun/star/io/XPersistObject.hpp> +#include <com/sun/star/sdbc/ResultSetType.hpp> +#include <com/sun/star/sdbc/ResultSetConcurrency.hpp> +#include <com/sun/star/sdbc/XResultSetUpdate.hpp> +#include <com/sun/star/sdbcx/XRowLocate.hpp> +#include <com/sun/star/sdbc/DataType.hpp> +#include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp> +#include <com/sun/star/sdbc/XDatabaseMetaData.hpp> +#include <com/sun/star/sdb/XDatabaseEnvironment.hpp> +#include <com/sun/star/uno/XNamingService.hpp> +#include <com/sun/star/sdbc/XDataSource.hpp> +#include <com/sun/star/sdb/CommandType.hpp> +#include <com/sun/star/sdbcx/XTablesSupplier.hpp> +#include <com/sun/star/sdbc/XConnection.hpp> +#include <com/sun/star/sdb/XCompletedConnection.hpp> +#include <com/sun/star/task/XInteractionHandler.hpp> +#include <com/sun/star/form/XLoadable.hpp> +#include <com/sun/star/sdbcx/XColumnsSupplier.hpp> +#include <com/sun/star/form/XGridColumnFactory.hpp> +#include <com/sun/star/io/XDataInputStream.hpp> +#include <com/sun/star/container/XNameContainer.hpp> +#include <com/sun/star/ucb/XContentProvider.hpp> +#include <com/sun/star/ucb/XContentAccess.hpp> +#include <ucbhelper/contentbroker.hxx> +#include <ucbhelper/content.hxx> +#include <ucbhelper/contentidentifier.hxx> +#include <comphelper/container.hxx> +#include <svl/urihelper.hxx> +#include <svtools/svtabbx.hxx> +#include <svtools/headbar.hxx> +#include <vcl/dialog.hxx> +#ifndef _SV_BUTTON_HXX +#include <vcl/button.hxx> +#endif +#include <vcl/lstbox.hxx> +#include <vcl/fixed.hxx> +#include <vcl/group.hxx> +#include <vcl/lstbox.hxx> +#include <vcl/edit.hxx> +#include <vcl/msgbox.hxx> +#include <tools/debug.hxx> +#include "datman.hxx" +#include "bibresid.hxx" +#include "bibmod.hxx" +#include "bibview.hxx" +// #100312# --------- +#include "bibbeam.hxx" +#include "bibprop.hrc" +#include "toolbar.hxx" +#include "toolbar.hrc" +#include "bibconfig.hxx" +#include "bibbeam.hxx" +#include "bib.hrc" +#include "datman.hrc" +#include "bibliography.hrc" +#include <connectivity/dbtools.hxx> + +using namespace ::com::sun::star; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::container; +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::form; +using namespace ::com::sun::star::frame; +using namespace ::com::sun::star::ucb; +using namespace ::com::sun::star::lang; +using namespace ::ucb; + +#define C2U(cChar) ::rtl::OUString::createFromAscii(cChar) +#define C2S(cChar) String::CreateFromAscii(cChar) +#define MAP_TOKEN ';' +#define PAIR_TOKEN ':' + + +/* -----------------17.01.00 14:38------------------- + + --------------------------------------------------*/ +Reference< XConnection > getConnection(const ::rtl::OUString& _rURL) +{ + // first get the sdb::DataSource corresponding to the url + Reference< XDataSource > xDataSource; + // is it a favorite title ? + Reference< XMultiServiceFactory > xMgr = comphelper::getProcessServiceFactory(); + Reference<XInterface> xNamingContextIfc = xMgr->createInstance(C2U("com.sun.star.sdb.DatabaseContext")); + Reference< XNameAccess > xNamingContext(xNamingContextIfc, UNO_QUERY); + if (xNamingContext.is() && xNamingContext->hasByName(_rURL)) + { + DBG_ASSERT(Reference< XNamingService > (xNamingContext, UNO_QUERY).is(), "::getDataSource : no NamingService interface on the sdb::DatabaseAccessContext !"); + try + { + xDataSource = Reference< XDataSource > (Reference< XNamingService > (xNamingContext, UNO_QUERY)->getRegisteredObject(_rURL), UNO_QUERY); + } + catch(Exception eEx) + { + (void) eEx; // make compiler happy + DBG_ERROR("Exception caught in ODatabaseContext::getRegisteredObject()"); + } + } + // build the connection from the data source + Reference< XConnection > xConn; + if (xDataSource.is()) + { + // need user/pwd for this + ::rtl::OUString sUser, sPwd; + Reference< XPropertySet > xDataSourceProps(xDataSource, UNO_QUERY); + Reference< XCompletedConnection > xComplConn(xDataSource, UNO_QUERY); +/* Reference< XPropertySetInfo > xInfo = xDataSourceProps.is() ? xDataSourceProps->getPropertySetInfo() : Reference< XPropertySetInfo > (); + if (xInfo.is() && xInfo->hasPropertyByName(C2U("User"))) + xDataSourceProps->getPropertyValue(C2U("User")) >>= sUser; + if (xInfo.is() && xInfo->hasPropertyByName(C2U("Password"))) + xDataSourceProps->getPropertyValue(C2U("Password"))>>= sPwd; +*/ + try + { + + Reference<XInterface> xHdl = xMgr->createInstance(C2U("com.sun.star.task.InteractionHandler")); + Reference<task::XInteractionHandler> xIHdl(xHdl, UNO_QUERY); + xConn = xComplConn->connectWithCompletion(xIHdl); +// xConn = xDataSource->getConnection(sUser, sPwd); + } + catch(SQLException&) + { + // TODO : a real error handling + } + catch(Exception& e ) + { + (void) e; // make compiler happy + } + + } + return xConn; +} + +/* -----------------17.01.00 14:46------------------- + + --------------------------------------------------*/ +Reference< XConnection > getConnection(const Reference< XInterface > & xRowSet) +{ + Reference< XConnection > xConn; + try + { + Reference< XPropertySet > xFormProps(xRowSet, UNO_QUERY); + if (!xFormProps.is()) + return xConn; + + xConn = Reference< XConnection > (*(Reference< XInterface > *)xFormProps->getPropertyValue(C2U("ActiveConnection")).getValue(), UNO_QUERY); + if (!xConn.is()) + { + DBG_WARNING("no active connection"); + } + } + catch(Exception& e ) + { + (void) e; // make compiler happy + DBG_ERROR("exception in getConnection"); + } + + return xConn; +} +/* -----------------17.01.00 16:07------------------- + + --------------------------------------------------*/ +Reference< XNameAccess > getColumns(const Reference< XForm > & _rxForm) +{ + Reference< XNameAccess > xReturn; + // check if the form is alive + Reference< XColumnsSupplier > xSupplyCols( _rxForm, UNO_QUERY ); + if (xSupplyCols.is()) + xReturn = xSupplyCols->getColumns(); + + if (!xReturn.is() || (xReturn->getElementNames().getLength() == 0)) + { // no .... + xReturn = NULL; + // -> get the table the form is bound to and ask it for their columns + Reference< XTablesSupplier > xSupplyTables( getConnection( _rxForm ), UNO_QUERY ); + Reference< XPropertySet > xFormProps( _rxForm, UNO_QUERY ); + if (xFormProps.is() && xSupplyTables.is()) + { + try + { + DBG_ASSERT((*(sal_Int32*)xFormProps->getPropertyValue(C2U("CommandType")).getValue()) == CommandType::TABLE, + "::getColumns : invalid form (has no table as data source) !"); + ::rtl::OUString sTable; + xFormProps->getPropertyValue(C2U("Command")) >>= sTable; + Reference< XNameAccess > xTables = xSupplyTables->getTables(); + if (xTables.is() && xTables->hasByName(sTable)) + xSupplyCols = Reference< XColumnsSupplier > ( + *(Reference< XInterface > *)xTables->getByName(sTable).getValue(), UNO_QUERY); + if (xSupplyCols.is()) + xReturn = xSupplyCols->getColumns(); + } +#ifdef DBG_UTIL + catch(Exception& e ) +#else + catch(Exception&) +#endif + { +#ifdef DBG_UTIL + String sMsg(String::CreateFromAscii("::getColumns : catched an exception (")); + sMsg += String(e.Message); + sMsg.AppendAscii(") ..."); + DBG_ERROR( ByteString(sMsg, RTL_TEXTENCODING_ASCII_US ).GetBuffer()); +#endif + } + + } + } + return xReturn; +} + +/* -----------------11.11.99 15:54------------------- + + --------------------------------------------------*/ +class MappingDialog_Impl : public ModalDialog +{ + BibDataManager* pDatMan; + OKButton aOKBT; + CancelButton aCancelBT; + HelpButton aHelpBT; + FixedLine aMapGB; + FixedText aIdentifierFT; + ListBox aIdentifierLB; + FixedText aAuthorityTypeFT; + ListBox aAuthorityTypeLB; + FixedText aAuthorFT; + ListBox aAuthorLB; + FixedText aTitleFT; + ListBox aTitleLB; + FixedText aMonthFT; + ListBox aMonthLB; + FixedText aYearFT; + ListBox aYearLB; + FixedText aISBNFT; + ListBox aISBNLB; + FixedText aBooktitleFT; + ListBox aBooktitleLB; + FixedText aChapterFT; + ListBox aChapterLB; + FixedText aEditionFT; + ListBox aEditionLB; + FixedText aEditorFT; + ListBox aEditorLB; + FixedText aHowpublishedFT; + ListBox aHowpublishedLB; + FixedText aInstitutionFT; + ListBox aInstitutionLB; + FixedText aJournalFT; + ListBox aJournalLB; + FixedText aNoteFT; + ListBox aNoteLB; + FixedText aAnnoteFT; + ListBox aAnnoteLB; + FixedText aNumberFT; + ListBox aNumberLB; + FixedText aOrganizationsFT; + ListBox aOrganizationsLB; + FixedText aPagesFT; + ListBox aPagesLB; + FixedText aPublisherFT; + ListBox aPublisherLB; + FixedText aAddressFT; + ListBox aAddressLB; + FixedText aSchoolFT; + ListBox aSchoolLB; + FixedText aSeriesFT; + ListBox aSeriesLB; + FixedText aReportTypeFT; + ListBox aReportTypeLB; + FixedText aVolumeFT; + ListBox aVolumeLB; + FixedText aURLFT; + ListBox aURLLB; + FixedText aCustom1FT; + ListBox aCustom1LB; + FixedText aCustom2FT; + ListBox aCustom2LB; + FixedText aCustom3FT; + ListBox aCustom3LB; + FixedText aCustom4FT; + ListBox aCustom4LB; + FixedText aCustom5FT; + ListBox aCustom5LB; + ListBox* aListBoxes[COLUMN_COUNT]; + String sNone; + + sal_Bool bModified; + + + + DECL_LINK(OkHdl, OKButton*); + DECL_LINK(ListBoxSelectHdl, ListBox*); + +public: + MappingDialog_Impl(Window* pParent, BibDataManager* pDatMan); + ~MappingDialog_Impl(); + + void SetModified() {bModified = TRUE;} + +}; +/* -----------------11.11.99 16:42------------------- + + --------------------------------------------------*/ +sal_uInt16 lcl_FindLogicalName(BibConfig* pConfig , + const ::rtl::OUString& rLogicalColumnName) +{ + for(sal_uInt16 i = 0; i < COLUMN_COUNT; i++) + { + if(rLogicalColumnName == pConfig->GetDefColumnName(i)) + return i; + } + return USHRT_MAX; +} +//----------------------------------------------------------------------------- +MappingDialog_Impl::MappingDialog_Impl(Window* pParent, BibDataManager* pMan) : + ModalDialog(pParent, BibResId(RID_DLG_MAPPING) ), + pDatMan(pMan), + aOKBT(this, BibResId( BT_OK )), + aCancelBT(this, BibResId( BT_CANCEL )), + aHelpBT(this, BibResId( BT_HELP )), + + aMapGB(this, BibResId( GB_MAPPING )), + + aIdentifierFT(this, BibResId( FT_IDENTIFIER )), + aIdentifierLB(this, BibResId( LB_IDENTIFIER )), + aAuthorityTypeFT(this, BibResId( FT_AUTHORITYTYPE )), + aAuthorityTypeLB(this, BibResId( LB_AUTHORITYTYPE )), + aAuthorFT(this, BibResId( FT_AUTHOR )), + aAuthorLB(this, BibResId( LB_AUTHOR )), + aTitleFT(this, BibResId( FT_TITLE )), + aTitleLB(this, BibResId( LB_TITLE )), + aMonthFT(this, BibResId( FT_MONTH )), + aMonthLB(this, BibResId( LB_MONTH )), + aYearFT(this, BibResId( FT_YEAR )), + aYearLB(this, BibResId( LB_YEAR )), + aISBNFT(this, BibResId( FT_ISBN )), + aISBNLB(this, BibResId( LB_ISBN )), + aBooktitleFT(this, BibResId( FT_BOOKTITLE )), + aBooktitleLB(this, BibResId( LB_BOOKTITLE )), + aChapterFT(this, BibResId( FT_CHAPTER )), + aChapterLB(this, BibResId( LB_CHAPTER )), + aEditionFT(this, BibResId( FT_EDITION )), + aEditionLB(this, BibResId( LB_EDITION )), + aEditorFT(this, BibResId( FT_EDITOR )), + aEditorLB(this, BibResId( LB_EDITOR )), + aHowpublishedFT(this, BibResId( FT_HOWPUBLISHED )), + aHowpublishedLB(this, BibResId( LB_HOWPUBLISHED )), + aInstitutionFT(this, BibResId( FT_INSTITUTION )), + aInstitutionLB(this, BibResId( LB_INSTITUTION )), + aJournalFT(this, BibResId( FT_JOURNAL )), + aJournalLB(this, BibResId( LB_JOURNAL )), + aNoteFT(this, BibResId( FT_NOTE )), + aNoteLB(this, BibResId( LB_NOTE )), + aAnnoteFT(this, BibResId( FT_ANNOTE )), + aAnnoteLB(this, BibResId( LB_ANNOTE )), + aNumberFT(this, BibResId( FT_NUMBER )), + aNumberLB(this, BibResId( LB_NUMBER )), + aOrganizationsFT(this, BibResId( FT_ORGANIZATIONS )), + aOrganizationsLB(this, BibResId( LB_ORGANIZATIONS )), + aPagesFT(this, BibResId( FT_PAGES )), + aPagesLB(this, BibResId( LB_PAGES )), + aPublisherFT(this, BibResId( FT_PUBLISHER )), + aPublisherLB(this, BibResId( LB_PUBLISHER )), + aAddressFT(this, BibResId( FT_ADDRESS )), + aAddressLB(this, BibResId( LB_ADDRESS )), + aSchoolFT(this, BibResId( FT_SCHOOL )), + aSchoolLB(this, BibResId( LB_SCHOOL )), + aSeriesFT(this, BibResId( FT_SERIES )), + aSeriesLB(this, BibResId( LB_SERIES )), + aReportTypeFT(this, BibResId( FT_REPORTTYPE )), + aReportTypeLB(this, BibResId( LB_REPORTTYPE )), + aVolumeFT(this, BibResId( FT_VOLUME )), + aVolumeLB(this, BibResId( LB_VOLUME )), + aURLFT(this, BibResId( FT_URL )), + aURLLB(this, BibResId( LB_URL )), + aCustom1FT(this, BibResId( FT_CUSTOM1 )), + aCustom1LB(this, BibResId( LB_CUSTOM1 )), + aCustom2FT(this, BibResId( FT_CUSTOM2 )), + aCustom2LB(this, BibResId( LB_CUSTOM2 )), + aCustom3FT(this, BibResId( FT_CUSTOM3 )), + aCustom3LB(this, BibResId( LB_CUSTOM3 )), + aCustom4FT(this, BibResId( FT_CUSTOM4 )), + aCustom4LB(this, BibResId( LB_CUSTOM4 )), + aCustom5FT(this, BibResId( FT_CUSTOM5 )), + aCustom5LB(this, BibResId( LB_CUSTOM5 )), + sNone(BibResId(ST_NONE)), + bModified(sal_False) +{ + FreeResource(); + + aIdentifierFT.SetText(String( BibResId( ST_IDENTIFIER ))); + aAuthorityTypeFT.SetText(String( BibResId( ST_AUTHTYPE ))); + aAuthorFT.SetText(String( BibResId( ST_AUTHOR ))); + aTitleFT.SetText(String( BibResId( ST_TITLE ))); + aMonthFT.SetText(String( BibResId( ST_MONTH ))); + aYearFT.SetText(String( BibResId( ST_YEAR ))); + aISBNFT.SetText(String( BibResId( ST_ISBN ))); + aBooktitleFT.SetText(String( BibResId( ST_BOOKTITLE ))); + aChapterFT.SetText(String( BibResId( ST_CHAPTER ))); + aEditionFT.SetText(String( BibResId( ST_EDITION ))); + aEditorFT.SetText(String( BibResId( ST_EDITOR ))); + aHowpublishedFT.SetText(String( BibResId( ST_HOWPUBLISHED ))); + aInstitutionFT.SetText(String( BibResId( ST_INSTITUTION ))); + aJournalFT.SetText(String( BibResId( ST_JOURNAL ))); + aNoteFT.SetText(String( BibResId( ST_NOTE ))); + aAnnoteFT.SetText(String( BibResId( ST_ANNOTE ))); + aNumberFT.SetText(String( BibResId( ST_NUMBER ))); + aOrganizationsFT.SetText(String( BibResId( ST_ORGANIZATION ))); + aPagesFT.SetText(String( BibResId( ST_PAGE ))); + aPublisherFT.SetText(String( BibResId( ST_PUBLISHER ))); + aAddressFT.SetText(String( BibResId( ST_ADDRESS ))); + aSchoolFT.SetText(String( BibResId( ST_SCHOOL ))); + aSeriesFT.SetText(String( BibResId( ST_SERIES ))); + aReportTypeFT.SetText(String( BibResId( ST_REPORT ))); + aVolumeFT.SetText(String( BibResId( ST_VOLUME ))); + aURLFT.SetText(String( BibResId( ST_URL ))); + aCustom1FT.SetText(String( BibResId( ST_CUSTOM1 ))); + aCustom2FT.SetText(String( BibResId( ST_CUSTOM2 ))); + aCustom3FT.SetText(String( BibResId( ST_CUSTOM3 ))); + aCustom4FT.SetText(String( BibResId( ST_CUSTOM4 ))); + aCustom5FT.SetText(String( BibResId( ST_CUSTOM5 ))); + + aOKBT.SetClickHdl(LINK(this, MappingDialog_Impl, OkHdl)); + String sTitle = GetText(); + sTitle.SearchAndReplace(C2S("%1"), pDatMan->getActiveDataTable(), 0); + SetText(sTitle); + + aListBoxes[0] = &aIdentifierLB; + aListBoxes[1] = &aAuthorityTypeLB; + aListBoxes[2] = &aAuthorLB; + aListBoxes[3] = &aTitleLB; + aListBoxes[4] = &aYearLB; + aListBoxes[5] = &aISBNLB; + aListBoxes[6] = &aBooktitleLB; + aListBoxes[7] = &aChapterLB; + aListBoxes[8] = &aEditionLB; + aListBoxes[9] = &aEditorLB; + aListBoxes[10] = &aHowpublishedLB; + aListBoxes[11] = &aInstitutionLB; + aListBoxes[12] = &aJournalLB; + aListBoxes[13] = &aMonthLB; + aListBoxes[14] = &aNoteLB; + aListBoxes[15] = &aAnnoteLB; + aListBoxes[16] = &aNumberLB; + aListBoxes[17] = &aOrganizationsLB; + aListBoxes[18] = &aPagesLB; + aListBoxes[19] = &aPublisherLB; + aListBoxes[20] = &aAddressLB; + aListBoxes[21] = &aSchoolLB; + aListBoxes[22] = &aSeriesLB; + aListBoxes[23] = &aReportTypeLB; + aListBoxes[24] = &aVolumeLB; + aListBoxes[25] = &aURLLB; + aListBoxes[26] = &aCustom1LB; + aListBoxes[27] = &aCustom2LB; + aListBoxes[28] = &aCustom3LB; + aListBoxes[29] = &aCustom4LB; + aListBoxes[30] = &aCustom5LB; + + aListBoxes[0]->InsertEntry(sNone); + Reference< XNameAccess > xFields = getColumns( pDatMan->getForm() ); + DBG_ASSERT(xFields.is(), "MappingDialog_Impl::MappingDialog_Impl : gave me an invalid form !"); + if(xFields.is()) + { + Sequence< ::rtl::OUString > aNames = xFields->getElementNames(); + sal_Int32 nFieldsCount = aNames.getLength(); + const ::rtl::OUString* pNames = aNames.getConstArray(); + + for(sal_Int32 nField = 0; nField < nFieldsCount; nField++) + aListBoxes[0]->InsertEntry(pNames[nField]); + } + + Link aLnk = LINK(this, MappingDialog_Impl, ListBoxSelectHdl); + + aListBoxes[0]->SelectEntryPos(0); + aListBoxes[0]->SetSelectHdl(aLnk); + for(sal_uInt16 i = 1; i < COLUMN_COUNT; i++) + { + for(sal_uInt16 j = 0; j < aListBoxes[0]->GetEntryCount();j++) + aListBoxes[i]->InsertEntry(aListBoxes[0]->GetEntry(j)); + aListBoxes[i]->SelectEntryPos(0); + aListBoxes[i]->SetSelectHdl(aLnk); + } + BibConfig* pConfig = BibModul::GetConfig(); + BibDBDescriptor aDesc; + aDesc.sDataSource = pDatMan->getActiveDataSource(); + aDesc.sTableOrQuery = pDatMan->getActiveDataTable(); + aDesc.nCommandType = CommandType::TABLE; + const Mapping* pMapping = pConfig->GetMapping(aDesc); + if(pMapping) + { + for(sal_uInt16 nEntry = 0; nEntry < COLUMN_COUNT; nEntry++) + { + sal_uInt16 nListBoxIndex = lcl_FindLogicalName( pConfig, pMapping->aColumnPairs[nEntry].sLogicalColumnName); + if(nListBoxIndex < COLUMN_COUNT) + { + aListBoxes[nListBoxIndex]->SelectEntry(pMapping->aColumnPairs[nEntry].sRealColumnName); + } + } + } +} +/* -----------------11.11.99 16:44------------------- + + --------------------------------------------------*/ +MappingDialog_Impl::~MappingDialog_Impl() +{} +/* -----------------15.11.99 10:38------------------- + + --------------------------------------------------*/ +IMPL_LINK(MappingDialog_Impl, ListBoxSelectHdl, ListBox*, pListBox) +{ + sal_uInt16 nEntryPos = pListBox->GetSelectEntryPos(); + if(0 < nEntryPos) + { + for(sal_uInt16 i = 0; i < COLUMN_COUNT; i++) + { + if(pListBox != aListBoxes[i] && aListBoxes[i]->GetSelectEntryPos() == nEntryPos) + aListBoxes[i]->SelectEntryPos(0); + } + } + SetModified(); + return 0; +} +/* -----------------12.11.99 14:50------------------- + + --------------------------------------------------*/ +IMPL_LINK(MappingDialog_Impl, OkHdl, OKButton*, EMPTYARG) +{ + if(bModified) + { + Mapping aNew; + aNew.sTableName = String(pDatMan->getActiveDataTable()); + aNew.sURL = String(pDatMan->getActiveDataSource()); + + sal_uInt16 nWriteIndex = 0; + BibConfig* pConfig = BibModul::GetConfig(); + for(sal_uInt16 nEntry = 0; nEntry < COLUMN_COUNT; nEntry++) + { + String sSel = aListBoxes[nEntry]->GetSelectEntry(); + if(sSel != sNone) + { + aNew.aColumnPairs[nWriteIndex].sRealColumnName = sSel; + aNew.aColumnPairs[nWriteIndex].sLogicalColumnName = pConfig->GetDefColumnName(nEntry); + nWriteIndex++; + } + } + BibDBDescriptor aDesc; + aDesc.sDataSource = pDatMan->getActiveDataSource(); + aDesc.sTableOrQuery = pDatMan->getActiveDataTable(); + aDesc.nCommandType = CommandType::TABLE; + pDatMan->ResetIdentifierMapping(); + pConfig->SetMapping(aDesc, &aNew); + } + EndDialog(bModified ? RET_OK : RET_CANCEL); + return 0; +} +/* -----------------18.11.99 10:23------------------- + + --------------------------------------------------*/ +class DBChangeDialog_Impl : public ModalDialog +{ + OKButton aOKBT; + CancelButton aCancelBT; + HelpButton aHelpBT; + FixedLine aSelectionGB; + SvTabListBox aSelectionLB; + HeaderBar aSelectionHB; + DBChangeDialogConfig_Impl aConfig; + String aEntryST; + String aURLST; + + BibDataManager* pDatMan; + +// DECL_LINK(EndDragHdl, HeaderBar*); + DECL_LINK(DoubleClickHdl, SvTabListBox*); +public: + DBChangeDialog_Impl(Window* pParent, BibDataManager* pMan ); + ~DBChangeDialog_Impl(); + + String GetCurrentURL()const; +}; + +/*-- 18.11.99 10:35:20--------------------------------------------------- + + -----------------------------------------------------------------------*/ +DBChangeDialog_Impl::DBChangeDialog_Impl(Window* pParent, BibDataManager* pMan ) : + ModalDialog(pParent, BibResId(RID_DLG_DBCHANGE) ), + aOKBT(this, BibResId( BT_OK )), + aCancelBT(this, BibResId( BT_CANCEL )), + aHelpBT(this, BibResId( BT_HELP )), + aSelectionGB(this, BibResId( GB_SELECTION )), + aSelectionLB(this, BibResId( LB_SELECTION )), + aSelectionHB(this, BibResId( HB_SELECTION )), + aEntryST(BibResId(ST_ENTRY)), + aURLST( BibResId(ST_URL)), + pDatMan(pMan) +{ + FreeResource(); + aSelectionLB.SetDoubleClickHdl( LINK(this, DBChangeDialog_Impl, DoubleClickHdl)); + try + { + Reference< XMultiServiceFactory > xMgr = comphelper::getProcessServiceFactory(); + + ::Size aSize = aSelectionHB.GetSizePixel(); + long nTabs[2]; + nTabs[0] = 1;// Number of Tabs + nTabs[1] = aSize.Width() / 4; + + aSelectionHB.SetStyle(aSelectionHB.GetStyle()|WB_STDHEADERBAR); + aSelectionHB.InsertItem( 1, aEntryST, aSize.Width()); + aSelectionHB.SetSizePixel(aSelectionHB.CalcWindowSizePixel()); + aSelectionHB.Show(); + + aSelectionLB.SetTabs( &nTabs[0], MAP_PIXEL ); + aSelectionLB.SetWindowBits(WB_CLIPCHILDREN|WB_SORT); + aSelectionLB.GetModel()->SetSortMode(SortAscending); + + ::rtl::OUString sActiveSource = pDatMan->getActiveDataSource(); + const Sequence< ::rtl::OUString >& rSources = aConfig.GetDataSourceNames(); + const ::rtl::OUString* pSourceNames = rSources.getConstArray(); + for(int i = 0; i < rSources.getLength(); i++) + { + SvLBoxEntry* pEntry = aSelectionLB.InsertEntry(pSourceNames[i]); + if(pSourceNames[i] == sActiveSource) + { + aSelectionLB.Select(pEntry); + } + } + aSelectionLB.GetModel()->Resort(); + } + catch(Exception& e ) + { + (void) e; // make compiler happy + DBG_ERROR("Exception in BibDataManager::DBChangeDialog_Impl::DBChangeDialog_Impl"); + } + + +} +/* -----------------06.12.99 12:09------------------- + + --------------------------------------------------*/ +IMPL_LINK(DBChangeDialog_Impl, DoubleClickHdl, SvTabListBox*, /*pLB*/) +{ + EndDialog(RET_OK); + return 0; +} +/* -----------------18.11.99 11:17------------------- + + --------------------------------------------------*/ +/*IMPL_LINK(DBChangeDialog_Impl, EndDragHdl, HeaderBar*, pHB) +{ + long nTabs[3]; + nTabs[0] = 2;// Number of Tabs + nTabs[1] = 0; + nTabs[2] = pHB->GetItemSize( 1 ); + aSelectionLB.SetTabs( &nTabs[0], MAP_PIXEL ); + return 0; +};*/ + +/*-- 18.11.99 10:35:20--------------------------------------------------- + + -----------------------------------------------------------------------*/ +DBChangeDialog_Impl::~DBChangeDialog_Impl() +{ +} +/* -----------------18.11.99 12:36------------------- + + --------------------------------------------------*/ +String DBChangeDialog_Impl::GetCurrentURL()const +{ + String sRet; + SvLBoxEntry* pEntry = aSelectionLB.FirstSelected(); + if(pEntry) + { + sRet = aSelectionLB.GetEntryText(pEntry, 0); + } + return sRet; +} + +// #100312# -------------------------------------------------------------------- +// XDispatchProvider +BibInterceptorHelper::BibInterceptorHelper( ::bib::BibBeamer* pBibBeamer, ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch > xDispatch) +{ + if( pBibBeamer ) + { + xInterception = pBibBeamer->getDispatchProviderInterception(); + if( xInterception.is() ) + xInterception->registerDispatchProviderInterceptor( this ); + } + if( xDispatch.is() ) + xFormDispatch = xDispatch; +} + +BibInterceptorHelper::~BibInterceptorHelper( ) +{ +} + +void BibInterceptorHelper::ReleaseInterceptor() +{ + if ( xInterception.is() ) + xInterception->releaseDispatchProviderInterceptor( this ); + xInterception.clear(); +} + +::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch > SAL_CALL + BibInterceptorHelper::queryDispatch( const ::com::sun::star::util::URL& aURL, const ::rtl::OUString& aTargetFrameName, sal_Int32 nSearchFlags ) throw (::com::sun::star::uno::RuntimeException) +{ + Reference< XDispatch > xReturn; + + String aCommand( aURL.Path ); + if ( aCommand.EqualsAscii("FormSlots/ConfirmDeletion") ) + xReturn = xFormDispatch; + else + if ( xSlaveDispatchProvider.is() ) + xReturn = xSlaveDispatchProvider->queryDispatch( aURL, aTargetFrameName, nSearchFlags); + + return xReturn; +} + +::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch > > SAL_CALL + BibInterceptorHelper::queryDispatches( const ::com::sun::star::uno::Sequence< ::com::sun::star::frame::DispatchDescriptor >& aDescripts ) throw (::com::sun::star::uno::RuntimeException) +{ + Sequence< Reference< XDispatch> > aReturn( aDescripts.getLength() ); + Reference< XDispatch >* pReturn = aReturn.getArray(); + const DispatchDescriptor* pDescripts = aDescripts.getConstArray(); + for ( sal_Int16 i=0; i<aDescripts.getLength(); ++i, ++pReturn, ++pDescripts ) + { + *pReturn = queryDispatch( pDescripts->FeatureURL, pDescripts->FrameName, pDescripts->SearchFlags ); + } + return aReturn; +} + +// XDispatchProviderInterceptor +::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider > SAL_CALL + BibInterceptorHelper::getSlaveDispatchProvider( ) throw (::com::sun::star::uno::RuntimeException) +{ + return xSlaveDispatchProvider; +} + +void SAL_CALL BibInterceptorHelper::setSlaveDispatchProvider( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider >& xNewSlaveDispatchProvider ) throw (::com::sun::star::uno::RuntimeException) +{ + xSlaveDispatchProvider = xNewSlaveDispatchProvider; +} + +::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider > SAL_CALL + BibInterceptorHelper::getMasterDispatchProvider( ) throw (::com::sun::star::uno::RuntimeException) +{ + return xMasterDispatchProvider; +} + +void SAL_CALL BibInterceptorHelper::setMasterDispatchProvider( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatchProvider >& xNewMasterDispatchProvider ) throw (::com::sun::star::uno::RuntimeException) +{ + xMasterDispatchProvider = xNewMasterDispatchProvider; +} + +//----------------------------------------------------------------------------- +#define STR_UID "uid" +::rtl::OUString gGridName(C2U("theGrid")); +::rtl::OUString gViewName(C2U("theView")); +::rtl::OUString gGlobalName(C2U("theGlobals")); +::rtl::OUString gBeamerSize(C2U("theBeamerSize")); +::rtl::OUString gViewSize(C2U("theViewSize")); + +BibDataManager::BibDataManager() + :BibDataManager_Base( GetMutex() ) + // #100312# -------------- + ,m_pInterceptorHelper( NULL ) + ,m_aLoadListeners(m_aMutex) + ,pBibView( NULL ) + ,pToolbar(0) +{ +} + +/* -------------------------------------------------- + + --------------------------------------------------*/ +BibDataManager::~BibDataManager() +{ + Reference< XLoadable > xLoad( m_xForm, UNO_QUERY ); + Reference< XPropertySet > xPrSet( m_xForm, UNO_QUERY ); + Reference< XComponent > xComp( m_xForm, UNO_QUERY ); + if ( m_xForm.is() ) + { + Reference< XComponent > xConnection; + xPrSet->getPropertyValue(C2U("ActiveConnection")) >>= xConnection; + RemoveMeAsUidListener(); + if (xLoad.is()) + xLoad->unload(); + if (xComp.is()) + xComp->dispose(); + if(xConnection.is()) + xConnection->dispose(); + m_xForm = NULL; + } + // #100312# ---------------- + if( m_pInterceptorHelper ) + { + m_pInterceptorHelper->ReleaseInterceptor(); + m_pInterceptorHelper->release(); + m_pInterceptorHelper = NULL; + } +} +//------------------------------------------------------------------------ +void BibDataManager::InsertFields(const Reference< XFormComponent > & _rxGrid) +{ + if ( !_rxGrid.is() ) + return; + + try + { + Reference< XNameContainer > xColContainer( _rxGrid, UNO_QUERY ); + // remove the old fields + if ( xColContainer->hasElements() ) + { + Sequence< ::rtl::OUString > aNames = xColContainer->getElementNames(); + const ::rtl::OUString* pNames = aNames.getConstArray(); + const ::rtl::OUString* pNamesEnd = pNames + aNames.getLength(); + for ( ; pNames != pNamesEnd; ++pNames ) + xColContainer->removeByName( *pNames ); + } + + Reference< XNameAccess > xFields = getColumns( m_xForm ); + if (!xFields.is()) + return; + + Reference< XGridColumnFactory > xColFactory( _rxGrid, UNO_QUERY ); + + Reference< XPropertySet > xField; + + Sequence< ::rtl::OUString > aFields( xFields->getElementNames() ); + const ::rtl::OUString* pFields = aFields.getConstArray(); + const ::rtl::OUString* pFieldsEnd = pFields + aFields.getLength(); + + for ( ; pFields != pFieldsEnd; ++pFields ) + { + xFields->getByName( *pFields ) >>= xField; + + ::rtl::OUString sCurrentModelType; + const ::rtl::OUString sType(C2U("Type")); + sal_Int32 nType = 0; + sal_Bool bIsFormatted = sal_False; + sal_Bool bFormattedIsNumeric = sal_True; + xField->getPropertyValue(sType) >>= nType; + switch(nType) + { + case DataType::BIT: + case DataType::BOOLEAN: + sCurrentModelType = C2U("CheckBox"); + break; + + case DataType::BINARY: + case DataType::VARBINARY: + case DataType::LONGVARBINARY: + case DataType::BLOB: + sCurrentModelType = C2U("TextField"); + break; + + case DataType::VARCHAR: + case DataType::LONGVARCHAR: + case DataType::CHAR: + case DataType::CLOB: + bFormattedIsNumeric = sal_False; + // _NO_ break ! + default: + sCurrentModelType = C2U("FormattedField"); + bIsFormatted = sal_True; + break; + } + + Reference< XPropertySet > xCurrentCol = xColFactory->createColumn(sCurrentModelType); + if (bIsFormatted) + { + ::rtl::OUString sFormatKey(C2U("FormatKey")); + xCurrentCol->setPropertyValue(sFormatKey, xField->getPropertyValue(sFormatKey)); + Any aFormatted(&bFormattedIsNumeric, ::getBooleanCppuType()); + xCurrentCol->setPropertyValue(C2U("TreatAsNumber"), aFormatted); + } + Any aColName = makeAny( *pFields ); + xCurrentCol->setPropertyValue(FM_PROP_CONTROLSOURCE, aColName); + xCurrentCol->setPropertyValue(FM_PROP_LABEL, aColName); + + xColContainer->insertByName( *pFields, makeAny( xCurrentCol ) ); + } + } + catch(Exception& e ) + { + (void) e; // make compiler happy + DBG_ERROR("Exception in BibDataManager::InsertFields"); + } +} +/* -------------------------------------------------- + + --------------------------------------------------*/ +Reference< awt::XControlModel > BibDataManager::updateGridModel() +{ + return updateGridModel( m_xForm ); +} +/* -------------------------------------------------- + + --------------------------------------------------*/ +Reference< awt::XControlModel > BibDataManager::updateGridModel(const Reference< XForm > & xDbForm) +{ + try + { + Reference< XPropertySet > aFormPropSet( xDbForm, UNO_QUERY ); + ::rtl::OUString sName; + aFormPropSet->getPropertyValue(C2U("Command")) >>= sName; + + if ( !m_xGridModel.is() ) + { + m_xGridModel = createGridModel( gGridName ); + + Reference< XNameContainer > xNameCont(xDbForm, UNO_QUERY); +// if (xNameCont->hasByName(sName)) +// xNameCont->removeByName(sName); +// + xNameCont->insertByName( sName, makeAny( m_xGridModel ) ); + } + + // insert the fields + Reference< XFormComponent > xFormComp( m_xGridModel, UNO_QUERY ); + InsertFields( xFormComp ); + } + catch(Exception& e ) + { + (void) e; // make compiler happy + DBG_ERROR("::updateGridModel: something went wrong !"); + } + + + return m_xGridModel; +} +/* -------------------------------------------------- + + --------------------------------------------------*/ +Reference< XForm > BibDataManager::createDatabaseForm(BibDBDescriptor& rDesc) +{ + Reference< XForm > xResult; + try + { + Reference< XMultiServiceFactory > xMgr = comphelper::getProcessServiceFactory(); + m_xForm = Reference< XForm > ( xMgr->createInstance( C2U("com.sun.star.form.component.Form") ), UNO_QUERY ); + + Reference< XPropertySet > aPropertySet( m_xForm, UNO_QUERY ); + + aDataSourceURL = rDesc.sDataSource; + if(aPropertySet.is()) + { + Any aVal; + aVal <<= (sal_Int32)ResultSetType::SCROLL_INSENSITIVE; + aPropertySet->setPropertyValue(C2U("ResultSetType"),aVal ); + aVal <<= (sal_Int32)ResultSetConcurrency::READ_ONLY; + aPropertySet->setPropertyValue(C2U("ResultSetConcurrency"), aVal); + + //Caching for Performance + aVal <<= (sal_Int32)50; + aPropertySet->setPropertyValue(C2U("FetchSize"), aVal); + + Reference< XConnection > xConnection = getConnection(rDesc.sDataSource); + aVal <<= xConnection; + aPropertySet->setPropertyValue(C2U("ActiveConnection"), aVal); + + Reference< XTablesSupplier > xSupplyTables(xConnection, UNO_QUERY); + Reference< XNameAccess > xTables = xSupplyTables.is() ? + xSupplyTables->getTables() : Reference< XNameAccess > (); + + Sequence< ::rtl::OUString > aTableNameSeq; + if (xTables.is()) + aTableNameSeq = xTables->getElementNames(); + + if(aTableNameSeq.getLength() > 0) + { + const ::rtl::OUString* pTableNames = aTableNameSeq.getConstArray(); + if(rDesc.sTableOrQuery.getLength()) + aActiveDataTable = rDesc.sTableOrQuery; + else + { + rDesc.sTableOrQuery = aActiveDataTable = pTableNames[0]; + rDesc.nCommandType = CommandType::TABLE; + } + + aVal <<= aActiveDataTable; + aPropertySet->setPropertyValue(C2U("Command"), aVal); + aVal <<= rDesc.nCommandType; + aPropertySet->setPropertyValue(C2U("CommandType"), aVal); + + + Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData(); + aQuoteChar = xMetaData->getIdentifierQuoteString(); + + Reference< XMultiServiceFactory > xFactory(xConnection, UNO_QUERY); + if ( xFactory.is() ) + m_xParser.set( xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.SingleSelectQueryComposer" ) ) ), UNO_QUERY ); + + ::rtl::OUString aString(C2U("SELECT * FROM ")); + + ::rtl::OUString sCatalog, sSchema, sName; + ::dbtools::qualifiedNameComponents( xMetaData, aActiveDataTable, sCatalog, sSchema, sName, ::dbtools::eInDataManipulation ); + aString += ::dbtools::composeTableNameForSelect( xConnection, sCatalog, sSchema, sName ); + + m_xParser->setElementaryQuery(aString); + BibConfig* pConfig = BibModul::GetConfig(); + pConfig->setQueryField(getQueryField()); + startQueryWith(pConfig->getQueryText()); + + xResult = m_xForm; + } + } + } + catch(Exception& e ) + { + (void) e; // make compiler happy + DBG_ERROR("::createDatabaseForm: something went wrong !"); + } + + + return xResult; +} +//------------------------------------------------------------------------ +Sequence< ::rtl::OUString > BibDataManager::getDataSources() +{ + Sequence< ::rtl::OUString > aTableNameSeq; + + try + { + Reference< XTablesSupplier > xSupplyTables( getConnection( m_xForm ), UNO_QUERY ); + Reference< XNameAccess > xTables; + if (xSupplyTables.is()) + xTables = xSupplyTables->getTables(); + if (xTables.is()) + aTableNameSeq = xTables->getElementNames(); + } + catch(Exception& e ) + { + (void) e; // make compiler happy + DBG_ERROR("::getDataSources: something went wrong !"); + } + + + return aTableNameSeq; +} +//------------------------------------------------------------------------ +::rtl::OUString BibDataManager::getActiveDataTable() +{ + return aActiveDataTable; +} +//------------------------------------------------------------------------ +void BibDataManager::setFilter(const ::rtl::OUString& rQuery) +{ + if(!m_xParser.is()) + return; + try + { + m_xParser->setFilter( rQuery ); + ::rtl::OUString aQuery = m_xParser->getFilter(); + Reference< XPropertySet > xFormProps( m_xForm, UNO_QUERY_THROW ); + xFormProps->setPropertyValue( C2U( "Filter" ), makeAny( aQuery ) ); + xFormProps->setPropertyValue( C2U( "ApplyFilter" ), makeAny( sal_True ) ); + reload(); + } + catch(Exception& e ) + { + DBG_UNHANDLED_EXCEPTION(); + } + + +} +//------------------------------------------------------------------------ +::rtl::OUString BibDataManager::getFilter() +{ + + ::rtl::OUString aQueryString; + try + { + Reference< XPropertySet > xFormProps( m_xForm, UNO_QUERY_THROW ); + OSL_VERIFY( xFormProps->getPropertyValue( C2U( "Filter" ) ) >>= aQueryString ); + } + catch( const Exception& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + + + return aQueryString; + +} +//------------------------------------------------------------------------ +Sequence< ::rtl::OUString > BibDataManager::getQueryFields() +{ + Sequence< ::rtl::OUString > aFieldSeq; + Reference< XNameAccess > xFields = getColumns( m_xForm ); + if (xFields.is()) + aFieldSeq = xFields->getElementNames(); + return aFieldSeq; +} +//------------------------------------------------------------------------ +::rtl::OUString BibDataManager::getQueryField() +{ + BibConfig* pConfig = BibModul::GetConfig(); + ::rtl::OUString aFieldString = pConfig->getQueryField(); + if(!aFieldString.getLength()) + { + Sequence< ::rtl::OUString > aSeq = getQueryFields(); + const ::rtl::OUString* pFields = aSeq.getConstArray(); + if(aSeq.getLength()>0) + { + aFieldString=pFields[0]; + } + } + return aFieldString; +} +//------------------------------------------------------------------------ +void BibDataManager::startQueryWith(const ::rtl::OUString& rQuery) +{ + BibConfig* pConfig = BibModul::GetConfig(); + pConfig->setQueryText( rQuery ); + + ::rtl::OUString aQueryString; + if(rQuery.getLength()>0) + { + aQueryString=aQuoteChar; + aQueryString+=getQueryField(); + aQueryString+=aQuoteChar; + aQueryString+=C2U(" like '"); + String sQuery(rQuery); + sQuery.SearchAndReplaceAll('?','_'); + sQuery.SearchAndReplaceAll('*','%'); + aQueryString += sQuery; + aQueryString+=C2U("%'"); + } + setFilter(aQueryString); +} +/* -----------------03.12.99 15:05------------------- + + --------------------------------------------------*/ +void BibDataManager::setActiveDataSource(const ::rtl::OUString& rURL) +{ + ::rtl::OUString uTable; + ::rtl::OUString sTmp(aDataSourceURL); + aDataSourceURL = rURL; + + Reference< XPropertySet > aPropertySet( m_xForm, UNO_QUERY ); + if(aPropertySet.is()) + { + unload(); + + Reference< XComponent > xOldConnection; + aPropertySet->getPropertyValue(C2U("ActiveConnection")) >>= xOldConnection; + + Reference< XConnection > xConnection = getConnection(rURL); + if(!xConnection.is()) + { + aDataSourceURL = sTmp; + return; + } + Any aVal; aVal <<= xConnection; + aPropertySet->setPropertyValue(C2U("ActiveConnection"), aVal); + Reference< XMultiServiceFactory > xFactory(xConnection, UNO_QUERY); + if ( xFactory.is() ) + m_xParser.set( xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.SingleSelectQueryComposer" ) ) ), UNO_QUERY ); + + if(xOldConnection.is()) + xOldConnection->dispose(); + + Sequence< ::rtl::OUString > aTableNameSeq; + Reference< XTablesSupplier > xSupplyTables(xConnection, UNO_QUERY); + if(xSupplyTables.is()) + { + Reference< XNameAccess > xAccess = xSupplyTables->getTables(); + aTableNameSeq = xAccess->getElementNames(); + } + if(aTableNameSeq.getLength() > 0) + { + const ::rtl::OUString* pTableNames = aTableNameSeq.getConstArray(); + aActiveDataTable = pTableNames[0]; + aVal <<= aActiveDataTable; + aPropertySet->setPropertyValue(C2U("Command"), aVal); + aPropertySet->setPropertyValue(C2U("CommandType"), makeAny(CommandType::TABLE)); + //Caching for Performance + aVal <<= (sal_Int32)50; + aPropertySet->setPropertyValue(C2U("FetchSize"), aVal); + ::rtl::OUString aString(C2U("SELECT * FROM ")); + // quote the table name which may contain catalog.schema.table + Reference<XDatabaseMetaData> xMetaData(xConnection->getMetaData(),UNO_QUERY); + aQuoteChar = xMetaData->getIdentifierQuoteString(); + + ::rtl::OUString sCatalog, sSchema, sName; + ::dbtools::qualifiedNameComponents( xMetaData, aActiveDataTable, sCatalog, sSchema, sName, ::dbtools::eInDataManipulation ); + aString += ::dbtools::composeTableNameForSelect( xConnection, sCatalog, sSchema, sName ); + + m_xParser->setElementaryQuery(aString); + BibConfig* pConfig = BibModul::GetConfig(); + pConfig->setQueryField(getQueryField()); + startQueryWith(pConfig->getQueryText()); + setActiveDataTable(aActiveDataTable); + } + FeatureStateEvent aEvent; + util::URL aURL; + aEvent.IsEnabled = sal_True; + aEvent.Requery = sal_False; + aEvent.FeatureDescriptor = getActiveDataTable(); + + aEvent.State = makeAny( getDataSources() ); + + if(pToolbar) + { + aURL.Complete =C2U(".uno:Bib/source"); + aEvent.FeatureURL = aURL; + pToolbar->statusChanged( aEvent ); + } + + updateGridModel(); + load(); + } +} + +/* -------------------------------------------------- + + --------------------------------------------------*/ +void BibDataManager::setActiveDataTable(const ::rtl::OUString& rTable) +{ + ResetIdentifierMapping(); + try + { + Reference< XPropertySet > aPropertySet( m_xForm, UNO_QUERY ); + + if(aPropertySet.is()) + { + Reference< XConnection > xConnection = getConnection( m_xForm ); + Reference< XTablesSupplier > xSupplyTables(xConnection, UNO_QUERY); + Reference< XNameAccess > xAccess = xSupplyTables->getTables(); + Sequence< ::rtl::OUString > aTableNameSeq = xAccess->getElementNames(); + sal_uInt32 nCount = aTableNameSeq.getLength(); + + const ::rtl::OUString* pTableNames = aTableNameSeq.getConstArray(); + const ::rtl::OUString* pTableNamesEnd = pTableNames + nCount; + + for ( ; pTableNames != pTableNamesEnd; ++pTableNames ) + { + if ( rTable == *pTableNames ) + { + aActiveDataTable = rTable; + Any aVal; aVal <<= rTable; + aPropertySet->setPropertyValue( C2U("Command"), aVal ); + break; + } + } + if (pTableNames != pTableNamesEnd) + { + Reference< XDatabaseMetaData > xMetaData = xConnection->getMetaData(); + aQuoteChar = xMetaData->getIdentifierQuoteString(); + + Reference< XMultiServiceFactory > xFactory(xConnection, UNO_QUERY); + if ( xFactory.is() ) + m_xParser.set( xFactory->createInstance( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.SingleSelectQueryComposer" ) ) ), UNO_QUERY ); + + ::rtl::OUString aString(C2U("SELECT * FROM ")); + + ::rtl::OUString sCatalog, sSchema, sName; + ::dbtools::qualifiedNameComponents( xMetaData, aActiveDataTable, sCatalog, sSchema, sName, ::dbtools::eInDataManipulation ); + aString += ::dbtools::composeTableNameForSelect( xConnection, sCatalog, sSchema, sName ); + + m_xParser->setElementaryQuery(aString); + + BibConfig* pConfig = BibModul::GetConfig(); + pConfig->setQueryField(getQueryField()); + startQueryWith(pConfig->getQueryText()); + + BibDBDescriptor aDesc; + aDesc.sDataSource = aDataSourceURL; + aDesc.sTableOrQuery = aActiveDataTable; + aDesc.nCommandType = CommandType::TABLE; + BibModul::GetConfig()->SetBibliographyURL(aDesc); + } + } + } + catch(Exception& e ) + { + (void) e; // make compiler happy + DBG_ERROR("::setActiveDataTable: something went wrong !"); + } + +} + +//------------------------------------------------------------------------ +void SAL_CALL BibDataManager::load( ) throw (RuntimeException) +{ + if ( isLoaded() ) + // nothing to do + return; + + Reference< XLoadable > xFormAsLoadable( m_xForm, UNO_QUERY ); + DBG_ASSERT( xFormAsLoadable.is() || !m_xForm.is(), "BibDataManager::load: invalid form!"); + if ( xFormAsLoadable.is() ) + { + xFormAsLoadable->load(); + SetMeAsUidListener(); + + EventObject aEvt( static_cast< XWeak* >( this ) ); + m_aLoadListeners.notifyEach( &XLoadListener::loaded, aEvt ); + } +} + +//------------------------------------------------------------------------ +void SAL_CALL BibDataManager::unload( ) throw (RuntimeException) +{ + if ( !isLoaded() ) + // nothing to do + return; + + Reference< XLoadable >xFormAsLoadable( m_xForm, UNO_QUERY ); + DBG_ASSERT( xFormAsLoadable.is() || !m_xForm.is(), "BibDataManager::unload: invalid form!"); + if ( xFormAsLoadable.is() ) + { + EventObject aEvt( static_cast< XWeak* >( this ) ); + + { + m_aLoadListeners.notifyEach( &XLoadListener::unloading, aEvt ); + } + + RemoveMeAsUidListener(); + xFormAsLoadable->unload(); + + { + m_aLoadListeners.notifyEach( &XLoadListener::unloaded, aEvt ); + } + } +} + +//------------------------------------------------------------------------ +void SAL_CALL BibDataManager::reload( ) throw (RuntimeException) +{ + if ( !isLoaded() ) + // nothing to do + return; + + Reference< XLoadable >xFormAsLoadable( m_xForm, UNO_QUERY ); + DBG_ASSERT( xFormAsLoadable.is() || !m_xForm.is(), "BibDataManager::unload: invalid form!"); + if ( xFormAsLoadable.is() ) + { + EventObject aEvt( static_cast< XWeak* >( this ) ); + + { + m_aLoadListeners.notifyEach( &XLoadListener::reloading, aEvt ); + } + + xFormAsLoadable->reload(); + + { + m_aLoadListeners.notifyEach( &XLoadListener::reloaded, aEvt ); + } + } +} + +//------------------------------------------------------------------------ +sal_Bool SAL_CALL BibDataManager::isLoaded( ) throw (RuntimeException) +{ + Reference< XLoadable >xFormAsLoadable( m_xForm, UNO_QUERY ); + DBG_ASSERT( xFormAsLoadable.is() || !m_xForm.is(), "BibDataManager::isLoaded: invalid form!"); + + sal_Bool bLoaded = sal_False; + if ( xFormAsLoadable.is() ) + bLoaded = xFormAsLoadable->isLoaded(); + return bLoaded; +} + +//------------------------------------------------------------------------ +void SAL_CALL BibDataManager::addLoadListener( const Reference< XLoadListener >& aListener ) throw (RuntimeException) +{ + m_aLoadListeners.addInterface( aListener ); +} + +//------------------------------------------------------------------------ +void SAL_CALL BibDataManager::removeLoadListener( const Reference< XLoadListener >& aListener ) throw (RuntimeException) +{ + m_aLoadListeners.removeInterface( aListener ); +} + +//------------------------------------------------------------------------ +Reference< awt::XControlModel > BibDataManager::createGridModel(const ::rtl::OUString& rName) +{ + Reference< awt::XControlModel > xModel; + + try + { + // create the control model + Reference< XMultiServiceFactory > xMgr = ::comphelper::getProcessServiceFactory(); + Reference< XInterface > xObject = xMgr->createInstance(C2U("com.sun.star.form.component.GridControl")); + xModel=Reference< awt::XControlModel > ( xObject, UNO_QUERY ); + + // set the + Reference< XPropertySet > xPropSet( xModel, UNO_QUERY ); + xPropSet->setPropertyValue( C2U("Name"), makeAny( rName ) ); + + // set the name of the to-be-created control + ::rtl::OUString aControlName(C2U("com.sun.star.form.control.InteractionGridControl")); + Any aAny; aAny <<= aControlName; + xPropSet->setPropertyValue( C2U("DefaultControl"),aAny ); + + // the the helpURL + ::rtl::OUString uProp(C2U("HelpURL")); + Reference< XPropertySetInfo > xPropInfo = xPropSet->getPropertySetInfo(); + if (xPropInfo->hasPropertyByName(uProp)) + { + ::rtl::OUString sId = ::rtl::OUString::createFromAscii( "HID:" ); + sId += ::rtl::OUString::valueOf( (sal_Int32) HID_BIB_DB_GRIDCTRL ); + xPropSet->setPropertyValue( uProp, makeAny( ::rtl::OUString( sId ) ) ); + } + } + catch(Exception& e ) + { + (void) e; // make compiler happy + DBG_ERROR("::createGridModel: something went wrong !"); + } + + + return xModel; +} +//------------------------------------------------------------------------ +::rtl::OUString BibDataManager::getControlName(sal_Int32 nFormatKey ) +{ + ::rtl::OUString aResStr; + switch (nFormatKey) + { + case DataType::BIT: + case DataType::BOOLEAN: + aResStr=C2U("CheckBox"); + break; + case DataType::TINYINT: + case DataType::SMALLINT: + case DataType::INTEGER: + aResStr=C2U("NumericField"); ; + break; + case DataType::REAL: + case DataType::DOUBLE: + case DataType::NUMERIC: + case DataType::DECIMAL: + aResStr=C2U("FormattedField"); + break; + case DataType::TIMESTAMP: + aResStr=C2U("FormattedField"); + break; + case DataType::DATE: + aResStr=C2U("DateField"); + break; + case DataType::TIME: + aResStr=C2U("TimeField"); + break; + case DataType::CHAR: + case DataType::VARCHAR: + case DataType::LONGVARCHAR: + default: + aResStr=C2U("TextField"); + break; + } + return aResStr; +} +//------------------------------------------------------------------------ +Reference< awt::XControlModel > BibDataManager::loadControlModel( + const ::rtl::OUString& rName, sal_Bool bForceListBox) +{ + Reference< awt::XControlModel > xModel; + ::rtl::OUString aName(C2U("View_")); + aName += rName; + + try + { + Reference< XNameAccess > xFields = getColumns( m_xForm ); + if (!xFields.is()) + return xModel; + Reference< XPropertySet > xField; + + Any aElement; + + if(xFields->hasByName(rName)) + { + aElement = xFields->getByName(rName); + aElement >>= xField; + Reference< XPropertySetInfo > xInfo = xField.is() ? xField->getPropertySetInfo() : Reference< XPropertySetInfo > (); + + ::rtl::OUString sCurrentModelType; + const ::rtl::OUString sType(C2U("Type")); + sal_Int32 nFormatKey = 0; + xField->getPropertyValue(sType) >>= nFormatKey; + + ::rtl::OUString aInstanceName(C2U("com.sun.star.form.component.")); + + if (bForceListBox) + aInstanceName += C2U("ListBox"); + else + aInstanceName += getControlName(nFormatKey); + + Reference< XMultiServiceFactory > xMgr = comphelper::getProcessServiceFactory(); + Reference< XInterface > xObject = xMgr->createInstance(aInstanceName); + xModel=Reference< awt::XControlModel > ( xObject, UNO_QUERY ); + Reference< XPropertySet > xPropSet( xModel, UNO_QUERY ); + Any aFieldName; aFieldName <<= aName; + + xPropSet->setPropertyValue( FM_PROP_NAME,aFieldName); + xPropSet->setPropertyValue( FM_PROP_CONTROLSOURCE, makeAny( rName ) ); + xPropSet->setPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "NativeWidgetLook" ) ), makeAny( (sal_Bool)sal_True ) ); + + Reference< XFormComponent > aFormComp(xModel,UNO_QUERY ); + + Reference< XNameContainer > xNameCont( m_xForm, UNO_QUERY ); + xNameCont->insertByName(aName, makeAny( aFormComp ) ); + + // now if the form where we inserted the new model is already loaded, notify the model of this + // Note that this implementation below is a HACK as it relies on the fact that the model adds itself + // as load listener to it's parent, which is an implementation detail of the model. + // + // the better solution would be the following: + // in the current scenario, we insert a control model into a form. This results in the control model + // adding itself as load listener to the form. Now, the form should realize that it's already loaded + // and notify the model (which it knows as XLoadListener only) immediately. This seems to make sense. + // (as an anologon to the XStatusListener semantics). + // + // But this would be way too risky for this last-day fix here. + // 97140 - 30.01.2002 - fs@openoffice.org + Reference< XLoadable > xLoad( m_xForm, UNO_QUERY ); + if ( xLoad.is() && xLoad->isLoaded() ) + { + Reference< XLoadListener > xListener( aFormComp, UNO_QUERY ); + if ( xListener.is() ) + { + EventObject aLoadSource; + aLoadSource.Source = xLoad; + xListener->loaded( aLoadSource ); + } + } + } + } + catch(Exception& e ) + { + (void) e; // make compiler happy + DBG_ERROR("::loadControlModel: something went wrong !"); + } + return xModel; +} +//------------------------------------------------------------------------ +void SAL_CALL BibDataManager::disposing() +{ + BibDataManager_Base::WeakComponentImplHelperBase::disposing(); +} + +//------------------------------------------------------------------------ +void BibDataManager::disposing( const EventObject& /*Source*/ ) throw( ::com::sun::star::uno::RuntimeException ) +{ + // not interested in +} + +//------------------------------------------------------------------------ +void BibDataManager::propertyChange(const beans::PropertyChangeEvent& evt) throw( RuntimeException ) +{ + try + { + sal_Bool bFlag=sal_False; + if(evt.PropertyName == FM_PROP_VALUE) + { + if( evt.NewValue.getValueType() == ::getCppuType((Reference<io::XInputStream>*)0) ) + { + Reference< io::XDataInputStream > xStream( + *(const Reference< io::XInputStream > *)evt.NewValue.getValue(), UNO_QUERY ); + aUID <<= xStream->readUTF(); + } + else + aUID = evt.NewValue; + + Reference< XRowLocate > xLocate(xBibCursor, UNO_QUERY); + DBG_ASSERT(xLocate.is(), "BibDataManager::propertyChange : invalid cursor !"); + bFlag = xLocate->moveToBookmark(aUID); + } + } + catch(Exception& e ) + { + (void) e; // make compiler happy + DBG_ERROR("::propertyChange: something went wrong !"); + } + + +} +//------------------------------------------------------------------------ +void BibDataManager::SetMeAsUidListener() +{ +try +{ + Reference< XNameAccess > xFields = getColumns( m_xForm ); + if (!xFields.is()) + return; + + Sequence< ::rtl::OUString > aFields(xFields->getElementNames()); + const ::rtl::OUString* pFields = aFields.getConstArray(); + sal_Int32 nCount=aFields.getLength(); + String StrUID(C2S(STR_UID)); + ::rtl::OUString theFieldName; + for( sal_Int32 i=0; i<nCount; i++ ) + { + String aName= pFields[i]; + + if(aName.EqualsIgnoreCaseAscii(StrUID)) + { + theFieldName=pFields[i]; + break; + } + } + + if(theFieldName.getLength()>0) + { + Reference< XPropertySet > xPropSet; + Any aElement; + + aElement = xFields->getByName(theFieldName); + xPropSet = *(Reference< XPropertySet > *)aElement.getValue(); + + xPropSet->addPropertyChangeListener(FM_PROP_VALUE, this); + } + +} +catch(Exception& e ) +{ + (void) e; // make compiler happy + DBG_ERROR("Exception in BibDataManager::SetMeAsUidListener"); +} + + +} +//------------------------------------------------------------------------ +void BibDataManager::RemoveMeAsUidListener() +{ +try +{ + Reference< XNameAccess > xFields = getColumns( m_xForm ); + if (!xFields.is()) + return; + + + Sequence< ::rtl::OUString > aFields(xFields->getElementNames()); + const ::rtl::OUString* pFields = aFields.getConstArray(); + sal_Int32 nCount=aFields.getLength(); + String StrUID(C2S(STR_UID)); + ::rtl::OUString theFieldName; + for( sal_Int32 i=0; i<nCount; i++ ) + { + String aName= pFields[i]; + + if(aName.EqualsIgnoreCaseAscii(StrUID)) + { + theFieldName=pFields[i]; + break; + } + } + + if(theFieldName.getLength()>0) + { + Reference< XPropertySet > xPropSet; + Any aElement; + + aElement = xFields->getByName(theFieldName); + xPropSet = *(Reference< XPropertySet > *)aElement.getValue(); + + xPropSet->removePropertyChangeListener(FM_PROP_VALUE, this); + } + +} +catch(Exception& e ) +{ + (void) e; // make compiler happy + DBG_ERROR("Exception in BibDataManager::RemoveMeAsUidListener"); +} + + +} +/* -----------------11.11.99 15:51------------------- + + --------------------------------------------------*/ +void BibDataManager::CreateMappingDialog(Window* pParent) +{ + MappingDialog_Impl* pDlg = new MappingDialog_Impl(pParent, this); + if(RET_OK == pDlg->Execute() && pBibView) + { + reload(); +// unload(); +// pBibView->UpdatePages(); +// load(); + } + delete pDlg; +} +/* -------------------------------------------------- + + --------------------------------------------------*/ +::rtl::OUString BibDataManager::CreateDBChangeDialog(Window* pParent) +{ + ::rtl::OUString uRet; + DBChangeDialog_Impl * pDlg = new DBChangeDialog_Impl(pParent, this ); + if(RET_OK == pDlg->Execute()) + { + String sNewURL = pDlg->GetCurrentURL(); + if(sNewURL != String(getActiveDataSource())) + { + uRet = sNewURL; + } + } + delete pDlg; + return uRet; +} +/*-- 18.05.2004 15:20:15--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void BibDataManager::DispatchDBChangeDialog() +{ + if(pToolbar) + pToolbar->SendDispatch(TBC_BT_CHANGESOURCE, Sequence< PropertyValue >()); +} +/* -----------------06.12.99 15:11------------------- + + --------------------------------------------------*/ +const ::rtl::OUString& BibDataManager::GetIdentifierMapping() +{ + if(!sIdentifierMapping.getLength()) + { + BibConfig* pConfig = BibModul::GetConfig(); + BibDBDescriptor aDesc; + aDesc.sDataSource = getActiveDataSource(); + aDesc.sTableOrQuery = getActiveDataTable(); + aDesc.nCommandType = CommandType::TABLE; + const Mapping* pMapping = pConfig->GetMapping(aDesc); + sIdentifierMapping = pConfig->GetDefColumnName(IDENTIFIER_POS); + if(pMapping) + { + for(sal_uInt16 nEntry = 0; nEntry < COLUMN_COUNT; nEntry++) + { + if(pMapping->aColumnPairs[nEntry].sLogicalColumnName == sIdentifierMapping) + { + sIdentifierMapping = pMapping->aColumnPairs[nEntry].sRealColumnName; + break; + } + } + } + } + return sIdentifierMapping; +} +/* -----------------------------20.11.00 10:31-------------------------------- + + ---------------------------------------------------------------------------*/ +void BibDataManager::SetToolbar(BibToolBar* pSet) +{ + pToolbar = pSet; + if(pToolbar) + pToolbar->SetDatMan(*this); +} +/* -----------------------------08.05.2002 09:26------------------------------ + + ---------------------------------------------------------------------------*/ +uno::Reference< form::runtime::XFormController > BibDataManager::GetFormController() +{ + if(!m_xFormCtrl.is()) + { + Reference< lang::XMultiServiceFactory > xMgr = comphelper::getProcessServiceFactory(); + m_xFormCtrl = uno::Reference< form::runtime::XFormController > ( + xMgr->createInstance(C2U("com.sun.star.form.runtime.FormController")), UNO_QUERY); + m_xFormCtrl->setModel(uno::Reference< awt::XTabControllerModel > (getForm(), UNO_QUERY)); + // #100312# ------------- + m_xFormDispatch = uno::Reference< frame::XDispatch > ( m_xFormCtrl, UNO_QUERY); + } + return m_xFormCtrl; +} + +// #100312# ---------- +void BibDataManager::RegisterInterceptor( ::bib::BibBeamer* pBibBeamer) +{ + DBG_ASSERT( !m_pInterceptorHelper, "BibDataManager::RegisterInterceptor: called twice!" ); + + if( pBibBeamer ) + m_pInterceptorHelper = new BibInterceptorHelper( pBibBeamer, m_xFormDispatch); + if( m_pInterceptorHelper ) + m_pInterceptorHelper->acquire(); +} + +/*-- 18.05.2004 17:04:20--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool BibDataManager::HasActiveConnection()const +{ + sal_Bool bRet = sal_False; + Reference< XPropertySet > xPrSet( m_xForm, UNO_QUERY ); + if( xPrSet.is() ) + { + Reference< XComponent > xConnection; + xPrSet->getPropertyValue(C2U("ActiveConnection")) >>= xConnection; + bRet = xConnection.is(); + } + return bRet; +} +/*-- 04.06.2004 14:37:29--------------------------------------------------- + + -----------------------------------------------------------------------*/ +sal_Bool BibDataManager::HasActiveConnection() +{ + return getConnection( m_xForm ).is(); +} |