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