Line data Source code
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 "FieldDescControl.hxx"
21 : #include "FieldControls.hxx"
22 : #include <tools/diagnose_ex.h>
23 : #include "TableDesignHelpBar.hxx"
24 : #include <vcl/scrbar.hxx>
25 : #include <vcl/button.hxx>
26 : #include <vcl/svapp.hxx>
27 : #include <vcl/fixed.hxx>
28 : #include <vcl/msgbox.hxx>
29 : #include <vector>
30 : #include "FieldDescriptions.hxx"
31 : #include "dlgattr.hxx"
32 : #include <svx/numfmtsh.hxx>
33 : #include <svx/svxids.hrc>
34 : #include <svx/algitem.hxx>
35 : #include <svl/itempool.hxx>
36 : #include <svl/zforlist.hxx>
37 : #include <svl/rngitem.hxx>
38 : #include <svl/intitem.hxx>
39 : #include <svl/numuno.hxx>
40 : #include <svtools/transfer.hxx>
41 : #include <com/sun/star/lang/XUnoTunnel.hpp>
42 : #include <com/sun/star/util/NumberFormat.hpp>
43 : #include <com/sun/star/util/XNumberFormatPreviewer.hpp>
44 : #include <com/sun/star/util/XNumberFormatTypes.hpp>
45 : #include <com/sun/star/beans/XPropertySet.hpp>
46 : #include "QEnumTypes.hxx"
47 : #include "dbaccess_helpid.hrc"
48 : #include <connectivity/dbtools.hxx>
49 : #include <connectivity/dbconversion.hxx>
50 : #include <comphelper/numbers.hxx>
51 : #include <comphelper/string.hxx>
52 : #include "UITools.hxx"
53 : #include <memory>
54 : #include "dbu_control.hrc"
55 : #include "dbu_tbl.hrc"
56 : #include <osl/diagnose.h>
57 :
58 :
59 : using namespace dbaui;
60 : using namespace dbtools;
61 : using namespace ::com::sun::star::uno;
62 : using namespace ::com::sun::star::beans;
63 : using namespace ::com::sun::star::lang;
64 : using namespace ::com::sun::star::sdbc;
65 : using namespace ::com::sun::star::util;
66 :
67 : //==================================================================
68 :
69 : // For the Controls on the OFieldDescGenPage
70 : #define CONTROL_SPACING_X 18 // 6
71 : #define CONTROL_SPACING_Y 4
72 : #define CONTROL_WIDTH_1 160 // 100
73 : #define CONTROL_WIDTH_2 100 // 60
74 : #define CONTROL_WIDTH_3 250
75 : #define CONTROL_WIDTH_4 (CONTROL_WIDTH_3 - 20 - 5)
76 :
77 : #define SBA_DEF_RANGEFORMAT (100 + 143) // RangeItem
78 : #define SBA_DEF_FMTVALUE (100 + 144) // SfxULONG, Format
79 : #define SBA_ATTR_ALIGN_HOR_JUSTIFY (100 + 145) // SvxHorJustifyItem
80 :
81 : #define HSCROLL_STEP 20
82 :
83 :
84 : namespace
85 : {
86 :
87 0 : template< typename T1, typename T2> void lcl_HideAndDeleteControl(short& _nPos,T1** _pControl,T2** _pControlText)
88 : {
89 0 : if ( *_pControl )
90 : {
91 0 : --_nPos;
92 0 : (*_pControl)->Hide();
93 0 : (*_pControlText)->Hide();
94 0 : delete *_pControl;
95 0 : delete *_pControlText;
96 0 : (*_pControl) = NULL;
97 0 : (*_pControlText) = NULL;
98 : }
99 0 : }
100 :
101 : }
102 :
103 : //==================================================================
104 : // class OFieldDescControl
105 : //==================================================================
106 :
107 : DBG_NAME(OFieldDescControl)
108 :
109 : //==================================================================
110 0 : OFieldDescControl::OFieldDescControl( Window* pParent, const ResId& rResId, OTableDesignHelpBar* pHelpBar)
111 : :TabPage( pParent, rResId )
112 : ,pHelp( pHelpBar )
113 : ,pLastFocusWindow(NULL)
114 : ,m_pActFocusWindow(NULL)
115 : ,pDefaultText(NULL)
116 : ,pRequiredText(NULL)
117 : ,pAutoIncrementText(NULL)
118 : ,pTextLenText(NULL)
119 : ,pNumTypeText(NULL)
120 : ,pLengthText(NULL)
121 : ,pScaleText(NULL)
122 : ,pFormatText(NULL)
123 : ,pBoolDefaultText(NULL)
124 : ,m_pColumnNameText(NULL)
125 : ,m_pTypeText(NULL)
126 : ,m_pAutoIncrementValueText(NULL)
127 : ,pRequired(NULL)
128 : ,pNumType(NULL)
129 : ,pAutoIncrement(NULL)
130 : ,pDefault(NULL)
131 : ,pTextLen(NULL)
132 : ,pLength(NULL)
133 : ,pScale(NULL)
134 : ,pFormatSample(NULL)
135 : ,pBoolDefault(NULL)
136 : ,m_pColumnName(NULL)
137 : ,m_pType(NULL)
138 : ,m_pAutoIncrementValue(NULL)
139 : ,pFormat(NULL)
140 : ,m_pVertScroll( NULL )
141 : ,m_pHorzScroll( NULL )
142 : ,m_pPreviousType()
143 : ,m_nPos(-1)
144 : ,aYes(ModuleRes(STR_VALUE_YES))
145 : ,aNo(ModuleRes(STR_VALUE_NO))
146 : ,m_nOldVThumb( 0 )
147 : ,m_nOldHThumb( 0 )
148 : ,m_nWidth(50)
149 : ,m_bAdded(sal_False)
150 : ,m_bRightAligned(false)
151 0 : ,pActFieldDescr(NULL)
152 : {
153 : DBG_CTOR(OFieldDescControl,NULL);
154 :
155 0 : Contruct();
156 0 : }
157 : //------------------------------------------------------------------------------
158 0 : OFieldDescControl::OFieldDescControl( Window* pParent, OTableDesignHelpBar* pHelpBar )
159 : :TabPage( pParent, WB_3DLOOK | WB_DIALOGCONTROL )
160 : ,pHelp( pHelpBar )
161 : ,pLastFocusWindow(NULL)
162 : ,m_pActFocusWindow(NULL)
163 : ,pDefaultText(NULL)
164 : ,pRequiredText(NULL)
165 : ,pAutoIncrementText(NULL)
166 : ,pTextLenText(NULL)
167 : ,pNumTypeText(NULL)
168 : ,pLengthText(NULL)
169 : ,pScaleText(NULL)
170 : ,pFormatText(NULL)
171 : ,pBoolDefaultText(NULL)
172 : ,m_pColumnNameText(NULL)
173 : ,m_pTypeText(NULL)
174 : ,m_pAutoIncrementValueText(NULL)
175 : ,pRequired(NULL)
176 : ,pNumType(NULL)
177 : ,pAutoIncrement(NULL)
178 : ,pDefault(NULL)
179 : ,pTextLen(NULL)
180 : ,pLength(NULL)
181 : ,pScale(NULL)
182 : ,pFormatSample(NULL)
183 : ,pBoolDefault(NULL)
184 : ,m_pColumnName(NULL)
185 : ,m_pType(NULL)
186 : ,m_pAutoIncrementValue(NULL)
187 : ,pFormat(NULL)
188 : ,m_pVertScroll( NULL )
189 : ,m_pHorzScroll( NULL )
190 : ,m_pPreviousType()
191 : ,m_nPos(-1)
192 : ,aYes(ModuleRes(STR_VALUE_YES))
193 : ,aNo(ModuleRes(STR_VALUE_NO))
194 : ,m_nOldVThumb( 0 )
195 : ,m_nOldHThumb( 0 )
196 : ,m_nWidth(50)
197 : ,m_bAdded(sal_False)
198 : ,m_bRightAligned(false)
199 0 : ,pActFieldDescr(NULL)
200 : {
201 : DBG_CTOR(OFieldDescControl,NULL);
202 0 : Contruct();
203 0 : }
204 : // -----------------------------------------------------------------------------
205 0 : void OFieldDescControl::Contruct()
206 : {
207 0 : m_pVertScroll = new ScrollBar(this, WB_VSCROLL | WB_REPEAT | WB_DRAG);
208 0 : m_pHorzScroll = new ScrollBar(this, WB_HSCROLL | WB_REPEAT | WB_DRAG);
209 0 : m_pVertScroll->SetScrollHdl(LINK(this, OFieldDescControl, OnScroll));
210 0 : m_pHorzScroll->SetScrollHdl(LINK(this, OFieldDescControl, OnScroll));
211 0 : m_pVertScroll->Show();
212 0 : m_pHorzScroll->Show();
213 :
214 0 : m_pVertScroll->EnableClipSiblings();
215 0 : m_pHorzScroll->EnableClipSiblings();
216 :
217 0 : m_pVertScroll->SetLineSize(1);
218 0 : m_pVertScroll->SetPageSize(1);
219 0 : m_pHorzScroll->SetLineSize(1);
220 0 : m_pHorzScroll->SetPageSize(1);
221 :
222 0 : m_nOldVThumb = m_nOldHThumb = 0;
223 0 : }
224 :
225 : //------------------------------------------------------------------------------
226 0 : OFieldDescControl::~OFieldDescControl()
227 : {
228 : DBG_DTOR(OFieldDescControl,NULL);
229 :
230 : {
231 : SAL_WNODEPRECATED_DECLARATIONS_PUSH
232 0 : ::std::auto_ptr<Window> aTemp(m_pVertScroll);
233 : SAL_WNODEPRECATED_DECLARATIONS_POP
234 0 : m_pVertScroll = NULL;
235 : }
236 : {
237 : SAL_WNODEPRECATED_DECLARATIONS_PUSH
238 0 : ::std::auto_ptr<Window> aTemp(m_pHorzScroll);
239 : SAL_WNODEPRECATED_DECLARATIONS_POP
240 0 : m_pHorzScroll = NULL;
241 : }
242 0 : if ( m_bAdded )
243 0 : ::dbaui::notifySystemWindow(this,this,::comphelper::mem_fun(&TaskPaneList::RemoveWindow));
244 0 : pLastFocusWindow = NULL;
245 :
246 : //////////////////////////////////////////////////////////////////////
247 : // Destroy children
248 0 : DeactivateAggregate( tpDefault );
249 0 : DeactivateAggregate( tpRequired );
250 0 : DeactivateAggregate( tpTextLen );
251 0 : DeactivateAggregate( tpNumType );
252 0 : DeactivateAggregate( tpScale );
253 0 : DeactivateAggregate( tpLength );
254 0 : DeactivateAggregate( tpFormat );
255 0 : DeactivateAggregate( tpAutoIncrement );
256 0 : DeactivateAggregate( tpBoolDefault );
257 0 : DeactivateAggregate( tpColumnName );
258 0 : DeactivateAggregate( tpType );
259 0 : DeactivateAggregate( tpAutoIncrementValue );
260 0 : }
261 :
262 : //------------------------------------------------------------------------------
263 0 : String OFieldDescControl::BoolStringPersistent(const String& rUIString) const
264 : {
265 0 : if (rUIString == aNo)
266 0 : return rtl::OUString('0');
267 0 : if (rUIString == aYes)
268 0 : return rtl::OUString('1');
269 0 : return rtl::OUString();
270 : }
271 :
272 : //------------------------------------------------------------------------------
273 0 : String OFieldDescControl::BoolStringUI(const String& rPersistentString) const
274 : {
275 : // Older versions may store a language dependend string as a default
276 0 : if (rPersistentString.Equals(aYes) || rPersistentString.Equals(aNo))
277 0 : return rPersistentString;
278 :
279 0 : if (comphelper::string::equals(rPersistentString, '0'))
280 0 : return aNo;
281 0 : if (comphelper::string::equals(rPersistentString, '1'))
282 0 : return aYes;
283 :
284 0 : return ModuleRes(STR_VALUE_NONE).toString();
285 : }
286 :
287 : //------------------------------------------------------------------------------
288 0 : void OFieldDescControl::Init()
289 : {
290 0 : Reference< ::com::sun::star::util::XNumberFormatter > xFormatter = GetFormatter();
291 0 : ::dbaui::setEvalDateFormatForFormatter(xFormatter);
292 0 : }
293 :
294 : //------------------------------------------------------------------------------
295 0 : IMPL_LINK(OFieldDescControl, OnScroll, ScrollBar*, /*pBar*/)
296 : {
297 0 : ScrollAllAggregates();
298 0 : return 0;
299 : }
300 : // -----------------------------------------------------------------------------
301 : namespace
302 : {
303 0 : void getMaxXPosition(Window* _pWindow,long& _rnMaxXPosition)
304 : {
305 0 : if (_pWindow)
306 : {
307 0 : long nTemp = _pWindow->GetSizePixel().Width() + _pWindow->GetPosPixel().X();
308 0 : _rnMaxXPosition = ::std::max(_rnMaxXPosition, nTemp);
309 : }
310 0 : }
311 : }
312 : //------------------------------------------------------------------------------
313 0 : void OFieldDescControl::CheckScrollBars()
314 : {
315 : // Calculate the ScrollBars' new position
316 0 : Size szOverallSize = GetSizePixel();
317 0 : long nHScrollHeight = m_pHorzScroll->GetSizePixel().Height();
318 0 : long nVScrollWidth = m_pVertScroll->GetSizePixel().Width();
319 :
320 0 : long nNewHWidth = szOverallSize.Width() - nVScrollWidth;
321 0 : long nNewVHeight = szOverallSize.Height() - nHScrollHeight;
322 :
323 0 : sal_Bool bNeedHScrollBar(sal_False), bNeedVScrollBar(sal_False);
324 :
325 : // Adjust the areas
326 : // Do I actually need ScrollBars?
327 : // horizontal :
328 0 : long lMaxXPosition = 0;
329 0 : Control* ppAggregates[] = { pRequired, pNumType, pAutoIncrement, pDefault, pTextLen, pLength, pScale, pFormat, m_pColumnName, m_pType,m_pAutoIncrementValue};
330 0 : for (sal_uInt16 i=0; i<sizeof(ppAggregates)/sizeof(ppAggregates[0]); ++i)
331 0 : getMaxXPosition(ppAggregates[i],lMaxXPosition);
332 :
333 0 : if (m_pHorzScroll)
334 0 : lMaxXPosition += m_pHorzScroll->GetThumbPos() * HSCROLL_STEP;
335 :
336 0 : long lMaxXAvailable = szOverallSize.Width();
337 0 : bNeedHScrollBar = lMaxXPosition > lMaxXAvailable;
338 : // Might change
339 :
340 : // Vertical
341 : // How many Controls do I have?
342 0 : sal_uInt16 nActive = CountActiveAggregates();
343 : // Which one is the last one that fits?
344 : sal_uInt16 nLastVisible;
345 0 : const sal_Int32 nControlHeight = GetMaxControlHeight();
346 0 : const sal_Int32 nControl_Spacing_y = LogicToPixel(Size(0, CONTROL_SPACING_Y),MAP_APPFONT).Height();
347 0 : if (bNeedHScrollBar)
348 0 : nLastVisible = static_cast<sal_uInt16>((szOverallSize.Height() - nControl_Spacing_y - nHScrollHeight) / (nControl_Spacing_y + nControlHeight));
349 : else
350 0 : nLastVisible = static_cast<sal_uInt16>((szOverallSize.Height() - nControl_Spacing_y) / (nControl_Spacing_y + nControlHeight));
351 0 : bNeedVScrollBar = nActive>nLastVisible;
352 :
353 0 : if (bNeedVScrollBar)
354 : {
355 : // When originally calculating lMaxXAvailable we did not take into account that we have a VScrollBar, so we need to do that now
356 0 : lMaxXAvailable -= nVScrollWidth;
357 0 : if (!bNeedHScrollBar && (lMaxXPosition > lMaxXAvailable))
358 : {
359 : // The vertical one now necessitates a horizontal one
360 0 : bNeedHScrollBar = sal_True;
361 : // Adjust nLastVisible
362 0 : nLastVisible = static_cast<sal_uInt16>((szOverallSize.Height() - nControl_Spacing_y - nHScrollHeight) / (nControl_Spacing_y + nControlHeight));
363 : // bNeedVScrollBar does NOT change: it's already set to sal_True and nLastVisible will only decrease
364 : }
365 : }
366 :
367 : // Now we can really position them and set their parameters
368 0 : if (bNeedVScrollBar)
369 : {
370 0 : m_pVertScroll->Show();
371 0 : m_pVertScroll->SetRangeMax(nActive - nLastVisible);
372 :
373 0 : m_pVertScroll->SetPosSizePixel( Point(nNewHWidth, 0), Size(nVScrollWidth, szOverallSize.Height()) );
374 : }
375 : else
376 : {
377 0 : m_pVertScroll->Hide();
378 0 : m_pVertScroll->SetRangeMax(0);
379 0 : m_pVertScroll->SetThumbPos(0);
380 : }
381 :
382 0 : if (bNeedHScrollBar)
383 : {
384 0 : m_pHorzScroll->Show();
385 0 : m_pHorzScroll->SetRangeMax((lMaxXPosition - lMaxXAvailable + HSCROLL_STEP - 1 )/HSCROLL_STEP);
386 :
387 0 : m_pHorzScroll->SetPosSizePixel( Point(0, nNewVHeight), Size(bNeedVScrollBar ? nNewHWidth : szOverallSize.Width(), nHScrollHeight) );
388 : }
389 : else
390 : {
391 0 : m_pHorzScroll->Hide();
392 0 : m_pHorzScroll->SetRangeMax(0);
393 0 : m_pHorzScroll->SetThumbPos(0);
394 : }
395 0 : }
396 :
397 : //------------------------------------------------------------------------------
398 0 : void OFieldDescControl::Resize()
399 : {
400 0 : CheckScrollBars();
401 0 : ScrollAllAggregates();
402 0 : }
403 :
404 : //------------------------------------------------------------------------------
405 0 : inline void OFieldDescControl::ScrollAggregate(Control* pText, Control* pInput, Control* pButton, long nDeltaX, long nDeltaY)
406 : {
407 0 : if (!pText)
408 0 : return;
409 0 : pText->SetPosPixel(pText->GetPosPixel() + Point(nDeltaX, nDeltaY));
410 0 : pInput->SetPosPixel(pInput->GetPosPixel() + Point(nDeltaX, nDeltaY));
411 0 : if (pButton)
412 0 : pButton->SetPosPixel(pButton->GetPosPixel() + Point(nDeltaX, nDeltaY));
413 : }
414 :
415 : //------------------------------------------------------------------------------
416 0 : void OFieldDescControl::ScrollAllAggregates()
417 : {
418 0 : long nDeltaX = 0, nDeltaY = 0;
419 0 : if (m_nOldHThumb != m_pHorzScroll->GetThumbPos())
420 : {
421 0 : nDeltaX = (m_nOldHThumb - m_pHorzScroll->GetThumbPos()) * HSCROLL_STEP;
422 0 : m_nOldHThumb = m_pHorzScroll->GetThumbPos();
423 : }
424 :
425 0 : if (m_nOldVThumb != m_pVertScroll->GetThumbPos())
426 : {
427 0 : const sal_Int32 nControlHeight = GetMaxControlHeight();
428 0 : const sal_Int32 nControl_Spacing_y = LogicToPixel(Size(0, CONTROL_SPACING_Y),MAP_APPFONT).Height();
429 0 : nDeltaY = (m_nOldVThumb - m_pVertScroll->GetThumbPos()) * (nControl_Spacing_y + nControlHeight);
430 0 : m_nOldVThumb = m_pVertScroll->GetThumbPos();
431 : }
432 :
433 0 : if (nDeltaX || nDeltaY)
434 : {
435 : Control* ppAggregates[] = { pRequired, pNumType
436 : , pAutoIncrement, pDefault
437 : , pTextLen, pLength
438 : , pScale, m_pColumnName
439 0 : , m_pType, m_pAutoIncrementValue};
440 : Control* ppAggregatesText[] = { pRequiredText, pNumTypeText
441 : , pAutoIncrementText, pDefaultText
442 : , pTextLenText, pLengthText
443 : , pScaleText, m_pColumnNameText
444 0 : , m_pTypeText, m_pAutoIncrementValueText};
445 : OSL_ENSURE(sizeof(ppAggregates)/sizeof(ppAggregates[0]) == sizeof(ppAggregatesText)/sizeof(ppAggregatesText[0]),"Lists are not identical!");
446 :
447 0 : for (sal_uInt16 i=0; i<sizeof(ppAggregates)/sizeof(ppAggregates[0]); ++i)
448 0 : ScrollAggregate(ppAggregatesText[i],ppAggregates[i],NULL,nDeltaX, nDeltaY);
449 :
450 0 : ScrollAggregate(pFormatText,pFormatSample,pFormat,nDeltaX, nDeltaY);
451 : }
452 0 : }
453 :
454 : //------------------------------------------------------------------------------
455 0 : sal_uInt16 OFieldDescControl::CountActiveAggregates() const
456 : {
457 0 : Control* ppAggregates[] = { pRequired, pNumType, pAutoIncrement, pDefault, pTextLen, pLength, pScale, pFormat, m_pColumnName, m_pType,m_pAutoIncrementValue};
458 0 : sal_uInt16 nVisibleAggregates = 0;
459 0 : for (sal_uInt16 i=0; i<sizeof(ppAggregates)/sizeof(ppAggregates[0]); ++i)
460 0 : if (ppAggregates[i])
461 0 : ++nVisibleAggregates;
462 0 : return nVisibleAggregates;
463 : }
464 : //------------------------------------------------------------------------------
465 0 : sal_Int32 OFieldDescControl::GetMaxControlHeight() const
466 : {
467 0 : Size aHeight;
468 0 : Control* ppAggregates[] = { pRequired, pNumType, pAutoIncrement, pDefault, pTextLen, pLength, pScale, pFormat, m_pColumnName, m_pType,m_pAutoIncrementValue};
469 0 : for (sal_uInt16 i=0; i<sizeof(ppAggregates)/sizeof(ppAggregates[0]); ++i)
470 : {
471 0 : if ( ppAggregates[i] )
472 : {
473 0 : const Size aTemp( ppAggregates[i]->GetOptimalSize(WINDOWSIZE_PREFERRED) );
474 0 : if ( aTemp.Height() > aHeight.Height() )
475 0 : aHeight.Height() = aTemp.Height();
476 : }
477 : }
478 :
479 0 : return aHeight.Height();
480 : }
481 : //------------------------------------------------------------------------------
482 0 : void OFieldDescControl::SetReadOnly( sal_Bool bReadOnly )
483 : {
484 : DBG_CHKTHIS(OFieldDescControl,NULL);
485 : //////////////////////////////////////////////////////////////////////
486 : // Enable/disable Controls
487 : Control* ppAggregates[] = { pRequired, pNumType
488 : , pAutoIncrement, pDefault
489 : , pTextLen, pLength
490 : , pScale, m_pColumnName
491 : , m_pType, m_pAutoIncrementValue
492 0 : , pFormat};
493 : Control* ppAggregatesText[] = { pRequiredText, pNumTypeText
494 : , pAutoIncrementText, pDefaultText
495 : , pTextLenText, pLengthText
496 : , pScaleText, m_pColumnNameText
497 : , m_pTypeText, m_pAutoIncrementValueText
498 0 : , pFormatText};
499 :
500 : OSL_ENSURE(sizeof(ppAggregates)/sizeof(ppAggregates[0]) == sizeof(ppAggregatesText)/sizeof(ppAggregatesText[0]),"Lists are not identical!");
501 :
502 0 : for (sal_uInt16 i=0; i<sizeof(ppAggregates)/sizeof(ppAggregates[0]); ++i)
503 : {
504 0 : if ( ppAggregatesText[i] )
505 0 : ppAggregatesText[i]->Enable( !bReadOnly );
506 0 : if ( ppAggregates[i] )
507 0 : ppAggregates[i]->Enable( !bReadOnly );
508 : }
509 0 : }
510 :
511 : //------------------------------------------------------------------------------
512 0 : String OFieldDescControl::GetControlText( sal_uInt16 nControlId )
513 : {
514 : DBG_CHKTHIS(OFieldDescControl,NULL);
515 : //////////////////////////////////////////////////////////////////////
516 : // Read out the Controls' texts
517 0 : switch( nControlId )
518 : {
519 : case FIELD_PROPERTY_BOOL_DEFAULT:
520 0 : if (pBoolDefault)
521 0 : return pBoolDefault->GetSelectEntry();
522 0 : break;
523 : case FIELD_PROPERTY_DEFAULT:
524 0 : if (pDefault)
525 0 : return pDefault->GetText();
526 0 : break;
527 : case FIELD_PROPERTY_REQUIRED:
528 0 : if (pRequired)
529 0 : return pRequired->GetSelectEntry();
530 0 : break;
531 : case FIELD_PROPERTY_TEXTLEN:
532 0 : if (pTextLen)
533 0 : return rtl::OUString::valueOf(static_cast<sal_Int64>(pTextLen->GetValue()));
534 : case FIELD_PROPERTY_NUMTYPE:
535 0 : if (pNumType)
536 0 : return pNumType->GetSelectEntry();
537 0 : break;
538 : case FIELD_PROPERTY_AUTOINC:
539 0 : if (pAutoIncrement)
540 0 : return pAutoIncrement->GetSelectEntry();
541 0 : break;
542 : case FIELD_PROPERTY_LENGTH:
543 0 : if (pLength)
544 0 : return pLength->GetText();
545 0 : break;
546 : case FIELD_PROPERTY_SCALE:
547 0 : if (pScale)
548 0 : return pScale->GetText();
549 0 : break;
550 : case FIELD_PROPERTY_FORMAT:
551 0 : if (pFormatSample)
552 0 : return pFormatSample->GetText();
553 0 : break;
554 : case FIELD_PRPOERTY_COLUMNNAME:
555 0 : if(m_pColumnName)
556 0 : return m_pColumnName->GetText();
557 : case FIELD_PRPOERTY_TYPE:
558 0 : if(m_pType)
559 0 : return m_pType->GetSelectEntry();
560 0 : break;
561 : case FIELD_PRPOERTY_AUTOINCREMENT:
562 0 : if(m_pAutoIncrementValue)
563 0 : return m_pAutoIncrementValue->GetText();
564 : }
565 :
566 0 : return String();
567 : }
568 :
569 : //------------------------------------------------------------------------------
570 0 : void OFieldDescControl::SetControlText( sal_uInt16 nControlId, const String& rText )
571 : {
572 : DBG_CHKTHIS(OFieldDescControl,NULL);
573 : //////////////////////////////////////////////////////////////////////
574 : // Set the Controls' texts
575 0 : switch( nControlId )
576 : {
577 : case FIELD_PROPERTY_BOOL_DEFAULT:
578 0 : if (pBoolDefault)
579 : {
580 0 : String sOld = pBoolDefault->GetSelectEntry();
581 0 : pBoolDefault->SelectEntry(rText);
582 0 : if (!sOld.Equals(rText))
583 0 : LINK(this, OFieldDescControl, ChangeHdl).Call(pBoolDefault);
584 : }
585 0 : break;
586 : case FIELD_PROPERTY_DEFAULT:
587 0 : if (pDefault)
588 : {
589 0 : pDefault->SetText(rText);
590 0 : UpdateFormatSample(pActFieldDescr);
591 : }
592 0 : break;
593 :
594 : case FIELD_PROPERTY_REQUIRED:
595 0 : if (pRequired)
596 0 : pRequired->SelectEntry(rText);
597 0 : break;
598 :
599 :
600 : case FIELD_PROPERTY_TEXTLEN:
601 0 : if (pTextLen)
602 0 : pTextLen->SetText(rText);
603 0 : break;
604 :
605 : case FIELD_PROPERTY_NUMTYPE:
606 0 : if (pNumType)
607 0 : pNumType->SelectEntry(rText);
608 0 : break;
609 :
610 : case FIELD_PROPERTY_AUTOINC:
611 0 : if (pAutoIncrement)
612 : {
613 0 : String sOld = pAutoIncrement->GetSelectEntry();
614 0 : pAutoIncrement->SelectEntry(rText);
615 0 : if (!sOld.Equals(rText))
616 0 : LINK(this, OFieldDescControl, ChangeHdl).Call(pAutoIncrement);
617 : }
618 0 : break;
619 :
620 : case FIELD_PROPERTY_LENGTH:
621 0 : if (pLength)
622 0 : pLength->SetText(rText);
623 0 : break;
624 :
625 : case FIELD_PROPERTY_SCALE:
626 0 : if (pScale)
627 0 : pScale->SetText(rText);
628 0 : break;
629 :
630 : case FIELD_PROPERTY_FORMAT:
631 0 : if (pActFieldDescr)
632 0 : UpdateFormatSample(pActFieldDescr);
633 0 : break;
634 : case FIELD_PRPOERTY_COLUMNNAME:
635 0 : if(m_pColumnName)
636 0 : m_pColumnName->SetText(rText);
637 0 : break;
638 : case FIELD_PRPOERTY_TYPE:
639 0 : if(m_pType)
640 0 : m_pType->SelectEntry(rText);
641 0 : break;
642 : case FIELD_PRPOERTY_AUTOINCREMENT:
643 0 : if(m_pAutoIncrementValue)
644 0 : m_pAutoIncrementValue->SetText(rText);
645 0 : break;
646 : }
647 0 : }
648 :
649 : //------------------------------------------------------------------------
650 0 : IMPL_LINK( OFieldDescControl, FormatClickHdl, Button *, /*pButton*/ )
651 : {
652 : DBG_CHKTHIS(OFieldDescControl,NULL);
653 : //////////////////////////////////////////////////////////////////////
654 : // Create temporary Column, which is used for data exchange with Dialog
655 0 : if( !pActFieldDescr )
656 0 : return 0;
657 :
658 0 : sal_Int32 nOldFormatKey(pActFieldDescr->GetFormatKey());
659 0 : SvxCellHorJustify rOldJustify = pActFieldDescr->GetHorJustify();
660 0 : Reference< XNumberFormatsSupplier > xSupplier = GetFormatter()->getNumberFormatsSupplier();
661 0 : SvNumberFormatsSupplierObj* pSupplierImpl = SvNumberFormatsSupplierObj::getImplementation( xSupplier );
662 :
663 0 : SvNumberFormatter* pFormatter = pSupplierImpl->GetNumberFormatter();
664 : sal_uInt16 nFlags;
665 0 : if(::dbaui::callColumnFormatDialog(this,pFormatter,pActFieldDescr->GetType(),nOldFormatKey,rOldJustify,nFlags,sal_True))
666 : {
667 0 : sal_Bool bModified = sal_False;
668 0 : if(nOldFormatKey != pActFieldDescr->GetFormatKey())
669 : {
670 0 : pActFieldDescr->SetFormatKey( nOldFormatKey );
671 0 : bModified = sal_True;
672 : }
673 0 : if(rOldJustify != pActFieldDescr->GetHorJustify())
674 : {
675 0 : pActFieldDescr->SetHorJustify( rOldJustify );
676 0 : bModified = sal_True;
677 : }
678 :
679 0 : if(bModified)
680 : {
681 0 : SetModified(sal_True);
682 0 : UpdateFormatSample(pActFieldDescr);
683 : }
684 : }
685 0 : return 0;
686 : }
687 :
688 : // -----------------------------------------------------------------------
689 0 : void OFieldDescControl::SetModified(sal_Bool /*bModified*/)
690 : {
691 0 : }
692 : //------------------------------------------------------------------------
693 0 : IMPL_LINK( OFieldDescControl, ChangeHdl, ListBox *, pListBox )
694 : {
695 : DBG_CHKTHIS(OFieldDescControl,NULL);
696 0 : if ( !pActFieldDescr )
697 0 : return 0;
698 :
699 0 : if ( pListBox->GetSavedValue() != pListBox->GetSelectEntryPos() )
700 0 : SetModified(sal_True);
701 :
702 : // Special treatment for Boold fields
703 0 : if(pListBox == pRequired && pBoolDefault )
704 : {
705 : // If pRequired = sal_True then the sal_Bool field must NOT contain <<none>>
706 0 : String sDef = BoolStringUI(::comphelper::getString(pActFieldDescr->GetControlDefault()));
707 :
708 0 : if(pRequired->GetSelectEntryPos() == 0) // Yes
709 : {
710 0 : pBoolDefault->RemoveEntry(String(ModuleRes(STR_VALUE_NONE)));
711 0 : if (!sDef.Equals(aYes) && !sDef.Equals(aNo))
712 0 : pBoolDefault->SelectEntryPos(1); // No as a default
713 : else
714 0 : pBoolDefault->SelectEntry(sDef);
715 : }
716 0 : else if(pBoolDefault->GetEntryCount() < 3)
717 : {
718 0 : pBoolDefault->InsertEntry(String(ModuleRes(STR_VALUE_NONE)));
719 0 : pBoolDefault->SelectEntry(sDef);
720 0 : }
721 : }
722 :
723 : // A special treatment only for AutoIncrement
724 0 : if (pListBox == pAutoIncrement)
725 : {
726 0 : if(pListBox->GetSelectEntryPos() == 1)
727 : { // no
728 0 : DeactivateAggregate( tpAutoIncrementValue );
729 0 : if(pActFieldDescr->IsPrimaryKey())
730 0 : DeactivateAggregate( tpRequired );
731 0 : else if( pActFieldDescr->getTypeInfo()->bNullable )
732 : {
733 0 : ActivateAggregate( tpRequired );
734 0 : if(pRequired)
735 : {
736 0 : if( pActFieldDescr->IsNullable() )
737 0 : pRequired->SelectEntryPos( 1 ); // no
738 : else
739 0 : pRequired->SelectEntryPos( 0 ); // yes
740 : }
741 : }
742 0 : ActivateAggregate( tpDefault );
743 : }
744 : else
745 : {
746 0 : DeactivateAggregate( tpRequired );
747 0 : DeactivateAggregate( tpDefault );
748 0 : ActivateAggregate( tpAutoIncrementValue );
749 : }
750 : // Move all up
751 0 : ArrangeAggregates();
752 : }
753 :
754 0 : if(pListBox == m_pType)
755 : {
756 0 : TOTypeInfoSP pTypeInfo = getTypeInfo(m_pType->GetSelectEntryPos());
757 0 : pActFieldDescr->FillFromTypeInfo(pTypeInfo,sal_True,sal_False); // SetType(pTypeInfo);
758 :
759 0 : DisplayData(pActFieldDescr);
760 0 : CellModified(-1, m_pType->GetPos());
761 : }
762 :
763 0 : return 0;
764 : }
765 : //------------------------------------------------------------------------------
766 : // Rearrange all Controls, such that they are in fixed order and really on top
767 : // of the DescriptionPage
768 0 : void OFieldDescControl::ArrangeAggregates()
769 : {
770 : DBG_CHKTHIS(OFieldDescControl,NULL);
771 : // A Control's description
772 : struct AGGREGATE_DESCRIPTION
773 : {
774 : Control* pctrlInputControl; // The actual Control for input
775 : Control* pctrlTextControl; // The corresponding Label
776 : sal_uInt16 nPosSizeArgument; // The second argument for SetPosSize
777 : };
778 : AGGREGATE_DESCRIPTION adAggregates[] = {
779 : { m_pColumnName, m_pColumnNameText, 1},
780 : { m_pType, m_pTypeText, 1},
781 : { pAutoIncrement, pAutoIncrementText, 1 },
782 : { m_pAutoIncrementValue, m_pAutoIncrementValueText, 3 },
783 : { pNumType, pNumTypeText, 1 },
784 : { pRequired, pRequiredText, 1 },
785 : { pTextLen, pTextLenText, 1 },
786 : { pLength, pLengthText, 1 },
787 : { pScale, pScaleText, 1 },
788 : { pDefault, pDefaultText, 3 },
789 : { pFormatSample, pFormatText, 4 },
790 : { pBoolDefault, pBoolDefaultText, 1 },
791 0 : };
792 :
793 0 : long nMaxWidth = 0;
794 0 : for (size_t i=0; i<sizeof(adAggregates)/sizeof(adAggregates[0]); i++)
795 : {
796 0 : if (adAggregates[i].pctrlTextControl)
797 : {
798 0 : nMaxWidth = ::std::max<long>(OutputDevice::GetTextWidth(adAggregates[i].pctrlTextControl->GetText()),nMaxWidth);
799 : }
800 : }
801 :
802 : OSL_ENSURE(nMaxWidth != 0,"Invalid width!");
803 :
804 : // And go ...
805 0 : int nCurrentControlPos = 0;
806 0 : Control* pZOrderPredecessor = NULL;
807 0 : for (size_t i=0; i<sizeof(adAggregates)/sizeof(adAggregates[0]); i++)
808 : {
809 0 : if (adAggregates[i].pctrlInputControl)
810 : {
811 0 : SetPosSize(&adAggregates[i].pctrlTextControl, nCurrentControlPos, 0);
812 0 : SetPosSize(&adAggregates[i].pctrlInputControl, nCurrentControlPos, adAggregates[i].nPosSizeArgument);
813 :
814 : // Set the z-order in a way such that the Controls can be traversed in the same sequence in which they have been arranged here
815 0 : adAggregates[i].pctrlTextControl->SetZOrder(pZOrderPredecessor, pZOrderPredecessor ? WINDOW_ZORDER_BEHIND : WINDOW_ZORDER_FIRST);
816 0 : adAggregates[i].pctrlInputControl->SetZOrder(adAggregates[i].pctrlTextControl, WINDOW_ZORDER_BEHIND );
817 0 : pZOrderPredecessor = adAggregates[i].pctrlInputControl;
818 :
819 0 : if (adAggregates[i].pctrlInputControl == pFormatSample)
820 : {
821 0 : pFormat->SetZOrder(pZOrderPredecessor, WINDOW_ZORDER_BEHIND);
822 0 : pZOrderPredecessor = pFormat;
823 : }
824 :
825 0 : ++nCurrentControlPos;
826 : }
827 : }
828 :
829 : // Special treatment for the Format Controls
830 0 : if (pFormat)
831 : {
832 0 : Point ptSamplePos(pFormatSample->GetPosPixel());
833 0 : Size szSampleSize(pFormatSample->GetSizePixel());
834 0 : pFormat->SetPosPixel(Point(ptSamplePos.X() + szSampleSize.Width() + 5, ptSamplePos.Y()));
835 : }
836 :
837 : // Finally, put the ScrollBars at the top of the z-order
838 0 : m_pVertScroll->SetZOrder(NULL, WINDOW_ZORDER_FIRST);
839 0 : m_pHorzScroll->SetZOrder(NULL, WINDOW_ZORDER_FIRST);
840 0 : }
841 :
842 : //------------------------------------------------------------------------------
843 0 : void OFieldDescControl::ActivateAggregate( EControlType eType )
844 : {
845 : DBG_CHKTHIS(OFieldDescControl,NULL);
846 : //////////////////////////////////////////////////////////////////////
847 : // Create Controls
848 0 : switch( eType )
849 : {
850 : case tpDefault:
851 0 : if( pDefault )
852 0 : return;
853 0 : m_nPos++;
854 0 : pDefaultText = CreateText(STR_DEFAULT_VALUE);
855 0 : pDefault = new OPropEditCtrl( this, STR_HELP_DEFAULT_VALUE, FIELD_PROPERTY_DEFAULT, WB_BORDER );
856 0 : InitializeControl(pDefault,HID_TAB_ENT_DEFAULT,false);
857 0 : break;
858 : case tpAutoIncrementValue:
859 0 : if( m_pAutoIncrementValue || !isAutoIncrementValueEnabled() )
860 0 : return;
861 0 : m_nPos++;
862 0 : m_pAutoIncrementValueText = CreateText(STR_AUTOINCREMENT_VALUE);
863 0 : m_pAutoIncrementValue = new OPropEditCtrl( this, STR_HELP_AUTOINCREMENT_VALUE, FIELD_PRPOERTY_AUTOINCREMENT, WB_BORDER );
864 0 : m_pAutoIncrementValue->SetText( getAutoIncrementValue() );
865 0 : InitializeControl(m_pAutoIncrementValue,HID_TAB_AUTOINCREMENTVALUE,false);
866 0 : break;
867 :
868 : case tpRequired:
869 : {
870 0 : if( pRequired )
871 : return;
872 0 : Reference< XDatabaseMetaData> xMetaData = getMetaData();
873 :
874 0 : if(xMetaData.is() && xMetaData->supportsNonNullableColumns())
875 : {
876 0 : m_nPos++;
877 0 : pRequiredText = CreateText(STR_FIELD_REQUIRED);
878 0 : pRequired = new OPropListBoxCtrl( this, STR_HELP_FIELD_REQUIRED, FIELD_PROPERTY_REQUIRED, WB_DROPDOWN);
879 :
880 0 : pRequired->InsertEntry( aYes );
881 0 : pRequired->InsertEntry( aNo );
882 0 : pRequired->SelectEntryPos(1);
883 :
884 0 : InitializeControl(pRequired,HID_TAB_ENT_REQUIRED,true);
885 0 : }
886 : }
887 0 : break;
888 : case tpAutoIncrement:
889 : {
890 0 : if( pAutoIncrement )
891 0 : return;
892 0 : m_nPos++;
893 0 : pAutoIncrementText = CreateText(STR_FIELD_AUTOINCREMENT);
894 0 : pAutoIncrement = new OPropListBoxCtrl( this, STR_HELP_AUTOINCREMENT, FIELD_PROPERTY_AUTOINC, WB_DROPDOWN );
895 0 : pAutoIncrement->InsertEntry( aYes );
896 0 : pAutoIncrement->InsertEntry( aNo );
897 0 : pAutoIncrement->SelectEntryPos(0);
898 0 : InitializeControl(pAutoIncrement,HID_TAB_ENT_AUTOINCREMENT,true);
899 : }
900 0 : break;
901 : case tpTextLen:
902 0 : if( pTextLen )
903 0 : return;
904 0 : m_nPos++;
905 0 : pTextLenText = CreateText(STR_TEXT_LENGTH);
906 0 : pTextLen = CreateNumericControl(STR_HELP_TEXT_LENGTH, FIELD_PROPERTY_TEXTLEN,HID_TAB_ENT_TEXT_LEN);
907 0 : break;
908 :
909 : case tpType:
910 0 : if( m_pType)
911 0 : return;
912 0 : m_nPos++;
913 0 : m_pTypeText = CreateText(STR_TAB_FIELD_DATATYPE);
914 0 : m_pType = new OPropListBoxCtrl( this, STR_HELP_AUTOINCREMENT, FIELD_PRPOERTY_TYPE, WB_DROPDOWN );
915 0 : m_pType->SetDropDownLineCount(20);
916 : {
917 0 : const OTypeInfoMap* pTypeInfo = getTypeInfo();
918 0 : OTypeInfoMap::const_iterator aIter = pTypeInfo->begin();
919 0 : OTypeInfoMap::const_iterator aEnd = pTypeInfo->end();
920 0 : for(;aIter != aEnd;++aIter)
921 0 : m_pType->InsertEntry( aIter->second->aUIName );
922 : }
923 0 : m_pType->SelectEntryPos(0);
924 0 : InitializeControl(m_pType,HID_TAB_ENT_TYPE,true);
925 0 : break;
926 : case tpColumnName:
927 0 : if( m_pColumnName )
928 0 : return;
929 0 : m_nPos++;
930 : {
931 0 : sal_uInt32 nMax = EDIT_NOLIMIT;
932 0 : ::rtl::OUString aTmpString;
933 : try
934 : {
935 0 : Reference< XDatabaseMetaData> xMetaData = getMetaData();
936 0 : if ( xMetaData.is() )
937 : {
938 0 : nMax = xMetaData->getMaxColumnNameLength();
939 0 : aTmpString = xMetaData->getExtraNameCharacters();
940 0 : }
941 : }
942 0 : catch(Exception&)
943 : {
944 : DBG_UNHANDLED_EXCEPTION();
945 : }
946 0 : m_pColumnNameText = CreateText(STR_TAB_FIELD_NAME);
947 : m_pColumnName = new OPropColumnEditCtrl( this,
948 : aTmpString,
949 : STR_HELP_DEFAULT_VALUE,
950 : FIELD_PRPOERTY_COLUMNNAME,
951 0 : WB_BORDER );
952 0 : m_pColumnName->SetMaxTextLen(xub_StrLen( nMax ? nMax : EDIT_NOLIMIT));
953 0 : m_pColumnName->setCheck( isSQL92CheckEnabled(getConnection()) );
954 : }
955 :
956 0 : InitializeControl(m_pColumnName,HID_TAB_ENT_COLUMNNAME,false);
957 0 : break;
958 : case tpNumType:
959 0 : if( pNumType )
960 0 : return;
961 0 : m_nPos++;
962 0 : pNumTypeText = CreateText(STR_NUMERIC_TYPE);
963 :
964 0 : pNumType = new OPropListBoxCtrl( this, STR_HELP_NUMERIC_TYPE, FIELD_PROPERTY_NUMTYPE, WB_DROPDOWN );
965 0 : pNumType->SetDropDownLineCount(5);
966 :
967 0 : pNumType->InsertEntry( rtl::OUString("Byte") );
968 0 : pNumType->InsertEntry( rtl::OUString("SmallInt") );
969 0 : pNumType->InsertEntry( rtl::OUString("Integer") );
970 0 : pNumType->InsertEntry( rtl::OUString("Single") );
971 0 : pNumType->InsertEntry( rtl::OUString("Double") );
972 0 : pNumType->SelectEntryPos(2);
973 0 : InitializeControl(pNumType,HID_TAB_ENT_NUMTYP,true);
974 0 : break;
975 :
976 : case tpLength:
977 0 : if( pLength )
978 0 : return;
979 0 : m_nPos++;
980 0 : pLengthText = CreateText(STR_LENGTH);
981 0 : pLength = CreateNumericControl(STR_HELP_LENGTH, FIELD_PROPERTY_LENGTH,HID_TAB_ENT_LEN);
982 0 : break;
983 :
984 : case tpScale:
985 0 : if( pScale )
986 0 : return;
987 0 : m_nPos++;
988 0 : pScaleText = CreateText(STR_SCALE);
989 0 : pScale = CreateNumericControl(STR_HELP_SCALE, FIELD_PROPERTY_SCALE,HID_TAB_ENT_SCALE);
990 0 : break;
991 :
992 : case tpFormat:
993 0 : if (!pFormat)
994 : {
995 0 : m_nPos++;
996 0 : pFormatText = CreateText(STR_FORMAT);
997 :
998 0 : pFormatSample = new OPropEditCtrl( this, STR_HELP_FORMAT_CODE, -1, WB_BORDER );
999 0 : pFormatSample->SetReadOnly(sal_True);
1000 0 : pFormatSample->Enable(sal_False);
1001 0 : InitializeControl(pFormatSample,HID_TAB_ENT_FORMAT_SAMPLE,false);
1002 :
1003 0 : pFormat = new PushButton( this, ModuleRes(PB_FORMAT) );
1004 0 : const sal_Int32 nControlHeight = GetMaxControlHeight();
1005 0 : pFormat->SetSizePixel(Size(nControlHeight, nControlHeight));
1006 0 : pFormat->SetClickHdl( LINK( this, OFieldDescControl, FormatClickHdl ) );
1007 0 : InitializeControl(pFormat,HID_TAB_ENT_FORMAT,false);
1008 : }
1009 :
1010 0 : UpdateFormatSample(pActFieldDescr);
1011 0 : break;
1012 : case tpBoolDefault:
1013 0 : if (pBoolDefault)
1014 0 : return;
1015 :
1016 0 : m_nPos++;
1017 0 : pBoolDefaultText = CreateText(STR_DEFAULT_VALUE);
1018 0 : pBoolDefault = new OPropListBoxCtrl( this, STR_HELP_BOOL_DEFAULT, FIELD_PROPERTY_BOOL_DEFAULT, WB_DROPDOWN );
1019 0 : pBoolDefault->SetDropDownLineCount(3);
1020 0 : pBoolDefault->InsertEntry(String(ModuleRes(STR_VALUE_NONE)));
1021 0 : pBoolDefault->InsertEntry(aYes);
1022 0 : pBoolDefault->InsertEntry(aNo);
1023 :
1024 0 : InitializeControl(pBoolDefault,HID_TAB_ENT_BOOL_DEFAULT,false);
1025 0 : break;
1026 : }
1027 : }
1028 : // -----------------------------------------------------------------------------
1029 0 : void OFieldDescControl::InitializeControl(Control* _pControl,const ::rtl::OString& _sHelpId,bool _bAddChangeHandler)
1030 : {
1031 0 : _pControl->SetHelpId(_sHelpId);
1032 0 : if ( _bAddChangeHandler )
1033 0 : ((OPropListBoxCtrl*)_pControl)->SetSelectHdl(LINK(this,OFieldDescControl,ChangeHdl));
1034 :
1035 0 : _pControl->SetGetFocusHdl(LINK(this, OFieldDescControl, OnControlFocusGot));
1036 0 : _pControl->SetLoseFocusHdl(LINK(this, OFieldDescControl, OnControlFocusLost));
1037 0 : _pControl->EnableClipSiblings();
1038 0 : }
1039 : // -----------------------------------------------------------------------------
1040 0 : FixedText* OFieldDescControl::CreateText(sal_uInt16 _nTextRes)
1041 : {
1042 0 : FixedText* pFixedText = new FixedText( this );
1043 0 : pFixedText->SetText( ModuleRes(_nTextRes) );
1044 0 : pFixedText->EnableClipSiblings();
1045 0 : return pFixedText;
1046 : }
1047 : // -----------------------------------------------------------------------------
1048 0 : OPropNumericEditCtrl* OFieldDescControl::CreateNumericControl(sal_uInt16 _nHelpStr,short _nProperty,const rtl::OString& _sHelpId)
1049 : {
1050 0 : OPropNumericEditCtrl* pControl = new OPropNumericEditCtrl( this, _nHelpStr, _nProperty, WB_BORDER );
1051 0 : pControl->SetDecimalDigits(0);
1052 0 : pControl->SetMin(0);
1053 0 : pControl->SetMax(0x7FFFFFFF); // Should be changed outside, if needed
1054 0 : pControl->SetStrictFormat(sal_True);
1055 :
1056 0 : InitializeControl(pControl,_sHelpId,false);
1057 :
1058 0 : return pControl;
1059 : }
1060 : //------------------------------------------------------------------------------
1061 0 : void OFieldDescControl::DeactivateAggregate( EControlType eType )
1062 : {
1063 : DBG_CHKTHIS(OFieldDescControl,NULL);
1064 0 : pLastFocusWindow = NULL;
1065 : //////////////////////////////////////////////////////////////////////
1066 : // Destroy Controls
1067 0 : switch( eType )
1068 : {
1069 : case tpDefault:
1070 0 : lcl_HideAndDeleteControl(m_nPos,&pDefault,&pDefaultText);
1071 0 : break;
1072 :
1073 : case tpAutoIncrementValue:
1074 0 : lcl_HideAndDeleteControl(m_nPos,&m_pAutoIncrementValue,&m_pAutoIncrementValueText);
1075 0 : break;
1076 :
1077 : case tpColumnName:
1078 0 : lcl_HideAndDeleteControl(m_nPos,&m_pColumnName,&m_pColumnNameText);
1079 0 : break;
1080 :
1081 : case tpType:
1082 0 : lcl_HideAndDeleteControl(m_nPos,&m_pType,&m_pTypeText);
1083 0 : break;
1084 :
1085 : case tpAutoIncrement:
1086 0 : lcl_HideAndDeleteControl(m_nPos,&pAutoIncrement,&pAutoIncrementText);
1087 0 : break;
1088 :
1089 : case tpRequired:
1090 0 : lcl_HideAndDeleteControl(m_nPos,&pRequired,&pRequiredText);
1091 0 : break;
1092 :
1093 : case tpTextLen:
1094 0 : lcl_HideAndDeleteControl(m_nPos,&pTextLen,&pTextLenText);
1095 0 : break;
1096 :
1097 : case tpNumType:
1098 0 : lcl_HideAndDeleteControl(m_nPos,&pNumType,&pNumTypeText);
1099 0 : break;
1100 :
1101 : case tpLength:
1102 0 : lcl_HideAndDeleteControl(m_nPos,&pLength,&pLengthText);
1103 0 : break;
1104 :
1105 : case tpScale:
1106 0 : lcl_HideAndDeleteControl(m_nPos,&pScale,&pScaleText);
1107 0 : break;
1108 :
1109 : case tpFormat:
1110 : // TODO: we have to check if we have to increment m_nPos again
1111 0 : lcl_HideAndDeleteControl(m_nPos,&pFormat,&pFormatText);
1112 0 : if ( pFormatSample )
1113 : {
1114 0 : pFormatSample->Hide();
1115 0 : delete pFormatSample;
1116 0 : pFormatSample = NULL;
1117 : }
1118 0 : break;
1119 : case tpBoolDefault:
1120 0 : lcl_HideAndDeleteControl(m_nPos,&pBoolDefault,&pBoolDefaultText);
1121 0 : break;
1122 : }
1123 0 : }
1124 :
1125 : //------------------------------------------------------------------------------
1126 0 : void OFieldDescControl::SetPosSize( Control** ppControl, long nRow, sal_uInt16 nCol )
1127 : {
1128 : DBG_CHKTHIS(OFieldDescControl,NULL);
1129 :
1130 : //////////////////////////////////////////////////////////////////////
1131 : // Calculate size
1132 0 : const sal_Int32 nControlHeight = GetMaxControlHeight();
1133 0 : Size aSize(0,nControlHeight);
1134 0 : if ( isRightAligned() && nCol )
1135 0 : aSize.Width() = LogicToPixel(Size(m_nWidth, 0),MAP_APPFONT).Width();
1136 : else
1137 : {
1138 0 : switch( nCol )
1139 : {
1140 : case 0:
1141 : default:
1142 0 : aSize.Width() = CONTROL_WIDTH_1;
1143 0 : break;
1144 : case 1:
1145 0 : aSize.Width() = CONTROL_WIDTH_2;
1146 0 : break;
1147 : case 3:
1148 0 : aSize.Width() = CONTROL_WIDTH_3;
1149 0 : break;
1150 : case 4:
1151 0 : aSize.Width() = CONTROL_WIDTH_4;
1152 0 : break;
1153 : }
1154 : }
1155 :
1156 :
1157 : //////////////////////////////////////////////////////////////////////
1158 : // Calculate Position
1159 0 : Point aPosition;
1160 0 : switch( nCol )
1161 : {
1162 : case 0:
1163 0 : aPosition.X() = 0;
1164 0 : aPosition.Y() = 1;
1165 0 : break;
1166 : case 1:
1167 : case 3:
1168 : case 4:
1169 0 : if ( isRightAligned() )
1170 : {
1171 0 : Size aOwnSize = GetSizePixel();
1172 0 : aPosition.X() = aOwnSize.Width() - aSize.Width();
1173 : }
1174 : else
1175 0 : aPosition.X() = CONTROL_WIDTH_1 + CONTROL_SPACING_X;
1176 0 : break;
1177 : default:
1178 0 : aPosition.X() = 0;
1179 : }
1180 :
1181 0 : (*ppControl)->SetSizePixel( aSize );
1182 0 : aSize = (*ppControl)->GetSizePixel( );
1183 :
1184 0 : const sal_Int32 nControl_Spacing_y = LogicToPixel(Size(0, CONTROL_SPACING_Y),MAP_APPFONT).Height();
1185 0 : aPosition.Y() += ((nRow+1)*nControl_Spacing_y) +
1186 0 : (nRow*nControlHeight);
1187 :
1188 : //////////////////////////////////////////////////////////////////////
1189 : // Display Control
1190 0 : (*ppControl)->SetPosSizePixel( aPosition, aSize );
1191 0 : aSize = (*ppControl)->GetSizePixel();
1192 :
1193 0 : (*ppControl)->Show();
1194 0 : }
1195 : //------------------------------------------------------------------------------
1196 0 : void OFieldDescControl::DisplayData(OFieldDescription* pFieldDescr )
1197 : {
1198 : DBG_CHKTHIS(OFieldDescControl,NULL);
1199 0 : pActFieldDescr = pFieldDescr;
1200 0 : if(!pFieldDescr)
1201 : {
1202 0 : DeactivateAggregate( tpDefault );
1203 0 : DeactivateAggregate( tpRequired );
1204 0 : DeactivateAggregate( tpTextLen );
1205 0 : DeactivateAggregate( tpNumType );
1206 0 : DeactivateAggregate( tpScale );
1207 0 : DeactivateAggregate( tpLength );
1208 0 : DeactivateAggregate( tpFormat );
1209 0 : DeactivateAggregate( tpAutoIncrement );
1210 0 : DeactivateAggregate( tpBoolDefault );
1211 0 : DeactivateAggregate( tpColumnName );
1212 0 : DeactivateAggregate( tpType );
1213 0 : DeactivateAggregate( tpAutoIncrementValue );
1214 0 : m_pPreviousType = TOTypeInfoSP();
1215 : //////////////////////////////////////////////////////////////////////
1216 : // Reset the saved focus' pointer
1217 0 : pLastFocusWindow = NULL;
1218 0 : if ( m_bAdded )
1219 : {
1220 0 : ::dbaui::notifySystemWindow(this,this,::comphelper::mem_fun(&TaskPaneList::RemoveWindow));
1221 0 : m_bAdded = sal_False;
1222 : }
1223 0 : return;
1224 : }
1225 :
1226 0 : if ( !m_bAdded )
1227 : {
1228 0 : ::dbaui::notifySystemWindow(this,this,::comphelper::mem_fun(&TaskPaneList::AddWindow));
1229 0 : m_bAdded = sal_True;
1230 : }
1231 :
1232 0 : TOTypeInfoSP pFieldType;
1233 0 : if( pFieldDescr )
1234 0 : pFieldType = pFieldDescr->getTypeInfo();
1235 :
1236 0 : ActivateAggregate( tpColumnName );
1237 0 : ActivateAggregate( tpType );
1238 :
1239 : OSL_ENSURE(pFieldType.get(),"We need a type information here!");
1240 : //////////////////////////////////////////////////////////////////////
1241 : // If the type has changed, subsitute Controls
1242 0 : if( m_pPreviousType != pFieldType )
1243 : {
1244 : //////////////////////////////////////////////////////////////////////
1245 : // Reset the saved focus' pointer
1246 0 : pLastFocusWindow = NULL;
1247 :
1248 : //////////////////////////////////////////////////////////////////////
1249 : // Controls, which must NOT be displayed again
1250 0 : DeactivateAggregate( tpNumType );
1251 :
1252 : //////////////////////////////////////////////////////////////////////
1253 : // determine which controls we should show and which not
1254 :
1255 : // 1. the required control
1256 0 : if ( pFieldType->bNullable )
1257 0 : ActivateAggregate( tpRequired );
1258 : else
1259 0 : DeactivateAggregate( tpRequired );
1260 :
1261 : // 2. the autoincrement
1262 0 : if ( pFieldType->bAutoIncrement )
1263 : {
1264 0 : DeactivateAggregate( tpRequired );
1265 0 : DeactivateAggregate( tpDefault );
1266 0 : ActivateAggregate( tpAutoIncrement );
1267 0 : ActivateAggregate( tpAutoIncrementValue );
1268 : }
1269 : else
1270 : {
1271 0 : DeactivateAggregate( tpAutoIncrement );
1272 0 : DeactivateAggregate( tpAutoIncrementValue );
1273 0 : if(pFieldType->bNullable)
1274 0 : ActivateAggregate( tpRequired );
1275 : else
1276 0 : DeactivateAggregate( tpRequired );
1277 0 : ActivateAggregate( tpDefault );
1278 : }
1279 : // 3. the scale and precision
1280 0 : if (pFieldType->nPrecision)
1281 : {
1282 0 : ActivateAggregate( tpLength );
1283 0 : pLength->SetMax(::std::max<sal_Int32>(pFieldType->nPrecision,pFieldDescr->GetPrecision()));
1284 0 : pLength->SetSpecialReadOnly(pFieldType->aCreateParams.isEmpty());
1285 : }
1286 : else
1287 0 : DeactivateAggregate( tpLength );
1288 :
1289 0 : if (pFieldType->nMaximumScale)
1290 : {
1291 0 : ActivateAggregate( tpScale );
1292 0 : pScale->SetMax(::std::max<sal_Int32>(pFieldType->nMaximumScale,pFieldDescr->GetScale()));
1293 0 : pScale->SetMin(pFieldType->nMinimumScale);
1294 0 : static const ::rtl::OUString s_sPRECISION(RTL_CONSTASCII_USTRINGPARAM("PRECISION"));
1295 0 : pScale->SetSpecialReadOnly(pFieldType->aCreateParams.isEmpty() || pFieldType->aCreateParams == s_sPRECISION);
1296 : }
1297 : else
1298 0 : DeactivateAggregate( tpScale );
1299 :
1300 : // and now look for type specific things
1301 0 : switch( pFieldType->nType )
1302 : {
1303 : case DataType::CHAR:
1304 : case DataType::VARCHAR:
1305 : case DataType::LONGVARCHAR:
1306 0 : DeactivateAggregate( tpLength );
1307 0 : DeactivateAggregate( tpBoolDefault );
1308 :
1309 0 : ActivateAggregate( tpDefault );
1310 0 : ActivateAggregate( tpFormat );
1311 0 : if (pFieldType->nPrecision)
1312 : {
1313 0 : ActivateAggregate( tpTextLen );
1314 0 : pTextLen->SetMax(::std::max<sal_Int32>(pFieldType->nPrecision,pFieldDescr->GetPrecision()));
1315 0 : pTextLen->SetSpecialReadOnly(pFieldType->aCreateParams.isEmpty());
1316 : }
1317 : else
1318 0 : DeactivateAggregate( tpTextLen );
1319 0 : break;
1320 : case DataType::DATE:
1321 : case DataType::TIME:
1322 : case DataType::TIMESTAMP:
1323 0 : DeactivateAggregate( tpLength ); // we don't need a length for date types
1324 0 : DeactivateAggregate( tpTextLen );
1325 0 : DeactivateAggregate( tpBoolDefault );
1326 :
1327 0 : ActivateAggregate( tpDefault );
1328 0 : ActivateAggregate( tpFormat );
1329 0 : break;
1330 : case DataType::BIT:
1331 0 : if ( !pFieldType->aCreateParams.isEmpty() )
1332 : {
1333 0 : DeactivateAggregate( tpFormat );
1334 0 : DeactivateAggregate( tpTextLen );
1335 0 : DeactivateAggregate( tpBoolDefault );
1336 0 : break;
1337 : }
1338 : // run through
1339 : case DataType::BOOLEAN:
1340 0 : DeactivateAggregate( tpTextLen );
1341 0 : DeactivateAggregate( tpFormat );
1342 0 : DeactivateAggregate( tpDefault );
1343 :
1344 0 : ActivateAggregate( tpBoolDefault );
1345 0 : break;
1346 : case DataType::DECIMAL:
1347 : case DataType::NUMERIC:
1348 : case DataType::BIGINT:
1349 : case DataType::FLOAT:
1350 : case DataType::DOUBLE:
1351 : case DataType::TINYINT:
1352 : case DataType::SMALLINT:
1353 : case DataType::INTEGER:
1354 : case DataType::REAL:
1355 0 : DeactivateAggregate( tpTextLen );
1356 0 : DeactivateAggregate( tpBoolDefault );
1357 :
1358 0 : ActivateAggregate( tpFormat );
1359 0 : break;
1360 : case DataType::BINARY:
1361 : case DataType::VARBINARY:
1362 0 : DeactivateAggregate( tpDefault );
1363 0 : DeactivateAggregate( tpRequired );
1364 0 : DeactivateAggregate( tpTextLen );
1365 0 : DeactivateAggregate( tpBoolDefault );
1366 :
1367 0 : ActivateAggregate( tpFormat );
1368 0 : break;
1369 : case DataType::LONGVARBINARY:
1370 : case DataType::SQLNULL:
1371 : case DataType::OBJECT:
1372 : case DataType::DISTINCT:
1373 : case DataType::STRUCT:
1374 : case DataType::ARRAY:
1375 : case DataType::BLOB:
1376 : case DataType::CLOB:
1377 : case DataType::REF:
1378 : case DataType::OTHER:
1379 0 : DeactivateAggregate( tpFormat );
1380 0 : DeactivateAggregate( tpTextLen );
1381 0 : DeactivateAggregate( tpBoolDefault );
1382 :
1383 0 : break;
1384 : default:
1385 : OSL_FAIL("Unknown type");
1386 : }
1387 0 : m_pPreviousType = pFieldType;
1388 : }
1389 0 : if(pFieldDescr)
1390 : {
1391 0 : if(pFieldDescr->IsPrimaryKey())
1392 : {
1393 0 : DeactivateAggregate( tpRequired );
1394 : }
1395 0 : else if ( !pAutoIncrement && pFieldType.get() )
1396 : {
1397 0 : if ( pFieldType->bNullable )
1398 0 : ActivateAggregate( tpRequired );
1399 : else
1400 0 : DeactivateAggregate( tpRequired );
1401 : }
1402 : }
1403 : //////////////////////////////////////////////////////////////////////
1404 : // Initialize Controls
1405 0 : if( pAutoIncrement )
1406 : {
1407 0 : if ( pFieldDescr->IsAutoIncrement() )
1408 : {
1409 0 : pAutoIncrement->SelectEntryPos( 0 ); // yes
1410 0 : ActivateAggregate( tpAutoIncrementValue );
1411 0 : if ( m_pAutoIncrementValue )
1412 0 : m_pAutoIncrementValue->SetText(pFieldDescr->GetAutoIncrementValue());
1413 0 : DeactivateAggregate( tpRequired );
1414 0 : DeactivateAggregate( tpDefault );
1415 : }
1416 : else
1417 : {
1418 : // disable autoincrement value because it should only be visible when autoincrement is to true
1419 0 : DeactivateAggregate( tpAutoIncrementValue );
1420 0 : pAutoIncrement->SelectEntryPos( 1 ); // no
1421 0 : ActivateAggregate( tpDefault );
1422 : // Affects pRequired
1423 0 : if(!pFieldDescr->IsPrimaryKey())
1424 0 : ActivateAggregate( tpRequired );
1425 : }
1426 : }
1427 :
1428 0 : if( pDefault )
1429 : {
1430 0 : pDefault->SetText( getControlDefault(pFieldDescr) );
1431 0 : pDefault->ClearModifyFlag();
1432 : }
1433 :
1434 0 : if( pBoolDefault )
1435 : {
1436 : // If pRequired = sal_True then the sal_Bool field must NOT contain <<none>>
1437 0 : ::rtl::OUString sValue;
1438 0 : pFieldDescr->GetControlDefault() >>= sValue;
1439 0 : String sDef = BoolStringUI(sValue);
1440 :
1441 : // Make sure that <<none>> is only present if the field can be NULL
1442 0 : if ( ( pFieldType.get() && !pFieldType->bNullable ) || !pFieldDescr->IsNullable() )
1443 : {
1444 0 : pFieldDescr->SetIsNullable(ColumnValue::NO_NULLS); // The type says so
1445 :
1446 0 : pBoolDefault->RemoveEntry(String(ModuleRes(STR_VALUE_NONE)));
1447 0 : if ( !sDef.Equals(aYes) && !sDef.Equals(aNo) )
1448 0 : pBoolDefault->SelectEntryPos(1); // No as a default
1449 : else
1450 0 : pBoolDefault->SelectEntry(sDef);
1451 :
1452 0 : pFieldDescr->SetControlDefault(makeAny(::rtl::OUString(BoolStringPersistent(pBoolDefault->GetSelectEntry()))));
1453 : }
1454 0 : else if(pBoolDefault->GetEntryCount() < 3)
1455 : {
1456 0 : pBoolDefault->InsertEntry(String(ModuleRes(STR_VALUE_NONE)));
1457 0 : pBoolDefault->SelectEntry(sDef);
1458 : }
1459 : else
1460 0 : pBoolDefault->SelectEntry(sDef);
1461 : }
1462 :
1463 0 : if( pRequired )
1464 : {
1465 0 : if( pFieldDescr->IsNullable() )
1466 0 : pRequired->SelectEntryPos( 1 ); // no
1467 : else
1468 0 : pRequired->SelectEntryPos( 0 ); // yes
1469 : }
1470 :
1471 0 : if( pTextLen )
1472 : {
1473 0 : pTextLen->SetText( String::CreateFromInt32(pFieldDescr->GetPrecision()) );
1474 0 : pTextLen->ClearModifyFlag();
1475 : }
1476 :
1477 0 : if( pNumType )
1478 : {
1479 : OSL_FAIL("OFieldDescControl::DisplayData: invalid num type!");
1480 : }
1481 :
1482 0 : if( pLength )
1483 0 : pLength->SetText( String::CreateFromInt32(pFieldDescr->GetPrecision()) );
1484 :
1485 0 : if( pScale )
1486 0 : pScale->SetText( String::CreateFromInt32(pFieldDescr->GetScale()) );
1487 :
1488 0 : if( pFormat )
1489 0 : UpdateFormatSample(pFieldDescr);
1490 :
1491 0 : if(m_pColumnName)
1492 0 : m_pColumnName->SetText(pFieldDescr->GetName());
1493 :
1494 0 : if(m_pType)
1495 : {
1496 0 : sal_uInt16 nPos = pFieldType.get() ? m_pType->GetEntryPos(String(pFieldDescr->getTypeInfo()->aUIName)) : LISTBOX_ENTRY_NOTFOUND;
1497 0 : if(nPos == LISTBOX_ENTRY_NOTFOUND)
1498 : {
1499 0 : const OTypeInfoMap* pMap = getTypeInfo();
1500 0 : OTypeInfoMap::const_iterator aIter = pMap->find(pFieldType.get() ? pFieldDescr->getTypeInfo()->nType : pFieldDescr->GetType());
1501 0 : if(aIter == pMap->end() && !pMap->empty())
1502 : {
1503 0 : aIter = pMap->begin();
1504 0 : if(pFieldDescr->GetPrecision() > aIter->second->nPrecision)
1505 0 : pFieldDescr->SetPrecision(aIter->second->nPrecision);
1506 0 : if(pFieldDescr->GetScale() > aIter->second->nMaximumScale)
1507 0 : pFieldDescr->SetScale(0);
1508 0 : if(!aIter->second->bNullable && pFieldDescr->IsNullable())
1509 0 : pFieldDescr->SetIsNullable(ColumnValue::NO_NULLS);
1510 0 : if(!aIter->second->bAutoIncrement && pFieldDescr->IsAutoIncrement())
1511 0 : pFieldDescr->SetAutoIncrement(sal_False);
1512 : }
1513 0 : if ( aIter != pMap->end() )
1514 : {
1515 0 : pFieldDescr->SetType(aIter->second);
1516 : }
1517 : }
1518 0 : m_pType->SelectEntry(pFieldDescr->getTypeInfo()->aUIName);
1519 : }
1520 :
1521 :
1522 : //////////////////////////////////////////////////////////////////////
1523 : // Enable/disable Controls
1524 0 : sal_Bool bRead(IsReadOnly());
1525 :
1526 :
1527 0 : ArrangeAggregates();
1528 0 : CheckScrollBars();
1529 0 : ScrollAllAggregates();
1530 :
1531 0 : SetReadOnly( bRead );
1532 : }
1533 :
1534 : //------------------------------------------------------------------------------
1535 0 : IMPL_LINK(OFieldDescControl, OnControlFocusGot, Control*, pControl )
1536 : {
1537 0 : String strHelpText;
1538 0 : OPropNumericEditCtrl* pNumeric = dynamic_cast< OPropNumericEditCtrl* >( pControl );
1539 0 : if ( pNumeric )
1540 : {
1541 0 : pNumeric->SaveValue();
1542 0 : strHelpText = pNumeric->GetHelp();
1543 : }
1544 :
1545 0 : OPropColumnEditCtrl* pColumn = dynamic_cast< OPropColumnEditCtrl* >( pControl );
1546 0 : if ( pColumn )
1547 : {
1548 0 : pColumn->SaveValue();
1549 0 : strHelpText = pColumn->GetHelp();
1550 : }
1551 :
1552 0 : OPropEditCtrl* pEdit = dynamic_cast< OPropEditCtrl* >( pControl );
1553 0 : if ( pEdit )
1554 : {
1555 0 : pEdit->SaveValue();
1556 0 : strHelpText = pEdit->GetHelp();
1557 : }
1558 :
1559 0 : OPropListBoxCtrl* pListBox = dynamic_cast< OPropListBoxCtrl* >( pControl );
1560 0 : if ( pListBox )
1561 : {
1562 0 : pListBox->SaveValue();
1563 0 : strHelpText = pListBox->GetHelp();
1564 : }
1565 :
1566 0 : if (pControl == pFormat)
1567 0 : strHelpText =String(ModuleRes(STR_HELP_FORMAT_BUTTON));
1568 :
1569 0 : if (strHelpText.Len() && (pHelp != NULL))
1570 0 : pHelp->SetHelpText(strHelpText);
1571 :
1572 0 : m_pActFocusWindow = pControl;
1573 :
1574 0 : return 0L;
1575 : }
1576 :
1577 : //------------------------------------------------------------------------------
1578 0 : IMPL_LINK(OFieldDescControl, OnControlFocusLost, Control*, pControl )
1579 : {
1580 0 : if ((pControl == pLength) || (pControl == pTextLen) || (pControl == pScale))
1581 : {
1582 0 : OPropNumericEditCtrl* pConverted = (OPropNumericEditCtrl*)pControl;
1583 0 : if (pConverted->IsModified())
1584 0 : CellModified(-1, pConverted->GetPos());
1585 : }
1586 0 : if(pControl == m_pColumnName)
1587 : {
1588 0 : OPropColumnEditCtrl* pConverted = (OPropColumnEditCtrl*)pControl;
1589 0 : if (pConverted->IsModified())
1590 0 : CellModified(-1, pConverted->GetPos());
1591 : }
1592 0 : else if ((pControl == pDefault) || (pControl == pFormatSample) || (pControl == m_pAutoIncrementValue) )
1593 : {
1594 0 : OPropEditCtrl* pConverted = (OPropEditCtrl*)pControl;
1595 0 : if (pConverted->IsModified())
1596 0 : CellModified(-1, pConverted->GetPos());
1597 : }
1598 0 : else if ((pControl == pRequired) || (pControl == pNumType) || (pControl == pAutoIncrement) || (pControl == pBoolDefault) || (pControl == m_pType))
1599 : {
1600 0 : OPropListBoxCtrl* pConverted = (OPropListBoxCtrl*)pControl;
1601 0 : if (pConverted->IsModified())
1602 0 : CellModified(-1, pConverted->GetPos());
1603 : }
1604 :
1605 0 : if (pControl == pDefault)
1606 0 : UpdateFormatSample(pActFieldDescr);
1607 :
1608 0 : implFocusLost(pControl);
1609 :
1610 0 : return 0L;
1611 : }
1612 : //------------------------------------------------------------------------------
1613 0 : void OFieldDescControl::SaveData( OFieldDescription* pFieldDescr )
1614 : {
1615 : DBG_CHKTHIS(OFieldDescControl,NULL);
1616 0 : if( !pFieldDescr )
1617 0 : return;
1618 :
1619 : //////////////////////////////////////////////////////////////////////
1620 : // Read out Controls
1621 0 : ::rtl::OUString sDefault;
1622 0 : if (pDefault)
1623 : {
1624 0 : sDefault = pDefault->GetText();
1625 : }
1626 0 : else if (pBoolDefault)
1627 : {
1628 0 : sDefault = BoolStringPersistent(pBoolDefault->GetSelectEntry());
1629 : }
1630 :
1631 0 : if ( !sDefault.isEmpty() )
1632 0 : pFieldDescr->SetControlDefault(makeAny(sDefault));
1633 : else
1634 0 : pFieldDescr->SetControlDefault(Any());
1635 :
1636 0 : if((pRequired && pRequired->GetSelectEntryPos() == 0) || pFieldDescr->IsPrimaryKey() || (pBoolDefault && pBoolDefault->GetEntryCount() == 2)) // yes
1637 0 : pFieldDescr->SetIsNullable( ColumnValue::NO_NULLS );
1638 : else
1639 0 : pFieldDescr->SetIsNullable( ColumnValue::NULLABLE );
1640 :
1641 0 : if ( pAutoIncrement )
1642 0 : pFieldDescr->SetAutoIncrement( pAutoIncrement->GetSelectEntryPos() == 0 );
1643 :
1644 0 : if( pTextLen )
1645 0 : pFieldDescr->SetPrecision( static_cast<sal_Int32>(pTextLen->GetValue()) );
1646 0 : else if( pLength )
1647 0 : pFieldDescr->SetPrecision( static_cast<sal_Int32>(pLength->GetValue()) );
1648 0 : if( pScale )
1649 0 : pFieldDescr->SetScale( static_cast<sal_Int32>(pScale->GetValue()) );
1650 :
1651 0 : if(m_pColumnName)
1652 0 : pFieldDescr->SetName(m_pColumnName->GetText());
1653 :
1654 0 : if ( m_pAutoIncrementValue && isAutoIncrementValueEnabled() )
1655 0 : pFieldDescr->SetAutoIncrementValue(m_pAutoIncrementValue->GetText());
1656 : }
1657 :
1658 : //------------------------------------------------------------------------------
1659 0 : void OFieldDescControl::UpdateFormatSample(OFieldDescription* pFieldDescr)
1660 : {
1661 0 : if ( pFieldDescr && pFormatSample )
1662 0 : pFormatSample->SetText(getControlDefault(pFieldDescr,sal_False));
1663 0 : }
1664 :
1665 : //------------------------------------------------------------------------------
1666 0 : void OFieldDescControl::GetFocus()
1667 : {
1668 : DBG_CHKTHIS(OFieldDescControl,NULL);
1669 : //////////////////////////////////////////////////////////////////////
1670 : // Set the Focus to the Control that has been active last
1671 0 : TabPage::GetFocus();
1672 0 : if( pLastFocusWindow )
1673 : {
1674 0 : pLastFocusWindow->GrabFocus();
1675 0 : pLastFocusWindow = NULL;
1676 : }
1677 0 : }
1678 :
1679 : //------------------------------------------------------------------------------
1680 0 : void OFieldDescControl::implFocusLost(Window* _pWhich)
1681 : {
1682 : DBG_CHKTHIS(OFieldDescControl,NULL);
1683 : OSL_ENSURE(!_pWhich || IsChild(_pWhich), "OFieldDescControl::implFocusLost : invalid window !");
1684 :
1685 : //////////////////////////////////////////////////////////////////////
1686 : // Remember the active Control
1687 0 : if (!pLastFocusWindow)
1688 0 : pLastFocusWindow = _pWhich;
1689 :
1690 : //////////////////////////////////////////////////////////////////////
1691 : // Reset HelpText
1692 0 : if (pHelp && !pHelp->HasChildPathFocus())
1693 0 : pHelp->SetHelpText( String() );
1694 0 : }
1695 :
1696 : //------------------------------------------------------------------------------
1697 0 : void OFieldDescControl::LoseFocus()
1698 : {
1699 : DBG_CHKTHIS(OFieldDescControl,NULL);
1700 :
1701 0 : implFocusLost(NULL);
1702 :
1703 0 : TabPage::LoseFocus();
1704 0 : }
1705 : // -----------------------------------------------------------------------------
1706 0 : sal_Bool OFieldDescControl::isCopyAllowed()
1707 : {
1708 : sal_Bool bAllowed = (m_pActFocusWindow != NULL) &&
1709 : (m_pActFocusWindow == pDefault || m_pActFocusWindow == pFormatSample ||
1710 : m_pActFocusWindow == pTextLen || m_pActFocusWindow == pLength ||
1711 : m_pActFocusWindow == pScale || m_pActFocusWindow == m_pColumnName ||
1712 : m_pActFocusWindow == m_pAutoIncrementValue) &&
1713 0 : static_cast<Edit*>(m_pActFocusWindow)->GetSelected().Len() != 0;
1714 :
1715 0 : return bAllowed;
1716 : }
1717 : // -----------------------------------------------------------------------------
1718 0 : sal_Bool OFieldDescControl::isCutAllowed()
1719 : {
1720 : sal_Bool bAllowed = (m_pActFocusWindow != NULL) &&
1721 : (m_pActFocusWindow == pDefault || m_pActFocusWindow == pFormatSample ||
1722 : m_pActFocusWindow == pTextLen || m_pActFocusWindow == pLength ||
1723 : m_pActFocusWindow == pScale || m_pActFocusWindow == m_pColumnName ||
1724 : m_pActFocusWindow == m_pAutoIncrementValue) &&
1725 0 : static_cast<Edit*>(m_pActFocusWindow)->GetSelected().Len() != 0;
1726 0 : return bAllowed;
1727 : }
1728 : // -----------------------------------------------------------------------------
1729 0 : sal_Bool OFieldDescControl::isPasteAllowed()
1730 : {
1731 : sal_Bool bAllowed = (m_pActFocusWindow != NULL) &&
1732 : (m_pActFocusWindow == pDefault || m_pActFocusWindow == pFormatSample ||
1733 : m_pActFocusWindow == pTextLen || m_pActFocusWindow == pLength ||
1734 : m_pActFocusWindow == pScale || m_pActFocusWindow == m_pColumnName ||
1735 0 : m_pActFocusWindow == m_pAutoIncrementValue);
1736 0 : if ( bAllowed )
1737 : {
1738 0 : TransferableDataHelper aTransferData(TransferableDataHelper::CreateFromSystemClipboard(GetParent()));
1739 0 : bAllowed = aTransferData.HasFormat(SOT_FORMAT_STRING);
1740 : }
1741 0 : return bAllowed;
1742 : }
1743 : // -----------------------------------------------------------------------------
1744 0 : void OFieldDescControl::cut()
1745 : {
1746 0 : if(isCutAllowed())
1747 0 : static_cast<Edit*>(m_pActFocusWindow)->Cut();
1748 0 : }
1749 : // -----------------------------------------------------------------------------
1750 0 : void OFieldDescControl::copy()
1751 : {
1752 0 : if(isCopyAllowed()) // this only checks if the focus window is valid
1753 0 : static_cast<Edit*>(m_pActFocusWindow)->Copy();
1754 0 : }
1755 : // -----------------------------------------------------------------------------
1756 0 : void OFieldDescControl::paste()
1757 : {
1758 0 : if(m_pActFocusWindow) // this only checks if the focus window is valid
1759 0 : static_cast<Edit*>(m_pActFocusWindow)->Paste();
1760 0 : }
1761 : // -----------------------------------------------------------------------------
1762 0 : sal_Bool OFieldDescControl::isTextFormat(const OFieldDescription* _pFieldDescr,sal_uInt32& _nFormatKey) const
1763 : {
1764 0 : _nFormatKey = _pFieldDescr->GetFormatKey();
1765 0 : sal_Bool bTextFormat = sal_True;
1766 :
1767 : try
1768 : {
1769 0 : if (!_nFormatKey)
1770 : {
1771 0 : Reference< ::com::sun::star::util::XNumberFormatTypes> xNumberTypes(GetFormatter()->getNumberFormatsSupplier()->getNumberFormats(),UNO_QUERY);
1772 : OSL_ENSURE(xNumberTypes.is(),"XNumberFormatTypes is null!");
1773 :
1774 : _nFormatKey = ::dbtools::getDefaultNumberFormat( _pFieldDescr->GetType(),
1775 : _pFieldDescr->GetScale(),
1776 0 : _pFieldDescr->IsCurrency(),
1777 : xNumberTypes,
1778 0 : GetLocale());
1779 : }
1780 0 : sal_Int32 nNumberFormat = ::comphelper::getNumberFormatType(GetFormatter(),_nFormatKey);
1781 0 : bTextFormat = (nNumberFormat == ::com::sun::star::util::NumberFormat::TEXT);
1782 : }
1783 0 : catch(const Exception&)
1784 : {
1785 :
1786 : }
1787 :
1788 0 : return bTextFormat;
1789 : }
1790 : // -----------------------------------------------------------------------------
1791 0 : String OFieldDescControl::getControlDefault( const OFieldDescription* _pFieldDescr ,sal_Bool _bCheck) const
1792 : {
1793 0 : ::rtl::OUString sDefault;
1794 0 : sal_Bool bCheck = !_bCheck || _pFieldDescr->GetControlDefault().hasValue();
1795 0 : if ( bCheck )
1796 : {
1797 : sal_uInt32 nFormatKey;
1798 0 : sal_Bool bTextFormat = sal_False;
1799 0 : double nValue = 0.0;
1800 :
1801 : try
1802 : {
1803 0 : bTextFormat = isTextFormat(_pFieldDescr,nFormatKey);
1804 0 : if ( _pFieldDescr->GetControlDefault() >>= sDefault )
1805 : {
1806 0 : if ( !bTextFormat )
1807 : {
1808 0 : if ( !sDefault.isEmpty() )
1809 : {
1810 : try
1811 : {
1812 0 : nValue = GetFormatter()->convertStringToNumber(nFormatKey,sDefault);
1813 : }
1814 0 : catch(const Exception&)
1815 : {
1816 0 : return ::rtl::OUString(); // return empty string for format example
1817 : }
1818 : }
1819 : }
1820 : }
1821 : else
1822 0 : _pFieldDescr->GetControlDefault() >>= nValue;
1823 :
1824 :
1825 0 : Reference< ::com::sun::star::util::XNumberFormatter> xNumberFormatter = GetFormatter();
1826 0 : Reference<XPropertySet> xFormSet = xNumberFormatter->getNumberFormatsSupplier()->getNumberFormats()->getByKey(nFormatKey);
1827 : OSL_ENSURE(xFormSet.is(),"XPropertySet is null!");
1828 0 : ::rtl::OUString sFormat;
1829 0 : xFormSet->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FormatString"))) >>= sFormat;
1830 :
1831 0 : if ( !bTextFormat )
1832 : {
1833 0 : Locale aLocale;
1834 0 : ::comphelper::getNumberFormatProperty(xNumberFormatter,nFormatKey,::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Locale"))) >>= aLocale;
1835 :
1836 0 : sal_Int32 nNumberFormat = ::comphelper::getNumberFormatType(xNumberFormatter,nFormatKey);
1837 0 : if( (nNumberFormat & ::com::sun::star::util::NumberFormat::DATE) == ::com::sun::star::util::NumberFormat::DATE
1838 : || (nNumberFormat & ::com::sun::star::util::NumberFormat::DATETIME) == ::com::sun::star::util::NumberFormat::DATETIME )
1839 : {
1840 0 : nValue = DBTypeConversion::toNullDate(DBTypeConversion::getNULLDate(xNumberFormatter->getNumberFormatsSupplier()),nValue);
1841 : }
1842 :
1843 :
1844 :
1845 0 : Reference< ::com::sun::star::util::XNumberFormatPreviewer> xPreViewer(xNumberFormatter,UNO_QUERY);
1846 : OSL_ENSURE(xPreViewer.is(),"XNumberFormatPreviewer is null!");
1847 0 : sDefault = xPreViewer->convertNumberToPreviewString(sFormat,nValue,aLocale,sal_True);
1848 : }
1849 0 : else if ( !(_bCheck && sDefault.isEmpty()) )
1850 0 : sDefault = xNumberFormatter->formatString(nFormatKey, sDefault.isEmpty() ? sFormat : sDefault);
1851 : }
1852 0 : catch(const Exception&)
1853 : {
1854 :
1855 : }
1856 : }
1857 :
1858 0 : return sDefault;
1859 0 : }
1860 : // -----------------------------------------------------------------------------
1861 :
1862 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|