summaryrefslogtreecommitdiff
path: root/dbaccess/source/ui/dlg/dbfindex.cxx
diff options
context:
space:
mode:
authorFrank Schönheit <fs@openoffice.org>2000-10-05 09:09:48 +0000
committerFrank Schönheit <fs@openoffice.org>2000-10-05 09:09:48 +0000
commitccd7874161a2409e10e8101136aa9694e6cb82cc (patch)
treebacc2512dc13c294b1155cac5ecc610700873961 /dbaccess/source/ui/dlg/dbfindex.cxx
parent13d20309158340fca42c44e7a9a460ddbeee5126 (diff)
initial checkin
Diffstat (limited to 'dbaccess/source/ui/dlg/dbfindex.cxx')
-rw-r--r--dbaccess/source/ui/dlg/dbfindex.cxx510
1 files changed, 510 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..59c7bd71f26e
--- /dev/null
+++ b/dbaccess/source/ui/dlg/dbfindex.cxx
@@ -0,0 +1,510 @@
+/*************************************************************************
+ *
+ * $RCSfile: dbfindex.cxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: fs $ $Date: 2000-10-05 10:05:22 $
+ *
+ * The Contents of this file are made available subject to the terms of
+ * either of the following licenses
+ *
+ * - GNU Lesser General Public License Version 2.1
+ * - Sun Industry Standards Source License Version 1.1
+ *
+ * Sun Microsystems Inc., October, 2000
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2000 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ *
+ * Sun Industry Standards Source License Version 1.1
+ * =================================================
+ * The contents of this file are subject to the Sun Industry Standards
+ * Source License Version 1.1 (the "License"); You may not use this file
+ * except in compliance with the License. You may obtain a copy of the
+ * License at http://www.openoffice.org/license.html.
+ *
+ * Software provided under this License is provided on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+ * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+ * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+ * See the License for the specific provisions governing your rights and
+ * obligations concerning the Software.
+ *
+ * The Initial Developer of the Original Code is: Sun Microsystems, Inc..
+ *
+ * Copyright: 2000 by Sun Microsystems, Inc.
+ *
+ * All Rights Reserved.
+ *
+ * Contributor(s): _______________________________________
+ *
+ *
+ ************************************************************************/
+
+#ifndef _DBAUI_DBFINDEX_HXX_
+#include "dbfindex.hxx"
+#endif
+
+#ifndef _FSYS_HXX //autogen
+#include <tools/fsys.hxx>
+#endif
+#ifndef _CONFIG_HXX //autogen
+#include <vcl/config.hxx>
+#endif
+#ifndef _SFXAPP_HXX //autogen
+#include <sfx2/app.hxx>
+#endif
+
+#ifndef _DBAUI_MODULE_DBU_HXX_
+#include "moduledbu.hxx"
+#endif
+#ifndef _DBU_RESOURCE_HRC_
+#include "dbu_resource.hrc"
+#endif
+#ifndef _DBAUI_DBF_INDEXES_HRC_
+#include "dbfindex.hrc"
+#endif
+#ifndef _TOOLS_DEBUG_HXX
+#include <tools/debug.hxx>
+#endif
+
+//.........................................................................
+namespace dbaui
+{
+//.........................................................................
+
+const ByteString aGroupIdent("dbase III");
+
+//////////////////////////////////////////////////////////////////////////
+// Klasse ODbaseIndexDialog
+ODbaseIndexDialog::ODbaseIndexDialog( Window * pParent, String aDataSrcName )
+ : ModalDialog( pParent, ModuleRes(DLG_DBASE_INDEXES) ),
+ aPB_OK( this, ResId( PB_OK ) ),
+ aPB_CANCEL( this, ResId( PB_CANCEL ) ),
+ aPB_HELP( this, ResId( PB_HELP ) ),
+ m_FT_Tables( this, ResId( FT_TABLES ) ),
+ aCB_Tables( this, ResId( CB_TABLES ) ),
+ m_GB_Indexes( this, ResId( GB_INDEXES ) ),
+ m_FT_TableIndexes( this, ResId( FT_TABLEINDEXES ) ),
+ aLB_TableIndexes( this, ResId( LB_TABLEINDEXES ) ),
+ m_FT_AllIndexes( this, ResId( FT_ALLINDEXES ) ),
+ aLB_FreeIndexes( this, ResId( LB_FREEINDEXES ) ),
+ aPB_Add( this, ResId( PB_ADD ) ),
+ aPB_Remove( this, ResId( PB_REMOVE ) ),
+ aPB_AddAll( this, ResId( PB_ADDALL ) ),
+ aPB_RemoveAll( this, ResId( PB_REMOVEALL ) ),
+ m_aDSN(aDataSrcName)
+{
+ aCB_Tables.SetSelectHdl( LINK(this, ODbaseIndexDialog, TableSelectHdl) );
+ aPB_Add.SetClickHdl( LINK(this, ODbaseIndexDialog, AddClickHdl) );
+ aPB_Remove.SetClickHdl( LINK(this, ODbaseIndexDialog, RemoveClickHdl) );
+ aPB_AddAll.SetClickHdl( LINK(this, ODbaseIndexDialog, AddAllClickHdl) );
+ aPB_RemoveAll.SetClickHdl( LINK(this, ODbaseIndexDialog, RemoveAllClickHdl) );
+ aPB_OK.SetClickHdl( LINK(this, ODbaseIndexDialog, OKClickHdl) );
+
+ Init();
+ SetCtrls();
+ FreeResource();
+}
+
+ODbaseIndexDialog::~ODbaseIndexDialog()
+{
+}
+
+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;
+}
+
+OTableIndex ODbaseIndexDialog::implRemoveIndex(const String& _rName, TableIndexList& _rList, ListBox& _rDisplay)
+{
+ OTableIndex aReturn;
+
+ sal_Int32 nPos = 0;
+ for ( TableIndexListIterator 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 (nPos == _rList.size())
+ _rDisplay.SelectEntryPos((sal_uInt16)nPos-1);
+ else
+ _rDisplay.SelectEntryPos((sal_uInt16)nPos);
+
+ break;
+ }
+ }
+
+ DBG_ASSERT(aSearch != _rList.end(), "ODbaseIndexDialog::RemoveFreeIndex : 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 )
+{
+ OTableIndex aReturn;
+
+ // does the table exist ?
+ TableInfoListIterator aTablePos;
+ if (!GetTable(_rTableName, aTablePos))
+ return aReturn;
+
+ return implRemoveIndex(_rIndexName, aTablePos->aIndexList, aLB_TableIndexes);
+}
+
+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 );
+ InsertTableIndex( aTableName, aIndex );
+ return 0;
+}
+
+IMPL_LINK( ODbaseIndexDialog, RemoveClickHdl, PushButton*, pButton )
+{
+ String aSelection = aLB_TableIndexes.GetSelectEntry();
+ String aTableName = aCB_Tables.GetText();
+ OTableIndex aIndex = RemoveTableIndex( aTableName, aSelection );
+ InsertFreeIndex( aIndex );
+
+ 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) ) );
+
+ 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) ) );
+
+ 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);
+
+ return 0;
+}
+
+void ODbaseIndexDialog::Init()
+{
+ ///////////////////////////////////////////////////////////////////////////
+ // 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
+
+ ///////////////////////////////////////////////////////////////////////////
+ // substitute $(INST)
+ m_aDSN = SFX_APP()->GetIniManager()->SubstPathVars( m_aDSN );
+
+ ///////////////////////////////////////////////////////////////////////////
+ // if the string does not contain a path, cut the string
+ DirEntry aInitEntry( m_aDSN );
+ FileStat aFileStat(aInitEntry); // do not combine - bug in VC++ 2.0!
+
+ if (aFileStat.IsKind(FSYS_KIND_WILD))
+ m_aDSN = (DirEntry(m_aDSN).GetPath()).GetFull();
+ else if (aFileStat.IsKind(FSYS_KIND_DIR))
+ m_aDSN = DirEntry(m_aDSN).GetFull();
+ else if (aFileStat.IsKind(FSYS_KIND_FILE))
+ m_aDSN = (DirEntry(m_aDSN).GetPath()).GetFull();
+
+ ///////////////////////////////////////////////////////////////////////////
+ // first assume for all indexes they're free
+ DirEntry aDirEntry( m_aDSN );
+
+ m_bCaseSensitiv = aDirEntry.IsCaseSensitive();
+
+ aDirEntry += String::CreateFromAscii("*.ndx");
+ Dir* pDir = new Dir( aDirEntry, FSYS_KIND_FILE,FSYS_SORT_NAME | FSYS_SORT_ASCENDING | FSYS_SORT_END );
+
+ sal_uInt16 nCount = pDir->Count();
+ String aEntry;
+
+ for( sal_uInt16 nCurPos = 0; nCurPos < nCount; nCurPos++ )
+ {
+ aEntry = (*pDir)[nCurPos].GetName();
+ m_aFreeIndexList.push_back( OTableIndex(aEntry) );
+ }
+
+ ///////////////////////////////////////////////////////////////////////////
+ // fill the table list
+ aDirEntry.SetExtension(String::CreateFromAscii("dbf"));
+ delete pDir;
+ pDir = new Dir( aDirEntry, FSYS_KIND_FILE,FSYS_SORT_NAME | FSYS_SORT_ASCENDING | FSYS_SORT_END );
+
+ nCount = pDir->Count();
+ if(!nCount)
+ {
+ aPB_OK.Disable(sal_True);
+ m_GB_Indexes.Disable(sal_True);
+ m_FT_TableIndexes.Disable(sal_True);
+ aLB_TableIndexes.Disable(sal_True);
+ m_FT_AllIndexes.Disable(sal_True);
+ aLB_FreeIndexes.Disable(sal_True);
+ aPB_Add.Disable(sal_True);
+ aPB_Remove.Disable(sal_True);
+ aPB_AddAll.Disable(sal_True);
+ aPB_RemoveAll.Disable(sal_True);
+ }
+
+ for( nCurPos = 0; nCurPos < nCount; nCurPos++ )
+ {
+ // add the table to the list
+ aEntry = (*pDir)[nCurPos].GetName();
+ m_aTableInfoList.push_back( OTableInfo(aEntry) );
+ OTableInfo& rTabInfo = m_aTableInfoList.back();
+
+ // open the INF file
+ String aTableName = (*pDir)[nCurPos].GetBase();
+ String aFileName = m_aDSN;
+ aFileName += DirEntry::GetAccessDelimiter();
+ aFileName += aTableName;
+ aFileName.AppendAscii(".inf");
+ Config aInfFile( aFileName );
+ aInfFile.SetGroup( aGroupIdent );
+
+ ///////////////////////////////////////////////////////////////////////////
+ // fill the indexes list
+ ByteString aNDX;
+ sal_uInt16 nKeyCnt = aInfFile.GetKeyCount();
+ ByteString aKeyName;
+
+ 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
+ RemoveFreeIndex( aEntry );
+ }
+
+ }
+
+ }
+
+ delete pDir;
+}
+
+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.begin();
+ ++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.begin();
+ ++aFree
+ )
+ aLB_FreeIndexes.InsertEntry( aFree->GetIndexFileName() );
+
+ if( m_aFreeIndexList.size() )
+ aLB_FreeIndexes.SelectEntryPos( 0 );
+
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Klasse OTableInfo
+void OTableInfo::WriteInfFile( const String& rDSN ) const
+{
+ // INF-Datei oeffnen
+ xub_StrLen nLen = aTableName.Len();
+ String aName = aTableName.Copy( 0,(nLen-4) ); // Extension ausblenden
+ String aFileName = rDSN;
+ aFileName += '\\';
+ aFileName += aName;
+ aFileName.AppendAscii(".inf");
+ Config aInfFile( aFileName );
+ 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
+ DirEntry aDirEntry( aFileName );
+ FileStat aFileStat( aDirEntry );
+ sal_uInt32 nFileSize = aFileStat.GetSize();
+ xub_StrLen nGroupIdLen = aGroupIdent.Len();
+
+ if( (xub_StrLen)nFileSize == (nGroupIdLen+4) )
+ aDirEntry.Kill();
+}
+
+//.........................................................................
+} // namespace dbaui
+//.........................................................................
+
+/*************************************************************************
+ * history:
+ * $Log: not supported by cvs2svn $
+ *
+ * Revision 1.0 26.09.00 15:54:26 fs
+ ************************************************************************/
+