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