1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 /* 3 * This file is part of the LibreOffice project. 4 * 5 * This Source Code Form is subject to the terms of the Mozilla Public 6 * License, v. 2.0. If a copy of the MPL was not distributed with this 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. 8 * 9 * This file incorporates work covered by the following license notice: 10 * 11 * Licensed to the Apache Software Foundation (ASF) under one or more 12 * contributor license agreements. See the NOTICE file distributed 13 * with this work for additional information regarding copyright 14 * ownership. The ASF licenses this file to you under the Apache 15 * License, Version 2.0 (the "License"); you may not use this file 16 * except in compliance with the License. You may obtain a copy of 17 * the License at http://www.apache.org/licenses/LICENSE-2.0 . 18 */ 19 20 #include <WNameMatch.hxx> 21 #include <osl/diagnose.h> 22 #include <FieldDescriptions.hxx> 23 #include <WCopyTable.hxx> 24 #include <core_resource.hxx> 25 #include <strings.hrc> 26 #include <bitmaps.hlst> 27 #include <vcl/scrbar.hxx> 28 #include <vcl/settings.hxx> 29 #include <vcl/builderfactory.hxx> 30 #include <vcl/treelistentry.hxx> 31 #include <com/sun/star/sdbc/DataType.hpp> 32 33 using namespace ::dbaui; 34 35 // OWizColumnSelect 36 OWizNameMatching::OWizNameMatching(vcl::Window* pParent) 37 : OWizardPage(pParent, "NameMatching", "dbaccess/ui/namematchingpage.ui") 38 { 39 Image aImgUp(StockImage::Yes, BMP_UP); 40 Image aImgDown(StockImage::Yes, BMP_DOWN); 41 get(m_pTABLE_LEFT, "leftlabel"); 42 get(m_pTABLE_RIGHT, "rightlabel"); 43 get(m_pCTRL_LEFT, "left"); 44 get(m_pCTRL_RIGHT, "right"); 45 get(m_pColumn_up, "up"); 46 m_pColumn_up->SetModeImage(aImgUp); 47 get(m_pColumn_down, "down"); 48 m_pColumn_down->SetModeImage(aImgDown); 49 get(m_pColumn_up_right, "up_right"); 50 m_pColumn_up_right->SetModeImage(aImgUp); 51 get(m_pColumn_down_right, "down_right"); 52 m_pColumn_down_right->SetModeImage(aImgDown); 53 get(m_pAll, "all"); 54 get(m_pNone, "none"); 55 56 m_pColumn_up->SetClickHdl(LINK(this,OWizNameMatching,ButtonClickHdl)); 57 m_pColumn_down->SetClickHdl(LINK(this,OWizNameMatching,ButtonClickHdl)); 58 59 m_pColumn_up_right->SetClickHdl(LINK(this,OWizNameMatching,RightButtonClickHdl)); 60 m_pColumn_down_right->SetClickHdl(LINK(this,OWizNameMatching,RightButtonClickHdl)); 61 62 m_pAll->SetClickHdl(LINK(this,OWizNameMatching,AllNoneClickHdl)); 63 m_pNone->SetClickHdl(LINK(this,OWizNameMatching,AllNoneClickHdl)); 64 65 m_pCTRL_LEFT->SetSelectHdl(LINK(this,OWizNameMatching,TableListClickHdl)); 66 m_pCTRL_RIGHT->SetSelectHdl(LINK(this,OWizNameMatching,TableListRightSelectHdl)); 67 m_pCTRL_RIGHT->EnableCheckButton( nullptr ); 68 69 m_pCTRL_LEFT->SetForceMakeVisible( true ); 70 m_pCTRL_RIGHT->SetForceMakeVisible( true ); 71 72 m_sSourceText = m_pTABLE_LEFT->GetText() + "\n"; 73 m_sDestText = m_pTABLE_RIGHT->GetText() + "\n"; 74 } 75 76 OWizNameMatching::~OWizNameMatching() 77 { 78 disposeOnce(); 79 } 80 81 void OWizNameMatching::dispose() 82 { 83 m_pTABLE_LEFT.clear(); 84 m_pTABLE_RIGHT.clear(); 85 m_pCTRL_LEFT.clear(); 86 m_pCTRL_RIGHT.clear(); 87 m_pColumn_up.clear(); 88 m_pColumn_down.clear(); 89 m_pColumn_up_right.clear(); 90 m_pColumn_down_right.clear(); 91 m_pAll.clear(); 92 m_pNone.clear(); 93 OWizardPage::dispose(); 94 } 95 96 void OWizNameMatching::Reset() 97 { 98 // restore original state; 99 // the left tree contains bitmaps so i need to resize the right one 100 if(m_bFirstTime) 101 { 102 m_pCTRL_RIGHT->SetReadOnly(); // sets autoinc to readonly 103 m_pCTRL_RIGHT->SetEntryHeight(m_pCTRL_LEFT->GetEntryHeight()); 104 m_pCTRL_RIGHT->SetIndent(m_pCTRL_LEFT->GetIndent()); 105 m_pCTRL_RIGHT->SetSpaceBetweenEntries(m_pCTRL_LEFT->GetSpaceBetweenEntries()); 106 107 m_bFirstTime = false; 108 } 109 110 } 111 112 void OWizNameMatching::ActivatePage( ) 113 { 114 115 // set source table name 116 OUString aName = m_sSourceText + m_pParent->m_sSourceName; 117 118 m_pTABLE_LEFT->SetText(aName); 119 120 // set dest table name 121 aName = m_sDestText + m_pParent->m_sName; 122 m_pTABLE_RIGHT->SetText(aName); 123 124 m_pCTRL_LEFT->FillListBox(m_pParent->getSrcVector()); 125 m_pCTRL_RIGHT->FillListBox(m_pParent->getDestVector()); 126 127 m_pColumn_up->Enable( m_pCTRL_LEFT->GetEntryCount() > 1 ); 128 m_pColumn_down->Enable( m_pCTRL_LEFT->GetEntryCount() > 1 ); 129 130 m_pColumn_up_right->Enable( m_pCTRL_RIGHT->GetEntryCount() > 1 ); 131 m_pColumn_down_right->Enable( m_pCTRL_RIGHT->GetEntryCount() > 1 ); 132 133 m_pParent->EnableNextButton(false); 134 m_pCTRL_LEFT->GrabFocus(); 135 } 136 137 bool OWizNameMatching::LeavePage() 138 { 139 140 const ODatabaseExport::TColumnVector& rSrcColumns = m_pParent->getSrcVector(); 141 142 m_pParent->m_vColumnPositions.clear(); 143 m_pParent->m_vColumnTypes.clear(); 144 m_pParent->m_vColumnPositions.resize( rSrcColumns.size(), ODatabaseExport::TPositions::value_type( COLUMN_POSITION_NOT_FOUND, COLUMN_POSITION_NOT_FOUND ) ); 145 m_pParent->m_vColumnTypes.resize( rSrcColumns.size(), COLUMN_POSITION_NOT_FOUND ); 146 147 sal_Int32 nParamPos = 0; 148 SvTreeListEntry* pLeftEntry = m_pCTRL_LEFT->GetModel()->First(); 149 SvTreeListEntry* pRightEntry = m_pCTRL_RIGHT->GetModel()->First(); 150 while(pLeftEntry && pRightEntry) 151 { 152 OFieldDescription* pSrcField = static_cast<OFieldDescription*>(pLeftEntry->GetUserData()); 153 OSL_ENSURE(pSrcField,"OWizNameMatching: OColumn can not be null!"); 154 155 sal_Int32 nPos = 0; 156 for (auto const& column : rSrcColumns) 157 { 158 if (column->second == pSrcField) 159 break; 160 ++nPos; 161 } 162 163 if(m_pCTRL_LEFT->GetCheckButtonState(pLeftEntry) == SvButtonState::Checked) 164 { 165 OFieldDescription* pDestField = static_cast<OFieldDescription*>(pRightEntry->GetUserData()); 166 OSL_ENSURE(pDestField,"OWizNameMatching: OColumn can not be null!"); 167 const ODatabaseExport::TColumnVector& rDestColumns = m_pParent->getDestVector(); 168 sal_Int32 nPosDest = 1; 169 bool bDestColumnFound = false; 170 TOTypeInfoSP typeInfoSPFound; 171 for (auto const& column : rDestColumns) 172 { 173 if (column->second == pDestField) 174 { 175 bDestColumnFound = true; 176 typeInfoSPFound = column->second->getSpecialTypeInfo(); 177 break; 178 } 179 ++nPosDest; 180 } 181 182 OSL_ENSURE((nPos) < static_cast<sal_Int32>(m_pParent->m_vColumnPositions.size()),"m_pParent->m_vColumnPositions: Illegal index for vector"); 183 m_pParent->m_vColumnPositions[nPos].first = ++nParamPos; 184 m_pParent->m_vColumnPositions[nPos].second = nPosDest; 185 186 TOTypeInfoSP pTypeInfo; 187 188 assert(bDestColumnFound); 189 if (bDestColumnFound) 190 { 191 bool bNotConvert = true; 192 pTypeInfo = m_pParent->convertType(typeInfoSPFound, bNotConvert); 193 } 194 195 sal_Int32 nType = css::sdbc::DataType::VARCHAR; 196 if ( pTypeInfo.get() ) 197 nType = pTypeInfo->nType; 198 m_pParent->m_vColumnTypes[nPos] = nType; 199 } 200 else 201 { 202 m_pParent->m_vColumnPositions[nPos].first = COLUMN_POSITION_NOT_FOUND; 203 m_pParent->m_vColumnPositions[nPos].second = COLUMN_POSITION_NOT_FOUND; 204 } 205 206 pLeftEntry = m_pCTRL_LEFT->GetModel()->Next(pLeftEntry); 207 pRightEntry = m_pCTRL_RIGHT->GetModel()->Next(pRightEntry); 208 } 209 210 return true; 211 } 212 213 OUString OWizNameMatching::GetTitle() const { return DBA_RES(STR_WIZ_NAME_MATCHING_TITEL); } 214 215 IMPL_LINK( OWizNameMatching, ButtonClickHdl, Button *, pButton, void ) 216 { 217 SvTreeListEntry* pEntry = m_pCTRL_LEFT->FirstSelected(); 218 if ( pEntry ) 219 { 220 sal_Int32 nPos = m_pCTRL_LEFT->GetModel()->GetAbsPos(pEntry); 221 if(pButton == m_pColumn_up && nPos) 222 --nPos; 223 else if(pButton == m_pColumn_down) 224 nPos += 2; 225 226 m_pCTRL_LEFT->ModelIsMoving(pEntry,nullptr,nPos); 227 m_pCTRL_LEFT->GetModel()->Move(pEntry,nullptr,nPos); 228 m_pCTRL_LEFT->ModelHasMoved(pEntry); 229 230 long nThumbPos = m_pCTRL_LEFT->GetVScroll()->GetThumbPos(); 231 long nVisibleSize = m_pCTRL_LEFT->GetVScroll()->GetVisibleSize(); 232 233 if(pButton == m_pColumn_down && (nThumbPos+nVisibleSize+1) < nPos) 234 { 235 m_pCTRL_LEFT->GetVScroll()->DoScrollAction(ScrollType::LineDown); 236 } 237 238 TableListClickHdl(m_pCTRL_LEFT); 239 } 240 } 241 242 IMPL_LINK( OWizNameMatching, RightButtonClickHdl, Button *, pButton, void ) 243 { 244 SvTreeListEntry* pEntry = m_pCTRL_RIGHT->FirstSelected(); 245 if ( pEntry ) 246 { 247 sal_Int32 nPos = m_pCTRL_RIGHT->GetModel()->GetAbsPos(pEntry); 248 if(pButton == m_pColumn_up_right && nPos) 249 --nPos; 250 else if(pButton == m_pColumn_down_right) 251 nPos += 2; 252 253 m_pCTRL_RIGHT->ModelIsMoving(pEntry,nullptr,nPos); 254 m_pCTRL_RIGHT->GetModel()->Move(pEntry,nullptr,nPos); 255 m_pCTRL_RIGHT->ModelHasMoved(pEntry); 256 long nThumbPos = m_pCTRL_RIGHT->GetVScroll()->GetThumbPos(); 257 long nVisibleSize = m_pCTRL_RIGHT->GetVScroll()->GetVisibleSize(); 258 259 if(pButton == m_pColumn_down_right && (nThumbPos+nVisibleSize+1) < nPos) 260 m_pCTRL_RIGHT->GetVScroll()->DoScrollAction(ScrollType::LineDown); 261 TableListRightSelectHdl(m_pCTRL_RIGHT); 262 } 263 } 264 265 IMPL_LINK_NOARG( OWizNameMatching, TableListClickHdl, SvTreeListBox*, void ) 266 { 267 SvTreeListEntry* pEntry = m_pCTRL_LEFT->FirstSelected(); 268 if(pEntry) 269 { 270 sal_uLong nPos = m_pCTRL_LEFT->GetModel()->GetAbsPos(pEntry); 271 SvTreeListEntry* pOldEntry = m_pCTRL_RIGHT->FirstSelected(); 272 if(pOldEntry && nPos != m_pCTRL_RIGHT->GetModel()->GetAbsPos(pOldEntry)) 273 { 274 if(pOldEntry) 275 m_pCTRL_RIGHT->Select(pOldEntry,false); 276 pOldEntry = m_pCTRL_RIGHT->GetEntry(nPos); 277 if(pOldEntry) 278 { 279 sal_uLong nNewPos = m_pCTRL_LEFT->GetModel()->GetAbsPos(m_pCTRL_LEFT->GetFirstEntryInView()); 280 if ( nNewPos - nPos == 1 ) 281 --nNewPos; 282 m_pCTRL_RIGHT->MakeVisible(m_pCTRL_RIGHT->GetEntry(nNewPos), true); 283 m_pCTRL_RIGHT->Select(pOldEntry); 284 } 285 } 286 else if(!pOldEntry) 287 { 288 pOldEntry = m_pCTRL_RIGHT->GetEntry(nPos); 289 if(pOldEntry) 290 { 291 m_pCTRL_RIGHT->Select(pOldEntry); 292 } 293 } 294 } 295 } 296 297 IMPL_LINK_NOARG( OWizNameMatching, TableListRightSelectHdl, SvTreeListBox*, void ) 298 { 299 SvTreeListEntry* pEntry = m_pCTRL_RIGHT->FirstSelected(); 300 if(pEntry) 301 { 302 sal_uLong nPos = m_pCTRL_RIGHT->GetModel()->GetAbsPos(pEntry); 303 SvTreeListEntry* pOldEntry = m_pCTRL_LEFT->FirstSelected(); 304 if(pOldEntry && nPos != m_pCTRL_LEFT->GetModel()->GetAbsPos(pOldEntry)) 305 { 306 if(pOldEntry) 307 m_pCTRL_LEFT->Select(pOldEntry,false); 308 pOldEntry = m_pCTRL_LEFT->GetEntry(nPos); 309 if(pOldEntry) 310 { 311 sal_uLong nNewPos = m_pCTRL_RIGHT->GetModel()->GetAbsPos(m_pCTRL_RIGHT->GetFirstEntryInView()); 312 if ( nNewPos - nPos == 1 ) 313 nNewPos--; 314 m_pCTRL_LEFT->MakeVisible(m_pCTRL_LEFT->GetEntry(nNewPos), true); 315 m_pCTRL_LEFT->Select(pOldEntry); 316 } 317 } 318 else if(!pOldEntry) 319 { 320 pOldEntry = m_pCTRL_LEFT->GetEntry(nPos); 321 if(pOldEntry) 322 { 323 m_pCTRL_LEFT->Select(pOldEntry); 324 } 325 } 326 } 327 } 328 329 IMPL_LINK( OWizNameMatching, AllNoneClickHdl, Button *, pButton, void ) 330 { 331 bool bAll = pButton == m_pAll; 332 SvTreeListEntry* pEntry = m_pCTRL_LEFT->First(); 333 while(pEntry) 334 { 335 m_pCTRL_LEFT->SetCheckButtonState( pEntry, bAll ? SvButtonState::Checked : SvButtonState::Unchecked); 336 pEntry = m_pCTRL_LEFT->Next(pEntry); 337 } 338 } 339 340 // class OColumnString 341 class OColumnString : public SvLBoxString 342 { 343 bool m_bReadOnly; 344 public: 345 OColumnString( const OUString& rStr, bool RO ) 346 :SvLBoxString(rStr) 347 ,m_bReadOnly(RO) 348 { 349 } 350 351 virtual void Paint(const Point& rPos, SvTreeListBox& rDev, vcl::RenderContext& rRenderContext, 352 const SvViewDataEntry* pView, const SvTreeListEntry& rEntry) override; 353 }; 354 355 void OColumnString::Paint(const Point& rPos, SvTreeListBox& /*rDev*/, vcl::RenderContext& rRenderContext, 356 const SvViewDataEntry* /*pView*/, const SvTreeListEntry& /*rEntry*/) 357 { 358 rRenderContext.Push(PushFlags::TEXTCOLOR | PushFlags::TEXTFILLCOLOR); 359 if(m_bReadOnly) 360 { 361 const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings(); 362 rRenderContext.SetTextColor(rStyleSettings.GetDisableColor()); 363 rRenderContext.SetTextFillColor(rStyleSettings.GetFieldColor()); 364 } 365 rRenderContext.DrawText(rPos, GetText()); 366 rRenderContext.Pop(); 367 } 368 369 OColumnTreeBox::OColumnTreeBox( vcl::Window* pParent ) 370 : OMarkableTreeListBox(pParent, WB_BORDER) 371 , m_bReadOnly(false) 372 { 373 SetDragDropMode( DragDropMode::NONE ); 374 EnableInplaceEditing( false ); 375 SetStyle(GetStyle() | WB_BORDER | WB_HASBUTTONS | WB_HSCROLL ); 376 SetSelectionMode( SelectionMode::Single ); 377 } 378 379 VCL_BUILDER_FACTORY(OColumnTreeBox) 380 381 void OColumnTreeBox::InitEntry(SvTreeListEntry* pEntry, const OUString& rStr, const Image& rImg1, const Image& rImg2, SvLBoxButtonKind eButtonKind) 382 { 383 DBTreeListBox::InitEntry(pEntry, rStr, rImg1, rImg2, eButtonKind); 384 pEntry->ReplaceItem(std::make_unique<OColumnString>(rStr,false), pEntry->ItemCount() - 1); 385 } 386 387 bool OColumnTreeBox::Select( SvTreeListEntry* pEntry, bool bSelect ) 388 { 389 if(bSelect) 390 { 391 OFieldDescription* pColumn = static_cast<OFieldDescription*>(pEntry->GetUserData()); 392 if(!(pColumn->IsAutoIncrement() && m_bReadOnly)) 393 bSelect = DBTreeListBox::Select( pEntry,bSelect ); 394 } 395 else 396 bSelect = DBTreeListBox::Select( pEntry,bSelect ); 397 return bSelect; 398 } 399 400 void OColumnTreeBox::FillListBox( const ODatabaseExport::TColumnVector& _rList) 401 { 402 Clear(); 403 for (auto const& elem : _rList) 404 { 405 SvTreeListEntry* pEntry = InsertEntry(elem->first, nullptr, false, TREELIST_APPEND, elem->second); 406 SvButtonState eState = !(m_bReadOnly && elem->second->IsAutoIncrement()) ? SvButtonState::Checked : SvButtonState::Unchecked; 407 SetCheckButtonState( pEntry, eState ); 408 } 409 } 410 411 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 412
