xref: /core/dbaccess/source/ui/misc/WNameMatch.cxx (revision 979aed6b)
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