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_dbui.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