1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_sc.hxx" 30*cdf0e10cSrcweir 31*cdf0e10cSrcweir 32*cdf0e10cSrcweir 33*cdf0e10cSrcweir // INCLUDE --------------------------------------------------------------- 34*cdf0e10cSrcweir #include <tools/list.hxx> 35*cdf0e10cSrcweir #include "scitems.hxx" 36*cdf0e10cSrcweir #include <sfx2/bindings.hxx> 37*cdf0e10cSrcweir #include <sfx2/viewsh.hxx> 38*cdf0e10cSrcweir #include <sfx2/dispatch.hxx> 39*cdf0e10cSrcweir #include <editeng/fontitem.hxx> 40*cdf0e10cSrcweir #include <editeng/langitem.hxx> 41*cdf0e10cSrcweir #include <editeng/scripttypeitem.hxx> 42*cdf0e10cSrcweir #include <svl/itempool.hxx> 43*cdf0e10cSrcweir #include <svl/itemset.hxx> 44*cdf0e10cSrcweir #include <svl/cjkoptions.hxx> 45*cdf0e10cSrcweir #include <svl/ctloptions.hxx> 46*cdf0e10cSrcweir #include <vcl/svapp.hxx> 47*cdf0e10cSrcweir #include <vcl/msgbox.hxx> 48*cdf0e10cSrcweir #include <vcl/wrkwin.hxx> 49*cdf0e10cSrcweir #include <sfx2/request.hxx> 50*cdf0e10cSrcweir #include <sfx2/objsh.hxx> 51*cdf0e10cSrcweir #include <svl/stritem.hxx> 52*cdf0e10cSrcweir #include <svl/eitem.hxx> 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir #include <com/sun/star/i18n/TransliterationModules.hpp> 55*cdf0e10cSrcweir #include <com/sun/star/i18n/TransliterationModulesExtra.hpp> 56*cdf0e10cSrcweir 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir #include "viewutil.hxx" 59*cdf0e10cSrcweir #include "global.hxx" 60*cdf0e10cSrcweir #include "chgtrack.hxx" 61*cdf0e10cSrcweir #include "chgviset.hxx" 62*cdf0e10cSrcweir #include "markdata.hxx" 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir #include <svx/svxdlg.hxx> //CHINA001 65*cdf0e10cSrcweir #include <svx/dialogs.hrc> //CHINA001 66*cdf0e10cSrcweir // STATIC DATA ----------------------------------------------------------- 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir //================================================================== 69*cdf0e10cSrcweir 70*cdf0e10cSrcweir // static 71*cdf0e10cSrcweir void ScViewUtil::PutItemScript( SfxItemSet& rShellSet, const SfxItemSet& rCoreSet, 72*cdf0e10cSrcweir sal_uInt16 nWhichId, sal_uInt16 nScript ) 73*cdf0e10cSrcweir { 74*cdf0e10cSrcweir // take the effective item from rCoreSet according to nScript 75*cdf0e10cSrcweir // and put in rShellSet under the (base) nWhichId 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir SfxItemPool& rPool = *rShellSet.GetPool(); 78*cdf0e10cSrcweir SvxScriptSetItem aSetItem( rPool.GetSlotId(nWhichId), rPool ); 79*cdf0e10cSrcweir // use PutExtended with eDefaultAs = SFX_ITEM_SET, so defaults from rCoreSet 80*cdf0e10cSrcweir // (document pool) are read and put into rShellSet (MessagePool) 81*cdf0e10cSrcweir aSetItem.GetItemSet().PutExtended( rCoreSet, SFX_ITEM_DONTCARE, SFX_ITEM_SET ); 82*cdf0e10cSrcweir const SfxPoolItem* pI = aSetItem.GetItemOfScript( nScript ); 83*cdf0e10cSrcweir if (pI) 84*cdf0e10cSrcweir rShellSet.Put( *pI, nWhichId ); 85*cdf0e10cSrcweir else 86*cdf0e10cSrcweir rShellSet.InvalidateItem( nWhichId ); 87*cdf0e10cSrcweir } 88*cdf0e10cSrcweir 89*cdf0e10cSrcweir // static 90*cdf0e10cSrcweir sal_uInt16 ScViewUtil::GetEffLanguage( ScDocument* pDoc, const ScAddress& rPos ) 91*cdf0e10cSrcweir { 92*cdf0e10cSrcweir // used for thesaurus 93*cdf0e10cSrcweir 94*cdf0e10cSrcweir sal_uInt8 nScript = pDoc->GetScriptType( rPos.Col(), rPos.Row(), rPos.Tab() ); 95*cdf0e10cSrcweir sal_uInt16 nWhich = ( nScript == SCRIPTTYPE_ASIAN ) ? ATTR_CJK_FONT_LANGUAGE : 96*cdf0e10cSrcweir ( ( nScript == SCRIPTTYPE_COMPLEX ) ? ATTR_CTL_FONT_LANGUAGE : ATTR_FONT_LANGUAGE ); 97*cdf0e10cSrcweir const SfxPoolItem* pItem = pDoc->GetAttr( rPos.Col(), rPos.Row(), rPos.Tab(), nWhich); 98*cdf0e10cSrcweir SvxLanguageItem* pLangIt = PTR_CAST( SvxLanguageItem, pItem ); 99*cdf0e10cSrcweir LanguageType eLnge; 100*cdf0e10cSrcweir if (pLangIt) 101*cdf0e10cSrcweir { 102*cdf0e10cSrcweir eLnge = (LanguageType) pLangIt->GetValue(); 103*cdf0e10cSrcweir if (eLnge == LANGUAGE_DONTKNOW) //! can this happen? 104*cdf0e10cSrcweir { 105*cdf0e10cSrcweir LanguageType eLatin, eCjk, eCtl; 106*cdf0e10cSrcweir pDoc->GetLanguage( eLatin, eCjk, eCtl ); 107*cdf0e10cSrcweir eLnge = ( nScript == SCRIPTTYPE_ASIAN ) ? eCjk : 108*cdf0e10cSrcweir ( ( nScript == SCRIPTTYPE_COMPLEX ) ? eCtl : eLatin ); 109*cdf0e10cSrcweir } 110*cdf0e10cSrcweir } 111*cdf0e10cSrcweir else 112*cdf0e10cSrcweir eLnge = LANGUAGE_ENGLISH_US; 113*cdf0e10cSrcweir if ( eLnge == LANGUAGE_SYSTEM ) 114*cdf0e10cSrcweir eLnge = Application::GetSettings().GetLanguage(); // never use SYSTEM for spelling 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir return eLnge; 117*cdf0e10cSrcweir } 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir // static 120*cdf0e10cSrcweir sal_Int32 ScViewUtil::GetTransliterationType( sal_uInt16 nSlotID ) 121*cdf0e10cSrcweir { 122*cdf0e10cSrcweir sal_Int32 nType = 0; 123*cdf0e10cSrcweir switch ( nSlotID ) 124*cdf0e10cSrcweir { 125*cdf0e10cSrcweir case SID_TRANSLITERATE_SENTENCE_CASE: 126*cdf0e10cSrcweir nType = com::sun::star::i18n::TransliterationModulesExtra::SENTENCE_CASE; 127*cdf0e10cSrcweir break; 128*cdf0e10cSrcweir case SID_TRANSLITERATE_TITLE_CASE: 129*cdf0e10cSrcweir nType = com::sun::star::i18n::TransliterationModulesExtra::TITLE_CASE; 130*cdf0e10cSrcweir break; 131*cdf0e10cSrcweir case SID_TRANSLITERATE_TOGGLE_CASE: 132*cdf0e10cSrcweir nType = com::sun::star::i18n::TransliterationModulesExtra::TOGGLE_CASE; 133*cdf0e10cSrcweir break; 134*cdf0e10cSrcweir case SID_TRANSLITERATE_UPPER: 135*cdf0e10cSrcweir nType = com::sun::star::i18n::TransliterationModules_LOWERCASE_UPPERCASE; 136*cdf0e10cSrcweir break; 137*cdf0e10cSrcweir case SID_TRANSLITERATE_LOWER: 138*cdf0e10cSrcweir nType = com::sun::star::i18n::TransliterationModules_UPPERCASE_LOWERCASE; 139*cdf0e10cSrcweir break; 140*cdf0e10cSrcweir case SID_TRANSLITERATE_HALFWIDTH: 141*cdf0e10cSrcweir nType = com::sun::star::i18n::TransliterationModules_FULLWIDTH_HALFWIDTH; 142*cdf0e10cSrcweir break; 143*cdf0e10cSrcweir case SID_TRANSLITERATE_FULLWIDTH: 144*cdf0e10cSrcweir nType = com::sun::star::i18n::TransliterationModules_HALFWIDTH_FULLWIDTH; 145*cdf0e10cSrcweir break; 146*cdf0e10cSrcweir case SID_TRANSLITERATE_HIRAGANA: 147*cdf0e10cSrcweir nType = com::sun::star::i18n::TransliterationModules_KATAKANA_HIRAGANA; 148*cdf0e10cSrcweir break; 149*cdf0e10cSrcweir case SID_TRANSLITERATE_KATAGANA: 150*cdf0e10cSrcweir nType = com::sun::star::i18n::TransliterationModules_HIRAGANA_KATAKANA; 151*cdf0e10cSrcweir break; 152*cdf0e10cSrcweir } 153*cdf0e10cSrcweir return nType; 154*cdf0e10cSrcweir } 155*cdf0e10cSrcweir 156*cdf0e10cSrcweir // static 157*cdf0e10cSrcweir sal_Bool ScViewUtil::IsActionShown( const ScChangeAction& rAction, 158*cdf0e10cSrcweir const ScChangeViewSettings& rSettings, 159*cdf0e10cSrcweir ScDocument& rDocument ) 160*cdf0e10cSrcweir { 161*cdf0e10cSrcweir // abgelehnte werden durch eine invertierende akzeptierte Action dargestellt, 162*cdf0e10cSrcweir // die Reihenfolge von ShowRejected/ShowAccepted ist deswegen wichtig 163*cdf0e10cSrcweir 164*cdf0e10cSrcweir if ( !rSettings.IsShowRejected() && rAction.IsRejecting() ) 165*cdf0e10cSrcweir return sal_False; 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir if ( !rSettings.IsShowAccepted() && rAction.IsAccepted() && !rAction.IsRejecting() ) 168*cdf0e10cSrcweir return sal_False; 169*cdf0e10cSrcweir 170*cdf0e10cSrcweir if ( rSettings.HasAuthor() ) 171*cdf0e10cSrcweir { 172*cdf0e10cSrcweir if ( rSettings.IsEveryoneButMe() ) 173*cdf0e10cSrcweir { 174*cdf0e10cSrcweir // GetUser() am ChangeTrack ist der aktuelle Benutzer 175*cdf0e10cSrcweir ScChangeTrack* pTrack = rDocument.GetChangeTrack(); 176*cdf0e10cSrcweir if ( !pTrack || rAction.GetUser() == pTrack->GetUser() ) 177*cdf0e10cSrcweir return sal_False; 178*cdf0e10cSrcweir } 179*cdf0e10cSrcweir else if ( rAction.GetUser() != rSettings.GetTheAuthorToShow() ) 180*cdf0e10cSrcweir return sal_False; 181*cdf0e10cSrcweir } 182*cdf0e10cSrcweir 183*cdf0e10cSrcweir if ( rSettings.HasComment() ) 184*cdf0e10cSrcweir { 185*cdf0e10cSrcweir String aComStr=rAction.GetComment(); 186*cdf0e10cSrcweir aComStr.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " (" )); 187*cdf0e10cSrcweir rAction.GetDescription( aComStr, &rDocument ); 188*cdf0e10cSrcweir aComStr+=')'; 189*cdf0e10cSrcweir 190*cdf0e10cSrcweir if(!rSettings.IsValidComment(&aComStr)) 191*cdf0e10cSrcweir return sal_False; 192*cdf0e10cSrcweir } 193*cdf0e10cSrcweir 194*cdf0e10cSrcweir if ( rSettings.HasRange() ) 195*cdf0e10cSrcweir if ( !rSettings.GetTheRangeList().Intersects( rAction.GetBigRange().MakeRange() ) ) 196*cdf0e10cSrcweir return sal_False; 197*cdf0e10cSrcweir 198*cdf0e10cSrcweir if ( rSettings.HasDate() && rSettings.GetTheDateMode() != SCDM_NO_DATEMODE ) 199*cdf0e10cSrcweir { 200*cdf0e10cSrcweir DateTime aDateTime = rAction.GetDateTime(); 201*cdf0e10cSrcweir const DateTime& rFirst = rSettings.GetTheFirstDateTime(); 202*cdf0e10cSrcweir const DateTime& rLast = rSettings.GetTheLastDateTime(); 203*cdf0e10cSrcweir switch ( rSettings.GetTheDateMode() ) 204*cdf0e10cSrcweir { // korrespondiert mit ScHighlightChgDlg::OKBtnHdl 205*cdf0e10cSrcweir case SCDM_DATE_BEFORE: 206*cdf0e10cSrcweir if ( aDateTime > rFirst ) 207*cdf0e10cSrcweir return sal_False; 208*cdf0e10cSrcweir break; 209*cdf0e10cSrcweir 210*cdf0e10cSrcweir case SCDM_DATE_SINCE: 211*cdf0e10cSrcweir if ( aDateTime < rFirst ) 212*cdf0e10cSrcweir return sal_False; 213*cdf0e10cSrcweir break; 214*cdf0e10cSrcweir 215*cdf0e10cSrcweir case SCDM_DATE_EQUAL: 216*cdf0e10cSrcweir case SCDM_DATE_BETWEEN: 217*cdf0e10cSrcweir if ( aDateTime < rFirst || aDateTime > rLast ) 218*cdf0e10cSrcweir return sal_False; 219*cdf0e10cSrcweir break; 220*cdf0e10cSrcweir 221*cdf0e10cSrcweir case SCDM_DATE_NOTEQUAL: 222*cdf0e10cSrcweir if ( aDateTime >= rFirst && aDateTime <= rLast ) 223*cdf0e10cSrcweir return sal_False; 224*cdf0e10cSrcweir break; 225*cdf0e10cSrcweir 226*cdf0e10cSrcweir case SCDM_DATE_SAVE: 227*cdf0e10cSrcweir { 228*cdf0e10cSrcweir ScChangeTrack* pTrack = rDocument.GetChangeTrack(); 229*cdf0e10cSrcweir if ( !pTrack || pTrack->GetLastSavedActionNumber() >= 230*cdf0e10cSrcweir rAction.GetActionNumber() ) 231*cdf0e10cSrcweir return sal_False; 232*cdf0e10cSrcweir } 233*cdf0e10cSrcweir break; 234*cdf0e10cSrcweir 235*cdf0e10cSrcweir default: 236*cdf0e10cSrcweir { 237*cdf0e10cSrcweir // added to avoid warnings 238*cdf0e10cSrcweir } 239*cdf0e10cSrcweir } 240*cdf0e10cSrcweir } 241*cdf0e10cSrcweir 242*cdf0e10cSrcweir if ( rSettings.HasActionRange() ) 243*cdf0e10cSrcweir { 244*cdf0e10cSrcweir sal_uLong nAction = rAction.GetActionNumber(); 245*cdf0e10cSrcweir sal_uLong nFirstAction; 246*cdf0e10cSrcweir sal_uLong nLastAction; 247*cdf0e10cSrcweir rSettings.GetTheActionRange( nFirstAction, nLastAction ); 248*cdf0e10cSrcweir if ( nAction < nFirstAction || nAction > nLastAction ) 249*cdf0e10cSrcweir { 250*cdf0e10cSrcweir return sal_False; 251*cdf0e10cSrcweir } 252*cdf0e10cSrcweir } 253*cdf0e10cSrcweir 254*cdf0e10cSrcweir return sal_True; 255*cdf0e10cSrcweir } 256*cdf0e10cSrcweir 257*cdf0e10cSrcweir // static 258*cdf0e10cSrcweir void ScViewUtil::UnmarkFiltered( ScMarkData& rMark, ScDocument* pDoc ) 259*cdf0e10cSrcweir { 260*cdf0e10cSrcweir rMark.MarkToMulti(); 261*cdf0e10cSrcweir 262*cdf0e10cSrcweir ScRange aMultiArea; 263*cdf0e10cSrcweir rMark.GetMultiMarkArea( aMultiArea ); 264*cdf0e10cSrcweir SCCOL nStartCol = aMultiArea.aStart.Col(); 265*cdf0e10cSrcweir SCROW nStartRow = aMultiArea.aStart.Row(); 266*cdf0e10cSrcweir SCCOL nEndCol = aMultiArea.aEnd.Col(); 267*cdf0e10cSrcweir SCROW nEndRow = aMultiArea.aEnd.Row(); 268*cdf0e10cSrcweir 269*cdf0e10cSrcweir bool bChanged = false; 270*cdf0e10cSrcweir SCTAB nTabCount = pDoc->GetTableCount(); 271*cdf0e10cSrcweir for (SCTAB nTab=0; nTab<nTabCount; nTab++) 272*cdf0e10cSrcweir if ( rMark.GetTableSelect(nTab ) ) 273*cdf0e10cSrcweir { 274*cdf0e10cSrcweir for (SCROW nRow = nStartRow; nRow <= nEndRow; ++nRow) 275*cdf0e10cSrcweir { 276*cdf0e10cSrcweir SCROW nLastRow = nRow; 277*cdf0e10cSrcweir if (pDoc->RowFiltered(nRow, nTab, NULL, &nLastRow)) 278*cdf0e10cSrcweir { 279*cdf0e10cSrcweir // use nStartCol/nEndCol, so the multi mark area isn't extended to all columns 280*cdf0e10cSrcweir // (visible in repaint for indentation) 281*cdf0e10cSrcweir rMark.SetMultiMarkArea( 282*cdf0e10cSrcweir ScRange(nStartCol, nRow, nTab, nEndCol, nLastRow, nTab), false); 283*cdf0e10cSrcweir bChanged = true; 284*cdf0e10cSrcweir nRow = nLastRow; 285*cdf0e10cSrcweir } 286*cdf0e10cSrcweir } 287*cdf0e10cSrcweir } 288*cdf0e10cSrcweir 289*cdf0e10cSrcweir if ( bChanged && !rMark.HasAnyMultiMarks() ) 290*cdf0e10cSrcweir rMark.ResetMark(); 291*cdf0e10cSrcweir 292*cdf0e10cSrcweir rMark.MarkToSimple(); 293*cdf0e10cSrcweir } 294*cdf0e10cSrcweir 295*cdf0e10cSrcweir 296*cdf0e10cSrcweir // static 297*cdf0e10cSrcweir bool ScViewUtil::FitToUnfilteredRows( ScRange & rRange, ScDocument * pDoc, size_t nRows ) 298*cdf0e10cSrcweir { 299*cdf0e10cSrcweir SCTAB nTab = rRange.aStart.Tab(); 300*cdf0e10cSrcweir bool bOneTabOnly = (nTab == rRange.aEnd.Tab()); 301*cdf0e10cSrcweir // Always fit the range on its first sheet. 302*cdf0e10cSrcweir DBG_ASSERT( bOneTabOnly, "ScViewUtil::ExtendToUnfilteredRows: works only on one sheet"); 303*cdf0e10cSrcweir SCROW nStartRow = rRange.aStart.Row(); 304*cdf0e10cSrcweir SCROW nLastRow = pDoc->LastNonFilteredRow(nStartRow, MAXROW, nTab); 305*cdf0e10cSrcweir if (ValidRow(nLastRow)) 306*cdf0e10cSrcweir rRange.aEnd.SetRow(nLastRow); 307*cdf0e10cSrcweir SCROW nCount = pDoc->CountNonFilteredRows(nStartRow, MAXROW, nTab); 308*cdf0e10cSrcweir return static_cast<size_t>(nCount) == nRows && bOneTabOnly; 309*cdf0e10cSrcweir } 310*cdf0e10cSrcweir 311*cdf0e10cSrcweir 312*cdf0e10cSrcweir // static 313*cdf0e10cSrcweir bool ScViewUtil::HasFiltered( const ScRange& rRange, ScDocument* pDoc ) 314*cdf0e10cSrcweir { 315*cdf0e10cSrcweir SCROW nStartRow = rRange.aStart.Row(); 316*cdf0e10cSrcweir SCROW nEndRow = rRange.aEnd.Row(); 317*cdf0e10cSrcweir for (SCTAB nTab=rRange.aStart.Tab(); nTab<=rRange.aEnd.Tab(); nTab++) 318*cdf0e10cSrcweir { 319*cdf0e10cSrcweir if (pDoc->HasFilteredRows(nStartRow, nEndRow, nTab)) 320*cdf0e10cSrcweir return true; 321*cdf0e10cSrcweir } 322*cdf0e10cSrcweir 323*cdf0e10cSrcweir return false; 324*cdf0e10cSrcweir } 325*cdf0e10cSrcweir 326*cdf0e10cSrcweir // static 327*cdf0e10cSrcweir void ScViewUtil::HideDisabledSlot( SfxItemSet& rSet, SfxBindings& rBindings, sal_uInt16 nSlotId ) 328*cdf0e10cSrcweir { 329*cdf0e10cSrcweir SvtCJKOptions aCJKOptions; 330*cdf0e10cSrcweir SvtCTLOptions aCTLOptions; 331*cdf0e10cSrcweir bool bEnabled = true; 332*cdf0e10cSrcweir 333*cdf0e10cSrcweir switch( nSlotId ) 334*cdf0e10cSrcweir { 335*cdf0e10cSrcweir case SID_CHINESE_CONVERSION: 336*cdf0e10cSrcweir case SID_HANGUL_HANJA_CONVERSION: 337*cdf0e10cSrcweir bEnabled = aCJKOptions.IsAnyEnabled(); 338*cdf0e10cSrcweir break; 339*cdf0e10cSrcweir 340*cdf0e10cSrcweir case SID_TRANSLITERATE_HALFWIDTH: 341*cdf0e10cSrcweir case SID_TRANSLITERATE_FULLWIDTH: 342*cdf0e10cSrcweir case SID_TRANSLITERATE_HIRAGANA: 343*cdf0e10cSrcweir case SID_TRANSLITERATE_KATAGANA: 344*cdf0e10cSrcweir bEnabled = aCJKOptions.IsChangeCaseMapEnabled(); 345*cdf0e10cSrcweir break; 346*cdf0e10cSrcweir 347*cdf0e10cSrcweir case SID_INSERT_RLM: 348*cdf0e10cSrcweir case SID_INSERT_LRM: 349*cdf0e10cSrcweir case SID_INSERT_ZWNBSP: 350*cdf0e10cSrcweir case SID_INSERT_ZWSP: 351*cdf0e10cSrcweir bEnabled = aCTLOptions.IsCTLFontEnabled(); 352*cdf0e10cSrcweir break; 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir default: 355*cdf0e10cSrcweir DBG_ERRORFILE( "ScViewUtil::HideDisabledSlot - unknown slot ID" ); 356*cdf0e10cSrcweir return; 357*cdf0e10cSrcweir } 358*cdf0e10cSrcweir 359*cdf0e10cSrcweir rBindings.SetVisibleState( nSlotId, bEnabled ); 360*cdf0e10cSrcweir if( !bEnabled ) 361*cdf0e10cSrcweir rSet.DisableItem( nSlotId ); 362*cdf0e10cSrcweir } 363*cdf0e10cSrcweir 364*cdf0e10cSrcweir //================================================================== 365*cdf0e10cSrcweir 366*cdf0e10cSrcweir sal_Bool ScViewUtil::ExecuteCharMap( const SvxFontItem& rOldFont, 367*cdf0e10cSrcweir SfxViewFrame& rFrame, 368*cdf0e10cSrcweir SvxFontItem& rNewFont, 369*cdf0e10cSrcweir String& rString ) 370*cdf0e10cSrcweir { 371*cdf0e10cSrcweir sal_Bool bRet = sal_False; 372*cdf0e10cSrcweir SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); 373*cdf0e10cSrcweir if(pFact) 374*cdf0e10cSrcweir { 375*cdf0e10cSrcweir SfxAllItemSet aSet( rFrame.GetObjectShell()->GetPool() ); 376*cdf0e10cSrcweir aSet.Put( SfxBoolItem( FN_PARAM_1, sal_False ) ); 377*cdf0e10cSrcweir aSet.Put( SvxFontItem( rOldFont.GetFamily(), rOldFont.GetFamilyName(), rOldFont.GetStyleName(), rOldFont.GetPitch(), rOldFont.GetCharSet(), aSet.GetPool()->GetWhich( SID_ATTR_CHAR_FONT ) ) ); 378*cdf0e10cSrcweir SfxAbstractDialog* pDlg = pFact->CreateSfxDialog( &rFrame.GetWindow(), aSet, rFrame.GetFrame().GetFrameInterface(), RID_SVXDLG_CHARMAP ); 379*cdf0e10cSrcweir if ( pDlg->Execute() == RET_OK ) 380*cdf0e10cSrcweir { 381*cdf0e10cSrcweir SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pItem, SfxStringItem, SID_CHARMAP, sal_False ); 382*cdf0e10cSrcweir SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pFontItem, SvxFontItem, SID_ATTR_CHAR_FONT, sal_False ); 383*cdf0e10cSrcweir if ( pItem ) 384*cdf0e10cSrcweir rString = pItem->GetValue(); 385*cdf0e10cSrcweir if ( pFontItem ) 386*cdf0e10cSrcweir rNewFont = SvxFontItem( pFontItem->GetFamily(), pFontItem->GetFamilyName(), pFontItem->GetStyleName(), pFontItem->GetPitch(), pFontItem->GetCharSet(), rNewFont.Which() ); 387*cdf0e10cSrcweir bRet = sal_True; 388*cdf0e10cSrcweir } 389*cdf0e10cSrcweir delete pDlg; 390*cdf0e10cSrcweir } 391*cdf0e10cSrcweir return bRet; 392*cdf0e10cSrcweir } 393*cdf0e10cSrcweir 394*cdf0e10cSrcweir bool ScViewUtil::IsFullScreen( SfxViewShell& rViewShell ) 395*cdf0e10cSrcweir { 396*cdf0e10cSrcweir SfxBindings& rBindings = rViewShell.GetViewFrame()->GetBindings(); 397*cdf0e10cSrcweir SfxPoolItem* pItem = 0; 398*cdf0e10cSrcweir bool bIsFullScreen = false; 399*cdf0e10cSrcweir 400*cdf0e10cSrcweir if (rBindings.QueryState( SID_WIN_FULLSCREEN, pItem ) >= SFX_ITEM_DEFAULT) 401*cdf0e10cSrcweir bIsFullScreen = static_cast< SfxBoolItem* >( pItem )->GetValue(); 402*cdf0e10cSrcweir return bIsFullScreen; 403*cdf0e10cSrcweir } 404*cdf0e10cSrcweir 405*cdf0e10cSrcweir void ScViewUtil::SetFullScreen( SfxViewShell& rViewShell, bool bSet ) 406*cdf0e10cSrcweir { 407*cdf0e10cSrcweir if( IsFullScreen( rViewShell ) != bSet ) 408*cdf0e10cSrcweir { 409*cdf0e10cSrcweir SfxBoolItem aItem( SID_WIN_FULLSCREEN, bSet ); 410*cdf0e10cSrcweir rViewShell.GetDispatcher()->Execute( SID_WIN_FULLSCREEN, SFX_CALLMODE_RECORD, &aItem, 0L ); 411*cdf0e10cSrcweir } 412*cdf0e10cSrcweir } 413*cdf0e10cSrcweir 414*cdf0e10cSrcweir //------------------------------------------------------------------ 415*cdf0e10cSrcweir 416*cdf0e10cSrcweir ScUpdateRect::ScUpdateRect( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2 ) 417*cdf0e10cSrcweir { 418*cdf0e10cSrcweir PutInOrder( nX1, nX2 ); 419*cdf0e10cSrcweir PutInOrder( nY1, nY2 ); 420*cdf0e10cSrcweir 421*cdf0e10cSrcweir nOldStartX = nX1; 422*cdf0e10cSrcweir nOldStartY = nY1; 423*cdf0e10cSrcweir nOldEndX = nX2; 424*cdf0e10cSrcweir nOldEndY = nY2; 425*cdf0e10cSrcweir } 426*cdf0e10cSrcweir 427*cdf0e10cSrcweir void ScUpdateRect::SetNew( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2 ) 428*cdf0e10cSrcweir { 429*cdf0e10cSrcweir PutInOrder( nX1, nX2 ); 430*cdf0e10cSrcweir PutInOrder( nY1, nY2 ); 431*cdf0e10cSrcweir 432*cdf0e10cSrcweir nNewStartX = nX1; 433*cdf0e10cSrcweir nNewStartY = nY1; 434*cdf0e10cSrcweir nNewEndX = nX2; 435*cdf0e10cSrcweir nNewEndY = nY2; 436*cdf0e10cSrcweir } 437*cdf0e10cSrcweir 438*cdf0e10cSrcweir sal_Bool ScUpdateRect::GetDiff( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2 ) 439*cdf0e10cSrcweir { 440*cdf0e10cSrcweir if ( nNewStartX == nOldStartX && nNewEndX == nOldEndX && 441*cdf0e10cSrcweir nNewStartY == nOldStartY && nNewEndY == nOldEndY ) 442*cdf0e10cSrcweir { 443*cdf0e10cSrcweir rX1 = nNewStartX; 444*cdf0e10cSrcweir rY1 = nNewStartY; 445*cdf0e10cSrcweir rX2 = nNewStartX; 446*cdf0e10cSrcweir rY2 = nNewStartY; 447*cdf0e10cSrcweir return sal_False; 448*cdf0e10cSrcweir } 449*cdf0e10cSrcweir 450*cdf0e10cSrcweir rX1 = Min(nNewStartX,nOldStartX); 451*cdf0e10cSrcweir rY1 = Min(nNewStartY,nOldStartY); 452*cdf0e10cSrcweir rX2 = Max(nNewEndX,nOldEndX); 453*cdf0e10cSrcweir rY2 = Max(nNewEndY,nOldEndY); 454*cdf0e10cSrcweir 455*cdf0e10cSrcweir if ( nNewStartX == nOldStartX && nNewEndX == nOldEndX ) 456*cdf0e10cSrcweir { 457*cdf0e10cSrcweir if ( nNewStartY == nOldStartY ) 458*cdf0e10cSrcweir { 459*cdf0e10cSrcweir rY1 = Min( nNewEndY, nOldEndY ); 460*cdf0e10cSrcweir rY2 = Max( nNewEndY, nOldEndY ); 461*cdf0e10cSrcweir } 462*cdf0e10cSrcweir else if ( nNewEndY == nOldEndY ) 463*cdf0e10cSrcweir { 464*cdf0e10cSrcweir rY1 = Min( nNewStartY, nOldStartY ); 465*cdf0e10cSrcweir rY2 = Max( nNewStartY, nOldStartY ); 466*cdf0e10cSrcweir } 467*cdf0e10cSrcweir } 468*cdf0e10cSrcweir else if ( nNewStartY == nOldStartY && nNewEndY == nOldEndY ) 469*cdf0e10cSrcweir { 470*cdf0e10cSrcweir if ( nNewStartX == nOldStartX ) 471*cdf0e10cSrcweir { 472*cdf0e10cSrcweir rX1 = Min( nNewEndX, nOldEndX ); 473*cdf0e10cSrcweir rX2 = Max( nNewEndX, nOldEndX ); 474*cdf0e10cSrcweir } 475*cdf0e10cSrcweir else if ( nNewEndX == nOldEndX ) 476*cdf0e10cSrcweir { 477*cdf0e10cSrcweir rX1 = Min( nNewStartX, nOldStartX ); 478*cdf0e10cSrcweir rX2 = Max( nNewStartX, nOldStartX ); 479*cdf0e10cSrcweir } 480*cdf0e10cSrcweir } 481*cdf0e10cSrcweir 482*cdf0e10cSrcweir return sal_True; 483*cdf0e10cSrcweir } 484*cdf0e10cSrcweir 485*cdf0e10cSrcweir #ifdef OLD_SELECTION_PAINT 486*cdf0e10cSrcweir sal_Bool ScUpdateRect::GetXorDiff( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2, sal_Bool& rCont ) 487*cdf0e10cSrcweir { 488*cdf0e10cSrcweir rCont = sal_False; 489*cdf0e10cSrcweir 490*cdf0e10cSrcweir if (nNewStartX == nOldStartX && nNewEndX == nOldEndX && 491*cdf0e10cSrcweir nNewStartY == nOldStartY && nNewEndY == nOldEndY) 492*cdf0e10cSrcweir { 493*cdf0e10cSrcweir rX1 = nNewStartX; 494*cdf0e10cSrcweir rY1 = nNewStartY; 495*cdf0e10cSrcweir rX2 = nNewStartX; 496*cdf0e10cSrcweir rY2 = nNewStartY; 497*cdf0e10cSrcweir return sal_False; 498*cdf0e10cSrcweir } 499*cdf0e10cSrcweir 500*cdf0e10cSrcweir rX1 = Min(nNewStartX,nOldStartX); 501*cdf0e10cSrcweir rY1 = Min(nNewStartY,nOldStartY); 502*cdf0e10cSrcweir rX2 = Max(nNewEndX,nOldEndX); 503*cdf0e10cSrcweir rY2 = Max(nNewEndY,nOldEndY); 504*cdf0e10cSrcweir 505*cdf0e10cSrcweir if (nNewStartX == nOldStartX && nNewEndX == nOldEndX) // nur vertikal 506*cdf0e10cSrcweir { 507*cdf0e10cSrcweir if (nNewStartY == nOldStartY) 508*cdf0e10cSrcweir { 509*cdf0e10cSrcweir rY1 = Min( nNewEndY, nOldEndY ) + 1; 510*cdf0e10cSrcweir rY2 = Max( nNewEndY, nOldEndY ); 511*cdf0e10cSrcweir } 512*cdf0e10cSrcweir else if (nNewEndY == nOldEndY) 513*cdf0e10cSrcweir { 514*cdf0e10cSrcweir rY1 = Min( nNewStartY, nOldStartY ); 515*cdf0e10cSrcweir rY2 = Max( nNewStartY, nOldStartY ) - 1; 516*cdf0e10cSrcweir } 517*cdf0e10cSrcweir else 518*cdf0e10cSrcweir { 519*cdf0e10cSrcweir rY1 = Min( nNewStartY, nOldStartY ); 520*cdf0e10cSrcweir rY2 = Max( nNewStartY, nOldStartY ) - 1; 521*cdf0e10cSrcweir rCont = sal_True; 522*cdf0e10cSrcweir nContY1 = Min( nNewEndY, nOldEndY ) + 1; 523*cdf0e10cSrcweir nContY2 = Max( nNewEndY, nOldEndY ); 524*cdf0e10cSrcweir nContX1 = rX1; 525*cdf0e10cSrcweir nContX2 = rX2; 526*cdf0e10cSrcweir } 527*cdf0e10cSrcweir } 528*cdf0e10cSrcweir else if (nNewStartY == nOldStartY && nNewEndY == nOldEndY) // nur horizontal 529*cdf0e10cSrcweir { 530*cdf0e10cSrcweir if (nNewStartX == nOldStartX) 531*cdf0e10cSrcweir { 532*cdf0e10cSrcweir rX1 = Min( nNewEndX, nOldEndX ) + 1; 533*cdf0e10cSrcweir rX2 = Max( nNewEndX, nOldEndX ); 534*cdf0e10cSrcweir } 535*cdf0e10cSrcweir else if (nNewEndX == nOldEndX) 536*cdf0e10cSrcweir { 537*cdf0e10cSrcweir rX1 = Min( nNewStartX, nOldStartX ); 538*cdf0e10cSrcweir rX2 = Max( nNewStartX, nOldStartX ) - 1; 539*cdf0e10cSrcweir } 540*cdf0e10cSrcweir else 541*cdf0e10cSrcweir { 542*cdf0e10cSrcweir rX1 = Min( nNewStartX, nOldStartX ); 543*cdf0e10cSrcweir rX2 = Max( nNewStartX, nOldStartX ) - 1; 544*cdf0e10cSrcweir rCont = sal_True; 545*cdf0e10cSrcweir nContX1 = Min( nNewEndX, nOldEndX ) + 1; 546*cdf0e10cSrcweir nContX2 = Max( nNewEndX, nOldEndX ); 547*cdf0e10cSrcweir nContY1 = rY1; 548*cdf0e10cSrcweir nContY2 = rY2; 549*cdf0e10cSrcweir } 550*cdf0e10cSrcweir } 551*cdf0e10cSrcweir else if (nNewEndX == nOldEndX && nNewEndY == nOldEndY) // links oben 552*cdf0e10cSrcweir { 553*cdf0e10cSrcweir if ((nNewStartX<nOldStartX) == (nNewStartY<nOldStartY)) 554*cdf0e10cSrcweir rX1 = Min( nNewStartX, nOldStartX ); 555*cdf0e10cSrcweir else 556*cdf0e10cSrcweir rX1 = Max( nNewStartX, nOldStartX ); // Ecke weglassen 557*cdf0e10cSrcweir rX2 = nOldEndX; 558*cdf0e10cSrcweir rY1 = Min( nNewStartY, nOldStartY ); // oben 559*cdf0e10cSrcweir rY2 = Max( nNewStartY, nOldStartY ) - 1; 560*cdf0e10cSrcweir rCont = sal_True; 561*cdf0e10cSrcweir nContY1 = rY2+1; 562*cdf0e10cSrcweir nContY2 = nOldEndY; 563*cdf0e10cSrcweir nContX1 = Min( nNewStartX, nOldStartX ); // links 564*cdf0e10cSrcweir nContX2 = Max( nNewStartX, nOldStartX ) - 1; 565*cdf0e10cSrcweir } 566*cdf0e10cSrcweir else if (nNewStartX == nOldStartX && nNewEndY == nOldEndY) // rechts oben 567*cdf0e10cSrcweir { 568*cdf0e10cSrcweir if ((nNewEndX<nOldEndX) != (nNewStartY<nOldStartY)) 569*cdf0e10cSrcweir rX2 = Max( nNewEndX, nOldEndX ); 570*cdf0e10cSrcweir else 571*cdf0e10cSrcweir rX2 = Min( nNewEndX, nOldEndX ); // Ecke weglassen 572*cdf0e10cSrcweir rX1 = nOldStartX; 573*cdf0e10cSrcweir rY1 = Min( nNewStartY, nOldStartY ); // oben 574*cdf0e10cSrcweir rY2 = Max( nNewStartY, nOldStartY ) - 1; 575*cdf0e10cSrcweir rCont = sal_True; 576*cdf0e10cSrcweir nContY1 = rY2+1; 577*cdf0e10cSrcweir nContY2 = nOldEndY; 578*cdf0e10cSrcweir nContX1 = Min( nNewEndX, nOldEndX ) + 1; // rechts 579*cdf0e10cSrcweir nContX2 = Max( nNewEndX, nOldEndX ); 580*cdf0e10cSrcweir } 581*cdf0e10cSrcweir else if (nNewEndX == nOldEndX && nNewStartY == nOldStartY) // links unten 582*cdf0e10cSrcweir { 583*cdf0e10cSrcweir if ((nNewStartX<nOldStartX) != (nNewEndY<nOldEndY)) 584*cdf0e10cSrcweir rX1 = Min( nNewStartX, nOldStartX ); 585*cdf0e10cSrcweir else 586*cdf0e10cSrcweir rX1 = Max( nNewStartX, nOldStartX ); // Ecke weglassen 587*cdf0e10cSrcweir rX2 = nOldEndX; 588*cdf0e10cSrcweir rY1 = Min( nNewEndY, nOldEndY ) + 1; // unten 589*cdf0e10cSrcweir rY2 = Max( nNewEndY, nOldEndY ); 590*cdf0e10cSrcweir rCont = sal_True; 591*cdf0e10cSrcweir nContY1 = nOldStartY; 592*cdf0e10cSrcweir nContY2 = rY1-1; 593*cdf0e10cSrcweir nContX1 = Min( nNewStartX, nOldStartX ); // links 594*cdf0e10cSrcweir nContX2 = Max( nNewStartX, nOldStartX ) - 1; 595*cdf0e10cSrcweir } 596*cdf0e10cSrcweir else if (nNewStartX == nOldStartX && nNewStartY == nOldStartY) // rechts unten 597*cdf0e10cSrcweir { 598*cdf0e10cSrcweir if ((nNewEndX<nOldEndX) == (nNewEndY<nOldEndY)) 599*cdf0e10cSrcweir rX2 = Max( nNewEndX, nOldEndX ); 600*cdf0e10cSrcweir else 601*cdf0e10cSrcweir rX2 = Min( nNewEndX, nOldEndX ); // Ecke weglassen 602*cdf0e10cSrcweir rX1 = nOldStartX; 603*cdf0e10cSrcweir rY1 = Min( nNewEndY, nOldEndY ) + 1; // unten 604*cdf0e10cSrcweir rY2 = Max( nNewEndY, nOldEndY ); 605*cdf0e10cSrcweir rCont = sal_True; 606*cdf0e10cSrcweir nContY1 = nOldStartY; 607*cdf0e10cSrcweir nContY2 = rY1-1; 608*cdf0e10cSrcweir nContX1 = Min( nNewEndX, nOldEndX ) + 1; // rechts 609*cdf0e10cSrcweir nContX2 = Max( nNewEndX, nOldEndX ); 610*cdf0e10cSrcweir } 611*cdf0e10cSrcweir else // Ueberschlag 612*cdf0e10cSrcweir { 613*cdf0e10cSrcweir rX1 = nOldStartX; 614*cdf0e10cSrcweir rY1 = nOldStartY; 615*cdf0e10cSrcweir rX2 = nOldEndX; 616*cdf0e10cSrcweir rY2 = nOldEndY; 617*cdf0e10cSrcweir rCont = sal_True; 618*cdf0e10cSrcweir nContX1 = nNewStartX; 619*cdf0e10cSrcweir nContY1 = nNewStartY; 620*cdf0e10cSrcweir nContX2 = nNewEndX; 621*cdf0e10cSrcweir nContY2 = nNewEndY; 622*cdf0e10cSrcweir } 623*cdf0e10cSrcweir 624*cdf0e10cSrcweir return sal_True; 625*cdf0e10cSrcweir } 626*cdf0e10cSrcweir 627*cdf0e10cSrcweir void ScUpdateRect::GetContDiff( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2 ) 628*cdf0e10cSrcweir { 629*cdf0e10cSrcweir rX1 = nContX1; 630*cdf0e10cSrcweir rY1 = nContY1; 631*cdf0e10cSrcweir rX2 = nContX2; 632*cdf0e10cSrcweir rY2 = nContY2; 633*cdf0e10cSrcweir } 634*cdf0e10cSrcweir #endif 635*cdf0e10cSrcweir 636*cdf0e10cSrcweir 637*cdf0e10cSrcweir 638*cdf0e10cSrcweir 639*cdf0e10cSrcweir 640*cdf0e10cSrcweir 641