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