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 RPTUI_VIEWSWINDOW_HXX
24 #define RPTUI_VIEWSWINDOW_HXX
25 
26 #include <com/sun/star/report/XSection.hpp>
27 #include <vcl/window.hxx>
28 #include <svtools/colorcfg.hxx>
29 #include "ReportDefines.hxx"
30 #include "ReportSection.hxx"
31 #include <comphelper/propmultiplex.hxx>
32 #include "cppuhelper/basemutex.hxx"
33 #include <svtools/colorcfg.hxx>
34 #include <com/sun/star/beans/NamedValue.hpp>
35 #include <svx/svdedtv.hxx>
36 #include <SectionView.hxx>
37 #include <unotools/options.hxx>
38 #include <list>
39 #include <vector>
40 #include <boost/shared_ptr.hpp>
41 
42 #include <MarkedSection.hxx>
43 #include <SectionWindow.hxx>
44 
45 class SdrHdl;
46 namespace rptui
47 {
48 	class OReportWindow;
49 	class ODesignView;
50 	class OEndMarker;
51 	class OReportSection;
52 	class OSectionView;
53 
54 
55     // -----------------------------------------------------------------------------
56     struct RectangleLess : public ::std::binary_function< Rectangle, Rectangle, bool>
57     {
58         enum CompareMode { POS_LEFT,POS_RIGHT,POS_UPPER,POS_DOWN,POS_CENTER_HORIZONTAL,POS_CENTER_VERTICAL };
59         CompareMode m_eCompareMode;
60         Point       m_aRefPoint;
61         RectangleLess(CompareMode _eCompareMode,const Point& _rRefPoint ) : m_eCompareMode(_eCompareMode),m_aRefPoint(_rRefPoint){}
62         bool operator() (const Rectangle& lhs, const Rectangle& rhs) const
63         {
64             switch(m_eCompareMode)
65             {
66             case POS_LEFT:
67                 return lhs.Left() < rhs.Left();
68             case POS_RIGHT:
69                 return lhs.Right() >= rhs.Right();
70             case POS_UPPER:
71                 return lhs.Top() < rhs.Top();
72             case POS_DOWN:
73                 return lhs.Bottom() >= rhs.Bottom();
74             case POS_CENTER_HORIZONTAL:
75                 return abs(m_aRefPoint.X() - lhs.Center().X()) < abs(m_aRefPoint.X() - rhs.Center().X());
76             case POS_CENTER_VERTICAL:
77                 return abs(lhs.Center().Y() - m_aRefPoint.Y()) < abs(rhs.Center().Y() - m_aRefPoint.Y());
78             }
79             return false;
80         }
81     };
82 
83     class OWindowPositionCorrector
84 	{
85 		::std::vector< ::std::pair<Window*,Point> > m_aChildren;
86 		long m_nDeltaX;
87 		long m_nDeltaY;
88 	public:
89 		OWindowPositionCorrector(Window* _pWindow,long _nDeltaX, long _nDeltaY) :m_nDeltaX(_nDeltaX), m_nDeltaY(_nDeltaY)
90 		{
91 			sal_uInt16 nCount = _pWindow->GetChildCount();
92 			m_aChildren.reserve(nCount);
93 			while( nCount )
94 			{
95 				Window* pChild = _pWindow->GetChild(--nCount);
96 				m_aChildren.push_back(::std::pair<Window*,Point>(pChild,pChild->GetPosPixel()));
97 			}
98 		}
99 		~OWindowPositionCorrector()
100 		{
101 			::std::vector< ::std::pair<Window*,Point> >::iterator aIter = m_aChildren.begin();
102 			::std::vector< ::std::pair<Window*,Point> >::iterator aEnd = m_aChildren.end();
103 			for (; aIter != aEnd; ++aIter)
104 			{
105 				const Point aPos = aIter->first->GetPosPixel();
106 				if ( aPos == aIter->second )
107 					aIter->first->SetPosPixel(Point(m_nDeltaX,m_nDeltaY) + aPos);
108 			}
109 		}
110 	};
111 
112     class OViewsWindow :	public Window
113 						,	public utl::ConfigurationListener
114                         ,   public IMarkedSection
115 	{
116         typedef ::std::multimap<Rectangle,::std::pair<SdrObject*,OSectionView*>,RectangleLess>      TRectangleMap;
117 	public:
118 		typedef ::std::vector< ::boost::shared_ptr<OSectionWindow> >								TSectionsMap;
119 
120 		struct TReportPairHelper : public ::std::unary_function< TSectionsMap::value_type, OReportSection >
121 		{
122 			OReportSection& operator() (const TSectionsMap::value_type& lhs) const
123 			{
124 				return lhs->getReportSection();
125 			}
126 		};
127         struct TStartMarkerHelper : public ::std::unary_function< TSectionsMap::value_type, OStartMarker >
128 		{
129 			OStartMarker& operator() (const TSectionsMap::value_type& lhs) const
130 			{
131 				return lhs->getStartMarker();
132 			}
133 		};
134 	private:
135 		TSectionsMap							m_aSections;
136 		svtools::ColorConfig					m_aColorConfig;
137 		OReportWindow*							m_pParent;
138         ::rtl::OUString                         m_sShapeType;
139 		sal_Bool								m_bInSplitHandler;
140 		sal_Bool								m_bInUnmark;
141 
142 		void ImplInitSettings();
143 		/** returns the iterator at pos _nPos or the end()
144 		*/
145 		TSectionsMap::iterator getIteratorAtPos(sal_uInt16 _nPos);
146         void collectRectangles(TRectangleMap& _rMap,bool _bBoundRects);
147         void collectBoundResizeRect(const TRectangleMap& _rSortRectangles,sal_Int32 _nControlModification,bool _bAlignAtSection,bool _bBoundRects,Rectangle& _rBound,Rectangle& _rResize);
148         void impl_resizeSectionWindow(OSectionWindow& _rSectionWindow,Point& _rStartPoint,bool _bSet);
149 
150         OViewsWindow(OViewsWindow&);
151         void operator =(OViewsWindow&);
152 	protected:
153 		virtual void DataChanged( const DataChangedEvent& rDCEvt );
154         // windows overload
155 		virtual void MouseButtonDown( const MouseEvent& rMEvt );
156 		virtual void MouseButtonUp( const MouseEvent& rMEvt );
157 
158         virtual void Paint( const Rectangle& rRect );
159 		virtual void ConfigurationChanged( utl::ConfigurationBroadcaster*, sal_uInt32 );
160 	public:
161 		OViewsWindow(
162             OReportWindow* _pReportWindow);
163 		virtual ~OViewsWindow();
164 
165         // windows overload
166 		virtual void Resize();
167 
168         void resize(const OSectionWindow& _rSectionWindow);
169 
170 		/** late ctor
171 		*/
172 		void initialize();
173 
174 		inline OReportWindow*		getView()			const { return m_pParent; }
175 
176 		/** removes the section at the given position.
177 		*
178 		* \param _nPosition Zero based.
179 		*/
180 		void			removeSection(sal_uInt16 _nPosition);
181 
182 		/** adds a new section at position _nPosition.
183 			If the section is <NULL/> nothing happens.
184 			If the position is grater than the current elements, the section will be appended.
185 		*/
186 		void			addSection(const ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection >& _xSection
187 									,const ::rtl::OUString& _sColorEntry
188 									,sal_uInt16 _nPosition = USHRT_MAX);
189 
190 		sal_uInt16			getSectionCount() const;
191         /** return the section at the given position
192         *
193         * \param _nPos
194         * \return the section at this pos or an empty section
195         */
196         ::boost::shared_ptr<OSectionWindow> getSectionWindow(const sal_uInt16 _nPos) const;
197 
198 		/** turns the grid on or off
199 		*
200 		* \param _bVisible
201 		*/
202 		void			toggleGrid(sal_Bool _bVisible);
203         void            setGridSnap(sal_Bool bOn);
204         void            setDragStripes(sal_Bool bOn);
205 
206 		/** returns the total accumulated height of all sections until _pSection is reached
207 		*/
208 		sal_Int32		getTotalHeight() const;
209 
210 		inline bool		empty() const { return m_aSections.empty(); }
211 		void 			SetMode( DlgEdMode m_eMode );
212 		void			SetInsertObj( sal_uInt16 eObj,const ::rtl::OUString& _sShapeType = ::rtl::OUString());
213 		rtl::OUString   GetInsertObjString() const;
214 		/** copies the current selection in this section
215 		*/
216 		void Copy();
217 
218 		/**	returns if paste is allowed
219 		*
220 		* \return <TRUE/> if paste is allowed
221 		*/
222 		sal_Bool IsPasteAllowed() const;
223 
224 		/** paste a new control in this section
225 		*/
226 		void Paste();
227 
228 		/** Deletes the current selection in this section
229 		*
230 		*/
231 		void Delete();
232 
233 		/** All objects will be marked.
234 		*/
235 		void SelectAll(const sal_uInt16 _nObjectType);
236 
237         /** returns <TRUE/> when a object is marked
238         */
239         sal_Bool HasSelection() const;
240 
241 		/** unmark all objects on the views without the given one.
242 		*
243 		* @param _pSectionView The view where the objects should not be unmarked.
244 		*/
245 		void			unmarkAllObjects(OSectionView* _pSectionView);
246 
247 		/** returns the report section window for the given xsection
248 			@param	_xSection	the section
249 		*/
250 		// ::boost::shared_ptr<OSectionWindow>	getReportSection(const ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection >& _xSection);
251 		::boost::shared_ptr<OSectionWindow> getSectionWindow(const ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection>& _xSection) const;
252 
253 		/** checks if the keycode is known by the child windows
254 			@param	_rCode	the keycode
255 			@return <TRUE/> if the keycode is handled otherwise <FALSE/>
256 		*/
257 		sal_Bool		handleKeyEvent(const KeyEvent& _rEvent);
258 
259 		/** the the section as marked or not marked
260 			@param	_pSectionView	the section where to set the marked flag
261 			@param	_bMark	the marked flag
262 		*/
263 		void			setMarked(OSectionView* _pSectionView,sal_Bool _bMark);
264         void			setMarked(const ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection>& _xSection,sal_Bool _bMark);
265         void			setMarked(const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::report::XReportComponent> >& _xShape,sal_Bool _bMark);
266 
267 		// IMarkedSection
268 		::boost::shared_ptr<OSectionWindow> getMarkedSection(NearSectionAccess nsa = CURRENT) const;
269         virtual void markSection(const sal_uInt16 _nPos);
270 
271         /** align all marked objects in all sections
272         */
273         void alignMarkedObjects(sal_Int32 _nControlModification,bool _bAlignAtSection, bool bBoundRects = false);
274 
275         /** creates a default object
276         *
277         */
278         void createDefault();
279 
280         /** shows or hides the ruler.
281 		*/
282 		void showRuler(sal_Bool _bShow);
283 
284         /** returns the currently set shape type.
285         *
286         * \return \member m_sShapeType
287         */
288         inline ::rtl::OUString getShapeType() const { return m_sShapeType; }
289 
290 		/** returns the current position in the list
291 		*/
292 		sal_uInt16 getPosition(const OSectionWindow* _pSectionWindow = NULL) const;
293 
294         /** calls on every section BrkAction
295         *
296         */
297         void BrkAction();
298         void BegMarkObj(const Point& _aPnt,const OSectionView* _pSection);
299 
300     private:
301         void BegDragObj_createInvisibleObjectAtPosition(const Rectangle& _aRect, const OSectionView& _rSection);
302 		void EndDragObj_removeInvisibleObjects();
303         Point m_aDragDelta;
304         ::std::vector<SdrObject*> m_aBegDragTempList;
305         bool isObjectInMyTempList(SdrObject *);
306     public:
307         void BegDragObj(const Point& _aPnt, SdrHdl* _pHdl,const OSectionView* _pSection);
308         void EndDragObj(sal_Bool _bDragIntoNewSection,const OSectionView* _pSection,const Point& _aPnt);
309 
310 		void EndAction();
311         void ForceMarkedToAnotherPage();
312         sal_Bool IsAction() const;
313         sal_Bool IsDragObj() const;
314         void handleKey(const KeyCode& _rCode);
315         void stopScrollTimer();
316 
317         /** return the section at the given point which is relative to the given section
318         *
319         * \param _pSection the section which is used as reference point
320         * \param _rPnt the point, it will be changed that it is inside the section which will be returned
321         * \return the section
322         */
323         OSectionView* getSectionRelativeToPosition(const OSectionView* _pSection,Point& _rPnt);
324 
325         void MovAction(const Point& rPnt,const OSectionView* _pSection,bool _bMove /*= true */, bool _bControlKeySet);
326         // void MovAction2(const Point& rPnt,const OSectionView* _pSection);
327 
328         sal_uInt32 getMarkedObjectCount() const;
329 
330         /** fills the positions of all collapsed sections.
331         *
332         * \param _rCollapsedPositions Out parameter which holds afterwards all positions of the collapsed sections.
333         */
334         void fillCollapsedSections(::std::vector<sal_uInt16>& _rCollapsedPositions) const;
335 
336         /** collpase all sections given by their position
337         *
338         * \param _aCollpasedSections The position of the sections which should be collapsed.
339         */
340         void collapseSections(const com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>& _aCollpasedSections);
341 
342         /** zoom the ruler and view windows
343         */
344         void zoom(const Fraction& _aZoom);
345 
346         void scrollChildren(const Point& _aThumbPos);
347 
348         /** fills the vector with all selected control models
349             /param  _rSelection The vector will be filled and will not be cleared before.
350         */
351         void fillControlModelSelection(::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > >& _rSelection) const;
352 	};
353 //==============================================================================
354 } // rptui
355 //==============================================================================
356 #endif // RPTUI_VIEWSWINDOW_HXX
357 
358