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 // MARKER(update_precomp.py): autogen include statement, do not remove 23 #include "precompiled_sw.hxx" 24 25 #include <hintids.hxx> 26 #include <com/sun/star/linguistic2/XThesaurus.hpp> 27 #include <com/sun/star/uno/Sequence.hxx> 28 #include <svl/aeitem.hxx> 29 #include <svl/whiter.hxx> 30 #include <svl/cjkoptions.hxx> 31 #include <sfx2/viewfrm.hxx> 32 #include <sfx2/objitem.hxx> 33 #include <svl/imageitm.hxx> 34 #include <svl/languageoptions.hxx> 35 #include <editeng/protitem.hxx> 36 #include <sfx2/linkmgr.hxx> 37 #include <editeng/langitem.hxx> 38 #include <editeng/brshitem.hxx> 39 #include <svx/htmlmode.hxx> 40 #include <editeng/unolingu.hxx> 41 #include <sfx2/msgpool.hxx> 42 #include <swmodule.hxx> 43 #include <tox.hxx> 44 #include <sfx2/dispatch.hxx> 45 #include <sfx2/app.hxx> 46 #include <view.hxx> 47 #include <wrtsh.hxx> 48 #include <basesh.hxx> 49 #include <uitool.hxx> 50 #include <viewopt.hxx> 51 #include <tablemgr.hxx> 52 #include <pagedesc.hxx> 53 #include <wview.hxx> 54 #include <globdoc.hxx> 55 #include <svl/stritem.hxx> 56 #include <unotools/moduleoptions.hxx> 57 #include <svl/visitem.hxx> 58 #include <cmdid.h> 59 #include <IDocumentRedlineAccess.hxx> 60 61 //UUUU 62 #include <doc.hxx> 63 64 using namespace ::com::sun::star; 65 66 /*-------------------------------------------------------------------- 67 Beschreibung: 68 --------------------------------------------------------------------*/ 69 70 void SwView::GetState(SfxItemSet &rSet) 71 { 72 SfxWhichIter aIter(rSet); 73 sal_uInt16 nWhich = aIter.FirstWhich(); 74 sal_uInt16 eFrmType = FRMTYPE_NONE; 75 int bGetFrmType = sal_False; 76 sal_Bool bWeb = 0 != PTR_CAST(SwWebView, this); 77 78 while(nWhich) 79 { 80 switch(nWhich) 81 { 82 case FN_EDIT_LINK_DLG: 83 if( !pWrtShell->GetLinkManager().GetLinks().Count() ) 84 rSet.DisableItem(nWhich); 85 else if( pWrtShell->IsSelFrmMode() && 86 pWrtShell->IsSelObjProtected(FLYPROTECT_CONTENT)) 87 rSet.DisableItem(nWhich); 88 break; 89 90 case SID_INSERT_GRAPHIC: 91 if( pWrtShell->CrsrInsideInputFld() ) 92 { 93 rSet.DisableItem(nWhich); 94 } 95 break; 96 97 case FN_INSERT_CAPTION: 98 { 99 // Captions gibt's fuer Grafiken, OLE-Objekte, Rahmen und Tabellen 100 if( !bGetFrmType ) 101 eFrmType = pWrtShell->GetFrmType(0,sal_True), bGetFrmType = sal_True; 102 if (! ( ((eFrmType & FRMTYPE_FLY_ANY) && nSelectionType != nsSelectionType::SEL_DRW_TXT)|| 103 nSelectionType & nsSelectionType::SEL_TBL || 104 nSelectionType & nsSelectionType::SEL_DRW) ) 105 rSet.DisableItem(nWhich); 106 else if((pWrtShell->IsObjSelected()||pWrtShell->IsFrmSelected()) && 107 (pWrtShell->IsSelObjProtected( FLYPROTECT_PARENT)|| 108 pWrtShell->IsSelObjProtected( FLYPROTECT_CONTENT ))) 109 rSet.DisableItem(nWhich); 110 else if( pWrtShell->IsTableMode() 111 || pWrtShell->CrsrInsideInputFld() ) 112 rSet.DisableItem(nWhich); 113 } 114 break; 115 116 case FN_EDIT_FOOTNOTE: 117 { 118 if( !pWrtShell->GetCurFtn() ) 119 rSet.DisableItem(nWhich); 120 } 121 break; 122 123 case FN_CHANGE_PAGENUM: 124 { 125 sal_uInt16 nType = pWrtShell->GetFrmType(0,sal_True); 126 if( ( FRMTYPE_FLY_ANY | FRMTYPE_HEADER | FRMTYPE_FOOTER | 127 FRMTYPE_FOOTNOTE | FRMTYPE_DRAWOBJ ) & nType ) 128 rSet.DisableItem(nWhich); 129 else 130 rSet.Put(SfxUInt16Item(nWhich, pWrtShell->GetPageOffset())); 131 } 132 break; 133 case SID_PRINTDOC: 134 case SID_PRINTDOCDIRECT: 135 GetSlotState( nWhich, SfxViewShell::GetInterface(), &rSet ); 136 break; 137 case SID_ATTR_PAGE: 138 case SID_ATTR_PAGE_SIZE: 139 case SID_ATTR_PAGE_PAPERBIN: 140 case RES_PAPER_BIN: 141 case FN_PARAM_FTN_INFO: 142 { 143 const sal_uInt16 nCurIdx = pWrtShell->GetCurPageDesc(); 144 const SwPageDesc& rDesc = pWrtShell->GetPageDesc( nCurIdx ); 145 146 //UUUU set correct parent to get the XFILL_NONE FillStyle as needed 147 if(!rSet.GetParent()) 148 { 149 const SwFrmFmt& rMaster = rDesc.GetMaster(); 150 151 rSet.SetParent(&rMaster.GetDoc()->GetDfltFrmFmt()->GetAttrSet()); 152 } 153 154 ::PageDescToItemSet( rDesc, rSet); 155 } 156 break; 157 case RES_BACKGROUND: 158 case SID_ATTR_BRUSH: 159 { 160 const sal_uInt16 nCurIdx = pWrtShell->GetCurPageDesc(); 161 const SwPageDesc& rDesc = pWrtShell->GetPageDesc( nCurIdx ); 162 const SwFrmFmt& rMaster = rDesc.GetMaster(); 163 const SvxBrushItem& rBrush = (const SvxBrushItem&) 164 rMaster.GetFmtAttr(RES_BACKGROUND, sal_True); 165 rSet.Put(rBrush); 166 } 167 break; 168 case SID_CLEARHISTORY: 169 { 170 rSet.Put(SfxBoolItem(nWhich, pWrtShell->GetLastUndoInfo(0, 0))); 171 } 172 break; 173 case SID_UNDO: 174 { 175 //JP 21.07.98: Bug 53429 - die muss noch nicht vorhanden sein 176 // also lasse sie mal anlegen: 177 if( !pShell ) 178 SelectShell(); 179 180 const SfxPoolItem* pState = pShell->GetSlotState(SID_UNDO); 181 if(pState) 182 rSet.Put(*pState); 183 else 184 rSet.DisableItem(nWhich); 185 } 186 break; 187 case FN_INSERT_CTRL: 188 { 189 SfxImageItem aImgItem(nWhich, bWeb ? SwView::nWebInsertCtrlState : SwView::nInsertCtrlState); 190 SfxSlotPool& rPool = SfxSlotPool::GetSlotPool( GetViewFrame() ); 191 const SfxSlot* pSlot = rPool.GetSlot( aImgItem.GetValue() ); 192 if(pSlot && pSlot->IsMode( SFX_SLOT_IMAGEROTATION )) 193 { 194 if(pWrtShell->IsInVerticalText()) 195 aImgItem.SetRotation(2700); 196 if(pWrtShell->IsInRightToLeftText()) 197 aImgItem.SetMirrored(sal_True); 198 } 199 rSet.Put(aImgItem); 200 } 201 break; 202 203 case FN_INSERT_OBJ_CTRL: 204 if( bWeb 205 || pWrtShell->CrsrInsideInputFld() ) 206 { 207 rSet.DisableItem(nWhich); 208 } 209 else 210 { 211 SfxImageItem aImgItem(nWhich, SwView::nInsertObjectCtrlState); 212 SfxSlotPool& rPool = SfxSlotPool::GetSlotPool( GetViewFrame() ); 213 const SfxSlot* pSlot = rPool.GetSlot( aImgItem.GetValue() ); 214 if(pSlot && pSlot->IsMode( SFX_SLOT_IMAGEROTATION )) 215 { 216 if(pWrtShell->IsInVerticalText()) 217 aImgItem.SetRotation(2700); 218 if(pWrtShell->IsInRightToLeftText()) 219 aImgItem.SetMirrored(sal_True); 220 } 221 rSet.Put(aImgItem); 222 } 223 break; 224 225 case FN_UPDATE_TOX: 226 if(!pWrtShell->GetTOXCount()) 227 rSet.DisableItem(nWhich); 228 break; 229 case FN_EDIT_CURRENT_TOX: 230 case FN_UPDATE_CUR_TOX: 231 { 232 const SwTOXBase* pBase = 0; 233 if(0 == (pBase = pWrtShell->GetCurTOX()) || 234 (FN_EDIT_CURRENT_TOX == nWhich && pBase->IsTOXBaseInReadonly())) 235 rSet.DisableItem(nWhich); 236 } 237 break; 238 case SID_TWAIN_SELECT: 239 case SID_TWAIN_TRANSFER: 240 #if defined WNT || defined UNX 241 { 242 if(!SW_MOD()->GetScannerManager().is()) 243 rSet.DisableItem(nWhich); 244 } 245 #endif 246 break; 247 case RES_PARATR_TABSTOP: 248 case SID_ATTR_DEFTABSTOP: 249 { 250 const SvxTabStopItem& rDefTabs = 251 (const SvxTabStopItem&)pWrtShell-> 252 GetDefault(RES_PARATR_TABSTOP); 253 rSet.Put( SfxUInt16Item( nWhich, 254 (sal_uInt16)::GetTabDist(rDefTabs))); 255 } 256 break; 257 case SID_ATTR_LANGUAGE: 258 { 259 rSet.Put((const SvxLanguageItem&) 260 pWrtShell->GetDefault(RES_CHRATR_LANGUAGE), SID_ATTR_LANGUAGE); 261 } 262 break; 263 case RES_CHRATR_CJK_LANGUAGE: 264 rSet.Put((const SvxLanguageItem&) 265 pWrtShell->GetDefault(RES_CHRATR_CJK_LANGUAGE), RES_CHRATR_CJK_LANGUAGE); 266 break; 267 case RES_CHRATR_CTL_LANGUAGE: 268 rSet.Put((const SvxLanguageItem&) 269 pWrtShell->GetDefault(RES_CHRATR_CTL_LANGUAGE), RES_CHRATR_CTL_LANGUAGE); 270 break; 271 case FN_HYPHENATE_OPT_DLG: 272 { 273 sal_Bool bCheck = sal_False; 274 275 if (pWrtShell->GetSelectionType() & (nsSelectionType::SEL_DRW_TXT|nsSelectionType::SEL_DRW)) 276 bCheck = IsDrawTextHyphenate(); 277 rSet.Put(SfxBoolItem(nWhich, bCheck)); 278 } 279 break; 280 case FN_REDLINE_ON: 281 rSet.Put( SfxBoolItem( nWhich, GetDocShell()->IsChangeRecording() ) ); 282 break; 283 case FN_REDLINE_PROTECT : 284 rSet.Put( SfxBoolItem( nWhich, GetDocShell()->HasChangeRecordProtection() ) ); 285 break; 286 case FN_REDLINE_SHOW: 287 { 288 sal_uInt16 nMask = nsRedlineMode_t::REDLINE_SHOW_INSERT | nsRedlineMode_t::REDLINE_SHOW_DELETE; 289 rSet.Put( SfxBoolItem( nWhich, 290 (pWrtShell->GetRedlineMode() & nMask) == nMask )); 291 } 292 break; 293 case SID_GALLERY : 294 case SID_AVMEDIA_PLAYER : 295 case FN_REDLINE_ACCEPT : 296 { 297 SfxViewFrame* pVFrame = GetViewFrame(); 298 if (pVFrame->KnowsChildWindow(nWhich)) 299 rSet.Put(SfxBoolItem( nWhich, pVFrame->HasChildWindow(nWhich))); 300 else 301 rSet.DisableItem(nWhich); 302 } 303 break; 304 case FN_REDLINE_ACCEPT_DIRECT: 305 case FN_REDLINE_REJECT_DIRECT: 306 { 307 SwContentAtPos aCntntAtPos( SwContentAtPos::SW_REDLINE ); 308 Point aCrsrPos = pWrtShell->GetCrsrDocPos( sal_True ); 309 if( !pWrtShell->GetContentAtPos( aCrsrPos, aCntntAtPos ) ) 310 rSet.DisableItem( nWhich ); 311 } 312 break; 313 case SID_THESAURUS: 314 { 315 SwWrtShell &rSh = GetWrtShell(); 316 if (2 <= rSh.GetCrsrCnt()) // multi selection? 317 rSet.DisableItem(nWhich); 318 else 319 { 320 LanguageType nLang = rSh.GetCurLang(); 321 322 // disable "Thesaurus" (menu entry and key shortcut) if the 323 // language is not supported (by default it is enabled) 324 uno::Reference< linguistic2::XThesaurus > xThes( ::GetThesaurus() ); 325 if (!xThes.is() || nLang == LANGUAGE_NONE || 326 !xThes->hasLocale( SvxCreateLocale( nLang ) )) 327 rSet.DisableItem(nWhich); 328 } 329 } 330 break; 331 case SID_HANGUL_HANJA_CONVERSION: 332 case SID_CHINESE_CONVERSION: 333 { 334 if (!SvtCJKOptions().IsAnyEnabled()) 335 { 336 GetViewFrame()->GetBindings().SetVisibleState( nWhich, sal_False ); 337 rSet.DisableItem(nWhich); 338 } 339 else 340 GetViewFrame()->GetBindings().SetVisibleState( nWhich, sal_True ); 341 } 342 break; 343 case SID_MAIL_SCROLLBODY_PAGEDOWN: 344 { 345 const long nBottom = pWrtShell->GetDocSize().Height() + DOCUMENTBORDER; 346 const long nAct = GetVisArea().Bottom(); 347 rSet.Put(SfxBoolItem(SID_MAIL_SCROLLBODY_PAGEDOWN, nAct < nBottom )); 348 } 349 break; 350 351 case SID_DOCUMENT_COMPARE: 352 case SID_DOCUMENT_MERGE: 353 if( GetDocShell()->IsA( SwGlobalDocShell::StaticType() ) || 354 // pWrtShell->IsAnySectionInDoc( sal_True, sal_True, sal_True )|| 355 (SID_DOCUMENT_MERGE == nWhich && pWrtShell->getIDocumentRedlineAccess()->GetRedlinePassword().getLength())) 356 rSet.DisableItem(nWhich); 357 break; 358 case SID_VIEW_DATA_SOURCE_BROWSER: 359 if ( !SvtModuleOptions().IsModuleInstalled( SvtModuleOptions::E_SDATABASE ) ) 360 rSet.Put( SfxVisibilityItem( nWhich, sal_False ) ); 361 else 362 rSet.Put( SfxBoolItem( nWhich, GetViewFrame()->HasChildWindow( SID_BROWSER ) ) ); 363 break; 364 case SID_READONLY_MODE: 365 rSet.Put(SfxBoolItem(nWhich, 366 pWrtShell->HasReadonlySel()||GetDocShell()->IsReadOnly())); 367 break; 368 case SID_IMAGE_ORIENTATION: 369 { 370 SfxImageItem aImageItem(nWhich); 371 if(pWrtShell->IsInVerticalText()) 372 aImageItem.SetRotation( 2700 ); 373 if(pWrtShell->IsInRightToLeftText()) 374 aImageItem.SetMirrored( sal_True ); 375 rSet.Put(aImageItem); 376 } 377 break; 378 case FN_INSERT_FIELD_DATA_ONLY : 379 if(!bInMailMerge && !GetViewFrame()->HasChildWindow(nWhich)) 380 rSet.DisableItem(nWhich); 381 break; 382 case FN_MAILMERGE_SENDMAIL_CHILDWINDOW: 383 break; 384 case FN_MAILMERGE_CHILDWINDOW: 385 { 386 if(!GetMailMergeConfigItem()) 387 rSet.DisableItem(nWhich); 388 } 389 break; 390 case SID_ALIGN_ANY_LEFT : 391 case SID_ALIGN_ANY_HCENTER : 392 case SID_ALIGN_ANY_RIGHT : 393 case SID_ALIGN_ANY_JUSTIFIED: 394 case SID_ALIGN_ANY_TOP : 395 case SID_ALIGN_ANY_VCENTER : 396 case SID_ALIGN_ANY_BOTTOM : 397 case SID_ALIGN_ANY_HDEFAULT : 398 case SID_ALIGN_ANY_VDEFAULT : 399 { 400 if( !pShell ) 401 SelectShell(); 402 sal_uInt16 nAlias = 0; 403 bool bDraw = false; 404 if( nSelectionType & (nsSelectionType::SEL_DRW_TXT|nsSelectionType::SEL_TXT) ) 405 { 406 switch( nWhich ) 407 { 408 case SID_ALIGN_ANY_LEFT : nAlias = SID_ATTR_PARA_ADJUST_LEFT; break; 409 case SID_ALIGN_ANY_HCENTER : nAlias = SID_ATTR_PARA_ADJUST_CENTER; break; 410 case SID_ALIGN_ANY_RIGHT : nAlias = SID_ATTR_PARA_ADJUST_RIGHT; break; 411 case SID_ALIGN_ANY_JUSTIFIED: nAlias = SID_ATTR_PARA_ADJUST_BLOCK; break; 412 case SID_ALIGN_ANY_TOP : nAlias = SID_TABLE_VERT_NONE; break; 413 case SID_ALIGN_ANY_VCENTER : nAlias = SID_TABLE_VERT_CENTER; break; 414 case SID_ALIGN_ANY_BOTTOM : nAlias = SID_TABLE_VERT_BOTTOM; break; 415 } 416 } 417 else if(nSelectionType & (nsSelectionType::SEL_DRW)) 418 { 419 //the draw shell cannot provide a status per item - only one for SID_OBJECT_ALIGN 420 if(nWhich != SID_ALIGN_ANY_JUSTIFIED) 421 { 422 const SfxPoolItem* pItem = 0; 423 GetViewFrame()->GetDispatcher()->QueryState( SID_OBJECT_ALIGN, pItem ); 424 if(pItem) 425 bDraw = true; 426 } 427 } 428 else 429 { 430 switch( nWhich ) 431 { 432 case SID_ALIGN_ANY_LEFT : nAlias = SID_OBJECT_ALIGN_LEFT ; break; 433 case SID_ALIGN_ANY_HCENTER : nAlias = SID_OBJECT_ALIGN_CENTER ; break; 434 case SID_ALIGN_ANY_RIGHT : nAlias = SID_OBJECT_ALIGN_RIGHT ; break; 435 case SID_ALIGN_ANY_TOP : nAlias = SID_OBJECT_ALIGN_UP ; break; 436 case SID_ALIGN_ANY_VCENTER : nAlias = SID_OBJECT_ALIGN_MIDDLE ; break; 437 case SID_ALIGN_ANY_BOTTOM : nAlias = SID_OBJECT_ALIGN_DOWN ; break; 438 } 439 } 440 //these slots are either re-mapped to text or object alignment 441 const SfxPoolItem* pState = 0; 442 if(nAlias) 443 GetViewFrame()->GetDispatcher()->QueryState( nAlias, pState ); 444 if(pState) 445 rSet.Put(*pState, nWhich); 446 else if(!bDraw) 447 rSet.DisableItem(nWhich); 448 } 449 break; 450 } 451 nWhich = aIter.NextWhich(); 452 } 453 } 454 455 456 /*-------------------------------------------------------------------- 457 Beschreibung: 458 --------------------------------------------------------------------*/ 459 460 void SwView::GetDrawState(SfxItemSet &rSet) 461 { 462 SfxWhichIter aIter(rSet); 463 sal_Bool bWeb = 0 != PTR_CAST(SwWebView, this); 464 465 for( sal_uInt16 nWhich = aIter.FirstWhich(); nWhich; 466 nWhich = aIter.NextWhich() ) 467 switch(nWhich) 468 { 469 case SID_INSERT_DRAW: 470 if ( bWeb ) 471 rSet.DisableItem( nWhich ); 472 else 473 { 474 SfxAllEnumItem aEnum(SID_INSERT_DRAW, nDrawSfxId); 475 if ( !SvtLanguageOptions().IsVerticalTextEnabled() ) 476 { 477 aEnum.DisableValue( SID_DRAW_CAPTION_VERTICAL ); 478 aEnum.DisableValue( SID_DRAW_TEXT_VERTICAL ); 479 } 480 rSet.Put(aEnum); 481 } 482 break; 483 484 case SID_SHOW_HIDDEN: 485 case SID_SHOW_FORMS: 486 rSet.DisableItem( nWhich ); 487 // rSet.Put( SfxBoolItem(nWhich,sal_True )); 488 break; 489 490 case SID_DRAW_TEXT_MARQUEE: 491 if (::GetHtmlMode(GetDocShell()) & HTMLMODE_SOME_STYLES) 492 rSet.Put( SfxBoolItem(nWhich, nDrawSfxId == nWhich)); 493 else 494 rSet.DisableItem(nWhich); 495 break; 496 case SID_OBJECT_SELECT: 497 rSet.Put( SfxBoolItem(nWhich, nDrawSfxId == nWhich || 498 nFormSfxId == nWhich)); 499 break; 500 501 case SID_FONTWORK_GALLERY_FLOATER : 502 { 503 if ( bWeb ) 504 rSet.DisableItem( nWhich ); 505 } 506 break; 507 508 case SID_DRAWTBX_CS_BASIC : 509 case SID_DRAWTBX_CS_SYMBOL : 510 case SID_DRAWTBX_CS_ARROW : 511 case SID_DRAWTBX_CS_FLOWCHART : 512 case SID_DRAWTBX_CS_CALLOUT : 513 case SID_DRAWTBX_CS_STAR : 514 { 515 if ( bWeb ) 516 rSet.DisableItem( nWhich ); 517 else 518 rSet.Put(SfxStringItem(nWhich, aCurrShapeEnumCommand[ nWhich - SID_DRAWTBX_CS_BASIC ] )); 519 } 520 break; 521 522 } 523 } 524 525 /*-------------------------------------------------------------------- 526 Beschreibung: 527 --------------------------------------------------------------------*/ 528 529 sal_Bool SwView::HasUIFeature( sal_uInt32 nFeature ) 530 { 531 sal_Bool bRet = sal_False; 532 switch(nFeature) 533 { 534 case CHILDWIN_LABEL : bRet = pWrtShell->IsLabelDoc(); break; 535 case CHILDWIN_MAILMERGE : bRet = 0 != GetMailMergeConfigItem(); break; 536 } 537 return bRet; 538 } 539