Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 : #include "ScrollHelper.hxx"
20 : #include "DesignView.hxx"
21 : #include "ReportController.hxx"
22 : #include "ReportWindow.hxx"
23 : #include "UITools.hxx"
24 : #include <tools/debug.hxx>
25 : #include <com/sun/star/accessibility/AccessibleRole.hpp>
26 : #include <toolkit/helper/convert.hxx>
27 :
28 : #include <vcl/settings.hxx>
29 : #include <vcl/svapp.hxx>
30 :
31 : namespace rptui
32 : {
33 : #define SECTION_OFFSET 3
34 : #define SCR_LINE_SIZE 10
35 : using namespace ::com::sun::star;
36 :
37 :
38 0 : void lcl_setScrollBar(sal_Int32 _nNewValue,const Point& _aPos,const Size& _aSize,ScrollBar& _rScrollBar)
39 : {
40 0 : _rScrollBar.SetPosSizePixel(_aPos,_aSize);
41 0 : _rScrollBar.SetPageSize( _nNewValue );
42 0 : _rScrollBar.SetVisibleSize( _nNewValue );
43 0 : }
44 :
45 :
46 0 : OScrollWindowHelper::OScrollWindowHelper( ODesignView* _pDesignView)
47 : : OScrollWindowHelper_BASE( _pDesignView,WB_DIALOGCONTROL)
48 : ,OPropertyChangeListener(m_aMutex)
49 : ,m_aHScroll( VclPtr<ScrollBar>::Create(this, WB_HSCROLL|WB_REPEAT|WB_DRAG) )
50 : ,m_aVScroll( VclPtr<ScrollBar>::Create(this, WB_VSCROLL|WB_REPEAT|WB_DRAG) )
51 : ,m_aCornerWin( VclPtr<ScrollBarBox>::Create(this) )
52 : ,m_pParent(_pDesignView)
53 : ,m_aReportWindow(VclPtr<rptui::OReportWindow>::Create(this,m_pParent))
54 0 : ,m_pReportDefinitionMultiPlexer(NULL)
55 : {
56 0 : SetMapMode( MapMode( MAP_100TH_MM ) );
57 :
58 0 : impl_initScrollBar( *m_aHScroll.get() );
59 0 : impl_initScrollBar( *m_aVScroll.get() );
60 :
61 0 : m_aReportWindow->SetMapMode( MapMode( MAP_100TH_MM ) );
62 0 : m_aReportWindow->Show();
63 :
64 : // normally we should be SCROLL_PANE
65 0 : SetAccessibleRole(css::accessibility::AccessibleRole::SCROLL_PANE);
66 0 : ImplInitSettings();
67 0 : }
68 :
69 :
70 0 : OScrollWindowHelper::~OScrollWindowHelper()
71 : {
72 0 : disposeOnce();
73 0 : }
74 :
75 0 : void OScrollWindowHelper::dispose()
76 : {
77 0 : if ( m_pReportDefinitionMultiPlexer.is() )
78 0 : m_pReportDefinitionMultiPlexer->dispose();
79 :
80 0 : m_aHScroll.disposeAndClear();
81 0 : m_aVScroll.disposeAndClear();
82 0 : m_aCornerWin.disposeAndClear();
83 0 : m_aReportWindow.disposeAndClear();
84 0 : m_pParent.clear();
85 0 : OScrollWindowHelper_BASE::dispose();
86 0 : }
87 :
88 :
89 0 : void OScrollWindowHelper::impl_initScrollBar( ScrollBar& _rScrollBar ) const
90 : {
91 0 : AllSettings aSettings( _rScrollBar.GetSettings() );
92 0 : StyleSettings aStyle( aSettings.GetStyleSettings() );
93 0 : aStyle.SetDragFullOptions( aStyle.GetDragFullOptions() | DragFullOptions::Scroll ); // live scrolling
94 0 : aSettings.SetStyleSettings( aStyle );
95 0 : _rScrollBar.SetSettings( aSettings );
96 :
97 0 : _rScrollBar.SetScrollHdl( LINK( const_cast<OScrollWindowHelper*>(this), OScrollWindowHelper, ScrollHdl ) );
98 0 : _rScrollBar.SetLineSize( SCR_LINE_SIZE );
99 0 : }
100 :
101 :
102 0 : void OScrollWindowHelper::initialize()
103 : {
104 0 : uno::Reference<report::XReportDefinition> xReportDefinition = m_pParent->getController().getReportDefinition();
105 0 : m_pReportDefinitionMultiPlexer = addStyleListener(xReportDefinition,this);
106 0 : }
107 :
108 0 : void OScrollWindowHelper::setTotalSize(sal_Int32 _nWidth ,sal_Int32 _nHeight)
109 : {
110 0 : m_aTotalPixelSize.Width() = _nWidth;
111 0 : m_aTotalPixelSize.Height() = _nHeight;
112 :
113 : // now set the ranges without start marker
114 0 : Fraction aStartWidth(REPORT_STARTMARKER_WIDTH * m_pParent->getController().getZoomValue(),100);
115 0 : long nWidth = long(_nWidth - (double)aStartWidth);
116 0 : m_aHScroll->SetRangeMax( nWidth );
117 0 : m_aVScroll->SetRangeMax( m_aTotalPixelSize.Height() );
118 :
119 0 : Resize();
120 0 : }
121 :
122 0 : Size OScrollWindowHelper::ResizeScrollBars()
123 : {
124 : // get the new output-size in pixel
125 0 : Size aOutPixSz = GetOutputSizePixel();
126 0 : if ( aOutPixSz.Width() == 0 || aOutPixSz.Height() == 0 )
127 0 : return aOutPixSz;
128 :
129 0 : aOutPixSz.Height() -= m_aReportWindow->getRulerHeight();
130 : // determine the size of the output-area and if we need scrollbars
131 0 : const long nScrSize = GetSettings().GetStyleSettings().GetScrollBarSize();
132 0 : bool bVVisible = false; // by default no vertical-ScrollBar
133 0 : bool bHVisible = false; // by default no horizontal-ScrollBar
134 : bool bChanged; // determines if a visiblility was changed
135 0 : do
136 : {
137 0 : bChanged = false;
138 :
139 : // does we need a vertical ScrollBar
140 0 : if ( aOutPixSz.Width() < m_aTotalPixelSize.Width() && !bHVisible )
141 : {
142 0 : bHVisible = true;
143 0 : aOutPixSz.Height() -= nScrSize;
144 0 : bChanged = true;
145 : }
146 :
147 : // does we need a horizontal ScrollBar
148 0 : if ( aOutPixSz.Height() < m_aTotalPixelSize.Height() && !bVVisible )
149 : {
150 0 : bVVisible = true;
151 0 : aOutPixSz.Width() -= nScrSize;
152 0 : bChanged = true;
153 : }
154 :
155 : }
156 : while ( bChanged ); // until no visibility has changed
157 :
158 0 : aOutPixSz.Height() += m_aReportWindow->getRulerHeight();
159 :
160 : // show or hide scrollbars
161 0 : m_aVScroll->Show( bVVisible );
162 0 : m_aHScroll->Show( bHVisible );
163 :
164 : // disable painting in the corner between the scrollbars
165 0 : if ( bVVisible && bHVisible )
166 : {
167 0 : m_aCornerWin->SetPosSizePixel(Point(aOutPixSz.Width(), aOutPixSz.Height()), Size(nScrSize, nScrSize) );
168 0 : m_aCornerWin->Show();
169 : }
170 : else
171 0 : m_aCornerWin->Hide();
172 :
173 0 : const Point aOffset = LogicToPixel( Point( SECTION_OFFSET, SECTION_OFFSET ), MAP_APPFONT );
174 : // resize scrollbars and set their ranges
175 : {
176 0 : Fraction aStartWidth(long(REPORT_STARTMARKER_WIDTH*m_pParent->getController().getZoomValue()),100);
177 0 : const sal_Int32 nNewWidth = aOutPixSz.Width() - aOffset.X() - (long)aStartWidth;
178 0 : lcl_setScrollBar(nNewWidth,Point( (long)aStartWidth + aOffset.X(), aOutPixSz.Height() ), Size( nNewWidth, nScrSize ), *m_aHScroll.get());
179 : }
180 : {
181 0 : const sal_Int32 nNewHeight = aOutPixSz.Height() - m_aReportWindow->getRulerHeight();
182 0 : lcl_setScrollBar(nNewHeight,Point( aOutPixSz.Width(), m_aReportWindow->getRulerHeight() ), Size( nScrSize,nNewHeight), *m_aVScroll.get());
183 : }
184 :
185 0 : return aOutPixSz;
186 : }
187 :
188 0 : void OScrollWindowHelper::Resize()
189 : {
190 0 : OScrollWindowHelper_BASE::Resize();
191 0 : const Size aTotalOutputSize = ResizeScrollBars();
192 :
193 0 : m_aReportWindow->SetPosSizePixel(Point( 0, 0 ),aTotalOutputSize);
194 0 : }
195 :
196 0 : IMPL_LINK( OScrollWindowHelper, ScrollHdl, ScrollBar*, /*pScroll*/ )
197 : {
198 0 : m_aReportWindow->ScrollChildren( getThumbPos() );
199 0 : return 0;
200 : }
201 :
202 0 : void OScrollWindowHelper::addSection(const uno::Reference< report::XSection >& _xSection
203 : ,const OUString& _sColorEntry
204 : ,sal_uInt16 _nPosition)
205 : {
206 0 : m_aReportWindow->addSection(_xSection,_sColorEntry,_nPosition);
207 0 : }
208 :
209 0 : void OScrollWindowHelper::removeSection(sal_uInt16 _nPosition)
210 : {
211 0 : m_aReportWindow->removeSection(_nPosition);
212 0 : }
213 :
214 0 : void OScrollWindowHelper::toggleGrid(bool _bVisible)
215 : {
216 0 : m_aReportWindow->toggleGrid(_bVisible);
217 0 : }
218 :
219 0 : sal_uInt16 OScrollWindowHelper::getSectionCount() const
220 : {
221 0 : return m_aReportWindow->getSectionCount();
222 : }
223 :
224 0 : void OScrollWindowHelper::SetInsertObj( sal_uInt16 eObj,const OUString& _sShapeType )
225 : {
226 0 : m_aReportWindow->SetInsertObj(eObj,_sShapeType);
227 0 : }
228 :
229 0 : OUString OScrollWindowHelper::GetInsertObjString() const
230 : {
231 0 : return m_aReportWindow->GetInsertObjString();
232 : }
233 :
234 0 : void OScrollWindowHelper::SetMode( DlgEdMode _eNewMode )
235 : {
236 0 : m_aReportWindow->SetMode(_eNewMode);
237 0 : }
238 :
239 0 : bool OScrollWindowHelper::HasSelection() const
240 : {
241 0 : return m_aReportWindow->HasSelection();
242 : }
243 :
244 0 : void OScrollWindowHelper::Delete()
245 : {
246 0 : m_aReportWindow->Delete();
247 0 : }
248 :
249 0 : void OScrollWindowHelper::Copy()
250 : {
251 0 : m_aReportWindow->Copy();
252 0 : }
253 :
254 0 : void OScrollWindowHelper::Paste()
255 : {
256 0 : m_aReportWindow->Paste();
257 0 : }
258 :
259 0 : bool OScrollWindowHelper::IsPasteAllowed() const
260 : {
261 0 : return m_aReportWindow->IsPasteAllowed();
262 : }
263 :
264 0 : void OScrollWindowHelper::SelectAll(const sal_uInt16 _nObjectType)
265 : {
266 0 : m_aReportWindow->SelectAll(_nObjectType);
267 0 : }
268 :
269 0 : void OScrollWindowHelper::unmarkAllObjects(OSectionView* _pSectionView)
270 : {
271 0 : m_aReportWindow->unmarkAllObjects(_pSectionView);
272 0 : }
273 :
274 0 : sal_Int32 OScrollWindowHelper::getMaxMarkerWidth(bool _bWithEnd) const
275 : {
276 0 : return m_aReportWindow->getMaxMarkerWidth(_bWithEnd);
277 : }
278 :
279 0 : void OScrollWindowHelper::showRuler(bool _bShow)
280 : {
281 0 : m_aReportWindow->showRuler(_bShow);
282 0 : }
283 :
284 0 : bool OScrollWindowHelper::handleKeyEvent(const KeyEvent& _rEvent)
285 : {
286 0 : return m_aReportWindow->handleKeyEvent(_rEvent);
287 : }
288 :
289 0 : void OScrollWindowHelper::setMarked(OSectionView* _pSectionView, bool _bMark)
290 : {
291 0 : m_aReportWindow->setMarked(_pSectionView,_bMark);
292 0 : }
293 :
294 0 : void OScrollWindowHelper::setMarked(const uno::Reference< report::XSection>& _xSection, bool _bMark)
295 : {
296 0 : m_aReportWindow->setMarked(_xSection,_bMark);
297 0 : }
298 :
299 0 : void OScrollWindowHelper::setMarked(const uno::Sequence< uno::Reference< report::XReportComponent> >& _xShape, bool _bMark)
300 : {
301 0 : m_aReportWindow->setMarked(_xShape,_bMark);
302 0 : }
303 :
304 0 : OSectionWindow* OScrollWindowHelper::getMarkedSection(NearSectionAccess nsa) const
305 : {
306 0 : return m_aReportWindow->getMarkedSection(nsa);
307 : }
308 :
309 0 : OSectionWindow* OScrollWindowHelper::getSectionWindow(const ::com::sun::star::uno::Reference< ::com::sun::star::report::XSection>& _xSection) const
310 : {
311 0 : return m_aReportWindow->getSectionWindow(_xSection);
312 : }
313 :
314 0 : void OScrollWindowHelper::markSection(const sal_uInt16 _nPos)
315 : {
316 0 : m_aReportWindow->markSection(_nPos);
317 0 : }
318 :
319 0 : void OScrollWindowHelper::fillCollapsedSections(::std::vector<sal_uInt16>& _rCollapsedPositions) const
320 : {
321 0 : m_aReportWindow->fillCollapsedSections(_rCollapsedPositions);
322 0 : }
323 :
324 0 : void OScrollWindowHelper::collapseSections(const uno::Sequence< ::com::sun::star::beans::PropertyValue>& _aCollpasedSections)
325 : {
326 0 : m_aReportWindow->collapseSections(_aCollpasedSections);
327 0 : }
328 :
329 0 : bool OScrollWindowHelper::Notify( NotifyEvent& rNEvt )
330 : {
331 0 : const CommandEvent* pCommandEvent = rNEvt.GetCommandEvent();
332 0 : if ( pCommandEvent &&
333 0 : ( ((pCommandEvent->GetCommand() == CommandEventId::Wheel) ||
334 0 : (pCommandEvent->GetCommand() == CommandEventId::StartAutoScroll) ||
335 0 : (pCommandEvent->GetCommand() == CommandEventId::AutoScroll))) )
336 : {
337 0 : ScrollBar* pHScrBar = NULL;
338 0 : ScrollBar* pVScrBar = NULL;
339 0 : if ( m_aHScroll->IsVisible() )
340 0 : pHScrBar = m_aHScroll.get();
341 :
342 0 : if ( m_aVScroll->IsVisible() )
343 0 : pVScrBar = m_aVScroll.get();
344 :
345 0 : if ( HandleScrollCommand( *pCommandEvent, pHScrBar, pVScrBar ) )
346 0 : return true;
347 : }
348 0 : return OScrollWindowHelper_BASE::Notify(rNEvt);
349 : }
350 :
351 0 : void OScrollWindowHelper::alignMarkedObjects(sal_Int32 _nControlModification,bool _bAlignAtSection, bool bBoundRects)
352 : {
353 0 : m_aReportWindow->alignMarkedObjects(_nControlModification, _bAlignAtSection, bBoundRects);
354 0 : }
355 :
356 0 : void OScrollWindowHelper::ImplInitSettings()
357 : {
358 0 : SetBackground( Wallpaper( Application::GetSettings().GetStyleSettings().GetFaceColor() ));
359 0 : SetFillColor( Application::GetSettings().GetStyleSettings().GetFaceColor() );
360 0 : SetTextFillColor( Application::GetSettings().GetStyleSettings().GetFaceColor() );
361 0 : }
362 :
363 0 : void OScrollWindowHelper::DataChanged( const DataChangedEvent& rDCEvt )
364 : {
365 0 : Window::DataChanged( rDCEvt );
366 :
367 0 : if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
368 0 : (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
369 : {
370 0 : ImplInitSettings();
371 0 : Invalidate();
372 : }
373 0 : }
374 :
375 0 : void OScrollWindowHelper::_propertyChanged(const beans::PropertyChangeEvent& /*_rEvent*/)
376 : throw (uno::RuntimeException, std::exception)
377 : {
378 0 : m_aReportWindow->notifySizeChanged();
379 0 : }
380 :
381 0 : void OScrollWindowHelper::setGridSnap(bool bOn)
382 : {
383 0 : m_aReportWindow->setGridSnap(bOn);
384 0 : }
385 :
386 0 : void OScrollWindowHelper::setDragStripes(bool bOn)
387 : {
388 0 : m_aReportWindow->setDragStripes(bOn);
389 0 : }
390 :
391 0 : sal_uInt32 OScrollWindowHelper::getMarkedObjectCount() const
392 : {
393 0 : return m_aReportWindow->getMarkedObjectCount();
394 : }
395 :
396 0 : void OScrollWindowHelper::zoom(const Fraction& _aZoom)
397 : {
398 0 : m_aReportWindow->zoom(_aZoom);
399 0 : Resize();
400 0 : Invalidate(InvalidateFlags::NoChildren|InvalidateFlags::Transparent);
401 0 : }
402 :
403 0 : void OScrollWindowHelper::fillControlModelSelection(::std::vector< uno::Reference< uno::XInterface > >& _rSelection) const
404 : {
405 0 : m_aReportWindow->fillControlModelSelection(_rSelection);
406 0 : }
407 :
408 0 : sal_uInt16 OScrollWindowHelper::getZoomFactor(SvxZoomType _eType) const
409 : {
410 0 : return m_aReportWindow->getZoomFactor(_eType);
411 : }
412 :
413 3 : } // rptui
414 :
415 :
416 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|