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

Generated by: LCOV version 1.10