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 // ----------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 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 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 //------------------------------------------------------------------------------ 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 // ----------------------------------------------------------------------------- 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 292 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 //------------------------------------------------------------------------------ 305 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 //------------------------------------------------------------------------------ 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 { 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 437 void OFieldDescControl::Resize() 438 { 439 CheckScrollBars(); 440 ScrollAllAggregates(); 441 } 442 443 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 494 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 //------------------------------------------------------------------------------ 504 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 // ----------------------------------------------------------------------- 728 void OFieldDescControl::SetModified(sal_Bool /*bModified*/) 729 { 730 } 731 //------------------------------------------------------------------------ 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 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 //------------------------------------------------------------------------------ 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 // ----------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------ 1574 IMPL_LINK(OFieldDescControl, DelayedGrabFocus, Control**, ppControl) 1575 { 1576 nDelayedGrabFocusEvent = 0; 1577 if (*ppControl) 1578 (*ppControl)->GrabFocus(); 1579 1580 return 0L; 1581 } 1582 1583 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 1708 void OFieldDescControl::UpdateFormatSample(OFieldDescription* pFieldDescr) 1709 { 1710 if ( pFieldDescr && pFormatSample ) 1711 pFormatSample->SetText(getControlDefault(pFieldDescr,sal_False)); 1712 } 1713 1714 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 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 //------------------------------------------------------------------------------ 1746 void OFieldDescControl::LoseFocus() 1747 { 1748 DBG_CHKTHIS(OFieldDescControl,NULL); 1749 1750 implFocusLost(NULL); 1751 1752 TabPage::LoseFocus(); 1753 } 1754 // ----------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 1793 void OFieldDescControl::cut() 1794 { 1795 if(isCutAllowed()) 1796 static_cast<Edit*>(m_pActFocusWindow)->Cut(); 1797 } 1798 // ----------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 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 // ----------------------------------------------------------------------------- 1811 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 // ----------------------------------------------------------------------------- 1840 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