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