1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_dbaccess.hxx" 26 #ifndef DBAUI_TABLECONNECTIONDATA_HXX 27 #include "TableConnectionData.hxx" 28 #endif 29 #ifndef _TOOLS_DEBUG_HXX 30 #include <tools/debug.hxx> 31 #endif 32 #ifndef _COMPHELPER_STLTYPES_HXX_ 33 #include <comphelper/stl_types.hxx> 34 #endif 35 36 using namespace dbaui; 37 using namespace comphelper; 38 //================================================================== 39 // class OTableConnectionData 40 //================================================================== 41 DBG_NAME(OTableConnectionData) 42 //------------------------------------------------------------------------ 43 OTableConnectionData::OTableConnectionData() 44 { 45 DBG_CTOR(OTableConnectionData,NULL); 46 Init(); 47 } 48 // ----------------------------------------------------------------------------- 49 OTableConnectionData::OTableConnectionData(const TTableWindowData::value_type& _pReferencingTable 50 ,const TTableWindowData::value_type& _pReferencedTable 51 ,const String& rConnName ) 52 :m_pReferencingTable(_pReferencingTable) 53 ,m_pReferencedTable(_pReferencedTable) 54 ,m_aConnName( rConnName ) 55 { 56 DBG_CTOR(OTableConnectionData,NULL); 57 Init(); 58 } 59 //------------------------------------------------------------------------ 60 void OTableConnectionData::Init() 61 { 62 ////////////////////////////////////////////////////////////////////// 63 // LineDataList mit Defaults initialisieren 64 DBG_ASSERT(m_vConnLineData.size() == 0, "OTableConnectionData::Init() : nur mit leere Linienliste aufzurufen !"); 65 ResetConnLines(sal_True); 66 // das legt Defaults an 67 } 68 //------------------------------------------------------------------------ 69 OTableConnectionData::OTableConnectionData( const OTableConnectionData& rConnData ) 70 { 71 DBG_CTOR(OTableConnectionData,NULL); 72 *this = rConnData; 73 } 74 //------------------------------------------------------------------------ 75 void OTableConnectionData::CopyFrom(const OTableConnectionData& rSource) 76 { 77 *this = rSource; 78 // hier ziehe ich mich auf das (nicht-virtuelle) operator= zurueck, das nur meine Members kopiert 79 } 80 81 //------------------------------------------------------------------------ 82 OTableConnectionData::~OTableConnectionData() 83 { 84 DBG_DTOR(OTableConnectionData,NULL); 85 // LineDataList loeschen 86 OConnectionLineDataVec().swap(m_vConnLineData); 87 //ResetConnLines(sal_False); 88 } 89 90 //------------------------------------------------------------------------ 91 OTableConnectionData& OTableConnectionData::operator=( const OTableConnectionData& rConnData ) 92 { 93 if (&rConnData == this) 94 return *this; 95 96 m_pReferencingTable = rConnData.m_pReferencingTable; 97 m_pReferencedTable = rConnData.m_pReferencedTable; 98 m_aConnName = rConnData.GetConnName(); 99 100 // clear line list 101 ResetConnLines(sal_False); 102 103 // und kopieren 104 OConnectionLineDataVec* pLineData = const_cast<OTableConnectionData*>(&rConnData)->GetConnLineDataList(); 105 106 OConnectionLineDataVec::const_iterator aIter = pLineData->begin(); 107 OConnectionLineDataVec::const_iterator aEnd = pLineData->end(); 108 for(;aIter != aEnd;++aIter) 109 m_vConnLineData.push_back(new OConnectionLineData(**aIter)); 110 111 return *this; 112 } 113 114 //------------------------------------------------------------------------ 115 sal_Bool OTableConnectionData::SetConnLine( sal_uInt16 nIndex, const String& rSourceFieldName, const String& rDestFieldName ) 116 { 117 if (sal_uInt16(m_vConnLineData.size()) < nIndex) 118 return sal_False; 119 // == ist noch erlaubt, das entspricht einem Append 120 121 if (m_vConnLineData.size() == nIndex) 122 return AppendConnLine(rSourceFieldName, rDestFieldName); 123 124 OConnectionLineDataRef pConnLineData = m_vConnLineData[nIndex]; 125 DBG_ASSERT(pConnLineData != NULL, "OTableConnectionData::SetConnLine : habe ungueltiges LineData-Objekt"); 126 127 pConnLineData->SetSourceFieldName( rSourceFieldName ); 128 pConnLineData->SetDestFieldName( rDestFieldName ); 129 130 return sal_True; 131 } 132 133 //------------------------------------------------------------------------ 134 sal_Bool OTableConnectionData::AppendConnLine( const ::rtl::OUString& rSourceFieldName, const ::rtl::OUString& rDestFieldName ) 135 { 136 OConnectionLineDataVec::iterator aIter = m_vConnLineData.begin(); 137 OConnectionLineDataVec::iterator aEnd = m_vConnLineData.end(); 138 for(;aIter != aEnd;++aIter) 139 { 140 if((*aIter)->GetDestFieldName() == rDestFieldName && (*aIter)->GetSourceFieldName() == rSourceFieldName) 141 break; 142 } 143 if(aIter == aEnd) 144 { 145 OConnectionLineDataRef pNew = new OConnectionLineData(rSourceFieldName, rDestFieldName); 146 if (!pNew.isValid()) 147 return sal_False; 148 149 m_vConnLineData.push_back(pNew); 150 } 151 return sal_True; 152 } 153 154 //------------------------------------------------------------------------ 155 void OTableConnectionData::ResetConnLines( sal_Bool /*bUseDefaults*/ ) 156 { 157 OConnectionLineDataVec().swap(m_vConnLineData); 158 } 159 160 //------------------------------------------------------------------------ 161 OConnectionLineDataRef OTableConnectionData::CreateLineDataObj() 162 { 163 return new OConnectionLineData(); 164 } 165 166 //------------------------------------------------------------------------ 167 OConnectionLineDataRef OTableConnectionData::CreateLineDataObj( const OConnectionLineData& rConnLineData ) 168 { 169 return new OConnectionLineData( rConnLineData ); 170 } 171 // ----------------------------------------------------------------------------- 172 OTableConnectionData* OTableConnectionData::NewInstance() const 173 { 174 return new OTableConnectionData(); 175 } 176 // ----------------------------------------------------------------------------- 177 void OTableConnectionData::normalizeLines() 178 { 179 // noch ein wenig Normalisierung auf den LineDatas : leere Lines vom Anfang an das Ende verschieben 180 sal_Int32 nCount = m_vConnLineData.size(); 181 for(sal_Int32 i=0;i<nCount;) 182 { 183 if(!m_vConnLineData[i]->GetSourceFieldName().getLength() || !m_vConnLineData[i]->GetDestFieldName().getLength()) 184 { 185 OConnectionLineDataRef pData = m_vConnLineData[i]; 186 m_vConnLineData.erase(m_vConnLineData.begin()+i); 187 m_vConnLineData.push_back(pData); 188 --nCount; 189 } 190 else 191 ++i; 192 } 193 } 194 // ----------------------------------------------------------------------------- 195 196 197 198 199