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

Generated by: LCOV version 1.10