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