blob: d653a81e18974d6cac67eef6335c1c05cfb32ebe [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_extensions.hxx"
#include <bibconfig.hxx>
#include <svl/svarray.hxx>
#include <tools/debug.hxx>
#include <com/sun/star/uno/Sequence.hxx>
#include <com/sun/star/uno/Any.hxx>
#include <com/sun/star/beans/PropertyValue.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <comphelper/processfactory.hxx>
using namespace rtl;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::beans;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::lang;
/* -----------------11.11.99 14:34-------------------
--------------------------------------------------*/
typedef Mapping* MappingPtr;
SV_DECL_PTRARR_DEL(MappingArray, MappingPtr, 2, 2)
SV_IMPL_PTRARR(MappingArray, MappingPtr);
#define C2U(cChar) OUString::createFromAscii(cChar)
const char* cDataSourceHistory = "DataSourceHistory";
/* -----------------------------13.11.00 12:21--------------------------------
---------------------------------------------------------------------------*/
Sequence<OUString> BibConfig::GetPropertyNames()
{
static Sequence<OUString> aNames;
if(!aNames.getLength())
{
aNames.realloc(8);
OUString* pNames = aNames.getArray();
pNames[0] = C2U("CurrentDataSource/DataSourceName");
pNames[1] = C2U("CurrentDataSource/Command");
pNames[2] = C2U("CurrentDataSource/CommandType");
pNames[3] = C2U("BeamerHeight");
pNames[4] = C2U("ViewHeight");
pNames[5] = C2U("QueryText");
pNames[6] = C2U("QueryField");
pNames[7] = C2U("ShowColumnAssignmentWarning");
}
return aNames;
}
/* -----------------------------13.11.00 11:00--------------------------------
---------------------------------------------------------------------------*/
BibConfig::BibConfig() :
ConfigItem(C2U("Office.DataAccess/Bibliography"), CONFIG_MODE_DELAYED_UPDATE),
pMappingsArr(new MappingArray),
nBeamerSize(0),
nViewSize(0),
bShowColumnAssignmentWarning(sal_False)
{
//Names of the default columns
aColumnDefaults[0] = C2U("Identifier");
aColumnDefaults[1] = C2U("BibliographyType");
aColumnDefaults[2] = C2U("Author");
aColumnDefaults[3] = C2U("Title");
aColumnDefaults[4] = C2U("Year");
aColumnDefaults[5] = C2U("ISBN");
aColumnDefaults[6] = C2U("Booktitle");
aColumnDefaults[7] = C2U("Chapter");
aColumnDefaults[8] = C2U("Edition");
aColumnDefaults[9] = C2U("Editor");
aColumnDefaults[10] = C2U("Howpublished");
aColumnDefaults[11] = C2U("Institution");
aColumnDefaults[12] = C2U("Journal");
aColumnDefaults[13] = C2U("Month");
aColumnDefaults[14] = C2U("Note");
aColumnDefaults[15] = C2U("Annote");
aColumnDefaults[16] = C2U("Number");
aColumnDefaults[17] = C2U("Organizations");
aColumnDefaults[18] = C2U("Pages");
aColumnDefaults[19] = C2U("Publisher");
aColumnDefaults[20] = C2U("Address");
aColumnDefaults[21] = C2U("School");
aColumnDefaults[22] = C2U("Series");
aColumnDefaults[23] = C2U("ReportType");
aColumnDefaults[24] = C2U("Volume");
aColumnDefaults[25] = C2U("URL");
aColumnDefaults[26] = C2U("Custom1");
aColumnDefaults[27] = C2U("Custom2");
aColumnDefaults[28] = C2U("Custom3");
aColumnDefaults[29] = C2U("Custom4");
aColumnDefaults[30] = C2U("Custom5");
const Sequence< OUString > aPropertyNames = GetPropertyNames();
const Sequence<Any> aPropertyValues = GetProperties( aPropertyNames );
const Any* pValues = aPropertyValues.getConstArray();
if(aPropertyValues.getLength() == aPropertyNames.getLength())
{
for(int nProp = 0; nProp < aPropertyNames.getLength(); nProp++)
{
if(pValues[nProp].hasValue())
{
switch(nProp)
{
case 0: pValues[nProp] >>= sDataSource; break;
case 1: pValues[nProp] >>= sTableOrQuery; break;
case 2: pValues[nProp] >>= nTblOrQuery; break;
case 3: pValues[nProp] >>= nBeamerSize; break;
case 4: pValues[nProp] >>= nViewSize ; break;
case 5: pValues[nProp] >>= sQueryText ; break;
case 6: pValues[nProp] >>= sQueryField; break;
case 7:
bShowColumnAssignmentWarning = *(sal_Bool*)pValues[nProp].getValue();
break;
}
}
}
}
OUString sName(C2U("DataSourceName"));
OUString sTable(C2U("Command"));
OUString sCommandType(C2U("CommandType"));
Sequence< OUString > aNodeNames = GetNodeNames(C2U(cDataSourceHistory));
const OUString* pNodeNames = aNodeNames.getConstArray();
for(sal_Int32 nNode = 0; nNode < aNodeNames.getLength(); nNode++)
{
Sequence<OUString> aHistoryNames(3);
OUString* pHistoryNames = aHistoryNames.getArray();
OUString sPrefix(C2U(cDataSourceHistory));
sPrefix += C2U("/");
sPrefix += pNodeNames[nNode];
sPrefix += C2U("/");
pHistoryNames[0] = sPrefix;
pHistoryNames[0] += sName;
pHistoryNames[1] = sPrefix;
pHistoryNames[1] += sTable;
pHistoryNames[2] = sPrefix;
pHistoryNames[2] += sCommandType;
Sequence<Any> aHistoryValues = GetProperties( aHistoryNames );
const Any* pHistoryValues = aHistoryValues.getConstArray();
if(aHistoryValues.getLength() == aHistoryNames.getLength())
{
Mapping* pMapping = new Mapping;
pHistoryValues[0] >>= pMapping->sURL;
pHistoryValues[1] >>= pMapping->sTableName;
pHistoryValues[2] >>= pMapping->nCommandType;
//field assignment is contained in another set
sPrefix += C2U("Fields");
Sequence< OUString > aAssignmentNodeNames = GetNodeNames(sPrefix);
const OUString* pAssignmentNodeNames = aAssignmentNodeNames.getConstArray();
Sequence<OUString> aAssignmentPropertyNames(aAssignmentNodeNames.getLength() * 2);
OUString* pAssignmentPropertyNames = aAssignmentPropertyNames.getArray();
sal_Int16 nFieldIdx = 0;
for(sal_Int16 nField = 0; nField < aAssignmentNodeNames.getLength(); nField++)
{
OUString sSubPrefix(sPrefix);
sSubPrefix += C2U("/");
sSubPrefix += pAssignmentNodeNames[nField];
pAssignmentPropertyNames[nFieldIdx] = sSubPrefix;
pAssignmentPropertyNames[nFieldIdx++] += C2U("/ProgrammaticFieldName");
pAssignmentPropertyNames[nFieldIdx] = sSubPrefix;
pAssignmentPropertyNames[nFieldIdx++] += C2U("/AssignedFieldName");
}
Sequence<Any> aAssignmentValues = GetProperties(aAssignmentPropertyNames);
const Any* pAssignmentValues = aAssignmentValues.getConstArray();
OUString sTempLogical;
OUString sTempReal;
sal_Int16 nSetMapping = 0;
nFieldIdx = 0;
for(sal_Int16 nFieldVal = 0; nFieldVal < aAssignmentValues.getLength() / 2; nFieldVal++)
{
pAssignmentValues[nFieldIdx++] >>= sTempLogical;
pAssignmentValues[nFieldIdx++] >>= sTempReal;
if(sTempLogical.getLength() && sTempReal.getLength())
{
pMapping->aColumnPairs[nSetMapping].sLogicalColumnName = sTempLogical;
pMapping->aColumnPairs[nSetMapping++].sRealColumnName = sTempReal;
}
}
pMappingsArr->Insert(pMapping, pMappingsArr->Count());
}
}
}
/* -----------------------------13.11.00 11:00--------------------------------
---------------------------------------------------------------------------*/
BibConfig::~BibConfig()
{
if(IsModified())
Commit();
delete pMappingsArr;
}
/* -----------------------------13.11.00 12:08--------------------------------
---------------------------------------------------------------------------*/
BibDBDescriptor BibConfig::GetBibliographyURL()
{
BibDBDescriptor aRet;
aRet.sDataSource = sDataSource;
aRet.sTableOrQuery = sTableOrQuery;
aRet.nCommandType = nTblOrQuery;
return aRet;
};
/* -----------------------------13.11.00 12:20--------------------------------
---------------------------------------------------------------------------*/
void BibConfig::SetBibliographyURL(const BibDBDescriptor& rDesc)
{
sDataSource = rDesc.sDataSource;
sTableOrQuery = rDesc.sTableOrQuery;
nTblOrQuery = rDesc.nCommandType;
SetModified();
};
//---------------------------------------------------------------------------
void BibConfig::Notify( const com::sun::star::uno::Sequence<rtl::OUString>& )
{
}
void BibConfig::Commit()
{
const Sequence<OUString> aPropertyNames = GetPropertyNames();
Sequence<Any> aValues(aPropertyNames.getLength());
Any* pValues = aValues.getArray();
for(int nProp = 0; nProp < aPropertyNames.getLength(); nProp++)
{
switch(nProp)
{
case 0: pValues[nProp] <<= sDataSource; break;
case 1: pValues[nProp] <<= sTableOrQuery; break;
case 2: pValues[nProp] <<= nTblOrQuery; break;
case 3: pValues[nProp] <<= nBeamerSize; break;
case 4: pValues[nProp] <<= nViewSize; break;
case 5: pValues[nProp] <<= sQueryText; break;
case 6: pValues[nProp] <<= sQueryField; break;
case 7:
pValues[nProp].setValue(&bShowColumnAssignmentWarning, ::getBooleanCppuType());
break;
}
}
PutProperties(aPropertyNames, aValues);
ClearNodeSet( C2U(cDataSourceHistory));
OUString sEmpty;
Sequence< PropertyValue > aNodeValues(pMappingsArr->Count() * 3);
PropertyValue* pNodeValues = aNodeValues.getArray();
sal_Int32 nIndex = 0;
OUString sName(C2U("DataSourceName"));
OUString sTable(C2U("Command"));
OUString sCommandType(C2U("CommandType"));
for(sal_Int32 i = 0; i < pMappingsArr->Count(); i++)
{
const Mapping* pMapping = pMappingsArr->GetObject((sal_uInt16)i);
OUString sPrefix(C2U(cDataSourceHistory));
sPrefix += C2U("/_");
sPrefix += OUString::valueOf(i);
sPrefix += C2U("/");
pNodeValues[nIndex].Name = sPrefix;
pNodeValues[nIndex].Name += sName;
pNodeValues[nIndex++].Value <<= pMapping->sURL;
pNodeValues[nIndex].Name = sPrefix;
pNodeValues[nIndex].Name += sTable;
pNodeValues[nIndex++].Value <<= pMapping->sTableName;
pNodeValues[nIndex].Name = sPrefix;
pNodeValues[nIndex].Name += sCommandType;
pNodeValues[nIndex++].Value <<= pMapping->nCommandType;
SetSetProperties( C2U(cDataSourceHistory), aNodeValues);
sPrefix += C2U("Fields");
sal_Int32 nFieldAssignment = 0;
OUString sFieldName = C2U("/ProgrammaticFieldName");
OUString sDatabaseFieldName = C2U("/AssignedFieldName");
ClearNodeSet( sPrefix );
while(nFieldAssignment < COLUMN_COUNT &&
pMapping->aColumnPairs[nFieldAssignment].sLogicalColumnName.getLength())
{
OUString sSubPrefix(sPrefix);
sSubPrefix += C2U("/_");
sSubPrefix += OUString::valueOf(nFieldAssignment);
Sequence< PropertyValue > aAssignmentValues(2);
PropertyValue* pAssignmentValues = aAssignmentValues.getArray();
pAssignmentValues[0].Name = sSubPrefix;
pAssignmentValues[0].Name += sFieldName;
pAssignmentValues[0].Value <<= pMapping->aColumnPairs[nFieldAssignment].sLogicalColumnName;
pAssignmentValues[1].Name = sSubPrefix;
pAssignmentValues[1].Name += sDatabaseFieldName;
pAssignmentValues[1].Value <<= pMapping->aColumnPairs[nFieldAssignment].sRealColumnName;
SetSetProperties( sPrefix, aAssignmentValues );
nFieldAssignment++;
}
}
}
/* -----------------------------13.11.00 12:23--------------------------------
---------------------------------------------------------------------------*/
const Mapping* BibConfig::GetMapping(const BibDBDescriptor& rDesc) const
{
for(sal_uInt16 i = 0; i < pMappingsArr->Count(); i++)
{
const Mapping* pMapping = pMappingsArr->GetObject(i);
sal_Bool bURLEqual = rDesc.sDataSource.equals(pMapping->sURL);
if(rDesc.sTableOrQuery == pMapping->sTableName && bURLEqual)
return pMapping;
}
return 0;
}
/* -----------------------------13.11.00 12:23--------------------------------
---------------------------------------------------------------------------*/
void BibConfig::SetMapping(const BibDBDescriptor& rDesc, const Mapping* pSetMapping)
{
for(sal_uInt16 i = 0; i < pMappingsArr->Count(); i++)
{
const Mapping* pMapping = pMappingsArr->GetObject(i);
sal_Bool bURLEqual = rDesc.sDataSource.equals(pMapping->sURL);
if(rDesc.sTableOrQuery == pMapping->sTableName && bURLEqual)
{
pMappingsArr->DeleteAndDestroy(i, 1);
break;
}
}
Mapping* pNew = new Mapping(*pSetMapping);
pMappingsArr->Insert(pNew, pMappingsArr->Count());
SetModified();
}
/* -----------------------------20.11.00 11:56--------------------------------
---------------------------------------------------------------------------*/
DBChangeDialogConfig_Impl::DBChangeDialogConfig_Impl()
{
}
/* -----------------------------20.11.00 11:57--------------------------------
---------------------------------------------------------------------------*/
DBChangeDialogConfig_Impl::~DBChangeDialogConfig_Impl()
{
}
/* -----------------------------14.03.01 12:53--------------------------------
---------------------------------------------------------------------------*/
const Sequence<OUString>& DBChangeDialogConfig_Impl::GetDataSourceNames()
{
if(!aSourceNames.getLength())
{
Reference<XNameAccess> xDBContext;
Reference< XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() );
if( xMgr.is() )
{
Reference<XInterface> xInstance = xMgr->createInstance( C2U( "com.sun.star.sdb.DatabaseContext" ));
xDBContext = Reference<XNameAccess>(xInstance, UNO_QUERY) ;
}
if(xDBContext.is())
{
aSourceNames = xDBContext->getElementNames();
}
}
return aSourceNames;
}