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

Generated by: LCOV version 1.10