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