xref: /trunk/main/editeng/source/outliner/outleeng.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_editeng.hxx"
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 #define _OUTLINER_CXX
39 #include <editeng/outliner.hxx>
40 #include <outleeng.hxx>
41 #include <paralist.hxx>
42 #include <editeng/editrids.hrc>
43 #include <svl/itemset.hxx>
44 #include <editeng/eeitem.hxx>
45 #include <editeng/editstat.hxx>
46 #include "outlundo.hxx"
47 
48 OutlinerEditEng::OutlinerEditEng( Outliner* pEngOwner, SfxItemPool* pPool )
49  : EditEngine( pPool )
50 {
51     pOwner = pEngOwner;
52 }
53 
54 OutlinerEditEng::~OutlinerEditEng()
55 {
56 }
57 
58 void OutlinerEditEng::PaintingFirstLine( sal_uInt16 nPara, const Point& rStartPos, long nBaseLineY, const Point& rOrigin, short nOrientation, OutputDevice* pOutDev )
59 {
60     if( GetControlWord() && EE_CNTRL_OUTLINER )
61     {
62         PaintFirstLineInfo aInfo( nPara, rStartPos, nBaseLineY, rOrigin, nOrientation, pOutDev );
63         pOwner->maPaintFirstLineHdl.Call( &aInfo );
64     }
65 
66     pOwner->PaintBullet( nPara, rStartPos, rOrigin, nOrientation, pOutDev );
67 }
68 
69 const SvxNumberFormat* OutlinerEditEng::GetNumberFormat( sal_uInt16 nPara ) const
70 {
71     const SvxNumberFormat* pFmt = NULL;
72     if (pOwner)
73         pFmt = pOwner->GetNumberFormat( nPara );
74     return pFmt;
75 }
76 
77 
78 Rectangle OutlinerEditEng::GetBulletArea( sal_uInt16 nPara )
79 {
80     Rectangle aBulletArea = Rectangle( Point(), Point() );
81     if ( nPara < pOwner->pParaList->GetParagraphCount() )
82     {
83         if ( pOwner->ImplHasBullet( nPara ) )
84             aBulletArea = pOwner->ImpCalcBulletArea( nPara, sal_False, sal_False );
85     }
86     return aBulletArea;
87 }
88 
89 void OutlinerEditEng::ParagraphInserted( sal_uInt16 nNewParagraph )
90 {
91     pOwner->ParagraphInserted( nNewParagraph );
92 
93     EditEngine::ParagraphInserted( nNewParagraph );
94 }
95 
96 void OutlinerEditEng::ParagraphDeleted( sal_uInt16 nDeletedParagraph )
97 {
98     pOwner->ParagraphDeleted( nDeletedParagraph );
99 
100     EditEngine::ParagraphDeleted( nDeletedParagraph );
101 }
102 
103 void OutlinerEditEng::ParagraphConnected( sal_uInt16 /*nLeftParagraph*/, sal_uInt16 nRightParagraph )
104 {
105     if( pOwner && pOwner->IsUndoEnabled() && !const_cast<EditEngine&>(pOwner->GetEditEngine()).IsInUndo() )
106     {
107         Paragraph* pPara = pOwner->GetParagraph( nRightParagraph );
108         if( pPara && pOwner->HasParaFlag( pPara, PARAFLAG_ISPAGE ) )
109         {
110             pOwner->InsertUndo( new OutlinerUndoChangeParaFlags( pOwner, nRightParagraph, PARAFLAG_ISPAGE, 0 ) );
111         }
112     }
113 }
114 
115 
116 void OutlinerEditEng::StyleSheetChanged( SfxStyleSheet* pStyle )
117 {
118     pOwner->StyleSheetChanged( pStyle );
119 }
120 
121 void OutlinerEditEng::ParaAttribsChanged( sal_uInt16 nPara )
122 {
123     pOwner->ParaAttribsChanged( nPara );
124 }
125 
126 sal_Bool OutlinerEditEng::SpellNextDocument()
127 {
128     return pOwner->SpellNextDocument();
129 }
130 
131 sal_Bool OutlinerEditEng::ConvertNextDocument()
132 {
133     return pOwner->ConvertNextDocument();
134 }
135 
136 XubString OutlinerEditEng::GetUndoComment( sal_uInt16 nUndoId ) const
137 {
138     switch( nUndoId )
139     {
140         case OLUNDO_DEPTH:
141             return XubString( EditResId( RID_OUTLUNDO_DEPTH ));
142 
143         case OLUNDO_EXPAND:
144             return XubString( EditResId( RID_OUTLUNDO_EXPAND ));
145 
146         case OLUNDO_COLLAPSE:
147             return XubString( EditResId( RID_OUTLUNDO_COLLAPSE ));
148 
149         case OLUNDO_ATTR:
150             return XubString( EditResId( RID_OUTLUNDO_ATTR ));
151 
152         case OLUNDO_INSERT:
153             return XubString( EditResId( RID_OUTLUNDO_INSERT ));
154 
155         default:
156             return EditEngine::GetUndoComment( nUndoId );
157     }
158 }
159 
160 // #101498#
161 void OutlinerEditEng::DrawingText( const Point& rStartPos, const XubString& rText, sal_uInt16 nTextStart, sal_uInt16 nTextLen,
162     const sal_Int32* pDXArray, const SvxFont& rFont, sal_uInt16 nPara, sal_uInt16 nIndex, sal_uInt8 nRightToLeft,
163     const EEngineData::WrongSpellVector* pWrongSpellVector,
164     const SvxFieldData* pFieldData,
165     bool bEndOfLine,
166     bool bEndOfParagraph,
167     bool bEndOfBullet,
168     const ::com::sun::star::lang::Locale* pLocale,
169     const Color& rOverlineColor,
170     const Color& rTextLineColor)
171 {
172     // why do bullet here at all? Just use GetEditEnginePtr()->PaintingFirstLine
173     // inside of ImpEditEngine::Paint which calls pOwner->PaintBullet with the correct
174     // values for hor and ver. No change for not-layouting (painting).
175     // changed, bullet rendering now using PaintBullet via
176 /*  if ( nIndex == 0 )
177     {
178         // Dann das Bullet 'malen', dort wird bStrippingPortions ausgewertet
179         // und Outliner::DrawingText gerufen
180 
181         // DrawingText liefert die BaseLine, DrawBullet braucht Top().
182 
183         if(true)
184         {
185             // ##
186             // another error: This call happens when only stripping, but the position
187             // is already aligned to text output. For bullet rendering, it needs to be reset
188             // to the correct value in x and y. PaintBullet takes care of X-start offset itself
189             const Point aDocPosTopLeft(GetDocPosTopLeft( nPara ));
190             const Point aCorrectedPos(rStartPos.X() - aDocPosTopLeft.X(), aDocPosTopLeft.Y() + GetFirstLineOffset( nPara ));
191             pOwner->PaintBullet( nPara, aCorrectedPos, Point(), 0, GetRefDevice() );
192         }
193         else
194         {
195             Point aCorrectedPos( rStartPos );
196             aCorrectedPos.Y() = GetDocPosTopLeft( nPara ).Y();
197             aCorrectedPos.Y() += GetFirstLineOffset( nPara );
198             pOwner->PaintBullet( nPara, aCorrectedPos, Point(), 0, GetRefDevice() );
199         }
200     } */
201 
202     // #101498#
203     pOwner->DrawingText(rStartPos,rText,nTextStart,nTextLen,pDXArray,rFont,nPara,nIndex,nRightToLeft,
204         pWrongSpellVector, pFieldData, bEndOfLine, bEndOfParagraph, bEndOfBullet, pLocale, rOverlineColor, rTextLineColor);
205 }
206 
207 void OutlinerEditEng::FieldClicked( const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos )
208 {
209     EditEngine::FieldClicked( rField, nPara, nPos );    // Falls URL
210     pOwner->FieldClicked( rField, nPara, nPos );
211 }
212 
213 void OutlinerEditEng::FieldSelected( const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos )
214 {
215     pOwner->FieldSelected( rField, nPara, nPos );
216 }
217 
218 XubString OutlinerEditEng::CalcFieldValue( const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos, Color*& rpTxtColor, Color*& rpFldColor )
219 {
220     return pOwner->CalcFieldValue( rField, nPara, nPos, rpTxtColor, rpFldColor );
221 }
222 
223 void OutlinerEditEng::SetParaAttribs( sal_uInt16 nPara, const SfxItemSet& rSet )
224 {
225     Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara );
226     if( pPara )
227     {
228         if ( !IsInUndo() && IsUndoEnabled() )
229             pOwner->UndoActionStart( OLUNDO_ATTR );
230 
231         EditEngine::SetParaAttribs( (sal_uInt16)nPara, rSet );
232 
233         pOwner->ImplCheckNumBulletItem( (sal_uInt16)nPara );
234         // --> OD 2009-03-10 #i100014#
235         // It is not a good idea to substract 1 from a count and cast the result
236         // to sal_uInt16 without check, if the count is 0.
237         pOwner->ImplCheckParagraphs( (sal_uInt16)nPara, (sal_uInt16) (pOwner->pParaList->GetParagraphCount()) );
238         // <--
239 
240         if ( !IsInUndo() && IsUndoEnabled() )
241             pOwner->UndoActionEnd( OLUNDO_ATTR );
242     }
243 }
244 
245