1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25
26 #include "precompiled_editeng.hxx"
27
28 #include <com/sun/star/i18n/WordType.hpp>
29
30 #include <svl/intitem.hxx>
31 #include <editeng/editeng.hxx>
32 #include <editeng/editview.hxx>
33 #include <editeng/editdata.hxx>
34 #include <editeng/eerdll.hxx>
35 #include <editeng/lrspitem.hxx>
36 #include <editeng/fhgtitem.hxx>
37
38 #include <svl/style.hxx>
39 #include <i18npool/mslangid.hxx>
40
41 #define _OUTLINER_CXX
42 #include <editeng/outliner.hxx>
43 #include <outleeng.hxx>
44 #include <paralist.hxx>
45 #include <outlundo.hxx>
46 #include <editeng/outlobj.hxx>
47 #include <editeng/flditem.hxx>
48 #include <editeng/flditem.hxx>
49 #include <editeng/eeitem.hxx>
50 #include <editeng/numitem.hxx>
51 #include <vcl/window.hxx>
52 #include <svl/itemset.hxx>
53 #include <svl/eitem.hxx>
54 #include <editeng/editstat.hxx>
55 #include <svl/itempool.hxx>
56
57 // Breite der Randzonen innerhalb derer beim D&D gescrollt wird
58 #define OL_SCROLL_LRBORDERWIDTHPIX 10
59 #define OL_SCROLL_TBBORDERWIDTHPIX 10
60
61 // Wert, um den Fensterinhalt beim D&D gescrollt wird
62 #define OL_SCROLL_HOROFFSET 20 /* in % von VisibleSize.Width */
63 #define OL_SCROLL_VEROFFSET 20 /* in % von VisibleSize.Height */
64
65 using namespace ::com::sun::star;
66
DBG_NAME(OutlinerView)67 DBG_NAME(OutlinerView)
68
69
70 OutlinerView::OutlinerView( Outliner* pOut, Window* pWin )
71 {
72 DBG_CTOR( OutlinerView, 0 );
73
74 pOwner = pOut;
75 bDDCursorVisible = sal_False;
76 bInDragMode = sal_False;
77 nDDScrollLRBorderWidthWin = 0;
78 nDDScrollTBBorderWidthWin = 0;
79 pHorTabArrDoc = 0;
80
81 pEditView = new EditView( pOut->pEditEngine, pWin );
82 pEditView->SetSelectionMode( EE_SELMODE_TXTONLY );
83 }
84
~OutlinerView()85 OutlinerView::~OutlinerView()
86 {
87 DBG_DTOR(OutlinerView,0);
88 delete pEditView;
89 }
90
Paint(const Rectangle & rRect,OutputDevice * pTargetDevice)91 void OutlinerView::Paint( const Rectangle& rRect, OutputDevice* pTargetDevice )
92 {
93 DBG_CHKTHIS(OutlinerView,0);
94
95 // beim ersten Paint/KeyInput/Drop wird aus einem leeren Outliner ein
96 // Outliner mit genau einem Absatz
97 if( pOwner->bFirstParaIsEmpty )
98 pOwner->Insert( String() );
99
100 pEditView->Paint( rRect, pTargetDevice );
101 }
102
PostKeyEvent(const KeyEvent & rKEvt)103 sal_Bool OutlinerView::PostKeyEvent( const KeyEvent& rKEvt )
104 {
105 DBG_CHKTHIS( OutlinerView, 0 );
106
107 // beim ersten Paint/KeyInput/Drop wird aus einem leeren Outliner ein
108 // Outliner mit genau einem Absatz
109 if( pOwner->bFirstParaIsEmpty )
110 pOwner->Insert( String() );
111
112
113 sal_Bool bKeyProcessed = sal_False;
114 ESelection aSel( pEditView->GetSelection() );
115 sal_Bool bSelection = aSel.HasRange();
116 KeyCode aKeyCode = rKEvt.GetKeyCode();
117 KeyFuncType eFunc = aKeyCode.GetFunction();
118 sal_uInt16 nCode = aKeyCode.GetCode();
119 sal_Bool bReadOnly = IsReadOnly();
120
121 if( bSelection && ( nCode != KEY_TAB ) && EditEngine::DoesKeyChangeText( rKEvt ) )
122 {
123 if ( ImpCalcSelectedPages( sal_False ) && !pOwner->ImpCanDeleteSelectedPages( this ) )
124 return sal_True;
125 }
126
127 if ( eFunc != KEYFUNC_DONTKNOW )
128 {
129 switch ( eFunc )
130 {
131 case KEYFUNC_CUT:
132 {
133 if ( !bReadOnly )
134 {
135 Cut();
136 bKeyProcessed = sal_True;
137 }
138 }
139 break;
140 case KEYFUNC_COPY:
141 {
142 Copy();
143 bKeyProcessed = sal_True;
144 }
145 break;
146 case KEYFUNC_PASTE:
147 {
148 if ( !bReadOnly )
149 {
150 PasteSpecial();
151 bKeyProcessed = sal_True;
152 }
153 }
154 break;
155 case KEYFUNC_DELETE:
156 {
157 if( !bReadOnly && !bSelection && ( pOwner->ImplGetOutlinerMode() != OUTLINERMODE_TEXTOBJECT ) )
158 {
159 if( aSel.nEndPos == pOwner->pEditEngine->GetTextLen( aSel.nEndPara ) )
160 {
161 Paragraph* pNext = pOwner->pParaList->GetParagraph( aSel.nEndPara+1 );
162 if( pNext && pNext->HasFlag(PARAFLAG_ISPAGE) )
163 {
164 if( !pOwner->ImpCanDeleteSelectedPages( this, aSel.nEndPara, 1 ) )
165 return sal_False;
166 }
167 }
168 }
169 }
170 break;
171 default: // wird dann evtl. unten bearbeitet.
172 eFunc = KEYFUNC_DONTKNOW;
173 }
174 }
175 if ( eFunc == KEYFUNC_DONTKNOW )
176 {
177 switch ( nCode )
178 {
179 case KEY_TAB:
180 {
181 if ( !bReadOnly && !aKeyCode.IsMod1() && !aKeyCode.IsMod2() )
182 {
183 if ( ( pOwner->ImplGetOutlinerMode() != OUTLINERMODE_TEXTOBJECT ) &&
184 ( pOwner->ImplGetOutlinerMode() != OUTLINERMODE_TITLEOBJECT ) &&
185 ( bSelection || !aSel.nStartPos ) )
186 {
187 Indent( aKeyCode.IsShift() ? (-1) : (+1) );
188 bKeyProcessed = sal_True;
189 }
190 else if ( ( pOwner->ImplGetOutlinerMode() == OUTLINERMODE_TEXTOBJECT ) &&
191 !bSelection && !aSel.nEndPos && pOwner->ImplHasNumberFormat( aSel.nEndPara ) )
192 {
193 Indent( aKeyCode.IsShift() ? (-1) : (+1) );
194 bKeyProcessed = sal_True;
195 }
196 }
197 }
198 break;
199 case KEY_BACKSPACE:
200 {
201 if( !bReadOnly && !bSelection && aSel.nEndPara && !aSel.nEndPos )
202 {
203 Paragraph* pPara = pOwner->pParaList->GetParagraph( aSel.nEndPara );
204 Paragraph* pPrev = pOwner->pParaList->GetParagraph( aSel.nEndPara-1 );
205 if( !pPrev->IsVisible() )
206 return sal_True;
207 if( !pPara->GetDepth() )
208 {
209 if(!pOwner->ImpCanDeleteSelectedPages(this, aSel.nEndPara , 1 ) )
210 return sal_True;
211 }
212 }
213 }
214 break;
215 case KEY_RETURN:
216 {
217 if ( !bReadOnly )
218 {
219 // Sonderbehandlung: Hartes Return am Ende eines Absatzes,
220 // der eingeklappte Unterabsaetze besitzt
221 Paragraph* pPara = pOwner->pParaList->GetParagraph( aSel.nEndPara );
222
223 if( !aKeyCode.IsShift() )
224 {
225 // Nochmal ImpGetCursor ???
226 if( !bSelection &&
227 aSel.nEndPos == pOwner->pEditEngine->GetTextLen( aSel.nEndPara ) )
228 {
229 sal_uLong nChilds = pOwner->pParaList->GetChildCount(pPara);
230 if( nChilds && !pOwner->pParaList->HasVisibleChilds(pPara))
231 {
232 pOwner->UndoActionStart( OLUNDO_INSERT );
233 sal_uInt32 nTemp = aSel.nEndPara;
234 nTemp += nChilds;
235 nTemp++; // einfuegen ueber naechstem Non-Child
236 pOwner->Insert( String(),nTemp,pPara->GetDepth());
237 // Cursor positionieren
238 ESelection aTmpSel(nTemp,0,nTemp,0);
239 pEditView->SetSelection( aTmpSel );
240 pEditView->ShowCursor( sal_True, sal_True );
241 pOwner->UndoActionEnd( OLUNDO_INSERT );
242 bKeyProcessed = sal_True;
243 }
244 }
245 }
246 if( !bKeyProcessed && !bSelection &&
247 !aKeyCode.IsShift() && aKeyCode.IsMod1() &&
248 ( aSel.nEndPos == pOwner->pEditEngine->GetTextLen(aSel.nEndPara) ) )
249 {
250 pOwner->UndoActionStart( OLUNDO_INSERT );
251 sal_uLong nTemp = aSel.nEndPara;
252 nTemp++;
253 pOwner->Insert( String(), nTemp, pPara->GetDepth()+1 );
254
255 // Cursor positionieren
256 ESelection aTmpSel(nTemp,0,nTemp,0);
257 pEditView->SetSelection( aTmpSel );
258 pEditView->ShowCursor( sal_True, sal_True );
259 pOwner->UndoActionEnd( OLUNDO_INSERT );
260 bKeyProcessed = sal_True;
261 }
262 }
263 }
264 break;
265 }
266 }
267
268 return bKeyProcessed ? sal_True : pEditView->PostKeyEvent( rKEvt );
269 }
270
271
ImpCheckMousePos(const Point & rPosPix,MouseTarget & reTarget)272 sal_uLong OutlinerView::ImpCheckMousePos(const Point& rPosPix, MouseTarget& reTarget)
273 {
274 DBG_CHKTHIS(OutlinerView,0);
275 sal_uLong nPara = EE_PARA_NOT_FOUND;
276
277 Point aMousePosWin = pEditView->GetWindow()->PixelToLogic( rPosPix );
278 if( !pEditView->GetOutputArea().IsInside( aMousePosWin ) )
279 {
280 reTarget = MouseOutside;
281 }
282 else
283 {
284 reTarget = MouseText;
285
286 Point aPaperPos( aMousePosWin );
287 Rectangle aOutArea = pEditView->GetOutputArea();
288 Rectangle aVisArea = pEditView->GetVisArea();
289 aPaperPos.X() -= aOutArea.Left();
290 aPaperPos.X() += aVisArea.Left();
291 aPaperPos.Y() -= aOutArea.Top();
292 aPaperPos.Y() += aVisArea.Top();
293
294 sal_Bool bBullet;
295 if ( pOwner->IsTextPos( aPaperPos, 0, &bBullet ) )
296 {
297 Point aDocPos = pOwner->GetDocPos( aPaperPos );
298 nPara = pOwner->pEditEngine->FindParagraph( aDocPos.Y() );
299
300 if ( bBullet )
301 {
302 reTarget = MouseBullet;
303 }
304 else
305 {
306 // Check for hyperlink
307 const SvxFieldItem* pFieldItem = pEditView->GetField( aMousePosWin );
308 if ( pFieldItem && pFieldItem->GetField() && pFieldItem->GetField()->ISA( SvxURLField ) )
309 reTarget = MouseHypertext;
310 }
311 }
312 }
313 return nPara;
314 }
315
MouseMove(const MouseEvent & rMEvt)316 sal_Bool __EXPORT OutlinerView::MouseMove( const MouseEvent& rMEvt )
317 {
318 DBG_CHKTHIS(OutlinerView,0);
319
320 if( ( pOwner->ImplGetOutlinerMode() == OUTLINERMODE_TEXTOBJECT ) || pEditView->GetEditEngine()->IsInSelectionMode())
321 return pEditView->MouseMove( rMEvt );
322
323 Point aMousePosWin( pEditView->GetWindow()->PixelToLogic( rMEvt.GetPosPixel() ) );
324 if( !pEditView->GetOutputArea().IsInside( aMousePosWin ) )
325 return sal_False;
326
327 Pointer aPointer = GetPointer( rMEvt.GetPosPixel() );
328 pEditView->GetWindow()->SetPointer( aPointer );
329 return pEditView->MouseMove( rMEvt );
330 }
331
332
MouseButtonDown(const MouseEvent & rMEvt)333 sal_Bool __EXPORT OutlinerView::MouseButtonDown( const MouseEvent& rMEvt )
334 {
335 DBG_CHKTHIS(OutlinerView,0);
336 if ( ( pOwner->ImplGetOutlinerMode() == OUTLINERMODE_TEXTOBJECT ) || pEditView->GetEditEngine()->IsInSelectionMode() )
337 return pEditView->MouseButtonDown( rMEvt );
338
339 Point aMousePosWin( pEditView->GetWindow()->PixelToLogic( rMEvt.GetPosPixel() ) );
340 if( !pEditView->GetOutputArea().IsInside( aMousePosWin ) )
341 return sal_False;
342
343 Pointer aPointer = GetPointer( rMEvt.GetPosPixel() );
344 pEditView->GetWindow()->SetPointer( aPointer );
345
346 MouseTarget eTarget;
347 sal_uInt32 nPara = ImpCheckMousePos( rMEvt.GetPosPixel(), eTarget );
348 if ( eTarget == MouseBullet )
349 {
350 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara );
351 sal_Bool bHasChilds = (pPara && pOwner->pParaList->HasChilds(pPara));
352 if( rMEvt.GetClicks() == 1 )
353 {
354 sal_uInt32 nEndPara = nPara;
355 if ( bHasChilds && pOwner->pParaList->HasVisibleChilds(pPara) )
356 nEndPara += pOwner->pParaList->GetChildCount( pPara );
357 // umgekehrt rum selektieren, damit EditEngine nicht scrollt
358 ESelection aSel(nEndPara, EE_INDEX_MAX, nPara, 0 );
359 pEditView->SetSelection( aSel );
360 }
361 else if( rMEvt.GetClicks() == 2 && bHasChilds )
362 ImpToggleExpand( pPara );
363
364 aDDStartPosPix = rMEvt.GetPosPixel();
365 aDDStartPosRef=pEditView->GetWindow()->PixelToLogic( aDDStartPosPix,pOwner->GetRefMapMode());
366 return sal_True;
367 }
368
369 // special case for outliner view in impress, check if double click hits the page icon for toggle
370 if( (nPara == EE_PARA_NOT_FOUND) && (pOwner->ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEVIEW) && (eTarget == MouseText) && (rMEvt.GetClicks() == 2) )
371 {
372 ESelection aSel( pEditView->GetSelection() );
373 nPara = aSel.nStartPara;
374 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara );
375 if( (pPara && pOwner->pParaList->HasChilds(pPara)) && pPara->HasFlag(PARAFLAG_ISPAGE) )
376 {
377 ImpToggleExpand( pPara );
378 }
379 }
380 return pEditView->MouseButtonDown( rMEvt );
381 }
382
383
MouseButtonUp(const MouseEvent & rMEvt)384 sal_Bool __EXPORT OutlinerView::MouseButtonUp( const MouseEvent& rMEvt )
385 {
386 DBG_CHKTHIS(OutlinerView,0);
387 if ( ( pOwner->ImplGetOutlinerMode() == OUTLINERMODE_TEXTOBJECT ) || pEditView->GetEditEngine()->IsInSelectionMode() )
388 return pEditView->MouseButtonUp( rMEvt );
389
390 Point aMousePosWin( pEditView->GetWindow()->PixelToLogic( rMEvt.GetPosPixel() ) );
391 if( !pEditView->GetOutputArea().IsInside( aMousePosWin ) )
392 return sal_False;
393
394 Pointer aPointer = GetPointer( rMEvt.GetPosPixel() );
395 pEditView->GetWindow()->SetPointer( aPointer );
396
397 return pEditView->MouseButtonUp( rMEvt );
398 }
399
ImpHideDDCursor()400 void OutlinerView::ImpHideDDCursor()
401 {
402 DBG_CHKTHIS(OutlinerView,0);
403 if ( bDDCursorVisible )
404 {
405 bDDCursorVisible = sal_False;
406 ImpPaintDDCursor();
407 }
408 }
409
ImpShowDDCursor()410 void OutlinerView::ImpShowDDCursor()
411 {
412 DBG_CHKTHIS(OutlinerView,0);
413 if ( !bDDCursorVisible )
414 {
415 bDDCursorVisible = sal_True;
416 ImpPaintDDCursor();
417 }
418 }
419
ImpPaintDDCursor()420 void OutlinerView::ImpPaintDDCursor()
421 {
422 DBG_CHKTHIS(OutlinerView,0);
423
424 Window* pWindow = pEditView->GetWindow();
425 RasterOp eOldOp = pWindow->GetRasterOp();
426 pWindow->SetRasterOp( ROP_INVERT );
427
428 const Color& rOldLineColor = pWindow->GetLineColor();
429 pWindow->SetLineColor( Color( COL_BLACK ) );
430
431 Point aStartPointWin, aEndPointWin;
432 Rectangle aOutputArWin = pEditView->GetOutputArea();
433 Rectangle aVisAreaRef = pEditView->GetVisArea();
434
435 if( bDDChangingDepth )
436 {
437 aStartPointWin.X() = pHorTabArrDoc[ nDDCurDepth ];
438 aStartPointWin.X() += aOutputArWin.Left();
439 aStartPointWin.Y() = aOutputArWin.Top();
440 aEndPointWin.X() = aStartPointWin.X();
441 aEndPointWin.Y() = aOutputArWin.Bottom();
442 }
443 else
444 {
445 sal_uInt32 nPara = nDDCurPara;
446 if ( nDDCurPara == LIST_APPEND )
447 {
448 Paragraph* pTemp = pOwner->pParaList->LastVisible();
449 nPara = pOwner->pParaList->GetAbsPos( pTemp );
450 }
451 aStartPointWin = pEditView->GetWindowPosTopLeft( nPara );
452 if ( nDDCurPara == LIST_APPEND )
453 {
454 long nHeight = pOwner->pEditEngine->GetTextHeight( nPara );
455 aStartPointWin.Y() += nHeight;
456 }
457 aStartPointWin.X() = aOutputArWin.Left();
458 aEndPointWin.Y() = aStartPointWin.Y();
459 aEndPointWin.X() = aOutputArWin.Right();
460 }
461
462 pWindow->DrawLine( aStartPointWin, aEndPointWin );
463 pWindow->SetLineColor( rOldLineColor );
464 pWindow->SetRasterOp( eOldOp );
465 }
466
467 // Berechnet, ueber welchem Absatz eingefuegt werden muss
468
ImpGetInsertionPara(const Point & rPosPixel)469 sal_uLong OutlinerView::ImpGetInsertionPara( const Point& rPosPixel )
470 {
471 DBG_CHKTHIS(OutlinerView,0);
472 sal_uLong nCurPara = pEditView->GetParagraph( rPosPixel );
473 ParagraphList* pParaList = pOwner->pParaList;
474
475 if ( nCurPara == EE_PARA_NOT_FOUND )
476 nCurPara = LIST_APPEND;
477 else
478 {
479 Point aPosWin = pEditView->GetWindow()->PixelToLogic( rPosPixel );
480 Point aParaPosWin = pEditView->GetWindowPosTopLeft(nCurPara);
481 long nHeightRef = pOwner->pEditEngine->GetTextHeight(nCurPara);
482 long nParaYOffs = aPosWin.Y() - aParaPosWin.Y();
483
484 if ( nParaYOffs > nHeightRef / 2 )
485 {
486 Paragraph* p = pParaList->GetParagraph( nCurPara );
487 p = pParaList->NextVisible( p );
488 nCurPara = p ? pParaList->GetAbsPos( p ) : LIST_APPEND;
489 }
490 }
491 return nCurPara;
492 }
493
494
ImpToggleExpand(Paragraph * pPara)495 void OutlinerView::ImpToggleExpand( Paragraph* pPara )
496 {
497 DBG_CHKTHIS(OutlinerView,0);
498
499 sal_uInt32 nPara = pOwner->pParaList->GetAbsPos( pPara );
500 pEditView->SetSelection( ESelection( nPara, 0, nPara, 0 ) );
501 ImplExpandOrCollaps( nPara, nPara, !pOwner->pParaList->HasVisibleChilds( pPara ) );
502 pEditView->ShowCursor();
503 }
504
505
SetOutliner(Outliner * pOutliner)506 void OutlinerView::SetOutliner( Outliner* pOutliner )
507 {
508 DBG_CHKTHIS(OutlinerView,0);
509 pOwner = pOutliner;
510 pEditView->SetEditEngine( pOutliner->pEditEngine );
511 }
512
513
514
Select(Paragraph * pParagraph,sal_Bool bSelect,sal_Bool bWithChilds)515 sal_uLong OutlinerView::Select( Paragraph* pParagraph, sal_Bool bSelect,
516 sal_Bool bWithChilds )
517 {
518 DBG_CHKTHIS(OutlinerView,0);
519
520 sal_uLong nPara = pOwner->pParaList->GetAbsPos( pParagraph );
521 sal_uInt16 nEnd = 0;
522 if ( bSelect )
523 nEnd = EE_INDEX_MAX;
524
525 sal_uLong nChildCount = 0;
526 if ( bWithChilds )
527 nChildCount = pOwner->pParaList->GetChildCount( pParagraph );
528
529 ESelection aSel( nPara, 0, nPara+nChildCount, nEnd );
530 pEditView->SetSelection( aSel );
531 return nChildCount+1;
532 }
533
534
SetAttribs(const SfxItemSet & rAttrs)535 void OutlinerView::SetAttribs( const SfxItemSet& rAttrs )
536 {
537 DBG_CHKTHIS(OutlinerView,0);
538
539 sal_Bool bUpdate = pOwner->pEditEngine->GetUpdateMode();
540 pOwner->pEditEngine->SetUpdateMode( sal_False );
541
542 if( !pOwner->IsInUndo() && pOwner->IsUndoEnabled() )
543 pOwner->UndoActionStart( OLUNDO_ATTR );
544
545 ParaRange aSel = ImpGetSelectedParagraphs( sal_False );
546
547 pEditView->SetAttribs( rAttrs );
548
549 // Bullet-Texte aktualisieren
550 for( sal_uInt32 nPara = aSel.nStartPara; nPara <= aSel.nEndPara; nPara++ )
551 {
552 pOwner->ImplCheckNumBulletItem( nPara );
553 pOwner->ImplCalcBulletText( nPara, sal_False, sal_False );
554
555 if( !pOwner->IsInUndo() && pOwner->IsUndoEnabled() )
556 pOwner->InsertUndo( new OutlinerUndoCheckPara( pOwner, nPara ) );
557 }
558
559 if( !pOwner->IsInUndo() && pOwner->IsUndoEnabled() )
560 pOwner->UndoActionEnd( OLUNDO_ATTR );
561
562 pEditView->SetEditEngineUpdateMode( bUpdate );
563 }
564
ImpGetSelectedParagraphs(sal_Bool bIncludeHiddenChilds)565 ParaRange OutlinerView::ImpGetSelectedParagraphs( sal_Bool bIncludeHiddenChilds )
566 {
567 DBG_CHKTHIS( OutlinerView, 0 );
568
569 ESelection aSel = pEditView->GetSelection();
570 ParaRange aParas( aSel.nStartPara, aSel.nEndPara );
571 aParas.Adjust();
572
573 // unsichtbare Childs des letzten Parents in Selektion mit aufnehmen
574 if ( bIncludeHiddenChilds )
575 {
576 Paragraph* pLast = pOwner->pParaList->GetParagraph( aParas.nEndPara );
577 if ( pOwner->pParaList->HasHiddenChilds( pLast ) )
578 aParas.nEndPara =
579 sal::static_int_cast< sal_uInt32 >(
580 aParas.nEndPara +
581 pOwner->pParaList->GetChildCount( pLast ) );
582 }
583 return aParas;
584 }
585
586 // MT: Name sollte mal geaendert werden!
AdjustDepth(short nDX)587 void OutlinerView::AdjustDepth( short nDX )
588 {
589 Indent( nDX );
590 }
591
Indent(short nDiff)592 void OutlinerView::Indent( short nDiff )
593 {
594 DBG_CHKTHIS( OutlinerView, 0 );
595
596 if( !nDiff || ( ( nDiff > 0 ) && ImpCalcSelectedPages( sal_True ) && !pOwner->ImpCanIndentSelectedPages( this ) ) )
597 return;
598
599 const bool bOutlinerView = pOwner->pEditEngine->GetControlWord() & EE_CNTRL_OUTLINER;
600 sal_Bool bUpdate = pOwner->pEditEngine->GetUpdateMode();
601 pOwner->pEditEngine->SetUpdateMode( sal_False );
602
603 sal_Bool bUndo = !pOwner->IsInUndo() && pOwner->IsUndoEnabled();
604
605 if( bUndo )
606 pOwner->UndoActionStart( OLUNDO_DEPTH );
607
608 sal_Int16 nMinDepth = -1; // Optimierung: Nicht unnoetig viele Absatze neu berechnen
609
610 ParaRange aSel = ImpGetSelectedParagraphs( sal_True );
611 for ( sal_uInt32 nPara = aSel.nStartPara; nPara <= aSel.nEndPara; nPara++ )
612 {
613 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara );
614
615 sal_Int16 nOldDepth = pPara->GetDepth();
616 sal_Int16 nNewDepth = nOldDepth + nDiff;
617
618 if( bOutlinerView && nPara )
619 {
620 const bool bPage = pPara->HasFlag(PARAFLAG_ISPAGE);
621 if( (bPage && (nDiff == +1)) || (!bPage && (nDiff == -1) && (nOldDepth <= 0)) )
622 {
623 // App benachrichtigen
624 pOwner->nDepthChangedHdlPrevDepth = (sal_Int16)nOldDepth;
625 pOwner->mnDepthChangeHdlPrevFlags = pPara->nFlags;
626 pOwner->pHdlParagraph = pPara;
627
628 if( bPage )
629 pPara->RemoveFlag( PARAFLAG_ISPAGE );
630 else
631 pPara->SetFlag( PARAFLAG_ISPAGE );
632
633 pOwner->DepthChangedHdl();
634 pOwner->pEditEngine->QuickMarkInvalid( ESelection( nPara, 0, nPara, 0 ) );
635
636 if( bUndo )
637 pOwner->InsertUndo( new OutlinerUndoChangeParaFlags( pOwner, nPara, pOwner->mnDepthChangeHdlPrevFlags, pPara->nFlags ) );
638
639 continue;
640 }
641 }
642
643 // do not switch off numeration with tab
644 if( (nOldDepth == 0) && (nNewDepth == -1) )
645 continue;
646
647 // do not indent if there is no numeration enabled
648 if( nOldDepth == -1 )
649 continue;
650
651 if ( nNewDepth < pOwner->nMinDepth )
652 nNewDepth = pOwner->nMinDepth;
653 if ( nNewDepth > pOwner->nMaxDepth )
654 nNewDepth = pOwner->nMaxDepth;
655
656 if( nOldDepth < nMinDepth )
657 nMinDepth = nOldDepth;
658 if( nNewDepth < nMinDepth )
659 nMinDepth = nNewDepth;
660
661 if( nOldDepth != nNewDepth )
662 {
663 if ( ( nPara == aSel.nStartPara ) && aSel.nStartPara && ( pOwner->ImplGetOutlinerMode() != OUTLINERMODE_TEXTOBJECT ))
664 {
665 // Sonderfall: Der Vorgaenger eines eingerueckten Absatzes ist
666 // unsichtbar und steht jetzt auf der gleichen Ebene wie der
667 // sichtbare Absatz. In diesem Fall wird der naechste sichtbare
668 // Absatz gesucht und aufgeplustert.
669 #ifdef DBG_UTIL
670 Paragraph* _pPara = pOwner->pParaList->GetParagraph( aSel.nStartPara );
671 DBG_ASSERT(_pPara->IsVisible(),"Selected Paragraph invisible ?!");
672 #endif
673 Paragraph* pPrev= pOwner->pParaList->GetParagraph( aSel.nStartPara-1 );
674
675 if( !pPrev->IsVisible() && ( pPrev->GetDepth() == nNewDepth ) )
676 {
677 // Vorgaenger ist eingeklappt und steht auf gleicher Ebene
678 // => naechsten sichtbaren Absatz suchen und expandieren
679 pPrev = pOwner->pParaList->GetParent( pPrev );
680 while( !pPrev->IsVisible() )
681 pPrev = pOwner->pParaList->GetParent( pPrev );
682
683 pOwner->Expand( pPrev );
684 pOwner->InvalidateBullet( pPrev, pOwner->pParaList->GetAbsPos( pPrev ) );
685 }
686 }
687
688 pOwner->nDepthChangedHdlPrevDepth = (sal_Int16)nOldDepth;
689 pOwner->mnDepthChangeHdlPrevFlags = pPara->nFlags;
690 pOwner->pHdlParagraph = pPara;
691
692 pOwner->ImplInitDepth( nPara, nNewDepth, sal_True, sal_False );
693 pOwner->ImplCalcBulletText( nPara, sal_False, sal_False );
694
695 if ( pOwner->ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEOBJECT )
696 pOwner->ImplSetLevelDependendStyleSheet( nPara );
697
698 // App benachrichtigen
699 pOwner->DepthChangedHdl();
700 }
701 else
702 {
703 // Needs at least a repaint...
704 pOwner->pEditEngine->QuickMarkInvalid( ESelection( nPara, 0, nPara, 0 ) );
705 }
706 }
707
708 // MT 19.08.99: War mal fuer Optimierung (outliner.cxx#1.193),
709 // hat aber zu zuviel Wartungsaufwand / doppelten Funktionen gefuehrt
710 // und zu wenig gebracht:
711 // pOwner->ImpSetBulletTextsFrom( aSel.nStartPara+1, nMinDepth );
712 // Wird jetzt direkt in Schleife mit ImplCalcBulletText() erledigt.
713 // Jetzt fehlen nur noch die folgenden Ansaetze, die davon betroffen sind.
714 sal_uInt32 nParas = pOwner->pParaList->GetParagraphCount();
715 for ( sal_uInt32 n = aSel.nEndPara+1; n < nParas; n++ )
716 {
717 Paragraph* pPara = pOwner->pParaList->GetParagraph( n );
718 if ( pPara->GetDepth() < nMinDepth )
719 break;
720 pOwner->ImplCalcBulletText( n, sal_False, sal_False );
721 }
722
723 if ( bUpdate )
724 {
725 pEditView->SetEditEngineUpdateMode( sal_True );
726 pEditView->ShowCursor();
727 }
728
729 if( bUndo )
730 pOwner->UndoActionEnd( OLUNDO_DEPTH );
731 }
732
AdjustHeight(long nDY)733 sal_Bool OutlinerView::AdjustHeight( long nDY )
734 {
735 DBG_CHKTHIS(OutlinerView,0);
736 pEditView->MoveParagraphs( nDY );
737 return sal_True; // remove return value...
738 }
739
AdjustDepth(Paragraph * pPara,short nDX,sal_Bool bWithChilds)740 void OutlinerView::AdjustDepth( Paragraph* pPara, short nDX, sal_Bool bWithChilds)
741 {
742 DBG_CHKTHIS(OutlinerView,0);
743 sal_uInt32 nStartPara = pOwner->pParaList->GetAbsPos( pPara );
744 sal_uInt32 nEndPara = nStartPara;
745 if ( bWithChilds )
746 nEndPara += pOwner->pParaList->GetChildCount( pPara );
747 ESelection aSel(nStartPara, 0, nEndPara, EE_INDEX_MAX );
748 pEditView->SetSelection( aSel );
749 AdjustDepth( nDX );
750 }
751
AdjustHeight(Paragraph * pPara,long nDY,sal_Bool bWithChilds)752 void OutlinerView::AdjustHeight( Paragraph* pPara, long nDY, sal_Bool bWithChilds )
753 {
754 DBG_CHKTHIS(OutlinerView,0);
755 sal_uInt32 nStartPara = pOwner->pParaList->GetAbsPos( pPara );
756 sal_uInt32 nEndPara = nStartPara;
757 if ( bWithChilds )
758 nEndPara += pOwner->pParaList->GetChildCount( pPara );
759 ESelection aSel( nStartPara, 0, nEndPara, EE_INDEX_MAX );
760 pEditView->SetSelection( aSel );
761 AdjustHeight( nDY );
762 }
763
764
GetVisArea() const765 Rectangle OutlinerView::GetVisArea() const
766 {
767 DBG_CHKTHIS(OutlinerView,0);
768 return pEditView->GetVisArea();
769 }
770
771
ImpGetDocPos(const Point & rPosPixel)772 Point OutlinerView::ImpGetDocPos( const Point& rPosPixel )
773 {
774 DBG_CHKTHIS(OutlinerView,0);
775 Rectangle aOutArWin = GetOutputArea();
776 // Position in der OutputArea berechnen
777 Point aCurPosDoc( rPosPixel );
778 aCurPosDoc = pEditView->GetWindow()->PixelToLogic( aCurPosDoc );
779 aCurPosDoc -= aOutArWin.TopLeft();
780 aCurPosDoc += pEditView->GetVisArea().TopLeft();
781 return aCurPosDoc;
782 }
783
784 // MT 05/00: Wofuer dies ImpXXXScroll, sollte das nicht die EditEngine machen???
785
ImpDragScroll(const Point & rPosPix)786 void OutlinerView::ImpDragScroll( const Point& rPosPix )
787 {
788 DBG_CHKTHIS(OutlinerView,0);
789 Point aPosWin = pEditView->GetWindow()->PixelToLogic( rPosPix );
790 Rectangle aOutputArWin = pEditView->GetOutputArea();
791 if ( aPosWin.X() <= aOutputArWin.Left() + nDDScrollLRBorderWidthWin)
792 ImpScrollLeft();
793 else if( aPosWin.X() >= aOutputArWin.Right()- nDDScrollLRBorderWidthWin)
794 ImpScrollRight();
795 else if( aPosWin.Y() <= aOutputArWin.Top() + nDDScrollTBBorderWidthWin)
796 ImpScrollUp();
797 else if(aPosWin.Y() >= aOutputArWin.Bottom() - nDDScrollTBBorderWidthWin)
798 ImpScrollDown();
799 }
800
801
ImpScrollLeft()802 void OutlinerView::ImpScrollLeft()
803 {
804 DBG_CHKTHIS(OutlinerView,0);
805 Rectangle aVisArea( pEditView->GetVisArea() );
806 long nMaxScrollOffs = aVisArea.Left();
807 if ( !nMaxScrollOffs )
808 return;
809 long nScrollOffsRef = (aVisArea.GetWidth() * OL_SCROLL_HOROFFSET) / 100;
810 if ( !nScrollOffsRef )
811 nScrollOffsRef = 1;
812 if ( nScrollOffsRef > nMaxScrollOffs )
813 nScrollOffsRef = nMaxScrollOffs;
814
815 ImpHideDDCursor();
816 Scroll( -nScrollOffsRef, 0 );
817
818 EditStatus aScrollStat;
819 aScrollStat.GetStatusWord() = EE_STAT_HSCROLL;
820 pOwner->pEditEngine->GetStatusEventHdl().Call( &aScrollStat );
821 }
822
823
ImpScrollRight()824 void OutlinerView::ImpScrollRight()
825 {
826 DBG_CHKTHIS(OutlinerView,0);
827 Rectangle aVisArea( pEditView->GetVisArea() );
828 long nMaxScrollOffs = pOwner->pEditEngine->GetPaperSize().Width() -
829 aVisArea.Right();
830 if ( !nMaxScrollOffs )
831 return;
832 long nScrollOffsRef = (aVisArea.GetWidth() * OL_SCROLL_HOROFFSET) / 100;
833 if ( !nScrollOffsRef )
834 nScrollOffsRef = 1;
835 if ( nScrollOffsRef > nMaxScrollOffs )
836 nScrollOffsRef = nMaxScrollOffs;
837
838 ImpHideDDCursor();
839 Scroll( nScrollOffsRef, 0 );
840
841 EditStatus aScrollStat;
842 aScrollStat.GetStatusWord() = EE_STAT_HSCROLL;
843 pOwner->pEditEngine->GetStatusEventHdl().Call( &aScrollStat );
844 }
845
846
ImpScrollDown()847 void OutlinerView::ImpScrollDown()
848 {
849 DBG_CHKTHIS(OutlinerView,0);
850 Rectangle aVisArea( pEditView->GetVisArea() );
851 Size aDocSize( 0, (long)pOwner->pEditEngine->GetTextHeight() );
852
853 long nMaxScrollOffs = aDocSize.Height();
854 nMaxScrollOffs -= aVisArea.Top();
855 nMaxScrollOffs -= aVisArea.GetHeight();
856 if ( !nMaxScrollOffs )
857 return;
858
859 long nScrollOffsRef = (aVisArea.GetHeight() * OL_SCROLL_VEROFFSET) / 100;
860
861 if ( nScrollOffsRef > nMaxScrollOffs )
862 nScrollOffsRef = nMaxScrollOffs;
863 if ( !nScrollOffsRef )
864 nScrollOffsRef = 1;
865
866 ImpHideDDCursor();
867 Scroll( 0, -nScrollOffsRef );
868
869 EditStatus aScrollStat;
870 aScrollStat.GetStatusWord() = EE_STAT_VSCROLL;
871 pOwner->pEditEngine->GetStatusEventHdl().Call( &aScrollStat );
872 }
873
874
ImpScrollUp()875 void OutlinerView::ImpScrollUp()
876 {
877 DBG_CHKTHIS(OutlinerView,0);
878 Rectangle aVisArea( pEditView->GetVisArea() );
879 long nMaxScrollOffs = aVisArea.Top();
880 if ( !nMaxScrollOffs )
881 return;
882 long nScrollOffsRef = (aVisArea.GetHeight() * OL_SCROLL_VEROFFSET) / 100;
883
884
885 if ( nScrollOffsRef > nMaxScrollOffs )
886 nScrollOffsRef = nMaxScrollOffs;
887 if ( !nScrollOffsRef )
888 nScrollOffsRef = 1;
889
890 ImpHideDDCursor();
891 Scroll( 0, nScrollOffsRef );
892
893 EditStatus aScrollStat;
894 aScrollStat.GetStatusWord() = EE_STAT_VSCROLL;
895 pOwner->pEditEngine->GetStatusEventHdl().Call( &aScrollStat );
896 }
897
898
Expand()899 void OutlinerView::Expand()
900 {
901 DBG_CHKTHIS( OutlinerView, 0 );
902 ParaRange aParas = ImpGetSelectedParagraphs( sal_False );
903 ImplExpandOrCollaps( aParas.nStartPara, aParas.nEndPara, sal_True );
904 }
905
906
Collapse()907 void OutlinerView::Collapse()
908 {
909 DBG_CHKTHIS( OutlinerView, 0 );
910 ParaRange aParas = ImpGetSelectedParagraphs( sal_False );
911 ImplExpandOrCollaps( aParas.nStartPara, aParas.nEndPara, sal_False );
912 }
913
914
ExpandAll()915 void OutlinerView::ExpandAll()
916 {
917 DBG_CHKTHIS( OutlinerView, 0 );
918 ImplExpandOrCollaps( 0, pOwner->pParaList->GetParagraphCount()-1, sal_True );
919 }
920
921
CollapseAll()922 void OutlinerView::CollapseAll()
923 {
924 DBG_CHKTHIS(OutlinerView,0);
925 ImplExpandOrCollaps( 0, pOwner->pParaList->GetParagraphCount()-1, sal_False );
926 }
927
ImplExpandOrCollaps(sal_uInt32 nStartPara,sal_uInt32 nEndPara,sal_Bool bExpand)928 void OutlinerView::ImplExpandOrCollaps( sal_uInt32 nStartPara, sal_uInt32 nEndPara, sal_Bool bExpand )
929 {
930 DBG_CHKTHIS( OutlinerView, 0 );
931
932 sal_Bool bUpdate = pOwner->GetUpdateMode();
933 pOwner->SetUpdateMode( sal_False );
934
935 sal_Bool bUndo = !pOwner->IsInUndo() && pOwner->IsUndoEnabled();
936 if( bUndo )
937 pOwner->UndoActionStart( bExpand ? OLUNDO_EXPAND : OLUNDO_COLLAPSE );
938
939 for ( sal_uInt32 nPara = nStartPara; nPara <= nEndPara; nPara++ )
940 {
941 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara );
942 sal_Bool bDone = bExpand ? pOwner->Expand( pPara ) : pOwner->Collapse( pPara );
943 if( bDone )
944 {
945 // Der Strich unter dem Absatz muss verschwinden...
946 pOwner->pEditEngine->QuickMarkToBeRepainted( nPara );
947 }
948 }
949
950 if( bUndo )
951 pOwner->UndoActionEnd( bExpand ? OLUNDO_EXPAND : OLUNDO_COLLAPSE );
952
953 if ( bUpdate )
954 {
955 pOwner->SetUpdateMode( sal_True );
956 pEditView->ShowCursor();
957 }
958 }
959
960
Expand(Paragraph * pPara)961 void OutlinerView::Expand( Paragraph* pPara)
962 {
963 DBG_CHKTHIS(OutlinerView,0);
964 pOwner->Expand( pPara );
965 }
966
967
Collapse(Paragraph * pPara)968 void OutlinerView::Collapse( Paragraph* pPara)
969 {
970 DBG_CHKTHIS(OutlinerView,0);
971 pOwner->Collapse( pPara );
972 }
973
InsertText(const OutlinerParaObject & rParaObj)974 void OutlinerView::InsertText( const OutlinerParaObject& rParaObj )
975 {
976 // MT: Wie Paste, nur EditView::Insert, statt EditView::Paste.
977 // Eigentlich nicht ganz richtig, das evtl. Einrueckungen
978 // korrigiert werden muessen, aber das kommt spaeter durch ein
979 // allgemeingueltiges Import.
980 // Dann wird im Inserted gleich ermittelt, was f�r eine Einrueckebene
981 // Moegliche Struktur:
982 // pImportInfo mit DestPara, DestPos, nFormat, pParaObj...
983 // Evtl. Problematisch:
984 // EditEngine, RTF => Absplittung des Bereichs, spaeter
985 // zusammenfuehrung
986
987 DBG_CHKTHIS(OutlinerView,0);
988
989 if ( ImpCalcSelectedPages( sal_False ) && !pOwner->ImpCanDeleteSelectedPages( this ) )
990 return;
991
992 pOwner->UndoActionStart( OLUNDO_INSERT );
993
994 pOwner->pEditEngine->SetUpdateMode( sal_False );
995 sal_uInt32 nStart, nParaCount;
996 nParaCount = pOwner->pEditEngine->GetParagraphCount();
997 sal_uInt32 nSize = ImpInitPaste( nStart );
998 pEditView->InsertText( rParaObj.GetTextObject() );
999 ImpPasted( nStart, nParaCount, nSize);
1000 pEditView->SetEditEngineUpdateMode( sal_True );
1001
1002 pOwner->UndoActionEnd( OLUNDO_INSERT );
1003
1004 pEditView->ShowCursor( sal_True, sal_True );
1005 }
1006
1007
1008
Cut()1009 void OutlinerView::Cut()
1010 {
1011 DBG_CHKTHIS(OutlinerView,0);
1012 if ( !ImpCalcSelectedPages( sal_False ) || pOwner->ImpCanDeleteSelectedPages( this ) )
1013 pEditView->Cut();
1014 }
1015
Paste()1016 void OutlinerView::Paste()
1017 {
1018 DBG_CHKTHIS(OutlinerView,0);
1019 PasteSpecial(); // HACK(SD ruft nicht PasteSpecial auf)
1020 }
1021
PasteSpecial()1022 void OutlinerView::PasteSpecial()
1023 {
1024 DBG_CHKTHIS(OutlinerView,0);
1025 if ( !ImpCalcSelectedPages( sal_False ) || pOwner->ImpCanDeleteSelectedPages( this ) )
1026 {
1027 pOwner->UndoActionStart( OLUNDO_INSERT );
1028
1029 pOwner->pEditEngine->SetUpdateMode( sal_False );
1030 pOwner->bPasting = sal_True;
1031 pEditView->PasteSpecial();
1032
1033 if ( pOwner->ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEOBJECT )
1034 {
1035 const sal_uInt32 nParaCount = pOwner->pEditEngine->GetParagraphCount();
1036
1037 for( sal_uInt32 nPara = 0; nPara < nParaCount; nPara++ )
1038 pOwner->ImplSetLevelDependendStyleSheet( nPara );
1039 }
1040
1041 pEditView->SetEditEngineUpdateMode( sal_True );
1042 pOwner->UndoActionEnd( OLUNDO_INSERT );
1043 pEditView->ShowCursor( sal_True, sal_True );
1044 }
1045 }
1046
CreateSelectionList()1047 List* OutlinerView::CreateSelectionList()
1048 {
1049 DBG_CHKTHIS( OutlinerView, 0 );
1050
1051 ParaRange aParas = ImpGetSelectedParagraphs( sal_True );
1052 List* pSelList = new List;
1053 for ( sal_uInt32 nPara = aParas.nStartPara; nPara <= aParas.nEndPara; nPara++ )
1054 {
1055 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara );
1056 pSelList->Insert( pPara, LIST_APPEND );
1057 }
1058 return pSelList;
1059 }
1060
GetStyleSheet() const1061 SfxStyleSheet* OutlinerView::GetStyleSheet() const
1062 {
1063 DBG_CHKTHIS(OutlinerView,0);
1064 return pEditView->GetStyleSheet();
1065 }
1066
SetStyleSheet(SfxStyleSheet * pStyle)1067 void OutlinerView::SetStyleSheet( SfxStyleSheet* pStyle )
1068 {
1069 DBG_CHKTHIS(OutlinerView,0);
1070 pEditView->SetStyleSheet( pStyle );
1071
1072 ParaRange aSel = ImpGetSelectedParagraphs( sal_True );
1073 for( sal_uInt32 nPara = aSel.nStartPara; nPara <= aSel.nEndPara; nPara++ )
1074 {
1075 pOwner->ImplCheckNumBulletItem( nPara );
1076 pOwner->ImplCalcBulletText( nPara, sal_False, sal_False );
1077 }
1078 }
1079
GetPointer(const Point & rPosPixel)1080 Pointer OutlinerView::GetPointer( const Point& rPosPixel )
1081 {
1082 DBG_CHKTHIS(OutlinerView,0);
1083
1084 MouseTarget eTarget;
1085 ImpCheckMousePos( rPosPixel, eTarget );
1086
1087 PointerStyle ePointerStyle = POINTER_ARROW;
1088 if ( eTarget == MouseText )
1089 {
1090 ePointerStyle = GetOutliner()->IsVertical() ? POINTER_TEXT_VERTICAL : POINTER_TEXT;
1091 }
1092 else if ( eTarget == MouseHypertext )
1093 {
1094 ePointerStyle = POINTER_REFHAND;
1095 }
1096 else if ( eTarget == MouseBullet )
1097 {
1098 ePointerStyle = POINTER_MOVE;
1099 }
1100
1101 return Pointer( ePointerStyle );
1102 }
1103
1104
ImpInitPaste(sal_uInt32 & rStart)1105 sal_uInt32 OutlinerView::ImpInitPaste( sal_uInt32& rStart )
1106 {
1107 DBG_CHKTHIS(OutlinerView,0);
1108 pOwner->bPasting = sal_True;
1109 ESelection aSelection( pEditView->GetSelection() );
1110 aSelection.Adjust();
1111 rStart = aSelection.nStartPara;
1112 sal_uInt32 nSize = aSelection.nEndPara - aSelection.nStartPara + 1;
1113 return nSize;
1114 }
1115
1116
ImpPasted(sal_uInt32 nStart,sal_uInt32 nPrevParaCount,sal_uInt32 nSize)1117 void OutlinerView::ImpPasted( sal_uInt32 nStart, sal_uInt32 nPrevParaCount, sal_uInt32 nSize)
1118 {
1119 DBG_CHKTHIS(OutlinerView,0);
1120 pOwner->bPasting = sal_False;
1121 sal_uInt32 nCurParaCount = pOwner->pEditEngine->GetParagraphCount();
1122 if( nCurParaCount < nPrevParaCount )
1123 nSize = nSize - ( nPrevParaCount - nCurParaCount );
1124 else
1125 nSize = nSize + ( nCurParaCount - nPrevParaCount );
1126 pOwner->ImpTextPasted( nStart, nSize );
1127 }
1128
1129
Command(const CommandEvent & rCEvt)1130 void OutlinerView::Command( const CommandEvent& rCEvt )
1131 {
1132 DBG_CHKTHIS(OutlinerView,0);
1133 pEditView->Command( rCEvt );
1134 }
1135
1136
SelectRange(sal_uInt32 nFirst,sal_uInt32 nCount)1137 void OutlinerView::SelectRange( sal_uInt32 nFirst, sal_uInt32 nCount )
1138 {
1139 DBG_CHKTHIS(OutlinerView,0);
1140 sal_uInt32 nLast = nFirst+nCount;
1141 nCount = pOwner->pParaList->GetParagraphCount();
1142 if( nLast <= nCount )
1143 nLast = nCount - 1;
1144 ESelection aSel( nFirst, 0, nLast, EE_INDEX_MAX );
1145 pEditView->SetSelection( aSel );
1146 }
1147
1148
ImpCalcSelectedPages(sal_Bool bIncludeFirstSelected)1149 sal_uInt16 OutlinerView::ImpCalcSelectedPages( sal_Bool bIncludeFirstSelected )
1150 {
1151 DBG_CHKTHIS(OutlinerView,0);
1152
1153 ESelection aSel( pEditView->GetSelection() );
1154 aSel.Adjust();
1155
1156 sal_uInt16 nPages = 0;
1157 sal_uInt16 nFirstPage = 0xFFFF;
1158 sal_uInt16 nStartPara = aSel.nStartPara;
1159 if ( !bIncludeFirstSelected )
1160 nStartPara++; // alle nach StartPara kommenden Absaetze werden geloescht
1161 for ( sal_uInt32 nPara = nStartPara; nPara <= aSel.nEndPara; nPara++ )
1162 {
1163 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara );
1164 DBG_ASSERT(pPara, "ImpCalcSelectedPages: ungueltige Selection? ");
1165 if( pPara->HasFlag(PARAFLAG_ISPAGE) )
1166 {
1167 nPages++;
1168 if( nFirstPage == 0xFFFF )
1169 nFirstPage = nPara;
1170 }
1171 }
1172
1173 if( nPages )
1174 {
1175 pOwner->nDepthChangedHdlPrevDepth = nPages;
1176 pOwner->pHdlParagraph = 0;
1177 pOwner->mnFirstSelPage = nFirstPage;
1178 }
1179
1180 return nPages;
1181 }
1182
1183
ToggleBullets()1184 void OutlinerView::ToggleBullets()
1185 {
1186 pOwner->UndoActionStart( OLUNDO_DEPTH );
1187
1188 ESelection aSel( pEditView->GetSelection() );
1189 aSel.Adjust();
1190
1191 const bool bUpdate = pOwner->pEditEngine->GetUpdateMode();
1192 pOwner->pEditEngine->SetUpdateMode( sal_False );
1193
1194 sal_Int16 nNewDepth = -2;
1195 const SvxNumRule* pDefaultBulletNumRule = 0;
1196
1197 for ( sal_uInt32 nPara = aSel.nStartPara; nPara <= aSel.nEndPara; nPara++ )
1198 {
1199 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara );
1200 DBG_ASSERT(pPara, "OutlinerView::ToggleBullets(), illegal selection?");
1201
1202 if( pPara )
1203 {
1204 if( nNewDepth == -2 )
1205 {
1206 nNewDepth = (pOwner->GetDepth(nPara) == -1) ? 0 : -1;
1207 if ( nNewDepth == 0 )
1208 {
1209 // determine default numbering rule for bullets
1210 const ESelection aSelection(nPara, 0);
1211 const SfxItemSet aTmpSet(pOwner->pEditEngine->GetAttribs(aSelection));
1212 const SfxPoolItem& rPoolItem = aTmpSet.GetPool()->GetDefaultItem( EE_PARA_NUMBULLET );
1213 const SvxNumBulletItem* pNumBulletItem = dynamic_cast< const SvxNumBulletItem* >(&rPoolItem);
1214 pDefaultBulletNumRule = pNumBulletItem ? pNumBulletItem->GetNumRule() : 0;
1215 }
1216 }
1217
1218 pOwner->SetDepth( pPara, nNewDepth );
1219
1220 if( nNewDepth == -1 )
1221 {
1222 const SfxItemSet& rAttrs = pOwner->GetParaAttribs( nPara );
1223 if ( rAttrs.GetItemState( EE_PARA_BULLETSTATE ) == SFX_ITEM_SET )
1224 {
1225 SfxItemSet aAttrs(rAttrs);
1226 aAttrs.ClearItem( EE_PARA_BULLETSTATE );
1227 pOwner->SetParaAttribs( nPara, aAttrs );
1228 }
1229 }
1230 else
1231 {
1232 if ( pDefaultBulletNumRule )
1233 {
1234 const SvxNumberFormat* pFmt = pOwner ->GetNumberFormat( nPara );
1235 if ( !pFmt
1236 || ( pFmt->GetNumberingType() != SVX_NUM_BITMAP
1237 && pFmt->GetNumberingType() != SVX_NUM_CHAR_SPECIAL ) )
1238 {
1239 SfxItemSet aAttrs( pOwner->GetParaAttribs( nPara ) );
1240 SvxNumRule aNewNumRule( *pDefaultBulletNumRule );
1241 aAttrs.Put( SvxNumBulletItem( aNewNumRule ), EE_PARA_NUMBULLET );
1242 pOwner->SetParaAttribs( nPara, aAttrs );
1243 }
1244 }
1245 }
1246 }
1247 }
1248
1249 const sal_uInt32 nParaCount = pOwner->pParaList->GetParagraphCount();
1250 pOwner->ImplCheckParagraphs( aSel.nStartPara, nParaCount );
1251 pOwner->pEditEngine->QuickMarkInvalid( ESelection( aSel.nStartPara, 0, nParaCount, 0 ) );
1252
1253 pOwner->pEditEngine->SetUpdateMode( bUpdate );
1254
1255 pOwner->UndoActionEnd( OLUNDO_DEPTH );
1256 }
1257
1258
ToggleBulletsNumbering(const bool bToggle,const bool bHandleBullets,const SvxNumRule * pNumRule)1259 void OutlinerView::ToggleBulletsNumbering(
1260 const bool bToggle,
1261 const bool bHandleBullets,
1262 const SvxNumRule* pNumRule )
1263 {
1264 ESelection aSel( pEditView->GetSelection() );
1265 aSel.Adjust();
1266
1267 bool bToggleOn = true;
1268 if ( bToggle )
1269 {
1270 bToggleOn = false;
1271 const sal_Int16 nBulletNumberingStatus( pOwner->GetBulletsNumberingStatus( aSel.nStartPara, aSel.nEndPara ) );
1272 if ( nBulletNumberingStatus != 0 && bHandleBullets )
1273 {
1274 // not all paragraphs have bullets and method called to toggle bullets --> bullets on
1275 bToggleOn = true;
1276 }
1277 else if ( nBulletNumberingStatus != 1 && !bHandleBullets )
1278 {
1279 // not all paragraphs have numbering and method called to toggle numberings --> numberings on
1280 bToggleOn = true;
1281 }
1282 }
1283 if ( bToggleOn )
1284 {
1285 // apply bullets/numbering for selected paragraphs
1286 ApplyBulletsNumbering( bHandleBullets, pNumRule, bToggle, true );
1287 }
1288 else
1289 {
1290 // switch off bullets/numbering for selected paragraphs
1291 SwitchOffBulletsNumbering( true );
1292 }
1293
1294 return;
1295 }
1296
1297
EnableBullets()1298 void OutlinerView::EnableBullets()
1299 {
1300 pOwner->UndoActionStart( OLUNDO_DEPTH );
1301
1302 ESelection aSel( pEditView->GetSelection() );
1303 aSel.Adjust();
1304
1305 const bool bUpdate = pOwner->pEditEngine->GetUpdateMode();
1306 pOwner->pEditEngine->SetUpdateMode( sal_False );
1307
1308 for ( sal_uInt32 nPara = aSel.nStartPara; nPara <= aSel.nEndPara; nPara++ )
1309 {
1310 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara );
1311 DBG_ASSERT(pPara, "OutlinerView::EnableBullets(), illegal selection?");
1312
1313 if( pPara && (pOwner->GetDepth(nPara) == -1) )
1314 {
1315 pOwner->SetDepth( pPara, 0 );
1316 }
1317 }
1318
1319 sal_uInt32 nParaCount = pOwner->pParaList->GetParagraphCount();
1320 pOwner->ImplCheckParagraphs( aSel.nStartPara, nParaCount );
1321 pOwner->pEditEngine->QuickMarkInvalid( ESelection( aSel.nStartPara, 0, nParaCount, 0 ) );
1322
1323 pOwner->pEditEngine->SetUpdateMode( bUpdate );
1324
1325 pOwner->UndoActionEnd( OLUNDO_DEPTH );
1326 }
1327
1328
ApplyBulletsNumbering(const bool bHandleBullets,const SvxNumRule * pNewNumRule,const bool bCheckCurrentNumRuleBeforeApplyingNewNumRule,const bool bAtSelection)1329 void OutlinerView::ApplyBulletsNumbering(
1330 const bool bHandleBullets,
1331 const SvxNumRule* pNewNumRule,
1332 const bool bCheckCurrentNumRuleBeforeApplyingNewNumRule,
1333 const bool bAtSelection )
1334 {
1335 if (!pOwner || !pOwner->pEditEngine || !pOwner->pParaList)
1336 {
1337 return;
1338 }
1339
1340 pOwner->UndoActionStart(OLUNDO_DEPTH);
1341 const sal_Bool bUpdate = pOwner->pEditEngine->GetUpdateMode();
1342 pOwner->pEditEngine->SetUpdateMode(sal_False);
1343
1344 sal_uInt32 nStartPara = 0;
1345 sal_uInt32 nEndPara = 0;
1346 if ( bAtSelection )
1347 {
1348 ESelection aSel( pEditView->GetSelection() );
1349 aSel.Adjust();
1350 nStartPara = aSel.nStartPara;
1351 nEndPara = aSel.nEndPara;
1352 }
1353 else
1354 {
1355 nStartPara = 0;
1356 nEndPara = pOwner->pParaList->GetParagraphCount() - 1;
1357 }
1358
1359 for (sal_uInt32 nPara = nStartPara; nPara <= nEndPara; nPara++)
1360 {
1361 Paragraph* pPara = pOwner->pParaList->GetParagraph(nPara);
1362 DBG_ASSERT(pPara, "OutlinerView::ApplyBulletsNumbering(..), illegal selection?");
1363
1364 if (pPara)
1365 {
1366 const sal_Int16 nDepth = pOwner->GetDepth(nPara);
1367 if ( nDepth == -1 )
1368 {
1369 pOwner->SetDepth( pPara, 0 );
1370 }
1371
1372 const SfxItemSet& rAttrs = pOwner->GetParaAttribs(nPara);
1373 SfxItemSet aAttrs(rAttrs);
1374 aAttrs.Put(SfxBoolItem(EE_PARA_BULLETSTATE, true));
1375
1376 // apply new numbering rule
1377 if ( pNewNumRule )
1378 {
1379 bool bApplyNumRule = false;
1380 if ( !bCheckCurrentNumRuleBeforeApplyingNewNumRule )
1381 {
1382 bApplyNumRule = true;
1383 }
1384 else
1385 {
1386 const SvxNumberFormat* pFmt = pOwner ->GetNumberFormat(nPara);
1387 if (!pFmt)
1388 {
1389 bApplyNumRule = true;
1390 }
1391 else
1392 {
1393 sal_Int16 nNumType = pFmt->GetNumberingType();
1394 if ( bHandleBullets
1395 && nNumType != SVX_NUM_BITMAP && nNumType != SVX_NUM_CHAR_SPECIAL)
1396 {
1397 // Set to Normal bullet, old bullet type is Numbering bullet.
1398 bApplyNumRule = true;
1399 }
1400 else if ( !bHandleBullets
1401 && (nNumType == SVX_NUM_BITMAP || nNumType == SVX_NUM_CHAR_SPECIAL))
1402 {
1403 // Set to Numbering bullet, old bullet type is Normal bullet.
1404 bApplyNumRule = true;
1405 }
1406 }
1407 }
1408
1409 if ( bApplyNumRule )
1410 {
1411 SvxNumRule aNewRule(*pNewNumRule);
1412
1413 // Get old bullet space.
1414 {
1415 const SfxPoolItem* pPoolItem=NULL;
1416 SfxItemState eState = rAttrs.GetItemState(EE_PARA_NUMBULLET, sal_False, &pPoolItem);
1417 if (eState != SFX_ITEM_SET)
1418 {
1419 // Use default value when has not contain bullet item.
1420 ESelection aSelection(nPara, 0);
1421 SfxItemSet aTmpSet(pOwner->pEditEngine->GetAttribs(aSelection));
1422 pPoolItem = aTmpSet.GetItem(EE_PARA_NUMBULLET);
1423 }
1424
1425 const SvxNumBulletItem* pNumBulletItem = dynamic_cast< const SvxNumBulletItem* >(pPoolItem);
1426 if (pNumBulletItem)
1427 {
1428 const sal_uInt16 nLevelCnt = Min(pNumBulletItem->GetNumRule()->GetLevelCount(), aNewRule.GetLevelCount());
1429 for ( sal_uInt16 nLevel = 0; nLevel < nLevelCnt; ++nLevel )
1430 {
1431 const SvxNumberFormat* pOldFmt = pNumBulletItem->GetNumRule()->Get(nLevel);
1432 const SvxNumberFormat* pNewFmt = aNewRule.Get(nLevel);
1433 if (pOldFmt && pNewFmt && (pOldFmt->GetFirstLineOffset() != pNewFmt->GetFirstLineOffset() || pOldFmt->GetAbsLSpace() != pNewFmt->GetAbsLSpace()))
1434 {
1435 SvxNumberFormat* pNewFmtClone = new SvxNumberFormat(*pNewFmt);
1436 pNewFmtClone->SetFirstLineOffset(pOldFmt->GetFirstLineOffset());
1437 pNewFmtClone->SetAbsLSpace(pOldFmt->GetAbsLSpace());
1438 aNewRule.SetLevel(nLevel, pNewFmtClone);
1439 delete pNewFmtClone;
1440 }
1441 }
1442 }
1443 }
1444
1445 aAttrs.Put(SvxNumBulletItem(aNewRule), EE_PARA_NUMBULLET);
1446 }
1447 }
1448 pOwner->SetParaAttribs(nPara, aAttrs);
1449 }
1450 }
1451
1452 const sal_uInt32 nParaCount = pOwner->pParaList->GetParagraphCount();
1453 pOwner->ImplCheckParagraphs( nStartPara, nParaCount );
1454 pOwner->pEditEngine->QuickMarkInvalid( ESelection( nStartPara, 0, nParaCount, 0 ) );
1455
1456 pOwner->pEditEngine->SetUpdateMode( bUpdate );
1457
1458 pOwner->UndoActionEnd( OLUNDO_DEPTH );
1459
1460 return;
1461 }
1462
1463
SwitchOffBulletsNumbering(const bool bAtSelection)1464 void OutlinerView::SwitchOffBulletsNumbering(
1465 const bool bAtSelection )
1466 {
1467 sal_uInt32 nStartPara = 0;
1468 sal_uInt32 nEndPara = 0;
1469 if ( bAtSelection )
1470 {
1471 ESelection aSel( pEditView->GetSelection() );
1472 aSel.Adjust();
1473 nStartPara = aSel.nStartPara;
1474 nEndPara = aSel.nEndPara;
1475 }
1476 else
1477 {
1478 nStartPara = 0;
1479 nEndPara = pOwner->pParaList->GetParagraphCount() - 1;
1480 }
1481
1482 pOwner->UndoActionStart( OLUNDO_DEPTH );
1483 const bool bUpdate = pOwner->pEditEngine->GetUpdateMode();
1484 pOwner->pEditEngine->SetUpdateMode( sal_False );
1485
1486 for ( sal_uInt32 nPara = nStartPara; nPara <= nEndPara; ++nPara )
1487 {
1488 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara );
1489 DBG_ASSERT(pPara, "OutlinerView::SwitchOffBulletsNumbering(...), illegal paragraph index?");
1490
1491 if( pPara )
1492 {
1493 pOwner->SetDepth( pPara, -1 );
1494
1495 const SfxItemSet& rAttrs = pOwner->GetParaAttribs( nPara );
1496 if (rAttrs.GetItemState( EE_PARA_BULLETSTATE ) == SFX_ITEM_SET)
1497 {
1498 SfxItemSet aAttrs(rAttrs);
1499 aAttrs.ClearItem( EE_PARA_BULLETSTATE );
1500 pOwner->SetParaAttribs( nPara, aAttrs );
1501 }
1502 }
1503 }
1504
1505 const sal_uInt32 nParaCount = pOwner->pParaList->GetParagraphCount();
1506 pOwner->ImplCheckParagraphs( nStartPara, nParaCount );
1507 pOwner->pEditEngine->QuickMarkInvalid( ESelection( nStartPara, 0, nParaCount, 0 ) );
1508
1509 pOwner->pEditEngine->SetUpdateMode( bUpdate );
1510 pOwner->UndoActionEnd( OLUNDO_DEPTH );
1511 }
1512
1513
RemoveAttribsKeepLanguages(sal_Bool bRemoveParaAttribs)1514 void OutlinerView::RemoveAttribsKeepLanguages( sal_Bool bRemoveParaAttribs )
1515 {
1516 RemoveAttribs( bRemoveParaAttribs, 0, sal_True /*keep language attribs*/ );
1517 }
1518
RemoveAttribs(sal_Bool bRemoveParaAttribs,sal_uInt16 nWhich,sal_Bool bKeepLanguages)1519 void OutlinerView::RemoveAttribs( sal_Bool bRemoveParaAttribs, sal_uInt16 nWhich, sal_Bool bKeepLanguages )
1520 {
1521 DBG_CHKTHIS(OutlinerView,0);
1522 sal_Bool bUpdate = pOwner->GetUpdateMode();
1523 pOwner->SetUpdateMode( sal_False );
1524 pOwner->UndoActionStart( OLUNDO_ATTR );
1525 if (bKeepLanguages)
1526 pEditView->RemoveAttribsKeepLanguages( bRemoveParaAttribs );
1527 else
1528 pEditView->RemoveAttribs( bRemoveParaAttribs, nWhich );
1529 if ( bRemoveParaAttribs )
1530 {
1531 // Ueber alle Absaetze, und Einrueckung und Level einstellen
1532 ESelection aSel = pEditView->GetSelection();
1533 aSel.Adjust();
1534 for ( sal_uInt32 nPara = aSel.nStartPara; nPara <= aSel.nEndPara; nPara++ )
1535 {
1536 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara );
1537 pOwner->ImplInitDepth( nPara, pPara->GetDepth(), sal_False, sal_False );
1538 }
1539 }
1540 pOwner->UndoActionEnd( OLUNDO_ATTR );
1541 pOwner->SetUpdateMode( bUpdate );
1542 }
1543
1544
1545
1546 // =====================================================================
1547 // ====================== Einfache Durchreicher =======================
1548 // ======================================================================
1549
1550
InsertText(const XubString & rNew,sal_Bool bSelect)1551 void OutlinerView::InsertText( const XubString& rNew, sal_Bool bSelect )
1552 {
1553 DBG_CHKTHIS(OutlinerView,0);
1554 if( pOwner->bFirstParaIsEmpty )
1555 pOwner->Insert( String() );
1556 pEditView->InsertText( rNew, bSelect );
1557 }
1558
SetVisArea(const Rectangle & rRec)1559 void OutlinerView::SetVisArea( const Rectangle& rRec )
1560 {
1561 DBG_CHKTHIS(OutlinerView,0);
1562 pEditView->SetVisArea( rRec );
1563 }
1564
1565
SetSelection(const ESelection & rSel)1566 void OutlinerView::SetSelection( const ESelection& rSel )
1567 {
1568 DBG_CHKTHIS(OutlinerView,0);
1569 pEditView->SetSelection( rSel );
1570 }
1571
SetReadOnly(sal_Bool bReadOnly)1572 void OutlinerView::SetReadOnly( sal_Bool bReadOnly )
1573 {
1574 DBG_CHKTHIS(OutlinerView,0);
1575 pEditView->SetReadOnly( bReadOnly );
1576 }
1577
IsReadOnly() const1578 sal_Bool OutlinerView::IsReadOnly() const
1579 {
1580 DBG_CHKTHIS(OutlinerView,0);
1581 return pEditView->IsReadOnly();
1582 }
1583
HasSelection() const1584 sal_Bool OutlinerView::HasSelection() const
1585 {
1586 DBG_CHKTHIS(OutlinerView,0);
1587 return pEditView->HasSelection();
1588 }
1589
1590
ShowCursor(sal_Bool bGotoCursor)1591 void OutlinerView::ShowCursor( sal_Bool bGotoCursor )
1592 {
1593 DBG_CHKTHIS(OutlinerView,0);
1594 pEditView->ShowCursor( bGotoCursor );
1595 }
1596
1597
HideCursor()1598 void OutlinerView::HideCursor()
1599 {
1600 DBG_CHKTHIS(OutlinerView,0);
1601 pEditView->HideCursor();
1602 }
1603
1604
SetWindow(Window * pWin)1605 void OutlinerView::SetWindow( Window* pWin )
1606 {
1607 DBG_CHKTHIS(OutlinerView,0);
1608 pEditView->SetWindow( pWin );
1609 }
1610
1611
GetWindow() const1612 Window* OutlinerView::GetWindow() const
1613 {
1614 DBG_CHKTHIS(OutlinerView,0);
1615 return pEditView->GetWindow();
1616 }
1617
1618
SetOutputArea(const Rectangle & rRect)1619 void OutlinerView::SetOutputArea( const Rectangle& rRect )
1620 {
1621 DBG_CHKTHIS(OutlinerView,0);
1622 pEditView->SetOutputArea( rRect );
1623 }
1624
1625
GetOutputArea() const1626 Rectangle OutlinerView::GetOutputArea() const
1627 {
1628 DBG_CHKTHIS(OutlinerView,0);
1629 return pEditView->GetOutputArea();
1630 }
1631
1632
GetSelected() const1633 XubString OutlinerView::GetSelected() const
1634 {
1635 DBG_CHKTHIS(OutlinerView,0);
1636 return pEditView->GetSelected();
1637 }
1638
1639
RemoveCharAttribs(sal_uLong nPara,sal_uInt16 nWhich)1640 void OutlinerView::RemoveCharAttribs( sal_uLong nPara, sal_uInt16 nWhich)
1641 {
1642 DBG_CHKTHIS(OutlinerView,0);
1643 pEditView->RemoveCharAttribs( nPara, nWhich);
1644 }
1645
1646
CompleteAutoCorrect()1647 void OutlinerView::CompleteAutoCorrect()
1648 {
1649 DBG_CHKTHIS(OutlinerView,0);
1650 pEditView->CompleteAutoCorrect();
1651 }
1652
1653
StartSpeller(sal_Bool bMultiDoc)1654 EESpellState OutlinerView::StartSpeller( sal_Bool bMultiDoc )
1655 {
1656 DBG_CHKTHIS(OutlinerView,0);
1657 return pEditView->StartSpeller( bMultiDoc );
1658 }
1659
1660
StartThesaurus()1661 EESpellState OutlinerView::StartThesaurus()
1662 {
1663 DBG_CHKTHIS(OutlinerView,0);
1664 return pEditView->StartThesaurus();
1665 }
1666
1667
StartTextConversion(LanguageType nSrcLang,LanguageType nDestLang,const Font * pDestFont,sal_Int32 nOptions,sal_Bool bIsInteractive,sal_Bool bMultipleDoc)1668 void OutlinerView::StartTextConversion(
1669 LanguageType nSrcLang, LanguageType nDestLang, const Font *pDestFont,
1670 sal_Int32 nOptions, sal_Bool bIsInteractive, sal_Bool bMultipleDoc )
1671 {
1672 DBG_CHKTHIS(OutlinerView,0);
1673 if (
1674 (LANGUAGE_KOREAN == nSrcLang && LANGUAGE_KOREAN == nDestLang) ||
1675 (LANGUAGE_CHINESE_SIMPLIFIED == nSrcLang && LANGUAGE_CHINESE_TRADITIONAL == nDestLang) ||
1676 (LANGUAGE_CHINESE_TRADITIONAL == nSrcLang && LANGUAGE_CHINESE_SIMPLIFIED == nDestLang)
1677 )
1678 {
1679 pEditView->StartTextConversion( nSrcLang, nDestLang, pDestFont, nOptions, bIsInteractive, bMultipleDoc );
1680 }
1681 else
1682 {
1683 DBG_ERROR( "unexpected language" );
1684 }
1685 }
1686
1687
StartSearchAndReplace(const SvxSearchItem & rSearchItem)1688 sal_uInt16 OutlinerView::StartSearchAndReplace( const SvxSearchItem& rSearchItem )
1689 {
1690 DBG_CHKTHIS(OutlinerView,0);
1691 return pEditView->StartSearchAndReplace( rSearchItem );
1692 }
1693
TransliterateText(sal_Int32 nTransliterationMode)1694 void OutlinerView::TransliterateText( sal_Int32 nTransliterationMode )
1695 {
1696 DBG_CHKTHIS(OutlinerView,0);
1697 pEditView->TransliterateText( nTransliterationMode );
1698 }
1699
1700
1701
GetSelection()1702 ESelection OutlinerView::GetSelection()
1703 {
1704 DBG_CHKTHIS(OutlinerView,0);
1705 return pEditView->GetSelection();
1706 }
1707
1708
Scroll(long nHorzScroll,long nVertScroll)1709 void OutlinerView::Scroll( long nHorzScroll, long nVertScroll )
1710 {
1711 DBG_CHKTHIS(OutlinerView,0);
1712 pEditView->Scroll( nHorzScroll, nVertScroll );
1713 }
1714
1715
SetControlWord(sal_uLong nWord)1716 void OutlinerView::SetControlWord( sal_uLong nWord )
1717 {
1718 DBG_CHKTHIS(OutlinerView,0);
1719 pEditView->SetControlWord( nWord );
1720 }
1721
1722
GetControlWord() const1723 sal_uLong OutlinerView::GetControlWord() const
1724 {
1725 DBG_CHKTHIS(OutlinerView,0);
1726 return pEditView->GetControlWord();
1727 }
1728
1729
SetAnchorMode(EVAnchorMode eMode)1730 void OutlinerView::SetAnchorMode( EVAnchorMode eMode )
1731 {
1732 DBG_CHKTHIS(OutlinerView,0);
1733 pEditView->SetAnchorMode( eMode );
1734 }
1735
1736
GetAnchorMode() const1737 EVAnchorMode OutlinerView::GetAnchorMode() const
1738 {
1739 DBG_CHKTHIS(OutlinerView,0);
1740 return pEditView->GetAnchorMode();
1741 }
1742
1743
Undo()1744 void OutlinerView::Undo()
1745 {
1746 DBG_CHKTHIS(OutlinerView,0);
1747 pEditView->Undo();
1748 }
1749
1750
Redo()1751 void OutlinerView::Redo()
1752 {
1753 DBG_CHKTHIS(OutlinerView,0);
1754 pEditView->Redo();
1755 }
1756
1757
EnablePaste(sal_Bool bEnable)1758 void OutlinerView::EnablePaste( sal_Bool bEnable )
1759 {
1760 DBG_CHKTHIS(OutlinerView,0);
1761 pEditView->EnablePaste( bEnable );
1762 }
1763
1764
Copy()1765 void OutlinerView::Copy()
1766 {
1767 DBG_CHKTHIS(OutlinerView,0);
1768 pEditView->Copy();
1769 }
1770
1771
InsertField(const SvxFieldItem & rFld)1772 void OutlinerView::InsertField( const SvxFieldItem& rFld )
1773 {
1774 DBG_CHKTHIS(OutlinerView,0);
1775 pEditView->InsertField( rFld );
1776 }
1777
1778
GetFieldUnderMousePointer() const1779 const SvxFieldItem* OutlinerView::GetFieldUnderMousePointer() const
1780 {
1781 DBG_CHKTHIS(OutlinerView,0);
1782 return pEditView->GetFieldUnderMousePointer();
1783 }
1784
1785
GetFieldUnderMousePointer(sal_uInt32 & nPara,sal_uInt16 & nPos) const1786 const SvxFieldItem* OutlinerView::GetFieldUnderMousePointer( sal_uInt32& nPara, sal_uInt16& nPos ) const
1787 {
1788 DBG_CHKTHIS(OutlinerView,0);
1789 return pEditView->GetFieldUnderMousePointer( nPara, nPos );
1790 }
1791
1792
GetFieldAtSelection() const1793 const SvxFieldItem* OutlinerView::GetFieldAtSelection() const
1794 {
1795 DBG_CHKTHIS(OutlinerView,0);
1796 return pEditView->GetFieldAtSelection();
1797 }
1798
SetInvalidateMore(sal_uInt16 nPixel)1799 void OutlinerView::SetInvalidateMore( sal_uInt16 nPixel )
1800 {
1801 DBG_CHKTHIS(OutlinerView,0);
1802 pEditView->SetInvalidateMore( nPixel );
1803 }
1804
1805
GetInvalidateMore() const1806 sal_uInt16 OutlinerView::GetInvalidateMore() const
1807 {
1808 DBG_CHKTHIS(OutlinerView,0);
1809 return pEditView->GetInvalidateMore();
1810 }
1811
1812
IsCursorAtWrongSpelledWord(sal_Bool bMarkIfWrong)1813 sal_Bool OutlinerView::IsCursorAtWrongSpelledWord( sal_Bool bMarkIfWrong )
1814 {
1815 DBG_CHKTHIS(OutlinerView,0);
1816 return pEditView->IsCursorAtWrongSpelledWord( bMarkIfWrong );
1817 }
1818
1819
IsWrongSpelledWordAtPos(const Point & rPosPixel,sal_Bool bMarkIfWrong)1820 sal_Bool OutlinerView::IsWrongSpelledWordAtPos( const Point& rPosPixel, sal_Bool bMarkIfWrong )
1821 {
1822 DBG_CHKTHIS(OutlinerView,0);
1823 return pEditView->IsWrongSpelledWordAtPos( rPosPixel, bMarkIfWrong );
1824 }
1825
SpellIgnoreWord()1826 void OutlinerView::SpellIgnoreWord()
1827 {
1828 DBG_CHKTHIS(OutlinerView,0);
1829 pEditView->SpellIgnoreWord();
1830 }
1831
1832
ExecuteSpellPopup(const Point & rPosPixel,Link * pStartDlg)1833 void OutlinerView::ExecuteSpellPopup( const Point& rPosPixel, Link* pStartDlg )
1834 {
1835 DBG_CHKTHIS(OutlinerView,0);
1836 pEditView->ExecuteSpellPopup( rPosPixel, pStartDlg );
1837 }
1838
Read(SvStream & rInput,const String & rBaseURL,EETextFormat eFormat,sal_Bool bSelect,SvKeyValueIterator * pHTTPHeaderAttrs)1839 sal_uLong OutlinerView::Read( SvStream& rInput, const String& rBaseURL, EETextFormat eFormat, sal_Bool bSelect, SvKeyValueIterator* pHTTPHeaderAttrs )
1840 {
1841 DBG_CHKTHIS(OutlinerView,0);
1842 sal_uInt32 nOldParaCount = pEditView->GetEditEngine()->GetParagraphCount();
1843 ESelection aOldSel = pEditView->GetSelection();
1844 aOldSel.Adjust();
1845
1846 sal_uLong nRet = pEditView->Read( rInput, rBaseURL, eFormat, bSelect, pHTTPHeaderAttrs );
1847
1848 // MT 08/00: Hier sollte eigentlich das gleiche wie in PasteSpecial passieren!
1849 // Mal anpassen, wenn dieses ImplInitPaste und ImpPasted-Geraffel ueberarbeitet ist.
1850
1851 long nParaDiff = pEditView->GetEditEngine()->GetParagraphCount() - nOldParaCount;
1852 sal_uInt32 nChangesStart = aOldSel.nStartPara;
1853 sal_uInt32 nChangesEnd = nChangesStart + nParaDiff + (aOldSel.nEndPara-aOldSel.nStartPara);
1854
1855 for ( sal_uInt32 n = nChangesStart; n <= nChangesEnd; n++ )
1856 {
1857 if ( eFormat == EE_FORMAT_BIN )
1858 {
1859 sal_uInt16 nDepth = 0;
1860 const SfxItemSet& rAttrs = pOwner->GetParaAttribs( n );
1861 const SfxInt16Item& rLevel = (const SfxInt16Item&) rAttrs.Get( EE_PARA_OUTLLEVEL );
1862 nDepth = rLevel.GetValue();
1863 pOwner->ImplInitDepth( n, nDepth, sal_False );
1864 }
1865
1866 if ( pOwner->ImplGetOutlinerMode() == OUTLINERMODE_OUTLINEOBJECT )
1867 pOwner->ImplSetLevelDependendStyleSheet( n );
1868 }
1869
1870 if ( eFormat != EE_FORMAT_BIN )
1871 {
1872 pOwner->ImpFilterIndents( nChangesStart, nChangesEnd );
1873 }
1874
1875 return nRet;
1876 }
1877
Write(SvStream & rOutput,EETextFormat eFormat)1878 sal_uLong OutlinerView::Write( SvStream& rOutput, EETextFormat eFormat )
1879 {
1880 DBG_CHKTHIS(OutlinerView,0);
1881 return pEditView->Write( rOutput, eFormat );
1882 }
1883
SetBackgroundColor(const Color & rColor)1884 void OutlinerView::SetBackgroundColor( const Color& rColor )
1885 {
1886 DBG_CHKTHIS(OutlinerView,0);
1887 pEditView->SetBackgroundColor( rColor );
1888 }
1889
1890
GetBackgroundColor()1891 Color OutlinerView::GetBackgroundColor()
1892 {
1893 DBG_CHKTHIS(OutlinerView,0);
1894 return pEditView->GetBackgroundColor();
1895 }
1896
GetAttribs()1897 SfxItemSet OutlinerView::GetAttribs()
1898 {
1899 DBG_CHKTHIS(OutlinerView,0);
1900 return pEditView->GetAttribs();
1901 }
1902
GetSelectedScriptType() const1903 sal_uInt16 OutlinerView::GetSelectedScriptType() const
1904 {
1905 DBG_CHKTHIS(OutlinerView,0);
1906 return pEditView->GetSelectedScriptType();
1907 }
1908
GetSurroundingText() const1909 String OutlinerView::GetSurroundingText() const
1910 {
1911 DBG_CHKTHIS(OutlinerView,0);
1912 return pEditView->GetSurroundingText();
1913 }
1914
GetSurroundingTextSelection() const1915 Selection OutlinerView::GetSurroundingTextSelection() const
1916 {
1917 DBG_CHKTHIS(OutlinerView,0);
1918 return pEditView->GetSurroundingTextSelection();
1919 }
1920
1921
1922 // ======================================================================
1923 // ===== some code for thesaurus sub menu within context menu
1924 // ======================================================================
1925
1926 // returns: true if a word for thesaurus look-up was found at the current cursor position.
1927 // The status string will be word + iso language string (e.g. "light#en-US")
GetStatusValueForThesaurusFromContext(String & rStatusVal,LanguageType & rLang,const EditView & rEditView)1928 bool EDITENG_DLLPUBLIC GetStatusValueForThesaurusFromContext(
1929 String &rStatusVal,
1930 LanguageType &rLang,
1931 const EditView &rEditView )
1932 {
1933 // get text and locale for thesaurus look up
1934 String aText;
1935 EditEngine *pEditEngine = rEditView.GetEditEngine();
1936 ESelection aTextSel( rEditView.GetSelection() );
1937 if (!aTextSel.HasRange())
1938 aTextSel = pEditEngine->GetWord( aTextSel, i18n::WordType::DICTIONARY_WORD );
1939 aText = pEditEngine->GetText( aTextSel );
1940 aTextSel.Adjust();
1941 LanguageType nLang = pEditEngine->GetLanguage( aTextSel.nStartPara, aTextSel.nStartPos );
1942 String aLangText( MsLangId::convertLanguageToIsoString( nLang ) );
1943
1944 // set word and locale to look up as status value
1945 String aStatusVal( aText );
1946 aStatusVal.AppendAscii( "#" );
1947 aStatusVal += aLangText;
1948
1949 rStatusVal = aStatusVal;
1950 rLang = nLang;
1951
1952 return aText.Len() > 0;
1953 }
1954
1955
ReplaceTextWithSynonym(EditView & rEditView,const String & rSynonmText)1956 void EDITENG_DLLPUBLIC ReplaceTextWithSynonym( EditView &rEditView, const String &rSynonmText )
1957 {
1958 // get selection to use
1959 ESelection aCurSel( rEditView.GetSelection() );
1960 if (!rEditView.HasSelection())
1961 {
1962 // select the same word that was used in GetStatusValueForThesaurusFromContext by calling GetWord.
1963 // (In the end both functions will call ImpEditEngine::SelectWord)
1964 rEditView.SelectCurrentWord( i18n::WordType::DICTIONARY_WORD );
1965 aCurSel = rEditView.GetSelection();
1966 }
1967
1968 // replace word ...
1969 rEditView.InsertText( rSynonmText );
1970 rEditView.ShowCursor( sal_True, sal_False );
1971 }
1972
1973
1974