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