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