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 "viscrs.hxx"
21 : #include <sfx2/frame.hxx>
22 : #include <sfx2/printer.hxx>
23 : #include <cmdid.h>
24 : #include <hintids.hxx>
25 : #include <docsh.hxx>
26 : #include <rubylist.hxx>
27 : #include <doc.hxx>
28 : #include <IDocumentDeviceAccess.hxx>
29 : #include <unotxvw.hxx>
30 : #include <unodispatch.hxx>
31 : #include <unomap.hxx>
32 : #include <unostyle.hxx>
33 : #include <unoprnms.hxx>
34 : #include <view.hxx>
35 : #include <viewopt.hxx>
36 : #include <unomod.hxx>
37 : #include <unoframe.hxx>
38 : #include <unocrsr.hxx>
39 : #include <wrtsh.hxx>
40 : #include <unotbl.hxx>
41 : #include <svx/fmshell.hxx>
42 : #include <svx/svdview.hxx>
43 : #include <svx/svdpage.hxx>
44 : #include <svx/svdouno.hxx>
45 : #include <svx/svdogrp.hxx>
46 : #include <editeng/pbinitem.hxx>
47 : #include <pagedesc.hxx>
48 : #include <editeng/lrspitem.hxx>
49 : #include <editeng/ulspitem.hxx>
50 : #include <sfx2/bindings.hxx>
51 : #include <sfx2/request.hxx>
52 : #include <frmatr.hxx>
53 : #include <osl/mutex.hxx>
54 : #include <IMark.hxx>
55 : #include <unotxdoc.hxx>
56 : #include <unodraw.hxx>
57 : #include <svx/unoshape.hxx>
58 : #include <svx/svdpagv.hxx>
59 : #include <swerror.h>
60 : #include <shellio.hxx>
61 : #include <ndtxt.hxx>
62 : #include <SwStyleNameMapper.hxx>
63 : #include <crsskip.hxx>
64 : #include <com/sun/star/beans/PropertyAttribute.hpp>
65 : #include <com/sun/star/drawing/ShapeCollection.hpp>
66 : #include <editeng/outliner.hxx>
67 : #include <editeng/editview.hxx>
68 : #include <unoparagraph.hxx>
69 : #include <unocrsrhelper.hxx>
70 : #include <unotextrange.hxx>
71 : #include <sfx2/docfile.hxx>
72 : #include <calbck.hxx>
73 : #include "swdtflvr.hxx"
74 : #include <vcl/svapp.hxx>
75 : #include <comphelper/processfactory.hxx>
76 : #include <comphelper/servicehelper.hxx>
77 : #include <cppuhelper/supportsservice.hxx>
78 :
79 : using namespace ::com::sun::star;
80 : using namespace ::com::sun::star::uno;
81 : using namespace ::com::sun::star::lang;
82 : using namespace ::com::sun::star::beans;
83 : using namespace ::com::sun::star::text;
84 : using namespace ::com::sun::star::view;
85 : using namespace ::com::sun::star::frame;
86 :
87 : using ::com::sun::star::util::URL;
88 : using comphelper::HelperBaseNoState;
89 :
90 2761 : SwXTextView::SwXTextView(SwView* pSwView) :
91 : SfxBaseController(pSwView),
92 : m_SelChangedListeners(m_aMutex),
93 : m_pView(pSwView),
94 2761 : m_pPropSet( aSwMapProvider.GetPropertySet( PROPERTY_MAP_TEXT_VIEW ) ),
95 : pxViewSettings(0),
96 5522 : pxTextViewCursor(0)
97 : {
98 :
99 2761 : }
100 :
101 7971 : SwXTextView::~SwXTextView()
102 : {
103 2657 : Invalidate();
104 5314 : }
105 :
106 8171 : void SwXTextView::Invalidate()
107 : {
108 8171 : if(pxViewSettings)
109 : {
110 15 : HelperBaseNoState *pSettings = static_cast < HelperBaseNoState * > ( pxViewSettings->get() );
111 15 : static_cast < SwXViewSettings* > ( pSettings )->Invalidate();
112 15 : DELETEZ(pxViewSettings);
113 : }
114 8171 : if(pxTextViewCursor)
115 : {
116 58 : text::XTextViewCursor* pCrsr = pxTextViewCursor->get();
117 58 : static_cast<SwXTextViewCursor*>(pCrsr)->Invalidate();
118 58 : DELETEZ(pxTextViewCursor);
119 : }
120 :
121 8171 : m_refCount++; //prevent second d'tor call
122 :
123 : {
124 : uno::Reference<uno::XInterface> const xInt(static_cast<
125 8171 : cppu::OWeakObject*>(static_cast<SfxBaseController*>(this)));
126 16342 : lang::EventObject aEvent(xInt);
127 16342 : m_SelChangedListeners.disposeAndClear(aEvent);
128 : }
129 :
130 8171 : m_refCount--;
131 8171 : m_pView = 0;
132 8171 : }
133 :
134 0 : Sequence< uno::Type > SAL_CALL SwXTextView::getTypes( ) throw(uno::RuntimeException, std::exception)
135 : {
136 0 : uno::Sequence< uno::Type > aBaseTypes = SfxBaseController::getTypes();
137 :
138 0 : long nIndex = aBaseTypes.getLength();
139 : aBaseTypes.realloc(
140 0 : aBaseTypes.getLength() + 8 );
141 :
142 0 : uno::Type* pBaseTypes = aBaseTypes.getArray();
143 0 : pBaseTypes[nIndex++] = cppu::UnoType<XSelectionSupplier>::get();
144 0 : pBaseTypes[nIndex++] = cppu::UnoType<XServiceInfo>::get();
145 0 : pBaseTypes[nIndex++] = cppu::UnoType<XFormLayerAccess>::get();
146 0 : pBaseTypes[nIndex++] = cppu::UnoType<XTextViewCursorSupplier>::get();
147 0 : pBaseTypes[nIndex++] = cppu::UnoType<XViewSettingsSupplier>::get();
148 0 : pBaseTypes[nIndex++] = cppu::UnoType<XRubySelection>::get();
149 0 : pBaseTypes[nIndex++] = cppu::UnoType<XPropertySet>::get();
150 0 : pBaseTypes[nIndex++] = cppu::UnoType<datatransfer::XTransferableSupplier>::get();
151 0 : return aBaseTypes;
152 : }
153 :
154 0 : Sequence< sal_Int8 > SAL_CALL SwXTextView::getImplementationId( ) throw(uno::RuntimeException, std::exception)
155 : {
156 0 : return css::uno::Sequence<sal_Int8>();
157 : }
158 :
159 1712059 : void SAL_CALL SwXTextView::acquire( )throw()
160 : {
161 1712059 : SfxBaseController::acquire();
162 1712059 : }
163 :
164 1717457 : void SAL_CALL SwXTextView::release( )throw()
165 : {
166 1717457 : SfxBaseController::release();
167 1717457 : }
168 :
169 308395 : uno::Any SAL_CALL SwXTextView::queryInterface( const uno::Type& aType )
170 : throw (RuntimeException, std::exception)
171 : {
172 308395 : uno::Any aRet;
173 308395 : if(aType == cppu::UnoType<view::XSelectionSupplier>::get())
174 : {
175 9 : uno::Reference<view::XSelectionSupplier> xRet = this;
176 9 : aRet.setValue(&xRet, aType);
177 : }
178 308386 : else if(aType == cppu::UnoType<lang::XServiceInfo>::get())
179 : {
180 0 : uno::Reference<lang::XServiceInfo> xRet = this;
181 0 : aRet.setValue(&xRet, aType);
182 : }
183 308386 : else if(aType == cppu::UnoType<view::XControlAccess>::get())
184 : {
185 34 : uno::Reference<view::XControlAccess> xRet = this;
186 34 : aRet.setValue(&xRet, aType);
187 : }
188 308352 : else if(aType == cppu::UnoType<view::XFormLayerAccess>::get())
189 : {
190 22 : uno::Reference<view::XFormLayerAccess> xRet = this;
191 22 : aRet.setValue(&xRet, aType);
192 : }
193 308330 : else if(aType == cppu::UnoType<text::XTextViewCursorSupplier>::get())
194 : {
195 64 : uno::Reference<text::XTextViewCursorSupplier> xRet = this;
196 64 : aRet.setValue(&xRet, aType);
197 : }
198 308266 : else if(aType == cppu::UnoType<view::XViewSettingsSupplier>::get())
199 : {
200 15 : uno::Reference<view::XViewSettingsSupplier> xRet = this;
201 15 : aRet.setValue(&xRet, aType);
202 : }
203 308251 : else if(aType == cppu::UnoType<XRubySelection>::get())
204 : {
205 0 : uno::Reference<XRubySelection> xRet = this;
206 0 : aRet.setValue(&xRet, aType);
207 : }
208 308251 : else if(aType == cppu::UnoType<XPropertySet>::get())
209 : {
210 8312 : uno::Reference<XPropertySet> xRet = this;
211 8312 : aRet.setValue(&xRet, aType);
212 : }
213 299939 : else if(aType == cppu::UnoType<datatransfer::XTransferableSupplier>::get())
214 : {
215 0 : uno::Reference<datatransfer::XTransferableSupplier> xRet = this;
216 0 : aRet.setValue(&xRet, aType);
217 : }
218 : else
219 299939 : aRet = SfxBaseController::queryInterface(aType);
220 308395 : return aRet;
221 : }
222 :
223 8 : sal_Bool SwXTextView::select(const uno::Any& aInterface)
224 : throw (lang::IllegalArgumentException, uno::RuntimeException,
225 : std::exception)
226 : {
227 8 : SolarMutexGuard aGuard;
228 :
229 16 : uno::Reference< uno::XInterface > xInterface;
230 8 : if (!GetView() || !(aInterface >>= xInterface))
231 : {
232 0 : return sal_False;
233 : }
234 :
235 8 : SwWrtShell& rSh = GetView()->GetWrtShell();
236 8 : SwDoc* pDoc = GetView()->GetDocShell()->GetDoc();
237 16 : std::vector<SdrObject *> sdrObjects;
238 : uno::Reference<awt::XControlModel> const xCtrlModel(xInterface,
239 16 : UNO_QUERY);
240 8 : if (xCtrlModel.is())
241 : {
242 0 : uno::Reference<awt::XControl> xControl;
243 0 : SdrObject *const pSdrObject = GetControl(xCtrlModel, xControl);
244 0 : if (pSdrObject) // hmm... needs view to verify it's in right doc...
245 : {
246 0 : sdrObjects.push_back(pSdrObject);
247 0 : }
248 : }
249 : else
250 : {
251 8 : SwPaM * pPaM(0);
252 8 : std::pair<OUString, FlyCntType> frame;
253 8 : OUString tableName;
254 8 : SwUnoTableCrsr const* pTableCursor(0);
255 8 : ::sw::mark::IMark const* pMark(0);
256 : SwUnoCursorHelper::GetSelectableFromAny(xInterface, *pDoc,
257 8 : pPaM, frame, tableName, pTableCursor, pMark, sdrObjects);
258 8 : if (pPaM)
259 : {
260 0 : rSh.EnterStdMode();
261 0 : rSh.SetSelection(*pPaM);
262 : // the pPaM has been copied - delete it
263 0 : while (pPaM->GetNext() != pPaM)
264 0 : delete pPaM->GetNext();
265 0 : delete pPaM;
266 0 : return sal_True;
267 : }
268 8 : else if (!frame.first.isEmpty())
269 : {
270 0 : bool const bSuccess(rSh.GotoFly(frame.first, frame.second));
271 0 : if (bSuccess)
272 : {
273 0 : rSh.HideCrsr();
274 0 : rSh.EnterSelFrmMode();
275 : }
276 0 : return sal_True;
277 : }
278 8 : else if (!tableName.isEmpty())
279 : {
280 8 : rSh.EnterStdMode();
281 8 : rSh.GotoTable(tableName);
282 8 : return sal_True;
283 : }
284 0 : else if (pTableCursor)
285 : {
286 0 : UnoActionRemoveContext const aContext(pDoc);
287 0 : rSh.EnterStdMode();
288 0 : rSh.SetSelection(*pTableCursor);
289 0 : return sal_True;
290 : }
291 0 : else if (pMark)
292 : {
293 0 : rSh.EnterStdMode();
294 0 : rSh.GotoMark(pMark);
295 0 : return sal_True;
296 0 : }
297 : // sdrObjects handled below
298 : }
299 0 : bool bRet(false);
300 0 : if (sdrObjects.size())
301 : {
302 :
303 0 : SdrView *const pDrawView = rSh.GetDrawView();
304 0 : SdrPageView *const pPV = pDrawView->GetSdrPageView();
305 :
306 0 : pDrawView->SdrEndTextEdit();
307 0 : pDrawView->UnmarkAll();
308 :
309 0 : for (size_t i = 0; i < sdrObjects.size(); ++i)
310 : {
311 0 : SdrObject *const pSdrObject(sdrObjects[i]);
312 : // GetSelectableFromAny did not check pSdrObject is in right doc!
313 0 : if (pPV && pSdrObject->GetPage() == pPV->GetPage())
314 : {
315 0 : pDrawView->MarkObj(pSdrObject, pPV);
316 0 : bRet = true;
317 : }
318 : }
319 : }
320 8 : return bRet;
321 : }
322 :
323 1 : uno::Any SwXTextView::getSelection()
324 : throw (uno::RuntimeException, std::exception)
325 : {
326 1 : SolarMutexGuard aGuard;
327 2 : uno::Reference< uno::XInterface > aRef;
328 1 : if(GetView())
329 : {
330 : //force immediat shell update
331 1 : m_pView->StopShellTimer();
332 : //Generating an interface from the current selection.
333 1 : SwWrtShell& rSh = m_pView->GetWrtShell();
334 1 : ShellModes eSelMode = m_pView->GetShellMode();
335 1 : switch(eSelMode)
336 : {
337 : case SHELL_MODE_TABLE_TEXT :
338 : {
339 0 : if(rSh.GetTableCrsr())
340 : {
341 : OSL_ENSURE(rSh.GetTableFormat(), "not a table format?");
342 0 : uno::Reference< text::XTextTableCursor > xCrsr = new SwXTextTableCursor(*rSh.GetTableFormat(),
343 0 : rSh.GetTableCrsr());
344 0 : aRef = uno::Reference< uno::XInterface > (xCrsr, uno::UNO_QUERY);
345 0 : break;
346 : }
347 :
348 : }
349 : //Without a table selection the text will be delivered.
350 : //break;
351 : case SHELL_MODE_LIST_TEXT :
352 : case SHELL_MODE_TABLE_LIST_TEXT:
353 : case SHELL_MODE_TEXT :
354 : {
355 1 : uno::Reference< container::XIndexAccess > xPos = SwXTextRanges::Create(rSh.GetCrsr());
356 1 : aRef = uno::Reference< uno::XInterface >(xPos, uno::UNO_QUERY);
357 : }
358 1 : break;
359 : case SHELL_MODE_FRAME :
360 : {
361 0 : SwFrameFormat *const pFormat = rSh.GetFlyFrameFormat();
362 0 : if (pFormat)
363 : {
364 0 : aRef = SwXTextFrame::CreateXTextFrame(
365 0 : *pFormat->GetDoc(), pFormat);
366 : }
367 : }
368 0 : break;
369 : case SHELL_MODE_GRAPHIC :
370 : {
371 0 : SwFrameFormat *const pFormat = rSh.GetFlyFrameFormat();
372 0 : if (pFormat)
373 : {
374 0 : aRef = SwXTextGraphicObject::CreateXTextGraphicObject(
375 0 : *pFormat->GetDoc(), pFormat);
376 : }
377 : }
378 0 : break;
379 : case SHELL_MODE_OBJECT :
380 : {
381 0 : SwFrameFormat *const pFormat = rSh.GetFlyFrameFormat();
382 0 : if (pFormat)
383 : {
384 0 : aRef = SwXTextEmbeddedObject::CreateXTextEmbeddedObject(
385 0 : *pFormat->GetDoc(), pFormat);
386 : }
387 : }
388 0 : break;
389 : case SHELL_MODE_DRAW :
390 : case SHELL_MODE_DRAW_CTRL :
391 : case SHELL_MODE_DRAW_FORM :
392 : case SHELL_MODE_DRAWTEXT :
393 : case SHELL_MODE_BEZIER :
394 : {
395 0 : uno::Reference< drawing::XDrawPageSupplier > xPageSupp;
396 0 : uno::Reference< frame::XModel > xModel = m_pView->GetDocShell()->GetBaseModel();
397 0 : uno::Reference< lang::XUnoTunnel > xModelTunnel(xModel, uno::UNO_QUERY);
398 :
399 : uno::Reference< drawing::XShapes > xShCol = drawing::ShapeCollection::create(
400 0 : comphelper::getProcessComponentContext());
401 :
402 0 : const SdrMarkList& rMarkList = rSh.GetDrawView()->GetMarkedObjectList();
403 0 : for(size_t i = 0; i < rMarkList.GetMarkCount(); ++i)
404 : {
405 0 : SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj();
406 0 : uno::Reference< uno::XInterface > xInt = SwFmDrawPage::GetInterface( pObj );
407 0 : uno::Reference< drawing::XShape > xShape(xInt, uno::UNO_QUERY);
408 0 : xShCol->add(xShape);
409 0 : }
410 0 : aRef = uno::Reference< uno::XInterface >(xShCol, uno::UNO_QUERY);
411 : }
412 0 : break;
413 : default:;//prevent warning
414 : }
415 : }
416 1 : uno::Any aRet(&aRef, cppu::UnoType<uno::XInterface>::get());
417 2 : return aRet;
418 : }
419 :
420 1 : void SwXTextView::addSelectionChangeListener(
421 : const uno::Reference< view::XSelectionChangeListener > & rxListener)
422 : throw( uno::RuntimeException, std::exception )
423 : {
424 1 : SolarMutexGuard aGuard;
425 1 : m_SelChangedListeners.addInterface(rxListener);
426 1 : }
427 :
428 1 : void SwXTextView::removeSelectionChangeListener(
429 : const uno::Reference< view::XSelectionChangeListener > & rxListener)
430 : throw( uno::RuntimeException, std::exception )
431 : {
432 1 : SolarMutexGuard aGuard;
433 1 : m_SelChangedListeners.removeInterface(rxListener);
434 1 : }
435 :
436 94 : SdrObject* SwXTextView::GetControl(
437 : const uno::Reference< awt::XControlModel > & xModel,
438 : uno::Reference< awt::XControl >& xToFill )
439 : {
440 94 : SwView* pView2 = GetView();
441 94 : FmFormShell* pFormShell = pView2 ? pView2->GetFormShell() : NULL;
442 94 : SdrView* pDrawView = pView2 ? pView2->GetDrawView() : NULL;
443 94 : vcl::Window* pWindow = pView2 ? pView2->GetWrtShell().GetWin() : NULL;
444 :
445 : OSL_ENSURE( pFormShell && pDrawView && pWindow, "SwXTextView::GetControl: how could I?" );
446 :
447 94 : SdrObject* pControl = NULL;
448 94 : if ( pFormShell && pDrawView && pWindow )
449 94 : pControl = pFormShell->GetFormControl( xModel, *pDrawView, *pWindow, xToFill );
450 94 : return pControl;
451 : }
452 :
453 94 : uno::Reference< awt::XControl > SwXTextView::getControl(const uno::Reference< awt::XControlModel > & xModel)
454 : throw( container::NoSuchElementException, uno::RuntimeException, std::exception )
455 : {
456 94 : SolarMutexGuard aGuard;
457 94 : uno::Reference< awt::XControl > xRet;
458 94 : GetControl(xModel, xRet);
459 94 : return xRet;
460 : }
461 :
462 0 : uno::Reference< form::runtime::XFormController > SAL_CALL SwXTextView::getFormController( const uno::Reference< form::XForm >& _Form ) throw (RuntimeException, std::exception)
463 : {
464 0 : SolarMutexGuard aGuard;
465 :
466 0 : SwView* pView2 = GetView();
467 0 : FmFormShell* pFormShell = pView2 ? pView2->GetFormShell() : NULL;
468 0 : SdrView* pDrawView = pView2 ? pView2->GetDrawView() : NULL;
469 0 : vcl::Window* pWindow = pView2 ? pView2->GetWrtShell().GetWin() : NULL;
470 : OSL_ENSURE( pFormShell && pDrawView && pWindow, "SwXTextView::getFormController: how could I?" );
471 :
472 0 : uno::Reference< form::runtime::XFormController > xController;
473 0 : if ( pFormShell && pDrawView && pWindow )
474 0 : xController = FmFormShell::GetFormController( _Form, *pDrawView, *pWindow );
475 0 : return xController;
476 : }
477 :
478 1 : sal_Bool SAL_CALL SwXTextView::isFormDesignMode( ) throw (uno::RuntimeException, std::exception)
479 : {
480 1 : SolarMutexGuard aGuard;
481 1 : SwView* pView2 = GetView();
482 1 : FmFormShell* pFormShell = pView2 ? pView2->GetFormShell() : NULL;
483 1 : return !pFormShell || pFormShell->IsDesignMode();
484 : }
485 :
486 21 : void SAL_CALL SwXTextView::setFormDesignMode( sal_Bool _DesignMode ) throw (RuntimeException, std::exception)
487 : {
488 21 : SolarMutexGuard aGuard;
489 21 : SwView* pView2 = GetView();
490 21 : FmFormShell* pFormShell = pView2 ? pView2->GetFormShell() : NULL;
491 21 : if ( pFormShell )
492 21 : pFormShell->SetDesignMode( _DesignMode );
493 21 : }
494 :
495 64 : uno::Reference< text::XTextViewCursor > SwXTextView::getViewCursor() throw( uno::RuntimeException, std::exception )
496 : {
497 64 : SolarMutexGuard aGuard;
498 64 : if(GetView())
499 : {
500 64 : if(!pxTextViewCursor)
501 : {
502 58 : static_cast<SwXTextView*>(this)->pxTextViewCursor = new uno::Reference< text::XTextViewCursor > ;
503 58 : *pxTextViewCursor = new SwXTextViewCursor(GetView());
504 : }
505 128 : return *pxTextViewCursor;
506 : }
507 : else
508 0 : throw uno::RuntimeException();
509 : }
510 :
511 16 : uno::Reference< beans::XPropertySet > SwXTextView::getViewSettings() throw( uno::RuntimeException, std::exception )
512 : {
513 16 : SolarMutexGuard aGuard;
514 16 : if(m_pView)
515 : {
516 16 : if(!pxViewSettings)
517 : {
518 15 : static_cast<SwXTextView*>(this)->pxViewSettings = new uno::Reference< beans::XPropertySet > ;
519 15 : *pxViewSettings = static_cast < HelperBaseNoState * > ( new SwXViewSettings( false, m_pView ) );
520 : }
521 : }
522 : else
523 0 : throw uno::RuntimeException();
524 16 : return *pxViewSettings;
525 : }
526 :
527 0 : Sequence< Sequence< PropertyValue > > SwXTextView::getRubyList( sal_Bool /*bAutomatic*/ )
528 : throw (RuntimeException, std::exception)
529 : {
530 0 : SolarMutexGuard aGuard;
531 :
532 0 : if(!GetView())
533 0 : throw RuntimeException();
534 0 : SwWrtShell& rSh = m_pView->GetWrtShell();
535 0 : ShellModes eSelMode = m_pView->GetShellMode();
536 0 : if (eSelMode != SHELL_MODE_LIST_TEXT &&
537 0 : eSelMode != SHELL_MODE_TABLE_LIST_TEXT &&
538 0 : eSelMode != SHELL_MODE_TABLE_TEXT &&
539 : eSelMode != SHELL_MODE_TEXT )
540 0 : return Sequence< Sequence< PropertyValue > > ();
541 :
542 0 : SwRubyList aList;
543 :
544 0 : const sal_uInt16 nCount = SwDoc::FillRubyList( *rSh.GetCrsr(), aList, 0 );
545 0 : Sequence< Sequence< PropertyValue > > aRet(nCount);
546 0 : Sequence< PropertyValue >* pRet = aRet.getArray();
547 0 : OUString aString;
548 0 : for(sal_uInt16 n = 0; n < nCount; n++)
549 : {
550 0 : const SwRubyListEntry* pEntry = &aList[n];
551 :
552 0 : const OUString& rEntryText = pEntry->GetText();
553 0 : const SwFormatRuby& rAttr = pEntry->GetRubyAttr();
554 :
555 0 : pRet[n].realloc(5);
556 0 : PropertyValue* pValues = pRet[n].getArray();
557 0 : pValues[0].Name = UNO_NAME_RUBY_BASE_TEXT;
558 0 : pValues[0].Value <<= rEntryText;
559 0 : pValues[1].Name = UNO_NAME_RUBY_TEXT;
560 0 : pValues[1].Value <<= rAttr.GetText();
561 0 : pValues[2].Name = UNO_NAME_RUBY_CHAR_STYLE_NAME;
562 0 : SwStyleNameMapper::FillProgName(rAttr.GetCharFormatName(), aString, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, true );
563 0 : pValues[2].Value <<= aString;
564 0 : pValues[3].Name = UNO_NAME_RUBY_ADJUST;
565 0 : pValues[3].Value <<= (sal_Int16)rAttr.GetAdjustment();
566 0 : pValues[4].Name = UNO_NAME_RUBY_IS_ABOVE;
567 0 : sal_Bool bVal = !rAttr.GetPosition();
568 0 : pValues[4].Value.setValue(&bVal, cppu::UnoType<bool>::get());
569 0 : }
570 0 : return aRet;
571 : }
572 :
573 0 : void SAL_CALL SwXTextView::setRubyList(
574 : const Sequence< Sequence< PropertyValue > >& rRubyList, sal_Bool /*bAutomatic*/ )
575 : throw (RuntimeException, std::exception)
576 : {
577 0 : SolarMutexGuard aGuard;
578 :
579 0 : if(!GetView() || !rRubyList.getLength())
580 0 : throw RuntimeException();
581 0 : SwWrtShell& rSh = m_pView->GetWrtShell();
582 0 : ShellModes eSelMode = m_pView->GetShellMode();
583 0 : if (eSelMode != SHELL_MODE_LIST_TEXT &&
584 0 : eSelMode != SHELL_MODE_TABLE_LIST_TEXT &&
585 0 : eSelMode != SHELL_MODE_TABLE_TEXT &&
586 : eSelMode != SHELL_MODE_TEXT )
587 0 : throw RuntimeException();
588 :
589 0 : SwRubyList aList;
590 :
591 0 : const Sequence<PropertyValue>* pRubyList = rRubyList.getConstArray();
592 0 : for(sal_Int32 nPos = 0; nPos < rRubyList.getLength(); nPos++)
593 : {
594 0 : SwRubyListEntry* pEntry = new SwRubyListEntry;
595 0 : const PropertyValue* pProperties = pRubyList[nPos].getConstArray();
596 0 : OUString sTmp;
597 0 : for(sal_Int32 nProp = 0; nProp < pRubyList[nPos].getLength(); nProp++)
598 : {
599 0 : if(pProperties[nProp].Name == UNO_NAME_RUBY_BASE_TEXT)
600 : {
601 0 : pProperties[nProp].Value >>= sTmp;
602 0 : pEntry->SetText(sTmp);
603 : }
604 0 : else if(pProperties[nProp].Name == UNO_NAME_RUBY_TEXT)
605 : {
606 0 : pProperties[nProp].Value >>= sTmp;
607 0 : pEntry->GetRubyAttr().SetText(sTmp);
608 : }
609 0 : else if(pProperties[nProp].Name == UNO_NAME_RUBY_CHAR_STYLE_NAME)
610 : {
611 0 : if((pProperties[nProp].Value >>= sTmp))
612 : {
613 0 : OUString sName;
614 0 : SwStyleNameMapper::FillUIName(sTmp, sName, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, true );
615 0 : const sal_uInt16 nPoolId = sName.isEmpty() ? 0
616 : : SwStyleNameMapper::GetPoolIdFromUIName(sName,
617 0 : nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
618 :
619 0 : pEntry->GetRubyAttr().SetCharFormatName( sName );
620 0 : pEntry->GetRubyAttr().SetCharFormatId( nPoolId );
621 : }
622 : }
623 0 : else if(pProperties[nProp].Name == UNO_NAME_RUBY_ADJUST)
624 : {
625 0 : sal_Int16 nTmp = 0;
626 0 : if((pProperties[nProp].Value >>= nTmp))
627 0 : pEntry->GetRubyAttr().SetAdjustment(nTmp);
628 : }
629 0 : else if(pProperties[nProp].Name == UNO_NAME_RUBY_IS_ABOVE)
630 : {
631 0 : bool bValue = !pProperties[nProp].Value.hasValue() ||
632 0 : *static_cast<sal_Bool const *>(pProperties[nProp].Value.getValue());
633 0 : pEntry->GetRubyAttr().SetPosition(bValue ? 0 : 1);
634 : }
635 : }
636 0 : aList.insert(aList.begin() + nPos, pEntry);
637 0 : }
638 0 : SwDoc* pDoc = m_pView->GetDocShell()->GetDoc();
639 0 : pDoc->SetRubyList( *rSh.GetCrsr(), aList, 0 );
640 0 : }
641 :
642 0 : SfxObjectShellLock SwXTextView::BuildTmpSelectionDoc()
643 : {
644 0 : SwWrtShell& rOldSh = m_pView->GetWrtShell();
645 0 : SfxPrinter *pPrt = rOldSh.getIDocumentDeviceAccess()->getPrinter( false );
646 : SwDocShell* pDocSh;
647 0 : SfxObjectShellLock xDocSh( pDocSh = new SwDocShell( /*pPrtDoc, */SfxObjectCreateMode::STANDARD ) );
648 0 : xDocSh->DoInitNew( 0 );
649 0 : SwDoc *const pTempDoc( pDocSh->GetDoc() );
650 : // #i103634#, #i112425#: do not expand numbering and fields on PDF export
651 0 : pTempDoc->SetClipBoard(true);
652 0 : rOldSh.FillPrtDoc(pTempDoc, pPrt);
653 0 : SfxViewFrame* pDocFrame = SfxViewFrame::LoadHiddenDocument( *xDocSh, 0 );
654 0 : SwView* pDocView = static_cast<SwView*>( pDocFrame->GetViewShell() );
655 0 : pDocView->AttrChangedNotify( &pDocView->GetWrtShell() );//So that SelectShell is called.
656 0 : SwWrtShell* pSh = pDocView->GetWrtShellPtr();
657 :
658 0 : IDocumentDeviceAccess* pIDDA = pSh->getIDocumentDeviceAccess();
659 0 : SfxPrinter* pTempPrinter = pIDDA->getPrinter( true );
660 :
661 0 : const SwPageDesc& rCurPageDesc = rOldSh.GetPageDesc(rOldSh.GetCurPageDesc());
662 :
663 0 : IDocumentDeviceAccess* pIDDA_old = rOldSh.getIDocumentDeviceAccess();
664 :
665 0 : if( pIDDA_old->getPrinter( false ) )
666 : {
667 0 : pIDDA->setJobsetup( *pIDDA_old->getJobsetup() );
668 : //#69563# if it isn't the same printer then the pointer has been invalidated!
669 0 : pTempPrinter = pIDDA->getPrinter( true );
670 : }
671 :
672 0 : pTempPrinter->SetPaperBin(rCurPageDesc.GetMaster().GetPaperBin().GetValue());
673 :
674 0 : return xDocSh;
675 : }
676 :
677 14452 : void SwXTextView::NotifySelChanged()
678 : {
679 : OSL_ENSURE( m_pView, "view is missing" );
680 :
681 : uno::Reference<uno::XInterface> const xInt(
682 14452 : static_cast<cppu::OWeakObject*>(static_cast<SfxBaseController*>(this)));
683 :
684 28904 : lang::EventObject const aEvent(xInt);
685 : m_SelChangedListeners.notifyEach(
686 28904 : &view::XSelectionChangeListener::selectionChanged, aEvent);
687 14452 : }
688 :
689 : namespace {
690 : struct DispatchListener
691 : {
692 : URL const & m_rURL;
693 : Sequence<PropertyValue> const& m_rSeq;
694 8 : explicit DispatchListener(URL const& rURL,
695 : Sequence<PropertyValue> const& rSeq)
696 8 : : m_rURL(rURL), m_rSeq(rSeq) { }
697 0 : void operator()(uno::Reference<XDispatch> const & xListener) const
698 : {
699 0 : xListener->dispatch(m_rURL, m_rSeq);
700 0 : }
701 : };
702 : }
703 :
704 8 : void SwXTextView::NotifyDBChanged()
705 : {
706 8 : URL aURL;
707 8 : aURL.Complete = OUString::createFromAscii(SwXDispatch::GetDBChangeURL());
708 :
709 : m_SelChangedListeners.forEach<XDispatch>(
710 8 : DispatchListener(aURL, Sequence<PropertyValue>(0)));
711 8 : }
712 :
713 8312 : uno::Reference< beans::XPropertySetInfo > SAL_CALL SwXTextView::getPropertySetInfo( )
714 : throw (uno::RuntimeException, std::exception)
715 : {
716 8312 : SolarMutexGuard aGuard;
717 8312 : static uno::Reference< XPropertySetInfo > aRef = m_pPropSet->getPropertySetInfo();
718 8312 : return aRef;
719 : }
720 :
721 0 : void SAL_CALL SwXTextView::setPropertyValue(
722 : const OUString& rPropertyName, const uno::Any& rValue )
723 : throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
724 : {
725 0 : SolarMutexGuard aGuard;
726 0 : const SfxItemPropertySimpleEntry* pEntry = m_pPropSet->getPropertyMap().getByName( rPropertyName );
727 0 : if (!pEntry)
728 0 : throw UnknownPropertyException();
729 0 : else if (pEntry->nFlags & PropertyAttribute::READONLY)
730 0 : throw PropertyVetoException();
731 : else
732 : {
733 0 : switch (pEntry->nWID)
734 : {
735 : case WID_IS_HIDE_SPELL_MARKS :
736 : // deprecated #i91949
737 0 : break;
738 : case WID_IS_CONSTANT_SPELLCHECK :
739 : {
740 0 : bool bVal = false;
741 0 : const SwViewOption *pOpt = m_pView->GetWrtShell().GetViewOptions();
742 0 : if (!pOpt || !(rValue >>= bVal))
743 0 : throw RuntimeException();
744 0 : SwViewOption aNewOpt( *pOpt );
745 0 : if (pEntry->nWID == WID_IS_CONSTANT_SPELLCHECK)
746 0 : aNewOpt.SetOnlineSpell(bVal);
747 0 : m_pView->GetWrtShell().ApplyViewOptions( aNewOpt );
748 : }
749 0 : break;
750 : default :
751 : OSL_FAIL("unknown WID");
752 : }
753 0 : }
754 0 : }
755 :
756 0 : uno::Any SAL_CALL SwXTextView::getPropertyValue(
757 : const OUString& rPropertyName )
758 : throw (beans::UnknownPropertyException,
759 : lang::WrappedTargetException,
760 : uno::RuntimeException,
761 : std::exception)
762 : {
763 0 : SolarMutexGuard aGuard;
764 :
765 0 : Any aRet;
766 :
767 0 : const SfxItemPropertySimpleEntry* pEntry = m_pPropSet->getPropertyMap().getByName( rPropertyName );
768 0 : if (!pEntry)
769 0 : throw UnknownPropertyException();
770 : else
771 : {
772 0 : sal_Int16 nWID = pEntry->nWID;
773 0 : switch (nWID)
774 : {
775 : case WID_PAGE_COUNT :
776 : case WID_LINE_COUNT :
777 : {
778 : // format document completely in order to get meaningful
779 : // values for page count and line count
780 0 : m_pView->GetWrtShell().CalcLayout();
781 :
782 0 : sal_Int32 nCount = -1;
783 0 : if (nWID == WID_PAGE_COUNT)
784 0 : nCount = m_pView->GetWrtShell().GetPageCount();
785 : else // WID_LINE_COUNT
786 0 : nCount = m_pView->GetWrtShell().GetLineCount( false /*of whole document*/ );
787 0 : aRet <<= nCount;
788 : }
789 0 : break;
790 : case WID_IS_HIDE_SPELL_MARKS :
791 : // deprecated #i91949
792 0 : break;
793 : case WID_IS_CONSTANT_SPELLCHECK :
794 : {
795 0 : const SwViewOption *pOpt = m_pView->GetWrtShell().GetViewOptions();
796 0 : if (!pOpt)
797 0 : throw RuntimeException();
798 0 : sal_uInt32 nFlag = VIEWOPT_1_ONLINESPELL;
799 0 : bool bVal = 0 != (pOpt->GetCoreOptions() & nFlag);
800 0 : aRet <<= bVal;
801 : }
802 0 : break;
803 : default :
804 : OSL_FAIL("unknown WID");
805 : }
806 : }
807 :
808 0 : return aRet;
809 : }
810 :
811 0 : void SAL_CALL SwXTextView::addPropertyChangeListener(
812 : const OUString& /*rPropertyName*/,
813 : const uno::Reference< beans::XPropertyChangeListener >& /*rxListener*/ )
814 : throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
815 : {
816 : OSL_FAIL("not implemented");
817 0 : }
818 :
819 0 : void SAL_CALL SwXTextView::removePropertyChangeListener(
820 : const OUString& /*rPropertyName*/,
821 : const uno::Reference< beans::XPropertyChangeListener >& /*rxListener*/ )
822 : throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
823 : {
824 : OSL_FAIL("not implemented");
825 0 : }
826 :
827 0 : void SAL_CALL SwXTextView::addVetoableChangeListener(
828 : const OUString& /*rPropertyName*/,
829 : const uno::Reference< beans::XVetoableChangeListener >& /*rxListener*/ )
830 : throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
831 : {
832 : OSL_FAIL("not implemented");
833 0 : }
834 :
835 0 : void SAL_CALL SwXTextView::removeVetoableChangeListener(
836 : const OUString& /*rPropertyName*/,
837 : const uno::Reference< beans::XVetoableChangeListener >& /*rxListener*/ )
838 : throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException, std::exception)
839 : {
840 : OSL_FAIL("not implemented");
841 0 : }
842 :
843 0 : OUString SwXTextView::getImplementationName() throw( RuntimeException, std::exception )
844 : {
845 0 : return OUString("SwXTextView");
846 : }
847 :
848 0 : sal_Bool SwXTextView::supportsService(const OUString& rServiceName) throw( RuntimeException, std::exception )
849 : {
850 0 : return cppu::supportsService(this, rServiceName);
851 : }
852 :
853 0 : Sequence< OUString > SwXTextView::getSupportedServiceNames() throw( RuntimeException, std::exception )
854 : {
855 0 : Sequence< OUString > aRet(2);
856 0 : OUString* pArray = aRet.getArray();
857 0 : pArray[0] = "com.sun.star.text.TextDocumentView";
858 0 : pArray[1] = "com.sun.star.view.OfficeDocumentView";
859 0 : return aRet;
860 : }
861 :
862 58 : SwXTextViewCursor::SwXTextViewCursor(SwView* pVw) :
863 : m_pView(pVw),
864 58 : m_pPropSet(aSwMapProvider.GetPropertySet(PROPERTY_MAP_TEXT_CURSOR))
865 : {
866 58 : }
867 :
868 116 : SwXTextViewCursor::~SwXTextViewCursor()
869 : {
870 116 : }
871 :
872 : // used to determine if there is a text selection or not.
873 : // If there is no text selection the functions that need a working
874 : // cursor will be disabled (throw RuntimeException). This will be the case
875 : // for the following interfaces:
876 : // - XViewCursor
877 : // - XTextCursor
878 : // - XTextRange
879 : // - XLineCursor
880 46 : bool SwXTextViewCursor::IsTextSelection( bool bAllowTables ) const
881 : {
882 :
883 46 : bool bRes = false;
884 : OSL_ENSURE(m_pView, "m_pView is NULL ???");
885 46 : if(m_pView)
886 : {
887 : //! m_pView->GetShellMode() will only work after the shell
888 : //! has already changed and thus can not be used here!
889 46 : SelectionType eSelType = m_pView->GetWrtShell().GetSelectionType();
890 46 : bRes = ( (nsSelectionType::SEL_TXT & eSelType) ||
891 138 : (nsSelectionType::SEL_NUM & eSelType) ) &&
892 92 : (!(nsSelectionType::SEL_TBL_CELLS & eSelType) || bAllowTables);
893 : }
894 46 : return bRes;
895 : }
896 :
897 0 : sal_Bool SwXTextViewCursor::isVisible() throw( uno::RuntimeException, std::exception )
898 : {
899 0 : SolarMutexGuard aGuard;
900 : OSL_FAIL("not implemented");
901 0 : return sal_True;
902 : }
903 :
904 0 : void SwXTextViewCursor::setVisible(sal_Bool /*bVisible*/) throw( uno::RuntimeException, std::exception )
905 : {
906 0 : SolarMutexGuard aGuard;
907 0 : OSL_FAIL("not implemented");
908 0 : }
909 :
910 8 : awt::Point SwXTextViewCursor::getPosition() throw( uno::RuntimeException, std::exception )
911 : {
912 8 : SolarMutexGuard aGuard;
913 8 : awt::Point aRet;
914 8 : if(m_pView)
915 : {
916 8 : const SwWrtShell& rSh = m_pView->GetWrtShell();
917 8 : const SwRect aCharRect(rSh.GetCharRect());
918 :
919 8 : const SwFrameFormat& rMaster = rSh.GetPageDesc( rSh.GetCurPageDesc() ).GetMaster();
920 :
921 8 : const SvxULSpaceItem& rUL = rMaster.GetULSpace();
922 8 : const long nY = aCharRect.Top() - (rUL.GetUpper() + DOCUMENTBORDER);
923 8 : aRet.Y = convertTwipToMm100(nY);
924 :
925 8 : const SvxLRSpaceItem& rLR = rMaster.GetLRSpace();
926 8 : const long nX = aCharRect.Left() - (rLR.GetLeft() + DOCUMENTBORDER);
927 8 : aRet.X = convertTwipToMm100(nX);
928 : }
929 : else
930 0 : throw uno::RuntimeException();
931 8 : return aRet;
932 : }
933 :
934 1 : void SwXTextViewCursor::collapseToStart()
935 : throw(uno::RuntimeException, std::exception)
936 : {
937 1 : SolarMutexGuard aGuard;
938 1 : if(m_pView)
939 : {
940 1 : if (!IsTextSelection())
941 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
942 :
943 1 : SwWrtShell& rSh = m_pView->GetWrtShell();
944 1 : if(rSh.HasSelection())
945 : {
946 1 : SwPaM* pShellCrsr = rSh.GetCrsr();
947 1 : if(*pShellCrsr->GetPoint() > *pShellCrsr->GetMark())
948 1 : pShellCrsr->Exchange();
949 1 : pShellCrsr->DeleteMark();
950 1 : rSh.EnterStdMode();
951 1 : rSh.SetSelection(*pShellCrsr);
952 : }
953 : }
954 : else
955 0 : throw uno::RuntimeException();
956 1 : }
957 :
958 1 : void SwXTextViewCursor::collapseToEnd()
959 : throw (uno::RuntimeException, std::exception)
960 : {
961 1 : SolarMutexGuard aGuard;
962 1 : if(m_pView)
963 : {
964 1 : if (!IsTextSelection())
965 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
966 :
967 1 : SwWrtShell& rSh = m_pView->GetWrtShell();
968 1 : if(rSh.HasSelection())
969 : {
970 1 : SwPaM* pShellCrsr = rSh.GetCrsr();
971 1 : if(*pShellCrsr->GetPoint() < *pShellCrsr->GetMark())
972 0 : pShellCrsr->Exchange();
973 1 : pShellCrsr->DeleteMark();
974 1 : rSh.EnterStdMode();
975 1 : rSh.SetSelection(*pShellCrsr);
976 : }
977 : }
978 : else
979 0 : throw uno::RuntimeException();
980 1 : }
981 :
982 2 : sal_Bool SwXTextViewCursor::isCollapsed()
983 : throw (uno::RuntimeException, std::exception)
984 : {
985 2 : SolarMutexGuard aGuard;
986 2 : bool bRet = false;
987 2 : if(m_pView)
988 : {
989 2 : if (!IsTextSelection())
990 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
991 :
992 2 : const SwWrtShell& rSh = m_pView->GetWrtShell();
993 2 : bRet = !rSh.HasSelection();
994 : }
995 : else
996 0 : throw uno::RuntimeException();
997 2 : return bRet;
998 :
999 : }
1000 :
1001 2 : sal_Bool SwXTextViewCursor::goLeft(sal_Int16 nCount, sal_Bool bExpand)
1002 : throw (uno::RuntimeException, std::exception)
1003 : {
1004 2 : SolarMutexGuard aGuard;
1005 2 : bool bRet = false;
1006 2 : if(m_pView)
1007 : {
1008 2 : if (!IsTextSelection())
1009 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
1010 :
1011 8 : for( sal_uInt16 i = 0; i < nCount; i++ )
1012 6 : bRet = m_pView->GetWrtShell().Left( CRSR_SKIP_CHARS, bExpand, 1, true );
1013 : }
1014 : else
1015 0 : throw uno::RuntimeException();
1016 2 : return bRet;
1017 : }
1018 :
1019 3 : sal_Bool SwXTextViewCursor::goRight(sal_Int16 nCount, sal_Bool bExpand)
1020 : throw (uno::RuntimeException, std::exception)
1021 : {
1022 3 : SolarMutexGuard aGuard;
1023 3 : bool bRet = false;
1024 3 : if(m_pView)
1025 : {
1026 3 : if (!IsTextSelection())
1027 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
1028 :
1029 14 : for( sal_uInt16 i = 0; i < nCount; i++ )
1030 11 : bRet = m_pView->GetWrtShell().Right( CRSR_SKIP_CHARS, bExpand, 1, true );
1031 : }
1032 : else
1033 0 : throw uno::RuntimeException();
1034 3 : return bRet;
1035 :
1036 : }
1037 :
1038 1 : void SwXTextViewCursor::gotoRange(
1039 : const uno::Reference< text::XTextRange > & xRange,
1040 : sal_Bool bExpand)
1041 : throw (RuntimeException, std::exception)
1042 : {
1043 1 : SolarMutexGuard aGuard;
1044 1 : if(m_pView && xRange.is())
1045 : {
1046 1 : if (!IsTextSelection())
1047 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
1048 :
1049 1 : SwUnoInternalPaM rDestPam(*m_pView->GetDocShell()->GetDoc());
1050 1 : if (!::sw::XTextRangeToSwPaM(rDestPam, xRange))
1051 : {
1052 0 : throw uno::RuntimeException();
1053 : }
1054 :
1055 1 : ShellModes eSelMode = m_pView->GetShellMode();
1056 1 : SwWrtShell& rSh = m_pView->GetWrtShell();
1057 : // call EnterStdMode in non-text selections only
1058 1 : if(!bExpand ||
1059 0 : (eSelMode != SHELL_MODE_TABLE_TEXT &&
1060 0 : eSelMode != SHELL_MODE_LIST_TEXT &&
1061 0 : eSelMode != SHELL_MODE_TABLE_LIST_TEXT &&
1062 : eSelMode != SHELL_MODE_TEXT ))
1063 1 : rSh.EnterStdMode();
1064 1 : SwPaM* pShellCrsr = rSh.GetCrsr();
1065 2 : SwPaM aOwnPaM(*pShellCrsr->GetPoint());
1066 1 : if(pShellCrsr->HasMark())
1067 : {
1068 0 : aOwnPaM.SetMark();
1069 0 : *aOwnPaM.GetMark() = *pShellCrsr->GetMark();
1070 : }
1071 :
1072 2 : uno::Reference<lang::XUnoTunnel> xRangeTunnel( xRange, uno::UNO_QUERY);
1073 1 : SwXTextRange* pRange = 0;
1074 1 : SwXParagraph* pPara = 0;
1075 1 : OTextCursorHelper* pCursor = 0;
1076 1 : if(xRangeTunnel.is())
1077 : {
1078 1 : pRange = reinterpret_cast<SwXTextRange*>(xRangeTunnel->getSomething(
1079 1 : SwXTextRange::getUnoTunnelId()));
1080 1 : pCursor = reinterpret_cast<OTextCursorHelper*>(xRangeTunnel->getSomething(
1081 1 : OTextCursorHelper::getUnoTunnelId()));
1082 1 : pPara = reinterpret_cast<SwXParagraph*>(xRangeTunnel->getSomething(
1083 1 : SwXParagraph::getUnoTunnelId()));
1084 : }
1085 :
1086 1 : const FrmTypeFlags nFrmType = rSh.GetFrmType(0,true);
1087 :
1088 1 : SwStartNodeType eSearchNodeType = SwNormalStartNode;
1089 1 : if(nFrmType & FrmTypeFlags::FLY_ANY)
1090 0 : eSearchNodeType = SwFlyStartNode;
1091 1 : else if(nFrmType &FrmTypeFlags::HEADER)
1092 0 : eSearchNodeType = SwHeaderStartNode;
1093 1 : else if(nFrmType & FrmTypeFlags::FOOTER)
1094 0 : eSearchNodeType = SwFooterStartNode;
1095 1 : else if(nFrmType & FrmTypeFlags::TABLE)
1096 0 : eSearchNodeType = SwTableBoxStartNode;
1097 1 : else if(nFrmType & FrmTypeFlags::FOOTNOTE)
1098 0 : eSearchNodeType = SwFootnoteStartNode;
1099 :
1100 1 : const SwStartNode* pOwnStartNode = aOwnPaM.GetNode().
1101 1 : FindSttNodeByType(eSearchNodeType);
1102 :
1103 1 : const SwNode* pSrcNode = 0;
1104 1 : if(pCursor && pCursor->GetPaM())
1105 : {
1106 0 : pSrcNode = &pCursor->GetPaM()->GetNode();
1107 : }
1108 1 : else if (pRange)
1109 : {
1110 1 : SwPaM aPam(pRange->GetDoc()->GetNodes());
1111 1 : if (pRange->GetPositions(aPam))
1112 : {
1113 1 : pSrcNode = &aPam.GetNode();
1114 1 : }
1115 : }
1116 0 : else if (pPara && pPara->GetTextNode())
1117 : {
1118 0 : pSrcNode = pPara->GetTextNode();
1119 : }
1120 1 : const SwStartNode* pTmp = pSrcNode ? pSrcNode->FindSttNodeByType(eSearchNodeType) : 0;
1121 :
1122 : //Skip SectionNodes
1123 2 : while(pTmp && pTmp->IsSectionNode())
1124 : {
1125 0 : pTmp = pTmp->StartOfSectionNode();
1126 : }
1127 2 : while(pOwnStartNode && pOwnStartNode->IsSectionNode())
1128 : {
1129 0 : pOwnStartNode = pOwnStartNode->StartOfSectionNode();
1130 : }
1131 : //Without Expand it is allowed to jump out with the ViewCursor everywhere,
1132 : //with Expand only in the same environment
1133 1 : if(bExpand &&
1134 0 : (pOwnStartNode != pTmp ||
1135 0 : (eSelMode != SHELL_MODE_TABLE_TEXT &&
1136 0 : eSelMode != SHELL_MODE_LIST_TEXT &&
1137 0 : eSelMode != SHELL_MODE_TABLE_LIST_TEXT &&
1138 : eSelMode != SHELL_MODE_TEXT)))
1139 0 : throw uno::RuntimeException();
1140 :
1141 : //Now, the selection must be expanded.
1142 1 : if(bExpand)
1143 : {
1144 : // The cursor should include everything that has been included
1145 : // by him and the transferred Range.
1146 0 : SwPosition aOwnLeft(*aOwnPaM.Start());
1147 0 : SwPosition aOwnRight(*aOwnPaM.End());
1148 0 : SwPosition* pParamLeft = rDestPam.Start();
1149 0 : SwPosition* pParamRight = rDestPam.End();
1150 : // Now four SwPositions are there, two of them are needed, but which?
1151 0 : if(aOwnRight > *pParamRight)
1152 0 : *aOwnPaM.GetPoint() = aOwnRight;
1153 : else
1154 0 : *aOwnPaM.GetPoint() = *pParamRight;
1155 0 : aOwnPaM.SetMark();
1156 0 : if(aOwnLeft < *pParamLeft)
1157 0 : *aOwnPaM.GetMark() = aOwnLeft;
1158 : else
1159 0 : *aOwnPaM.GetMark() = *pParamLeft;
1160 : }
1161 : else
1162 : {
1163 : //The cursor shall match the passed range.
1164 1 : *aOwnPaM.GetPoint() = *rDestPam.GetPoint();
1165 1 : if(rDestPam.HasMark())
1166 : {
1167 0 : aOwnPaM.SetMark();
1168 0 : *aOwnPaM.GetMark() = *rDestPam.GetMark();
1169 : }
1170 : else
1171 1 : aOwnPaM.DeleteMark();
1172 : }
1173 2 : rSh.SetSelection(aOwnPaM);
1174 : }
1175 : else
1176 0 : throw uno::RuntimeException();
1177 :
1178 1 : }
1179 :
1180 8 : void SwXTextViewCursor::gotoStart(sal_Bool bExpand)
1181 : throw (uno::RuntimeException, std::exception)
1182 : {
1183 8 : SolarMutexGuard aGuard;
1184 8 : if(m_pView)
1185 : {
1186 8 : if (!IsTextSelection())
1187 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
1188 :
1189 8 : m_pView->GetWrtShell().SttDoc( bExpand );
1190 : }
1191 : else
1192 0 : throw uno::RuntimeException();
1193 8 : }
1194 :
1195 8 : void SwXTextViewCursor::gotoEnd(sal_Bool bExpand)
1196 : throw (uno::RuntimeException, std::exception)
1197 : {
1198 8 : SolarMutexGuard aGuard;
1199 8 : if(m_pView)
1200 : {
1201 8 : if (!IsTextSelection())
1202 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
1203 :
1204 8 : m_pView->GetWrtShell().EndDoc( bExpand );
1205 : }
1206 : else
1207 0 : throw uno::RuntimeException();
1208 8 : }
1209 :
1210 3 : sal_Bool SwXTextViewCursor::jumpToFirstPage()
1211 : throw (uno::RuntimeException, std::exception)
1212 : {
1213 3 : SolarMutexGuard aGuard;
1214 3 : bool bRet = false;
1215 3 : if(m_pView)
1216 : {
1217 3 : SwWrtShell& rSh = m_pView->GetWrtShell();
1218 3 : if (rSh.IsSelFrmMode())
1219 : {
1220 0 : rSh.UnSelectFrm();
1221 0 : rSh.LeaveSelFrmMode();
1222 : }
1223 3 : rSh.EnterStdMode();
1224 3 : bRet = rSh.SttEndDoc(true);
1225 : }
1226 : else
1227 0 : throw uno::RuntimeException();
1228 3 : return bRet;
1229 : }
1230 :
1231 51 : sal_Bool SwXTextViewCursor::jumpToLastPage()
1232 : throw(uno::RuntimeException, std::exception)
1233 : {
1234 51 : SolarMutexGuard aGuard;
1235 51 : bool bRet = false;
1236 51 : if(m_pView)
1237 : {
1238 51 : SwWrtShell& rSh = m_pView->GetWrtShell();
1239 51 : if (rSh.IsSelFrmMode())
1240 : {
1241 0 : rSh.UnSelectFrm();
1242 0 : rSh.LeaveSelFrmMode();
1243 : }
1244 51 : rSh.EnterStdMode();
1245 51 : bRet = rSh.SttEndDoc(false);
1246 51 : rSh.SttPg();
1247 : }
1248 : else
1249 0 : throw uno::RuntimeException();
1250 51 : return bRet;
1251 : }
1252 :
1253 3 : sal_Bool SwXTextViewCursor::jumpToPage(sal_Int16 nPage) throw( uno::RuntimeException, std::exception )
1254 : {
1255 3 : SolarMutexGuard aGuard;
1256 3 : bool bRet = false;
1257 3 : if(m_pView)
1258 3 : bRet = m_pView->GetWrtShell().GotoPage(nPage, true);
1259 : else
1260 0 : throw uno::RuntimeException();
1261 3 : return bRet;
1262 : }
1263 :
1264 1 : sal_Bool SwXTextViewCursor::jumpToNextPage() throw( uno::RuntimeException, std::exception )
1265 : {
1266 1 : SolarMutexGuard aGuard;
1267 1 : bool bRet = false;
1268 1 : if(m_pView)
1269 1 : bRet = m_pView->GetWrtShell().SttNxtPg();
1270 : else
1271 0 : throw uno::RuntimeException();
1272 1 : return bRet;
1273 : }
1274 :
1275 1 : sal_Bool SwXTextViewCursor::jumpToPreviousPage() throw( uno::RuntimeException, std::exception )
1276 : {
1277 1 : SolarMutexGuard aGuard;
1278 1 : bool bRet = false;
1279 1 : if(m_pView)
1280 1 : bRet = m_pView->GetWrtShell().EndPrvPg();
1281 : else
1282 0 : throw uno::RuntimeException();
1283 1 : return bRet;
1284 : }
1285 :
1286 1 : sal_Bool SwXTextViewCursor::jumpToEndOfPage() throw( uno::RuntimeException, std::exception )
1287 : {
1288 1 : SolarMutexGuard aGuard;
1289 1 : bool bRet = false;
1290 1 : if(m_pView)
1291 1 : bRet = m_pView->GetWrtShell().EndPg();
1292 : else
1293 0 : throw uno::RuntimeException();
1294 1 : return bRet;
1295 : }
1296 :
1297 1 : sal_Bool SwXTextViewCursor::jumpToStartOfPage() throw( uno::RuntimeException, std::exception )
1298 : {
1299 1 : SolarMutexGuard aGuard;
1300 1 : bool bRet = false;
1301 1 : if(m_pView)
1302 1 : bRet = m_pView->GetWrtShell().SttPg();
1303 : else
1304 0 : throw uno::RuntimeException();
1305 1 : return bRet;
1306 : }
1307 :
1308 51 : sal_Int16 SwXTextViewCursor::getPage()
1309 : throw (uno::RuntimeException, std::exception)
1310 : {
1311 51 : SolarMutexGuard aGuard;
1312 51 : sal_Int16 nRet = 0;
1313 51 : if(m_pView)
1314 : {
1315 51 : SwWrtShell& rSh = m_pView->GetWrtShell();
1316 51 : SwPaM* pShellCrsr = rSh.GetCrsr();
1317 51 : nRet = static_cast<sal_Int16>(pShellCrsr->GetPageNum( true, 0 ));
1318 : }
1319 : else
1320 0 : throw uno::RuntimeException();
1321 51 : return nRet;
1322 : }
1323 :
1324 0 : sal_Bool SwXTextViewCursor::screenDown()
1325 : throw (uno::RuntimeException, std::exception)
1326 : {
1327 0 : SolarMutexGuard aGuard;
1328 0 : bool bRet = false;
1329 0 : if(m_pView)
1330 : {
1331 0 : SfxRequest aReq(FN_PAGEDOWN, SfxCallMode::SLOT, m_pView->GetPool());
1332 0 : m_pView->Execute(aReq);
1333 0 : const SfxPoolItem* pRet = aReq.GetReturnValue();
1334 0 : bRet = pRet && static_cast<const SfxBoolItem*>(pRet)->GetValue();
1335 : }
1336 : else
1337 0 : throw uno::RuntimeException();
1338 0 : return bRet;
1339 : }
1340 :
1341 0 : sal_Bool SwXTextViewCursor::screenUp()
1342 : throw (uno::RuntimeException, std::exception)
1343 : {
1344 0 : SolarMutexGuard aGuard;
1345 0 : bool bRet = false;
1346 0 : if(m_pView)
1347 : {
1348 0 : SfxRequest aReq(FN_PAGEUP, SfxCallMode::SLOT, m_pView->GetPool());
1349 0 : m_pView->Execute(aReq);
1350 0 : const SfxPoolItem* pRet = aReq.GetReturnValue();
1351 0 : bRet = pRet && static_cast<const SfxBoolItem*>(pRet)->GetValue();
1352 : }
1353 : else
1354 0 : throw uno::RuntimeException();
1355 0 : return bRet;
1356 : }
1357 :
1358 1 : uno::Reference< text::XText > SwXTextViewCursor::getText()
1359 : throw (uno::RuntimeException, std::exception)
1360 : {
1361 1 : SolarMutexGuard aGuard;
1362 1 : uno::Reference< text::XText > xRet;
1363 1 : if(m_pView)
1364 : {
1365 1 : if (!IsTextSelection( false ))
1366 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
1367 :
1368 1 : SwWrtShell& rSh = m_pView->GetWrtShell();
1369 1 : SwPaM* pShellCrsr = rSh.GetCrsr();
1370 1 : SwDoc* pDoc = m_pView->GetDocShell()->GetDoc();
1371 1 : xRet = ::sw::CreateParentXText(*pDoc, *pShellCrsr->Start());
1372 : }
1373 : else
1374 0 : throw uno::RuntimeException();
1375 1 : return xRet;
1376 : }
1377 :
1378 2 : uno::Reference< text::XTextRange > SwXTextViewCursor::getStart()
1379 : throw (uno::RuntimeException, std::exception)
1380 : {
1381 2 : SolarMutexGuard aGuard;
1382 2 : uno::Reference< text::XTextRange > xRet;
1383 2 : if(m_pView)
1384 : {
1385 2 : if (!IsTextSelection())
1386 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
1387 :
1388 2 : SwWrtShell& rSh = m_pView->GetWrtShell();
1389 2 : SwPaM* pShellCrsr = rSh.GetCrsr();
1390 2 : SwDoc* pDoc = m_pView->GetDocShell()->GetDoc();
1391 2 : xRet = SwXTextRange::CreateXTextRange(*pDoc, *pShellCrsr->Start(), 0);
1392 : }
1393 : else
1394 0 : throw uno::RuntimeException();
1395 2 : return xRet;
1396 : }
1397 :
1398 1 : uno::Reference< text::XTextRange > SwXTextViewCursor::getEnd()
1399 : throw (uno::RuntimeException, std::exception)
1400 : {
1401 1 : SolarMutexGuard aGuard;
1402 1 : uno::Reference< text::XTextRange > xRet;
1403 1 : if(m_pView)
1404 : {
1405 1 : if (!IsTextSelection())
1406 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
1407 :
1408 1 : SwWrtShell& rSh = m_pView->GetWrtShell();
1409 1 : SwPaM* pShellCrsr = rSh.GetCrsr();
1410 1 : SwDoc* pDoc = m_pView->GetDocShell()->GetDoc();
1411 1 : xRet = SwXTextRange::CreateXTextRange(*pDoc, *pShellCrsr->End(), 0);
1412 : }
1413 : else
1414 0 : throw uno::RuntimeException();
1415 1 : return xRet;
1416 : }
1417 :
1418 8 : OUString SwXTextViewCursor::getString()
1419 : throw (uno::RuntimeException, std::exception)
1420 : {
1421 8 : SolarMutexGuard aGuard;
1422 8 : OUString uRet;
1423 8 : if(m_pView)
1424 : {
1425 8 : if (!IsTextSelection( false ))
1426 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
1427 :
1428 8 : ShellModes eSelMode = m_pView->GetShellMode();
1429 8 : switch(eSelMode)
1430 : {
1431 : //! since setString for SEL_TABLE_TEXT (with possible
1432 : //! multi selection of cells) would not work properly we
1433 : //! will ignore this case for both
1434 : //! functions (setString AND getString) because of symmetrie.
1435 :
1436 : case SHELL_MODE_LIST_TEXT :
1437 : case SHELL_MODE_TABLE_LIST_TEXT:
1438 : case SHELL_MODE_TEXT :
1439 : {
1440 8 : SwWrtShell& rSh = m_pView->GetWrtShell();
1441 8 : SwPaM* pShellCrsr = rSh.GetCrsr();
1442 8 : SwUnoCursorHelper::GetTextFromPam(*pShellCrsr, uRet);
1443 : }
1444 : default:;//prevent warning
1445 : }
1446 : }
1447 8 : return uRet;
1448 : }
1449 :
1450 8 : void SwXTextViewCursor::setString(const OUString& aString)
1451 : throw (uno::RuntimeException, std::exception)
1452 : {
1453 8 : SolarMutexGuard aGuard;
1454 8 : if(m_pView)
1455 : {
1456 8 : if (!IsTextSelection( false ))
1457 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
1458 :
1459 8 : ShellModes eSelMode = m_pView->GetShellMode();
1460 8 : switch(eSelMode)
1461 : {
1462 : //! since setString for SEL_TABLE_TEXT (with possible
1463 : //! multi selection of cells) would not work properly we
1464 : //! will ignore this case for both
1465 : //! functions (setString AND getString) because of symmetrie.
1466 :
1467 : case SHELL_MODE_LIST_TEXT :
1468 : case SHELL_MODE_TABLE_LIST_TEXT :
1469 : case SHELL_MODE_TEXT :
1470 : {
1471 8 : SwWrtShell& rSh = m_pView->GetWrtShell();
1472 8 : SwCursor* pShellCrsr = rSh.GetSwCrsr();
1473 8 : SwUnoCursorHelper::SetString(*pShellCrsr, aString);
1474 : }
1475 : default:;//prevent warning
1476 : }
1477 8 : }
1478 8 : }
1479 :
1480 166 : uno::Reference< XPropertySetInfo > SwXTextViewCursor::getPropertySetInfo( ) throw(RuntimeException, std::exception)
1481 : {
1482 166 : static uno::Reference< XPropertySetInfo > xRef = m_pPropSet->getPropertySetInfo();
1483 166 : return xRef;
1484 : }
1485 :
1486 83 : void SwXTextViewCursor::setPropertyValue( const OUString& rPropertyName, const Any& aValue )
1487 : throw (UnknownPropertyException, PropertyVetoException,
1488 : IllegalArgumentException, WrappedTargetException,
1489 : RuntimeException, std::exception)
1490 : {
1491 83 : SolarMutexGuard aGuard;
1492 83 : if(m_pView)
1493 : {
1494 83 : SwWrtShell& rSh = m_pView->GetWrtShell();
1495 83 : SwPaM* pShellCrsr = rSh.GetCrsr();
1496 83 : SwNode& rNode = pShellCrsr->GetNode();
1497 83 : if (rNode.IsTextNode())
1498 : {
1499 : SwUnoCursorHelper::SetPropertyValue(
1500 83 : *pShellCrsr, *m_pPropSet, rPropertyName, aValue );
1501 : }
1502 : else
1503 0 : throw RuntimeException();
1504 : }
1505 : else
1506 0 : throw RuntimeException();
1507 83 : }
1508 :
1509 171 : Any SwXTextViewCursor::getPropertyValue( const OUString& rPropertyName )
1510 : throw (UnknownPropertyException, WrappedTargetException,
1511 : RuntimeException, std::exception)
1512 : {
1513 171 : SolarMutexGuard aGuard;
1514 171 : Any aRet;
1515 171 : if(m_pView)
1516 : {
1517 171 : SwWrtShell& rSh = m_pView->GetWrtShell();
1518 171 : SwPaM* pShellCrsr = rSh.GetCrsr();
1519 342 : aRet = SwUnoCursorHelper::GetPropertyValue(
1520 171 : *pShellCrsr, *m_pPropSet, rPropertyName);
1521 : }
1522 : else
1523 0 : throw RuntimeException();
1524 171 : return aRet;
1525 : }
1526 :
1527 0 : void SwXTextViewCursor::addPropertyChangeListener(
1528 : const OUString& /*aPropertyName*/, const uno::Reference< XPropertyChangeListener >& /*xListener*/ )
1529 : throw(UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
1530 : {
1531 0 : }
1532 :
1533 0 : void SwXTextViewCursor::removePropertyChangeListener(
1534 : const OUString& /*aPropertyName*/, const uno::Reference< XPropertyChangeListener >& /*aListener*/ )
1535 : throw(UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
1536 : {
1537 0 : }
1538 :
1539 0 : void SwXTextViewCursor::addVetoableChangeListener(
1540 : const OUString& /*PropertyName*/, const uno::Reference< XVetoableChangeListener >& /*aListener*/ )
1541 : throw(UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
1542 : {
1543 0 : }
1544 :
1545 0 : void SwXTextViewCursor::removeVetoableChangeListener(
1546 : const OUString& /*PropertyName*/, const uno::Reference< XVetoableChangeListener >& /*aListener*/ ) throw(UnknownPropertyException, WrappedTargetException, RuntimeException, std::exception)
1547 : {
1548 0 : }
1549 :
1550 1 : PropertyState SwXTextViewCursor::getPropertyState( const OUString& rPropertyName )
1551 : throw (UnknownPropertyException, RuntimeException,
1552 : std::exception)
1553 : {
1554 1 : SolarMutexGuard aGuard;
1555 : PropertyState eState;
1556 1 : if(m_pView)
1557 : {
1558 1 : SwWrtShell& rSh = m_pView->GetWrtShell();
1559 1 : SwPaM* pShellCrsr = rSh.GetCrsr();
1560 : eState = SwUnoCursorHelper::GetPropertyState(
1561 1 : *pShellCrsr, *m_pPropSet, rPropertyName);
1562 : }
1563 : else
1564 0 : throw RuntimeException();
1565 1 : return eState;
1566 : }
1567 :
1568 1 : Sequence< PropertyState > SwXTextViewCursor::getPropertyStates(
1569 : const Sequence< OUString >& rPropertyNames )
1570 : throw (UnknownPropertyException, RuntimeException,
1571 : std::exception)
1572 : {
1573 1 : SolarMutexGuard aGuard;
1574 1 : Sequence< PropertyState > aRet;
1575 1 : if(m_pView)
1576 : {
1577 1 : SwWrtShell& rSh = m_pView->GetWrtShell();
1578 1 : SwPaM* pShellCrsr = rSh.GetCrsr();
1579 2 : aRet = SwUnoCursorHelper::GetPropertyStates(
1580 1 : *pShellCrsr, *m_pPropSet, rPropertyNames);
1581 : }
1582 1 : return aRet;
1583 : }
1584 :
1585 1 : void SwXTextViewCursor::setPropertyToDefault( const OUString& rPropertyName )
1586 : throw (UnknownPropertyException, RuntimeException,
1587 : std::exception)
1588 : {
1589 1 : SolarMutexGuard aGuard;
1590 1 : if(m_pView)
1591 : {
1592 1 : SwWrtShell& rSh = m_pView->GetWrtShell();
1593 1 : SwPaM* pShellCrsr = rSh.GetCrsr();
1594 : SwUnoCursorHelper::SetPropertyToDefault(
1595 1 : *pShellCrsr, *m_pPropSet, rPropertyName);
1596 1 : }
1597 1 : }
1598 :
1599 1 : Any SwXTextViewCursor::getPropertyDefault( const OUString& rPropertyName )
1600 : throw (UnknownPropertyException, WrappedTargetException,
1601 : RuntimeException, std::exception)
1602 : {
1603 1 : Any aRet;
1604 2 : SolarMutexGuard aGuard;
1605 1 : if(m_pView)
1606 : {
1607 1 : SwWrtShell& rSh = m_pView->GetWrtShell();
1608 1 : SwPaM* pShellCrsr = rSh.GetCrsr();
1609 2 : aRet = SwUnoCursorHelper::GetPropertyDefault(
1610 1 : *pShellCrsr, *m_pPropSet, rPropertyName);
1611 : }
1612 2 : return aRet;
1613 : }
1614 :
1615 0 : sal_Bool SwXTextViewCursor::goDown(sal_Int16 nCount, sal_Bool bExpand)
1616 : throw (uno::RuntimeException, std::exception)
1617 : {
1618 0 : SolarMutexGuard aGuard;
1619 0 : bool bRet = false;
1620 0 : if(m_pView)
1621 : {
1622 0 : if (!IsTextSelection())
1623 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
1624 :
1625 0 : for( sal_uInt16 i = 0; i < nCount; i++ )
1626 0 : bRet = m_pView->GetWrtShell().Down( bExpand, 1, true );
1627 : }
1628 : else
1629 0 : throw uno::RuntimeException();
1630 0 : return bRet;
1631 : }
1632 :
1633 0 : sal_Bool SwXTextViewCursor::goUp(sal_Int16 nCount, sal_Bool bExpand)
1634 : throw (uno::RuntimeException, std::exception)
1635 : {
1636 0 : SolarMutexGuard aGuard;
1637 0 : bool bRet = false;
1638 0 : if(m_pView)
1639 : {
1640 0 : if (!IsTextSelection())
1641 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
1642 :
1643 0 : for( sal_uInt16 i = 0; i < nCount; i++ )
1644 0 : bRet = m_pView->GetWrtShell().Up( bExpand, 1, true );
1645 : }
1646 : else
1647 0 : throw uno::RuntimeException();
1648 0 : return bRet;
1649 : }
1650 :
1651 0 : sal_Bool SwXTextViewCursor::isAtStartOfLine()
1652 : throw(uno::RuntimeException, std::exception)
1653 : {
1654 0 : SolarMutexGuard aGuard;
1655 0 : bool bRet = false;
1656 0 : if(m_pView)
1657 : {
1658 0 : if (!IsTextSelection( false ))
1659 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
1660 :
1661 0 : bRet = m_pView->GetWrtShell().IsAtLeftMargin();
1662 : }
1663 : else
1664 0 : throw uno::RuntimeException();
1665 0 : return bRet;
1666 : }
1667 :
1668 0 : sal_Bool SwXTextViewCursor::isAtEndOfLine()
1669 : throw(uno::RuntimeException, std::exception)
1670 : {
1671 0 : SolarMutexGuard aGuard;
1672 0 : bool bRet = false;
1673 0 : if(m_pView)
1674 : {
1675 0 : if (!IsTextSelection( false ))
1676 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
1677 :
1678 0 : bRet = m_pView->GetWrtShell().IsAtRightMargin(true);
1679 : }
1680 : else
1681 0 : throw uno::RuntimeException();
1682 0 : return bRet;
1683 : }
1684 :
1685 0 : void SwXTextViewCursor::gotoEndOfLine(sal_Bool bExpand)
1686 : throw (uno::RuntimeException, std::exception)
1687 : {
1688 0 : SolarMutexGuard aGuard;
1689 0 : if(m_pView)
1690 : {
1691 0 : if (!IsTextSelection( false ))
1692 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
1693 :
1694 0 : m_pView->GetWrtShell().RightMargin(bExpand, true);
1695 : }
1696 : else
1697 0 : throw uno::RuntimeException();
1698 0 : }
1699 :
1700 0 : void SwXTextViewCursor::gotoStartOfLine(sal_Bool bExpand)
1701 : throw (uno::RuntimeException, std::exception)
1702 : {
1703 0 : SolarMutexGuard aGuard;
1704 0 : if(m_pView)
1705 : {
1706 0 : if (!IsTextSelection( false ))
1707 0 : throw uno::RuntimeException("no text selection", static_cast < cppu::OWeakObject * > ( this ) );
1708 :
1709 0 : m_pView->GetWrtShell().LeftMargin(bExpand, true);
1710 : }
1711 : else
1712 0 : throw uno::RuntimeException();
1713 0 : }
1714 :
1715 0 : OUString SwXTextViewCursor::getImplementationName() throw( RuntimeException, std::exception )
1716 : {
1717 0 : return OUString("SwXTextViewCursor");
1718 : }
1719 :
1720 5 : sal_Bool SwXTextViewCursor::supportsService(const OUString& rServiceName) throw( RuntimeException, std::exception )
1721 : {
1722 5 : return cppu::supportsService(this, rServiceName);
1723 : }
1724 :
1725 5 : Sequence< OUString > SwXTextViewCursor::getSupportedServiceNames() throw( RuntimeException, std::exception )
1726 : {
1727 5 : Sequence< OUString > aRet(7);
1728 5 : OUString* pArray = aRet.getArray();
1729 5 : pArray[0] = "com.sun.star.text.TextViewCursor";
1730 5 : pArray[1] = "com.sun.star.style.CharacterProperties";
1731 5 : pArray[2] = "com.sun.star.style.CharacterPropertiesAsian";
1732 5 : pArray[3] = "com.sun.star.style.CharacterPropertiesComplex";
1733 5 : pArray[4] = "com.sun.star.style.ParagraphProperties";
1734 5 : pArray[5] = "com.sun.star.style.ParagraphPropertiesAsian";
1735 5 : pArray[6] = "com.sun.star.style.ParagraphPropertiesComplex";
1736 5 : return aRet;
1737 : }
1738 :
1739 : namespace
1740 : {
1741 : class theSwXTextViewCursorUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theSwXTextViewCursorUnoTunnelId > {};
1742 : }
1743 :
1744 0 : const uno::Sequence< sal_Int8 > & SwXTextViewCursor::getUnoTunnelId()
1745 : {
1746 0 : return theSwXTextViewCursorUnoTunnelId::get().getSeq();
1747 : }
1748 :
1749 : //XUnoTunnel
1750 0 : sal_Int64 SAL_CALL SwXTextViewCursor::getSomething(
1751 : const uno::Sequence< sal_Int8 >& rId )
1752 : throw(uno::RuntimeException, std::exception)
1753 : {
1754 0 : if( rId.getLength() == 16
1755 0 : && 0 == memcmp( getUnoTunnelId().getConstArray(),
1756 0 : rId.getConstArray(), 16 ) )
1757 : {
1758 0 : return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >( this ));
1759 : }
1760 0 : return OTextCursorHelper::getSomething(rId);
1761 : }
1762 :
1763 543 : IMPLEMENT_FORWARD_XINTERFACE2(SwXTextViewCursor,SwXTextViewCursor_Base,OTextCursorHelper)
1764 0 : const SwDoc* SwXTextViewCursor::GetDoc() const
1765 : {
1766 0 : SwWrtShell& rSh = m_pView->GetWrtShell();
1767 0 : return rSh.GetCrsr() ? rSh.GetCrsr()->GetDoc() : 0;
1768 : }
1769 :
1770 0 : SwDoc* SwXTextViewCursor::GetDoc()
1771 : {
1772 0 : SwWrtShell& rSh = m_pView->GetWrtShell();
1773 0 : return rSh.GetCrsr() ? rSh.GetCrsr()->GetDoc() : 0;
1774 : }
1775 :
1776 0 : const SwPaM* SwXTextViewCursor::GetPaM() const
1777 : {
1778 0 : SwWrtShell& rSh = m_pView->GetWrtShell();
1779 0 : return rSh.GetCrsr();
1780 : }
1781 :
1782 0 : SwPaM* SwXTextViewCursor::GetPaM()
1783 : {
1784 0 : SwWrtShell& rSh = m_pView->GetWrtShell();
1785 0 : return rSh.GetCrsr();
1786 : }
1787 :
1788 0 : uno::Reference< datatransfer::XTransferable > SAL_CALL SwXTextView::getTransferable()
1789 : throw (uno::RuntimeException, std::exception)
1790 : {
1791 0 : SolarMutexGuard aGuard;
1792 :
1793 : //force immediat shell update
1794 0 : GetView()->StopShellTimer();
1795 0 : SwWrtShell& rSh = GetView()->GetWrtShell();
1796 0 : if ( GetView()->GetShellMode() == SHELL_MODE_DRAWTEXT )
1797 : {
1798 0 : SdrView *pSdrView = rSh.GetDrawView();
1799 0 : OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
1800 0 : return pOLV->GetEditView().GetTransferable();
1801 : }
1802 : else
1803 : {
1804 0 : SwTransferable* pTransfer = new SwTransferable( rSh );
1805 0 : const bool bLockedView = rSh.IsViewLocked();
1806 0 : rSh.LockView( true ); //lock visible section
1807 0 : pTransfer->PrepareForCopy();
1808 0 : rSh.LockView( bLockedView );
1809 0 : return uno::Reference< datatransfer::XTransferable >( pTransfer );
1810 0 : }
1811 : }
1812 :
1813 0 : void SAL_CALL SwXTextView::insertTransferable( const uno::Reference< datatransfer::XTransferable >& xTrans ) throw (datatransfer::UnsupportedFlavorException, uno::RuntimeException, std::exception)
1814 : {
1815 0 : SolarMutexGuard aGuard;
1816 :
1817 : //force immediat shell update
1818 0 : GetView()->StopShellTimer();
1819 0 : SwWrtShell& rSh = GetView()->GetWrtShell();
1820 0 : if ( GetView()->GetShellMode() == SHELL_MODE_DRAWTEXT )
1821 : {
1822 0 : SdrView *pSdrView = rSh.GetDrawView();
1823 0 : OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
1824 0 : pOLV->GetEditView().InsertText( xTrans, GetView()->GetDocShell()->GetMedium()->GetBaseURL(), false );
1825 : }
1826 : else
1827 : {
1828 0 : TransferableDataHelper aDataHelper( xTrans );
1829 0 : if ( SwTransferable::IsPaste( rSh, aDataHelper ) )
1830 : {
1831 0 : SwTransferable::Paste( rSh, aDataHelper );
1832 0 : if( rSh.IsFrmSelected() || rSh.IsObjSelected() )
1833 0 : rSh.EnterSelFrmMode();
1834 0 : GetView()->AttrChangedNotify( &rSh );
1835 0 : }
1836 0 : }
1837 177 : }
1838 :
1839 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|