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 
23*b1cdbd2cSJim Jagielski #ifndef RPTUI_SCROLLHELPER_HXX
24*b1cdbd2cSJim Jagielski #define RPTUI_SCROLLHELPER_HXX
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski #include <vcl/scrbar.hxx>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/report/XSection.hpp>
28*b1cdbd2cSJim Jagielski #include <comphelper/propmultiplex.hxx>
29*b1cdbd2cSJim Jagielski #include "ReportDefines.hxx"
30*b1cdbd2cSJim Jagielski #include <svtools/colorcfg.hxx>
31*b1cdbd2cSJim Jagielski #include <svx/svdedtv.hxx>
32*b1cdbd2cSJim Jagielski #include "cppuhelper/basemutex.hxx"
33*b1cdbd2cSJim Jagielski #include <rtl/ref.hxx>
34*b1cdbd2cSJim Jagielski #include <boost/shared_ptr.hpp>
35*b1cdbd2cSJim Jagielski #include <vcl/dockwin.hxx>
36*b1cdbd2cSJim Jagielski #include <MarkedSection.hxx>
37*b1cdbd2cSJim Jagielski #include "ReportWindow.hxx"
38*b1cdbd2cSJim Jagielski 
39*b1cdbd2cSJim Jagielski class SdrView;
40*b1cdbd2cSJim Jagielski namespace rptui
41*b1cdbd2cSJim Jagielski {
42*b1cdbd2cSJim Jagielski 	class ODesignView;
43*b1cdbd2cSJim Jagielski 	class OReportWindow;
44*b1cdbd2cSJim Jagielski 	class OSectionView;
45*b1cdbd2cSJim Jagielski 	class OReportSection;
46*b1cdbd2cSJim Jagielski 	class OReportModel;
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski 	/** This class defines the scrollable area of the report design. It includes
49*b1cdbd2cSJim Jagielski 		the h-ruler and the sections, and end marker. Not the start marker.
50*b1cdbd2cSJim Jagielski 	*/
51*b1cdbd2cSJim Jagielski     typedef Window OScrollWindowHelper_BASE;
52*b1cdbd2cSJim Jagielski 	class OScrollWindowHelper : 	public ::cppu::BaseMutex
53*b1cdbd2cSJim Jagielski                                 ,   public OScrollWindowHelper_BASE/*TabPage*/
54*b1cdbd2cSJim Jagielski                                 ,	public ::comphelper::OPropertyChangeListener
55*b1cdbd2cSJim Jagielski                                     , public IMarkedSection
56*b1cdbd2cSJim Jagielski 	{
57*b1cdbd2cSJim Jagielski 	private:
58*b1cdbd2cSJim Jagielski 		ScrollBar			m_aHScroll;
59*b1cdbd2cSJim Jagielski 		ScrollBar			m_aVScroll;
60*b1cdbd2cSJim Jagielski 		ScrollBarBox		m_aCornerWin; 		// window in the bottom right corner
61*b1cdbd2cSJim Jagielski 		Size				m_aTotalPixelSize;
62*b1cdbd2cSJim Jagielski 		ODesignView*	    m_pParent;
63*b1cdbd2cSJim Jagielski 		OReportWindow		m_aReportWindow;
64*b1cdbd2cSJim Jagielski         ::rtl::Reference<comphelper::OPropertyChangeMultiplexer >
65*b1cdbd2cSJim Jagielski                             m_pReportDefintionMultiPlexer; // listener for property changes
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski 		DECL_LINK( ScrollHdl, ScrollBar*);
68*b1cdbd2cSJim Jagielski 		Size ResizeScrollBars();
69*b1cdbd2cSJim Jagielski 		void ImplInitSettings();
70*b1cdbd2cSJim Jagielski         void impl_initScrollBar( ScrollBar& _rScrollBar ) const;
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski         OScrollWindowHelper(OScrollWindowHelper&);
73*b1cdbd2cSJim Jagielski         void operator =(OScrollWindowHelper&);
74*b1cdbd2cSJim Jagielski     protected:
75*b1cdbd2cSJim Jagielski 		virtual void DataChanged( const DataChangedEvent& rDCEvt );
76*b1cdbd2cSJim Jagielski         // window
77*b1cdbd2cSJim Jagielski 		virtual void			Resize();
78*b1cdbd2cSJim Jagielski         virtual long            Notify( NotifyEvent& rNEvt );
79*b1cdbd2cSJim Jagielski         // OPropertyChangeListener
80*b1cdbd2cSJim Jagielski 		virtual void	        _propertyChanged(const ::com::sun::star::beans::PropertyChangeEvent& _rEvent) throw( ::com::sun::star::uno::RuntimeException);
81*b1cdbd2cSJim Jagielski 	public:
82*b1cdbd2cSJim Jagielski 		OScrollWindowHelper( ODesignView* _pReportDesignView);
83*b1cdbd2cSJim Jagielski 		virtual ~OScrollWindowHelper();
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski 		/** late ctor
86*b1cdbd2cSJim Jagielski 		*/
87*b1cdbd2cSJim Jagielski 		void					initialize();
88*b1cdbd2cSJim Jagielski 
getThumbPos() const89*b1cdbd2cSJim Jagielski 		inline Point			getThumbPos() const { return Point(m_aHScroll.GetThumbPos(),m_aVScroll.GetThumbPos())/*m_aScrollOffset*/; }
getReportWindow() const90*b1cdbd2cSJim Jagielski 		inline const OReportWindow&	getReportWindow() const { return m_aReportWindow; }
91*b1cdbd2cSJim Jagielski 		void					setTotalSize(sal_Int32 _nWidth ,sal_Int32 _nHeight);
getTotalSize() const92*b1cdbd2cSJim Jagielski 		inline Size				getTotalSize() const { return m_aTotalPixelSize; }
GetHScroll()93*b1cdbd2cSJim Jagielski 		inline ScrollBar*		GetHScroll() { return &m_aHScroll; }
GetVScroll()94*b1cdbd2cSJim Jagielski 		inline ScrollBar*		GetVScroll() { return &m_aVScroll; }
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski 		// forwards
97*b1cdbd2cSJim Jagielski 		void 					SetMode( DlgEdMode _eMode );
98*b1cdbd2cSJim Jagielski 		void					SetInsertObj( sal_uInt16 eObj,const ::rtl::OUString& _sShapeType = ::rtl::OUString());
99*b1cdbd2cSJim Jagielski 		rtl::OUString           GetInsertObjString() const;
100*b1cdbd2cSJim Jagielski         void                    setGridSnap(sal_Bool bOn);
101*b1cdbd2cSJim Jagielski         void                    setDragStripes(sal_Bool bOn);
102*b1cdbd2cSJim Jagielski 		/** copies the current selection in this section
103*b1cdbd2cSJim Jagielski 		*/
104*b1cdbd2cSJim Jagielski 		void Copy();
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski 		/**	returns if paste is allowed
107*b1cdbd2cSJim Jagielski 		*
108*b1cdbd2cSJim Jagielski 		* \return <TRUE/> if paste is allowed
109*b1cdbd2cSJim Jagielski 		*/
110*b1cdbd2cSJim Jagielski 		sal_Bool IsPasteAllowed() const;
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski 		/** paste a new control in this section
113*b1cdbd2cSJim Jagielski 		*/
114*b1cdbd2cSJim Jagielski 		void Paste();
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski 		/** Deletes the current selection in this section
117*b1cdbd2cSJim Jagielski 		*
118*b1cdbd2cSJim Jagielski 		*/
119*b1cdbd2cSJim Jagielski 		void Delete();
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski 		/** All objects will be marked.
122*b1cdbd2cSJim Jagielski 		*/
123*b1cdbd2cSJim Jagielski 		void SelectAll(const sal_uInt16 _nObjectType);
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski         /** returns <TRUE/> when a object is marked
126*b1cdbd2cSJim Jagielski         */
127*b1cdbd2cSJim Jagielski         sal_Bool HasSelection() const;
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski 		/** removes the section at the given position.
130*b1cdbd2cSJim Jagielski 		*
131*b1cdbd2cSJim Jagielski 		* \param _nPosition Zero based.
132*b1cdbd2cSJim Jagielski 		*/
133*b1cdbd2cSJim Jagielski 		void					removeSection(sal_uInt16 _nPosition);
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski 		/** adds a new section at position _nPosition.
136*b1cdbd2cSJim Jagielski 			If the section is <NULL/> nothing happens.
137*b1cdbd2cSJim Jagielski 			If the position is grater than the current elements, the section will be appended.
138*b1cdbd2cSJim Jagielski 		*/
139*b1cdbd2cSJim Jagielski 		void					addSection(const ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection >& _xSection
140*b1cdbd2cSJim Jagielski 									,const ::rtl::OUString& _sColorEntry
141*b1cdbd2cSJim Jagielski 									,sal_uInt16 _nPosition = USHRT_MAX);
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski 		sal_uInt16					getSectionCount() const;
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski 		/** turns the grid on or off
146*b1cdbd2cSJim Jagielski 		*
147*b1cdbd2cSJim Jagielski 		* \param _bVisible
148*b1cdbd2cSJim Jagielski 		*/
149*b1cdbd2cSJim Jagielski 		void					toggleGrid(sal_Bool _bVisible);
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski 		/** unmark all objects on the views without the given one.
152*b1cdbd2cSJim Jagielski 		*
153*b1cdbd2cSJim Jagielski 		* @param _pSectionView The view where the objects should not be unmarked.
154*b1cdbd2cSJim Jagielski 		*/
155*b1cdbd2cSJim Jagielski 		void					unmarkAllObjects(OSectionView* _pSectionView);
156*b1cdbd2cSJim Jagielski 
157*b1cdbd2cSJim Jagielski 		/** shows or hides the ruler.
158*b1cdbd2cSJim Jagielski 		*/
159*b1cdbd2cSJim Jagielski 		void					showRuler(sal_Bool _bShow);
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski 		/** calculate the max width of the markers
162*b1cdbd2cSJim Jagielski 		*
163*b1cdbd2cSJim Jagielski 		* @param _bWithEnd	if <TRUE/> the end marker will be used for calculation as well otherwise not.
164*b1cdbd2cSJim Jagielski 		* \return the max width
165*b1cdbd2cSJim Jagielski 		*/
166*b1cdbd2cSJim Jagielski 		sal_Int32				getMaxMarkerWidth(sal_Bool _bWithEnd) const;
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski 		/** checks if the keycode is known by the child windows
169*b1cdbd2cSJim Jagielski 			@param	_rCode	the keycode
170*b1cdbd2cSJim Jagielski 			@return <TRUE/> if the keycode is handled otherwise <FALSE/>
171*b1cdbd2cSJim Jagielski 		*/
172*b1cdbd2cSJim Jagielski 		sal_Bool				handleKeyEvent(const KeyEvent& _rEvent);
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski 		/** the the section as marked or not marked
175*b1cdbd2cSJim Jagielski 			@param	_pSectionView	the section where to set the marked flag
176*b1cdbd2cSJim Jagielski 			@param	_bMark	the marked flag
177*b1cdbd2cSJim Jagielski 		*/
178*b1cdbd2cSJim Jagielski 		void					setMarked(OSectionView* _pSectionView,sal_Bool _bMark);
179*b1cdbd2cSJim Jagielski         void			        setMarked(const ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection>& _xSection,sal_Bool _bMark);
180*b1cdbd2cSJim Jagielski         void			        setMarked(const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::report::XReportComponent> >& _xShape,sal_Bool _bMark);
181*b1cdbd2cSJim Jagielski 
182*b1cdbd2cSJim Jagielski         // IMarkedSection
183*b1cdbd2cSJim Jagielski 		::boost::shared_ptr<OSectionWindow> getMarkedSection(NearSectionAccess nsa = CURRENT) const;
184*b1cdbd2cSJim Jagielski         ::boost::shared_ptr<OSectionWindow> getSectionWindow(const ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection>& _xSection) const;
185*b1cdbd2cSJim Jagielski         virtual void markSection(const sal_uInt16 _nPos);
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski         /** fills the positions of all collapsed sections.
189*b1cdbd2cSJim Jagielski         *
190*b1cdbd2cSJim Jagielski         * \param _rCollapsedPositions Out parameter which holds afterwards all positions of the collapsed sections.
191*b1cdbd2cSJim Jagielski         */
192*b1cdbd2cSJim Jagielski         void fillCollapsedSections(::std::vector<sal_uInt16>& _rCollapsedPositions) const;
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski         /** collpase all sections given by their position
195*b1cdbd2cSJim Jagielski         *
196*b1cdbd2cSJim Jagielski         * \param _aCollpasedSections The position of the sections which should be collapsed.
197*b1cdbd2cSJim Jagielski         */
198*b1cdbd2cSJim Jagielski         void collapseSections(const com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue>& _aCollpasedSections);
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski         /** align all marked objects in all sections
201*b1cdbd2cSJim Jagielski         *
202*b1cdbd2cSJim Jagielski         * \param eHor
203*b1cdbd2cSJim Jagielski         * \param eVert
204*b1cdbd2cSJim Jagielski         * \param bBoundRects
205*b1cdbd2cSJim Jagielski         */
206*b1cdbd2cSJim Jagielski         void alignMarkedObjects(sal_Int32 _nControlModification, bool _bAlignAtSection, bool bBoundRects = false);
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski         sal_uInt32 getMarkedObjectCount() const;
209*b1cdbd2cSJim Jagielski 
210*b1cdbd2cSJim Jagielski         /** zoom the ruler and view windows
211*b1cdbd2cSJim Jagielski         */
212*b1cdbd2cSJim Jagielski         void zoom(const Fraction& _aZoom);
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski         /** fills the vector with all selected control models
215*b1cdbd2cSJim Jagielski             /param  _rSelection The vector will be filled and will not be cleared before.
216*b1cdbd2cSJim Jagielski         */
217*b1cdbd2cSJim Jagielski         void fillControlModelSelection(::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > >& _rSelection) const;
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski         /** calculates the zoom factor.
220*b1cdbd2cSJim Jagielski             @param  _eType  which kind of zoom is needed
221*b1cdbd2cSJim Jagielski         */
222*b1cdbd2cSJim Jagielski         sal_uInt16 getZoomFactor(SvxZoomType _eType) const;
223*b1cdbd2cSJim Jagielski 	};
224*b1cdbd2cSJim Jagielski }
225*b1cdbd2cSJim Jagielski #endif // RPTUI_SCROLLHELPER_HXX
226