User: hr      
Date: 2007-11-01 15:37:03+0000
Modified:
   dba/dbaccess/source/ui/relationdesign/RTableConnectionData.cxx

Log:
 INTEGRATION: CWS dba24b (1.12.130); FILE MERGED
 2007/10/01 06:37:45 oj 1.12.130.6: merge conflict
 2007/09/28 12:00:47 oj 1.12.130.5: RESYNC: (1.12-1.13); FILE MERGED
 2007/08/29 13:30:54 fs 1.12.130.4: #i10000#
 2007/08/22 11:41:59 oj 1.12.130.3: #i76374# handle cross join as natural join 
now in query design
 2007/08/16 09:57:47 oj 1.12.130.2: #i56898# accept more than one relation
 2007/08/16 06:14:45 oj 1.12.130.1: #i56898# clean up of the class structure

File Changes:

Directory: /dba/dbaccess/source/ui/relationdesign/
==================================================

File [changed]: RTableConnectionData.cxx
Url: 
http://dba.openoffice.org/source/browse/dba/dbaccess/source/ui/relationdesign/RTableConnectionData.cxx?r1=1.13&r2=1.14
Delta lines:  +69 -149
----------------------
--- RTableConnectionData.cxx    2007-09-26 14:53:09+0000        1.13
+++ RTableConnectionData.cxx    2007-11-01 15:37:01+0000        1.14
@@ -83,7 +83,6 @@
 //========================================================================
 // class ORelationTableConnectionData
 //========================================================================
-
 //------------------------------------------------------------------------
 ORelationTableConnectionData::ORelationTableConnectionData()
        :OTableConnectionData()
@@ -93,53 +92,25 @@
 {
        DBG_CTOR(ORelationTableConnectionData,NULL);
 }
-
-//------------------------------------------------------------------------
-ORelationTableConnectionData::ORelationTableConnectionData( const Reference< 
XNameAccess>& _xTables)
-       :OTableConnectionData()
-       ,m_xTables(_xTables)
-       ,m_nUpdateRules(KeyRule::NO_ACTION)
-       ,m_nDeleteRules(KeyRule::NO_ACTION)
-       ,m_nCardinality(CARDINAL_UNDEFINED)
-{
-       DBG_CTOR(ORelationTableConnectionData,NULL);
-       Reference<XComponent> xComponent(m_xTables,UNO_QUERY);
-       if(xComponent.is())
-               startComponentListening(xComponent);
-}
-
 //------------------------------------------------------------------------
-ORelationTableConnectionData::ORelationTableConnectionData( const Reference< 
XNameAccess>& _xTables,
-                                                                               
                                    const ::rtl::OUString& rSourceWinName, 
-                                                                               
                                        const ::rtl::OUString& rDestWinName, 
+ORelationTableConnectionData::ORelationTableConnectionData( const 
TTableWindowData::value_type& _pReferencingTable,
+                                                            const 
TTableWindowData::value_type& _pReferencedTable,
                                                                                
                                        const ::rtl::OUString& rConnName )
-    :OTableConnectionData( rSourceWinName, rDestWinName, rConnName )
-    ,m_xTables(_xTables)
+    :OTableConnectionData( _pReferencingTable, _pReferencedTable )
     ,m_nUpdateRules(KeyRule::NO_ACTION)
     ,m_nDeleteRules(KeyRule::NO_ACTION)
     ,m_nCardinality(CARDINAL_UNDEFINED)
 {
        DBG_CTOR(ORelationTableConnectionData,NULL);
+    m_aConnName = rConnName;
        
-       ::osl::MutexGuard aGuard( m_aMutex );
-
-       
OSL_ENSURE(m_xTables.is(),"ORelationTableConnectionData::ORelationTableConnectionData
 No Tables!");
-       addListening(m_xTables);        
-
+    if ( m_aConnName.Len() )
        SetCardinality();
-       if(m_xTables.is() && m_xTables->hasByName(rSourceWinName))
-               m_xTables->getByName(rSourceWinName) >>= m_xSource;
-       if(m_xTables.is() && m_xTables->hasByName(rDestWinName))
-               m_xTables->getByName(rDestWinName) >>= m_xDest;
-
-       addListening(m_xSource);
-       addListening(m_xDest);  
 }
 
 //------------------------------------------------------------------------
 ORelationTableConnectionData::ORelationTableConnectionData( const 
ORelationTableConnectionData& rConnData )
        :OTableConnectionData( rConnData )
-    , ::utl::OEventListenerAdapter()
 {
        DBG_CTOR(ORelationTableConnectionData,NULL);
        *this = rConnData;
@@ -149,10 +120,6 @@
 ORelationTableConnectionData::~ORelationTableConnectionData()
 {
        DBG_DTOR(ORelationTableConnectionData,NULL);
-       
-       removeListening(m_xDest);
-       removeListening(m_xSource);
-       removeListening(m_xTables);
 }
 
 //------------------------------------------------------------------------
@@ -162,7 +129,7 @@
        ::osl::MutexGuard aGuard( m_aMutex );
        ////////////////////////////////////////////////////////////
        // Relation loeschen
-       Reference<XKeysSupplier> xSup(m_xSource,UNO_QUERY);
+       Reference<XKeysSupplier> 
xSup(getReferencingTable()->getTable(),UNO_QUERY);
        Reference< XIndexAccess> xKeys;
        if(xSup.is() )
                xKeys = xSup->getKeys();
@@ -171,10 +138,10 @@
 
        if( m_aConnName.Len() && xKeys.is() )
        {
-               for(sal_Int32 i=0;i<xKeys->getCount();++i)
+        const sal_Int32 nCount = xKeys->getCount();
+        for(sal_Int32 i = 0;i < nCount;++i)
                {
-                       Reference< XPropertySet> xKey;
-                       xKeys->getByIndex(i) >>= xKey;
+            Reference< XPropertySet> xKey(xKeys->getByIndex(i),UNO_QUERY);
                        OSL_ENSURE(xKey.is(),"Key is not valid!");
                        if(xKey.is())
                        {
@@ -211,45 +178,9 @@
 
        //////////////////////////////////////////////////////////////////////
        // Member anpassen
-       sTempString                     = m_aSourceWinName;
-       m_aSourceWinName        = m_aDestWinName;
-       m_aDestWinName          = sTempString;
-
-       ::osl::MutexGuard aGuard( m_aMutex );
-
-       Reference<XPropertySet> xTemp;
-       xTemp           = m_xSource;
-       m_xSource       = m_xDest;
-       m_xDest         = xTemp;
-}
-
-//------------------------------------------------------------------------
-void ORelationTableConnectionData::SetSourceWinName( const String& 
rSourceWinName )
-{
-       ::osl::MutexGuard aGuard( m_aMutex );
-
-       OTableConnectionData::SetSourceWinName(rSourceWinName);
-       if(m_xTables->hasByName(rSourceWinName))
-       {
-               removeListening(m_xDest);
-               m_xTables->getByName(rSourceWinName) >>= m_xSource;
-               addListening(m_xDest);
-       }
-}
-
-//------------------------------------------------------------------------
-void ORelationTableConnectionData::SetDestWinName( const String& rDestWinName )
-{
-       ::osl::MutexGuard aGuard( m_aMutex );
-
-       OTableConnectionData::SetDestWinName(rDestWinName);
-       
-       if(m_xTables->hasByName(rDestWinName))
-       {
-               removeListening(m_xDest);
-               m_xTables->getByName(rDestWinName) >>= m_xDest;
-               addListening(m_xDest);
-       }
+    TTableWindowData::value_type pTemp = m_pReferencingTable;
+    m_pReferencingTable = m_pReferencedTable;
+    m_pReferencedTable = pTemp;
 }
 
 //------------------------------------------------------------------------
@@ -297,7 +228,6 @@
                                OConnectionLineDataVec::const_iterator aIter = 
m_vConnLineData.begin();
                                for(;aIter != m_vConnLineData.end();++aIter)
                                {
-                                       if( (*aIter)->IsValid() )
                                                ++nValidLinesCount;
                                        if ( 
(*aIter)->GetFieldName(_eEConnectionSide) == *pKeyBegin )
                                        {
@@ -321,12 +251,6 @@
        DBG_CHKTHIS(ORelationTableConnectionData,NULL);
        ::osl::MutexGuard aGuard( m_aMutex );
 
-       if( !m_xSource.is() || !m_xDest.is() )
-               return FALSE;
-
-       if( !m_aSourceWinName.Len() || !m_aDestWinName.Len() )
-               return FALSE;
-
        //////////////////////////////////////////////////////////////////////
        // Wenn die SourceFelder ein PrimKey sind, ist nur die Orientierung 
falsch
        if ( IsSourcePrimKey() && !IsDestPrimKey() )
@@ -365,21 +289,6 @@
        m_nDeleteRules = rConnData.GetDeleteRules();
        m_nCardinality = rConnData.GetCardinality();
 
-       
-       ::osl::MutexGuard aGuard( m_aMutex );
-
-       removeListening(m_xDest);
-       removeListening(m_xSource);
-       removeListening(m_xTables);
-
-       m_xTables       = rConnData.getTables();
-       m_xSource       = rConnData.getSource();
-       m_xDest         = rConnData.getDest();
-
-       addListening(m_xDest);
-       addListening(m_xSource);
-       addListening(m_xTables);
-
        return *this;
 }
 namespace dbaui
@@ -390,8 +299,8 @@
        bool bEqual = (lhs.m_nUpdateRules == rhs.m_nUpdateRules) 
         && (lhs.m_nDeleteRules == rhs.m_nDeleteRules)
         && (lhs.m_nCardinality == rhs.m_nCardinality)
-        && (lhs.m_aSourceWinName == rhs.m_aSourceWinName)
-        && (lhs.m_aDestWinName == rhs.m_aDestWinName)
+        && (lhs.getReferencingTable() == rhs.getReferencingTable())
+        && (lhs.getReferencedTable() == rhs.getReferencedTable())
         && (lhs.m_aConnName == rhs.m_aConnName)
         && (lhs.m_vConnLineData.size() == rhs.m_vConnLineData.size());
     
@@ -416,7 +325,7 @@
        ////////////////////////////////////////////////////////////
        // Alte Relation loeschen
        {
-               Reference<XKeysSupplier> xSup(m_xSource,UNO_QUERY);
+               Reference<XKeysSupplier> 
xSup(getReferencingTable()->getTable(),UNO_QUERY);
                Reference< XIndexAccess> xKeys;
                if ( xSup.is() )
                        xKeys = xSup->getKeys();
@@ -429,7 +338,7 @@
        }
 
        // reassign the keys because the orientaion could be changed
-       Reference<XKeysSupplier> xSup(m_xSource,UNO_QUERY);
+       Reference<XKeysSupplier> 
xSup(getReferencingTable()->getTable(),UNO_QUERY);
        Reference< XIndexAccess> xKeys;
        if ( xSup.is() )
                xKeys = xSup->getKeys();
@@ -449,13 +358,14 @@
        {
                // build a foreign key name
                ::rtl::OUString sSourceName;
-               m_xSource->getPropertyValue(PROPERTY_NAME) >>= sSourceName;
+        Reference<XPropertySet> xProp(xSup,UNO_QUERY_THROW);
+        xProp->getPropertyValue(PROPERTY_NAME) >>= sSourceName;
                ::rtl::OUString sKeyName = sSourceName;
-               sKeyName += m_aDestWinName;
+               sKeyName += getReferencedTable()->GetTableName();
 
                xKey->setPropertyValue(PROPERTY_NAME,makeAny(sKeyName));
                xKey->setPropertyValue(PROPERTY_TYPE,makeAny(KeyType::FOREIGN));
-               
xKey->setPropertyValue(PROPERTY_REFERENCEDTABLE,makeAny(::rtl::OUString(m_aDestWinName)));
+               
xKey->setPropertyValue(PROPERTY_REFERENCEDTABLE,makeAny(::rtl::OUString(getReferencedTable()->GetTableName())));
                xKey->setPropertyValue(PROPERTY_UPDATERULE, 
makeAny(GetUpdateRules()));
                xKey->setPropertyValue(PROPERTY_DELETERULE, 
makeAny(GetDeleteRules()));
        }
@@ -501,24 +411,57 @@
                {
                        sal_Int32 nType = 0;
                        xKey->getPropertyValue(PROPERTY_TYPE) >>= nType;
-                       //      if ( nType == KeyType::FOREIGN )
+                       ::rtl::OUString sReferencedTable;
+                       xKey->getPropertyValue(PROPERTY_REFERENCEDTABLE) >>= 
sReferencedTable;
+                       if ( sReferencedTable == 
::rtl::OUString(getReferencedTable()->GetTableName()) )
                        {
-                               ::rtl::OUString sName;
-                               
xKey->getPropertyValue(PROPERTY_REFERENCEDTABLE) >>= sName;
-                               if ( sName == ::rtl::OUString(m_aDestWinName) )
+                xColSup.set(xKey,UNO_QUERY_THROW);
+                try
+                {
+                    Reference<XNameAccess> xColumns = xColSup->getColumns();
+                           Sequence< ::rtl::OUString> aNames = 
xColumns->getElementNames();
+                           const ::rtl::OUString* pIter = 
aNames.getConstArray();
+                           const ::rtl::OUString* pEnd = pIter + 
aNames.getLength();
+
+                    Reference<XPropertySet> xColumn;
+                    ::rtl::OUString sName,sRelatedColumn;
+                    for ( ; pIter != pEnd ; ++pIter )
+                    {
+                        
xColumn.set(xColumns->getByName(*pIter),UNO_QUERY_THROW);
+                        xColumn->getPropertyValue(PROPERTY_NAME)               
        >>= sName; 
+                                       
xColumn->getPropertyValue(PROPERTY_RELATEDCOLUMN)       >>= sRelatedColumn;
+
+                        OConnectionLineDataVec::iterator aIter = 
m_vConnLineData.begin();
+                                   for(;aIter != m_vConnLineData.end();++aIter)
+                                   {
+                                           if(    
(*aIter)->GetSourceFieldName() == sName 
+                                && (*aIter)->GetDestFieldName() == 
sRelatedColumn )
+                                           {
+                                               break;
+                            }
+                        }
+                        if ( aIter == m_vConnLineData.end() )
+                            break;
+                    }
+                    if ( pIter == pEnd )
                                {
                                        xKey->getPropertyValue(PROPERTY_NAME) 
>>= sName;
                                        m_aConnName = sName;
+                        //here we already know our column structure so we 
don't have to recreate the table connection data
+                        xColSup.clear();
                                        break;
                                }
                        }
+                catch(Exception&)
+                {                    
+                }                
+                       }
                }
                xKey = NULL;
        }
 
 //     OSL_ENSURE(xKey.is(),"No key found have insertion!");
 
-       xColSup.set(xKey,UNO_QUERY);
        if ( xColSup.is() )
        {
                // The fields the relation marks may not be the same as our 
LineDatas mark after the relation has been updated
@@ -526,16 +469,16 @@
 
                Reference<XNameAccess> xColumns = xColSup->getColumns();
                Sequence< ::rtl::OUString> aNames = xColumns->getElementNames();
-               const ::rtl::OUString* pBegin = aNames.getConstArray();
-               const ::rtl::OUString* pEnd = pBegin + aNames.getLength();
+               const ::rtl::OUString* pIter = aNames.getConstArray();
+               const ::rtl::OUString* pEnd = pIter + aNames.getLength();
 
                m_vConnLineData.reserve( aNames.getLength() );
                Reference<XPropertySet> xColumn;
                ::rtl::OUString sName,sRelatedColumn;
 
-               for(;pBegin != pEnd;++pBegin)
+               for(;pIter != pEnd;++pIter)
                {
-                       xColumns->getByName(*pBegin) >>= xColumn;
+                       xColumns->getByName(*pIter) >>= xColumn;
                        if ( xColumn.is() )
                        {
                                OConnectionLineDataRef pNewData = 
CreateLineDataObj();
@@ -558,27 +501,4 @@
        return TRUE;
 }
 // 
-----------------------------------------------------------------------------
-void ORelationTableConnectionData::addListening(const Reference<XInterface>& 
_rxComponent)
-{
-       Reference<XComponent> xComponent(_rxComponent,UNO_QUERY);
-       if(xComponent.is())
-               startComponentListening(xComponent);
-}
-// 
-----------------------------------------------------------------------------
-void ORelationTableConnectionData::removeListening(const 
Reference<XInterface>& _rxComponent)
-{
-       Reference<XComponent> xComponent(_rxComponent,UNO_QUERY);
-       if(xComponent.is())
-               stopComponentListening(xComponent);
-}
-// 
-----------------------------------------------------------------------------
-void ORelationTableConnectionData::_disposing( const 
::com::sun::star::lang::EventObject& /*_rSource*/ )
-{
-       ::osl::MutexGuard aGuard( m_aMutex );
-       // it doesn't matter which one was disposed
-       m_xTables       = NULL;
-       m_xSource       = NULL;
-       m_xDest         = NULL;
-}
-// 
-----------------------------------------------------------------------------
 




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to