xref: /AOO41X/main/dbaccess/source/ui/misc/WNameMatch.cxx (revision 96de54900b79e13b861fbc62cbf36018b54e21b7)
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_WIZ_NAMEMATCHING_HXX
27 #include "WNameMatch.hxx"
28 #endif
29 #ifndef _TOOLS_DEBUG_HXX
30 #include <tools/debug.hxx>
31 #endif
32 #ifndef DBAUI_FIELDDESCRIPTIONS_HXX
33 #include "FieldDescriptions.hxx"
34 #endif
35 #ifndef DBAUI_WIZ_COPYTABLEDIALOG_HXX
36 #include "WCopyTable.hxx"
37 #endif
38 #ifndef _DBA_DBACCESS_HELPID_HRC_
39 #include "dbaccess_helpid.hrc"
40 #endif
41 #ifndef _DBU_MISC_HRC_
42 #include "dbu_misc.hrc"
43 #endif
44 #ifndef DBAUI_WIZARD_PAGES_HRC
45 #include "WizardPages.hrc"
46 #endif
47 #ifndef _SV_SCRBAR_HXX
48 #include <vcl/scrbar.hxx>
49 #endif
50 #ifndef DBAUI_WIZ_COPYTABLEDIALOG_HXX
51 #include "WCopyTable.hxx"
52 #endif
53 #ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
54 #include <com/sun/star/sdbc/DataType.hpp>
55 #endif
56 
57 using namespace ::dbaui;
58 //========================================================================
59 // OWizColumnSelect
DBG_NAME(OWizNameMatching)60 DBG_NAME(OWizNameMatching)
61 //========================================================================
62 OWizNameMatching::OWizNameMatching( Window* pParent)
63         :OWizardPage( pParent, ModuleRes( TAB_WIZ_NAME_MATCHING     ) )
64         ,m_FT_TABLE_LEFT(       this, ModuleRes( FT_TABLE_LEFT          ) )
65         ,m_FT_TABLE_RIGHT(      this, ModuleRes( FT_TABLE_RIGHT         ) )
66         ,m_CTRL_LEFT(           this, ModuleRes( CTRL_LEFT              ) )
67         ,m_CTRL_RIGHT(          this, ModuleRes( CTRL_RIGHT             ) )
68         ,m_ibColumn_up(         this, ModuleRes( IB_COLUMN_UP           ) )
69         ,m_ibColumn_down(       this, ModuleRes( IB_COLUMN_DOWN         ) )
70         ,m_ibColumn_up_right(   this, ModuleRes( IB_COLUMN_UP_RIGHT     ) )
71         ,m_ibColumn_down_right( this, ModuleRes( IB_COLUMN_DOWN_RIGHT   ) )
72         ,m_pbAll(               this, ModuleRes( PB_ALL                 ) )
73         ,m_pbNone(              this, ModuleRes( PB_NONE                    ) )
74 
75 {
76     DBG_CTOR(OWizNameMatching,NULL);
77 
78     m_ibColumn_up.SetClickHdl(LINK(this,OWizNameMatching,ButtonClickHdl));
79     m_ibColumn_down.SetClickHdl(LINK(this,OWizNameMatching,ButtonClickHdl));
80 
81     m_ibColumn_up_right.SetClickHdl(LINK(this,OWizNameMatching,RightButtonClickHdl));
82     m_ibColumn_down_right.SetClickHdl(LINK(this,OWizNameMatching,RightButtonClickHdl));
83 
84     m_pbAll.SetClickHdl(LINK(this,OWizNameMatching,AllNoneClickHdl));
85     m_pbNone.SetClickHdl(LINK(this,OWizNameMatching,AllNoneClickHdl));
86 
87     m_CTRL_LEFT.SetSelectHdl(LINK(this,OWizNameMatching,TableListClickHdl));
88     m_CTRL_RIGHT.SetSelectHdl(LINK(this,OWizNameMatching,TableListRightSelectHdl));
89     m_CTRL_RIGHT.EnableCheckButton( NULL );
90 
91     m_CTRL_LEFT.SetStyle( m_CTRL_LEFT.GetStyle() | WB_FORCE_MAKEVISIBLE );
92     m_CTRL_RIGHT.SetStyle( m_CTRL_RIGHT.GetStyle() | WB_FORCE_MAKEVISIBLE );
93 
94     m_sSourceText   = m_FT_TABLE_LEFT.GetText();
95     m_sSourceText.AppendAscii("\n");
96     m_sDestText     = m_FT_TABLE_RIGHT.GetText();
97     m_sDestText.AppendAscii("\n");
98 
99     // set hiContrast
100     m_ibColumn_up.SetModeImage(ModuleRes(IMG_SORTUP_H),BMP_COLOR_HIGHCONTRAST);
101     m_ibColumn_down.SetModeImage(ModuleRes(IMG_SORTDOWN_H),BMP_COLOR_HIGHCONTRAST);
102     m_ibColumn_up_right.SetModeImage(ModuleRes(IMG_SORTUP_H),BMP_COLOR_HIGHCONTRAST);
103     m_ibColumn_down_right.SetModeImage(ModuleRes(IMG_SORTDOWN_H),BMP_COLOR_HIGHCONTRAST);
104 
105     FreeResource();
106 }
107 // -----------------------------------------------------------------------
~OWizNameMatching()108 OWizNameMatching::~OWizNameMatching()
109 {
110     DBG_DTOR(OWizNameMatching,NULL);
111 }
112 
113 // -----------------------------------------------------------------------
Reset()114 void OWizNameMatching::Reset()
115 {
116     // urspr"unglichen zustand wiederherstellen
117     DBG_CHKTHIS(OWizNameMatching,NULL);
118     // the left tree contains bitmaps so i need to resize the right one
119     if(m_bFirstTime)
120     {
121         m_CTRL_RIGHT.SetReadOnly(); // sets autoinc to readonly
122         m_CTRL_RIGHT.SetEntryHeight(m_CTRL_LEFT.GetEntryHeight());
123         m_CTRL_RIGHT.SetIndent(m_CTRL_LEFT.GetIndent());
124         m_CTRL_RIGHT.SetSpaceBetweenEntries(m_CTRL_LEFT.GetSpaceBetweenEntries());
125 
126         m_bFirstTime = sal_False;
127     }
128 
129     //  m_CTRL_LEFT.Clear();
130 }
131 // -----------------------------------------------------------------------
ActivatePage()132 void OWizNameMatching::ActivatePage( )
133 {
134     DBG_CHKTHIS(OWizNameMatching,NULL);
135 
136     // set source table name
137     String aName = m_sSourceText;
138     aName += String(m_pParent->m_sSourceName);
139 
140     m_FT_TABLE_LEFT.SetText(aName);
141 
142     // set dest table name
143     aName = m_sDestText;
144     aName += String(m_pParent->m_sName);
145     m_FT_TABLE_RIGHT.SetText(aName);
146 
147 
148     m_CTRL_LEFT.FillListBox(*m_pParent->getSrcVector());
149     m_CTRL_RIGHT.FillListBox(*m_pParent->getDestVector());
150 
151     m_ibColumn_up.Enable( m_CTRL_LEFT.GetEntryCount() > 1 );
152     m_ibColumn_down.Enable( m_CTRL_LEFT.GetEntryCount() > 1 );
153 
154     m_ibColumn_up_right.Enable( m_CTRL_RIGHT.GetEntryCount() > 1 );
155     m_ibColumn_down_right.Enable( m_CTRL_RIGHT.GetEntryCount() > 1 );
156 
157 
158     m_pParent->EnableButton(OCopyTableWizard::WIZARD_NEXT,sal_False);
159     m_CTRL_LEFT.GrabFocus();
160 }
161 // -----------------------------------------------------------------------
LeavePage()162 sal_Bool OWizNameMatching::LeavePage()
163 {
164     DBG_CHKTHIS(OWizNameMatching,NULL);
165 
166     const ODatabaseExport::TColumnVector* pSrcColumns = m_pParent->getSrcVector();
167 
168     m_pParent->m_vColumnPos.clear();
169     m_pParent->m_vColumnTypes.clear();
170     m_pParent->m_vColumnPos.resize( pSrcColumns->size(), ODatabaseExport::TPositions::value_type( COLUMN_POSITION_NOT_FOUND, COLUMN_POSITION_NOT_FOUND ) );
171     m_pParent->m_vColumnTypes.resize( pSrcColumns->size(), COLUMN_POSITION_NOT_FOUND );
172 
173 
174     sal_Int32 nParamPos = 0;
175     SvLBoxEntry* pLeftEntry = m_CTRL_LEFT.GetModel()->First();
176     SvLBoxEntry* pRightEntry = m_CTRL_RIGHT.GetModel()->First();
177     while(pLeftEntry && pRightEntry)
178     {
179         OFieldDescription* pSrcField = static_cast<OFieldDescription*>(pLeftEntry->GetUserData());
180         DBG_ASSERT(pSrcField,"OWizNameMatching: OColumn can not be null!");
181 
182         ODatabaseExport::TColumnVector::const_iterator aSrcIter = pSrcColumns->begin();
183         ODatabaseExport::TColumnVector::const_iterator aSrcEnd  = pSrcColumns->end();
184         for(;aSrcIter != aSrcEnd && (*aSrcIter)->second != pSrcField;++aSrcIter)
185             ;
186         const sal_Int32 nPos = ::std::distance(pSrcColumns->begin(),aSrcIter);
187 
188         //  sal_Int32 nPos = m_CTRL_LEFT.GetModel()->GetAbsPos(pLeftEntry);
189         if(m_CTRL_LEFT.GetCheckButtonState(pLeftEntry) == SV_BUTTON_CHECKED)
190         {
191             OFieldDescription* pDestField = static_cast<OFieldDescription*>(pRightEntry->GetUserData());
192             DBG_ASSERT(pDestField,"OWizNameMatching: OColumn can not be null!");
193             const ODatabaseExport::TColumnVector* pDestColumns          = m_pParent->getDestVector();
194             ODatabaseExport::TColumnVector::const_iterator aDestIter    = pDestColumns->begin();
195             ODatabaseExport::TColumnVector::const_iterator aDestEnd = pDestColumns->end();
196 
197             for(;aDestIter != aDestEnd && (*aDestIter)->second != pDestField;++aDestIter)
198                 ;
199 
200             OSL_ENSURE((nPos) < static_cast<sal_Int32>(m_pParent->m_vColumnPos.size()),"m_pParent->m_vColumnPos: Illegal index for vector");
201             m_pParent->m_vColumnPos[nPos].first = ++nParamPos;
202             m_pParent->m_vColumnPos[nPos].second = ::std::distance(pDestColumns->begin(),aDestIter) + 1;
203             sal_Bool bNotConvert = sal_True;
204             TOTypeInfoSP pTypeInfo = m_pParent->convertType((*aDestIter)->second->getSpecialTypeInfo(),bNotConvert);
205             sal_Int32 nType = ::com::sun::star::sdbc::DataType::VARCHAR;
206             if ( pTypeInfo.get() )
207                 nType = pTypeInfo->nType;
208             m_pParent->m_vColumnTypes[nPos] = nType;
209         }
210         else
211         {
212             m_pParent->m_vColumnPos[nPos].first = COLUMN_POSITION_NOT_FOUND;
213             m_pParent->m_vColumnPos[nPos].second = COLUMN_POSITION_NOT_FOUND;
214         }
215 
216         pLeftEntry = m_CTRL_LEFT.GetModel()->Next(pLeftEntry);
217         pRightEntry = m_CTRL_RIGHT.GetModel()->Next(pRightEntry);
218     }
219 
220     return sal_True;
221 }
222 // -----------------------------------------------------------------------
GetTitle() const223 String OWizNameMatching::GetTitle() const { return String(ModuleRes(STR_WIZ_NAME_MATCHING_TITEL)); }
224 // -----------------------------------------------------------------------
IMPL_LINK(OWizNameMatching,ButtonClickHdl,Button *,pButton)225 IMPL_LINK( OWizNameMatching, ButtonClickHdl, Button *, pButton )
226 {
227     SvLBoxEntry* pEntry = m_CTRL_LEFT.FirstSelected();
228     if ( pEntry )
229     {
230         sal_Int32 nPos      = m_CTRL_LEFT.GetModel()->GetAbsPos(pEntry);
231         if(pButton == &m_ibColumn_up && nPos)
232             --nPos;
233         else if(pButton == &m_ibColumn_down)
234             nPos += 2;
235 
236         m_CTRL_LEFT.ModelIsMoving(pEntry,NULL,nPos);
237         m_CTRL_LEFT.GetModel()->Move(pEntry,NULL,nPos);
238         m_CTRL_LEFT.ModelHasMoved(pEntry);
239 
240         long nThumbPos      = m_CTRL_LEFT.GetVScroll()->GetThumbPos();
241         long nVisibleSize   = m_CTRL_LEFT.GetVScroll()->GetVisibleSize();
242 
243         if(pButton == &m_ibColumn_down && (nThumbPos+nVisibleSize+1) < nPos)
244         {
245             m_CTRL_LEFT.GetVScroll()->DoScrollAction(SCROLL_LINEDOWN);
246             //  m_CTRL_LEFT.MakeVisible(pEntry,sal_True);
247         }
248 
249         TableListClickHdl(&m_CTRL_LEFT);
250     }
251 
252 
253     return 0;
254 }
255 //------------------------------------------------------------------------------
IMPL_LINK(OWizNameMatching,RightButtonClickHdl,Button *,pButton)256 IMPL_LINK( OWizNameMatching, RightButtonClickHdl, Button *, pButton )
257 {
258     SvLBoxEntry* pEntry = m_CTRL_RIGHT.FirstSelected();
259     if ( pEntry )
260     {
261         sal_Int32 nPos      = m_CTRL_RIGHT.GetModel()->GetAbsPos(pEntry);
262         if(pButton == &m_ibColumn_up_right && nPos)
263             --nPos;
264         else if(pButton == &m_ibColumn_down_right)
265             nPos += 2;
266 
267         m_CTRL_RIGHT.ModelIsMoving(pEntry,NULL,nPos);
268         m_CTRL_RIGHT.GetModel()->Move(pEntry,NULL,nPos);
269         m_CTRL_RIGHT.ModelHasMoved(pEntry);
270         long nThumbPos      = m_CTRL_RIGHT.GetVScroll()->GetThumbPos();
271         long nVisibleSize   = m_CTRL_RIGHT.GetVScroll()->GetVisibleSize();
272 
273         if(pButton == &m_ibColumn_down_right && (nThumbPos+nVisibleSize+1) < nPos)
274             m_CTRL_RIGHT.GetVScroll()->DoScrollAction(SCROLL_LINEDOWN);
275         TableListRightSelectHdl(&m_CTRL_RIGHT);
276     }
277     return 0;
278 }
279 //------------------------------------------------------------------------------
280 IMPL_LINK( OWizNameMatching, TableListClickHdl, void*, /*NOTINTERESTEDIN*/ )
281 {
282     SvLBoxEntry* pEntry = m_CTRL_LEFT.FirstSelected();
283     if(pEntry)
284     {
285         sal_uLong nPos          = m_CTRL_LEFT.GetModel()->GetAbsPos(pEntry);
286         SvLBoxEntry* pOldEntry = m_CTRL_RIGHT.FirstSelected();
287         if(pOldEntry && nPos != m_CTRL_RIGHT.GetModel()->GetAbsPos(pOldEntry))
288         {
289             if(pOldEntry)
290                 m_CTRL_RIGHT.Select(pOldEntry,sal_False);
291             pOldEntry = m_CTRL_RIGHT.GetEntry(nPos);
292             if(pOldEntry)
293             {
294                 sal_uLong nNewPos = m_CTRL_LEFT.GetModel()->GetAbsPos(m_CTRL_LEFT.GetFirstEntryInView());
295                 if ( nNewPos - nPos == 1 )
296                     --nNewPos;
297                 m_CTRL_RIGHT.MakeVisible(m_CTRL_RIGHT.GetEntry(nNewPos),sal_True);
298                 m_CTRL_RIGHT.Select(pOldEntry,sal_True);
299             }
300         }
301         else if(!pOldEntry)
302         {
303             pOldEntry = m_CTRL_RIGHT.GetEntry(nPos);
304             if(pOldEntry)
305             {
306                 m_CTRL_RIGHT.Select(pOldEntry,sal_True);
307             }
308         }
309     }
310 
311     return 0;
312 }
313 //------------------------------------------------------------------------------
314 IMPL_LINK( OWizNameMatching, TableListRightSelectHdl, void*, /*NOTINTERESTEDIN*/ )
315 {
316     SvLBoxEntry* pEntry = m_CTRL_RIGHT.FirstSelected();
317     if(pEntry)
318     {
319         sal_uLong nPos          = m_CTRL_RIGHT.GetModel()->GetAbsPos(pEntry);
320         SvLBoxEntry* pOldEntry = m_CTRL_LEFT.FirstSelected();
321         if(pOldEntry && nPos != m_CTRL_LEFT.GetModel()->GetAbsPos(pOldEntry))
322         {
323             if(pOldEntry)
324                 m_CTRL_LEFT.Select(pOldEntry,sal_False);
325             pOldEntry = m_CTRL_LEFT.GetEntry(nPos);
326             if(pOldEntry)
327             {
328                 sal_uLong nNewPos = m_CTRL_RIGHT.GetModel()->GetAbsPos(m_CTRL_RIGHT.GetFirstEntryInView());
329                 if ( nNewPos - nPos == 1 )
330                     nNewPos--;
331                 m_CTRL_LEFT.MakeVisible(m_CTRL_LEFT.GetEntry(nNewPos),sal_True);
332                 m_CTRL_LEFT.Select(pOldEntry,sal_True);
333             }
334         }
335         else if(!pOldEntry)
336         {
337             pOldEntry = m_CTRL_LEFT.GetEntry(nPos);
338             if(pOldEntry)
339             {
340                 m_CTRL_LEFT.Select(pOldEntry,sal_True);
341             }
342         }
343     }
344 
345     return 0;
346 }
347 // -----------------------------------------------------------------------
IMPL_LINK(OWizNameMatching,AllNoneClickHdl,Button *,pButton)348 IMPL_LINK( OWizNameMatching, AllNoneClickHdl, Button *, pButton )
349 {
350     sal_Bool bAll = pButton == &m_pbAll;
351     SvLBoxEntry* pEntry = m_CTRL_LEFT.First();
352     while(pEntry)
353     {
354         m_CTRL_LEFT.SetCheckButtonState( pEntry, bAll ? SV_BUTTON_CHECKED : SV_BUTTON_UNCHECKED);
355         pEntry = m_CTRL_LEFT.Next(pEntry);
356     }
357 
358     return 0;
359 }
360 // -----------------------------------------------------------------------
361 //========================================================================
362 // class OColumnString
363 //========================================================================
364 class OColumnString : public SvLBoxString
365 {
366     sal_Bool m_bReadOnly;
367 public:
OColumnString(SvLBoxEntry * pEntry,sal_uInt16 nFlags,const String & rStr,sal_Bool _RO)368     OColumnString( SvLBoxEntry* pEntry, sal_uInt16 nFlags, const String& rStr,sal_Bool _RO)
369         :SvLBoxString(pEntry,nFlags,rStr)
370         ,m_bReadOnly(_RO)
371     {
372     }
373 
374     virtual void Paint(const Point& rPos, SvLBox& rDev, sal_uInt16 nFlags, SvLBoxEntry* pEntry);
375     //virtual void InitViewData( SvLBox* pView,SvLBoxEntry* pEntry, SvViewDataItem* pViewData);
376 };
377 
378 
379 
380 //------------------------------------------------------------------------
381 /*
382 void OColumnString::InitViewData( SvLBox* pView,SvLBoxEntry* pEntry, SvViewDataItem* pViewData)
383 {
384     SvLBoxString::InitViewData(pView,pEntry,pViewData);
385 }
386 */
387 //------------------------------------------------------------------------
Paint(const Point & rPos,SvLBox & rDev,sal_uInt16,SvLBoxEntry *)388 void OColumnString::Paint(const Point& rPos, SvLBox& rDev, sal_uInt16 /*nFlags*/, SvLBoxEntry* /*pEntry*/ )
389 {
390     if(m_bReadOnly)
391     {
392         const StyleSettings& rStyleSettings = rDev.GetSettings().GetStyleSettings();
393         rDev.SetTextColor( rStyleSettings.GetDisableColor() );
394         rDev.SetTextFillColor( rStyleSettings.GetFieldColor() );
395     }
396     rDev.DrawText( rPos, GetText() );
397 }
398 //========================================================================
OColumnTreeBox(Window * pParent,const ResId & rResId)399 OColumnTreeBox::OColumnTreeBox( Window* pParent, const ResId& rResId )
400     : OMarkableTreeListBox(pParent,NULL,rResId)
401 {
402     SetDragDropMode( 0 );
403     EnableInplaceEditing( sal_False );
404     SetStyle(GetStyle() | WB_BORDER | WB_HASBUTTONS | WB_HSCROLL);
405     SetSelectionMode( SINGLE_SELECTION );
406 }
407 //------------------------------------------------------------------------
InitEntry(SvLBoxEntry * pEntry,const String & rStr,const Image & rImg1,const Image & rImg2,SvLBoxButtonKind eButtonKind)408 void OColumnTreeBox::InitEntry(SvLBoxEntry* pEntry, const String& rStr, const Image& rImg1, const Image& rImg2, SvLBoxButtonKind eButtonKind)
409 {
410     DBTreeListBox::InitEntry( pEntry, rStr, rImg1, rImg2, eButtonKind );
411     SvLBoxString* pString = new OColumnString(pEntry, 0, rStr,sal_False);
412     if (pString)
413         pEntry->ReplaceItem( pString, pEntry->ItemCount() - 1 );
414 }
415 //------------------------------------------------------------------------
Select(SvLBoxEntry * pEntry,sal_Bool bSelect)416 sal_Bool OColumnTreeBox::Select( SvLBoxEntry* pEntry, sal_Bool bSelect )
417 {
418     if(bSelect)
419     {
420         OFieldDescription* pColumn = static_cast<OFieldDescription*>(pEntry->GetUserData());
421         if(!(pColumn->IsAutoIncrement() && m_bReadOnly))
422             bSelect = DBTreeListBox::Select( pEntry,bSelect );
423     }
424     else
425         bSelect = DBTreeListBox::Select( pEntry,bSelect );
426     return bSelect;
427 }
428 //------------------------------------------------------------------------
FillListBox(const ODatabaseExport::TColumnVector & _rList)429 void OColumnTreeBox::FillListBox( const ODatabaseExport::TColumnVector& _rList)
430 {
431     Clear();
432     ODatabaseExport::TColumnVector::const_iterator aIter = _rList.begin();
433     ODatabaseExport::TColumnVector::const_iterator aEnd = _rList.end();
434     for(;aIter != aEnd;++aIter)
435     {
436         SvLBoxEntry* pEntry = InsertEntry((*aIter)->first,0,sal_False,LIST_APPEND,(*aIter)->second);
437         SvButtonState eState = !(m_bReadOnly && (*aIter)->second->IsAutoIncrement()) ? SV_BUTTON_CHECKED : SV_BUTTON_UNCHECKED;
438         SetCheckButtonState( pEntry, eState );
439     }
440 }
441 // -----------------------------------------------------------------------------
442 
443 
444 
445 
446 
447