blob: df8795ecc7ad139f7734c97a500f95e3ead06abb [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_sw.hxx"
#ifdef SW_DLLIMPLEMENTATION
#undef SW_DLLIMPLEMENTATION
#endif
#define _CHANGEDB_CXX
#include <svtools/stdctrl.hxx>
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/sdb/XDatabaseAccess.hpp>
#include <comphelper/processfactory.hxx>
#include <sfx2/viewfrm.hxx>
#ifndef _VIEW_HXX
#include <view.hxx>
#endif
#include <wrtsh.hxx>
#ifndef _DBMGR_HXX
#include <dbmgr.hxx>
#endif
#include <fldmgr.hxx>
#include <expfld.hxx>
#include <txtatr.hxx>
#include <ndtxt.hxx>
#include <fldbas.hxx>
#include <dbfld.hxx>
#include <changedb.hxx>
#ifndef _FLDUI_HRC
#include <fldui.hrc>
#endif
#ifndef _UTLUI_HRC
#include <utlui.hrc>
#endif
#ifndef _CHANGEDB_HRC
#include <changedb.hrc>
#endif
#include <unomid.h>
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::container;
using namespace ::com::sun::star::lang;
/*--------------------------------------------------------------------
Beschreibung: Feldeinfuegen bearbeiten
--------------------------------------------------------------------*/
SwChangeDBDlg::SwChangeDBDlg(SwView& rVw) :
SvxStandardDialog(&rVw.GetViewFrame()->GetWindow(), SW_RES(DLG_CHANGE_DB)),
aDBListFL (this, SW_RES(FL_DBLIST )),
aUsedDBFT (this, SW_RES(FT_USEDDB )),
aAvailDBFT (this, SW_RES(FT_AVAILDB )),
aUsedDBTLB (this, SW_RES(TLB_USEDDB )),
aAvailDBTLB (this, SW_RES(TLB_AVAILDB ), 0),
aAddDBPB (this, SW_RES(PB_ADDDB)),
aDescFT (this, SW_RES(FT_DESC )),
aDocDBTextFT(this, SW_RES(FT_DOCDBTEXT )),
aDocDBNameFT(this, SW_RES(FT_DOCDBNAME )),
aOKBT (this, SW_RES(BT_OK )),
aCancelBT (this, SW_RES(BT_CANCEL )),
aHelpBT (this, SW_RES(BT_HELP )),
// aChangeBT (this, SW_RES(BT_CHANGEDB )),
aImageList (SW_RES(ILIST_DB_DLG )),
aImageListHC (SW_RES(ILIST_DB_DLG_HC )),
pSh(rVw.GetWrtShellPtr()),
pMgr( new SwFldMgr() )
{
aAvailDBTLB.SetWrtShell(*pSh);
FillDBPopup();
FreeResource();
ShowDBName(pSh->GetDBData());
aOKBT.SetClickHdl(LINK(this, SwChangeDBDlg, ButtonHdl));
aAddDBPB.SetClickHdl(LINK(this, SwChangeDBDlg, AddDBHdl));
aUsedDBTLB.SetSelectionMode(MULTIPLE_SELECTION);
aUsedDBTLB.SetStyle(aUsedDBTLB.GetStyle()|WB_HASLINES|WB_CLIPCHILDREN|WB_SORT|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL);
aUsedDBTLB.SetSpaceBetweenEntries(0);
aUsedDBTLB.SetNodeBitmaps( aImageList.GetImage(IMG_COLLAPSE),
aImageList.GetImage(IMG_EXPAND ), BMP_COLOR_NORMAL );
aUsedDBTLB.SetNodeBitmaps( aImageListHC.GetImage(IMG_COLLAPSE),
aImageListHC.GetImage(IMG_EXPAND ), BMP_COLOR_HIGHCONTRAST );
Link aLink = LINK(this, SwChangeDBDlg, TreeSelectHdl);
aUsedDBTLB.SetSelectHdl(aLink);
aUsedDBTLB.SetDeselectHdl(aLink);
aAvailDBTLB.SetSelectHdl(aLink);
aAvailDBTLB.SetDeselectHdl(aLink);
TreeSelectHdl();
}
/*--------------------------------------------------------------------
Beschreibung: Datenbank-Listboxen initialisieren
--------------------------------------------------------------------*/
void SwChangeDBDlg::FillDBPopup()
{
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) ;
}
DBG_ASSERT(xDBContext.is(), "com.sun.star.sdb.DataBaseContext: service not available");
const SwDBData& rDBData = pSh->GetDBData();
String sDBName(rDBData.sDataSource);
String sTableName(rDBData.sCommand);
aAvailDBTLB.Select(sDBName, sTableName, aEmptyStr);
SvStringsDtor aAllDBNames(5, 5);
Sequence< ::rtl::OUString > aDBNames = xDBContext->getElementNames();
const ::rtl::OUString* pDBNames = aDBNames.getConstArray();
sal_Int32 nDBCount = aDBNames.getLength();
for(sal_Int32 i = 0; i < nDBCount; i++)
{
aAllDBNames.Insert(new String(pDBNames[i]), aAllDBNames.Count());
}
SvStringsDtor aDBNameList(5, 1);
pSh->GetAllUsedDB( aDBNameList, &aAllDBNames );
sal_uInt16 nCount = aDBNameList.Count();
aUsedDBTLB.Clear();
SvLBoxEntry *pFirst = 0;
SvLBoxEntry *pLast = 0;
for (sal_uInt16 k = 0; k < nCount; k++)
{
sDBName = *aDBNameList.GetObject(k);
sDBName = sDBName.GetToken(0);
pLast = Insert(sDBName);
if (!pFirst)
pFirst = pLast;
}
if (pFirst)
{
aUsedDBTLB.MakeVisible(pFirst);
aUsedDBTLB.Select(pFirst);
}
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
SvLBoxEntry* SwChangeDBDlg::Insert(const String& rDBName)
{
String sDBName(rDBName.GetToken(0, DB_DELIM));
String sTableName(rDBName.GetToken(1, DB_DELIM));
int nCommandType = rDBName.GetToken(2, DB_DELIM).ToInt32();
SvLBoxEntry* pParent;
SvLBoxEntry* pChild;
sal_uInt16 nParent = 0;
sal_uInt16 nChild = 0;
Image aTableImg = aImageList.GetImage(IMG_DBTABLE);
Image aDBImg = aImageList.GetImage(IMG_DB);
Image aQueryImg = aImageList.GetImage(IMG_DBQUERY);
Image aHCTableImg = aImageListHC.GetImage(IMG_DBTABLE);
Image aHCDBImg = aImageListHC.GetImage(IMG_DB);
Image aHCQueryImg = aImageListHC.GetImage(IMG_DBQUERY);
Image& rToInsert = nCommandType ? aQueryImg : aTableImg;
Image& rHCToInsert = nCommandType ? aHCQueryImg : aHCTableImg;
while ((pParent = aUsedDBTLB.GetEntry(nParent++)) != NULL)
{
if (sDBName == aUsedDBTLB.GetEntryText(pParent))
{
while ((pChild = aUsedDBTLB.GetEntry(pParent, nChild++)) != NULL)
{
if (sTableName == aUsedDBTLB.GetEntryText(pChild))
return pChild;
}
SvLBoxEntry* pRet = aUsedDBTLB.InsertEntry(sTableName, rToInsert, rToInsert, pParent);
aUsedDBTLB.SetExpandedEntryBmp(pRet, rHCToInsert, BMP_COLOR_HIGHCONTRAST);
aUsedDBTLB.SetCollapsedEntryBmp(pRet, rHCToInsert, BMP_COLOR_HIGHCONTRAST);
pRet->SetUserData((void*)nCommandType);
return pRet;
}
}
pParent = aUsedDBTLB.InsertEntry(sDBName, aDBImg, aDBImg);
aUsedDBTLB.SetExpandedEntryBmp(pParent, aHCDBImg, BMP_COLOR_HIGHCONTRAST);
aUsedDBTLB.SetCollapsedEntryBmp(pParent, aHCDBImg, BMP_COLOR_HIGHCONTRAST);
SvLBoxEntry* pRet = aUsedDBTLB.InsertEntry(sTableName, rToInsert, rToInsert, pParent);
aUsedDBTLB.SetExpandedEntryBmp(pRet, rHCToInsert, BMP_COLOR_HIGHCONTRAST);
aUsedDBTLB.SetCollapsedEntryBmp(pRet, rHCToInsert, BMP_COLOR_HIGHCONTRAST);
pRet->SetUserData((void*)nCommandType);
return pRet;
}
/*--------------------------------------------------------------------
Beschreibung: Dialog zerstoeren
--------------------------------------------------------------------*/
__EXPORT SwChangeDBDlg::~SwChangeDBDlg()
{
delete pMgr;
}
/*--------------------------------------------------------------------
Beschreibung: Schliessen
--------------------------------------------------------------------*/
void __EXPORT SwChangeDBDlg::Apply()
{
UpdateFlds();
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void SwChangeDBDlg::UpdateFlds()
{
SvStringsDtor aDBNames( (sal_uInt8)aUsedDBTLB.GetSelectionCount(), 1 );
SvLBoxEntry* pEntry = aUsedDBTLB.FirstSelected();
while( pEntry )
{
if( aUsedDBTLB.GetParent( pEntry ))
{
String* pTmp = new String( aUsedDBTLB.GetEntryText(
aUsedDBTLB.GetParent( pEntry )));
*pTmp += DB_DELIM;
*pTmp += aUsedDBTLB.GetEntryText( pEntry );
*pTmp += DB_DELIM;
int nCommandType = (int)(sal_uLong)pEntry->GetUserData();
*pTmp += String::CreateFromInt32(nCommandType);
aDBNames.Insert(pTmp, aDBNames.Count() );
}
pEntry = aUsedDBTLB.NextSelected(pEntry);
}
pSh->StartAllAction();
String sTableName, sColumnName;
sal_Bool bIsTable = sal_False;
String sTemp(aAvailDBTLB.GetDBName(sTableName, sColumnName, &bIsTable));
sTemp += DB_DELIM;
sTemp += sTableName;
sTemp += DB_DELIM;
sTemp += bIsTable ? '0' : '1';
pSh->ChangeDBFields( aDBNames, sTemp);
pSh->EndAllAction();
}
/*------------------------------------------------------------------------
Beschreibung:
------------------------------------------------------------------------*/
IMPL_LINK( SwChangeDBDlg, ButtonHdl, Button *, EMPTYARG )
{
String sTableName, sColumnName;
SwDBData aData;
sal_Bool bIsTable = sal_False;
aData.sDataSource = aAvailDBTLB.GetDBName(sTableName, sColumnName, &bIsTable);
aData.sCommand = sTableName;
aData.nCommandType = bIsTable ? 0 : 1;;
pSh->ChgDBData(aData);
ShowDBName(pSh->GetDBData());
EndDialog(RET_OK);
return 0;
}
/*------------------------------------------------------------------------
Beschreibung:
------------------------------------------------------------------------*/
IMPL_LINK( SwChangeDBDlg, TreeSelectHdl, SvTreeListBox *, EMPTYARG )
{
sal_Bool bEnable = sal_False;
SvLBoxEntry* pEntry = aAvailDBTLB.GetCurEntry();
if (pEntry)
{
if (aAvailDBTLB.GetParent(pEntry))
bEnable = sal_True;
aOKBT.Enable( bEnable );
}
return 0;
}
/*--------------------------------------------------------------------
Beschreibung: Datenbankname fuer Anzeige wandeln
--------------------------------------------------------------------*/
void SwChangeDBDlg::ShowDBName(const SwDBData& rDBData)
{
String sTmp(rDBData.sDataSource);
String sName;
sTmp += '.';
sTmp += (String)rDBData.sCommand;
for (sal_uInt16 i = 0; i < sTmp.Len(); i++)
{
sName += sTmp.GetChar(i);
if (sTmp.GetChar(i) == '~')
sName += '~';
}
aDocDBNameFT.SetText(sName);
}
/*-- 27.05.2004 09:14:01---------------------------------------------------
-----------------------------------------------------------------------*/
IMPL_LINK( SwChangeDBDlg, AddDBHdl, PushButton *, EMPTYARG )
{
String sNewDB = SwNewDBMgr::LoadAndRegisterDataSource();
if(sNewDB.Len())
aAvailDBTLB.AddDataSource(sNewDB);
return 0;
}