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_sw.hxx" 26 27 28 29 #include <string> // HACK: prevent conflict between STLPORT and Workshop headers 30 #include <svl/eitem.hxx> 31 #include <svx/htmlmode.hxx> 32 #include <sfx2/dispatch.hxx> 33 #include <sfx2/bindings.hxx> 34 #ifndef _SFX_IMAGEMGR_HXX 35 #include <sfx2/imagemgr.hxx> 36 #endif 37 #include <swmodule.hxx> 38 #ifndef _VIEW_HXX 39 #include <view.hxx> 40 #endif 41 #include <initui.hxx> 42 #include <viewopt.hxx> 43 #ifndef _DOCSH_HXX 44 #include <docsh.hxx> 45 #endif 46 #include <gloshdl.hxx> 47 #include <glosdoc.hxx> 48 #include <gloslst.hxx> 49 #include <workctrl.hxx> 50 #ifndef _WORKCTRL_HRC 51 #include <workctrl.hrc> 52 #endif 53 #ifndef _CMDID_H 54 #include <cmdid.h> 55 #endif 56 #ifndef _HELPID_H 57 #include <helpid.h> 58 #endif 59 #include <wrtsh.hxx> 60 #include <svl/imageitm.hxx> 61 #include <vcl/lstbox.hxx> 62 #include <rtl/ustring.hxx> 63 #include "swabstdlg.hxx" 64 #include <misc.hrc> 65 66 #include <vcl/svapp.hxx> 67 68 //JP 14.01.99: Size Abpruefung 69 #define NAVI_ENTRIES 20 70 #if NAVI_ENTRIES != NID_COUNT 71 #error SwScrollNaviPopup-CTOR static Array falsche Size. Wurden neue IDs zugefuegt ?? 72 #endif 73 74 using ::rtl::OUString; 75 using namespace ::com::sun::star; 76 using namespace ::com::sun::star::uno; 77 using namespace ::com::sun::star::beans; 78 using namespace ::com::sun::star::frame; 79 80 SFX_IMPL_TOOLBOX_CONTROL( SwTbxInsertCtrl, SfxImageItem); 81 SFX_IMPL_TOOLBOX_CONTROL( SwTbxAutoTextCtrl, SfxBoolItem ); 82 83 /********************************************************************** 84 85 **********************************************************************/ 86 SwTbxInsertCtrl::SwTbxInsertCtrl( 87 sal_uInt16 nSlotId, 88 sal_uInt16 nId, 89 ToolBox& rTbx ) : 90 SfxToolBoxControl( nSlotId, nId, rTbx ), 91 nLastSlotId(FN_INSERT_CTRL == nSlotId ? FN_INSERT_TABLE : SID_INSERT_DIAGRAM) 92 { 93 rTbx.SetItemBits( nId, TIB_DROPDOWN | rTbx.GetItemBits( nId ) ); 94 } 95 /********************************************************************** 96 97 **********************************************************************/ 98 SwTbxInsertCtrl::~SwTbxInsertCtrl() 99 { 100 } 101 102 void SAL_CALL SwTbxInsertCtrl::update() throw (uno::RuntimeException) 103 { 104 ToolBox& rTbx = GetToolBox(); 105 rtl::OUString aSlotURL( RTL_CONSTASCII_USTRINGPARAM( "slot:" )); 106 aSlotURL += rtl::OUString::valueOf( sal_Int32( nLastSlotId )); 107 Image aImage = GetImage( m_xFrame, 108 aSlotURL, 109 hasBigImages(), 110 rTbx.GetSettings().GetStyleSettings().GetHighContrastMode() ); 111 112 rTbx.SetItemImage(GetId(), aImage); 113 rTbx.Invalidate(); 114 115 SfxToolBoxControl::update(); 116 } 117 118 /********************************************************************** 119 120 **********************************************************************/ 121 122 123 void SwTbxInsertCtrl::StateChanged( sal_uInt16 /*nSID*/, 124 SfxItemState eState, 125 const SfxPoolItem* pState ) 126 { 127 sal_uInt16 nId = GetId(); 128 GetToolBox().EnableItem( nId, (GetItemState(pState) != SFX_ITEM_DISABLED) ); 129 130 if( eState == SFX_ITEM_AVAILABLE ) 131 { 132 const SfxImageItem* pItem = PTR_CAST( SfxImageItem, pState ); 133 if(pItem) 134 { 135 nLastSlotId = pItem->GetValue(); 136 if( nLastSlotId ) 137 nId = nLastSlotId; 138 139 rtl::OUString aSlotURL( RTL_CONSTASCII_USTRINGPARAM( "slot:" )); 140 aSlotURL += rtl::OUString::valueOf( sal_Int32( nId )); 141 ToolBox& rBox = GetToolBox(); 142 Image aImage = GetImage( m_xFrame, 143 aSlotURL, 144 hasBigImages(), 145 rBox.GetSettings().GetStyleSettings().GetHighContrastMode() ); 146 rBox.SetItemImage(GetId(), aImage); 147 rBox.SetItemImageMirrorMode( GetId(), sal_False ); 148 rBox.SetItemImageAngle( GetId(), pItem->GetRotation() ); 149 rBox.SetItemImageMirrorMode( GetId(), pItem->IsMirrored() ); 150 } 151 } 152 153 } 154 /********************************************************************** 155 156 **********************************************************************/ 157 158 159 SfxPopupWindow* SwTbxInsertCtrl::CreatePopupWindow() 160 { 161 if(GetSlotId() == FN_INSERT_CTRL) 162 { 163 OUString aToolBarResStr( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/insertbar" )); 164 createAndPositionSubToolBar( aToolBarResStr ); 165 } 166 else /* FN_INSERT_OBJ_CTRL */ 167 { 168 OUString aToolBarResStr( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/insertobjectbar" )); 169 createAndPositionSubToolBar( aToolBarResStr ); 170 } 171 return NULL; 172 } 173 174 /********************************************************************** 175 176 **********************************************************************/ 177 178 179 SfxPopupWindowType SwTbxInsertCtrl::GetPopupWindowType() const 180 { 181 return nLastSlotId ? SFX_POPUPWINDOW_ONTIMEOUT : SFX_POPUPWINDOW_ONCLICK; 182 } 183 184 185 /********************************************************************** 186 187 **********************************************************************/ 188 189 190 void SwTbxInsertCtrl::Select( sal_Bool /*bMod1*/ ) 191 { 192 if( nLastSlotId ) 193 { 194 SfxViewShell* pCurSh( SfxViewShell::Current() ); 195 SfxDispatcher* pDispatch( 0 ); 196 197 if ( pCurSh ) 198 { 199 SfxViewFrame* pViewFrame = pCurSh->GetViewFrame(); 200 if ( pViewFrame ) 201 pDispatch = pViewFrame->GetDispatcher(); 202 } 203 204 if ( pDispatch ) 205 pDispatch->Execute(nLastSlotId); 206 } 207 } 208 209 /********************************************************************** 210 211 **********************************************************************/ 212 213 214 SwTbxAutoTextCtrl::SwTbxAutoTextCtrl( 215 sal_uInt16 nSlotId, 216 sal_uInt16 nId, 217 ToolBox& rTbx ) : 218 SfxToolBoxControl( nSlotId, nId, rTbx ), 219 pPopup(0), 220 pView(0) 221 { 222 rTbx.SetItemBits( nId, TIB_DROPDOWN | rTbx.GetItemBits( nId ) ); 223 } 224 /********************************************************************** 225 226 **********************************************************************/ 227 228 229 SwTbxAutoTextCtrl::~SwTbxAutoTextCtrl() 230 { 231 DelPopup(); 232 } 233 234 /********************************************************************** 235 236 **********************************************************************/ 237 238 239 SfxPopupWindow* SwTbxAutoTextCtrl::CreatePopupWindow() 240 { 241 pView = ::GetActiveView(); 242 if(pView && !pView->GetDocShell()->IsReadOnly() && 243 !pView->GetWrtShell().HasReadonlySel() ) 244 { 245 ToolBox& rBox = GetToolBox(); 246 247 Rectangle aItemRect( rBox.GetItemRect( GetId() ) ); 248 Point aPt(rBox.OutputToScreenPixel(aItemRect.TopLeft())); 249 aPt.X() += aItemRect.GetWidth()/2; 250 aPt.Y() += aItemRect.GetHeight()/2; 251 if(pView) 252 { 253 Link aLnk = LINK(this, SwTbxAutoTextCtrl, PopupHdl); 254 255 if (GetSlotId() == FN_INSERT_FIELD_CTRL) 256 { 257 pPopup = new PopupMenu(SW_RES(RID_INSERT_FIELD_CTRL)); 258 pPopup->SetSelectHdl(aLnk); 259 260 if (::GetHtmlMode(pView->GetDocShell()) & HTMLMODE_ON) 261 { 262 pPopup->RemoveItem(pPopup->GetItemPos(FN_INSERT_FLD_PGCOUNT)); 263 pPopup->RemoveItem(pPopup->GetItemPos(FN_INSERT_FLD_TOPIC)); 264 } 265 } 266 else 267 { 268 pPopup = new PopupMenu; 269 SwGlossaryList* pGlossaryList = ::GetGlossaryList(); 270 sal_uInt16 nGroupCount = pGlossaryList->GetGroupCount(); 271 for(sal_uInt16 i = 1; i <= nGroupCount; i++) 272 { 273 // Gruppenname mit Pfad-Extension besorgen 274 String sTitle; 275 String sGroupName = pGlossaryList->GetGroupName(i - 1, sal_False, &sTitle); 276 sal_uInt16 nBlockCount = pGlossaryList->GetBlockCount(i -1); 277 if(nBlockCount) 278 { 279 sal_uInt16 nIndex = 100 * (i); 280 // aber ohne extension einfuegen 281 pPopup->InsertItem( i, sTitle);//sGroupName.GetToken(0, GLOS_DELIM)); 282 PopupMenu* pSub = new PopupMenu; 283 pSub->SetSelectHdl(aLnk); 284 pPopup->SetPopupMenu(i, pSub); 285 for(sal_uInt16 j = 0; j < nBlockCount; j++) 286 { 287 String sEntry; 288 String sLongName(pGlossaryList->GetBlockName(i - 1, j, sEntry)); 289 sEntry.AppendAscii(" - "); 290 sEntry += sLongName; 291 pSub->InsertItem(++nIndex, sEntry); 292 } 293 } 294 } 295 } 296 } 297 ToolBox* pToolBox = &GetToolBox(); 298 sal_uInt16 nId = GetId(); 299 pToolBox->SetItemDown( nId, sal_True ); 300 301 pPopup->Execute( pToolBox, pToolBox->GetItemRect( nId ), 302 (pToolBox->GetAlign() == WINDOWALIGN_TOP || pToolBox->GetAlign() == WINDOWALIGN_BOTTOM) ? 303 POPUPMENU_EXECUTE_DOWN : POPUPMENU_EXECUTE_RIGHT ); 304 305 pToolBox->SetItemDown( nId, sal_False ); 306 } 307 GetToolBox().EndSelection(); 308 DelPopup(); 309 return 0; 310 311 } 312 313 314 /********************************************************************** 315 316 **********************************************************************/ 317 318 319 SfxPopupWindowType SwTbxAutoTextCtrl::GetPopupWindowType() const 320 { 321 return SFX_POPUPWINDOW_ONTIMEOUT; 322 } 323 324 /********************************************************************** 325 326 **********************************************************************/ 327 328 329 void SwTbxAutoTextCtrl::StateChanged( sal_uInt16 nSID, 330 SfxItemState eState, 331 const SfxPoolItem* pState ) 332 { 333 GetToolBox().EnableItem( GetId(), (GetItemState(pState) != SFX_ITEM_DISABLED) ); 334 if(FN_INSERT_FIELD_CTRL == nSID && eState >= SFX_ITEM_DEFAULT) 335 { 336 GetToolBox().CheckItem( GetId(), ((SfxBoolItem*)pState)->GetValue() ); 337 } 338 } 339 340 /********************************************************************** 341 342 **********************************************************************/ 343 344 345 IMPL_LINK(SwTbxAutoTextCtrl, PopupHdl, PopupMenu*, pMenu) 346 { 347 sal_uInt16 nId = pMenu->GetCurItemId(); 348 349 if ( GetSlotId() == FN_INSERT_FIELD_CTRL) 350 { 351 Sequence< PropertyValue > aArgs; 352 const char* pChar = 0; 353 switch(nId) 354 { 355 case FN_INSERT_FLD_DATE: 356 pChar = ".uno:InsertDateField"; 357 break; 358 case FN_INSERT_FLD_TIME: 359 pChar = ".uno:InsertTimeField"; 360 break; 361 case FN_INSERT_FLD_PGNUMBER: 362 pChar = ".uno:InsertPageNumberField"; 363 break; 364 case FN_INSERT_FLD_PGCOUNT: 365 pChar = ".uno:InsertPageCountField"; 366 break; 367 case FN_INSERT_FLD_TOPIC: 368 pChar = ".uno:InsertTopicField"; 369 break; 370 case FN_INSERT_FLD_TITLE: 371 pChar = ".uno:InsertTitleField"; 372 break; 373 case FN_INSERT_FLD_AUTHOR: 374 pChar = ".uno:InsertAuthorField"; 375 break; 376 default: 377 pChar = ".uno:InsertFieldCtrl"; 378 } 379 Dispatch( rtl::OUString::createFromAscii( pChar ),aArgs ); 380 } 381 else 382 { 383 sal_uInt16 nBlock = nId / 100; 384 385 SwGlossaryList* pGlossaryList = ::GetGlossaryList(); 386 String sShortName; 387 String sGroup = pGlossaryList->GetGroupName(nBlock - 1, sal_False); 388 String sLongName(pGlossaryList->GetBlockName(nBlock - 1, nId - (100 * nBlock) - 1, sShortName)); 389 390 SwGlossaryHdl* pGlosHdl = pView->GetGlosHdl(); 391 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); 392 DBG_ASSERT(pFact, "Dialogdiet fail!"); 393 ::GlossarySetActGroup fnSetActGroup = pFact->SetGlossaryActGroupFunc( DLG_RENAME_GLOS ); 394 if ( fnSetActGroup ) 395 (*fnSetActGroup)( sGroup ); 396 pGlosHdl->SetCurGroup(sGroup, sal_True); 397 pGlosHdl->InsertGlossary(sShortName); 398 } 399 return 0; 400 } 401 402 /********************************************************************** 403 404 **********************************************************************/ 405 406 407 void SwTbxAutoTextCtrl::DelPopup() 408 { 409 if(pPopup) 410 { 411 if (GetSlotId() != FN_INSERT_FIELD_CTRL) 412 { 413 for( sal_uInt16 i = 0; i < pPopup->GetItemCount(); i ++ ) 414 { 415 PopupMenu* pSubPopup = pPopup->GetPopupMenu(pPopup->GetItemId(i)); 416 delete pSubPopup; 417 } 418 } 419 delete pPopup; 420 pPopup = 0; 421 } 422 } 423 424 /*-----------------19.02.97 10.52------------------- 425 Navigations-Popup 426 --------------------------------------------------*/ 427 // determine the order of the toolbox items 428 static sal_uInt16 __READONLY_DATA aNavigationInsertIds[ NAVI_ENTRIES ] = 429 { 430 // -- first line 431 NID_TBL, 432 NID_FRM, 433 NID_GRF, 434 NID_OLE, 435 NID_PGE, 436 NID_OUTL, 437 NID_MARK, 438 NID_DRW, 439 NID_CTRL, 440 NID_PREV, 441 // -- second line 442 NID_REG, 443 NID_BKM, 444 NID_SEL, 445 NID_FTN, 446 NID_POSTIT, 447 NID_SRCH_REP, 448 NID_INDEX_ENTRY, 449 NID_TABLE_FORMULA, 450 NID_TABLE_FORMULA_ERROR, 451 NID_NEXT 452 }; 453 static const char* __READONLY_DATA aNavigationHelpIds[ NAVI_ENTRIES ] = 454 { 455 // -- first line 456 HID_NID_TBL, 457 HID_NID_FRM, 458 HID_NID_GRF, 459 HID_NID_OLE, 460 HID_NID_PGE, 461 HID_NID_OUTL, 462 HID_NID_MARK, 463 HID_NID_DRW, 464 HID_NID_CTRL, 465 HID_NID_PREV, 466 // -- second line 467 HID_NID_REG, 468 HID_NID_BKM, 469 HID_NID_SEL, 470 HID_NID_FTN, 471 HID_NID_POSTIT, 472 HID_NID_SRCH_REP, 473 HID_NID_INDEX_ENTRY, 474 HID_NID_TABLE_FORMULA, 475 HID_NID_TABLE_FORMULA_ERROR, 476 HID_NID_NEXT 477 }; 478 479 SwScrollNaviPopup::SwScrollNaviPopup( sal_uInt16 nId, const Reference< XFrame >& rFrame ) 480 : SfxPopupWindow(nId, rFrame, SW_RES(RID_SCROLL_NAVIGATION_WIN) ), 481 aToolBox(this, 0), 482 aSeparator(this, SW_RES(FL_SEP)), 483 aInfoField(this, SW_RES(FI_INFO)), 484 aIList(SW_RES(IL_VALUES)), 485 aIListH(SW_RES(ILH_VALUES)), 486 nFwdId(FN_START_OF_NEXT_PAGE), 487 nBackId(FN_START_OF_PREV_PAGE) 488 { 489 sal_uInt16 i; 490 491 aToolBox.SetHelpId(HID_NAVI_VS); 492 aToolBox.SetLineCount( 2 ); 493 aToolBox.SetOutStyle(TOOLBOX_STYLE_FLAT); 494 for( i = 0; i < NID_COUNT; i++) 495 { 496 sal_uInt16 nNaviId = aNavigationInsertIds[i]; 497 String sText; 498 ToolBoxItemBits nTbxBits = 0; 499 if((NID_PREV != nNaviId) && (NID_NEXT != nNaviId)) 500 { 501 // -2, there's no string for Next/Prev 502 sal_uInt16 nResStr = ST_TBL - 2 + nNaviId - NID_START; 503 sText = String(SW_RES(nResStr)); 504 nTbxBits = TIB_CHECKABLE; 505 } 506 else 507 { 508 if (nNaviId == NID_PREV) 509 sText = String(SW_RES(STR_IMGBTN_PGE_UP)); 510 else if (nNaviId == NID_NEXT) 511 sText = String(SW_RES(STR_IMGBTN_PGE_DOWN)); 512 } 513 aToolBox.InsertItem(nNaviId, sText, nTbxBits); 514 aToolBox.SetHelpId( nNaviId, aNavigationHelpIds[i] ); 515 } 516 ApplyImageList(); 517 aToolBox.InsertBreak(NID_COUNT/2); 518 // don't call it before! 519 FreeResource(); 520 521 // these are global strings 522 for( i = 0; i < 2 * NID_COUNT; i++) 523 { 524 sQuickHelp[i] = String(SW_RES(STR_IMGBTN_START + i)); 525 } 526 527 Size aImgSize = aIList.GetImageSize(); 528 aImgSize.Width() += 5; 529 aImgSize.Height() += 5; 530 Size aSz = aToolBox.CalcWindowSizePixel(2); 531 aToolBox.SetPosSizePixel( Point(), aSz ); 532 sal_uInt16 nItemId = SwView::GetMoveType(); 533 aInfoField.SetText(aToolBox.GetItemText(nItemId)); 534 aToolBox.CheckItem( nItemId, sal_True ); 535 Size aFTSize(aInfoField.GetSizePixel()); 536 Size aSepSize(aSeparator.GetSizePixel()); 537 aSepSize.Width() = aSz.Width(); 538 539 aSz.Height() += aFTSize.Height() + aSepSize.Height(); 540 aInfoField.SetPosSizePixel( 541 Point(0, aSz.Height() - aFTSize.Height()), Size(aSz.Width(), aFTSize.Height())); 542 543 aSeparator.SetSizePixel(aSepSize); 544 aSeparator.SetPosPixel(Point(0, aSz.Height() - aFTSize.Height() - aSepSize.Height())); 545 546 SetOutputSizePixel(aSz); 547 aToolBox.SetSelectHdl(LINK(this, SwScrollNaviPopup, SelectHdl)); 548 aToolBox.StartSelection(); 549 aToolBox.Show(); 550 } 551 /*-----------------19.02.97 12.45------------------- 552 553 --------------------------------------------------*/ 554 555 SwScrollNaviPopup::~SwScrollNaviPopup() 556 { 557 } 558 /* -----------------------------08.05.2002 14:00------------------------------ 559 560 ---------------------------------------------------------------------------*/ 561 void SwScrollNaviPopup::DataChanged( const DataChangedEvent& rDCEvt ) 562 { 563 if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && 564 (rDCEvt.GetFlags() & SETTINGS_STYLE) ) 565 ApplyImageList(); 566 567 Window::DataChanged( rDCEvt ); 568 } 569 /* -----------------------------08.05.2002 14:02------------------------------ 570 571 ---------------------------------------------------------------------------*/ 572 void SwScrollNaviPopup::ApplyImageList() 573 { 574 ImageList& rImgLst = aToolBox.GetSettings().GetStyleSettings().GetHighContrastMode() ? 575 aIListH : aIList; 576 for(sal_uInt16 i = 0; i < NID_COUNT; i++) 577 { 578 sal_uInt16 nNaviId = aNavigationInsertIds[i]; 579 aToolBox.SetItemImage(nNaviId, rImgLst.GetImage(nNaviId)); 580 } 581 } 582 /*-----------------19.02.97 13.58------------------- 583 584 --------------------------------------------------*/ 585 586 SfxPopupWindow* SwScrollNaviPopup::Clone() const 587 { 588 return new SwScrollNaviPopup( GetId(), GetFrame() ); 589 } 590 591 /*-----------------19.02.97 14.10------------------- 592 593 --------------------------------------------------*/ 594 595 IMPL_LINK(SwScrollNaviPopup, SelectHdl, ToolBox*, pSet) 596 { 597 sal_uInt16 nSet = pSet->GetCurItemId(); 598 if( nSet != NID_PREV && nSet != NID_NEXT ) 599 { 600 SwView::SetMoveType(nSet); 601 aToolBox.SetItemText(NID_NEXT, sQuickHelp[nSet - NID_START]); 602 aToolBox.SetItemText(NID_PREV, sQuickHelp[nSet - NID_START + NID_COUNT]); 603 aInfoField.SetText(aToolBox.GetItemText(nSet)); 604 //check the current button only 605 for(sal_uInt16 i = 0; i < NID_COUNT; i++) 606 { 607 sal_uInt16 nItemId = aToolBox.GetItemId( i ); 608 aToolBox.CheckItem( nItemId, nItemId == nSet ); 609 } 610 } 611 else 612 { 613 SfxBoolItem aNext(FN_SCROLL_NEXT_PREV, NID_NEXT == nSet); 614 Any a; 615 Sequence< PropertyValue > aArgs( 1 ); 616 aArgs[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ScrollNextPrev" )); 617 aNext.QueryValue( a ); 618 aArgs[0].Value = a; 619 SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( GetFrame()->getController(), UNO_QUERY ), 620 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ScrollNextPrev" )), 621 aArgs ); 622 } 623 return 0; 624 } 625 /*-----------------23.02.97 18.21------------------- 626 627 --------------------------------------------------*/ 628 629 void SwScrollNaviToolBox::MouseButtonUp( const MouseEvent& rMEvt ) 630 { 631 ToolBox::MouseButtonUp(rMEvt); 632 if ( ((SwScrollNaviPopup*)GetParent())->IsInPopupMode() ) 633 ((SwScrollNaviPopup*)GetParent())->EndPopupMode( FLOATWIN_POPUPMODEEND_CLOSEALL ); 634 } 635 636 /*-----------------20.06.97 13:28------------------- 637 638 --------------------------------------------------*/ 639 void SwScrollNaviToolBox::RequestHelp( const HelpEvent& rHEvt ) 640 { 641 SetItemText(NID_NEXT, SwScrollNaviPopup::GetQuickHelpText(sal_True)); 642 SetItemText(NID_PREV, SwScrollNaviPopup::GetQuickHelpText(sal_False)); 643 ToolBox::RequestHelp( rHEvt ); 644 645 } 646 647 /*-----------------20.06.97 13:41------------------- 648 649 --------------------------------------------------*/ 650 String SwScrollNaviPopup::GetQuickHelpText(sal_Bool bNext) 651 { 652 sal_uInt16 nResId = STR_IMGBTN_START; 653 nResId += SwView::GetMoveType() - NID_START; 654 if(!bNext) 655 nResId += NID_COUNT; 656 return String(SW_RES(nResId)); 657 } 658 /* -----------------------------05.09.2002 13:53------------------------------ 659 660 ---------------------------------------------------------------------------*/ 661 void SwNaviImageButton::Click() 662 { 663 // SfxBindings& rBind = SfxViewFrame::Current()->GetBindings(); 664 // rBind.ENTERREGISTRATIONS(); 665 pPopup = new 666 SwScrollNaviPopup( FN_SCROLL_NAVIGATION, 667 m_xFrame ); 668 // rBind.LEAVEREGISTRATIONS(); 669 Point aPos = OutputToScreenPixel(Point(0,0)); 670 Rectangle aRect(aPos, GetSizePixel()); 671 SetPopupWindow( pPopup ); 672 pPopup->StartPopupMode(aRect, FLOATWIN_POPUPMODE_LEFT|FLOATWIN_POPUPMODE_ALLOWTEAROFF); 673 } 674 675 //-------------------------------------------------------------------- 676 677 void SwNaviImageButton::SetPopupWindow( SfxPopupWindow* pWindow ) 678 { 679 pPopupWindow = pWindow; 680 pPopupWindow->SetPopupModeEndHdl( LINK( this, SwNaviImageButton, PopupModeEndHdl )); 681 pPopupWindow->SetDeleteLink_Impl( LINK( this, SwNaviImageButton, ClosePopupWindow )); 682 } 683 684 //-------------------------------------------------------------------- 685 686 IMPL_LINK( SwNaviImageButton, PopupModeEndHdl, void *, EMPTYARG ) 687 { 688 if ( pPopupWindow->IsVisible() ) 689 { 690 // Replace floating window with popup window and destroy 691 // floating window instance. 692 delete pFloatingWindow; 693 pFloatingWindow = pPopupWindow; 694 pPopupWindow = 0; 695 } 696 else 697 { 698 // Popup window has been closed by the user. No replacement, instance 699 // will destroy itself. 700 pPopupWindow = 0; 701 } 702 703 return 1; 704 } 705 706 //-------------------------------------------------------------------- 707 IMPL_LINK( SwNaviImageButton, ClosePopupWindow, SfxPopupWindow *, pWindow ) 708 { 709 if ( pWindow == pFloatingWindow ) 710 pFloatingWindow = 0; 711 else 712 pPopupWindow = 0; 713 714 return 1; 715 } 716 717 /*-----------------21.02.97 09:41------------------- 718 719 --------------------------------------------------*/ 720 721 void SwHlpImageButton::RequestHelp( const HelpEvent& rHEvt ) 722 { 723 724 SetQuickHelpText(SwScrollNaviPopup::GetQuickHelpText(!bUp)); 725 726 ImageButton::RequestHelp(rHEvt); 727 } 728 729 /*-----------------25.02.97 12:38------------------- 730 731 --------------------------------------------------*/ 732 733 SwNaviImageButton::SwNaviImageButton( 734 Window* pParent, 735 const Reference< XFrame >& rFrame ) : 736 ImageButton(pParent, SW_RES(BTN_NAVI)), 737 pPopup(0), 738 aImage(SW_RES(IMG_BTN)), 739 aImageH(SW_RES(IMG_BTN_H)), 740 sQuickText(SW_RES(ST_QUICK)), 741 pPopupWindow(0), 742 pFloatingWindow(0), 743 m_xFrame( rFrame ) 744 { 745 FreeResource(); 746 SetStyle(GetStyle()|WB_NOPOINTERFOCUS); 747 SetQuickHelpText(sQuickText); 748 SetModeImage( GetSettings().GetStyleSettings().GetHighContrastMode() ? aImageH : aImage); 749 } 750 /* -----------------------------2002/07/05 9:41------------------------------- 751 752 ---------------------------------------------------------------------------*/ 753 void SwNaviImageButton::DataChanged( const DataChangedEvent& rDCEvt ) 754 { 755 if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && 756 (rDCEvt.GetFlags() & SETTINGS_STYLE) ) 757 SetModeImage( GetSettings().GetStyleSettings().GetHighContrastMode() ? aImageH : aImage); 758 759 Window::DataChanged( rDCEvt ); 760 } 761 /* -----------------26.11.2002 09:28----------------- 762 * 763 * --------------------------------------------------*/ 764 class SwZoomBox_Impl : public ComboBox 765 { 766 sal_uInt16 nSlotId; 767 sal_Bool bRelease; 768 uno::Reference< frame::XDispatchProvider > m_xDispatchProvider; 769 770 public: 771 SwZoomBox_Impl( 772 Window* pParent, 773 sal_uInt16 nSlot, 774 const Reference< XDispatchProvider >& rDispatchProvider ); 775 ~SwZoomBox_Impl(); 776 777 protected: 778 virtual void Select(); 779 virtual long Notify( NotifyEvent& rNEvt ); 780 781 void ReleaseFocus(); 782 783 }; 784 /* -----------------26.11.2002 09:29----------------- 785 * 786 * --------------------------------------------------*/ 787 SwZoomBox_Impl::SwZoomBox_Impl( 788 Window* pParent, 789 sal_uInt16 nSlot, 790 const Reference< XDispatchProvider >& rDispatchProvider ): 791 ComboBox( pParent, SW_RES(RID_PVIEW_ZOOM_LB)), 792 nSlotId(nSlot), 793 bRelease(sal_True), 794 m_xDispatchProvider( rDispatchProvider ) 795 { 796 EnableAutocomplete( sal_False ); 797 sal_uInt16 aZoomValues[] = 798 { 25, 50, 75, 100, 150, 200 }; 799 for(sal_uInt16 i = 0; i < sizeof(aZoomValues)/sizeof(sal_uInt16); i++) 800 { 801 String sEntry = String::CreateFromInt32(aZoomValues[i]); 802 sEntry += '%'; 803 InsertEntry(sEntry); 804 } 805 } 806 /* -----------------26.11.2002 09:29----------------- 807 * 808 * --------------------------------------------------*/ 809 SwZoomBox_Impl::~SwZoomBox_Impl() 810 {} 811 /* -----------------26.11.2002 09:34----------------- 812 * 813 * --------------------------------------------------*/ 814 void SwZoomBox_Impl::Select() 815 { 816 if ( !IsTravelSelect() ) 817 { 818 String sEntry(GetText()); 819 sEntry.EraseAllChars( '%' ); 820 sal_uInt16 nZoom = (sal_uInt16)sEntry.ToInt32(); 821 if(nZoom < MINZOOM) 822 nZoom = MINZOOM; 823 if(nZoom > MAXZOOM) 824 nZoom = MAXZOOM; 825 826 SfxUInt16Item aItem( nSlotId, nZoom ); 827 if ( FN_PREVIEW_ZOOM == nSlotId ) 828 { 829 Any a; 830 Sequence< PropertyValue > aArgs( 1 ); 831 aArgs[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "PreviewZoom" )); 832 aItem.QueryValue( a ); 833 aArgs[0].Value = a; 834 SfxToolBoxControl::Dispatch( 835 m_xDispatchProvider, 836 rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:PreviewZoom" )), 837 aArgs ); 838 } 839 840 ReleaseFocus(); 841 } 842 } 843 /* -----------------02.12.2002 07:49----------------- 844 * 845 * --------------------------------------------------*/ 846 long SwZoomBox_Impl::Notify( NotifyEvent& rNEvt ) 847 { 848 long nHandled = 0; 849 850 if ( rNEvt.GetType() == EVENT_KEYINPUT ) 851 { 852 sal_uInt16 nCode = rNEvt.GetKeyEvent()->GetKeyCode().GetCode(); 853 854 switch ( nCode ) 855 { 856 case KEY_RETURN: 857 case KEY_TAB: 858 { 859 if ( KEY_TAB == nCode ) 860 bRelease = sal_False; 861 else 862 nHandled = 1; 863 Select(); 864 break; 865 } 866 867 case KEY_ESCAPE: 868 SetText( GetSavedValue() ); 869 ReleaseFocus(); 870 break; 871 } 872 } 873 else if ( EVENT_LOSEFOCUS == rNEvt.GetType() ) 874 { 875 Window* pFocusWin = Application::GetFocusWindow(); 876 if ( !HasFocus() && GetSubEdit() != pFocusWin ) 877 SetText( GetSavedValue() ); 878 } 879 880 return nHandled ? nHandled : ComboBox::Notify( rNEvt ); 881 } 882 /* -----------------02.12.2002 07:51----------------- 883 * 884 * --------------------------------------------------*/ 885 void SwZoomBox_Impl::ReleaseFocus() 886 { 887 if ( !bRelease ) 888 { 889 bRelease = sal_True; 890 return; 891 } 892 SfxViewShell* pCurSh = SfxViewShell::Current(); 893 894 if ( pCurSh ) 895 { 896 Window* pShellWnd = pCurSh->GetWindow(); 897 898 if ( pShellWnd ) 899 pShellWnd->GrabFocus(); 900 } 901 } 902 903 /* -----------------26.11.2002 09:29----------------- 904 * 905 * --------------------------------------------------*/ 906 SFX_IMPL_TOOLBOX_CONTROL( SwPreviewZoomControl, SfxUInt16Item); 907 908 SwPreviewZoomControl::SwPreviewZoomControl( 909 sal_uInt16 nSlotId, 910 sal_uInt16 nId, 911 ToolBox& rTbx) : 912 SfxToolBoxControl( nSlotId, nId, rTbx ) 913 { 914 } 915 /* -----------------26.11.2002 09:29----------------- 916 * 917 * --------------------------------------------------*/ 918 SwPreviewZoomControl::~SwPreviewZoomControl() 919 { 920 } 921 /* -----------------26.11.2002 09:29----------------- 922 * 923 * --------------------------------------------------*/ 924 void SwPreviewZoomControl::StateChanged( sal_uInt16 /*nSID*/, 925 SfxItemState eState, 926 const SfxPoolItem* pState ) 927 { 928 sal_uInt16 nId = GetId(); 929 GetToolBox().EnableItem( nId, (GetItemState(pState) != SFX_ITEM_DISABLED) ); 930 SwZoomBox_Impl* pBox = (SwZoomBox_Impl*)GetToolBox().GetItemWindow( GetId() ); 931 if(SFX_ITEM_AVAILABLE <= eState) 932 { 933 String sZoom(String::CreateFromInt32(((const SfxUInt16Item*)pState)->GetValue())); 934 sZoom += '%'; 935 pBox->SetText(sZoom); 936 pBox->SaveValue(); 937 } 938 } 939 /* -----------------26.11.2002 09:29----------------- 940 * 941 * --------------------------------------------------*/ 942 Window* SwPreviewZoomControl::CreateItemWindow( Window *pParent ) 943 { 944 SwZoomBox_Impl* pRet = new SwZoomBox_Impl( pParent, GetSlotId(), Reference< XDispatchProvider >( m_xFrame->getController(), UNO_QUERY )); 945 return pRet; 946 } 947