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