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 #ifndef _ESCHESDO_HXX
24 #define _ESCHESDO_HXX
25 #include <filter/msfilter/escherex.hxx>
26 #include <svx/unopage.hxx>
27 #include <vcl/mapmod.hxx>
28 
29 // ===================================================================
30 // fractions of Draw PPTWriter etc.
31 
32 enum ImplEESdrPageType { NORMAL = 0, MASTER = 1, NOTICE = 2, UNDEFINED = 3 };
33 
34 class ImplEESdrWriter;
35 class ImplEscherExSdr;
36 
37 class ImplEESdrObject
38 {
39 	::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >			mXShape;
40 //	XTextRef			mXText;	// TextRef des globalen Text
41 	::com::sun::star::uno::Any				mAny;
42 	Rectangle			maRect;
43 	String				mType;
44 	sal_uInt32				mnShapeId;
45 	sal_uInt32				mnTextSize;
46 	sal_Int32				mnAngle;
47 	sal_Bool 				mbValid : 1;
48 	sal_Bool				mbPresObj : 1;
49 	sal_Bool				mbEmptyPresObj : 1;
50 
51 	void Init( ImplEESdrWriter& rEx );
52 public:
53 	::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > 	mXPropSet;
54 
55 	ImplEESdrObject( ImplEscherExSdr& rEx, const SdrObject& rObj );
56 	ImplEESdrObject( ImplEESdrWriter& rEx, const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& rShape );
57 	~ImplEESdrObject();
58 
59 	sal_Bool ImplGetPropertyValue( const sal_Unicode* pString );
60 
ImplGetInt32PropertyValue(const sal_Unicode * pStr,sal_uInt32 nDef=0)61 	sal_Int32 ImplGetInt32PropertyValue( const sal_Unicode* pStr, sal_uInt32 nDef = 0 )
62 	{ return ImplGetPropertyValue( pStr ) ? *(sal_Int32*)mAny.getValue() : nDef; }
63 
ImplGetPropertyValue(const rtl::OUString & rStr)64 	sal_Bool ImplGetPropertyValue( const rtl::OUString& rStr ) { return ImplGetPropertyValue( rStr.getStr() ); }
ImplGetInt32PropertyValue(const rtl::OUString & rStr)65 	sal_Bool ImplGetInt32PropertyValue( const rtl::OUString& rStr ) { return ImplGetInt32PropertyValue( rStr.getStr() ); }
66 
GetShapeRef() const67 	const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >&	GetShapeRef() const 	{ return mXShape; }
GetUsrAny() const68 	const ::com::sun::star::uno::Any&		GetUsrAny() const		{ return mAny; }
GetType() const69 	const String&		GetType() const 		{ return mType; }
SetType(const String & rS)70 	void				SetType( const String& rS ) { mType = rS; }
71 
GetRect() const72 	const Rectangle&	GetRect() const 		{ return maRect; }
73 	void				SetRect( const Point& rPos, const Size& rSz );
SetRect(const Rectangle & rRect)74 	void				SetRect( const Rectangle& rRect )
75 							{ maRect = rRect; }
76 
GetAngle() const77 	sal_Int32				GetAngle() const 		{ return mnAngle; }
SetAngle(sal_Int32 nVal)78 	void				SetAngle( sal_Int32 nVal ) 	{ mnAngle = nVal; }
79 
GetTextSize() const80 	sal_uInt32				GetTextSize() const 	{ return mnTextSize; }
81 
IsValid() const82 	sal_Bool 				IsValid() const 		{ return mbValid; }
IsPresObj() const83 	sal_Bool				IsPresObj() const 		{ return mbPresObj; }
IsEmptyPresObj() const84 	sal_Bool				IsEmptyPresObj() const 	{ return mbEmptyPresObj; }
GetShapeId() const85 	sal_uInt32				GetShapeId() const 		{ return mnShapeId; }
SetShapeId(sal_uInt32 nVal)86 	void 				SetShapeId( sal_uInt32 nVal ) { mnShapeId = nVal; }
87 
88 	const SdrObject*	GetSdrObject() const;
89 
90 	sal_uInt32 				ImplGetText();
91 	sal_Bool 				ImplHasText() const;
92 };
93 
94 
95 
96 // -------------------------------------------------------------------
97 // fractions of the Draw PPTWriter
98 
99 class EscherEx;
100 namespace com { namespace sun { namespace star {
101 	namespace drawing {
102 		class XDrawPage;
103 		class XShape;
104 	}
105 	namespace task {
106 		class XStatusIndicator;
107 	}
108 }}}
109 class EscherExHostAppData;
110 class Polygon;
111 
112 class ImplEESdrWriter
113 {
114 protected:
115 		EscherEx*			mpEscherEx;
116 		MapMode				maMapModeSrc;
117 		MapMode				maMapModeDest;
118 
119 		::com::sun::star::uno::Reference< ::com::sun::star::task::XStatusIndicator >	mXStatusIndicator;
120 		::com::sun::star::uno::Reference< ::com::sun::star::drawing::XDrawPage >		mXDrawPage;
121 		::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >			mXShapes;
122 
123 		SvStream*			mpPicStrm;
124 
125 		// own extensions
126 
127 		EscherExHostAppData*	mpHostAppData;
128 
129 		sal_uInt32				mnPagesWritten;
130 
131 		sal_uInt32				mnShapeMasterTitle;
132 		sal_uInt32				mnShapeMasterBody;
133 
134 		// per page values
135 		sal_uInt32				mnIndices;
136 		sal_uInt32				mnOutlinerCount;
137 		sal_uInt32				mnPrevTextStyle;
138 		sal_uInt32				mnStatMaxValue;
139 
140 		sal_uInt16				mnEffectCount;
141 
142 		sal_Bool				mbIsTitlePossible;
143 		sal_Bool				mbStatusIndicator;
144 		sal_Bool				mbStatus;
145 
146 
147 								ImplEESdrWriter( EscherEx& rEx );
148 
149 			sal_Bool				ImplInitPageValues();
150 
151 			void				ImplWritePage(
152 									EscherSolverContainer& rSolver,
153 									ImplEESdrPageType ePageType,
154 									sal_Bool bBackGround = sal_False );
155 
156 			sal_uInt32				ImplWriteShape( ImplEESdrObject& rObj,
157 									EscherSolverContainer& rSolver,
158 									ImplEESdrPageType ePageType );	// returns ShapeID
159 
160 			void				ImplFlipBoundingBox( ImplEESdrObject& rObj, EscherPropertyContainer& rPropOpt );
161 			sal_Bool				ImplGetText( ImplEESdrObject& rObj );
162 			void				ImplWriteAdditionalText(
163 												ImplEESdrObject& rObj,
164 												const Point& rTextRefPoint );
165 			sal_uInt32				ImplEnterAdditionalTextGroup(
166 										const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& rShape,
167 										const Rectangle* pBoundRect = NULL );
168 
169 
170 public:
171 			Point				ImplMapPoint( const Point& rPoint );
172 			Size				ImplMapSize( const Size& rSize );
ImplGetHostData()173 			EscherExHostAppData* ImplGetHostData() { return mpHostAppData; }
174             void MapRect(ImplEESdrObject& rObj);
175 };
176 
177 
178 // ===================================================================
179 
180 class SdrObject;
181 class SdrPage;
182 
183 class ImplEscherExSdr : public ImplEESdrWriter
184 {
185 private:
186 		const SdrPage*			mpSdrPage;
187 		EscherSolverContainer*	mpSolverContainer;
188 
189 public:
190 								ImplEscherExSdr( EscherEx& rEx );
191 	virtual						~ImplEscherExSdr();
192 
193             bool                ImplInitPage( const SdrPage& rPage );
194             bool                ImplInitUnoShapes( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes >& rxShapes );
195 			void				ImplWriteCurrentPage();
196 
197 			sal_uInt32				ImplWriteTheShape( ImplEESdrObject& rObj );
198 
199 			void				ImplExitPage();
200 			void				ImplFlushSolverContainer();
201 };
202 
203 
204 
205 #endif // _ESCHESDO_HXX
206