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 #include "precompiled_editeng.hxx" 26 #include <svl/intitem.hxx> 27 #include <editeng/editeng.hxx> 28 #include <editeng/editview.hxx> 29 #include <editeng/editdata.hxx> 30 #include <editeng/eerdll.hxx> 31 #include <editeng/lrspitem.hxx> 32 #include <editeng/fhgtitem.hxx> 33 34 #define _OUTLINER_CXX 35 #include <editeng/outliner.hxx> 36 #include <outleeng.hxx> 37 #include <paralist.hxx> 38 #include <editeng/editrids.hrc> 39 #include <svl/itemset.hxx> 40 #include <editeng/eeitem.hxx> 41 #include <editeng/editstat.hxx> 42 #include "outlundo.hxx" 43 44 OutlinerEditEng::OutlinerEditEng( Outliner* pEngOwner, SfxItemPool* pPool ) 45 : EditEngine( pPool ) 46 { 47 pOwner = pEngOwner; 48 } 49 50 OutlinerEditEng::~OutlinerEditEng() 51 { 52 } 53 54 void OutlinerEditEng::PaintingFirstLine( sal_uInt16 nPara, const Point& rStartPos, long nBaseLineY, const Point& rOrigin, short nOrientation, OutputDevice* pOutDev ) 55 { 56 if( GetControlWord() & EE_CNTRL_OUTLINER ) 57 { 58 PaintFirstLineInfo aInfo( nPara, rStartPos, nBaseLineY, rOrigin, nOrientation, pOutDev ); 59 pOwner->maPaintFirstLineHdl.Call( &aInfo ); 60 } 61 62 pOwner->PaintBullet( nPara, rStartPos, rOrigin, nOrientation, pOutDev ); 63 } 64 65 const SvxNumberFormat* OutlinerEditEng::GetNumberFormat( sal_uInt16 nPara ) const 66 { 67 const SvxNumberFormat* pFmt = NULL; 68 if (pOwner) 69 pFmt = pOwner->GetNumberFormat( nPara ); 70 return pFmt; 71 } 72 73 74 Rectangle OutlinerEditEng::GetBulletArea( sal_uInt16 nPara ) 75 { 76 Rectangle aBulletArea = Rectangle( Point(), Point() ); 77 if ( nPara < pOwner->pParaList->GetParagraphCount() ) 78 { 79 if ( pOwner->ImplHasNumberFormat( nPara ) ) 80 aBulletArea = pOwner->ImpCalcBulletArea( nPara, sal_False, sal_False ); 81 } 82 return aBulletArea; 83 } 84 85 void OutlinerEditEng::ParagraphInserted( sal_uInt16 nNewParagraph ) 86 { 87 pOwner->ParagraphInserted( nNewParagraph ); 88 89 EditEngine::ParagraphInserted( nNewParagraph ); 90 } 91 92 void OutlinerEditEng::ParagraphDeleted( sal_uInt16 nDeletedParagraph ) 93 { 94 pOwner->ParagraphDeleted( nDeletedParagraph ); 95 96 EditEngine::ParagraphDeleted( nDeletedParagraph ); 97 } 98 99 void OutlinerEditEng::ParagraphConnected( sal_uInt16 /*nLeftParagraph*/, sal_uInt16 nRightParagraph ) 100 { 101 if( pOwner && pOwner->IsUndoEnabled() && !const_cast<EditEngine&>(pOwner->GetEditEngine()).IsInUndo() ) 102 { 103 Paragraph* pPara = pOwner->GetParagraph( nRightParagraph ); 104 if( pPara && pOwner->HasParaFlag( pPara, PARAFLAG_ISPAGE ) ) 105 { 106 pOwner->InsertUndo( new OutlinerUndoChangeParaFlags( pOwner, nRightParagraph, PARAFLAG_ISPAGE, 0 ) ); 107 } 108 } 109 } 110 111 112 void OutlinerEditEng::StyleSheetChanged( SfxStyleSheet* pStyle ) 113 { 114 pOwner->StyleSheetChanged( pStyle ); 115 } 116 117 void OutlinerEditEng::ParaAttribsChanged( sal_uInt16 nPara ) 118 { 119 pOwner->ParaAttribsChanged( nPara ); 120 } 121 122 sal_Bool OutlinerEditEng::SpellNextDocument() 123 { 124 return pOwner->SpellNextDocument(); 125 } 126 127 sal_Bool OutlinerEditEng::ConvertNextDocument() 128 { 129 return pOwner->ConvertNextDocument(); 130 } 131 132 XubString OutlinerEditEng::GetUndoComment( sal_uInt16 nUndoId ) const 133 { 134 switch( nUndoId ) 135 { 136 case OLUNDO_DEPTH: 137 return XubString( EditResId( RID_OUTLUNDO_DEPTH )); 138 139 case OLUNDO_EXPAND: 140 return XubString( EditResId( RID_OUTLUNDO_EXPAND )); 141 142 case OLUNDO_COLLAPSE: 143 return XubString( EditResId( RID_OUTLUNDO_COLLAPSE )); 144 145 case OLUNDO_ATTR: 146 return XubString( EditResId( RID_OUTLUNDO_ATTR )); 147 148 case OLUNDO_INSERT: 149 return XubString( EditResId( RID_OUTLUNDO_INSERT )); 150 151 default: 152 return EditEngine::GetUndoComment( nUndoId ); 153 } 154 } 155 156 // #101498# 157 void OutlinerEditEng::DrawingText( const Point& rStartPos, const XubString& rText, sal_uInt16 nTextStart, sal_uInt16 nTextLen, 158 const sal_Int32* pDXArray, const SvxFont& rFont, sal_uInt16 nPara, sal_uInt16 nIndex, sal_uInt8 nRightToLeft, 159 const EEngineData::WrongSpellVector* pWrongSpellVector, 160 const SvxFieldData* pFieldData, 161 bool bEndOfLine, 162 bool bEndOfParagraph, 163 bool bEndOfBullet, 164 const ::com::sun::star::lang::Locale* pLocale, 165 const Color& rOverlineColor, 166 const Color& rTextLineColor) 167 { 168 // why do bullet here at all? Just use GetEditEnginePtr()->PaintingFirstLine 169 // inside of ImpEditEngine::Paint which calls pOwner->PaintBullet with the correct 170 // values for hor and ver. No change for not-layouting (painting). 171 // changed, bullet rendering now using PaintBullet via 172 /* if ( nIndex == 0 ) 173 { 174 // Dann das Bullet 'malen', dort wird bStrippingPortions ausgewertet 175 // und Outliner::DrawingText gerufen 176 177 // DrawingText liefert die BaseLine, DrawBullet braucht Top(). 178 179 if(true) 180 { 181 // ## 182 // another error: This call happens when only stripping, but the position 183 // is already aligned to text output. For bullet rendering, it needs to be reset 184 // to the correct value in x and y. PaintBullet takes care of X-start offset itself 185 const Point aDocPosTopLeft(GetDocPosTopLeft( nPara )); 186 const Point aCorrectedPos(rStartPos.X() - aDocPosTopLeft.X(), aDocPosTopLeft.Y() + GetFirstLineOffset( nPara )); 187 pOwner->PaintBullet( nPara, aCorrectedPos, Point(), 0, GetRefDevice() ); 188 } 189 else 190 { 191 Point aCorrectedPos( rStartPos ); 192 aCorrectedPos.Y() = GetDocPosTopLeft( nPara ).Y(); 193 aCorrectedPos.Y() += GetFirstLineOffset( nPara ); 194 pOwner->PaintBullet( nPara, aCorrectedPos, Point(), 0, GetRefDevice() ); 195 } 196 } */ 197 198 // #101498# 199 pOwner->DrawingText(rStartPos,rText,nTextStart,nTextLen,pDXArray,rFont,nPara,nIndex,nRightToLeft, 200 pWrongSpellVector, pFieldData, bEndOfLine, bEndOfParagraph, bEndOfBullet, pLocale, rOverlineColor, rTextLineColor); 201 } 202 203 void OutlinerEditEng::FieldClicked( const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos ) 204 { 205 EditEngine::FieldClicked( rField, nPara, nPos ); // Falls URL 206 pOwner->FieldClicked( rField, nPara, nPos ); 207 } 208 209 void OutlinerEditEng::FieldSelected( const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos ) 210 { 211 pOwner->FieldSelected( rField, nPara, nPos ); 212 } 213 214 XubString OutlinerEditEng::CalcFieldValue( const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos, Color*& rpTxtColor, Color*& rpFldColor ) 215 { 216 return pOwner->CalcFieldValue( rField, nPara, nPos, rpTxtColor, rpFldColor ); 217 } 218 219 void OutlinerEditEng::SetParaAttribs( sal_uInt16 nPara, const SfxItemSet& rSet ) 220 { 221 Paragraph* pPara = pOwner->pParaList->GetParagraph( nPara ); 222 if( pPara ) 223 { 224 if ( !IsInUndo() && IsUndoEnabled() ) 225 pOwner->UndoActionStart( OLUNDO_ATTR ); 226 227 EditEngine::SetParaAttribs( (sal_uInt16)nPara, rSet ); 228 229 pOwner->ImplCheckNumBulletItem( (sal_uInt16)nPara ); 230 // --> OD 2009-03-10 #i100014# 231 // It is not a good idea to substract 1 from a count and cast the result 232 // to sal_uInt16 without check, if the count is 0. 233 pOwner->ImplCheckParagraphs( (sal_uInt16)nPara, (sal_uInt16) (pOwner->pParaList->GetParagraphCount()) ); 234 // <-- 235 236 if ( !IsInUndo() && IsUndoEnabled() ) 237 pOwner->UndoActionEnd( OLUNDO_ATTR ); 238 } 239 } 240 241