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