summaryrefslogtreecommitdiff
path: root/dbaccess/source/ui/dlg/dbfindex.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'dbaccess/source/ui/dlg/dbfindex.cxx')
-rw-r--r--dbaccess/source/ui/dlg/dbfindex.cxx583
1 files changed, 583 insertions, 0 deletions
diff --git a/dbaccess/source/ui/dlg/dbfindex.cxx b/dbaccess/source/ui/dlg/dbfindex.cxx
new file mode 100644
index 000000000000..020e23eb87ce
--- /dev/null
+++ b/dbaccess/source/ui/dlg/dbfindex.cxx
@@ -0,0 +1,583 @@
+/*************************************************************************
+ *
+ * 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_dbaccess.hxx"
+
+#ifndef _DBAUI_DBFINDEX_HXX_
+#include "dbfindex.hxx"
+#endif
+
+#ifndef _CONFIG_HXX
+#include <tools/config.hxx>
+#endif
+#ifndef _SFXAPP_HXX //autogen
+#include <sfx2/app.hxx>
+#endif
+#ifndef _DBAUI_MODULE_DBU_HXX_
+#include "moduledbu.hxx"
+#endif
+#ifndef _DBU_DLG_HRC_
+#include "dbu_dlg.hrc"
+#endif
+#ifndef _DBAUI_DBF_INDEXES_HRC_
+#include "dbfindex.hrc"
+#endif
+#ifndef _TOOLS_DEBUG_HXX
+#include <tools/debug.hxx>
+#endif
+#ifndef _UNOTOOLS_LOCALFILEHELPER_HXX
+#include <unotools/localfilehelper.hxx>
+#endif
+#ifndef _URLOBJ_HXX
+#include <tools/urlobj.hxx>
+#endif
+#ifndef INCLUDED_SVTOOLS_PATHOPTIONS_HXX
+#include <unotools/pathoptions.hxx>
+#endif
+#ifndef _UCBHELPER_CONTENT_HXX
+#include <ucbhelper/content.hxx>
+#endif
+#ifndef SVTOOLS_FILENOTATION_HXX_
+#include <svl/filenotation.hxx>
+#endif
+
+
+//.........................................................................
+namespace dbaui
+{
+//.........................................................................
+
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star::ucb;
+using namespace ::svt;
+
+const ByteString aGroupIdent("dBase III");
+
+//////////////////////////////////////////////////////////////////////////
+// Klasse ODbaseIndexDialog
+DBG_NAME(ODbaseIndexDialog)
+//-------------------------------------------------------------------------
+ODbaseIndexDialog::ODbaseIndexDialog( Window * pParent, String aDataSrcName )
+ : ModalDialog( pParent, ModuleRes(DLG_DBASE_INDEXES) ),
+ aPB_OK( this, ModuleRes( PB_OK ) ),
+ aPB_CANCEL( this, ModuleRes( PB_CANCEL ) ),
+ aPB_HELP( this, ModuleRes( PB_HELP ) ),
+ m_FT_Tables( this, ModuleRes( FT_TABLES ) ),
+ aCB_Tables( this, ModuleRes( CB_TABLES ) ),
+ m_FL_Indexes( this, ModuleRes( FL_INDEXES ) ),
+ m_FT_TableIndexes( this, ModuleRes( FT_TABLEINDEXES ) ),
+ aLB_TableIndexes( this, ModuleRes( LB_TABLEINDEXES ) ),
+ m_FT_AllIndexes( this, ModuleRes( FT_ALLINDEXES ) ),
+ aLB_FreeIndexes( this, ModuleRes( LB_FREEINDEXES ) ),
+ aIB_Add( this, ModuleRes( IB_ADD ) ),
+ aIB_Remove( this, ModuleRes( IB_REMOVE ) ),
+ aIB_AddAll( this, ModuleRes( IB_ADDALL ) ),
+ aIB_RemoveAll( this, ModuleRes( IB_REMOVEALL ) ),
+ m_aDSN(aDataSrcName),
+ m_bCaseSensitiv(sal_True)
+{
+ DBG_CTOR(ODbaseIndexDialog,NULL);
+
+ aCB_Tables.SetSelectHdl( LINK(this, ODbaseIndexDialog, TableSelectHdl) );
+ aIB_Add.SetClickHdl( LINK(this, ODbaseIndexDialog, AddClickHdl) );
+ aIB_Remove.SetClickHdl( LINK(this, ODbaseIndexDialog, RemoveClickHdl) );
+ aIB_AddAll.SetClickHdl( LINK(this, ODbaseIndexDialog, AddAllClickHdl) );
+ aIB_RemoveAll.SetClickHdl( LINK(this, ODbaseIndexDialog, RemoveAllClickHdl) );
+ aPB_OK.SetClickHdl( LINK(this, ODbaseIndexDialog, OKClickHdl) );
+
+ aLB_FreeIndexes.SetSelectHdl( LINK(this, ODbaseIndexDialog, OnListEntrySelected) );
+ aLB_TableIndexes.SetSelectHdl( LINK(this, ODbaseIndexDialog, OnListEntrySelected) );
+
+ aCB_Tables.SetDropDownLineCount(8);
+ Init();
+ SetCtrls();
+ FreeResource();
+
+ // set Hi contrast bitmaps
+ aIB_Add.SetModeImage( ModuleRes(IMG_ONE_LEFT_H),BMP_COLOR_HIGHCONTRAST);
+ aIB_AddAll.SetModeImage( ModuleRes(IMG_ALL_LEFT_H),BMP_COLOR_HIGHCONTRAST);
+ aIB_Remove.SetModeImage( ModuleRes(IMG_ONE_RIGHT_H),BMP_COLOR_HIGHCONTRAST);
+ aIB_RemoveAll.SetModeImage( ModuleRes(IMG_ALL_RIGHT_H),BMP_COLOR_HIGHCONTRAST);
+}
+
+//-------------------------------------------------------------------------
+ODbaseIndexDialog::~ODbaseIndexDialog()
+{
+
+ DBG_DTOR(ODbaseIndexDialog,NULL);
+}
+
+//-------------------------------------------------------------------------
+sal_Bool ODbaseIndexDialog::GetTable(const String& _rName, TableInfoListIterator& _rPosition)
+{
+ for ( _rPosition = m_aTableInfoList.begin();
+ _rPosition != m_aTableInfoList.end();
+ ++_rPosition
+ )
+ {
+ if (m_bCaseSensitiv)
+ {
+ if (_rPosition->aTableName.Equals(_rName))
+ return sal_True;
+ }
+ else
+ {
+ if (_rPosition->aTableName.EqualsIgnoreCaseAscii(_rName))
+ return sal_True;
+ }
+ }
+ return sal_False;
+}
+
+//-------------------------------------------------------------------------
+void ODbaseIndexDialog::checkButtons()
+{
+ aIB_Add.Enable(0 != aLB_FreeIndexes.GetSelectEntryCount());
+ aIB_AddAll.Enable(0 != aLB_FreeIndexes.GetEntryCount());
+
+ aIB_Remove.Enable(0 != aLB_TableIndexes.GetSelectEntryCount());
+ aIB_RemoveAll.Enable(0 != aLB_TableIndexes.GetEntryCount());
+}
+
+//-------------------------------------------------------------------------
+OTableIndex ODbaseIndexDialog::implRemoveIndex(const String& _rName, TableIndexList& _rList, ListBox& _rDisplay, sal_Bool _bMustExist)
+{
+ OTableIndex aReturn;
+
+ sal_Int32 nPos = 0;
+
+ TableIndexListIterator aSearch;
+ for ( aSearch = _rList.begin();
+ aSearch != _rList.end();
+ ++aSearch, ++nPos
+ )
+ {
+ if ( m_bCaseSensitiv ? aSearch->GetIndexFileName().Equals(_rName) : aSearch->GetIndexFileName().EqualsIgnoreCaseAscii(_rName) )
+ {
+ aReturn = *aSearch;
+
+ _rList.erase(aSearch);
+ _rDisplay.RemoveEntry( _rName );
+
+ // adjust selection if necessary
+ if ((sal_uInt32)nPos == _rList.size())
+ _rDisplay.SelectEntryPos((sal_uInt16)nPos-1);
+ else
+ _rDisplay.SelectEntryPos((sal_uInt16)nPos);
+
+ break;
+ }
+ }
+
+ (void)_bMustExist;
+ DBG_ASSERT(!_bMustExist || (aSearch != _rList.end()), "ODbaseIndexDialog::implRemoveIndex : did not find the index!");
+ return aReturn;
+}
+
+//-------------------------------------------------------------------------
+void ODbaseIndexDialog::implInsertIndex(const OTableIndex& _rIndex, TableIndexList& _rList, ListBox& _rDisplay)
+{
+ _rList.push_front( _rIndex );
+ _rDisplay.InsertEntry( _rIndex.GetIndexFileName() );
+ _rDisplay.SelectEntryPos(0);
+}
+
+//-------------------------------------------------------------------------
+OTableIndex ODbaseIndexDialog::RemoveTableIndex( const String& _rTableName, const String& _rIndexName, sal_Bool _bMustExist )
+{
+ OTableIndex aReturn;
+
+ // does the table exist ?
+ TableInfoListIterator aTablePos;
+ if (!GetTable(_rTableName, aTablePos))
+ return aReturn;
+
+ return implRemoveIndex(_rIndexName, aTablePos->aIndexList, aLB_TableIndexes, _bMustExist);
+}
+
+//-------------------------------------------------------------------------
+void ODbaseIndexDialog::InsertTableIndex( const String& _rTableName, const OTableIndex& _rIndex)
+{
+ TableInfoListIterator aTablePos;
+ if (!GetTable(_rTableName, aTablePos))
+ return;
+
+ implInsertIndex(_rIndex, aTablePos->aIndexList, aLB_TableIndexes);
+}
+
+//-------------------------------------------------------------------------
+IMPL_LINK( ODbaseIndexDialog, OKClickHdl, PushButton*, /*pButton*/ )
+{
+ // let all tables write their INF file
+
+ for ( ConstTableInfoListIterator aLoop = m_aTableInfoList.begin();
+ aLoop != m_aTableInfoList.end();
+ ++aLoop
+ )
+ aLoop->WriteInfFile(m_aDSN);
+
+ EndDialog();
+ return 0;
+}
+
+//-------------------------------------------------------------------------
+IMPL_LINK( ODbaseIndexDialog, AddClickHdl, PushButton*, /*pButton*/ )
+{
+ String aSelection = aLB_FreeIndexes.GetSelectEntry();
+ String aTableName = aCB_Tables.GetText();
+ OTableIndex aIndex = RemoveFreeIndex( aSelection, sal_True );
+ InsertTableIndex( aTableName, aIndex );
+
+ checkButtons();
+ return 0;
+}
+
+//-------------------------------------------------------------------------
+IMPL_LINK( ODbaseIndexDialog, RemoveClickHdl, PushButton*, /*pButton*/ )
+{
+ String aSelection = aLB_TableIndexes.GetSelectEntry();
+ String aTableName = aCB_Tables.GetText();
+ OTableIndex aIndex = RemoveTableIndex( aTableName, aSelection, sal_True );
+ InsertFreeIndex( aIndex );
+
+ checkButtons();
+ return 0;
+}
+
+//-------------------------------------------------------------------------
+IMPL_LINK( ODbaseIndexDialog, AddAllClickHdl, PushButton*, /*pButton*/ )
+{
+ sal_uInt16 nCnt = aLB_FreeIndexes.GetEntryCount();
+ String aTableName = aCB_Tables.GetText();
+ String aEntry;
+
+ for( sal_uInt16 nPos = 0; nPos < nCnt; ++nPos )
+ InsertTableIndex( aTableName, RemoveFreeIndex( aLB_FreeIndexes.GetEntry(0), sal_True ) );
+
+ checkButtons();
+ return 0;
+}
+
+//-------------------------------------------------------------------------
+IMPL_LINK( ODbaseIndexDialog, RemoveAllClickHdl, PushButton*, /*pButton*/ )
+{
+ sal_uInt16 nCnt = aLB_TableIndexes.GetEntryCount();
+ String aTableName = aCB_Tables.GetText();
+ String aEntry;
+
+ for( sal_uInt16 nPos = 0; nPos < nCnt; ++nPos )
+ InsertFreeIndex( RemoveTableIndex( aTableName, aLB_TableIndexes.GetEntry(0), sal_True ) );
+
+ checkButtons();
+ return 0;
+}
+
+//-------------------------------------------------------------------------
+IMPL_LINK( ODbaseIndexDialog, OnListEntrySelected, ListBox*, /*NOTINTERESTEDIN*/ )
+{
+ checkButtons();
+ return 0;
+}
+
+//-------------------------------------------------------------------------
+IMPL_LINK( ODbaseIndexDialog, TableSelectHdl, ComboBox*, pComboBox )
+{
+ // search the table
+ TableInfoListIterator aTablePos;
+ if (!GetTable(pComboBox->GetText(), aTablePos))
+ return 0L;
+
+ // fill the listbox for the indexes
+ aLB_TableIndexes.Clear();
+ for ( ConstTableIndexListIterator aLoop = aTablePos->aIndexList.begin();
+ aLoop != aTablePos->aIndexList.end();
+ ++aLoop
+ )
+ aLB_TableIndexes.InsertEntry( aLoop->GetIndexFileName() );
+
+ if ( aTablePos->aIndexList.size() )
+ aLB_TableIndexes.SelectEntryPos(0);
+
+ checkButtons();
+ return 0;
+}
+
+//-------------------------------------------------------------------------
+void ODbaseIndexDialog::Init()
+{
+ aPB_OK.Disable();
+ m_FL_Indexes.Disable();
+ m_FT_TableIndexes.Disable();
+ aLB_TableIndexes.Disable();
+ m_FT_AllIndexes.Disable();
+ aLB_FreeIndexes.Disable();
+ aIB_Add.Disable();
+ aIB_Remove.Disable();
+ aIB_AddAll.Disable();
+ aIB_RemoveAll.Disable();
+
+ ///////////////////////////////////////////////////////////////////////////
+ // Alle Indizes werden erst einmal zur Liste der freien Indizes hinzugefuegt.
+ // Dann wird fuer jede Tabelle in der Inf-Datei nachgeschaut, welche Indizes sie besitzt.
+ // Diese Indizes werden aus der Liste der freien Indizes entfernt
+ // und in die Indexliste der Tabelle eingetragen
+
+ ///////////////////////////////////////////////////////////////////////////
+ // if the string does not contain a path, cut the string
+ INetURLObject aURL;
+ aURL.SetSmartProtocol(INET_PROT_FILE);
+ {
+ SvtPathOptions aPathOptions;
+ m_aDSN = aPathOptions.SubstituteVariable(m_aDSN);
+ }
+ aURL.SetSmartURL(m_aDSN);
+
+
+ // String aFileName = aURL.PathToFileName();
+ m_aDSN = aURL.GetMainURL(INetURLObject::NO_DECODE);
+ ::ucbhelper::Content aFile;
+ sal_Bool bFolder=sal_True;
+ try
+ {
+ aFile = ::ucbhelper::Content(m_aDSN,Reference< ::com::sun::star::ucb::XCommandEnvironment >());
+ bFolder = aFile.isFolder();
+ }
+ catch(Exception&)
+ {
+ return;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // first assume for all indexes they're free
+
+ Sequence< ::rtl::OUString> aFolderContent( ::utl::LocalFileHelper::GetFolderContents(m_aDSN,bFolder));
+
+ ::rtl::OUString aIndexExt = ::rtl::OUString::createFromAscii("ndx");
+ ::rtl::OUString aTableExt = ::rtl::OUString::createFromAscii("dbf");
+
+ ::std::vector< String > aUsedIndexes;
+
+ String aExt;
+ const ::rtl::OUString *pBegin = aFolderContent.getConstArray();
+ const ::rtl::OUString *pEnd = pBegin + aFolderContent.getLength();
+ aURL.SetSmartProtocol(INET_PROT_FILE);
+ for(;pBegin != pEnd;++pBegin)
+ {
+ String aName;
+ ::utl::LocalFileHelper::ConvertURLToPhysicalName(pBegin->getStr(),aName);
+ aURL.SetSmartURL(aName);
+ aExt = aURL.getExtension();
+ if(aExt == aIndexExt.getStr())
+ {
+ m_aFreeIndexList.push_back( OTableIndex(aURL.getName()) );
+ }
+ else if(aExt == aTableExt.getStr())
+ {
+ m_aTableInfoList.push_back( OTableInfo(aURL.getName()) );
+ OTableInfo& rTabInfo = m_aTableInfoList.back();
+
+ // open the INF file
+ aURL.setExtension(String::CreateFromAscii("inf"));
+ OFileNotation aTransformer(aURL.GetURLNoPass(), OFileNotation::N_URL);
+ Config aInfFile( aTransformer.get(OFileNotation::N_SYSTEM) );
+ aInfFile.SetGroup( aGroupIdent );
+
+ ///////////////////////////////////////////////////////////////////////////
+ // fill the indexes list
+ ByteString aNDX;
+ sal_uInt16 nKeyCnt = aInfFile.GetKeyCount();
+ ByteString aKeyName;
+ String aEntry;
+
+ for( sal_uInt16 nKey = 0; nKey < nKeyCnt; nKey++ )
+ {
+ // does the key point to an index file ?
+ aKeyName = aInfFile.GetKeyName( nKey );
+ aNDX = aKeyName.Copy(0,3);
+
+ // yes -> add to the tables index list
+ if (aNDX == "NDX" )
+ {
+ aEntry = String(aInfFile.ReadKey(aKeyName), gsl_getSystemTextEncoding());
+ rTabInfo.aIndexList.push_back( OTableIndex( aEntry ) );
+
+ // and remove it from the free index list
+ aUsedIndexes.push_back(aEntry);
+ // do this later below. We may not have encountered the index file, yet, thus we may not
+ // know the index as beeing free, yet
+ }
+
+ }
+ }
+ }
+
+ for ( ::std::vector< String >::const_iterator aUsedIndex = aUsedIndexes.begin();
+ aUsedIndex != aUsedIndexes.end();
+ ++aUsedIndex
+ )
+ RemoveFreeIndex( *aUsedIndex, sal_False );
+
+ if (m_aTableInfoList.size())
+ {
+ aPB_OK.Enable();
+ m_FL_Indexes.Enable();
+ m_FT_TableIndexes.Enable();
+ aLB_TableIndexes.Enable();
+ m_FT_AllIndexes.Enable();
+ aLB_FreeIndexes.Enable();
+ }
+
+ checkButtons();
+}
+
+//-------------------------------------------------------------------------
+void ODbaseIndexDialog::SetCtrls()
+{
+ // ComboBox Tabellen
+ for ( ConstTableInfoListIterator aLoop = m_aTableInfoList.begin();
+ aLoop != m_aTableInfoList.end();
+ ++aLoop
+ )
+ aCB_Tables.InsertEntry( aLoop->aTableName );
+
+ // Den ersten Datensatz ins Edit stellen
+ if( m_aTableInfoList.size() )
+ {
+ const OTableInfo& rTabInfo = m_aTableInfoList.front();
+ aCB_Tables.SetText( rTabInfo.aTableName );
+
+ // ListBox der Tabellenindizes aufbauen
+ for ( ConstTableIndexListIterator aIndex = rTabInfo.aIndexList.begin();
+ aIndex != rTabInfo.aIndexList.end();
+ ++aIndex
+ )
+ aLB_TableIndexes.InsertEntry( aIndex->GetIndexFileName() );
+
+ if( rTabInfo.aIndexList.size() )
+ aLB_TableIndexes.SelectEntryPos( 0 );
+
+ }
+
+ // ListBox freie Indizes
+ for ( ConstTableIndexListIterator aFree = m_aFreeIndexList.begin();
+ aFree != m_aFreeIndexList.end();
+ ++aFree
+ )
+ aLB_FreeIndexes.InsertEntry( aFree->GetIndexFileName() );
+
+ if( m_aFreeIndexList.size() )
+ aLB_FreeIndexes.SelectEntryPos( 0 );
+
+
+ TableSelectHdl(&aCB_Tables);
+ checkButtons();
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Klasse OTableInfo
+//-------------------------------------------------------------------------
+void OTableInfo::WriteInfFile( const String& rDSN ) const
+{
+ // INF-Datei oeffnen
+ INetURLObject aURL;
+ aURL.SetSmartProtocol(INET_PROT_FILE);
+ String aDsn = rDSN;
+ {
+ SvtPathOptions aPathOptions;
+ aDsn = aPathOptions.SubstituteVariable(aDsn);
+ }
+ aURL.SetSmartURL(aDsn);
+ aURL.Append(aTableName);
+ aURL.setExtension(String::CreateFromAscii("inf"));
+
+ OFileNotation aTransformer(aURL.GetURLNoPass(), OFileNotation::N_URL);
+ Config aInfFile( aTransformer.get(OFileNotation::N_SYSTEM) );
+ aInfFile.SetGroup( aGroupIdent );
+
+ // Erst einmal alle Tabellenindizes loeschen
+ ByteString aNDX;
+ sal_uInt16 nKeyCnt = aInfFile.GetKeyCount();
+ ByteString aKeyName;
+ ByteString aEntry;
+ sal_uInt16 nKey = 0;
+
+ while( nKey < nKeyCnt )
+ {
+ // Verweist der Key auf ein Indexfile?...
+ aKeyName = aInfFile.GetKeyName( nKey );
+ aNDX = aKeyName.Copy(0,3);
+
+ //...wenn ja, Indexfile loeschen, nKey steht dann auf nachfolgendem Key
+ if( aNDX == "NDX" )
+ {
+ aInfFile.DeleteKey(aKeyName);
+ nKeyCnt--;
+ }
+ else
+ nKey++;
+
+ }
+
+ // Jetzt alle gespeicherten Indizes hinzufuegen
+ sal_uInt16 nPos = 0;
+ for ( ConstTableIndexListIterator aIndex = aIndexList.begin();
+ aIndex != aIndexList.end();
+ ++aIndex, ++nPos
+ )
+ {
+ aKeyName = "NDX";
+ if( nPos > 0 ) // Erster Index erhaelt keine Ziffer
+ aKeyName += ByteString::CreateFromInt32( nPos );
+ aInfFile.WriteKey( aKeyName, ByteString(aIndex->GetIndexFileName(), gsl_getSystemTextEncoding()) );
+ }
+
+ aInfFile.Flush();
+
+ // Falls nur noch [dbase] in INF-File steht, Datei loeschen
+ if(!nPos)
+ {
+ try
+ {
+ ::ucbhelper::Content aContent(aURL.GetURLNoPass(),Reference<XCommandEnvironment>());
+ aContent.executeCommand( rtl::OUString::createFromAscii( "delete" ),makeAny( sal_Bool( sal_True ) ) );
+ }
+ catch (const Exception& e )
+ {
+ (void)e; // make compiler happy
+ // simply silent this. The strange algorithm here does a lot of things even if no files at all were
+ // created or accessed, so it's possible that the file we're trying to delete does not even exist,
+ // and this is a valid condition.
+ // 2003-05-15 - #109677# - fs@openoffice.org
+ }
+ }
+}
+
+//.........................................................................
+} // namespace dbaui
+//.........................................................................
+