xref: /aoo4110/main/svx/source/xoutdev/xattrbmp.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
23*b1cdbd2cSJim Jagielski #include "precompiled_svx.hxx"
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XBitmap.hpp>
26*b1cdbd2cSJim Jagielski #include <com/sun/star/graphic/XGraphic.hpp>
27*b1cdbd2cSJim Jagielski #include <tools/stream.hxx>
28*b1cdbd2cSJim Jagielski #include <vcl/window.hxx>
29*b1cdbd2cSJim Jagielski #include <vcl/virdev.hxx>
30*b1cdbd2cSJim Jagielski #include <vcl/bitmapex.hxx>
31*b1cdbd2cSJim Jagielski #include <toolkit/unohlp.hxx>
32*b1cdbd2cSJim Jagielski #include <svl/style.hxx>
33*b1cdbd2cSJim Jagielski #include <editeng/memberids.hrc>
34*b1cdbd2cSJim Jagielski #include <svx/dialogs.hrc>
35*b1cdbd2cSJim Jagielski #include "svx/xattr.hxx"
36*b1cdbd2cSJim Jagielski #include <svx/xtable.hxx>
37*b1cdbd2cSJim Jagielski #include <svx/xdef.hxx>
38*b1cdbd2cSJim Jagielski #include <svx/unomid.hxx>
39*b1cdbd2cSJim Jagielski #include <editeng/unoprnms.hxx>
40*b1cdbd2cSJim Jagielski #include <svx/unoapi.hxx>
41*b1cdbd2cSJim Jagielski #include <svx/svdmodel.hxx>
42*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyValue.hpp>
43*b1cdbd2cSJim Jagielski #include <vcl/salbtype.hxx>
44*b1cdbd2cSJim Jagielski #include <vcl/bmpacc.hxx>
45*b1cdbd2cSJim Jagielski #include <vcl/dibtools.hxx>
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski // -----------------------
50*b1cdbd2cSJim Jagielski // class XFillBitmapItem
51*b1cdbd2cSJim Jagielski // -----------------------
52*b1cdbd2cSJim Jagielski TYPEINIT1_AUTOFACTORY(XFillBitmapItem, NameOrIndex);
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
55*b1cdbd2cSJim Jagielski 
XFillBitmapItem(long nIndex,const GraphicObject & rGraphicObject)56*b1cdbd2cSJim Jagielski XFillBitmapItem::XFillBitmapItem(long nIndex, const GraphicObject& rGraphicObject)
57*b1cdbd2cSJim Jagielski :   NameOrIndex(XATTR_FILLBITMAP, nIndex),
58*b1cdbd2cSJim Jagielski 	maGraphicObject(rGraphicObject)
59*b1cdbd2cSJim Jagielski {
60*b1cdbd2cSJim Jagielski }
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
63*b1cdbd2cSJim Jagielski 
XFillBitmapItem(const XubString & rName,const GraphicObject & rGraphicObject)64*b1cdbd2cSJim Jagielski XFillBitmapItem::XFillBitmapItem(const XubString& rName, const GraphicObject& rGraphicObject)
65*b1cdbd2cSJim Jagielski :   NameOrIndex(XATTR_FILLBITMAP, rName),
66*b1cdbd2cSJim Jagielski 	maGraphicObject(rGraphicObject)
67*b1cdbd2cSJim Jagielski {
68*b1cdbd2cSJim Jagielski }
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
71*b1cdbd2cSJim Jagielski 
XFillBitmapItem(const XFillBitmapItem & rItem)72*b1cdbd2cSJim Jagielski XFillBitmapItem::XFillBitmapItem(const XFillBitmapItem& rItem)
73*b1cdbd2cSJim Jagielski :   NameOrIndex(rItem),
74*b1cdbd2cSJim Jagielski 	maGraphicObject(rItem.maGraphicObject)
75*b1cdbd2cSJim Jagielski {
76*b1cdbd2cSJim Jagielski }
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
79*b1cdbd2cSJim Jagielski 
createHistorical8x8FromArray(const sal_uInt16 * pArray,Color aColorPix,Color aColorBack)80*b1cdbd2cSJim Jagielski Bitmap createHistorical8x8FromArray(const sal_uInt16* pArray, Color aColorPix, Color aColorBack)
81*b1cdbd2cSJim Jagielski {
82*b1cdbd2cSJim Jagielski     BitmapPalette aPalette(2);
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski     aPalette[0] = BitmapColor(aColorBack);
85*b1cdbd2cSJim Jagielski     aPalette[1] = BitmapColor(aColorPix);
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski     Bitmap aBitmap(Size(8, 8), 1, &aPalette);
88*b1cdbd2cSJim Jagielski 	BitmapWriteAccess* pContent = aBitmap.AcquireWriteAccess();
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski     if(pContent)
91*b1cdbd2cSJim Jagielski     {
92*b1cdbd2cSJim Jagielski         for(sal_uInt16 a(0); a < 8; a++)
93*b1cdbd2cSJim Jagielski         {
94*b1cdbd2cSJim Jagielski             for(sal_uInt16 b(0); b < 8; b++)
95*b1cdbd2cSJim Jagielski             {
96*b1cdbd2cSJim Jagielski                 if(pArray[(a * 8) + b])
97*b1cdbd2cSJim Jagielski                 {
98*b1cdbd2cSJim Jagielski                     pContent->SetPixelIndex(a, b, 1);
99*b1cdbd2cSJim Jagielski                 }
100*b1cdbd2cSJim Jagielski                 else
101*b1cdbd2cSJim Jagielski                 {
102*b1cdbd2cSJim Jagielski                     pContent->SetPixelIndex(a, b, 0);
103*b1cdbd2cSJim Jagielski                 }
104*b1cdbd2cSJim Jagielski             }
105*b1cdbd2cSJim Jagielski         }
106*b1cdbd2cSJim Jagielski 
107*b1cdbd2cSJim Jagielski         aBitmap.ReleaseAccess(pContent);
108*b1cdbd2cSJim Jagielski     }
109*b1cdbd2cSJim Jagielski 
110*b1cdbd2cSJim Jagielski     return aBitmap;
111*b1cdbd2cSJim Jagielski }
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
114*b1cdbd2cSJim Jagielski 
isHistorical8x8(const BitmapEx & rBitmapEx,BitmapColor & o_rBack,BitmapColor & o_rFront)115*b1cdbd2cSJim Jagielski bool SVX_DLLPUBLIC isHistorical8x8(const BitmapEx& rBitmapEx, BitmapColor& o_rBack, BitmapColor& o_rFront)
116*b1cdbd2cSJim Jagielski {
117*b1cdbd2cSJim Jagielski     if(!rBitmapEx.IsTransparent())
118*b1cdbd2cSJim Jagielski     {
119*b1cdbd2cSJim Jagielski         Bitmap aBitmap(rBitmapEx.GetBitmap());
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski         if(8 == aBitmap.GetSizePixel().Width() && 8 == aBitmap.GetSizePixel().Height())
122*b1cdbd2cSJim Jagielski         {
123*b1cdbd2cSJim Jagielski             if(2 == aBitmap.GetColorCount())
124*b1cdbd2cSJim Jagielski             {
125*b1cdbd2cSJim Jagielski                 BitmapReadAccess* pRead = aBitmap.AcquireReadAccess();
126*b1cdbd2cSJim Jagielski 
127*b1cdbd2cSJim Jagielski                 if(pRead)
128*b1cdbd2cSJim Jagielski                 {
129*b1cdbd2cSJim Jagielski                     if(pRead->HasPalette() && 2 == pRead->GetPaletteEntryCount())
130*b1cdbd2cSJim Jagielski                     {
131*b1cdbd2cSJim Jagielski                         const BitmapPalette& rPalette = pRead->GetPalette();
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski                         // #123564# bachground and foregrund were exchanged; of course
134*b1cdbd2cSJim Jagielski                         // rPalette[0] is the background color
135*b1cdbd2cSJim Jagielski                         o_rFront = rPalette[1];
136*b1cdbd2cSJim Jagielski                         o_rBack = rPalette[0];
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski                         return true;
139*b1cdbd2cSJim Jagielski                     }
140*b1cdbd2cSJim Jagielski                 }
141*b1cdbd2cSJim Jagielski             }
142*b1cdbd2cSJim Jagielski         }
143*b1cdbd2cSJim Jagielski     }
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski     return false;
146*b1cdbd2cSJim Jagielski }
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
149*b1cdbd2cSJim Jagielski 
XFillBitmapItem(SvStream & rIn,sal_uInt16 nVer)150*b1cdbd2cSJim Jagielski XFillBitmapItem::XFillBitmapItem(SvStream& rIn, sal_uInt16 nVer)
151*b1cdbd2cSJim Jagielski :   NameOrIndex(XATTR_FILLBITMAP, rIn)
152*b1cdbd2cSJim Jagielski {
153*b1cdbd2cSJim Jagielski 	if (!IsIndex())
154*b1cdbd2cSJim Jagielski 	{
155*b1cdbd2cSJim Jagielski 	    if(0 == nVer)
156*b1cdbd2cSJim Jagielski 	    {
157*b1cdbd2cSJim Jagielski 		    // Behandlung der alten Bitmaps
158*b1cdbd2cSJim Jagielski 		    Bitmap aBmp;
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski             ReadDIB(aBmp, rIn, true);
161*b1cdbd2cSJim Jagielski             maGraphicObject = Graphic(aBmp);
162*b1cdbd2cSJim Jagielski 	    }
163*b1cdbd2cSJim Jagielski 	    else if(1 == nVer)
164*b1cdbd2cSJim Jagielski 	    {
165*b1cdbd2cSJim Jagielski             enum XBitmapType
166*b1cdbd2cSJim Jagielski             {
167*b1cdbd2cSJim Jagielski                 XBITMAP_IMPORT,
168*b1cdbd2cSJim Jagielski                 XBITMAP_8X8
169*b1cdbd2cSJim Jagielski             };
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski             sal_Int16 iTmp;
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski             rIn >> iTmp; // former XBitmapStyle
174*b1cdbd2cSJim Jagielski 		    rIn >> iTmp; // former XBitmapType
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski 		    if(XBITMAP_IMPORT == iTmp)
177*b1cdbd2cSJim Jagielski 		    {
178*b1cdbd2cSJim Jagielski 			    Bitmap aBmp;
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski                 ReadDIB(aBmp, rIn, true);
181*b1cdbd2cSJim Jagielski                 maGraphicObject = Graphic(aBmp);
182*b1cdbd2cSJim Jagielski 		    }
183*b1cdbd2cSJim Jagielski 		    else if(XBITMAP_8X8 == iTmp)
184*b1cdbd2cSJim Jagielski 		    {
185*b1cdbd2cSJim Jagielski                 sal_uInt16 aArray[64];
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 			    for(sal_uInt16 i(0); i < 64; i++)
188*b1cdbd2cSJim Jagielski                 {
189*b1cdbd2cSJim Jagielski 				    rIn >> aArray[i];
190*b1cdbd2cSJim Jagielski                 }
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski 			    Color aColorPix;
193*b1cdbd2cSJim Jagielski 			    Color aColorBack;
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski                 rIn >> aColorPix;
196*b1cdbd2cSJim Jagielski 			    rIn >> aColorBack;
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski                 const Bitmap aBitmap(createHistorical8x8FromArray(aArray, aColorPix, aColorBack));
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski                 maGraphicObject = Graphic(aBitmap);
201*b1cdbd2cSJim Jagielski             }
202*b1cdbd2cSJim Jagielski 	    }
203*b1cdbd2cSJim Jagielski         else if(2 == nVer)
204*b1cdbd2cSJim Jagielski         {
205*b1cdbd2cSJim Jagielski 		    BitmapEx aBmpEx;
206*b1cdbd2cSJim Jagielski 
207*b1cdbd2cSJim Jagielski             ReadDIBBitmapEx(aBmpEx, rIn);
208*b1cdbd2cSJim Jagielski             maGraphicObject = Graphic(aBmpEx);
209*b1cdbd2cSJim Jagielski         }
210*b1cdbd2cSJim Jagielski     }
211*b1cdbd2cSJim Jagielski }
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
214*b1cdbd2cSJim Jagielski 
XFillBitmapItem(SfxItemPool *,const GraphicObject & rGraphicObject)215*b1cdbd2cSJim Jagielski XFillBitmapItem::XFillBitmapItem(SfxItemPool* /*pPool*/, const GraphicObject& rGraphicObject)
216*b1cdbd2cSJim Jagielski : 	NameOrIndex( XATTR_FILLBITMAP, -1),
217*b1cdbd2cSJim Jagielski 	maGraphicObject(rGraphicObject)
218*b1cdbd2cSJim Jagielski {
219*b1cdbd2cSJim Jagielski }
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
222*b1cdbd2cSJim Jagielski 
XFillBitmapItem(SfxItemPool *)223*b1cdbd2cSJim Jagielski XFillBitmapItem::XFillBitmapItem(SfxItemPool* /*pPool*/)
224*b1cdbd2cSJim Jagielski :   NameOrIndex(XATTR_FILLBITMAP, -1),
225*b1cdbd2cSJim Jagielski     maGraphicObject()
226*b1cdbd2cSJim Jagielski {
227*b1cdbd2cSJim Jagielski }
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
230*b1cdbd2cSJim Jagielski 
Clone(SfxItemPool *) const231*b1cdbd2cSJim Jagielski SfxPoolItem* XFillBitmapItem::Clone(SfxItemPool* /*pPool*/) const
232*b1cdbd2cSJim Jagielski {
233*b1cdbd2cSJim Jagielski 	return new XFillBitmapItem(*this);
234*b1cdbd2cSJim Jagielski }
235*b1cdbd2cSJim Jagielski 
236*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
237*b1cdbd2cSJim Jagielski 
operator ==(const SfxPoolItem & rItem) const238*b1cdbd2cSJim Jagielski int XFillBitmapItem::operator==(const SfxPoolItem& rItem) const
239*b1cdbd2cSJim Jagielski {
240*b1cdbd2cSJim Jagielski 	return (NameOrIndex::operator==(rItem)
241*b1cdbd2cSJim Jagielski         && maGraphicObject == ((const XFillBitmapItem&)rItem).maGraphicObject);
242*b1cdbd2cSJim Jagielski }
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
245*b1cdbd2cSJim Jagielski 
Create(SvStream & rIn,sal_uInt16 nVer) const246*b1cdbd2cSJim Jagielski SfxPoolItem* XFillBitmapItem::Create(SvStream& rIn, sal_uInt16 nVer) const
247*b1cdbd2cSJim Jagielski {
248*b1cdbd2cSJim Jagielski 	return new XFillBitmapItem( rIn, nVer );
249*b1cdbd2cSJim Jagielski }
250*b1cdbd2cSJim Jagielski 
251*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
252*b1cdbd2cSJim Jagielski 
Store(SvStream & rOut,sal_uInt16 nItemVersion) const253*b1cdbd2cSJim Jagielski SvStream& XFillBitmapItem::Store( SvStream& rOut, sal_uInt16 nItemVersion ) const
254*b1cdbd2cSJim Jagielski {
255*b1cdbd2cSJim Jagielski 	NameOrIndex::Store(rOut, nItemVersion);
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski 	if(!IsIndex())
258*b1cdbd2cSJim Jagielski 	{
259*b1cdbd2cSJim Jagielski         WriteDIBBitmapEx(maGraphicObject.GetGraphic().GetBitmapEx(), rOut);
260*b1cdbd2cSJim Jagielski 	}
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 	return rOut;
263*b1cdbd2cSJim Jagielski }
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
266*b1cdbd2cSJim Jagielski 
GetGraphicObject() const267*b1cdbd2cSJim Jagielski const GraphicObject& XFillBitmapItem::GetGraphicObject() const
268*b1cdbd2cSJim Jagielski {
269*b1cdbd2cSJim Jagielski     return maGraphicObject;
270*b1cdbd2cSJim Jagielski }
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
273*b1cdbd2cSJim Jagielski 
SetGraphicObject(const GraphicObject & rGraphicObject)274*b1cdbd2cSJim Jagielski void XFillBitmapItem::SetGraphicObject(const GraphicObject& rGraphicObject)
275*b1cdbd2cSJim Jagielski {
276*b1cdbd2cSJim Jagielski     maGraphicObject = rGraphicObject;
277*b1cdbd2cSJim Jagielski }
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
280*b1cdbd2cSJim Jagielski 
GetVersion(sal_uInt16) const281*b1cdbd2cSJim Jagielski sal_uInt16 XFillBitmapItem::GetVersion(sal_uInt16 /*nFileFormatVersion*/) const
282*b1cdbd2cSJim Jagielski {
283*b1cdbd2cSJim Jagielski 	// version three
284*b1cdbd2cSJim Jagielski 	return(2);
285*b1cdbd2cSJim Jagielski }
286*b1cdbd2cSJim Jagielski 
287*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
288*b1cdbd2cSJim Jagielski 
GetPresentation(SfxItemPresentation ePres,SfxMapUnit,SfxMapUnit,XubString & rText,const IntlWrapper *) const289*b1cdbd2cSJim Jagielski SfxItemPresentation XFillBitmapItem::GetPresentation(
290*b1cdbd2cSJim Jagielski 	SfxItemPresentation ePres,
291*b1cdbd2cSJim Jagielski 	SfxMapUnit /*eCoreUnit*/,
292*b1cdbd2cSJim Jagielski 	SfxMapUnit /*ePresUnit*/,
293*b1cdbd2cSJim Jagielski     XubString& rText,
294*b1cdbd2cSJim Jagielski     const IntlWrapper*) const
295*b1cdbd2cSJim Jagielski {
296*b1cdbd2cSJim Jagielski 	switch (ePres)
297*b1cdbd2cSJim Jagielski 	{
298*b1cdbd2cSJim Jagielski 		case SFX_ITEM_PRESENTATION_NONE:
299*b1cdbd2cSJim Jagielski 			rText.Erase();
300*b1cdbd2cSJim Jagielski 			return ePres;
301*b1cdbd2cSJim Jagielski 		case SFX_ITEM_PRESENTATION_NAMELESS:
302*b1cdbd2cSJim Jagielski 		case SFX_ITEM_PRESENTATION_COMPLETE:
303*b1cdbd2cSJim Jagielski 			rText += GetName();
304*b1cdbd2cSJim Jagielski 			return ePres;
305*b1cdbd2cSJim Jagielski 		default:
306*b1cdbd2cSJim Jagielski 			return SFX_ITEM_PRESENTATION_NONE;
307*b1cdbd2cSJim Jagielski 	}
308*b1cdbd2cSJim Jagielski }
309*b1cdbd2cSJim Jagielski 
310*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
311*b1cdbd2cSJim Jagielski 
QueryValue(::com::sun::star::uno::Any & rVal,sal_uInt8 nMemberId) const312*b1cdbd2cSJim Jagielski sal_Bool XFillBitmapItem::QueryValue(::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId) const
313*b1cdbd2cSJim Jagielski {
314*b1cdbd2cSJim Jagielski     nMemberId &= ~CONVERT_TWIPS;
315*b1cdbd2cSJim Jagielski 
316*b1cdbd2cSJim Jagielski     // needed for MID_NAME
317*b1cdbd2cSJim Jagielski     ::rtl::OUString aApiName;
318*b1cdbd2cSJim Jagielski     // needed for complete item (MID 0)
319*b1cdbd2cSJim Jagielski     ::rtl::OUString aInternalName;
320*b1cdbd2cSJim Jagielski 
321*b1cdbd2cSJim Jagielski     ::rtl::OUString aURL;
322*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XBitmap > xBmp;
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski 	if( nMemberId == MID_NAME )
325*b1cdbd2cSJim Jagielski 	{
326*b1cdbd2cSJim Jagielski  		SvxUnogetApiNameForItem( Which(), GetName(), aApiName );
327*b1cdbd2cSJim Jagielski 	}
328*b1cdbd2cSJim Jagielski     else if( nMemberId == 0  )
329*b1cdbd2cSJim Jagielski     {
330*b1cdbd2cSJim Jagielski         aInternalName = GetName();
331*b1cdbd2cSJim Jagielski     }
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski     if( nMemberId == MID_GRAFURL ||
334*b1cdbd2cSJim Jagielski         nMemberId == 0 )
335*b1cdbd2cSJim Jagielski 	{
336*b1cdbd2cSJim Jagielski         aURL = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(UNO_NAME_GRAPHOBJ_URLPREFIX));
337*b1cdbd2cSJim Jagielski 		aURL += ::rtl::OUString::createFromAscii(GetGraphicObject().GetUniqueID().GetBuffer() );
338*b1cdbd2cSJim Jagielski 	}
339*b1cdbd2cSJim Jagielski     if( nMemberId == MID_BITMAP ||
340*b1cdbd2cSJim Jagielski         nMemberId == 0  )
341*b1cdbd2cSJim Jagielski 	{
342*b1cdbd2cSJim Jagielski 		xBmp.set(VCLUnoHelper::CreateBitmap(GetGraphicObject().GetGraphic().GetBitmapEx()));
343*b1cdbd2cSJim Jagielski 	}
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski     if( nMemberId == MID_NAME )
346*b1cdbd2cSJim Jagielski 		rVal <<= aApiName;
347*b1cdbd2cSJim Jagielski 	else if( nMemberId == MID_GRAFURL )
348*b1cdbd2cSJim Jagielski 		rVal <<= aURL;
349*b1cdbd2cSJim Jagielski 	else if( nMemberId == MID_BITMAP )
350*b1cdbd2cSJim Jagielski 		rVal <<= xBmp;
351*b1cdbd2cSJim Jagielski     else
352*b1cdbd2cSJim Jagielski     {
353*b1cdbd2cSJim Jagielski         // member-id 0 => complete item (e.g. for toolbars)
354*b1cdbd2cSJim Jagielski         DBG_ASSERT( nMemberId == 0, "invalid member-id" );
355*b1cdbd2cSJim Jagielski         uno::Sequence< beans::PropertyValue > aPropSeq( 3 );
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski         aPropSeq[0].Name  = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" ));
358*b1cdbd2cSJim Jagielski         aPropSeq[0].Value = uno::makeAny( aInternalName );
359*b1cdbd2cSJim Jagielski         aPropSeq[1].Name  = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillBitmapURL" ));
360*b1cdbd2cSJim Jagielski         aPropSeq[1].Value = uno::makeAny( aURL );
361*b1cdbd2cSJim Jagielski         aPropSeq[2].Name  = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Bitmap" ));
362*b1cdbd2cSJim Jagielski         aPropSeq[2].Value = uno::makeAny( xBmp );
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski         rVal <<= aPropSeq;
365*b1cdbd2cSJim Jagielski     }
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski 	return sal_True;
368*b1cdbd2cSJim Jagielski }
369*b1cdbd2cSJim Jagielski 
370*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
371*b1cdbd2cSJim Jagielski 
PutValue(const::com::sun::star::uno::Any & rVal,sal_uInt8 nMemberId)372*b1cdbd2cSJim Jagielski sal_Bool XFillBitmapItem::PutValue( const ::com::sun::star::uno::Any& rVal, sal_uInt8 nMemberId )
373*b1cdbd2cSJim Jagielski {
374*b1cdbd2cSJim Jagielski     nMemberId &= ~CONVERT_TWIPS;
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski     ::rtl::OUString aName;
377*b1cdbd2cSJim Jagielski     ::rtl::OUString aURL;
378*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference< ::com::sun::star::awt::XBitmap > xBmp;
379*b1cdbd2cSJim Jagielski     ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > xGraphic;
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski     bool bSetName   = false;
382*b1cdbd2cSJim Jagielski     bool bSetURL    = false;
383*b1cdbd2cSJim Jagielski     bool bSetBitmap = false;
384*b1cdbd2cSJim Jagielski 
385*b1cdbd2cSJim Jagielski     if( nMemberId == MID_NAME )
386*b1cdbd2cSJim Jagielski 		bSetName = (rVal >>= aName);
387*b1cdbd2cSJim Jagielski     else if( nMemberId == MID_GRAFURL )
388*b1cdbd2cSJim Jagielski 		bSetURL = (rVal >>= aURL);
389*b1cdbd2cSJim Jagielski 	else if( nMemberId == MID_BITMAP )
390*b1cdbd2cSJim Jagielski 	{
391*b1cdbd2cSJim Jagielski         bSetBitmap = (rVal >>= xBmp);
392*b1cdbd2cSJim Jagielski 		if ( !bSetBitmap )
393*b1cdbd2cSJim Jagielski 			bSetBitmap = (rVal >>= xGraphic );
394*b1cdbd2cSJim Jagielski 	}
395*b1cdbd2cSJim Jagielski     else
396*b1cdbd2cSJim Jagielski     {
397*b1cdbd2cSJim Jagielski         DBG_ASSERT( nMemberId == 0, "invalid member-id" );
398*b1cdbd2cSJim Jagielski         uno::Sequence< beans::PropertyValue >   aPropSeq;
399*b1cdbd2cSJim Jagielski         if( rVal >>= aPropSeq )
400*b1cdbd2cSJim Jagielski         {
401*b1cdbd2cSJim Jagielski             for ( sal_Int32 n = 0; n < aPropSeq.getLength(); n++ )
402*b1cdbd2cSJim Jagielski             {
403*b1cdbd2cSJim Jagielski                 if( aPropSeq[n].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Name" )))
404*b1cdbd2cSJim Jagielski                     bSetName = (aPropSeq[n].Value >>= aName);
405*b1cdbd2cSJim Jagielski                 else if( aPropSeq[n].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "FillBitmapURL" )))
406*b1cdbd2cSJim Jagielski                     bSetURL = (aPropSeq[n].Value >>= aURL);
407*b1cdbd2cSJim Jagielski                 else if( aPropSeq[n].Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "Bitmap" )))
408*b1cdbd2cSJim Jagielski                     bSetBitmap = (aPropSeq[n].Value >>= xBmp);
409*b1cdbd2cSJim Jagielski             }
410*b1cdbd2cSJim Jagielski         }
411*b1cdbd2cSJim Jagielski     }
412*b1cdbd2cSJim Jagielski 
413*b1cdbd2cSJim Jagielski     if( bSetName )
414*b1cdbd2cSJim Jagielski     {
415*b1cdbd2cSJim Jagielski         SetName( aName );
416*b1cdbd2cSJim Jagielski     }
417*b1cdbd2cSJim Jagielski     if( bSetURL )
418*b1cdbd2cSJim Jagielski     {
419*b1cdbd2cSJim Jagielski         maGraphicObject  = GraphicObject::CreateGraphicObjectFromURL(aURL);
420*b1cdbd2cSJim Jagielski 
421*b1cdbd2cSJim Jagielski         // #121194# Prefer GraphicObject over bitmap object if both are provided
422*b1cdbd2cSJim Jagielski         if(bSetBitmap && GRAPHIC_NONE != maGraphicObject.GetType())
423*b1cdbd2cSJim Jagielski         {
424*b1cdbd2cSJim Jagielski             bSetBitmap = false;
425*b1cdbd2cSJim Jagielski         }
426*b1cdbd2cSJim Jagielski     }
427*b1cdbd2cSJim Jagielski     if( bSetBitmap )
428*b1cdbd2cSJim Jagielski     {
429*b1cdbd2cSJim Jagielski 		if(xBmp.is())
430*b1cdbd2cSJim Jagielski 		{
431*b1cdbd2cSJim Jagielski             maGraphicObject = Graphic(VCLUnoHelper::GetBitmap(xBmp));
432*b1cdbd2cSJim Jagielski 		}
433*b1cdbd2cSJim Jagielski 		else if(xGraphic.is())
434*b1cdbd2cSJim Jagielski 		{
435*b1cdbd2cSJim Jagielski 			maGraphicObject = Graphic(xGraphic);
436*b1cdbd2cSJim Jagielski 		}
437*b1cdbd2cSJim Jagielski     }
438*b1cdbd2cSJim Jagielski 
439*b1cdbd2cSJim Jagielski 	return (bSetName || bSetURL || bSetBitmap);
440*b1cdbd2cSJim Jagielski }
441*b1cdbd2cSJim Jagielski 
442*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
443*b1cdbd2cSJim Jagielski 
CompareValueFunc(const NameOrIndex * p1,const NameOrIndex * p2)444*b1cdbd2cSJim Jagielski sal_Bool XFillBitmapItem::CompareValueFunc( const NameOrIndex* p1, const NameOrIndex* p2 )
445*b1cdbd2cSJim Jagielski {
446*b1cdbd2cSJim Jagielski     const GraphicObject& aGraphicObjectA(((XFillBitmapItem*)p1)->GetGraphicObject());
447*b1cdbd2cSJim Jagielski     const GraphicObject& aGraphicObjectB(((XFillBitmapItem*)p2)->GetGraphicObject());
448*b1cdbd2cSJim Jagielski 
449*b1cdbd2cSJim Jagielski 	return aGraphicObjectA == aGraphicObjectB;
450*b1cdbd2cSJim Jagielski }
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
453*b1cdbd2cSJim Jagielski 
checkForUniqueItem(SdrModel * pModel) const454*b1cdbd2cSJim Jagielski XFillBitmapItem* XFillBitmapItem::checkForUniqueItem( SdrModel* pModel ) const
455*b1cdbd2cSJim Jagielski {
456*b1cdbd2cSJim Jagielski 	if( pModel )
457*b1cdbd2cSJim Jagielski 	{
458*b1cdbd2cSJim Jagielski 		const String aUniqueName = NameOrIndex::CheckNamedItem(	this,
459*b1cdbd2cSJim Jagielski 																XATTR_FILLBITMAP,
460*b1cdbd2cSJim Jagielski 																&pModel->GetItemPool(),
461*b1cdbd2cSJim Jagielski 																pModel->GetStyleSheetPool() ? &pModel->GetStyleSheetPool()->GetPool() : NULL,
462*b1cdbd2cSJim Jagielski 																XFillBitmapItem::CompareValueFunc,
463*b1cdbd2cSJim Jagielski 																RID_SVXSTR_BMP21,
464*b1cdbd2cSJim Jagielski 																pModel->GetBitmapListFromSdrModel().get() );
465*b1cdbd2cSJim Jagielski 
466*b1cdbd2cSJim Jagielski 		// if the given name is not valid, replace it!
467*b1cdbd2cSJim Jagielski 		if( aUniqueName != GetName() )
468*b1cdbd2cSJim Jagielski 		{
469*b1cdbd2cSJim Jagielski 			return new XFillBitmapItem(aUniqueName, maGraphicObject);
470*b1cdbd2cSJim Jagielski 		}
471*b1cdbd2cSJim Jagielski 	}
472*b1cdbd2cSJim Jagielski 
473*b1cdbd2cSJim Jagielski 	return (XFillBitmapItem*)this;
474*b1cdbd2cSJim Jagielski }
475*b1cdbd2cSJim Jagielski 
476*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
477*b1cdbd2cSJim Jagielski // eof
478