diff options
Diffstat (limited to 'sw/source/ui/app/swmodul1.cxx')
-rw-r--r-- | sw/source/ui/app/swmodul1.cxx | 675 |
1 files changed, 675 insertions, 0 deletions
diff --git a/sw/source/ui/app/swmodul1.cxx b/sw/source/ui/app/swmodul1.cxx new file mode 100644 index 000000000000..2b3a5df1391b --- /dev/null +++ b/sw/source/ui/app/swmodul1.cxx @@ -0,0 +1,675 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" + + +#include <hintids.hxx> +#include <sfx2/request.hxx> +#include <sfx2/dispatch.hxx> +#include <sfx2/childwin.hxx> +#include <unotools/useroptions.hxx> +#include <cppuhelper/weak.hxx> +#include <com/sun/star/frame/FrameSearchFlag.hpp> +#include <com/sun/star/view/XSelectionSupplier.hpp> +#include <cppuhelper/implbase1.hxx> // helper for implementations +#include <svx/dataaccessdescriptor.hxx> +#include <editeng/wghtitem.hxx> +#include <editeng/postitem.hxx> +#include <editeng/udlnitem.hxx> +#include <editeng/crsditem.hxx> +#include <editeng/cmapitem.hxx> +#include <editeng/colritem.hxx> +#include <editeng/brshitem.hxx> +#include <vcl/msgbox.hxx> +#include <swmodule.hxx> +#include <swtypes.hxx> +#include <usrpref.hxx> +#include <modcfg.hxx> +#include <view.hxx> +#include <pview.hxx> +#include <wview.hxx> +#include <wrtsh.hxx> +#include <docsh.hxx> +#include <dbmgr.hxx> +#include <uinums.hxx> +#include <prtopt.hxx> // fuer PrintOptions +#include <navicfg.hxx> +#include <doc.hxx> +#include <cmdid.h> +#include <app.hrc> +#include "helpid.h" + +#include <unomid.h> +#include <tools/color.hxx> +#include "PostItMgr.hxx" + +using ::rtl::OUString; +using namespace ::svx; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::frame; +using namespace ::com::sun::star::view; +using namespace ::com::sun::star::lang; + + +/*-----------------08/28/97 08:41pm----------------- + +--------------------------------------------------*/ +void lcl_SetUIPrefs(const SwViewOption* pPref, SwView* pView, ViewShell* pSh ) +{ + // in FrameSets kann die tatsaechliche Sichtbarkeit von der Einstellung der ViewOptions abweichen + sal_Bool bVScrollChanged = pPref->IsViewVScrollBar() != pSh->GetViewOptions()->IsViewVScrollBar(); + sal_Bool bHScrollChanged = pPref->IsViewHScrollBar() != pSh->GetViewOptions()->IsViewHScrollBar(); + sal_Bool bVAlignChanged = pPref->IsVRulerRight() != pSh->GetViewOptions()->IsVRulerRight(); + + pSh->SetUIOptions(*pPref); + const SwViewOption* pNewPref = pSh->GetViewOptions(); + + // Scrollbars an / aus + if(bVScrollChanged) + { + pView->ShowVScrollbar(pNewPref->IsViewVScrollBar()); + } + if(bHScrollChanged) + { + pView->ShowHScrollbar( pNewPref->IsViewHScrollBar() || pSh->getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE)); + } + //if only the position of the vertical ruler has been changed initiate an update + if(bVAlignChanged && !bHScrollChanged && !bVScrollChanged) + pView->InvalidateBorder(); + + // Lineale an / aus + if(pNewPref->IsViewVRuler()) + pView->CreateVLineal(); + else + pView->KillVLineal(); + + // TabWindow an/aus + if(pNewPref->IsViewHRuler()) + pView->CreateTab(); + else + pView->KillTab(); + + pView->GetPostItMgr()->PrepareView(true); +} + +/*-------------------------------------------------------------------- + Beschreibung: Aktuelle SwWrtShell + --------------------------------------------------------------------*/ + + +SwWrtShell* GetActiveWrtShell() +{ + SwView *pActive = ::GetActiveView(); + if( pActive ) + return &pActive->GetWrtShell(); + return 0; +} + +/*-------------------------------------------------------------------- + Beschreibung: Pointer auf die aktuelle Sicht + --------------------------------------------------------------------*/ + + +SwView* GetActiveView() +{ + SfxViewShell* pView = SfxViewShell::Current(); + return PTR_CAST( SwView, pView ); +} +/*-------------------------------------------------------------------- + Beschreibung: Ueber Views iterieren - static + --------------------------------------------------------------------*/ + +SwView* SwModule::GetFirstView() +{ + // liefert nur sichtbare SwViews + const TypeId aTypeId = TYPE(SwView); + SwView* pView = (SwView*)SfxViewShell::GetFirst(&aTypeId); + return pView; +} + + +SwView* SwModule::GetNextView(SwView* pView) +{ + DBG_ASSERT(PTR_CAST(SwView, pView),"keine SwView uebergeben"); + const TypeId aTypeId = TYPE(SwView); + SwView* pNView = (SwView*)SfxViewShell::GetNext(*pView, &aTypeId, TRUE); + return pNView; +} + +/*------------------------------------------------------------------------ + Beschreibung: Neuer Master fuer die Einstellungen wird gesetzt; + dieser wirkt sich auf die aktuelle Sicht und alle + folgenden aus. +------------------------------------------------------------------------*/ + +void SwModule::ApplyUsrPref(const SwViewOption &rUsrPref, SwView* pActView, + sal_uInt16 nDest ) +{ + SwView* pCurrView = pActView; + ViewShell* pSh = pCurrView ? &pCurrView->GetWrtShell() : 0; + + SwMasterUsrPref* pPref = (SwMasterUsrPref*)GetUsrPref( static_cast< sal_Bool >( + VIEWOPT_DEST_WEB == nDest ? sal_True : + VIEWOPT_DEST_TEXT== nDest ? sal_False : + pCurrView && pCurrView->ISA(SwWebView) )); + + //per Uno soll nur die sdbcx::View, aber nicht das Module veraendert werden + sal_Bool bViewOnly = VIEWOPT_DEST_VIEW_ONLY == nDest; + //PreView abfruehstuecken + SwPagePreView* pPPView; + if( !pCurrView && 0 != (pPPView = PTR_CAST( SwPagePreView, SfxViewShell::Current())) ) + { + if(!bViewOnly) + pPref->SetUIOptions( rUsrPref ); + pPPView->ShowVScrollbar(pPref->IsViewVScrollBar()); + pPPView->ShowHScrollbar(pPref->IsViewHScrollBar()); + if(!bViewOnly) + { + pPref->SetPagePrevRow(rUsrPref.GetPagePrevRow()); + pPref->SetPagePrevCol(rUsrPref.GetPagePrevCol()); + } + return; + } + + if(!bViewOnly) + { + pPref->SetUsrPref( rUsrPref ); + pPref->SetModified(); + } + + if( !pCurrView ) + return; + + // Weitergabe an die CORE + const sal_Bool bReadonly = pCurrView->GetDocShell()->IsReadOnly(); + SwViewOption* pViewOpt; + if(!bViewOnly) + pViewOpt = new SwViewOption( *pPref ); + else + pViewOpt = new SwViewOption( rUsrPref ); + pViewOpt->SetReadonly( bReadonly ); + if( !(*pSh->GetViewOptions() == *pViewOpt) ) + { + //Ist evtl. nur eine ViewShell + pSh->StartAction(); + pSh->ApplyViewOptions( *pViewOpt ); + ((SwWrtShell*)pSh)->SetReadOnlyAvailable(pViewOpt->IsCursorInProtectedArea()); + pSh->EndAction(); + } + if ( pSh->GetViewOptions()->IsReadonly() != bReadonly ) + pSh->SetReadonlyOption(bReadonly); + + lcl_SetUIPrefs(pViewOpt, pCurrView, pSh); + + // zum Schluss wird das Idle-Flag wieder gesetzt + // #42510# + pPref->SetIdle(sal_True); +} +/* -----------------------------28.09.00 12:36-------------------------------- + + ---------------------------------------------------------------------------*/ +void SwModule::ApplyUserMetric( FieldUnit eMetric, BOOL bWeb ) +{ + SwMasterUsrPref* pPref; + if(bWeb) + { + if(!pWebUsrPref) + GetUsrPref(sal_True); + pPref = pWebUsrPref; + } + else + { + if(!pUsrPref) + GetUsrPref(sal_False); + pPref = pUsrPref; + } + FieldUnit eOldMetric = pPref->GetMetric(); + if(eOldMetric != eMetric) + pPref->SetMetric(eMetric); + + FieldUnit eHScrollMetric = pPref->IsHScrollMetric() ? pPref->GetHScrollMetric() : eMetric; + FieldUnit eVScrollMetric = pPref->IsVScrollMetric() ? pPref->GetVScrollMetric() : eMetric; + + SwView* pTmpView = SwModule::GetFirstView(); + // fuer alle MDI-Fenster das Lineal umschalten + while(pTmpView) + { + if(bWeb == (0 != PTR_CAST(SwWebView, pTmpView))) + { + pTmpView->ChangeVLinealMetric(eVScrollMetric); + pTmpView->ChangeTabMetric(eHScrollMetric); + } + + pTmpView = SwModule::GetNextView(pTmpView); + } +} +/*-- 12.11.2008 14:47:58--------------------------------------------------- + + -----------------------------------------------------------------------*/ +void SwModule::ApplyRulerMetric( FieldUnit eMetric, BOOL bHorizontal, BOOL bWeb ) +{ + SwMasterUsrPref* pPref; + if(bWeb) + { + if(!pWebUsrPref) + GetUsrPref(sal_True); + pPref = pWebUsrPref; + } + else + { + if(!pUsrPref) + GetUsrPref(sal_False); + pPref = pUsrPref; + } + if( bHorizontal ) + pPref->SetHScrollMetric(eMetric); + else + pPref->SetVScrollMetric(eMetric); + + SwView* pTmpView = SwModule::GetFirstView(); + // switch metric at the appropriate rulers + while(pTmpView) + { + if(bWeb == (0 != dynamic_cast<SwWebView *>( pTmpView ))) + { + if( bHorizontal ) + pTmpView->ChangeTabMetric(eMetric); + else + pTmpView->ChangeVLinealMetric(eMetric); + } + pTmpView = SwModule::GetNextView(pTmpView); + } +} +/*-----------------13.11.96 11.57------------------- + +--------------------------------------------------*/ + +SwNavigationConfig* SwModule::GetNavigationConfig() +{ + if(!pNavigationConfig) + { + pNavigationConfig = new SwNavigationConfig; + } + return pNavigationConfig; +} + +/*-----------------05.02.97 08.03------------------- + +--------------------------------------------------*/ + +SwPrintOptions* SwModule::GetPrtOptions(sal_Bool bWeb) +{ + if(bWeb && !pWebPrtOpt) + { + pWebPrtOpt = new SwPrintOptions(TRUE); + } + else if(!bWeb && !pPrtOpt) + { + pPrtOpt = new SwPrintOptions(FALSE); + } + + return bWeb ? pWebPrtOpt : pPrtOpt; +} + +/*-----------------26.06.97 07.52------------------- + +--------------------------------------------------*/ +SwChapterNumRules* SwModule::GetChapterNumRules() +{ + if(!pChapterNumRules) + pChapterNumRules = new SwChapterNumRules; + return pChapterNumRules; +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +void SwModule::ShowDBObj(SwView& rView, const SwDBData& rData, BOOL /*bOnlyIfAvailable*/) +{ + Reference<XFrame> xFrame = rView.GetViewFrame()->GetFrame().GetFrameInterface(); + Reference<XDispatchProvider> xDP(xFrame, uno::UNO_QUERY); + + uno::Reference<frame::XFrame> xBeamerFrame = xFrame->findFrame( + rtl::OUString::createFromAscii("_beamer"), + FrameSearchFlag::CHILDREN); + if (xBeamerFrame.is()) + { // the beamer has been opened by the SfxViewFrame + Reference<XController> xController = xBeamerFrame->getController(); + Reference<XSelectionSupplier> xControllerSelection(xController, UNO_QUERY); + if (xControllerSelection.is()) + { + + ODataAccessDescriptor aSelection; + aSelection.setDataSource(rData.sDataSource); + aSelection[daCommand] <<= rData.sCommand; + aSelection[daCommandType] <<= rData.nCommandType; + xControllerSelection->select(makeAny(aSelection.createPropertyValueSequence())); + } + else { + DBG_ERROR("no selection supplier in the beamer!"); + } + } +} +/*-------------------------------------------------------------------- + Beschreibung: Redlining + --------------------------------------------------------------------*/ + +sal_uInt16 SwModule::GetRedlineAuthor() +{ + if (!bAuthorInitialised) + { + const SvtUserOptions& rOpt = GetUserOptions(); + if( !(sActAuthor = rOpt.GetFullName()).Len() ) + if( !(sActAuthor = rOpt.GetID()).Len() ) + sActAuthor = String( SW_RES( STR_REDLINE_UNKNOWN_AUTHOR )); + bAuthorInitialised = sal_True; + } + return InsertRedlineAuthor( sActAuthor ); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +const String& SwModule::GetRedlineAuthor(sal_uInt16 nPos) +{ + DBG_ASSERT(nPos<pAuthorNames->Count(), "author not found!"); //#i45342# RTF doc with no author table caused reader to crash + while (!(nPos<pAuthorNames->Count())) + { + InsertRedlineAuthor(String(RTL_CONSTASCII_USTRINGPARAM("nn"))); + }; + return *pAuthorNames->GetObject(nPos); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +sal_uInt16 SwModule::InsertRedlineAuthor(const String& rAuthor) +{ + sal_uInt16 nPos = 0; + + while (nPos < pAuthorNames->Count() && *pAuthorNames->GetObject(nPos) != rAuthor) + nPos++; + + if (nPos == pAuthorNames->Count()) + pAuthorNames->Insert(new String(rAuthor), nPos); + + return nPos; +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +void lcl_FillAuthorAttr( sal_uInt16 nAuthor, SfxItemSet &rSet, + const AuthorCharAttr &rAttr ) +{ + Color aCol( rAttr.nColor ); + + if( COL_TRANSPARENT == rAttr.nColor ) + { + static const ColorData aColArr[] = { + COL_AUTHOR1_DARK, COL_AUTHOR2_DARK, COL_AUTHOR3_DARK, + COL_AUTHOR4_DARK, COL_AUTHOR5_DARK, COL_AUTHOR6_DARK, + COL_AUTHOR7_DARK, COL_AUTHOR8_DARK, COL_AUTHOR9_DARK }; + + aCol.SetColor( aColArr[ nAuthor % (sizeof( aColArr ) / + sizeof( aColArr[0] )) ] ); + } + + sal_Bool bBackGr = COL_NONE == rAttr.nColor; + + switch (rAttr.nItemId) + { + case SID_ATTR_CHAR_WEIGHT: + { + SvxWeightItem aW( (FontWeight)rAttr.nAttr, RES_CHRATR_WEIGHT ); + rSet.Put( aW ); + aW.SetWhich( RES_CHRATR_CJK_WEIGHT ); + rSet.Put( aW ); + aW.SetWhich( RES_CHRATR_CTL_WEIGHT ); + rSet.Put( aW ); + } + break; + + case SID_ATTR_CHAR_POSTURE: + { + SvxPostureItem aP( (FontItalic)rAttr.nAttr, RES_CHRATR_POSTURE ); + rSet.Put( aP ); + aP.SetWhich( RES_CHRATR_CJK_POSTURE ); + rSet.Put( aP ); + aP.SetWhich( RES_CHRATR_CTL_POSTURE ); + rSet.Put( aP ); + } + break; + + case SID_ATTR_CHAR_UNDERLINE: + rSet.Put( SvxUnderlineItem( (FontUnderline)rAttr.nAttr, + RES_CHRATR_UNDERLINE)); + break; + + case SID_ATTR_CHAR_STRIKEOUT: + rSet.Put(SvxCrossedOutItem( (FontStrikeout)rAttr.nAttr, + RES_CHRATR_CROSSEDOUT)); + break; + + case SID_ATTR_CHAR_CASEMAP: + rSet.Put( SvxCaseMapItem( (SvxCaseMap)rAttr.nAttr, + RES_CHRATR_CASEMAP)); + break; + + case SID_ATTR_BRUSH: + rSet.Put( SvxBrushItem( aCol, RES_CHRATR_BACKGROUND )); + bBackGr = sal_True; + break; + } + + if( !bBackGr ) + rSet.Put( SvxColorItem( aCol, RES_CHRATR_COLOR ) ); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +void SwModule::GetInsertAuthorAttr(sal_uInt16 nAuthor, SfxItemSet &rSet) +{ + lcl_FillAuthorAttr(nAuthor, rSet, pModuleConfig->GetInsertAuthorAttr()); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +void SwModule::GetDeletedAuthorAttr(sal_uInt16 nAuthor, SfxItemSet &rSet) +{ + lcl_FillAuthorAttr(nAuthor, rSet, pModuleConfig->GetDeletedAuthorAttr()); +} + +/*-------------------------------------------------------------------- + Beschreibung: Fuer zukuenftige Erweiterung: + --------------------------------------------------------------------*/ + +void SwModule::GetFormatAuthorAttr( sal_uInt16 nAuthor, SfxItemSet &rSet ) +{ + lcl_FillAuthorAttr( nAuthor, rSet, pModuleConfig->GetFormatAuthorAttr() ); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +sal_uInt16 SwModule::GetRedlineMarkPos() +{ + return pModuleConfig->GetMarkAlignMode(); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +sal_Bool SwModule::IsInsTblFormatNum(sal_Bool bHTML) const +{ + return pModuleConfig->IsInsTblFormatNum(bHTML); +} + +sal_Bool SwModule::IsInsTblChangeNumFormat(sal_Bool bHTML) const +{ + return pModuleConfig->IsInsTblChangeNumFormat(bHTML); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +sal_Bool SwModule::IsInsTblAlignNum(sal_Bool bHTML) const +{ + return pModuleConfig->IsInsTblAlignNum(bHTML); +} + +/*-------------------------------------------------------------------- + Beschreibung: + --------------------------------------------------------------------*/ + +const Color &SwModule::GetRedlineMarkColor() +{ + return pModuleConfig->GetMarkAlignColor(); +} + +/*-----------------03.03.98 16:47------------------- + +--------------------------------------------------*/ +const SwViewOption* SwModule::GetViewOption(sal_Bool bWeb) +{ + return GetUsrPref( bWeb ); +} + +// returne den definierten DocStat - WordDelimiter +const String& SwModule::GetDocStatWordDelim() const +{ + return pModuleConfig->GetWordDelimiter(); +} +/* --------------------------------------------------------------------------- + + ---------------------------------------------------------------------------*/ +// Durchreichen der Metric von der ModuleConfig (fuer HTML-Export) +sal_uInt16 SwModule::GetMetric( sal_Bool bWeb ) const +{ + SwMasterUsrPref* pPref; + if(bWeb) + { + if(!pWebUsrPref) + GetUsrPref(sal_True); + pPref = pWebUsrPref; + } + else + { + if(!pUsrPref) + GetUsrPref(sal_False); + pPref = pUsrPref; + } + return static_cast< sal_uInt16 >(pPref->GetMetric()); +} +/* --------------------------------------------------------------------------- + + ---------------------------------------------------------------------------*/ +// Update-Stati durchreichen +sal_uInt16 SwModule::GetLinkUpdMode( sal_Bool ) const +{ + if(!pUsrPref) + GetUsrPref(sal_False); + return (sal_uInt16)pUsrPref->GetUpdateLinkMode(); +} +/* --------------------------------------------------------------------------- + + ---------------------------------------------------------------------------*/ +SwFldUpdateFlags SwModule::GetFldUpdateFlags( sal_Bool ) const +{ + if(!pUsrPref) + GetUsrPref(sal_False); + return pUsrPref->GetFldUpdateFlags(); +} +/* -----------------------------28.09.00 14:18-------------------------------- + + ---------------------------------------------------------------------------*/ +void SwModule::ApplyFldUpdateFlags(SwFldUpdateFlags eFldFlags) +{ + if(!pUsrPref) + GetUsrPref(sal_False); + pUsrPref->SetFldUpdateFlags(eFldFlags); +} +/* -----------------------------28.09.00 14:18-------------------------------- + + ---------------------------------------------------------------------------*/ +void SwModule::ApplyLinkMode(sal_Int32 nNewLinkMode) +{ + if(!pUsrPref) + GetUsrPref(sal_False); + pUsrPref->SetUpdateLinkMode(nNewLinkMode); +} +/* --------------------------------------------------------------------------- + + ---------------------------------------------------------------------------*/ +void SwModule::CheckSpellChanges( sal_Bool bOnlineSpelling, + sal_Bool bIsSpellWrongAgain, sal_Bool bIsSpellAllAgain, sal_Bool bSmartTags ) +{ + sal_Bool bOnlyWrong = bIsSpellWrongAgain && !bIsSpellAllAgain; + sal_Bool bInvalid = bOnlyWrong || bIsSpellAllAgain; + if( bOnlineSpelling || bInvalid ) + { + TypeId aType = TYPE(SwDocShell); + for( SwDocShell *pDocSh = (SwDocShell*)SfxObjectShell::GetFirst(&aType); + pDocSh; + pDocSh = (SwDocShell*)SfxObjectShell::GetNext( *pDocSh, &aType ) ) + { + SwDoc* pTmp = pDocSh->GetDoc(); + if ( pTmp->GetRootFrm() ) + { + pTmp->SpellItAgainSam( bInvalid, bOnlyWrong, bSmartTags ); + ViewShell* pViewShell = 0; + pTmp->GetEditShell( &pViewShell ); + if ( bSmartTags && pViewShell && pViewShell->GetWin() ) + pViewShell->GetWin()->Invalidate(); + } + } +// pSpell->SetSpellWrongAgain( sal_False ); +// pSpell->SetSpellAllAgain( sal_False ); + } +} + +void SwModule::ApplyDefaultPageMode(sal_Bool bIsSquaredPageMode) +{ + if(!pUsrPref) + GetUsrPref(sal_False); + pUsrPref->SetDefaultPageMode(bIsSquaredPageMode); +} |