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