xref: /AOO41X/main/starmath/source/view.cxx (revision ff0525f24f03981d56b7579b645949f111420994)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_starmath.hxx"
26 
27 
28 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
29 #include <com/sun/star/accessibility/AccessibleEventObject.hpp>
30 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
31 #include <com/sun/star/accessibility/XAccessible.hpp>
32 #include <com/sun/star/beans/XPropertySet.hpp>
33 #include <com/sun/star/frame/XDesktop.hpp>
34 #include <com/sun/star/frame/XFramesSupplier.hpp>
35 #include <com/sun/star/container/XChild.hpp>
36 
37 #include <comphelper/processfactory.hxx>
38 #include <comphelper/storagehelper.hxx>
39 #include <rtl/logfile.hxx>
40 #include <sfx2/app.hxx>
41 #include <sfx2/dispatch.hxx>
42 #include <sfx2/docfile.hxx>
43 #include <sfx2/docfilt.hxx>
44 #include <sfx2/docinsert.hxx>
45 #include <sfx2/filedlghelper.hxx>
46 #include <sfx2/msg.hxx>
47 #include <sfx2/objface.hxx>
48 #include <sfx2/printer.hxx>
49 #include <sfx2/request.hxx>
50 #include <svl/eitem.hxx>
51 #include <svl/intitem.hxx>
52 #include <svl/itemset.hxx>
53 #include <svl/poolitem.hxx>
54 #include <svl/ptitem.hxx>
55 #include <svl/stritem.hxx>
56 #include <svtools/transfer.hxx>
57 #include <svl/undo.hxx>
58 #include <svl/whiter.hxx>
59 #include <svx/dialogs.hrc>
60 #include <editeng/editeng.hxx>
61 #include <svx/svxdlg.hxx>
62 #include <svx/zoomitem.hxx>
63 #include <vcl/decoview.hxx>
64 #include <vcl/menu.hxx>
65 #include <vcl/msgbox.hxx>
66 #include <vcl/wrkwin.hxx>
67 
68 #include "unomodel.hxx"
69 #include "view.hxx"
70 #include "config.hxx"
71 #include "dialog.hxx"
72 #include "document.hxx"
73 #include "starmath.hrc"
74 #include "toolbox.hxx"
75 #include "mathmlimport.hxx"
76 
77 
78 #define MINWIDTH        200
79 #define MINHEIGHT       200
80 #define MINSPLIT        40
81 #define SPLITTERWIDTH   2
82 
83 #define MINZOOM 25
84 #define MAXZOOM 800
85 
86 #define SmViewShell
87 #include "smslots.hxx"
88 
89 using namespace com::sun::star;
90 using namespace com::sun::star::accessibility;
91 using namespace com::sun::star::uno;
92 
93 //////////////////////////////////////////////////////////////////////
94 
95 SmGraphicWindow::SmGraphicWindow(SmViewShell* pShell):
96     ScrollableWindow(&pShell->GetViewFrame()->GetWindow(), 0),
97     pAccessible(0),
98     pViewShell(pShell),
99     nZoom(100),
100     bIsCursorVisible(sal_False)
101 {
102     // docking windows are usually hidden (often already done in the
103     // resource) and will be shown by the sfx framework.
104     Hide();
105 
106     const Fraction aFraction (1,1);
107     SetMapMode( MapMode(MAP_100TH_MM, Point(), aFraction, aFraction));
108 
109     ApplyColorConfigValues( SM_MOD()->GetColorConfig() );
110 
111     SetTotalSize();
112 
113     SetHelpId(HID_SMA_WIN_DOCUMENT);
114     SetUniqueId(HID_SMA_WIN_DOCUMENT);
115 }
116 
117 SmGraphicWindow::~SmGraphicWindow()
118 {
119     if (pAccessible)
120         pAccessible->ClearWin();    // make Accessible defunctional
121     // Note: memory for pAccessible will be freed when the reference
122     // xAccessible is released.
123 }
124 
125 void SmGraphicWindow::StateChanged( StateChangedType eType )
126 {
127     if ( eType == STATE_CHANGE_INITSHOW )
128         Show();
129     ScrollableWindow::StateChanged( eType );
130 }
131 
132 
133 void SmGraphicWindow::ApplyColorConfigValues( const svtools::ColorConfig &rColorCfg )
134 {
135     // Note: SetTextColor not necessary since the nodes that
136     // get painted have the color information.
137 #if OSL_DEBUG_LEVEL > 1
138 //   ColorData nVal = rColorCfg.GetColorValue(svtools::DOCCOLOR).nColor;
139 #endif
140     SetBackground( Color( (ColorData) rColorCfg.GetColorValue(svtools::DOCCOLOR).nColor ) );
141     Invalidate();
142 }
143 
144 
145 void SmGraphicWindow::DataChanged( const DataChangedEvent& rEvt )
146 {
147     ApplyColorConfigValues( SM_MOD()->GetColorConfig() );
148 
149     ScrollableWindow::DataChanged( rEvt );
150 }
151 
152 
153 void SmGraphicWindow::MouseButtonDown(const MouseEvent& rMEvt)
154 {
155     ScrollableWindow::MouseButtonDown(rMEvt);
156 
157     //
158     // set formula-cursor and selection of edit window according to the
159     // position clicked at
160     //
161     DBG_ASSERT(rMEvt.GetClicks() > 0, "Sm : 0 clicks");
162     if ( rMEvt.IsLeft() && pViewShell->GetEditWindow() )
163     {
164         const SmNode *pTree = pViewShell->GetDoc()->GetFormulaTree();
165         //! kann NULL sein! ZB wenn bereits beim laden des Dokuments (bevor der
166         //! Parser angeworfen wurde) ins Fenster geklickt wird.
167         if (!pTree)
168             return;
169 
170         // get click position relativ to formula
171         Point  aPos (PixelToLogic(rMEvt.GetPosPixel())
172                      - GetFormulaDrawPos());
173 
174         // if it was clicked inside the formula then get the appropriate node
175         const SmNode *pNode = 0;
176         if (pTree->OrientedDist(aPos) <= 0)
177             pNode = pTree->FindRectClosestTo(aPos);
178 
179         if (pNode)
180         {   SmEditWindow  *pEdit = pViewShell->GetEditWindow();
181             const SmToken  aToken (pNode->GetToken());
182 
183 #ifdef notnow
184             // include introducing symbols of special char and text
185             // (ie '%' and '"')
186             sal_uInt16  nExtra = (aToken.eType == TSPECIAL  ||  aToken.eType == TTEXT) ? 1 : 0;
187 
188             // set selection to the beginning of the token
189             ESelection  aSel (aToken.nRow - 1, aToken.nCol - 1 - nExtra);
190 
191             if (rMEvt.GetClicks() != 1)
192             {   // select whole token
193                 // for text include terminating symbol (ie '"')
194                 aSel.nEndPos += aToken.aText.Len() + nExtra
195                                 + (aToken.eType == TTEXT ? 1 : 0);
196             }
197 #endif
198             // set selection to the beginning of the token
199             ESelection  aSel (aToken.nRow - 1, aToken.nCol - 1);
200 
201             if (rMEvt.GetClicks() != 1 || aToken.eType == TPLACE)
202                 aSel.nEndPos = aSel.nEndPos + sal::static_int_cast< sal_uInt16 >(aToken.aText.Len());
203 
204             pEdit->SetSelection(aSel);
205             SetCursor(pNode);
206 
207             // allow for immediate editing and
208             //! implicitly synchronize the cursor position mark in this window
209             pEdit->GrabFocus();
210         }
211     }
212 }
213 
214 void SmGraphicWindow::GetFocus()
215 {
216 /*
217     if (xAccessible.is())
218     {
219         uno::Any aOldValue, aNewValue;
220         // aOldValue remains empty
221         aNewValue <<= AccessibleStateType::FOCUSED;
222         pAccessible->LaunchEvent( AccessibleEventId::STATE_CHANGED,
223                 aOldValue, aNewValue );
224     }
225 */
226 }
227 
228 void SmGraphicWindow::LoseFocus()
229 {
230     ScrollableWindow::LoseFocus();
231     if (xAccessible.is())
232     {
233         uno::Any aOldValue, aNewValue;
234         aOldValue <<= AccessibleStateType::FOCUSED;
235         // aNewValue remains empty
236         pAccessible->LaunchEvent( AccessibleEventId::STATE_CHANGED,
237                 aOldValue, aNewValue );
238     }
239 }
240 
241 void SmGraphicWindow::ShowCursor(sal_Bool bShow)
242     // shows or hides the formula-cursor depending on 'bShow' is sal_True or not
243 {
244     sal_Bool  bInvert = bShow != IsCursorVisible();
245 
246     if (bInvert)
247         InvertTracking(aCursorRect, SHOWTRACK_SMALL | SHOWTRACK_WINDOW);
248 
249     SetIsCursorVisible(bShow);
250 }
251 
252 
253 void SmGraphicWindow::SetCursor(const SmNode *pNode)
254 {
255     const SmNode *pTree = pViewShell->GetDoc()->GetFormulaTree();
256 
257     // get appropriate rectangle
258     Point aOffset (pNode->GetTopLeft() - pTree->GetTopLeft()),
259           aTLPos  (GetFormulaDrawPos() + aOffset);
260     aTLPos.X() -= pNode->GetItalicLeftSpace();
261     Size  aSize   (pNode->GetItalicSize());
262     Point aBRPos  (aTLPos.X() + aSize.Width(), aTLPos.Y() + aSize.Height());
263 
264     SetCursor(Rectangle(aTLPos, aSize));
265 }
266 
267 void SmGraphicWindow::SetCursor(const Rectangle &rRect)
268     // sets cursor to new position (rectangle) 'rRect'.
269     // The old cursor will be removed, and the new one will be shown if
270     // that is activated in the ConfigItem
271 {
272     SmModule *pp = SM_MOD();
273 
274     if (IsCursorVisible())
275         ShowCursor(sal_False);      // clean up remainings of old cursor
276     aCursorRect = rRect;
277     if (pp->GetConfig()->IsShowFormulaCursor())
278         ShowCursor(sal_True);       // draw new cursor
279 }
280 
281 const SmNode * SmGraphicWindow::SetCursorPos(sal_uInt16 nRow, sal_uInt16 nCol)
282     // looks for a VISIBLE node in the formula tree with it's token at
283     // (or around) the position 'nRow', 'nCol' in the edit window
284     // (row and column numbering starts with 1 there!).
285     // If there is such a node the formula-cursor is set to cover that nodes
286     // rectangle. If not the formula-cursor will be hidden.
287     // In any case the search result is being returned.
288 {
289     // find visible node with token at nRow, nCol
290     const SmNode *pTree = pViewShell->GetDoc()->GetFormulaTree(),
291                  *pNode = 0;
292     if (pTree)
293         pNode = pTree->FindTokenAt(nRow, nCol);
294 
295     if (pNode)
296         SetCursor(pNode);
297     else
298         ShowCursor(sal_False);
299 
300     return pNode;
301 }
302 
303 
304 void SmGraphicWindow::Paint(const Rectangle&)
305 {
306     DBG_ASSERT(pViewShell, "Sm : NULL pointer");
307 
308     SmDocShell &rDoc = *pViewShell->GetDoc();
309     Point aPoint;
310 
311     rDoc.Draw(*this, aPoint);   //! modifies aPoint to be the topleft
312                                 //! corner of the formula
313     SetFormulaDrawPos(aPoint);
314 
315     SetIsCursorVisible(sal_False);  // (old) cursor must be drawn again
316 
317     const SmEditWindow *pEdit = pViewShell->GetEditWindow();
318     if (pEdit)
319     {   // get new position for formula-cursor (for possible altered formula)
320         sal_uInt16  nRow, nCol;
321         SmGetLeftSelectionPart(pEdit->GetSelection(), nRow, nCol);
322         nRow++;
323         nCol++;
324         const SmNode *pFound = SetCursorPos(nRow, nCol);
325 
326         SmModule  *pp = SM_MOD();
327         if (pFound && pp->GetConfig()->IsShowFormulaCursor())
328             ShowCursor(sal_True);
329     }
330 }
331 
332 
333 void SmGraphicWindow::SetTotalSize ()
334 {
335     SmDocShell &rDoc = *pViewShell->GetDoc();
336     const Size aTmp( PixelToLogic( LogicToPixel( rDoc.GetSize() )));
337     if ( aTmp != ScrollableWindow::GetTotalSize() )
338         ScrollableWindow::SetTotalSize( aTmp );
339 }
340 
341 
342 void SmGraphicWindow::KeyInput(const KeyEvent& rKEvt)
343 {
344     if (! (GetView() && GetView()->KeyInput(rKEvt)) )
345         ScrollableWindow::KeyInput(rKEvt);
346 }
347 
348 
349 void SmGraphicWindow::Command(const CommandEvent& rCEvt)
350 {
351     sal_Bool bCallBase = sal_True;
352     if ( !pViewShell->GetViewFrame()->GetFrame().IsInPlace() )
353     {
354         switch ( rCEvt.GetCommand() )
355         {
356             case COMMAND_CONTEXTMENU:
357             {
358                 GetParent()->ToTop();
359                 SmResId aResId( RID_VIEWMENU );
360                 PopupMenu* pPopupMenu = new PopupMenu(aResId);
361                 pPopupMenu->SetSelectHdl(LINK(this, SmGraphicWindow, MenuSelectHdl));
362                 Point aPos(5, 5);
363                 if (rCEvt.IsMouseEvent())
364                     aPos = rCEvt.GetMousePosPixel();
365                 DBG_ASSERT( pViewShell, "view shell missing" );
366 
367                 // added for replaceability of context menus #96085, #93782
368                 pViewShell->GetViewFrame()->GetBindings().GetDispatcher()
369                         ->ExecutePopup( aResId, this, &aPos );
370                 //pPopupMenu->Execute( this, aPos );
371 
372                 delete pPopupMenu;
373                 bCallBase = sal_False;
374             }
375             break;
376 
377             case COMMAND_WHEEL:
378             {
379                 const CommandWheelData* pWData = rCEvt.GetWheelData();
380                 if  ( pWData && COMMAND_WHEEL_ZOOM == pWData->GetMode() )
381                 {
382                     sal_uInt16 nTmpZoom = GetZoom();
383                     if( 0L > pWData->GetDelta() )
384                         nTmpZoom -= 10;
385                     else
386                         nTmpZoom += 10;
387                     SetZoom( nTmpZoom );
388                     bCallBase = sal_False;
389                 }
390             }
391             break;
392         }
393     }
394     if ( bCallBase )
395         ScrollableWindow::Command (rCEvt);
396 }
397 
398 
399 IMPL_LINK_INLINE_START( SmGraphicWindow, MenuSelectHdl, Menu *, pMenu )
400 {
401     SmViewShell *pViewSh = GetView();
402     if (pViewSh)
403         pViewSh->GetViewFrame()->GetDispatcher()->Execute( pMenu->GetCurItemId() );
404     return 0;
405 }
406 IMPL_LINK_INLINE_END( SmGraphicWindow, MenuSelectHdl, Menu *, pMenu )
407 
408 
409 void SmGraphicWindow::SetZoom(sal_uInt16 Factor)
410 {
411     nZoom = Min(Max((sal_uInt16) Factor, (sal_uInt16) MINZOOM), (sal_uInt16) MAXZOOM);
412     Fraction   aFraction (nZoom, 100);
413     SetMapMode( MapMode(MAP_100TH_MM, Point(), aFraction, aFraction) );
414     SetTotalSize();
415     SmViewShell *pViewSh = GetView();
416     if (pViewSh)
417         pViewSh->GetViewFrame()->GetBindings().Invalidate(SID_ATTR_ZOOM);
418     Invalidate();
419 }
420 
421 
422 void SmGraphicWindow::ZoomToFitInWindow()
423 {
424     SmDocShell &rDoc = *pViewShell->GetDoc();
425 
426     // set defined mapmode before calling 'LogicToPixel' below
427     SetMapMode(MapMode(MAP_100TH_MM));
428 
429     Size       aSize (LogicToPixel(rDoc.GetSize()));
430     Size       aWindowSize (GetSizePixel());
431 
432     if (aSize.Width() > 0  &&  aSize.Height() > 0)
433     {
434         long nVal = Min ((85 * aWindowSize.Width())  / aSize.Width(),
435                       (85 * aWindowSize.Height()) / aSize.Height());
436         SetZoom ( sal::static_int_cast< sal_uInt16 >(nVal) );
437     }
438 }
439 
440 uno::Reference< XAccessible > SmGraphicWindow::CreateAccessible()
441 {
442     if (!pAccessible)
443     {
444         pAccessible = new SmGraphicAccessible( this );
445         xAccessible = pAccessible;
446     }
447     return xAccessible;
448 }
449 
450 /**************************************************************************/
451 
452 
453 SmGraphicController::SmGraphicController(SmGraphicWindow &rSmGraphic,
454                         sal_uInt16          nId_,
455                         SfxBindings     &rBindings) :
456     SfxControllerItem(nId_, rBindings),
457     rGraphic(rSmGraphic)
458 {
459 }
460 
461 
462 void SmGraphicController::StateChanged(sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState)
463 {
464     rGraphic.SetTotalSize();
465     rGraphic.Invalidate();
466     SfxControllerItem::StateChanged (nSID, eState, pState);
467 }
468 
469 
470 /**************************************************************************/
471 
472 
473 SmEditController::SmEditController(SmEditWindow &rSmEdit,
474                      sal_uInt16       nId_,
475                      SfxBindings  &rBindings) :
476     SfxControllerItem(nId_, rBindings),
477     rEdit(rSmEdit)
478 {
479 }
480 
481 
482 #if OSL_DEBUG_LEVEL > 1
483 SmEditController::~SmEditController()
484 {
485 }
486 #endif
487 
488 
489 void SmEditController::StateChanged(sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState)
490 {
491     const SfxStringItem *pItem = PTR_CAST(SfxStringItem, pState);
492 
493     if ((pItem != NULL) && (rEdit.GetText() != pItem->GetValue()))
494         rEdit.SetText(pItem->GetValue());
495     SfxControllerItem::StateChanged (nSID, eState, pState);
496 }
497 
498 
499 /**************************************************************************/
500 
501 SmCmdBoxWindow::SmCmdBoxWindow(SfxBindings *pBindings_, SfxChildWindow *pChildWindow,
502                                Window *pParent) :
503     SfxDockingWindow(pBindings_, pChildWindow, pParent, SmResId(RID_CMDBOXWINDOW)),
504     aEdit       (*this),
505     aController (aEdit, SID_TEXT, *pBindings_),
506     bExiting    (sal_False)
507 {
508     Hide ();
509 
510     aInitialFocusTimer.SetTimeoutHdl(LINK(this, SmCmdBoxWindow, InitialFocusTimerHdl));
511     aInitialFocusTimer.SetTimeout(100);
512 }
513 
514 
515 SmCmdBoxWindow::~SmCmdBoxWindow ()
516 {
517     aInitialFocusTimer.Stop();
518     bExiting = sal_True;
519 }
520 
521 
522 SmViewShell * SmCmdBoxWindow::GetView()
523 {
524     SfxViewShell *pView = GetBindings().GetDispatcher()->GetFrame()->GetViewShell();
525     return PTR_CAST(SmViewShell, pView);
526 }
527 
528 void SmCmdBoxWindow::Resize()
529 {
530     Rectangle aRect = Rectangle(Point(0, 0), GetOutputSizePixel());
531 
532     if (! IsFloatingMode())
533     {
534         switch (GetAlignment())
535         {
536             case SFX_ALIGN_TOP:     aRect.Bottom()--;   break;
537             case SFX_ALIGN_BOTTOM:  aRect.Top()++;      break;
538             case SFX_ALIGN_LEFT:    aRect.Right()--;    break;
539             case SFX_ALIGN_RIGHT:   aRect.Left()++;     break;
540             default:
541                 break;
542         }
543     }
544 
545     DecorationView aView(this);
546     aRect.Left() += 8; aRect.Top()   += 8;
547     aRect.Right()-= 8; aRect.Bottom()-= 8;
548     aRect = aView.DrawFrame( aRect, FRAME_DRAW_DOUBLEIN );
549 
550     aEdit.SetPosSizePixel(aRect.TopLeft(), aRect.GetSize());
551     SfxDockingWindow::Resize();
552     Invalidate();
553 }
554 
555 
556 void SmCmdBoxWindow::Paint(const Rectangle& /*rRect*/)
557 {
558     Rectangle aRect = Rectangle(Point(0, 0), GetOutputSizePixel());
559     DecorationView aView(this);
560 
561     if (! IsFloatingMode())
562     {
563         Point aFrom, aTo;
564         switch (GetAlignment())
565         {
566             case SFX_ALIGN_TOP:
567                 aFrom = aRect.BottomLeft(); aTo = aRect.BottomRight();
568                 aRect.Bottom()--;
569                 break;
570 
571             case SFX_ALIGN_BOTTOM:
572                 aFrom = aRect.TopLeft(); aTo = aRect.TopRight();
573                 aRect.Top()++;
574                 break;
575 
576             case SFX_ALIGN_LEFT:
577                 aFrom = aRect.TopRight(); aTo = aRect.BottomRight();
578                 aRect.Right()--;
579                 break;
580 
581             case SFX_ALIGN_RIGHT:
582                 aFrom = aRect.TopLeft(); aTo = aRect.BottomLeft();
583                 aRect.Left()++;
584                 break;
585 
586             default:
587                 break;
588         }
589         DrawLine( aFrom, aTo );
590         aView.DrawFrame(aRect, FRAME_DRAW_OUT);
591     }
592     aRect.Left() += 8; aRect.Top()   += 8;
593     aRect.Right()-= 8; aRect.Bottom()-= 8;
594     aRect = aView.DrawFrame( aRect, FRAME_DRAW_DOUBLEIN );
595 }
596 
597 
598 Size SmCmdBoxWindow::CalcDockingSize(SfxChildAlignment eAlign)
599 {
600     switch (eAlign)
601     {
602         case SFX_ALIGN_LEFT:
603         case SFX_ALIGN_RIGHT:
604             return Size();
605         default:
606             break;
607     }
608     return SfxDockingWindow::CalcDockingSize(eAlign);
609 }
610 
611 
612 SfxChildAlignment SmCmdBoxWindow::CheckAlignment(SfxChildAlignment eActual,
613                                              SfxChildAlignment eWish)
614 {
615     switch (eWish)
616     {
617         case SFX_ALIGN_TOP:
618         case SFX_ALIGN_BOTTOM:
619         case SFX_ALIGN_NOALIGNMENT:
620             return eWish;
621         default:
622             break;
623     }
624 
625     return eActual;
626 }
627 
628 
629 void SmCmdBoxWindow::StateChanged( StateChangedType nStateChange )
630 {
631     if (STATE_CHANGE_INITSHOW == nStateChange)
632     {
633         Resize();   // #98848# avoid SmEditWindow not being painted correctly
634 
635         // set initial position of window in floating mode
636         if (sal_True == IsFloatingMode())
637             AdjustPosition();   //! don't change pos in docking-mode !
638 
639 //        // make sure the formula can be edited right away
640 //        aEdit.GrabFocus();
641 
642         // grab focus as above does not work...
643         // Thus we implement a timer based solution to get the inital
644         // focus in the Edit window.
645         aInitialFocusTimer.Start();
646     }
647 
648     SfxDockingWindow::StateChanged( nStateChange );
649 }
650 
651 
652 IMPL_LINK( SmCmdBoxWindow, InitialFocusTimerHdl, Timer *, EMPTYARG /*pTimer*/ )
653 {
654     // We want to have the focus in the edit window once Math has been opened
655     // to allow for immediate typing.
656     // Problem: There is no proper way to do this
657     // Thus: this timer based soultion has been implemented (see GrabFocus below)
658     //
659     // Follow-up problem (#i114910): grabing the focus may bust the help system since
660     // it relies on getting the current frame which conflicts with grabbing the focus.
661     // Thus aside from the 'GrabFocus' call everything else is to get the
662     // help reliably working despite using 'GrabFocus'.
663 
664     try
665     {
666         uno::Reference< frame::XDesktop > xDesktop;
667         uno::Reference< lang::XMultiServiceFactory > xSMGR( comphelper::getProcessServiceFactory() );
668         if (xSMGR.is())
669         {
670             xDesktop = uno::Reference< frame::XDesktop >(
671                 xSMGR->createInstance( rtl::OUString::createFromAscii( "com.sun.star.frame.Desktop" )), uno::UNO_QUERY_THROW );
672         }
673 
674         aEdit.GrabFocus();
675 
676         if (xDesktop.is())
677         {
678             bool bInPlace = GetView()->GetViewFrame()->GetFrame().IsInPlace();
679             uno::Reference< frame::XFrame > xFrame( GetBindings().GetDispatcher()->GetFrame()->GetFrame().GetFrameInterface());
680             if ( bInPlace )
681             {
682                 uno::Reference< container::XChild > xModel( GetView()->GetDoc()->GetModel(), uno::UNO_QUERY_THROW );
683                 uno::Reference< frame::XModel > xParent( xModel->getParent(), uno::UNO_QUERY_THROW );
684                 uno::Reference< frame::XController > xParentCtrler( xParent->getCurrentController() );
685                 uno::Reference< frame::XFramesSupplier > xParentFrame( xParentCtrler->getFrame(), uno::UNO_QUERY_THROW );
686                 xParentFrame->setActiveFrame( xFrame );
687             }
688             else
689             {
690                 uno::Reference< frame::XFramesSupplier > xFramesSupplier( xDesktop, uno::UNO_QUERY );
691                 xFramesSupplier->setActiveFrame( xFrame );
692             }
693         }
694     }
695     catch (uno::Exception &)
696     {
697         DBG_ASSERT( 0, "failed to properly set initial focus to edit window" );
698     }
699     return 0;
700 }
701 
702 
703 void SmCmdBoxWindow::AdjustPosition()
704 {
705     Point aPt;
706     const Rectangle aRect( aPt, GetParent()->GetOutputSizePixel() );
707     Point aTopLeft( Point( aRect.Left(),
708                            aRect.Bottom() - GetSizePixel().Height() ) );
709     Point aPos( GetParent()->OutputToScreenPixel( aTopLeft ) );
710     if (aPos.X() < 0)
711         aPos.X() = 0;
712     if (aPos.Y() < 0)
713         aPos.Y() = 0;
714     SetPosPixel( aPos );
715 }
716 
717 
718 void SmCmdBoxWindow::ToggleFloatingMode()
719 {
720     SfxDockingWindow::ToggleFloatingMode();
721 
722     if (GetFloatingWindow())
723         GetFloatingWindow()->SetMinOutputSizePixel(Size (200, 50));
724 }
725 
726 
727 void SmCmdBoxWindow::GetFocus()
728 {
729     if (!bExiting)
730         aEdit.GrabFocus();
731 }
732 
733 /**************************************************************************/
734 
735 
736 SFX_IMPL_DOCKINGWINDOW(SmCmdBoxWrapper, SID_CMDBOXWINDOW);
737 
738 SmCmdBoxWrapper::SmCmdBoxWrapper(Window *pParentWindow, sal_uInt16 nId,
739                                  SfxBindings *pBindings,
740                                  SfxChildWinInfo *pInfo) :
741     SfxChildWindow(pParentWindow, nId)
742 {
743     pWindow = new SmCmdBoxWindow(pBindings, this, pParentWindow);
744 
745     // make window docked to the bottom initially (after first start)
746     eChildAlignment = SFX_ALIGN_BOTTOM;
747     ((SfxDockingWindow *)pWindow)->Initialize(pInfo);
748 }
749 
750 
751 #if OSL_DEBUG_LEVEL > 1
752 SmCmdBoxWrapper::~SmCmdBoxWrapper()
753 {
754 }
755 #endif
756 
757 
758 /**************************************************************************/
759 
760 struct SmViewShell_Impl
761 {
762     sfx2::DocumentInserter* pDocInserter;
763     SfxRequest*             pRequest;
764 
765     SmViewShell_Impl() :
766           pDocInserter( NULL )
767         , pRequest( NULL )
768     {}
769 
770     ~SmViewShell_Impl()
771     {
772         delete pDocInserter;
773         delete pRequest;
774     }
775 };
776 
777 TYPEINIT1( SmViewShell, SfxViewShell );
778 
779 SFX_IMPL_INTERFACE(SmViewShell, SfxViewShell, SmResId(0))
780 {
781     SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_TOOLS | SFX_VISIBILITY_STANDARD |
782                                 SFX_VISIBILITY_FULLSCREEN | SFX_VISIBILITY_SERVER,
783                                 SmResId(RID_MATH_TOOLBOX ));
784 
785     SFX_CHILDWINDOW_REGISTRATION(SID_TASKPANE);
786     SFX_CHILDWINDOW_REGISTRATION(SmToolBoxWrapper::GetChildWindowId());
787     SFX_CHILDWINDOW_REGISTRATION(SmCmdBoxWrapper::GetChildWindowId());
788 }
789 
790 
791 SFX_IMPL_NAMED_VIEWFACTORY(SmViewShell, "Default")
792 {
793     SFX_VIEW_REGISTRATION(SmDocShell);
794 }
795 
796 
797 Size SmViewShell::GetOptimalSizePixel() const
798 {
799     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::GetOptimalSizePixel" );
800 
801     return aGraphic.LogicToPixel( ((SmViewShell*)this)->GetDoc()->GetSize() );
802 }
803 
804 
805 void SmViewShell::AdjustPosSizePixel(const Point &rPos, const Size &rSize)
806 {
807     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::AdjustPosSizePixel" );
808 
809     aGraphic.SetPosSizePixel(rPos, rSize);
810 }
811 
812 
813 void SmViewShell::InnerResizePixel(const Point &rOfs, const Size &rSize)
814 {
815     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::InnerResizePixel" );
816 
817     Size aObjSize = GetObjectShell()->GetVisArea().GetSize();
818     if ( aObjSize.Width() > 0 && aObjSize.Height() > 0 )
819     {
820         Size aProvidedSize = GetWindow()->PixelToLogic( rSize, MAP_100TH_MM );
821         SfxViewShell::SetZoomFactor( Fraction( aProvidedSize.Width(), aObjSize.Width() ),
822                         Fraction( aProvidedSize.Height(), aObjSize.Height() ) );
823     }
824 
825     SetBorderPixel( SvBorder() );
826     GetGraphicWindow().SetPosSizePixel(rOfs, rSize);
827     GetGraphicWindow().SetTotalSize();
828 }
829 
830 
831 void SmViewShell::OuterResizePixel(const Point &rOfs, const Size &rSize)
832 {
833     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::OuterResizePixel" );
834 
835     SmGraphicWindow &rWin = GetGraphicWindow();
836     rWin.SetPosSizePixel(rOfs, rSize);
837     if (GetDoc()->IsPreview())
838         rWin.ZoomToFitInWindow();
839     rWin.Update();
840 }
841 
842 
843 void SmViewShell::QueryObjAreaPixel( Rectangle& rRect ) const
844 {
845     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::QueryObjAreaPixel" );
846 
847     rRect.SetSize( GetGraphicWindow().GetSizePixel() );
848 }
849 
850 
851 void SmViewShell::SetZoomFactor( const Fraction &rX, const Fraction &rY )
852 {
853     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::SetZoomFactor" );
854 
855     const Fraction &rFrac = rX < rY ? rX : rY;
856     GetGraphicWindow().SetZoom( (sal_uInt16) long(rFrac * Fraction( 100, 1 )) );
857 
858     //Um Rundungsfehler zu minimieren lassen wir von der Basisklasse ggf.
859     //auch die krummen Werte einstellen
860     SfxViewShell::SetZoomFactor( rX, rY );
861 }
862 
863 
864 Size SmViewShell::GetTextLineSize(OutputDevice& rDevice, const String& rLine)
865 {
866     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::GetTextLineSize" );
867 
868     String aText;
869     Size   aSize(rDevice.GetTextWidth(rLine), rDevice.GetTextHeight());
870     sal_uInt16 nTabs = rLine.GetTokenCount('\t');
871 
872     if (nTabs > 0)
873     {
874         long TabPos = rDevice.GetTextWidth('n') * 8;
875 
876         aSize.Width() = 0;
877 
878         for (sal_uInt16 i = 0; i < nTabs; i++)
879         {
880             if (i > 0)
881                 aSize.Width() = ((aSize.Width() / TabPos) + 1) * TabPos;
882 
883             aText = rLine.GetToken(i, '\t');
884             aText.EraseLeadingChars('\t');
885             aText.EraseTrailingChars('\t');
886             aSize.Width() += rDevice.GetTextWidth(aText);
887         }
888     }
889 
890     return aSize;
891 }
892 
893 
894 Size SmViewShell::GetTextSize(OutputDevice& rDevice, const String& rText, long MaxWidth)
895 {
896     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::GetTextSize" );
897 
898     Size    aSize;
899     String  aLine;
900     Size    TextSize;
901     String  aText;
902     sal_uInt16  nLines = rText.GetTokenCount('\n');
903 
904     for (sal_uInt16 i = 0; i < nLines; i++)
905     {
906         aLine = rText.GetToken(i, '\n');
907         aLine.EraseAllChars('\r');
908         aLine.EraseLeadingChars('\n');
909         aLine.EraseTrailingChars('\n');
910 
911         aSize = GetTextLineSize(rDevice, aLine);
912 
913         if (aSize.Width() > MaxWidth)
914         {
915             do
916             {
917                 xub_StrLen m    = aLine.Len();
918                 xub_StrLen nLen = m;
919 
920                 for (xub_StrLen n = 0; n < nLen; n++)
921                 {
922                     sal_Unicode cLineChar = aLine.GetChar(n);
923                     if ((cLineChar == ' ') || (cLineChar == '\t'))
924                     {
925                         aText = aLine.Copy(0, n);
926                         if (GetTextLineSize(rDevice, aText).Width() < MaxWidth)
927                             m = n;
928                         else
929                             break;
930                     }
931                 }
932 
933                 aText = aLine.Copy(0, m);
934                 aLine.Erase(0, m);
935                 aSize = GetTextLineSize(rDevice, aText);
936                 TextSize.Height() += aSize.Height();
937                 TextSize.Width() = Max(TextSize.Width(), Min(aSize.Width(), MaxWidth));
938 
939                 aLine.EraseLeadingChars(' ');
940                 aLine.EraseLeadingChars('\t');
941                 aLine.EraseLeadingChars(' ');
942             }
943             while (aLine.Len() > 0);
944         }
945         else
946         {
947             TextSize.Height() += aSize.Height();
948             TextSize.Width() = Max(TextSize.Width(), aSize.Width());
949         }
950     }
951 
952     return TextSize;
953 }
954 
955 
956 void SmViewShell::DrawTextLine(OutputDevice& rDevice, const Point& rPosition, const String& rLine)
957 {
958     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::DrawTextLine" );
959 
960     String  aText;
961     Point   aPoint (rPosition);
962     sal_uInt16  nTabs = rLine.GetTokenCount('\t');
963 
964     if (nTabs > 0)
965     {
966         long TabPos = rDevice.GetTextWidth('n') * 8;
967 
968         for (sal_uInt16 i = 0; i < nTabs; i++)
969         {
970             if (i > 0)
971                 aPoint.X() = ((aPoint.X() / TabPos) + 1) * TabPos;
972 
973             aText = rLine.GetToken(i, '\t');
974             aText.EraseLeadingChars('\t');
975             aText.EraseTrailingChars('\t');
976             rDevice.DrawText(aPoint, aText);
977             aPoint.X() += rDevice.GetTextWidth(aText);
978         }
979     }
980     else
981         rDevice.DrawText(aPoint, rLine);
982 }
983 
984 
985 void SmViewShell::DrawText(OutputDevice& rDevice, const Point& rPosition, const String& rText, sal_uInt16 MaxWidth)
986 {
987     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::DrawText" );
988 
989     sal_uInt16  nLines = rText.GetTokenCount('\n');
990     Point   aPoint (rPosition);
991     Size    aSize;
992     String  aLine;
993     String  aText;
994 
995     for (sal_uInt16 i = 0; i < nLines; i++)
996     {
997         aLine = rText.GetToken(i, '\n');
998         aLine.EraseAllChars('\r');
999         aLine.EraseLeadingChars('\n');
1000         aLine.EraseTrailingChars('\n');
1001         aSize = GetTextLineSize(rDevice, aLine);
1002         if (aSize.Width() > MaxWidth)
1003         {
1004             do
1005             {
1006                 xub_StrLen m    = aLine.Len();
1007                 xub_StrLen nLen = m;
1008 
1009                 for (xub_StrLen n = 0; n < nLen; n++)
1010                 {
1011                     sal_Unicode cLineChar = aLine.GetChar(n);
1012                     if ((cLineChar == ' ') || (cLineChar == '\t'))
1013                     {
1014                         aText = aLine.Copy(0, n);
1015                         if (GetTextLineSize(rDevice, aText).Width() < MaxWidth)
1016                             m = n;
1017                         else
1018                             break;
1019                     }
1020                 }
1021                 aText = aLine.Copy(0, m);
1022                 aLine.Erase(0, m);
1023 
1024                 DrawTextLine(rDevice, aPoint, aText);
1025                 aPoint.Y() += aSize.Height();
1026 
1027                 aLine.EraseLeadingChars(' ');
1028                 aLine.EraseLeadingChars('\t');
1029                 aLine.EraseLeadingChars(' ');
1030             }
1031             while (GetTextLineSize(rDevice, aLine).Width() > MaxWidth);
1032 
1033             // print the remaining text
1034             if (aLine.Len() > 0)
1035             {
1036                 DrawTextLine(rDevice, aPoint, aLine);
1037                 aPoint.Y() += aSize.Height();
1038             }
1039         }
1040         else
1041         {
1042             DrawTextLine(rDevice, aPoint, aLine);
1043             aPoint.Y() += aSize.Height();
1044         }
1045     }
1046 }
1047 
1048 void SmViewShell::Impl_Print(
1049         OutputDevice &rOutDev,
1050         const SmPrintUIOptions &rPrintUIOptions,
1051         Rectangle aOutRect, Point aZeroPoint )
1052 {
1053     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::Impl_Print" );
1054 
1055     const bool bIsPrintTitle = rPrintUIOptions.getBoolValue( PRTUIOPT_TITLE_ROW, sal_True );
1056     const bool bIsPrintFrame = rPrintUIOptions.getBoolValue( PRTUIOPT_BORDER, sal_True );
1057     const bool bIsPrintFormulaText = rPrintUIOptions.getBoolValue( PRTUIOPT_FORMULA_TEXT, sal_True );
1058     SmPrintSize ePrintSize( static_cast< SmPrintSize >( rPrintUIOptions.getIntValue( PRTUIOPT_PRINT_FORMAT, PRINT_SIZE_NORMAL ) ));
1059     const sal_uInt16 nZoomFactor = static_cast< sal_uInt16 >(rPrintUIOptions.getIntValue( PRTUIOPT_PRINT_SCALE, 100 ));
1060 // IsIgnoreSpacesRight is a parser option! Thus it does not get evaluated here anymore (too late).
1061 //    const bool bNoRightSpaces = rPrintUIOptions.getBoolValue( PRTUIOPT_NO_RIGHT_SPACE, sal_True );
1062 
1063     rOutDev.Push();
1064     rOutDev.SetLineColor( Color(COL_BLACK) );
1065 
1066     // output text on top
1067     if (bIsPrintTitle)
1068     {
1069         Size aSize600 (0, 600);
1070         Size aSize650 (0, 650);
1071         Font aFont(FAMILY_DONTKNOW, aSize600);
1072 
1073         aFont.SetAlign(ALIGN_TOP);
1074         aFont.SetWeight(WEIGHT_BOLD);
1075         aFont.SetSize(aSize650);
1076         aFont.SetColor( Color(COL_BLACK) );
1077         rOutDev.SetFont(aFont);
1078 
1079         Size aTitleSize (GetTextSize(rOutDev, GetDoc()->GetTitle(), aOutRect.GetWidth() - 200));
1080 
1081         aFont.SetWeight(WEIGHT_NORMAL);
1082         aFont.SetSize(aSize600);
1083         rOutDev.SetFont(aFont);
1084 
1085         Size aDescSize (GetTextSize(rOutDev, GetDoc()->GetComment(), aOutRect.GetWidth() - 200));
1086 
1087         if (bIsPrintFrame)
1088             rOutDev.DrawRect(Rectangle(aOutRect.TopLeft(),
1089                                Size(aOutRect.GetWidth(), 100 + aTitleSize.Height() + 200 + aDescSize.Height() + 100)));
1090         aOutRect.Top() += 200;
1091 
1092         // output title
1093         aFont.SetWeight(WEIGHT_BOLD);
1094         aFont.SetSize(aSize650);
1095         rOutDev.SetFont(aFont);
1096         Point aPoint(aOutRect.Left() + (aOutRect.GetWidth() - aTitleSize.Width())  / 2,
1097                      aOutRect.Top());
1098         DrawText(rOutDev, aPoint, GetDoc()->GetTitle(),
1099                  sal::static_int_cast< sal_uInt16 >(aOutRect.GetWidth() - 200));
1100         aOutRect.Top() += aTitleSize.Height() + 200;
1101 
1102         // output description
1103         aFont.SetWeight(WEIGHT_NORMAL);
1104         aFont.SetSize(aSize600);
1105         rOutDev.SetFont(aFont);
1106         aPoint.X() = aOutRect.Left() + (aOutRect.GetWidth()  - aDescSize.Width())  / 2;
1107         aPoint.Y() = aOutRect.Top();
1108         DrawText(rOutDev, aPoint, GetDoc()->GetComment(),
1109                  sal::static_int_cast< sal_uInt16 >(aOutRect.GetWidth() - 200));
1110         aOutRect.Top() += aDescSize.Height() + 300;
1111     }
1112 
1113     // output text on bottom
1114     if (bIsPrintFormulaText)
1115     {
1116         Font aFont(FAMILY_DONTKNOW, Size(0, 600));
1117         aFont.SetAlign(ALIGN_TOP);
1118         aFont.SetColor( Color(COL_BLACK) );
1119 
1120         // get size
1121         rOutDev.SetFont(aFont);
1122 
1123         Size aSize (GetTextSize(rOutDev, GetDoc()->GetText(), aOutRect.GetWidth() - 200));
1124 
1125         aOutRect.Bottom() -= aSize.Height() + 600;
1126 
1127         if (bIsPrintFrame)
1128             rOutDev.DrawRect(Rectangle(aOutRect.BottomLeft(),
1129                                Size(aOutRect.GetWidth(), 200 + aSize.Height() + 200)));
1130 
1131         Point aPoint (aOutRect.Left() + (aOutRect.GetWidth()  - aSize.Width())  / 2,
1132                       aOutRect.Bottom() + 300);
1133         DrawText(rOutDev, aPoint, GetDoc()->GetText(),
1134                  sal::static_int_cast< sal_uInt16 >(aOutRect.GetWidth() - 200));
1135         aOutRect.Bottom() -= 200;
1136     }
1137 
1138     if (bIsPrintFrame)
1139         rOutDev.DrawRect(aOutRect);
1140 
1141     aOutRect.Top()    += 100;
1142     aOutRect.Left()   += 100;
1143     aOutRect.Bottom() -= 100;
1144     aOutRect.Right()  -= 100;
1145 
1146     Size aSize (GetDoc()->GetSize());
1147 
1148     MapMode    OutputMapMode;
1149     // PDF export should always use PRINT_SIZE_NORMAL ...
1150     if (!rPrintUIOptions.getBoolValue( "IsPrinter", sal_False ) )
1151         ePrintSize = PRINT_SIZE_NORMAL;
1152     switch (ePrintSize)
1153     {
1154         case PRINT_SIZE_NORMAL:
1155             OutputMapMode = MapMode(MAP_100TH_MM);
1156             break;
1157 
1158         case PRINT_SIZE_SCALED:
1159             if ((aSize.Width() > 0) && (aSize.Height() > 0))
1160             {
1161                 Size     OutputSize (rOutDev.LogicToPixel(Size(aOutRect.GetWidth(),
1162                                                             aOutRect.GetHeight()), MapMode(MAP_100TH_MM)));
1163                 Size     GraphicSize (rOutDev.LogicToPixel(aSize, MapMode(MAP_100TH_MM)));
1164                 sal_uInt16   nZ = (sal_uInt16) Min((long)Fraction(OutputSize.Width()  * 100L, GraphicSize.Width()),
1165                                               (long)Fraction(OutputSize.Height() * 100L, GraphicSize.Height()));
1166                 Fraction aFraction ((sal_uInt16) Max ((sal_uInt16) MINZOOM, Min((sal_uInt16) MAXZOOM, (sal_uInt16) (nZ - 10))), (sal_uInt16) 100);
1167 
1168                 OutputMapMode = MapMode(MAP_100TH_MM, aZeroPoint, aFraction, aFraction);
1169             }
1170             else
1171                 OutputMapMode = MapMode(MAP_100TH_MM);
1172             break;
1173 
1174         case PRINT_SIZE_ZOOMED:
1175         {
1176             Fraction aFraction( nZoomFactor, 100 );
1177 
1178             OutputMapMode = MapMode(MAP_100TH_MM, aZeroPoint, aFraction, aFraction);
1179             break;
1180         }
1181     }
1182 
1183     aSize = rOutDev.PixelToLogic(rOutDev.LogicToPixel(aSize, OutputMapMode),
1184                                    MapMode(MAP_100TH_MM));
1185 
1186     Point aPos (aOutRect.Left() + (aOutRect.GetWidth()  - aSize.Width())  / 2,
1187                 aOutRect.Top()  + (aOutRect.GetHeight() - aSize.Height()) / 2);
1188 
1189     aPos     = rOutDev.PixelToLogic(rOutDev.LogicToPixel(aPos, MapMode(MAP_100TH_MM)),
1190                                           OutputMapMode);
1191     aOutRect   = rOutDev.PixelToLogic(rOutDev.LogicToPixel(aOutRect, MapMode(MAP_100TH_MM)),
1192                                           OutputMapMode);
1193 
1194     rOutDev.SetMapMode(OutputMapMode);
1195     rOutDev.SetClipRegion(Region(aOutRect));
1196     GetDoc()->Draw(rOutDev, aPos);
1197     rOutDev.SetClipRegion();
1198 
1199     rOutDev.Pop();
1200 }
1201 
1202 sal_uInt16 SmViewShell::Print(SfxProgress & /*rProgress*/, sal_Bool /*bIsAPI*/)
1203 {
1204     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::Print" );
1205     DBG_ASSERT( 0, "SmViewShell::Print: no longer used with new UI print dialog. Should be removed!!" );
1206     return 0;
1207 }
1208 
1209 
1210 SfxPrinter* SmViewShell::GetPrinter(sal_Bool bCreate)
1211 {
1212     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::GetPrinter" );
1213 
1214     SmDocShell *pDoc = GetDoc();
1215     if ( pDoc->HasPrinter() || bCreate )
1216         return pDoc->GetPrinter();
1217     return 0;
1218 }
1219 
1220 
1221 sal_uInt16 SmViewShell::SetPrinter(SfxPrinter *pNewPrinter, sal_uInt16 nDiffFlags, bool )
1222 {
1223     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::SetPrinter" );
1224     SfxPrinter *pOld = GetDoc()->GetPrinter();
1225     if ( pOld && pOld->IsPrinting() )
1226         return SFX_PRINTERROR_BUSY;
1227 
1228     if ((nDiffFlags & SFX_PRINTER_PRINTER) == SFX_PRINTER_PRINTER)
1229         GetDoc()->SetPrinter( pNewPrinter );
1230 
1231     if ((nDiffFlags & SFX_PRINTER_OPTIONS) == SFX_PRINTER_OPTIONS)
1232     {
1233         SmModule *pp = SM_MOD();
1234         pp->GetConfig()->ItemSetToConfig(pNewPrinter->GetOptions());
1235     }
1236     return 0;
1237 }
1238 
1239 
1240 SfxTabPage* SmViewShell::CreatePrintOptionsPage(Window *pParent,
1241                                                 const SfxItemSet &rOptions)
1242 {
1243     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::CreatePrintOptionsPage" );
1244 
1245     return SmPrintOptionsTabPage::Create(pParent, rOptions);
1246 }
1247 
1248 
1249 SmEditWindow *SmViewShell::GetEditWindow()
1250 {
1251     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::GetEditWindow" );
1252 
1253     SmCmdBoxWrapper *pWrapper = (SmCmdBoxWrapper *) GetViewFrame()->
1254             GetChildWindow( SmCmdBoxWrapper::GetChildWindowId() );
1255 
1256     if (pWrapper != NULL)
1257     {
1258         SmEditWindow *pEditWin  = pWrapper->GetEditWindow();
1259         DBG_ASSERT( pEditWin, "SmEditWindow missing" );
1260         return pEditWin;
1261     }
1262 
1263     return NULL;
1264 }
1265 
1266 
1267 void SmViewShell::SetStatusText(const String& Text)
1268 {
1269     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::SetStatusText" );
1270 
1271     StatusText = Text;
1272     GetViewFrame()->GetBindings().Invalidate(SID_TEXTSTATUS);
1273 }
1274 
1275 
1276 void SmViewShell::ShowError( const SmErrorDesc *pErrorDesc )
1277 {
1278     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::ShowError" );
1279 
1280     DBG_ASSERT(GetDoc(), "Sm : Document missing");
1281     if (pErrorDesc || 0 != (pErrorDesc = GetDoc()->GetParser().GetError(0)) )
1282     {
1283         SetStatusText( pErrorDesc->Text );
1284         GetEditWindow()->MarkError( Point( pErrorDesc->pNode->GetColumn(),
1285                                            pErrorDesc->pNode->GetRow()));
1286     }
1287 }
1288 
1289 
1290 void SmViewShell::NextError()
1291 {
1292     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::NextError" );
1293 
1294     DBG_ASSERT(GetDoc(), "Sm : Document missing");
1295     const SmErrorDesc   *pErrorDesc = GetDoc()->GetParser().NextError();
1296 
1297     if (pErrorDesc)
1298         ShowError( pErrorDesc );
1299 }
1300 
1301 
1302 void SmViewShell::PrevError()
1303 {
1304     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::PrevError" );
1305 
1306     DBG_ASSERT(GetDoc(), "Sm : Document missing");
1307     const SmErrorDesc   *pErrorDesc = GetDoc()->GetParser().PrevError();
1308 
1309     if (pErrorDesc)
1310         ShowError( pErrorDesc );
1311 }
1312 
1313 
1314 sal_Bool SmViewShell::Insert( SfxMedium& rMedium )
1315 {
1316     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::Insert" );
1317 
1318     SmDocShell *pDoc = GetDoc();
1319     String aText( pDoc->GetText() );
1320     String aTemp = aText;
1321     sal_Bool bRet = sal_False, bChkOldVersion = sal_True;
1322 
1323     uno::Reference < embed::XStorage > xStorage = rMedium.GetStorage();
1324     uno::Reference< container::XNameAccess > xNameAccess( xStorage, uno::UNO_QUERY );
1325     if ( xNameAccess.is() && xNameAccess->getElementNames().getLength() )
1326     {
1327         if ( xNameAccess->hasByName( C2S( "content.xml" ) ) || xNameAccess->hasByName( C2S( "Content.xml" ) ))
1328         {
1329             bChkOldVersion = sal_False;
1330             // is this a fabulous math package ?
1331             Reference<com::sun::star::frame::XModel> xModel(pDoc->GetModel());
1332             SmXMLImportWrapper aEquation(xModel);    //!! modifies the result of pDoc->GetText() !!
1333             bRet = 0 == aEquation.Import(rMedium);
1334         }
1335     }
1336 
1337     if( bRet )
1338     {
1339         aText = pDoc->GetText();
1340         SmEditWindow *pEditWin = GetEditWindow();
1341         if (pEditWin)
1342             pEditWin->InsertText( aText );
1343         else
1344         {
1345             DBG_ERROR( "EditWindow missing" );
1346             aTemp += aText;
1347             aText  = aTemp;
1348         }
1349 
1350         pDoc->Parse();
1351         pDoc->SetModified(sal_True);
1352 
1353         SfxBindings &rBnd = GetViewFrame()->GetBindings();
1354         rBnd.Invalidate(SID_GAPHIC_SM);
1355         rBnd.Invalidate(SID_TEXT);
1356     }
1357     return bRet;
1358 }
1359 
1360 
1361 sal_Bool SmViewShell::InsertFrom(SfxMedium &rMedium)
1362 {
1363     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::InsertFrom" );
1364 
1365     sal_Bool        bSuccess = sal_False;
1366     SmDocShell *pDoc = GetDoc();
1367     SvStream   *pStream = rMedium.GetInStream();
1368     String      aText( pDoc->GetText() );
1369     String      aTemp = aText;
1370 
1371     if (pStream)
1372     {
1373         const String& rFltName = rMedium.GetFilter()->GetFilterName();
1374         if ( rFltName.EqualsAscii(MATHML_XML) )
1375         {
1376             Reference<com::sun::star::frame::XModel> xModel( pDoc->GetModel() );
1377             SmXMLImportWrapper aEquation(xModel);    //!! modifies the result of pDoc->GetText() !!
1378             bSuccess = 0 == aEquation.Import(rMedium);
1379         }
1380         else
1381         {
1382             //bSuccess = ImportSM20File( pStream );
1383         }
1384     }
1385 
1386     if( bSuccess )
1387     {
1388         aText = pDoc->GetText();
1389         SmEditWindow *pEditWin = GetEditWindow();
1390         if (pEditWin)
1391             pEditWin->InsertText( aText );
1392         else
1393         {
1394             DBG_ERROR( "EditWindow missing" );
1395             aTemp += aText;
1396             aText  = aTemp;
1397         }
1398 
1399         pDoc->Parse();
1400         pDoc->SetModified(sal_True);
1401 
1402         SfxBindings &rBnd = GetViewFrame()->GetBindings();
1403         rBnd.Invalidate(SID_GAPHIC_SM);
1404         rBnd.Invalidate(SID_TEXT);
1405     }
1406 
1407     return bSuccess;
1408 }
1409 
1410 
1411 void SmViewShell::Execute(SfxRequest& rReq)
1412 {
1413     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::Execute" );
1414 
1415     SmEditWindow *pWin = GetEditWindow();
1416 
1417     switch (rReq.GetSlot())
1418     {
1419         case SID_FORMULACURSOR:
1420         {
1421             SmModule *pp = SM_MOD();
1422 
1423             const SfxItemSet  *pArgs = rReq.GetArgs();
1424             const SfxPoolItem *pItem;
1425 
1426             sal_Bool  bVal;
1427             if ( pArgs &&
1428                  SFX_ITEM_SET == pArgs->GetItemState( SID_FORMULACURSOR, sal_False, &pItem))
1429                 bVal = ((SfxBoolItem *) pItem)->GetValue();
1430             else
1431                 bVal = !pp->GetConfig()->IsShowFormulaCursor();
1432 
1433             pp->GetConfig()->SetShowFormulaCursor(bVal);
1434             GetGraphicWindow().ShowCursor(bVal);
1435             break;
1436         }
1437         case SID_DRAW:
1438             if (pWin)
1439             {
1440                 GetDoc()->SetText( pWin->GetText() );
1441                 SetStatusText(String());
1442                 ShowError( 0 );
1443                 GetDoc()->Repaint();
1444             }
1445             break;
1446 
1447         case SID_ADJUST:
1448         case SID_FITINWINDOW:
1449             aGraphic.ZoomToFitInWindow();
1450             break;
1451 
1452         case SID_VIEW050:
1453             aGraphic.SetZoom(50);
1454             break;
1455 
1456         case SID_VIEW100:
1457             aGraphic.SetZoom(100);
1458             break;
1459 
1460         case SID_VIEW200:
1461             aGraphic.SetZoom(200);
1462             break;
1463 
1464         case SID_ZOOMIN:
1465             aGraphic.SetZoom(aGraphic.GetZoom() + 25);
1466             break;
1467 
1468         case SID_ZOOMOUT:
1469             DBG_ASSERT(aGraphic.GetZoom() >= 25, "Sm: falsches sal_uInt16 Argument");
1470             aGraphic.SetZoom(aGraphic.GetZoom() - 25);
1471             break;
1472 
1473         case SID_COPYOBJECT:
1474         {
1475             //TODO/LATER: does not work because of UNO Tunneling - will be fixed later
1476             Reference< datatransfer::XTransferable > xTrans( GetDoc()->GetModel(), uno::UNO_QUERY );
1477             if( xTrans.is() )
1478             {
1479                 Reference< lang::XUnoTunnel> xTnnl( xTrans, uno::UNO_QUERY);
1480                 if( xTnnl.is() )
1481                 {
1482                     TransferableHelper* pTrans = reinterpret_cast< TransferableHelper * >(
1483                             sal::static_int_cast< sal_uIntPtr >(
1484                             xTnnl->getSomething( TransferableHelper::getUnoTunnelId() )));
1485                     if( pTrans )
1486                         pTrans->CopyToClipboard( this ? GetEditWindow() : 0 );
1487                 }
1488             }
1489         }
1490         break;
1491 
1492         case SID_PASTEOBJECT:
1493         {
1494             TransferableDataHelper aData( TransferableDataHelper::CreateFromSystemClipboard(this ? GetEditWindow(): 0) );
1495             uno::Reference < io::XInputStream > xStrm;
1496             SotFormatStringId nId;
1497             if( aData.GetTransferable().is() &&
1498                 ( aData.HasFormat( nId = SOT_FORMATSTR_ID_EMBEDDED_OBJ ) ||
1499                   (aData.HasFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ) &&
1500                    aData.HasFormat( nId = SOT_FORMATSTR_ID_EMBED_SOURCE ))) &&
1501                 aData.GetInputStream( nId, xStrm ) && xStrm.is() )
1502             {
1503                 try
1504                 {
1505                     uno::Reference < embed::XStorage > xStorage =
1506                             ::comphelper::OStorageHelper::GetStorageFromInputStream( xStrm, ::comphelper::getProcessServiceFactory() );
1507                     uno::Reference < beans::XPropertySet > xProps( xStorage, uno::UNO_QUERY );
1508                     SfxMedium aMedium( xStorage, String() );
1509                     Insert( aMedium );
1510                     GetDoc()->UpdateText();
1511                 }
1512                 catch (uno::Exception &)
1513                 {
1514                     DBG_ERROR( "SmViewShell::Execute (SID_PASTEOBJECT): failed to get storage from input stream" );
1515                 }
1516             }
1517         }
1518         break;
1519 
1520 
1521         case SID_CUT:
1522             if (pWin)
1523                 pWin->Cut();
1524             break;
1525 
1526         case SID_COPY:
1527             if (pWin)
1528             {
1529                 if (pWin->IsAllSelected())
1530                 {
1531                     GetViewFrame()->GetDispatcher()->Execute(
1532                                 SID_COPYOBJECT, SFX_CALLMODE_STANDARD,
1533                                 new SfxVoidItem(SID_COPYOBJECT), 0L);
1534                 }
1535                 else
1536                     pWin->Copy();
1537             }
1538             break;
1539 
1540         case SID_PASTE:
1541             {
1542                 sal_Bool bCallExec = 0 == pWin;
1543                 if( !bCallExec )
1544                 {
1545                     TransferableDataHelper aDataHelper(
1546                         TransferableDataHelper::CreateFromSystemClipboard(
1547                                                     GetEditWindow()) );
1548 
1549                     if( aDataHelper.GetTransferable().is() &&
1550                         aDataHelper.HasFormat( FORMAT_STRING ))
1551                         pWin->Paste();
1552                     else
1553                         bCallExec = sal_True;
1554                 }
1555                 if( bCallExec )
1556                 {
1557                     GetViewFrame()->GetDispatcher()->Execute(
1558                             SID_PASTEOBJECT, SFX_CALLMODE_STANDARD,
1559                             new SfxVoidItem(SID_PASTEOBJECT), 0L);
1560                 }
1561             }
1562             break;
1563 
1564         case SID_DELETE:
1565             if (pWin)
1566                 pWin->Delete();
1567             break;
1568 
1569         case SID_SELECT:
1570             if (pWin)
1571                 pWin->SelectAll();
1572             break;
1573 
1574         case SID_INSERTCOMMAND:
1575         {
1576             const SfxInt16Item& rItem =
1577                 (const SfxInt16Item&)rReq.GetArgs()->Get(SID_INSERTCOMMAND);
1578 
1579             if (pWin)
1580                 pWin->InsertCommand(rItem.GetValue());
1581             break;
1582         }
1583 
1584         case SID_INSERTTEXT:
1585         {
1586             const SfxStringItem& rItem =
1587                     (const SfxStringItem&)rReq.GetArgs()->Get(SID_INSERTTEXT);
1588             if (pWin)
1589                 pWin->InsertText(rItem.GetValue());
1590             break;
1591         }
1592 
1593         case SID_IMPORT_FORMULA:
1594         {
1595             delete pImpl->pRequest;
1596             pImpl->pRequest = new SfxRequest( rReq );
1597             delete pImpl->pDocInserter;
1598             pImpl->pDocInserter =
1599                 new ::sfx2::DocumentInserter( 0, GetDoc()->GetFactory().GetFactoryName(), 0 );
1600             pImpl->pDocInserter->StartExecuteModal( LINK( this, SmViewShell, DialogClosedHdl ) );
1601             break;
1602         }
1603 
1604         case SID_NEXTERR:
1605             NextError();
1606             if (pWin)
1607                 pWin->GrabFocus();
1608             break;
1609 
1610         case SID_PREVERR:
1611             PrevError();
1612             if (pWin)
1613                 pWin->GrabFocus();
1614             break;
1615 
1616         case SID_NEXTMARK:
1617             if (pWin)
1618             {
1619                 pWin->SelNextMark();
1620                 pWin->GrabFocus();
1621             }
1622             break;
1623 
1624         case SID_PREVMARK:
1625             if (pWin)
1626             {
1627                 pWin->SelPrevMark();
1628                 pWin->GrabFocus();
1629             }
1630             break;
1631 
1632         case SID_TEXTSTATUS:
1633         {
1634             if (rReq.GetArgs() != NULL)
1635             {
1636                 const SfxStringItem& rItem =
1637                     (const SfxStringItem&)rReq.GetArgs()->Get(SID_TEXTSTATUS);
1638 
1639                 SetStatusText(rItem.GetValue());
1640             }
1641 
1642             break;
1643         }
1644 
1645         case SID_GETEDITTEXT:
1646             if (pWin)
1647                 if (pWin->GetText ().Len ()) GetDoc()->SetText( pWin->GetText() );
1648             break;
1649 
1650         case SID_ATTR_ZOOM:
1651         {
1652             if ( !GetViewFrame()->GetFrame().IsInPlace() )
1653             {
1654                 //CHINA001 SvxZoomDialog *pDlg = 0;
1655                 AbstractSvxZoomDialog *pDlg = 0;
1656                 const SfxItemSet *pSet = rReq.GetArgs();
1657                 if ( !pSet )
1658                 {
1659                     SfxItemSet aSet( GetDoc()->GetPool(), SID_ATTR_ZOOM, SID_ATTR_ZOOM);
1660                     aSet.Put( SvxZoomItem( SVX_ZOOM_PERCENT, aGraphic.GetZoom()));
1661                     //CHINA001 pDlg = new SvxZoomDialog( &GetViewFrame()->GetWindow(), aSet);
1662                     SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
1663                     if(pFact)
1664                     {
1665                         pDlg = pFact->CreateSvxZoomDialog(&GetViewFrame()->GetWindow(), aSet);
1666                         DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
1667                     }
1668                     pDlg->SetLimits( MINZOOM, MAXZOOM );
1669                     if( pDlg->Execute() != RET_CANCEL )
1670                         pSet = pDlg->GetOutputItemSet();
1671                 }
1672                 if ( pSet )
1673                 {
1674                     const SvxZoomItem &rZoom = (const SvxZoomItem &)pSet->Get(SID_ATTR_ZOOM);
1675                     switch( rZoom.GetType() )
1676                     {
1677                         case SVX_ZOOM_PERCENT:
1678                             aGraphic.SetZoom((sal_uInt16)rZoom.GetValue ());
1679                             break;
1680 
1681                         case SVX_ZOOM_OPTIMAL:
1682                             aGraphic.ZoomToFitInWindow();
1683                             break;
1684 
1685                         case SVX_ZOOM_PAGEWIDTH:
1686                         case SVX_ZOOM_WHOLEPAGE:
1687                         {
1688                             const MapMode aMap( MAP_100TH_MM );
1689                             SfxPrinter *pPrinter = GetPrinter( sal_True );
1690                             Point aPoint;
1691                             Rectangle  OutputRect(aPoint, pPrinter->GetOutputSize());
1692                             Size       OutputSize(pPrinter->LogicToPixel(Size(OutputRect.GetWidth(),
1693                                                                               OutputRect.GetHeight()), aMap));
1694                             Size       GraphicSize(pPrinter->LogicToPixel(GetDoc()->GetSize(), aMap));
1695                             sal_uInt16     nZ = (sal_uInt16) Min((long)Fraction(OutputSize.Width()  * 100L, GraphicSize.Width()),
1696                                                          (long)Fraction(OutputSize.Height() * 100L, GraphicSize.Height()));
1697                             aGraphic.SetZoom (nZ);
1698                             break;
1699                         }
1700                         default:
1701                             break;
1702                     }
1703                 }
1704                 delete pDlg;
1705             }
1706         }
1707         break;
1708 
1709         case SID_TOOLBOX:
1710         {
1711             GetViewFrame()->ToggleChildWindow( SmToolBoxWrapper::GetChildWindowId() );
1712         }
1713         break;
1714 
1715         case SID_SYMBOLS_CATALOGUE:
1716         {
1717 
1718             // get device used to retrieve the FontList
1719             SmDocShell *pDoc = GetDoc();
1720             OutputDevice *pDev = pDoc->GetPrinter();
1721             if (!pDev || pDev->GetDevFontCount() == 0)
1722                 pDev = &SM_MOD()->GetDefaultVirtualDev();
1723             DBG_ASSERT (pDev, "device for font list missing" );
1724 
1725             SmModule *pp = SM_MOD();
1726             SmSymbolDialog( NULL, pDev, pp->GetSymbolManager(), *this ).Execute();
1727         }
1728         break;
1729     }
1730     rReq.Done();
1731 }
1732 
1733 
1734 void SmViewShell::GetState(SfxItemSet &rSet)
1735 {
1736     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::GetState" );
1737 
1738     SfxWhichIter aIter(rSet);
1739 
1740     SmEditWindow *pEditWin = GetEditWindow();
1741     for (sal_uInt16 nWh = aIter.FirstWhich(); nWh != 0; nWh = aIter.NextWhich())
1742     {
1743         switch (nWh)
1744         {
1745         case SID_CUT:
1746         case SID_COPY:
1747         case SID_DELETE:
1748             if (! pEditWin || ! pEditWin->IsSelected())
1749                 rSet.DisableItem(nWh);
1750             break;
1751 
1752         case SID_PASTE:
1753             if( !xClipEvtLstnr.is()  &&  pEditWin)
1754             {
1755                 TransferableDataHelper aDataHelper(
1756                         TransferableDataHelper::CreateFromSystemClipboard(
1757                                                         pEditWin) );
1758 
1759                 bPasteState = aDataHelper.GetTransferable().is() &&
1760                  ( aDataHelper.HasFormat( FORMAT_STRING ) ||
1761                    aDataHelper.HasFormat( SOT_FORMATSTR_ID_EMBEDDED_OBJ ) ||
1762                    (aDataHelper.HasFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR )
1763                      && aDataHelper.HasFormat( SOT_FORMATSTR_ID_EMBED_SOURCE )));
1764             }
1765             if( !bPasteState )
1766                 rSet.DisableItem( nWh );
1767             break;
1768 
1769         case SID_ATTR_ZOOM:
1770             rSet.Put(SvxZoomItem( SVX_ZOOM_PERCENT, aGraphic.GetZoom()));
1771             /* no break here */
1772         case SID_VIEW050:
1773         case SID_VIEW100:
1774         case SID_VIEW200:
1775         case SID_ADJUST:
1776         case SID_ZOOMIN:
1777         case SID_ZOOMOUT:
1778         case SID_FITINWINDOW:
1779             if ( GetViewFrame()->GetFrame().IsInPlace() )
1780                 rSet.DisableItem( nWh );
1781             break;
1782 
1783         case SID_NEXTERR:
1784         case SID_PREVERR:
1785         case SID_NEXTMARK:
1786         case SID_PREVMARK:
1787         case SID_DRAW:
1788         case SID_SELECT:
1789             if (! pEditWin || pEditWin->IsEmpty())
1790                 rSet.DisableItem(nWh);
1791             break;
1792 
1793         case SID_TEXTSTATUS:
1794             {
1795                 rSet.Put(SfxStringItem(nWh, StatusText));
1796             }
1797             break;
1798 
1799         case SID_FORMULACURSOR:
1800             {
1801                 SmModule *pp = SM_MOD();
1802                 rSet.Put(SfxBoolItem(nWh, pp->GetConfig()->IsShowFormulaCursor()));
1803             }
1804             break;
1805 
1806         case SID_TOOLBOX:
1807             {
1808                 sal_Bool bState = sal_False;
1809                 SfxChildWindow *pChildWnd = GetViewFrame()->
1810                         GetChildWindow( SmToolBoxWrapper::GetChildWindowId() );
1811                 if (pChildWnd  &&  pChildWnd->GetWindow()->IsVisible())
1812                     bState = sal_True;
1813                 rSet.Put(SfxBoolItem(SID_TOOLBOX, bState));
1814             }
1815             break;
1816 
1817         }
1818     }
1819 }
1820 
1821 
1822 SmViewShell::SmViewShell(SfxViewFrame *pFrame_, SfxViewShell *):
1823     SfxViewShell(pFrame_, SFX_VIEW_HAS_PRINTOPTIONS | SFX_VIEW_CAN_PRINT),
1824     aGraphic(this),
1825     aGraphicController(aGraphic, SID_GAPHIC_SM, pFrame_->GetBindings()),
1826     pImpl( new SmViewShell_Impl )
1827 {
1828     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::SmViewShell" );
1829 
1830 //    pViewFrame = &pFrame_->GetWindow();
1831 
1832     SetStatusText(String());
1833     SetWindow(&aGraphic);
1834     SfxShell::SetName(C2S("SmView"));
1835     SfxShell::SetUndoManager( &GetDoc()->GetEditEngine().GetUndoManager() );
1836     SetHelpId( HID_SMA_VIEWSHELL_DOCUMENT );
1837 }
1838 
1839 
1840 SmViewShell::~SmViewShell()
1841 {
1842     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::~SmViewShell" );
1843 
1844     //!! this view shell is not active anymore !!
1845     // Thus 'SmGetActiveView' will give a 0 pointer.
1846     // Thus we need to supply this view as argument
1847     SmEditWindow *pEditWin = GetEditWindow();
1848     if (pEditWin)
1849         pEditWin->DeleteEditView( *this );
1850     delete pImpl;
1851 }
1852 
1853 void SmViewShell::Deactivate( sal_Bool bIsMDIActivate )
1854 {
1855     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::Deactivate" );
1856 
1857     SmEditWindow *pEdit = GetEditWindow();
1858     if ( pEdit )
1859         pEdit->Flush();
1860 
1861     SfxViewShell::Deactivate( bIsMDIActivate );
1862 }
1863 
1864 
1865 void SmViewShell::Activate( sal_Bool bIsMDIActivate )
1866 {
1867     RTL_LOGFILE_CONTEXT( aLog, "starmath: SmViewShell::Activate" );
1868 
1869     SfxViewShell::Activate( bIsMDIActivate );
1870 
1871     SmEditWindow *pEdit = GetEditWindow();
1872     if ( pEdit )
1873     {
1874         //! Since there is no way to be informed if a "drag and drop"
1875         //! event has taken place, we call SetText here in order to
1876         //! syncronize the GraphicWindow display with the text in the
1877         //! EditEngine.
1878         SmDocShell *pDoc = GetDoc();
1879         pDoc->SetText( pDoc->GetEditEngine().GetText( LINEEND_LF ) );
1880 
1881         if ( bIsMDIActivate )
1882             pEdit->GrabFocus();
1883     }
1884 }
1885 
1886 //------------------------------------------------------------------
1887 
1888 IMPL_LINK( SmViewShell, DialogClosedHdl, sfx2::FileDialogHelper*, _pFileDlg )
1889 {
1890     DBG_ASSERT( _pFileDlg, "SmViewShell::DialogClosedHdl(): no file dialog" );
1891     DBG_ASSERT( pImpl->pDocInserter, "ScDocShell::DialogClosedHdl(): no document inserter" );
1892 
1893     if ( ERRCODE_NONE == _pFileDlg->GetError() )
1894     {
1895         //sal_uInt16 nSlot = pImpl->pRequest->GetSlot();
1896         SfxMedium* pMedium = pImpl->pDocInserter->CreateMedium();
1897 
1898         if ( pMedium != NULL )
1899         {
1900             if ( pMedium->IsStorage() )
1901                 Insert( *pMedium );
1902             else
1903                 InsertFrom( *pMedium );
1904             delete pMedium;
1905 
1906             SmDocShell* pDoc = GetDoc();
1907             pDoc->UpdateText();
1908             pDoc->ArrangeFormula();
1909             pDoc->Repaint();
1910             // adjust window, repaint, increment ModifyCount,...
1911             GetViewFrame()->GetBindings().Invalidate(SID_GAPHIC_SM);
1912         }
1913     }
1914 
1915     pImpl->pRequest->SetReturnValue( SfxBoolItem( pImpl->pRequest->GetSlot(), sal_True ) );
1916     pImpl->pRequest->Done();
1917     return 0;
1918 }
1919 
1920 void SmViewShell::Notify( SfxBroadcaster& , const SfxHint& rHint )
1921 {
1922     if ( rHint.IsA(TYPE(SfxSimpleHint)) )
1923     {
1924         switch( ( (SfxSimpleHint&) rHint ).GetId() )
1925         {
1926             case SFX_HINT_MODECHANGED:
1927             case SFX_HINT_DOCCHANGED:
1928                 GetViewFrame()->GetBindings().InvalidateAll(sal_False);
1929                 break;
1930             default:
1931                 break;
1932         }
1933     }
1934 }
1935 
1936