xref: /AOO41X/main/sw/source/core/docnode/ndnotxt.cxx (revision 8a2cae9147462425170dd6be5520022deafe9f74)
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_sw.hxx"
26 
27 
28 #include <hintids.hxx>
29 #include <tools/poly.hxx>
30 #include <svl/stritem.hxx>
31 #include <svx/contdlg.hxx>
32 #include <vcl/svapp.hxx>
33 #include <docary.hxx>
34 #include <doc.hxx>
35 #include <fmtcol.hxx>
36 #include <ndnotxt.hxx>
37 #include <ndgrf.hxx>
38 #include <ndole.hxx>
39 #include <ndindex.hxx>
40 #include <hints.hxx>            // fuer SwFmtChg
41 #include <istyleaccess.hxx>
42 #include <SwStyleNameMapper.hxx>
43 
44 // --> OD 2009-07-13 #i73249#
45 #include <frmfmt.hxx>
46 // <--
47 
SwNoTxtNode(const SwNodeIndex & rWhere,const sal_uInt8 nNdType,SwGrfFmtColl * pGrfColl,SwAttrSet * pAutoAttr)48 SwNoTxtNode::SwNoTxtNode( const SwNodeIndex & rWhere,
49                   const sal_uInt8 nNdType,
50                   SwGrfFmtColl *pGrfColl,
51                   SwAttrSet* pAutoAttr ) :
52     SwCntntNode( rWhere, nNdType, pGrfColl ),
53     pContour( 0 ),
54     bAutomaticContour( sal_False ),
55     bContourMapModeValid( sal_True ),
56     bPixelContour( sal_False )
57 {
58     // soll eine Harte-Attributierung gesetzt werden?
59     if( pAutoAttr )
60         SetAttr( *pAutoAttr );
61 }
62 
63 
~SwNoTxtNode()64 SwNoTxtNode::~SwNoTxtNode()
65 {
66     delete pContour;
67 }
68 
69 
70 // erzeugt fuer alle Ableitungen einen AttrSet mit Bereichen
71 // fuer Frame- und Grafik-Attributen
NewAttrSet(SwAttrPool & rPool)72 void SwNoTxtNode::NewAttrSet( SwAttrPool& rPool )
73 {
74     ASSERT( !mpAttrSet.get(), "AttrSet ist doch gesetzt" );
75     SwAttrSet aNewAttrSet( rPool, aNoTxtNodeSetRange );
76 
77     // put names of parent style and conditional style:
78     const SwFmtColl* pFmtColl = GetFmtColl();
79     String sVal;
80     SwStyleNameMapper::FillProgName( pFmtColl->GetName(), sVal, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, sal_True );
81     SfxStringItem aFmtColl( RES_FRMATR_STYLE_NAME, sVal );
82     aNewAttrSet.Put( aFmtColl );
83 
84     aNewAttrSet.SetParent( &GetFmtColl()->GetAttrSet() );
85     mpAttrSet = GetDoc()->GetIStyleAccess().getAutomaticStyle( aNewAttrSet, IStyleAccess::AUTO_STYLE_NOTXT );
86 }
87 
88 // Dummies fuer das Laden/Speichern von persistenten Daten
89 // bei Grafiken und OLE-Objekten
90 
91 
RestorePersistentData()92 sal_Bool SwNoTxtNode::RestorePersistentData()
93 {
94     return sal_True;
95 }
96 
97 
SavePersistentData()98 sal_Bool SwNoTxtNode::SavePersistentData()
99 {
100     return sal_True;
101 }
102 
103 
SetContour(const PolyPolygon * pPoly,sal_Bool bAutomatic)104 void SwNoTxtNode::SetContour( const PolyPolygon *pPoly, sal_Bool bAutomatic )
105 {
106     delete pContour;
107     if ( pPoly )
108         pContour = new PolyPolygon( *pPoly );
109     else
110         pContour = 0;
111     bAutomaticContour = bAutomatic;
112     bContourMapModeValid = sal_True;
113     bPixelContour = sal_False;
114 }
115 
116 
CreateContour()117 void SwNoTxtNode::CreateContour()
118 {
119     ASSERT( !pContour, "Contour available." );
120     pContour = new PolyPolygon(SvxContourDlg::CreateAutoContour(GetGraphic()));
121     bAutomaticContour = sal_True;
122     bContourMapModeValid = sal_True;
123     bPixelContour = sal_False;
124 }
125 
HasContour() const126 const PolyPolygon *SwNoTxtNode::HasContour() const
127 {
128     if( !bContourMapModeValid )
129     {
130         const MapMode aGrfMap( GetGraphic().GetPrefMapMode() );
131         sal_Bool bPixelGrf = aGrfMap.GetMapUnit() == MAP_PIXEL;
132         const MapMode aContourMap( bPixelGrf ? MAP_PIXEL : MAP_100TH_MM );
133         if( bPixelGrf ? !bPixelContour : aGrfMap != aContourMap )
134         {
135             // --> OD #i102238#
136             double nGrfDPIx = 0.0;
137             double nGrfDPIy = 0.0;
138             {
139                 if ( !bPixelGrf && bPixelContour )
140                 {
141                     const Size aGrfPixelSize( GetGraphic().GetSizePixel() );
142                     const Size aGrfPrefMapModeSize( GetGraphic().GetPrefSize() );
143                     if ( aGrfMap.GetMapUnit() == MAP_INCH )
144                     {
145                         nGrfDPIx = aGrfPixelSize.Width() / ( (double)aGrfMap.GetScaleX() * aGrfPrefMapModeSize.Width() );
146                         nGrfDPIy = aGrfPixelSize.Height() / ( (double)aGrfMap.GetScaleY() * aGrfPrefMapModeSize.Height() );
147                     }
148                     else
149                     {
150                         const Size aGrf1000thInchSize =
151                             OutputDevice::LogicToLogic( aGrfPrefMapModeSize,
152                                                         aGrfMap, MAP_1000TH_INCH );
153                         nGrfDPIx = 1000.0 * aGrfPixelSize.Width() / aGrf1000thInchSize.Width();
154                         nGrfDPIy = 1000.0 * aGrfPixelSize.Height() / aGrf1000thInchSize.Height();
155                     }
156                 }
157             }
158             // <--
159             ASSERT( !bPixelGrf || aGrfMap == aContourMap,
160                     "scale factor for pixel unsupported" );
161             OutputDevice* pOutDev =
162                 (bPixelGrf || bPixelContour) ? Application::GetDefaultDevice()
163                                              : 0;
164             sal_uInt16 nPolyCount = pContour->Count();
165             for( sal_uInt16 j=0; j<nPolyCount; j++ )
166             {
167                 Polygon& rPoly = (*pContour)[j];
168 
169                 sal_uInt16 nCount = rPoly.GetSize();
170                 for( sal_uInt16 i=0 ; i<nCount; i++ )
171                 {
172                     if( bPixelGrf )
173                         rPoly[i] = pOutDev->LogicToPixel( rPoly[i],
174                                                           aContourMap );
175                     else if( bPixelContour )
176                     {
177                         rPoly[i] = pOutDev->PixelToLogic( rPoly[i], aGrfMap );
178                         // --> OD #i102238#
179                         if ( nGrfDPIx != 0 && nGrfDPIy != 0 )
180                         {
181                             rPoly[i] = Point( rPoly[i].X() * pOutDev->ImplGetDPIX() / nGrfDPIx,
182                                               rPoly[i].Y() * pOutDev->ImplGetDPIY() / nGrfDPIy );
183                         }
184                         // <--
185                     }
186                     else
187                         rPoly[i] = OutputDevice::LogicToLogic( rPoly[i],
188                                                                aContourMap,
189                                                                aGrfMap );
190                 }
191             }
192         }
193         ((SwNoTxtNode *)this)->bContourMapModeValid = sal_True;
194         ((SwNoTxtNode *)this)->bPixelContour = sal_False;
195     }
196 
197     return pContour;
198 }
199 
GetContour(PolyPolygon & rPoly) const200 void SwNoTxtNode::GetContour( PolyPolygon &rPoly ) const
201 {
202     ASSERT( pContour, "Contour not available." );
203     rPoly = *HasContour();
204 }
205 
SetContourAPI(const PolyPolygon * pPoly)206 void SwNoTxtNode::SetContourAPI( const PolyPolygon *pPoly )
207 {
208     delete pContour;
209     if ( pPoly )
210         pContour = new PolyPolygon( *pPoly );
211     else
212         pContour = 0;
213     bContourMapModeValid = sal_False;
214 }
215 
GetContourAPI(PolyPolygon & rContour) const216 sal_Bool SwNoTxtNode::GetContourAPI( PolyPolygon &rContour ) const
217 {
218     if( !pContour )
219         return sal_False;
220 
221     rContour = *pContour;
222     if( bContourMapModeValid )
223     {
224         const MapMode aGrfMap( GetGraphic().GetPrefMapMode() );
225         const MapMode aContourMap( MAP_100TH_MM );
226         ASSERT( aGrfMap.GetMapUnit() != MAP_PIXEL ||
227                 aGrfMap == MapMode( MAP_PIXEL ),
228                     "scale factor for pixel unsupported" );
229         if( aGrfMap.GetMapUnit() != MAP_PIXEL &&
230             aGrfMap != aContourMap )
231         {
232             sal_uInt16 nPolyCount = rContour.Count();
233             for( sal_uInt16 j=0; j<nPolyCount; j++ )
234             {
235                 // --> OD #i102238# - use the right <PolyPolygon> instance
236                 Polygon& rPoly = rContour[j];
237                 // <--
238 
239                 sal_uInt16 nCount = rPoly.GetSize();
240                 for( sal_uInt16 i=0 ; i<nCount; i++ )
241                 {
242                     rPoly[i] = OutputDevice::LogicToLogic( rPoly[i], aGrfMap,
243                                                            aContourMap );
244                 }
245             }
246         }
247     }
248 
249     return sal_True;
250 }
251 
IsPixelContour() const252 sal_Bool SwNoTxtNode::IsPixelContour() const
253 {
254     sal_Bool bRet;
255     if( bContourMapModeValid )
256     {
257         const MapMode aGrfMap( GetGraphic().GetPrefMapMode() );
258         bRet = aGrfMap.GetMapUnit() == MAP_PIXEL;
259     }
260     else
261     {
262         bRet = bPixelContour;
263     }
264 
265     return bRet;
266 }
267 
268 
GetGraphic() const269 Graphic SwNoTxtNode::GetGraphic() const
270 {
271     Graphic aRet;
272     if ( GetGrfNode() )
273     {
274         ((SwGrfNode*)this)->SwapIn( sal_True );
275         aRet = ((SwGrfNode*)this)->GetGrf();
276     }
277     else
278     {
279         ASSERT( GetOLENode(), "new type of Node?" );
280         aRet = *((SwOLENode*)this)->SwOLENode::GetGraphic();
281     }
282     return aRet;
283 }
284 
SetTitle(const String & rTitle,bool bBroadcast)285 void SwNoTxtNode::SetTitle( const String& rTitle, bool bBroadcast )
286 {
287     // Title attribute of <SdrObject> replaces own AlternateText attribute
288     SwFlyFrmFmt* pFlyFmt = dynamic_cast<SwFlyFrmFmt*>(GetFlyFmt());
289     ASSERT( pFlyFmt,
290             "<SwNoTxtNode::SetTitle(..)> - missing <SwFlyFrmFmt> instance" );
291     if ( !pFlyFmt )
292     {
293         return;
294     }
295 
296     pFlyFmt->SetObjTitle( rTitle, bBroadcast );
297 }
298 
GetTitle() const299 const String SwNoTxtNode::GetTitle() const
300 {
301     const SwFlyFrmFmt* pFlyFmt = dynamic_cast<const SwFlyFrmFmt*>(GetFlyFmt());
302     ASSERT( pFlyFmt,
303             "<SwNoTxtNode::GetTitle(..)> - missing <SwFlyFrmFmt> instance" );
304     if ( !pFlyFmt )
305     {
306         return aEmptyStr;
307     }
308 
309     return pFlyFmt->GetObjTitle();
310 }
311 
SetDescription(const String & rDescription,bool bBroadcast)312 void SwNoTxtNode::SetDescription( const String& rDescription, bool bBroadcast )
313 {
314     SwFlyFrmFmt* pFlyFmt = dynamic_cast<SwFlyFrmFmt*>(GetFlyFmt());
315     ASSERT( pFlyFmt,
316             "<SwNoTxtNode::SetDescription(..)> - missing <SwFlyFrmFmt> instance" );
317     if ( !pFlyFmt )
318     {
319         return;
320     }
321 
322     pFlyFmt->SetObjDescription( rDescription, bBroadcast );
323 }
324 
GetDescription() const325 const String SwNoTxtNode::GetDescription() const
326 {
327     const SwFlyFrmFmt* pFlyFmt = dynamic_cast<const SwFlyFrmFmt*>(GetFlyFmt());
328     ASSERT( pFlyFmt,
329             "<SwNoTxtNode::GetDescription(..)> - missing <SwFlyFrmFmt> instance" );
330     if ( !pFlyFmt )
331     {
332         return aEmptyStr;
333     }
334 
335     return pFlyFmt->GetObjDescription();
336 }
337 // <--
338