blob: dae5502bd337b6da992ab4cf49262e8c0ac75f1f [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the 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() || pNewPref->getBrowseMode() );
}
//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, sal_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
sal_Bool bReadonly;
const SwDocShell* pDocSh = pCurrView->GetDocShell();
if (pDocSh)
bReadonly = pDocSh->IsReadOnly();
else //Use existing option if DocShell missing
bReadonly = pSh->GetViewOptions()->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);
delete pViewOpt;
}
/* -----------------------------28.09.00 12:36--------------------------------
---------------------------------------------------------------------------*/
void SwModule::ApplyUserMetric( FieldUnit eMetric, sal_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, sal_Bool bHorizontal, sal_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(sal_True);
}
else if(!bWeb && !pPrtOpt)
{
pPrtOpt = new SwPrintOptions(sal_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, sal_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->GetCurrentViewShell() ) //swmod 071108//swmod 071225
{
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);
}