LCOV - code coverage report
Current view: top level - starmath/source - document.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 405 653 62.0 %
Date: 2015-06-13 12:38:46 Functions: 46 62 74.2 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <com/sun/star/accessibility/AccessibleEventId.hpp>
      21             : #include <com/sun/star/lang/Locale.hpp>
      22             : #include <com/sun/star/uno/Any.h>
      23             : 
      24             : #include <comphelper/accessibletexthelper.hxx>
      25             : #include <comphelper/processfactory.hxx>
      26             : #include <comphelper/storagehelper.hxx>
      27             : #include <rtl/ustrbuf.hxx>
      28             : #include <rtl/ustring.hxx>
      29             : #include <unotools/eventcfg.hxx>
      30             : #include <sfx2/event.hxx>
      31             : #include <sfx2/app.hxx>
      32             : #include <sfx2/dispatch.hxx>
      33             : #include <sfx2/docfile.hxx>
      34             : #include <sfx2/docfilt.hxx>
      35             : #include <sfx2/fcontnr.hxx>
      36             : #include <sfx2/msg.hxx>
      37             : #include <sfx2/objface.hxx>
      38             : #include <sfx2/printer.hxx>
      39             : #include <sfx2/request.hxx>
      40             : #include <sfx2/viewfrm.hxx>
      41             : #include <comphelper/classids.hxx>
      42             : #include <sot/exchange.hxx>
      43             : #include <sot/formats.hxx>
      44             : #include <sot/storage.hxx>
      45             : #include <svl/eitem.hxx>
      46             : #include <svl/fstathelper.hxx>
      47             : #include <svl/intitem.hxx>
      48             : #include <svl/itempool.hxx>
      49             : #include <unotools/lingucfg.hxx>
      50             : #include <unotools/linguprops.hxx>
      51             : #include <unotools/pathoptions.hxx>
      52             : #include <svl/ptitem.hxx>
      53             : #include <svtools/sfxecode.hxx>
      54             : #include <svl/slstitm.hxx>
      55             : #include <svl/smplhint.hxx>
      56             : #include <svl/stritem.hxx>
      57             : #include <svtools/transfer.hxx>
      58             : #include <svl/undo.hxx>
      59             : #include <svl/urihelper.hxx>
      60             : #include <svl/whiter.hxx>
      61             : #include <editeng/editeng.hxx>
      62             : #include <editeng/editstat.hxx>
      63             : #include <editeng/eeitem.hxx>
      64             : #include <editeng/fhgtitem.hxx>
      65             : #include <editeng/fontitem.hxx>
      66             : #include <editeng/unolingu.hxx>
      67             : #include <ucbhelper/content.hxx>
      68             : #include <vcl/mapmod.hxx>
      69             : #include <tools/mapunit.hxx>
      70             : #include <vcl/msgbox.hxx>
      71             : #include <vcl/settings.hxx>
      72             : 
      73             : #include <sfx2/sfx.hrc>
      74             : #include <document.hxx>
      75             : #include <action.hxx>
      76             : #include <dialog.hxx>
      77             : #include <format.hxx>
      78             : #include <smdll.hxx>
      79             : #include <starmath.hrc>
      80             : #include <symbol.hxx>
      81             : #include <unomodel.hxx>
      82             : #include <utility.hxx>
      83             : #include <view.hxx>
      84             : #include "mathtype.hxx"
      85             : #include "ooxmlexport.hxx"
      86             : #include "ooxmlimport.hxx"
      87             : #include "rtfexport.hxx"
      88             : #include "mathmlimport.hxx"
      89             : #include "mathmlexport.hxx"
      90             : #include <sfx2/sfxsids.hrc>
      91             : #include <svx/svxids.hrc>
      92             : #include "cursor.hxx"
      93             : #include <tools/diagnose_ex.h>
      94             : #include "visitors.hxx"
      95             : #include "accessibility.hxx"
      96             : #include "cfgitem.hxx"
      97             : #include <memory>
      98             : 
      99             : using namespace ::com::sun::star;
     100             : using namespace ::com::sun::star::accessibility;
     101             : using namespace ::com::sun::star::lang;
     102             : using namespace ::com::sun::star::ucb;
     103             : using namespace ::com::sun::star::uno;
     104             : 
     105             : #define SmDocShell
     106             : #include "smslots.hxx"
     107             : 
     108       10344 : TYPEINIT1( SmDocShell, SfxObjectShell );
     109             : 
     110        1030 : SFX_IMPL_SUPERCLASS_INTERFACE(SmDocShell, SfxObjectShell)
     111             : 
     112          14 : void SmDocShell::InitInterface_Impl()
     113             : {
     114          14 :     GetStaticInterface()->RegisterPopupMenu(SmResId(RID_VIEWMENU));
     115          14 :     GetStaticInterface()->RegisterPopupMenu(SmResId(RID_COMMANDMENU));
     116          14 : }
     117             : 
     118       10043 : SFX_IMPL_OBJECTFACTORY(SmDocShell, SvGlobalName(SO3_SM_CLASSID), SfxObjectShellFlags::STD_NORMAL, "smath" )
     119             : 
     120           0 : void SmDocShell::SFX_NOTIFY(SfxBroadcaster&, const TypeId&,
     121             :                     const SfxHint& rHint, const TypeId&)
     122             : {
     123           0 :     switch (static_cast<const SfxSimpleHint&>(rHint).GetId())
     124             :     {
     125             :         case HINT_FORMATCHANGED:
     126           0 :             SetFormulaArranged(false);
     127             : 
     128           0 :             nModifyCount++;     //! see comment for SID_GAPHIC_SM in SmDocShell::GetState
     129             : 
     130           0 :             Repaint();
     131           0 :             break;
     132             :     }
     133           0 : }
     134             : 
     135           0 : void SmDocShell::LoadSymbols()
     136             : {
     137           0 :     SmModule *pp = SM_MOD();
     138           0 :     pp->GetSymbolManager().Load();
     139           0 : }
     140             : 
     141             : 
     142           0 : const OUString SmDocShell::GetComment() const
     143             : {
     144             :     uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
     145           0 :         GetModel(), uno::UNO_QUERY_THROW);
     146             :     uno::Reference<document::XDocumentProperties> xDocProps(
     147           0 :         xDPS->getDocumentProperties());
     148           0 :     return xDocProps->getDescription();
     149             : }
     150             : 
     151             : 
     152         309 : void SmDocShell::SetText(const OUString& rBuffer)
     153             : {
     154         309 :     if (rBuffer != aText)
     155             :     {
     156         292 :         bool bIsEnabled = IsEnableSetModified();
     157         292 :         if( bIsEnabled )
     158         287 :             EnableSetModified( false );
     159             : 
     160         292 :         aText = rBuffer;
     161         292 :         SetFormulaArranged( false );
     162             : 
     163         292 :         Parse();
     164             : 
     165         292 :         SmViewShell *pViewSh = SmGetActiveView();
     166         292 :         if( pViewSh )
     167             :         {
     168           6 :             pViewSh->GetViewFrame()->GetBindings().Invalidate(SID_TEXT);
     169           6 :             if ( SfxObjectCreateMode::EMBEDDED == GetCreateMode() )
     170             :             {
     171             :                 // have SwOleClient::FormatChanged() to align the modified formula properly
     172             :                 // even if the vis area does not change (e.g. when formula text changes from
     173             :                 // "{a over b + c} over d" to "d over {a over b + c}"
     174           0 :                 SfxGetpApp()->NotifyEvent(SfxEventHint( SFX_EVENT_VISAREACHANGED, GlobalEventConfig::GetEventName(GlobalEventId::VISAREACHANGED), this));
     175             : 
     176           0 :                 Repaint();
     177             :             }
     178             :             else
     179           6 :                 pViewSh->GetGraphicWindow().Invalidate();
     180             :         }
     181             : 
     182         292 :         if ( bIsEnabled )
     183         287 :             EnableSetModified( bIsEnabled );
     184         292 :         SetModified(true);
     185             : 
     186             :         // launch accessible event if necessary
     187         292 :         SmGraphicAccessible *pAcc = pViewSh ? pViewSh->GetGraphicWindow().GetAccessible_Impl() : 0;
     188         292 :         if (pAcc)
     189             :         {
     190           0 :             Any aOldValue, aNewValue;
     191           0 :             if ( comphelper::OCommonAccessibleText::implInitTextChangedEvent( aText, rBuffer, aOldValue, aNewValue ) )
     192             :             {
     193             :                 pAcc->LaunchEvent( AccessibleEventId::TEXT_CHANGED,
     194           0 :                         aOldValue, aNewValue );
     195           0 :             }
     196             :         }
     197             : 
     198         292 :         if ( GetCreateMode() == SfxObjectCreateMode::EMBEDDED )
     199         286 :             OnDocumentPrinterChanged(0);
     200             :     }
     201         309 : }
     202             : 
     203         178 : void SmDocShell::SetFormat(SmFormat& rFormat)
     204             : {
     205         178 :     aFormat = rFormat;
     206         178 :     SetFormulaArranged( false );
     207         178 :     SetModified( true );
     208             : 
     209         178 :     nModifyCount++;     //! see comment for SID_GAPHIC_SM in SmDocShell::GetState
     210             : 
     211             :     // don't use SmGetActiveView since the view shell might not be active (0 pointer)
     212             :     // if for example the Basic Macro dialog currently has the focus. Thus:
     213         178 :     SfxViewFrame* pFrm = SfxViewFrame::GetFirst( this );
     214         418 :     while (pFrm)
     215             :     {
     216          62 :         pFrm->GetBindings().Invalidate(SID_GAPHIC_SM);
     217          62 :         pFrm = SfxViewFrame::GetNext( *pFrm, this );
     218             :     }
     219         178 : }
     220             : 
     221           0 : OUString SmDocShell::GetAccessibleText()
     222             : {
     223           0 :     if (!IsFormulaArranged())
     224           0 :         ArrangeFormula();
     225           0 :     if (aAccText.isEmpty())
     226             :     {
     227             :         OSL_ENSURE( pTree, "Tree missing" );
     228           0 :         if (pTree)
     229             :         {
     230           0 :             OUStringBuffer aBuf;
     231           0 :             pTree->GetAccessibleText(aBuf);
     232           0 :             aAccText = aBuf.makeStringAndClear();
     233             :         }
     234             :     }
     235           0 :     return aAccText;
     236             : }
     237             : 
     238         333 : void SmDocShell::Parse()
     239             : {
     240         333 :     if (pTree)
     241          27 :         delete pTree;
     242         333 :     ReplaceBadChars();
     243         333 :     pTree = aInterpreter.Parse(aText);
     244         333 :     nModifyCount++;     //! see comment for SID_GAPHIC_SM in SmDocShell::GetState
     245         333 :     SetFormulaArranged( false );
     246         333 :     InvalidateCursor();
     247         333 :     aUsedSymbols = aInterpreter.GetUsedSymbols();
     248         333 : }
     249             : 
     250             : 
     251        1083 : void SmDocShell::ArrangeFormula()
     252             : {
     253        1083 :     if (IsFormulaArranged())
     254        1083 :         return;
     255             : 
     256             :     // Only for the duration of the existence of this object the correct settings
     257             :     // at the printer are guaranteed!
     258        1083 :     SmPrinterAccess  aPrtAcc(*this);
     259        1083 :     OutputDevice* pOutDev = aPrtAcc.GetRefDev();
     260             : 
     261             :     if (!pOutDev)
     262             :     {
     263             : #if OSL_DEBUG_LEVEL > 1
     264             :         SAL_WARN( "starmath", "!! SmDocShell::ArrangeFormula: reference device missing !!");
     265             : #endif
     266             :     }
     267             : 
     268             :     // if necessary get another OutputDevice for which we format
     269        1083 :     if (!pOutDev)
     270             :     {
     271         320 :         SmViewShell *pView = SmGetActiveView();
     272         320 :         if (pView)
     273           0 :             pOutDev = &pView->GetGraphicWindow();
     274             :         else
     275             :         {
     276         320 :             pOutDev = &SM_MOD()->GetDefaultVirtualDev();
     277         320 :             pOutDev->SetMapMode( MapMode(MAP_100TH_MM) );
     278             :         }
     279             :     }
     280             :     OSL_ENSURE(pOutDev->GetMapMode().GetMapUnit() == MAP_100TH_MM,
     281             :                "Sm : falscher MapMode");
     282             : 
     283        1083 :     const SmFormat &rFormat = GetFormat();
     284        1083 :     pTree->Prepare(rFormat, *this);
     285             : 
     286             :     // format/draw formulas always from left to right,
     287             :     // and numbers should not be converted
     288        1083 :     ComplexTextLayoutMode nLayoutMode = pOutDev->GetLayoutMode();
     289        1083 :     pOutDev->SetLayoutMode( TEXT_LAYOUT_DEFAULT );
     290        1083 :     sal_Int16 nDigitLang = pOutDev->GetDigitLanguage();
     291        1083 :     pOutDev->SetDigitLanguage( LANGUAGE_ENGLISH );
     292             : 
     293        1083 :     pTree->Arrange(*pOutDev, rFormat);
     294             : 
     295        1083 :     pOutDev->SetLayoutMode( nLayoutMode );
     296        1083 :     pOutDev->SetDigitLanguage( nDigitLang );
     297             : 
     298        1083 :     SetFormulaArranged(true);
     299             : 
     300             :     // invalidate accessible text
     301        1083 :     aAccText.clear();
     302             : }
     303             : 
     304             : 
     305          25 : void SetEditEngineDefaultFonts(SfxItemPool &rEditEngineItemPool)
     306             : {
     307             : 
     308             :         // set fonts to be used
     309             : 
     310          25 :         SvtLinguOptions aOpt;
     311          25 :         SvtLinguConfig().GetOptions( aOpt );
     312             : 
     313             :         struct FontDta {
     314             :             sal_Int16       nFallbackLang;
     315             :             sal_Int16       nLang;
     316             :             DefaultFontType nFontType;
     317             :             sal_uInt16      nFontInfoId;
     318             :             } aTable[3] =
     319             :         {
     320             :             // info to get western font to be used
     321             :             {   LANGUAGE_ENGLISH_US,    LANGUAGE_NONE,
     322             :                 DefaultFontType::FIXED,      EE_CHAR_FONTINFO },
     323             :             // info to get CJK font to be used
     324             :             {   LANGUAGE_JAPANESE,      LANGUAGE_NONE,
     325             :                 DefaultFontType::CJK_TEXT,   EE_CHAR_FONTINFO_CJK },
     326             :             // info to get CTL font to be used
     327             :             {   LANGUAGE_ARABIC_SAUDI_ARABIA,  LANGUAGE_NONE,
     328             :                 DefaultFontType::CTL_TEXT,   EE_CHAR_FONTINFO_CTL }
     329          25 :         };
     330          25 :         aTable[0].nLang = aOpt.nDefaultLanguage;
     331          25 :         aTable[1].nLang = aOpt.nDefaultLanguage_CJK;
     332          25 :         aTable[2].nLang = aOpt.nDefaultLanguage_CTL;
     333             : 
     334         100 :         for (int i = 0;  i < 3;  ++i)
     335             :         {
     336          75 :             const FontDta &rFntDta = aTable[i];
     337          75 :             LanguageType nLang = (LANGUAGE_NONE == rFntDta.nLang) ?
     338          75 :                     rFntDta.nFallbackLang : rFntDta.nLang;
     339             :             vcl::Font aFont = OutputDevice::GetDefaultFont(
     340          75 :                         rFntDta.nFontType, nLang, GetDefaultFontFlags::OnlyOne );
     341             :             rEditEngineItemPool.SetPoolDefaultItem(
     342          75 :                     SvxFontItem( aFont.GetFamily(), aFont.GetName(),
     343         150 :                         aFont.GetStyleName(), aFont.GetPitch(), aFont.GetCharSet(),
     344         225 :                         rFntDta.nFontInfoId ) );
     345          75 :         }
     346             : 
     347             :         // set font heights
     348             :         SvxFontHeightItem aFontHeigt(
     349             :                         Application::GetDefaultDevice()->LogicToPixel(
     350          75 :                         Size( 0, 11 ), MapMode( MAP_POINT ) ).Height(), 100,
     351          75 :                         EE_CHAR_FONTHEIGHT );
     352          25 :         rEditEngineItemPool.SetPoolDefaultItem( aFontHeigt );
     353          25 :         aFontHeigt.SetWhich( EE_CHAR_FONTHEIGHT_CJK );
     354          25 :         rEditEngineItemPool.SetPoolDefaultItem( aFontHeigt );
     355          25 :         aFontHeigt.SetWhich( EE_CHAR_FONTHEIGHT_CTL );
     356          50 :         rEditEngineItemPool.SetPoolDefaultItem( aFontHeigt );
     357          25 : }
     358             : 
     359             : 
     360          97 : EditEngine& SmDocShell::GetEditEngine()
     361             : {
     362          97 :     if (!pEditEngine)
     363             :     {
     364             :         //!
     365             :         //! see also SmEditWindow::DataChanged !
     366             :         //!
     367             : 
     368          25 :         pEditEngineItemPool = EditEngine::CreatePool();
     369             : 
     370          25 :         SetEditEngineDefaultFonts(*pEditEngineItemPool);
     371             : 
     372          25 :         pEditEngine = new EditEngine( pEditEngineItemPool );
     373             : 
     374          25 :         pEditEngine->EnableUndo( true );
     375             :         pEditEngine->SetDefTab( sal_uInt16(
     376          25 :             Application::GetDefaultDevice()->GetTextWidth(OUString("XXXX"))) );
     377             : 
     378             :         pEditEngine->SetControlWord(
     379             :                 (pEditEngine->GetControlWord() | EEControlBits::AUTOINDENTING) &
     380          50 :                 EEControlBits(~EEControlBits::UNDOATTRIBS) &
     381          75 :                 EEControlBits(~EEControlBits::PASTESPECIAL) );
     382             : 
     383          25 :         pEditEngine->SetWordDelimiters(" .=+-*/(){}[];\"");
     384          25 :         pEditEngine->SetRefMapMode( MAP_PIXEL );
     385             : 
     386          25 :         pEditEngine->SetPaperSize( Size( 800, 0 ) );
     387             : 
     388          25 :         pEditEngine->EraseVirtualDevice();
     389             : 
     390             :         // set initial text if the document already has some...
     391             :         // (may be the case when reloading a doc)
     392          25 :         OUString aTxt( GetText() );
     393          25 :         if (!aTxt.isEmpty())
     394           4 :             pEditEngine->SetText( aTxt );
     395             : 
     396          25 :         pEditEngine->ClearModifyFlag();
     397             : 
     398             :     }
     399          97 :     return *pEditEngine;
     400             : }
     401             : 
     402             : 
     403           0 : SfxItemPool& SmDocShell::GetEditEngineItemPool()
     404             : {
     405           0 :     if (!pEditEngineItemPool)
     406           0 :         GetEditEngine();
     407             :     assert(pEditEngineItemPool && "EditEngineItemPool missing");
     408           0 :     return *pEditEngineItemPool;
     409             : }
     410             : 
     411        4587 : void SmDocShell::DrawFormula(OutputDevice &rDev, Point &rPosition, bool bDrawSelection)
     412             : {
     413        4587 :     if (!pTree)
     414           0 :         Parse();
     415             :     OSL_ENSURE(pTree, "Sm : NULL pointer");
     416             : 
     417        4587 :     if (!IsFormulaArranged())
     418           4 :         ArrangeFormula();
     419             : 
     420             :     // Problem: What happens to WYSIWYG? While we're active inplace, we don't have a reference
     421             :     // device and aren't aligned to that either. So now there can be a difference between the
     422             :     // VisArea (i.e. the size within the client) and the current size.
     423             :     // Idea: The difference could be adapted with SmNod::SetSize (no long-term solution)
     424             : 
     425        4587 :     rPosition.X() += aFormat.GetDistance( DIS_LEFTSPACE );
     426        4587 :     rPosition.Y() += aFormat.GetDistance( DIS_TOPSPACE  );
     427             : 
     428             :     //! in case of high contrast-mode (accessibility option!)
     429             :     //! the draw mode needs to be set to default, because when imbedding
     430             :     //! Math for example in Calc in "a over b" the fraction bar may not
     431             :     //! be visible else. More generally: the FillColor may have been changed.
     432        4587 :     DrawModeFlags nOldDrawMode = DrawModeFlags::Default;
     433        4587 :     bool bRestoreDrawMode = false;
     434        4611 :     if (OUTDEV_WINDOW == rDev.GetOutDevType() &&
     435          24 :         static_cast<vcl::Window &>(rDev).GetSettings().GetStyleSettings().GetHighContrastMode())
     436             :     {
     437           0 :         nOldDrawMode = rDev.GetDrawMode();
     438           0 :         rDev.SetDrawMode( DrawModeFlags::Default );
     439           0 :         bRestoreDrawMode = true;
     440             :     }
     441             : 
     442             :     // format/draw formulas always from left to right
     443             :     // and numbers should not be converted
     444        4587 :     ComplexTextLayoutMode nLayoutMode = rDev.GetLayoutMode();
     445        4587 :     rDev.SetLayoutMode( TEXT_LAYOUT_DEFAULT );
     446        4587 :     sal_Int16 nDigitLang = rDev.GetDigitLanguage();
     447        4587 :     rDev.SetDigitLanguage( LANGUAGE_ENGLISH );
     448             : 
     449             :     //Set selection if any
     450        4587 :     if(pCursor && bDrawSelection){
     451           0 :         pCursor->AnnotateSelection();
     452           0 :         SmSelectionDrawingVisitor(rDev, pTree, rPosition);
     453             :     }
     454             : 
     455             :     //Drawing using visitor
     456        4587 :     SmDrawingVisitor(rDev, rPosition, pTree);
     457             : 
     458             : 
     459        4587 :     rDev.SetLayoutMode( nLayoutMode );
     460        4587 :     rDev.SetDigitLanguage( nDigitLang );
     461             : 
     462        4587 :     if (bRestoreDrawMode)
     463           0 :         rDev.SetDrawMode( nOldDrawMode );
     464        4587 : }
     465             : 
     466        1358 : Size SmDocShell::GetSize()
     467             : {
     468        1358 :     Size aRet;
     469             : 
     470        1358 :     if (!pTree)
     471          29 :         Parse();
     472             : 
     473        1358 :     if (pTree)
     474             :     {
     475        1358 :         if (!IsFormulaArranged())
     476        1079 :             ArrangeFormula();
     477        1358 :         aRet = pTree->GetSize();
     478             : 
     479        1358 :         if ( !aRet.Width() )
     480           0 :             aRet.Width() = 2000;
     481             :         else
     482        4074 :             aRet.Width()  += aFormat.GetDistance( DIS_LEFTSPACE ) +
     483        4074 :                              aFormat.GetDistance( DIS_RIGHTSPACE );
     484        1358 :         if ( !aRet.Height() )
     485           0 :             aRet.Height() = 1000;
     486             :         else
     487        4074 :             aRet.Height() += aFormat.GetDistance( DIS_TOPSPACE ) +
     488        4074 :                              aFormat.GetDistance( DIS_BOTTOMSPACE );
     489             :     }
     490             : 
     491        1358 :     return aRet;
     492             : }
     493             : 
     494         333 : void SmDocShell::InvalidateCursor(){
     495         333 :     delete pCursor;
     496         333 :     pCursor = NULL;
     497         333 : }
     498             : 
     499           0 : SmCursor& SmDocShell::GetCursor(){
     500           0 :     if(!pCursor)
     501           0 :         pCursor = new SmCursor(pTree, this);
     502           0 :     return *pCursor;
     503             : }
     504             : 
     505             : 
     506             : 
     507        1083 : SmPrinterAccess::SmPrinterAccess( SmDocShell &rDocShell )
     508             : {
     509        1083 :     pPrinter = rDocShell.GetPrt();
     510        1083 :     if ( pPrinter )
     511             :     {
     512          79 :         pPrinter->Push( PushFlags::MAPMODE );
     513          79 :         if ( SfxObjectCreateMode::EMBEDDED == rDocShell.GetCreateMode() )
     514             :         {
     515             :             // if it is an embedded object (without it's own printer)
     516             :             // we change the MapMode temporarily.
     517             :             //!If it is a document with it's own printer the MapMode should
     518             :             //!be set correct (once) elsewhere(!), in order to avoid numerous
     519             :             //!superfluous pushing and poping of the MapMode when using
     520             :             //!this class.
     521             : 
     522           0 :             const MapUnit eOld = pPrinter->GetMapMode().GetMapUnit();
     523           0 :             if ( MAP_100TH_MM != eOld )
     524             :             {
     525           0 :                 MapMode aMap( pPrinter->GetMapMode() );
     526           0 :                 aMap.SetMapUnit( MAP_100TH_MM );
     527           0 :                 Point aTmp( aMap.GetOrigin() );
     528           0 :                 aTmp.X() = OutputDevice::LogicToLogic( aTmp.X(), eOld, MAP_100TH_MM );
     529           0 :                 aTmp.Y() = OutputDevice::LogicToLogic( aTmp.Y(), eOld, MAP_100TH_MM );
     530           0 :                 aMap.SetOrigin( aTmp );
     531           0 :                 pPrinter->SetMapMode( aMap );
     532             :             }
     533             :         }
     534             :     }
     535        1083 :     if ( !!(pRefDev = rDocShell.GetRefDev()) && pPrinter.get() != pRefDev.get() )
     536             :     {
     537         684 :         pRefDev->Push( PushFlags::MAPMODE );
     538         684 :         if ( SfxObjectCreateMode::EMBEDDED == rDocShell.GetCreateMode() )
     539             :         {
     540             :             // if it is an embedded object (without it's own printer)
     541             :             // we change the MapMode temporarily.
     542             :             //!If it is a document with it's own printer the MapMode should
     543             :             //!be set correct (once) elsewhere(!), in order to avoid numerous
     544             :             //!superfluous pushing and poping of the MapMode when using
     545             :             //!this class.
     546             : 
     547         684 :             const MapUnit eOld = pRefDev->GetMapMode().GetMapUnit();
     548         684 :             if ( MAP_100TH_MM != eOld )
     549             :             {
     550         684 :                 MapMode aMap( pRefDev->GetMapMode() );
     551         684 :                 aMap.SetMapUnit( MAP_100TH_MM );
     552         684 :                 Point aTmp( aMap.GetOrigin() );
     553         684 :                 aTmp.X() = OutputDevice::LogicToLogic( aTmp.X(), eOld, MAP_100TH_MM );
     554         684 :                 aTmp.Y() = OutputDevice::LogicToLogic( aTmp.Y(), eOld, MAP_100TH_MM );
     555         684 :                 aMap.SetOrigin( aTmp );
     556         684 :                 pRefDev->SetMapMode( aMap );
     557             :             }
     558             :         }
     559             :     }
     560        1083 : }
     561             : 
     562        2166 : SmPrinterAccess::~SmPrinterAccess()
     563             : {
     564        1083 :     if ( pPrinter )
     565          79 :         pPrinter->Pop();
     566        1083 :     if ( pRefDev && pRefDev != pPrinter )
     567         684 :         pRefDev->Pop();
     568        1083 : }
     569             : 
     570        2674 : Printer* SmDocShell::GetPrt()
     571             : {
     572        2674 :     if (SfxObjectCreateMode::EMBEDDED == GetCreateMode())
     573             :     {
     574             :         // Normally the server provides the printer. But if it doesn't provide one (e.g. because
     575             :         // there is no connection) it still can be the case that we know the printer because it
     576             :         // has been passed on by the server in OnDocumentPrinterChanged and being kept temporarily.
     577        2446 :         Printer* pPrt = GetDocumentPrinter();
     578        2446 :         if (!pPrt && pTmpPrinter)
     579           0 :             pPrt = pTmpPrinter;
     580        2446 :         return pPrt;
     581             :     }
     582         228 :     else if (!pPrinter)
     583             :     {
     584             :         SfxItemSet* pOptions = new SfxItemSet(GetPool(),
     585             :                                               SID_PRINTSIZE,       SID_PRINTSIZE,
     586             :                                               SID_PRINTZOOM,       SID_PRINTZOOM,
     587             :                                               SID_PRINTTITLE,      SID_PRINTTITLE,
     588             :                                               SID_PRINTTEXT,       SID_PRINTTEXT,
     589             :                                               SID_PRINTFRAME,      SID_PRINTFRAME,
     590             :                                               SID_NO_RIGHT_SPACES, SID_NO_RIGHT_SPACES,
     591             :                                               SID_SAVE_ONLY_USED_SYMBOLS, SID_SAVE_ONLY_USED_SYMBOLS,
     592          17 :                                               0);
     593          17 :         SmModule *pp = SM_MOD();
     594          17 :         pp->GetConfig()->ConfigToItemSet(*pOptions);
     595          17 :         pPrinter = VclPtr<SfxPrinter>::Create(pOptions);
     596          17 :         pPrinter->SetMapMode(MapMode(MAP_100TH_MM));
     597             :     }
     598         228 :     return pPrinter;
     599             : }
     600             : 
     601        1083 : OutputDevice* SmDocShell::GetRefDev()
     602             : {
     603        1083 :     if (SfxObjectCreateMode::EMBEDDED == GetCreateMode())
     604             :     {
     605        1004 :         OutputDevice* pOutDev = GetDocumentRefDev();
     606        1004 :         if (pOutDev)
     607         684 :             return pOutDev;
     608             :     }
     609             : 
     610         399 :     return GetPrt();
     611             : }
     612             : 
     613           0 : void SmDocShell::SetPrinter( SfxPrinter *pNew )
     614             : {
     615           0 :     pPrinter.disposeAndClear();
     616           0 :     pPrinter = pNew;    //Transfer ownership
     617           0 :     pPrinter->SetMapMode( MapMode(MAP_100TH_MM) );
     618           0 :     SetFormulaArranged(false);
     619           0 :     Repaint();
     620           0 : }
     621             : 
     622         862 : void SmDocShell::OnDocumentPrinterChanged( Printer *pPrt )
     623             : {
     624         862 :     pTmpPrinter = pPrt;
     625         862 :     SetFormulaArranged(false);
     626         862 :     Size aOldSize = GetVisArea().GetSize();
     627         862 :     Repaint();
     628         862 :     if( aOldSize != GetVisArea().GetSize() && !aText.isEmpty() )
     629         284 :         SetModified( true );
     630         862 :     pTmpPrinter = 0;
     631         862 : }
     632             : 
     633         880 : void SmDocShell::Repaint()
     634             : {
     635         880 :     bool bIsEnabled = IsEnableSetModified();
     636         880 :     if (bIsEnabled)
     637         842 :         EnableSetModified( false );
     638             : 
     639         880 :     SetFormulaArranged(false);
     640             : 
     641         880 :     Size aVisSize = GetSize();
     642         880 :     SetVisAreaSize(aVisSize);
     643         880 :     SmViewShell* pViewSh = SmGetActiveView();
     644         880 :     if (pViewSh)
     645           0 :         pViewSh->GetGraphicWindow().Invalidate();
     646             : 
     647         880 :     if (bIsEnabled)
     648         842 :         EnableSetModified(bIsEnabled);
     649         880 : }
     650             : 
     651         340 : SmDocShell::SmDocShell( SfxModelFlags i_nSfxCreationFlags )
     652             :     : SfxObjectShell(i_nSfxCreationFlags)
     653             :     , pTree(0)
     654             :     , pEditEngineItemPool(0)
     655             :     , pEditEngine(0)
     656             :     , pPrinter(0)
     657             :     , pTmpPrinter(0)
     658             :     , nModifyCount(0)
     659         340 :     , bIsFormulaArranged(false)
     660             : {
     661         340 :     pCursor = NULL;
     662             : 
     663         340 :     SetPool(&SfxGetpApp()->GetPool());
     664             : 
     665         340 :     SmModule *pp = SM_MOD();
     666         340 :     aFormat = pp->GetConfig()->GetStandardFormat();
     667             : 
     668         340 :     StartListening(aFormat);
     669         340 :     StartListening(*pp->GetConfig());
     670             : 
     671         340 :     SetBaseModel(new SmModel(this));
     672         340 : }
     673             : 
     674        1292 : SmDocShell::~SmDocShell()
     675             : {
     676         323 :     SmModule *pp = SM_MOD();
     677             : 
     678         323 :     EndListening(aFormat);
     679         323 :     EndListening(*pp->GetConfig());
     680             : 
     681             : 
     682         323 :     if(pCursor)
     683           0 :         delete pCursor;
     684         323 :     pCursor = NULL;
     685             : 
     686         323 :     delete pEditEngine;
     687         323 :     SfxItemPool::Free(pEditEngineItemPool);
     688         323 :     delete pTree;
     689         323 :     pPrinter.disposeAndClear();
     690         969 : }
     691             : 
     692          13 : bool SmDocShell::ConvertFrom(SfxMedium &rMedium)
     693             : {
     694          13 :     bool     bSuccess = false;
     695          13 :     const OUString& rFltName = rMedium.GetFilter()->GetFilterName();
     696             : 
     697             :     OSL_ENSURE( rFltName != STAROFFICE_XML, "Wrong filter!");
     698             : 
     699          13 :     if ( rFltName == MATHML_XML )
     700             :     {
     701           3 :         if (pTree)
     702             :         {
     703           0 :             delete pTree;
     704           0 :             pTree = 0;
     705           0 :             InvalidateCursor();
     706             :         }
     707           3 :         Reference<com::sun::star::frame::XModel> xModel(GetModel());
     708           6 :         SmXMLImportWrapper aEquation(xModel);
     709           6 :         bSuccess = 0 == aEquation.Import(rMedium);
     710             :     }
     711             :     else
     712             :     {
     713          10 :         SvStream *pStream = rMedium.GetInStream();
     714          10 :         if ( pStream )
     715             :         {
     716          10 :             if ( SotStorage::IsStorageFile( pStream ) )
     717             :             {
     718          10 :                 tools::SvRef<SotStorage> aStorage = new SotStorage( pStream, false );
     719          10 :                 if ( aStorage->IsStream(OUString("Equation Native")) )
     720             :                 {
     721             :                     // is this a MathType Storage?
     722          10 :                     MathType aEquation( aText );
     723          10 :                     if ( (bSuccess = (1 == aEquation.Parse( aStorage )) ))
     724          10 :                         Parse();
     725          10 :                 }
     726             :             }
     727             :         }
     728             :     }
     729             : 
     730          13 :     if ( GetCreateMode() == SfxObjectCreateMode::EMBEDDED )
     731             :     {
     732          13 :         SetFormulaArranged( false );
     733          13 :         Repaint();
     734             :     }
     735             : 
     736          13 :     FinishedLoading( SfxLoadedFlags::ALL );
     737          13 :     return bSuccess;
     738             : }
     739             : 
     740             : 
     741         303 : bool SmDocShell::InitNew( const uno::Reference < embed::XStorage >& xStorage )
     742             : {
     743         303 :     bool bRet = false;
     744         303 :     if ( SfxObjectShell::InitNew( xStorage ) )
     745             :     {
     746         303 :         bRet = true;
     747         303 :         SetVisArea(Rectangle(Point(0, 0), Size(2000, 1000)));
     748             :     }
     749         303 :     return bRet;
     750             : }
     751             : 
     752             : 
     753           2 : bool SmDocShell::Load( SfxMedium& rMedium )
     754             : {
     755           2 :     bool bRet = false;
     756           2 :     if( SfxObjectShell::Load( rMedium ))
     757             :     {
     758           2 :         uno::Reference < embed::XStorage > xStorage = GetMedium()->GetStorage();
     759           4 :         uno::Reference < container::XNameAccess > xAccess (xStorage, uno::UNO_QUERY);
     760           4 :         if (
     761             :             (
     762          12 :              xAccess->hasByName( OUString("content.xml") ) &&
     763           6 :              xStorage->isStreamElement( OUString("content.xml") )
     764           8 :             ) ||
     765             :             (
     766           2 :              xAccess->hasByName( OUString("Content.xml") ) &&
     767           2 :              xStorage->isStreamElement( OUString("Content.xml") )
     768             :             )
     769             :            )
     770             :         {
     771             :             // is this a fabulous math package ?
     772           2 :             Reference<com::sun::star::frame::XModel> xModel(GetModel());
     773           4 :             SmXMLImportWrapper aEquation(xModel);
     774           2 :             sal_uLong nError = aEquation.Import(rMedium);
     775           2 :             bRet = 0 == nError;
     776           4 :             SetError( nError, OSL_LOG_PREFIX );
     777           2 :         }
     778             :     }
     779             : 
     780           2 :     if ( GetCreateMode() == SfxObjectCreateMode::EMBEDDED )
     781             :     {
     782           2 :         SetFormulaArranged( false );
     783           2 :         Repaint();
     784             :     }
     785             : 
     786           2 :     FinishedLoading( SfxLoadedFlags::ALL );
     787           2 :     return bRet;
     788             : }
     789             : 
     790             : 
     791             : 
     792           0 : bool SmDocShell::Save()
     793             : {
     794             :     //! apply latest changes if necessary
     795           0 :     UpdateText();
     796             : 
     797           0 :     if ( SfxObjectShell::Save() )
     798             :     {
     799           0 :         if (!pTree)
     800           0 :             Parse();
     801           0 :         if( pTree && !IsFormulaArranged() )
     802           0 :             ArrangeFormula();
     803             : 
     804           0 :         Reference<com::sun::star::frame::XModel> xModel(GetModel());
     805           0 :         SmXMLExportWrapper aEquation(xModel);
     806           0 :         aEquation.SetFlat(false);
     807           0 :         return aEquation.Export(*GetMedium());
     808             :     }
     809             : 
     810           0 :     return false;
     811             : }
     812             : 
     813             : /*
     814             :  * replace bad characters that can not be saved. (#i74144)
     815             :  * */
     816         333 : bool SmDocShell::ReplaceBadChars()
     817             : {
     818         333 :     bool bReplace = false;
     819             : 
     820         333 :     if (pEditEngine)
     821             :     {
     822          18 :         OUStringBuffer aBuf( pEditEngine->GetText( LINEEND_LF ) );
     823             : 
     824         133 :         for (sal_Int32 i = 0;  i < aBuf.getLength();  ++i)
     825             :         {
     826         115 :             if (aBuf[i] < ' ' && aBuf[i] != '\r' && aBuf[i] != '\n' && aBuf[i] != '\t')
     827             :             {
     828           0 :                 aBuf[i] = ' ';
     829           0 :                 bReplace = true;
     830             :             }
     831             :         }
     832             : 
     833          18 :         if (bReplace)
     834           0 :             aText = aBuf.makeStringAndClear();
     835             :     }
     836             : 
     837         333 :     return bReplace;
     838             : }
     839             : 
     840             : 
     841         571 : void SmDocShell::UpdateText()
     842             : {
     843         571 :     if (pEditEngine && pEditEngine->IsModified())
     844             :     {
     845          10 :         OUString aEngTxt( pEditEngine->GetText( LINEEND_LF ) );
     846          10 :         if (GetText() != aEngTxt)
     847           7 :             SetText( aEngTxt );
     848             :     }
     849         571 : }
     850             : 
     851             : 
     852         561 : bool SmDocShell::SaveAs( SfxMedium& rMedium )
     853             : {
     854         561 :     bool bRet = false;
     855             : 
     856             :     //! apply latest changes if necessary
     857         561 :     UpdateText();
     858             : 
     859         561 :     if ( SfxObjectShell::SaveAs( rMedium ) )
     860             :     {
     861         561 :         if (!pTree)
     862           0 :             Parse();
     863         561 :         if( pTree && !IsFormulaArranged() )
     864           0 :             ArrangeFormula();
     865             : 
     866         561 :         Reference<com::sun::star::frame::XModel> xModel(GetModel());
     867        1122 :         SmXMLExportWrapper aEquation(xModel);
     868         561 :         aEquation.SetFlat(false);
     869        1122 :         bRet = aEquation.Export(rMedium);
     870             :     }
     871         561 :     return bRet;
     872             : }
     873             : 
     874           0 : bool SmDocShell::ConvertTo( SfxMedium &rMedium )
     875             : {
     876           0 :     bool bRet = false;
     877           0 :     const SfxFilter* pFlt = rMedium.GetFilter();
     878           0 :     if( pFlt )
     879             :     {
     880           0 :         if( !pTree )
     881           0 :             Parse();
     882           0 :         if( pTree && !IsFormulaArranged() )
     883           0 :             ArrangeFormula();
     884             : 
     885           0 :         const OUString& rFltName = pFlt->GetFilterName();
     886           0 :         if(rFltName == STAROFFICE_XML)
     887             :         {
     888           0 :             Reference<com::sun::star::frame::XModel> xModel(GetModel());
     889           0 :             SmXMLExportWrapper aEquation(xModel);
     890           0 :             aEquation.SetFlat(false);
     891           0 :             bRet = aEquation.Export(rMedium);
     892             :         }
     893           0 :         else if(rFltName == MATHML_XML)
     894             :         {
     895           0 :             Reference<com::sun::star::frame::XModel> xModel(GetModel());
     896           0 :             SmXMLExportWrapper aEquation(xModel);
     897           0 :             aEquation.SetFlat(true);
     898           0 :             bRet = aEquation.Export(rMedium);
     899             :         }
     900           0 :         else if (pFlt->GetFilterName() == "MathType 3.x")
     901           0 :             bRet = WriteAsMathType3( rMedium );
     902             :     }
     903           0 :     return bRet;
     904             : }
     905             : 
     906          69 : bool SmDocShell::writeFormulaOoxml( ::sax_fastparser::FSHelperPtr pSerializer, oox::core::OoxmlVersion version )
     907             : {
     908          69 :     if( !pTree )
     909           0 :         Parse();
     910          69 :     if( pTree && !IsFormulaArranged() )
     911           0 :         ArrangeFormula();
     912          69 :     SmOoxmlExport aEquation( pTree, version );
     913          69 :     return aEquation.ConvertFromStarMath( pSerializer );
     914             : }
     915             : 
     916          30 : void SmDocShell::writeFormulaRtf(OStringBuffer& rBuffer, rtl_TextEncoding nEncoding)
     917             : {
     918          30 :     if (!pTree)
     919           0 :         Parse();
     920          30 :     if (pTree && !IsFormulaArranged())
     921           0 :         ArrangeFormula();
     922          30 :     SmRtfExport aEquation(pTree);
     923          30 :     aEquation.ConvertFromStarMath(rBuffer, nEncoding);
     924          30 : }
     925             : 
     926         267 : void SmDocShell::readFormulaOoxml( oox::formulaimport::XmlStream& stream )
     927             : {
     928         267 :     SmOoxmlImport aEquation( stream );
     929         267 :     SetText( aEquation.ConvertToStarMath());
     930         267 : }
     931             : 
     932        1107 : bool SmDocShell::SaveCompleted( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage )
     933             : {
     934        1107 :     if( SfxObjectShell::SaveCompleted( xStorage ))
     935        1107 :         return true;
     936             : 
     937           0 :     return false;
     938             : }
     939             : 
     940             : 
     941           7 : void SmDocShell::Execute(SfxRequest& rReq)
     942             : {
     943           7 :     switch (rReq.GetSlot())
     944             :     {
     945             :         case SID_TEXTMODE:
     946             :         {
     947           0 :             SmFormat aOldFormat  = GetFormat();
     948           0 :             SmFormat aNewFormat( aOldFormat );
     949           0 :             aNewFormat.SetTextmode(!aOldFormat.IsTextmode());
     950             : 
     951           0 :             ::svl::IUndoManager *pTmpUndoMgr = GetUndoManager();
     952           0 :             if (pTmpUndoMgr)
     953             :                 pTmpUndoMgr->AddUndoAction(
     954           0 :                     new SmFormatAction(this, aOldFormat, aNewFormat));
     955             : 
     956           0 :             SetFormat( aNewFormat );
     957           0 :             Repaint();
     958             :         }
     959           0 :         break;
     960             : 
     961             :         case SID_AUTO_REDRAW :
     962             :         {
     963           0 :             SmModule *pp = SM_MOD();
     964           0 :             bool bRedraw = pp->GetConfig()->IsAutoRedraw();
     965           0 :             pp->GetConfig()->SetAutoRedraw(!bRedraw);
     966             :         }
     967           0 :         break;
     968             : 
     969             :         case SID_LOADSYMBOLS:
     970           0 :             LoadSymbols();
     971           0 :         break;
     972             : 
     973             :         case SID_SAVESYMBOLS:
     974           0 :             SaveSymbols();
     975           0 :         break;
     976             : 
     977             :         case SID_FONT:
     978             :         {
     979             :             // get device used to retrieve the FontList
     980           0 :             OutputDevice *pDev = GetPrinter();
     981           0 :             if (!pDev || pDev->GetDevFontCount() == 0)
     982           0 :                 pDev = &SM_MOD()->GetDefaultVirtualDev();
     983             :             OSL_ENSURE (pDev, "device for font list missing" );
     984             : 
     985           0 :             VclPtrInstance< SmFontTypeDialog > xFontTypeDialog( nullptr, pDev );
     986             : 
     987           0 :             SmFormat aOldFormat  = GetFormat();
     988           0 :             xFontTypeDialog->ReadFrom( aOldFormat );
     989           0 :             if (xFontTypeDialog->Execute() == RET_OK)
     990             :             {
     991           0 :                 SmFormat aNewFormat( aOldFormat );
     992             : 
     993           0 :                 xFontTypeDialog->WriteTo(aNewFormat);
     994           0 :                 ::svl::IUndoManager *pTmpUndoMgr = GetUndoManager();
     995           0 :                 if (pTmpUndoMgr)
     996             :                     pTmpUndoMgr->AddUndoAction(
     997           0 :                         new SmFormatAction(this, aOldFormat, aNewFormat));
     998             : 
     999           0 :                 SetFormat( aNewFormat );
    1000           0 :                 Repaint();
    1001           0 :             }
    1002             :         }
    1003           0 :         break;
    1004             : 
    1005             :         case SID_FONTSIZE:
    1006             :         {
    1007           0 :             VclPtrInstance< SmFontSizeDialog > xFontSizeDialog(nullptr);
    1008             : 
    1009           0 :             SmFormat aOldFormat  = GetFormat();
    1010           0 :             xFontSizeDialog->ReadFrom( aOldFormat );
    1011           0 :             if (xFontSizeDialog->Execute() == RET_OK)
    1012             :             {
    1013           0 :                 SmFormat aNewFormat( aOldFormat );
    1014             : 
    1015           0 :                 xFontSizeDialog->WriteTo(aNewFormat);
    1016             : 
    1017           0 :                 ::svl::IUndoManager *pTmpUndoMgr = GetUndoManager();
    1018           0 :                 if (pTmpUndoMgr)
    1019             :                     pTmpUndoMgr->AddUndoAction(
    1020           0 :                         new SmFormatAction(this, aOldFormat, aNewFormat));
    1021             : 
    1022           0 :                 SetFormat( aNewFormat );
    1023           0 :                 Repaint();
    1024           0 :             }
    1025             :         }
    1026           0 :         break;
    1027             : 
    1028             :         case SID_DISTANCE:
    1029             :         {
    1030           0 :             VclPtrInstance< SmDistanceDialog > xDistanceDialog(nullptr);
    1031             : 
    1032           0 :             SmFormat aOldFormat  = GetFormat();
    1033           0 :             xDistanceDialog->ReadFrom( aOldFormat );
    1034           0 :             if (xDistanceDialog->Execute() == RET_OK)
    1035             :             {
    1036           0 :                 SmFormat aNewFormat( aOldFormat );
    1037             : 
    1038           0 :                 xDistanceDialog->WriteTo(aNewFormat);
    1039             : 
    1040           0 :                 ::svl::IUndoManager *pTmpUndoMgr = GetUndoManager();
    1041           0 :                 if (pTmpUndoMgr)
    1042             :                     pTmpUndoMgr->AddUndoAction(
    1043           0 :                         new SmFormatAction(this, aOldFormat, aNewFormat));
    1044             : 
    1045           0 :                 SetFormat( aNewFormat );
    1046           0 :                 Repaint();
    1047           0 :             }
    1048             :         }
    1049           0 :         break;
    1050             : 
    1051             :         case SID_ALIGN:
    1052             :         {
    1053           0 :             VclPtrInstance< SmAlignDialog > xAlignDialog(nullptr);
    1054             : 
    1055           0 :             SmFormat aOldFormat  = GetFormat();
    1056           0 :             xAlignDialog->ReadFrom( aOldFormat );
    1057           0 :             if (xAlignDialog->Execute() == RET_OK)
    1058             :             {
    1059           0 :                 SmFormat aNewFormat( aOldFormat );
    1060             : 
    1061           0 :                 xAlignDialog->WriteTo(aNewFormat);
    1062             : 
    1063           0 :                 SmModule *pp = SM_MOD();
    1064           0 :                 SmFormat aFmt( pp->GetConfig()->GetStandardFormat() );
    1065           0 :                 xAlignDialog->WriteTo( aFmt );
    1066           0 :                 pp->GetConfig()->SetStandardFormat( aFmt );
    1067             : 
    1068           0 :                 ::svl::IUndoManager *pTmpUndoMgr = GetUndoManager();
    1069           0 :                 if (pTmpUndoMgr)
    1070             :                     pTmpUndoMgr->AddUndoAction(
    1071           0 :                         new SmFormatAction(this, aOldFormat, aNewFormat));
    1072             : 
    1073           0 :                 SetFormat( aNewFormat );
    1074           0 :                 Repaint();
    1075           0 :             }
    1076             :         }
    1077           0 :         break;
    1078             : 
    1079             :         case SID_TEXT:
    1080             :         {
    1081           4 :             const SfxStringItem& rItem = static_cast<const SfxStringItem&>(rReq.GetArgs()->Get(SID_TEXT));
    1082           4 :             if (GetText() != OUString(rItem.GetValue()))
    1083           4 :                 SetText(rItem.GetValue());
    1084             :         }
    1085           4 :         break;
    1086             : 
    1087             :         case SID_UNDO:
    1088             :         case SID_REDO:
    1089             :         {
    1090           3 :             ::svl::IUndoManager* pTmpUndoMgr = GetUndoManager();
    1091           3 :             if( pTmpUndoMgr )
    1092             :             {
    1093           3 :                 sal_uInt16 nId = rReq.GetSlot(), nCnt = 1;
    1094           3 :                 const SfxItemSet* pArgs = rReq.GetArgs();
    1095             :                 const SfxPoolItem* pItem;
    1096           3 :                 if( pArgs && SfxItemState::SET == pArgs->GetItemState( nId, false, &pItem ))
    1097           0 :                     nCnt = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
    1098             : 
    1099             :                 bool (::svl::IUndoManager:: *fnDo)();
    1100             : 
    1101             :                 std::size_t nCount;
    1102           3 :                 if( SID_UNDO == rReq.GetSlot() )
    1103             :                 {
    1104           2 :                     nCount = pTmpUndoMgr->GetUndoActionCount();
    1105           2 :                     fnDo = &::svl::IUndoManager::Undo;
    1106             :                 }
    1107             :                 else
    1108             :                 {
    1109           1 :                     nCount = pTmpUndoMgr->GetRedoActionCount();
    1110           1 :                     fnDo = &::svl::IUndoManager::Redo;
    1111             :                 }
    1112             : 
    1113             :                 try
    1114             :                 {
    1115           6 :                     for( ; nCnt && nCount; --nCnt, --nCount )
    1116           3 :                         (pTmpUndoMgr->*fnDo)();
    1117             :                 }
    1118           0 :                 catch( const Exception& )
    1119             :                 {
    1120             :                     DBG_UNHANDLED_EXCEPTION();
    1121             :                 }
    1122             :             }
    1123           3 :             Repaint();
    1124           3 :             UpdateText();
    1125           3 :             SfxViewFrame* pFrm = SfxViewFrame::GetFirst( this );
    1126           6 :             while( pFrm )
    1127             :             {
    1128           0 :                 SfxBindings& rBind = pFrm->GetBindings();
    1129           0 :                 rBind.Invalidate(SID_UNDO);
    1130           0 :                 rBind.Invalidate(SID_REDO);
    1131           0 :                 rBind.Invalidate(SID_REPEAT);
    1132           0 :                 rBind.Invalidate(SID_CLEARHISTORY);
    1133           0 :                 pFrm = SfxViewFrame::GetNext( *pFrm, this );
    1134             :             }
    1135             :         }
    1136           3 :         break;
    1137             :     }
    1138             : 
    1139           7 :     rReq.Done();
    1140           7 : }
    1141             : 
    1142             : 
    1143          38 : void SmDocShell::GetState(SfxItemSet &rSet)
    1144             : {
    1145          38 :     SfxWhichIter aIter(rSet);
    1146             : 
    1147          82 :     for (sal_uInt16 nWh = aIter.FirstWhich();  0 != nWh;  nWh = aIter.NextWhich())
    1148             :     {
    1149          44 :         switch (nWh)
    1150             :         {
    1151             :         case SID_TEXTMODE:
    1152           0 :             rSet.Put(SfxBoolItem(SID_TEXTMODE, GetFormat().IsTextmode()));
    1153           0 :             break;
    1154             : 
    1155             :         case SID_DOCTEMPLATE :
    1156           0 :             rSet.DisableItem(SID_DOCTEMPLATE);
    1157           0 :             break;
    1158             : 
    1159             :         case SID_AUTO_REDRAW :
    1160             :             {
    1161           0 :                 SmModule  *pp = SM_MOD();
    1162           0 :                 bool       bRedraw = pp->GetConfig()->IsAutoRedraw();
    1163             : 
    1164           0 :                 rSet.Put(SfxBoolItem(SID_AUTO_REDRAW, bRedraw));
    1165             :             }
    1166           0 :             break;
    1167             : 
    1168             :         case SID_MODIFYSTATUS:
    1169             :             {
    1170           0 :                 sal_Unicode cMod = ' ';
    1171           0 :                 if (IsModified())
    1172           0 :                     cMod = '*';
    1173           0 :                 rSet.Put(SfxStringItem(SID_MODIFYSTATUS, OUString(cMod)));
    1174             :             }
    1175           0 :             break;
    1176             : 
    1177             :         case SID_TEXT:
    1178           6 :             rSet.Put(SfxStringItem(SID_TEXT, GetText()));
    1179           6 :             break;
    1180             : 
    1181             :         case SID_GAPHIC_SM:
    1182             :             //! very old (pre UNO) and ugly hack to invalidate the SmGraphicWindow.
    1183             :             //! If nModifyCount gets changed then the call below will implicitly notify
    1184             :             //! SmGraphicController::StateChanged and there the window gets invalidated.
    1185             :             //! Thus all the 'nModifyCount++' before invalidating this slot.
    1186           2 :             rSet.Put(SfxInt16Item(SID_GAPHIC_SM, nModifyCount));
    1187           2 :             break;
    1188             : 
    1189             :         case SID_UNDO:
    1190             :         case SID_REDO:
    1191             :             {
    1192          36 :                 SfxViewFrame* pFrm = SfxViewFrame::GetFirst( this );
    1193          36 :                 if( pFrm )
    1194          36 :                     pFrm->GetSlotState( nWh, NULL, &rSet );
    1195             :                 else
    1196           0 :                     rSet.DisableItem( nWh );
    1197             :             }
    1198          36 :             break;
    1199             : 
    1200             :         case SID_GETUNDOSTRINGS:
    1201             :         case SID_GETREDOSTRINGS:
    1202             :             {
    1203           0 :                 ::svl::IUndoManager* pTmpUndoMgr = GetUndoManager();
    1204           0 :                 if( pTmpUndoMgr )
    1205             :                 {
    1206             :                     OUString(::svl::IUndoManager:: *fnGetComment)( size_t, bool const ) const;
    1207             : 
    1208             :                     sal_uInt16 nCount;
    1209           0 :                     if( SID_GETUNDOSTRINGS == nWh )
    1210             :                     {
    1211           0 :                         nCount = pTmpUndoMgr->GetUndoActionCount();
    1212           0 :                         fnGetComment = &::svl::IUndoManager::GetUndoActionComment;
    1213             :                     }
    1214             :                     else
    1215             :                     {
    1216           0 :                         nCount = pTmpUndoMgr->GetRedoActionCount();
    1217           0 :                         fnGetComment = &::svl::IUndoManager::GetRedoActionComment;
    1218             :                     }
    1219           0 :                     if( nCount )
    1220             :                     {
    1221           0 :                         OUStringBuffer aBuf;
    1222           0 :                         for( sal_uInt16 n = 0; n < nCount; ++n )
    1223             :                         {
    1224           0 :                             aBuf.append((pTmpUndoMgr->*fnGetComment)( n, ::svl::IUndoManager::TopLevel ));
    1225           0 :                             aBuf.append('\n');
    1226             :                         }
    1227             : 
    1228           0 :                         SfxStringListItem aItem( nWh );
    1229           0 :                         aItem.SetString( aBuf.makeStringAndClear() );
    1230           0 :                         rSet.Put( aItem );
    1231             :                     }
    1232             :                 }
    1233             :                 else
    1234           0 :                     rSet.DisableItem( nWh );
    1235             :             }
    1236           0 :             break;
    1237             :         }
    1238          38 :     }
    1239          38 : }
    1240             : 
    1241             : 
    1242           3 : ::svl::IUndoManager *SmDocShell::GetUndoManager()
    1243             : {
    1244           3 :     if (!pEditEngine)
    1245           0 :         GetEditEngine();
    1246           3 :     return &pEditEngine->GetUndoManager();
    1247             : }
    1248             : 
    1249             : 
    1250           0 : void SmDocShell::SaveSymbols()
    1251             : {
    1252           0 :     SmModule *pp = SM_MOD();
    1253           0 :     pp->GetSymbolManager().Save();
    1254           0 : }
    1255             : 
    1256             : 
    1257        4563 : void SmDocShell::Draw(OutputDevice *pDevice,
    1258             :                       const JobSetup &,
    1259             :                       sal_uInt16 /*nAspect*/)
    1260             : {
    1261        4563 :     pDevice->IntersectClipRegion(GetVisArea());
    1262        4563 :     Point atmppoint;
    1263        4563 :     DrawFormula(*pDevice, atmppoint);
    1264        4563 : }
    1265             : 
    1266          23 : SfxItemPool& SmDocShell::GetPool()
    1267             : {
    1268          23 :     return SfxGetpApp()->GetPool();
    1269             : }
    1270             : 
    1271        1377 : void SmDocShell::SetVisArea(const Rectangle & rVisArea)
    1272             : {
    1273        1377 :     Rectangle aNewRect(rVisArea);
    1274             : 
    1275        1377 :     aNewRect.SetPos(Point());
    1276             : 
    1277        1377 :     if (! aNewRect.Right()) aNewRect.Right() = 2000;
    1278        1377 :     if (! aNewRect.Bottom()) aNewRect.Bottom() = 1000;
    1279             : 
    1280        1377 :     bool bIsEnabled = IsEnableSetModified();
    1281        1377 :     if ( bIsEnabled )
    1282         366 :         EnableSetModified( false );
    1283             : 
    1284             :     //TODO/LATER: it's unclear how this interacts with the SFX code
    1285             :     // If outplace editing, then dont resize the OutplaceWindow. But the
    1286             :     // ObjectShell has to resize. Bug 56470
    1287             :     bool bUnLockFrame;
    1288        1377 :     if( GetCreateMode() == SfxObjectCreateMode::EMBEDDED && !IsInPlaceActive() && GetFrame() )
    1289             :     {
    1290           0 :         GetFrame()->LockAdjustPosSizePixel();
    1291           0 :         bUnLockFrame = true;
    1292             :     }
    1293             :     else
    1294        1377 :         bUnLockFrame = false;
    1295             : 
    1296        1377 :     SfxObjectShell::SetVisArea( aNewRect );
    1297             : 
    1298        1377 :     if( bUnLockFrame )
    1299           0 :         GetFrame()->UnlockAdjustPosSizePixel();
    1300             : 
    1301        1377 :     if ( bIsEnabled )
    1302         366 :         EnableSetModified( bIsEnabled );
    1303        1377 : }
    1304             : 
    1305             : 
    1306        1425 : void SmDocShell::FillClass(SvGlobalName* pClassName,
    1307             :                            SotClipboardFormatId*  pFormat,
    1308             :                            OUString* /*pAppName*/,
    1309             :                            OUString* pFullTypeName,
    1310             :                            OUString* pShortTypeName,
    1311             :                            sal_Int32 nFileFormat,
    1312             :                            bool bTemplate /* = false */) const
    1313             : {
    1314        1425 :     if (nFileFormat == SOFFICE_FILEFORMAT_60 )
    1315             :     {
    1316           0 :         *pClassName     = SvGlobalName(SO3_SM_CLASSID_60);
    1317           0 :         *pFormat        = SotClipboardFormatId::STARMATH_60;
    1318           0 :         *pFullTypeName  = SM_RESSTR(STR_MATH_DOCUMENT_FULLTYPE_CURRENT);
    1319           0 :         *pShortTypeName = SM_RESSTR(RID_DOCUMENTSTR);
    1320             :     }
    1321        1425 :     else if (nFileFormat == SOFFICE_FILEFORMAT_8 )
    1322             :     {
    1323        1425 :         *pClassName     = SvGlobalName(SO3_SM_CLASSID_60);
    1324        1425 :         *pFormat        = bTemplate ? SotClipboardFormatId::STARMATH_8_TEMPLATE : SotClipboardFormatId::STARMATH_8;
    1325        1425 :         *pFullTypeName  = SM_RESSTR(STR_MATH_DOCUMENT_FULLTYPE_CURRENT);
    1326        1425 :         *pShortTypeName = SM_RESSTR(RID_DOCUMENTSTR);
    1327             :     }
    1328        1425 : }
    1329             : 
    1330           0 : sal_uLong SmDocShell::GetMiscStatus() const
    1331             : {
    1332           0 :     return SfxObjectShell::GetMiscStatus() | SVOBJ_MISCSTATUS_NOTRESIZEABLE
    1333           0 :                                              | SVOBJ_MISCSTATUS_RESIZEONPRINTERCHANGE;
    1334             : }
    1335             : 
    1336        4434 : void SmDocShell::SetModified(bool bModified)
    1337             : {
    1338        4434 :     if( IsEnableSetModified() )
    1339             :     {
    1340        3996 :         SfxObjectShell::SetModified( bModified );
    1341        3996 :         Broadcast(SfxSimpleHint(SFX_HINT_DOCCHANGED));
    1342             :     }
    1343        4434 : }
    1344             : 
    1345           0 : bool SmDocShell::WriteAsMathType3( SfxMedium& rMedium )
    1346             : {
    1347           0 :     MathType aEquation( aText, pTree );
    1348             : 
    1349           0 :     bool bRet = 0 != aEquation.ConvertFromStarMath( rMedium );
    1350           0 :     return bRet;
    1351          42 : }
    1352             : 
    1353             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11