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