zoomsliderctrl.cxx (c7124341) zoomsliderctrl.cxx (07662b26)
1/**************************************************************
1/**************************************************************
2 *
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
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 *
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
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.
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 *
19 *
20 *************************************************************/
21
22
23
24// MARKER(update_precomp.py): autogen include statement, do not remove
25#include "precompiled_svx.hxx"
26
27// include ---------------------------------------------------------------

--- 14 unchanged lines hidden (view full) ---

42// -----------------------------------------------------------------------
43
44SFX_IMPL_STATUSBAR_CONTROL( SvxZoomSliderControl, SvxZoomSliderItem );
45
46// -----------------------------------------------------------------------
47
48struct SvxZoomSliderControl::SvxZoomSliderControl_Impl
49{
20 *************************************************************/
21
22
23
24// MARKER(update_precomp.py): autogen include statement, do not remove
25#include "precompiled_svx.hxx"
26
27// include ---------------------------------------------------------------

--- 14 unchanged lines hidden (view full) ---

42// -----------------------------------------------------------------------
43
44SFX_IMPL_STATUSBAR_CONTROL( SvxZoomSliderControl, SvxZoomSliderItem );
45
46// -----------------------------------------------------------------------
47
48struct SvxZoomSliderControl::SvxZoomSliderControl_Impl
49{
50 sal_uInt16 mnCurrentZoom;
51 sal_uInt16 mnMinZoom;
52 sal_uInt16 mnMaxZoom;
53 sal_uInt16 mnSliderCenter;
54 std::vector< long > maSnappingPointOffsets;
55 std::vector< sal_uInt16 > maSnappingPointZooms;
56 Image maSliderButton;
57 Image maIncreaseButton;
58 Image maDecreaseButton;
59 bool mbValuesSet;
60 bool mbOmitPaint;
50 sal_uInt16 mnCurrentZoom;
51 sal_uInt16 mnMinZoom;
52 sal_uInt16 mnMaxZoom;
53 sal_uInt16 mnSliderCenter;
54 std::vector< long > maSnappingPointOffsets;
55 std::vector< sal_uInt16 > maSnappingPointZooms;
56 Image maSliderButton;
57 Image maIncreaseButton;
58 Image maDecreaseButton;
59 bool mbValuesSet;
60 bool mbOmitPaint;
61
61
62 SvxZoomSliderControl_Impl() :
63 mnCurrentZoom( 0 ),
64 mnMinZoom( 0 ),
65 mnMaxZoom( 0 ),
66 mnSliderCenter( 0 ),
67 maSnappingPointOffsets(),
68 maSnappingPointZooms(),
69 maSliderButton(),
70 maIncreaseButton(),
71 maDecreaseButton(),
72 mbValuesSet( false ),
73 mbOmitPaint( false ) {}
62 SvxZoomSliderControl_Impl() :
63 mnCurrentZoom( 0 ),
64 mnMinZoom( 0 ),
65 mnMaxZoom( 0 ),
66 mnSliderCenter( 0 ),
67 maSnappingPointOffsets(),
68 maSnappingPointZooms(),
69 maSliderButton(),
70 maIncreaseButton(),
71 maDecreaseButton(),
72 mbValuesSet( false ),
73 mbOmitPaint( false ) {}
74};
75
76// -----------------------------------------------------------------------
77
78const long nButtonWidth = 10;
79const long nButtonHeight = 10;
80const long nIncDecWidth = 11;
81const long nIncDecHeight = 11;
82const long nSliderHeight = 2;
83const long nSnappingHeight = 4;
84const long nSliderXOffset = 20;
85const long nSnappingEpsilon = 5; // snapping epsilon in pixels
86const long nSnappingPointsMinDist = nSnappingEpsilon; // minimum distance of two adjacent snapping points
87
88// -----------------------------------------------------------------------
89
74};
75
76// -----------------------------------------------------------------------
77
78const long nButtonWidth = 10;
79const long nButtonHeight = 10;
80const long nIncDecWidth = 11;
81const long nIncDecHeight = 11;
82const long nSliderHeight = 2;
83const long nSnappingHeight = 4;
84const long nSliderXOffset = 20;
85const long nSnappingEpsilon = 5; // snapping epsilon in pixels
86const long nSnappingPointsMinDist = nSnappingEpsilon; // minimum distance of two adjacent snapping points
87
88// -----------------------------------------------------------------------
89
90// nOffset referes to the origin of the control:
90// nOffset refers to the origin of the control:
91// + ----------- -
92sal_uInt16 SvxZoomSliderControl::Offset2Zoom( long nOffset ) const
93{
91// + ----------- -
92sal_uInt16 SvxZoomSliderControl::Offset2Zoom( long nOffset ) const
93{
94 const long nControlWidth = getControlRect().GetWidth();
95 sal_uInt16 nRet = 0;
94 const long nControlWidth = getControlRect().GetWidth();
95 sal_uInt16 nRet = 0;
96
96
97 if ( nOffset < nSliderXOffset )
98 return mpImpl->mnMinZoom;;
97 if ( nOffset < nSliderXOffset )
98 return mpImpl->mnMinZoom;;
99
99
100 if ( nOffset > nControlWidth - nSliderXOffset )
101 return mpImpl->mnMaxZoom;
100 if ( nOffset > nControlWidth - nSliderXOffset )
101 return mpImpl->mnMaxZoom;
102
102
103 // check for snapping points:
104 sal_uInt16 nCount = 0;
105 std::vector< long >::iterator aSnappingPointIter;
106 for ( aSnappingPointIter = mpImpl->maSnappingPointOffsets.begin();
107 aSnappingPointIter != mpImpl->maSnappingPointOffsets.end();
108 ++aSnappingPointIter )
109 {
110 const long nCurrent = *aSnappingPointIter;
111 if ( Abs(nCurrent - nOffset) < nSnappingEpsilon )
112 {
113 nOffset = nCurrent;
114 nRet = mpImpl->maSnappingPointZooms[ nCount ];
115 break;
116 }
117 ++nCount;
118 }
103 // check for snapping points:
104 sal_uInt16 nCount = 0;
105 std::vector< long >::iterator aSnappingPointIter;
106 for ( aSnappingPointIter = mpImpl->maSnappingPointOffsets.begin();
107 aSnappingPointIter != mpImpl->maSnappingPointOffsets.end();
108 ++aSnappingPointIter )
109 {
110 const long nCurrent = *aSnappingPointIter;
111 if ( Abs(nCurrent - nOffset) < nSnappingEpsilon )
112 {
113 nOffset = nCurrent;
114 nRet = mpImpl->maSnappingPointZooms[ nCount ];
115 break;
116 }
117 ++nCount;
118 }
119
119
120 if ( 0 == nRet )
121 {
122 if ( nOffset < nControlWidth / 2 )
123 {
124 // first half of slider
125 const long nFirstHalfRange = mpImpl->mnSliderCenter - mpImpl->mnMinZoom;
126 const long nHalfSliderWidth = nControlWidth/2 - nSliderXOffset;
127 const long nZoomPerSliderPixel = (1000 * nFirstHalfRange) / nHalfSliderWidth;
128 const long nOffsetToSliderLeft = nOffset - nSliderXOffset;
129 nRet = mpImpl->mnMinZoom + sal_uInt16( nOffsetToSliderLeft * nZoomPerSliderPixel / 1000 );
130 }
131 else
132 {
133 // second half of slider
134 const long nSecondHalfRange = mpImpl->mnMaxZoom - mpImpl->mnSliderCenter;
135 const long nHalfSliderWidth = nControlWidth/2 - nSliderXOffset;
136 const long nZoomPerSliderPixel = 1000 * nSecondHalfRange / nHalfSliderWidth;
137 const long nOffsetToSliderCenter = nOffset - nControlWidth/2;
138 nRet = mpImpl->mnSliderCenter + sal_uInt16( nOffsetToSliderCenter * nZoomPerSliderPixel / 1000 );
139 }
140 }
120 if ( 0 == nRet )
121 {
122 if ( nOffset < nControlWidth / 2 )
123 {
124 // first half of slider
125 const long nFirstHalfRange = mpImpl->mnSliderCenter - mpImpl->mnMinZoom;
126 const long nHalfSliderWidth = nControlWidth/2 - nSliderXOffset;
127 const long nZoomPerSliderPixel = (1000 * nFirstHalfRange) / nHalfSliderWidth;
128 const long nOffsetToSliderLeft = nOffset - nSliderXOffset;
129 nRet = mpImpl->mnMinZoom + sal_uInt16( nOffsetToSliderLeft * nZoomPerSliderPixel / 1000 );
130 }
131 else
132 {
133 // second half of slider
134 const long nSecondHalfRange = mpImpl->mnMaxZoom - mpImpl->mnSliderCenter;
135 const long nHalfSliderWidth = nControlWidth/2 - nSliderXOffset;
136 const long nZoomPerSliderPixel = 1000 * nSecondHalfRange / nHalfSliderWidth;
137 const long nOffsetToSliderCenter = nOffset - nControlWidth/2;
138 nRet = mpImpl->mnSliderCenter + sal_uInt16( nOffsetToSliderCenter * nZoomPerSliderPixel / 1000 );
139 }
140 }
141
141
142 if ( nRet < mpImpl->mnMinZoom )
143 nRet = mpImpl->mnMinZoom;
144 else if ( nRet > mpImpl->mnMaxZoom )
145 nRet = mpImpl->mnMaxZoom;
142 if ( nRet < mpImpl->mnMinZoom )
143 nRet = mpImpl->mnMinZoom;
144 else if ( nRet > mpImpl->mnMaxZoom )
145 nRet = mpImpl->mnMaxZoom;
146
146
147 return nRet;
147 return nRet;
148}
149
150// returns the offset to the left control border
151long SvxZoomSliderControl::Zoom2Offset( sal_uInt16 nCurrentZoom ) const
152{
148}
149
150// returns the offset to the left control border
151long SvxZoomSliderControl::Zoom2Offset( sal_uInt16 nCurrentZoom ) const
152{
153 const long nControlWidth = getControlRect().GetWidth();
154 long nRet = nSliderXOffset;
153 const long nControlWidth = getControlRect().GetWidth();
154 long nRet = nSliderXOffset;
155
155
156 const long nHalfSliderWidth = nControlWidth/2 - nSliderXOffset;
156 const long nHalfSliderWidth = nControlWidth/2 - nSliderXOffset;
157
157
158 if ( nCurrentZoom <= mpImpl->mnSliderCenter )
159 {
160 nCurrentZoom = nCurrentZoom - mpImpl->mnMinZoom;
161 const long nFirstHalfRange = mpImpl->mnSliderCenter - mpImpl->mnMinZoom;
162 const long nSliderPixelPerZoomPercent = 1000 * nHalfSliderWidth / nFirstHalfRange;
163 const long nOffset = (nSliderPixelPerZoomPercent * nCurrentZoom) / 1000;
164 nRet += nOffset;
165 }
166 else
167 {
168 nCurrentZoom = nCurrentZoom - mpImpl->mnSliderCenter;
169 const long nSecondHalfRange = mpImpl->mnMaxZoom - mpImpl->mnSliderCenter;
170 const long nSliderPixelPerZoomPercent = 1000 * nHalfSliderWidth / nSecondHalfRange;
171 const long nOffset = (nSliderPixelPerZoomPercent * nCurrentZoom) / 1000;
172 nRet += nHalfSliderWidth + nOffset;
173 }
158 if ( nCurrentZoom <= mpImpl->mnSliderCenter )
159 {
160 nCurrentZoom = nCurrentZoom - mpImpl->mnMinZoom;
161 const long nFirstHalfRange = mpImpl->mnSliderCenter - mpImpl->mnMinZoom;
162 const long nSliderPixelPerZoomPercent = 1000 * nHalfSliderWidth / nFirstHalfRange;
163 const long nOffset = (nSliderPixelPerZoomPercent * nCurrentZoom) / 1000;
164 nRet += nOffset;
165 }
166 else
167 {
168 nCurrentZoom = nCurrentZoom - mpImpl->mnSliderCenter;
169 const long nSecondHalfRange = mpImpl->mnMaxZoom - mpImpl->mnSliderCenter;
170 const long nSliderPixelPerZoomPercent = 1000 * nHalfSliderWidth / nSecondHalfRange;
171 const long nOffset = (nSliderPixelPerZoomPercent * nCurrentZoom) / 1000;
172 nRet += nHalfSliderWidth + nOffset;
173 }
174
174
175 return nRet;
175 return nRet;
176}
177
178// -----------------------------------------------------------------------
179
180SvxZoomSliderControl::SvxZoomSliderControl( sal_uInt16 _nSlotId, sal_uInt16 _nId, StatusBar& _rStb ) :
176}
177
178// -----------------------------------------------------------------------
179
180SvxZoomSliderControl::SvxZoomSliderControl( sal_uInt16 _nSlotId, sal_uInt16 _nId, StatusBar& _rStb ) :
181 SfxStatusBarControl( _nSlotId, _nId, _rStb ),
182 mpImpl( new SvxZoomSliderControl_Impl )
181 SfxStatusBarControl( _nSlotId, _nId, _rStb ),
182 mpImpl( new SvxZoomSliderControl_Impl )
183{
183{
184 const sal_Bool bHC = GetStatusBar().GetSettings().GetStyleSettings().GetHighContrastMode();
185 mpImpl->maSliderButton = Image( SVX_RES( bHC ? RID_SVXBMP_SLIDERBUTTON_HC : RID_SVXBMP_SLIDERBUTTON ) );
186 mpImpl->maIncreaseButton = Image( SVX_RES( bHC ? RID_SVXBMP_SLIDERINCREASE_HC : RID_SVXBMP_SLIDERINCREASE ) );
187 mpImpl->maDecreaseButton = Image( SVX_RES( bHC ? RID_SVXBMP_SLIDERDECREASE_HC : RID_SVXBMP_SLIDERDECREASE ) );
184 const sal_Bool bHC = GetStatusBar().GetSettings().GetStyleSettings().GetHighContrastMode();
185 mpImpl->maSliderButton = Image( SVX_RES( bHC ? RID_SVXBMP_SLIDERBUTTON_HC : RID_SVXBMP_SLIDERBUTTON ) );
186 mpImpl->maIncreaseButton = Image( SVX_RES( bHC ? RID_SVXBMP_SLIDERINCREASE_HC : RID_SVXBMP_SLIDERINCREASE ) );
187 mpImpl->maDecreaseButton = Image( SVX_RES( bHC ? RID_SVXBMP_SLIDERDECREASE_HC : RID_SVXBMP_SLIDERDECREASE ) );
188}
189
190// -----------------------------------------------------------------------
191
192SvxZoomSliderControl::~SvxZoomSliderControl()
193{
194 delete mpImpl;
195}
196
197// -----------------------------------------------------------------------
198
199void SvxZoomSliderControl::StateChanged( sal_uInt16 /*nSID*/, SfxItemState eState, const SfxPoolItem* pState )
200{
188}
189
190// -----------------------------------------------------------------------
191
192SvxZoomSliderControl::~SvxZoomSliderControl()
193{
194 delete mpImpl;
195}
196
197// -----------------------------------------------------------------------
198
199void SvxZoomSliderControl::StateChanged( sal_uInt16 /*nSID*/, SfxItemState eState, const SfxPoolItem* pState )
200{
201 if ( (SFX_ITEM_AVAILABLE != eState) || pState->ISA( SfxVoidItem ) )
202 {
203 GetStatusBar().SetItemText( GetId(), String() );
204 mpImpl->mbValuesSet = false;
205 }
206 else
207 {
208 OSL_ENSURE( pState->ISA( SvxZoomSliderItem ), "invalid item type: should be a SvxZoomSliderItem" );
209 mpImpl->mnCurrentZoom = static_cast<const SvxZoomSliderItem*>( pState )->GetValue();
210 mpImpl->mnMinZoom = static_cast<const SvxZoomSliderItem*>( pState )->GetMinZoom();
211 mpImpl->mnMaxZoom = static_cast<const SvxZoomSliderItem*>( pState )->GetMaxZoom();
212 mpImpl->mnSliderCenter= 100;
213 mpImpl->mbValuesSet = true;
201 if ( (SFX_ITEM_AVAILABLE != eState) || pState->ISA( SfxVoidItem ) )
202 {
203 GetStatusBar().SetItemText( GetId(), String() );
204 mpImpl->mbValuesSet = false;
205 }
206 else
207 {
208 OSL_ENSURE( pState->ISA( SvxZoomSliderItem ), "invalid item type: should be a SvxZoomSliderItem" );
209 mpImpl->mnCurrentZoom = static_cast<const SvxZoomSliderItem*>( pState )->GetValue();
210 mpImpl->mnMinZoom = static_cast<const SvxZoomSliderItem*>( pState )->GetMinZoom();
211 mpImpl->mnMaxZoom = static_cast<const SvxZoomSliderItem*>( pState )->GetMaxZoom();
212 mpImpl->mnSliderCenter= 100;
213 mpImpl->mbValuesSet = true;
214
214
215 if ( mpImpl->mnSliderCenter == mpImpl->mnMaxZoom )
216 mpImpl->mnSliderCenter = mpImpl->mnMinZoom + (sal_uInt16)((mpImpl->mnMaxZoom - mpImpl->mnMinZoom) * 0.5);
215 if ( mpImpl->mnSliderCenter == mpImpl->mnMaxZoom )
216 mpImpl->mnSliderCenter = mpImpl->mnMinZoom + (sal_uInt16)((mpImpl->mnMaxZoom - mpImpl->mnMinZoom) * 0.5);
217
218
217
218
219 DBG_ASSERT( mpImpl->mnMinZoom <= mpImpl->mnCurrentZoom &&
220 mpImpl->mnMinZoom < mpImpl->mnSliderCenter &&
221 mpImpl->mnMaxZoom >= mpImpl->mnCurrentZoom &&
222 mpImpl->mnMaxZoom > mpImpl->mnSliderCenter,
223 "Looks like the zoom slider item is corrupted" );
219 DBG_ASSERT( mpImpl->mnMinZoom <= mpImpl->mnCurrentZoom &&
220 mpImpl->mnMinZoom < mpImpl->mnSliderCenter &&
221 mpImpl->mnMaxZoom >= mpImpl->mnCurrentZoom &&
222 mpImpl->mnMaxZoom > mpImpl->mnSliderCenter,
223 "Looks like the zoom slider item is corrupted" );
224
224
225 const com::sun::star::uno::Sequence < sal_Int32 > rSnappingPoints = static_cast<const SvxZoomSliderItem*>( pState )->GetSnappingPoints();
226 mpImpl->maSnappingPointOffsets.clear();
227 mpImpl->maSnappingPointZooms.clear();
225 const com::sun::star::uno::Sequence < sal_Int32 > rSnappingPoints = static_cast<const SvxZoomSliderItem*>( pState )->GetSnappingPoints();
226 mpImpl->maSnappingPointOffsets.clear();
227 mpImpl->maSnappingPointZooms.clear();
228
228
229 // get all snapping points:
230 std::set< sal_uInt16 > aTmpSnappingPoints;
231 for ( sal_uInt16 j = 0; j < rSnappingPoints.getLength(); ++j )
232 {
233 const sal_Int32 nSnappingPoint = rSnappingPoints[j];
234 aTmpSnappingPoints.insert( (sal_uInt16)nSnappingPoint );
235 }
229 // get all snapping points:
230 std::set< sal_uInt16 > aTmpSnappingPoints;
231 for ( sal_uInt16 j = 0; j < rSnappingPoints.getLength(); ++j )
232 {
233 const sal_Int32 nSnappingPoint = rSnappingPoints[j];
234 aTmpSnappingPoints.insert( (sal_uInt16)nSnappingPoint );
235 }
236
236
237 // remove snapping points that are to close to each other:
238 std::set< sal_uInt16 >::iterator aSnappingPointIter;
239 long nLastOffset = 0;
237 // remove snapping points that are to close to each other:
238 std::set< sal_uInt16 >::iterator aSnappingPointIter;
239 long nLastOffset = 0;
240
240
241 for ( aSnappingPointIter = aTmpSnappingPoints.begin(); aSnappingPointIter != aTmpSnappingPoints.end(); ++aSnappingPointIter )
242 {
243 const sal_uInt16 nCurrent = *aSnappingPointIter;
244 const long nCurrentOffset = Zoom2Offset( nCurrent );
241 for ( aSnappingPointIter = aTmpSnappingPoints.begin(); aSnappingPointIter != aTmpSnappingPoints.end(); ++aSnappingPointIter )
242 {
243 const sal_uInt16 nCurrent = *aSnappingPointIter;
244 const long nCurrentOffset = Zoom2Offset( nCurrent );
245
245
246 if ( nCurrentOffset - nLastOffset >= nSnappingPointsMinDist )
247 {
248 mpImpl->maSnappingPointOffsets.push_back( nCurrentOffset );
249 mpImpl->maSnappingPointZooms.push_back( nCurrent );
250 nLastOffset = nCurrentOffset;
251 }
252 }
253 }
246 if ( nCurrentOffset - nLastOffset >= nSnappingPointsMinDist )
247 {
248 mpImpl->maSnappingPointOffsets.push_back( nCurrentOffset );
249 mpImpl->maSnappingPointZooms.push_back( nCurrent );
250 nLastOffset = nCurrentOffset;
251 }
252 }
253 }
254
254
255 if ( !mpImpl->mbOmitPaint && GetStatusBar().AreItemsVisible() )
256 GetStatusBar().SetItemData( GetId(), 0 ); // force repaint
255 if ( !mpImpl->mbOmitPaint && GetStatusBar().AreItemsVisible() )
256 GetStatusBar().SetItemData( GetId(), 0 ); // force repaint
257}
258
259// -----------------------------------------------------------------------
260
261void SvxZoomSliderControl::Paint( const UserDrawEvent& rUsrEvt )
262{
257}
258
259// -----------------------------------------------------------------------
260
261void SvxZoomSliderControl::Paint( const UserDrawEvent& rUsrEvt )
262{
263 if ( !mpImpl->mbValuesSet || mpImpl->mbOmitPaint )
264 return;
263 if ( !mpImpl->mbValuesSet || mpImpl->mbOmitPaint )
264 return;
265
265
266 const Rectangle aControlRect = getControlRect();
267 OutputDevice* pDev = rUsrEvt.GetDevice();
268 Rectangle aRect = rUsrEvt.GetRect();
269 Rectangle aSlider = aRect;
266 const Rectangle aControlRect = getControlRect();
267 OutputDevice* pDev = rUsrEvt.GetDevice();
268 Rectangle aRect = rUsrEvt.GetRect();
269 Rectangle aSlider = aRect;
270
270
271 aSlider.Top() += (aControlRect.GetHeight() - nSliderHeight)/2 - 1;
272 aSlider.Bottom() = aSlider.Top() + nSliderHeight;
273 aSlider.Left() += nSliderXOffset;
274 aSlider.Right() -= nSliderXOffset;
271 aSlider.Top() += (aControlRect.GetHeight() - nSliderHeight)/2 - 1;
272 aSlider.Bottom() = aSlider.Top() + nSliderHeight;
273 aSlider.Left() += nSliderXOffset;
274 aSlider.Right() -= nSliderXOffset;
275
275
276 Color aOldLineColor = pDev->GetLineColor();
277 Color aOldFillColor = pDev->GetFillColor();
276 Color aOldLineColor = pDev->GetLineColor();
277 Color aOldFillColor = pDev->GetFillColor();
278
278
279 pDev->SetLineColor( Color( COL_GRAY ) );
280 pDev->SetFillColor( Color( COL_GRAY ) );
279 pDev->SetLineColor( Color( COL_GRAY ) );
280 pDev->SetFillColor( Color( COL_GRAY ) );
281
281
282 // draw snapping points:
283 std::vector< long >::iterator aSnappingPointIter;
284 for ( aSnappingPointIter = mpImpl->maSnappingPointOffsets.begin();
285 aSnappingPointIter != mpImpl->maSnappingPointOffsets.end();
286 ++aSnappingPointIter )
287 {
288 Rectangle aSnapping( aRect );
289 aSnapping.Bottom() = aSlider.Top();
290 aSnapping.Top() = aSnapping.Bottom() - nSnappingHeight;
291 aSnapping.Left() += *aSnappingPointIter;
292 aSnapping.Right() = aSnapping.Left();
293 pDev->DrawRect( aSnapping );
282 // draw snapping points:
283 std::vector< long >::iterator aSnappingPointIter;
284 for ( aSnappingPointIter = mpImpl->maSnappingPointOffsets.begin();
285 aSnappingPointIter != mpImpl->maSnappingPointOffsets.end();
286 ++aSnappingPointIter )
287 {
288 Rectangle aSnapping( aRect );
289 aSnapping.Bottom() = aSlider.Top();
290 aSnapping.Top() = aSnapping.Bottom() - nSnappingHeight;
291 aSnapping.Left() += *aSnappingPointIter;
292 aSnapping.Right() = aSnapping.Left();
293 pDev->DrawRect( aSnapping );
294
294
295 aSnapping.Top() += nSnappingHeight + nSliderHeight;
296 aSnapping.Bottom() += nSnappingHeight + nSliderHeight;
297 pDev->DrawRect( aSnapping );
298 }
295 aSnapping.Top() += nSnappingHeight + nSliderHeight;
296 aSnapping.Bottom() += nSnappingHeight + nSliderHeight;
297 pDev->DrawRect( aSnapping );
298 }
299
299
300 // draw slider
301 Rectangle aFirstLine( aSlider );
302 aFirstLine.Bottom() = aFirstLine.Top();
300 // draw slider
301 Rectangle aFirstLine( aSlider );
302 aFirstLine.Bottom() = aFirstLine.Top();
303
303
304 Rectangle aSecondLine( aSlider );
305 aSecondLine.Top() = aSecondLine.Bottom();
304 Rectangle aSecondLine( aSlider );
305 aSecondLine.Top() = aSecondLine.Bottom();
306
306
307 Rectangle aLeft( aSlider );
308 aLeft.Right() = aLeft.Left();
307 Rectangle aLeft( aSlider );
308 aLeft.Right() = aLeft.Left();
309
309
310 Rectangle aRight( aSlider );
311 aRight.Left() = aRight.Right();
310 Rectangle aRight( aSlider );
311 aRight.Left() = aRight.Right();
312
312
313 pDev->SetLineColor( Color ( COL_GRAY ) );
314 pDev->SetFillColor( Color ( COL_GRAY ) );
315 pDev->DrawRect( aSecondLine );
316 pDev->DrawRect( aRight );
313 pDev->SetLineColor( Color ( COL_GRAY ) );
314 pDev->SetFillColor( Color ( COL_GRAY ) );
315 pDev->DrawRect( aSecondLine );
316 pDev->DrawRect( aRight );
317
317
318 pDev->SetLineColor( Color( COL_GRAY ) );
319 pDev->SetFillColor( Color( COL_GRAY ) );
320 pDev->DrawRect( aFirstLine );
321 pDev->DrawRect( aLeft );
318 pDev->SetLineColor( Color( COL_GRAY ) );
319 pDev->SetFillColor( Color( COL_GRAY ) );
320 pDev->DrawRect( aFirstLine );
321 pDev->DrawRect( aLeft );
322
322
323 // draw slider button
324 Point aImagePoint = aRect.TopLeft();
325 aImagePoint.X() += Zoom2Offset( mpImpl->mnCurrentZoom );
326 aImagePoint.X() -= nButtonWidth/2;
327 aImagePoint.Y() += (aControlRect.GetHeight() - nButtonHeight)/2;
328 pDev->DrawImage( aImagePoint, mpImpl->maSliderButton );
323 // draw slider button
324 Point aImagePoint = aRect.TopLeft();
325 aImagePoint.X() += Zoom2Offset( mpImpl->mnCurrentZoom );
326 aImagePoint.X() -= nButtonWidth/2;
327 aImagePoint.Y() += (aControlRect.GetHeight() - nButtonHeight)/2;
328 pDev->DrawImage( aImagePoint, mpImpl->maSliderButton );
329
329
330 // draw decrease button
331 aImagePoint = aRect.TopLeft();
332 aImagePoint.X() += (nSliderXOffset - nIncDecWidth)/2;
333 aImagePoint.Y() += (aControlRect.GetHeight() - nIncDecHeight)/2;
334 pDev->DrawImage( aImagePoint, mpImpl->maDecreaseButton );
330 // draw decrease button
331 aImagePoint = aRect.TopLeft();
332 aImagePoint.X() += (nSliderXOffset - nIncDecWidth)/2;
333 aImagePoint.Y() += (aControlRect.GetHeight() - nIncDecHeight)/2;
334 pDev->DrawImage( aImagePoint, mpImpl->maDecreaseButton );
335
335
336 // draw increase button
337 aImagePoint.X() = aRect.TopLeft().X() + aControlRect.GetWidth() - nIncDecWidth - (nSliderXOffset - nIncDecWidth)/2;
338 pDev->DrawImage( aImagePoint, mpImpl->maIncreaseButton );
336 // draw increase button
337 aImagePoint.X() = aRect.TopLeft().X() + aControlRect.GetWidth() - nIncDecWidth - (nSliderXOffset - nIncDecWidth)/2;
338 pDev->DrawImage( aImagePoint, mpImpl->maIncreaseButton );
339
339
340 pDev->SetLineColor( aOldLineColor );
341 pDev->SetFillColor( aOldFillColor );
340 pDev->SetLineColor( aOldLineColor );
341 pDev->SetFillColor( aOldFillColor );
342}
343
344// -----------------------------------------------------------------------
345
346sal_Bool SvxZoomSliderControl::MouseButtonDown( const MouseEvent & rEvt )
347{
342}
343
344// -----------------------------------------------------------------------
345
346sal_Bool SvxZoomSliderControl::MouseButtonDown( const MouseEvent & rEvt )
347{
348 if ( !mpImpl->mbValuesSet )
349 return sal_True;;
348 if ( !mpImpl->mbValuesSet )
349 return sal_True;;
350
350
351 const Rectangle aControlRect = getControlRect();
352 const Point aPoint = rEvt.GetPosPixel();
353 const sal_Int32 nXDiff = aPoint.X() - aControlRect.Left();
351 const Rectangle aControlRect = getControlRect();
352 const Point aPoint = rEvt.GetPosPixel();
353 const sal_Int32 nXDiff = aPoint.X() - aControlRect.Left();
354
354
355 const long nButtonLeftOffset = (nSliderXOffset - nIncDecWidth)/2;
356 const long nButtonRightOffset = (nSliderXOffset + nIncDecWidth)/2;
355 const long nButtonLeftOffset = (nSliderXOffset - nIncDecWidth)/2;
356 const long nButtonRightOffset = (nSliderXOffset + nIncDecWidth)/2;
357
357
358 const long nOldZoom = mpImpl->mnCurrentZoom;
358 const long nOldZoom = mpImpl->mnCurrentZoom;
359
359
360 // click to - button
361 if ( nXDiff >= nButtonLeftOffset && nXDiff <= nButtonRightOffset )
362 mpImpl->mnCurrentZoom = mpImpl->mnCurrentZoom - 5;
363 // click to + button
364 else if ( nXDiff >= aControlRect.GetWidth() - nSliderXOffset + nButtonLeftOffset &&
365 nXDiff <= aControlRect.GetWidth() - nSliderXOffset + nButtonRightOffset )
366 mpImpl->mnCurrentZoom = mpImpl->mnCurrentZoom + 5;
367 // click to slider
368 else if( nXDiff >= nSliderXOffset && nXDiff <= aControlRect.GetWidth() - nSliderXOffset )
369 mpImpl->mnCurrentZoom = Offset2Zoom( nXDiff );
360 // click to - button
361 if ( nXDiff >= nButtonLeftOffset && nXDiff <= nButtonRightOffset )
362 mpImpl->mnCurrentZoom = mpImpl->mnCurrentZoom - 5;
363 // click to + button
364 else if ( nXDiff >= aControlRect.GetWidth() - nSliderXOffset + nButtonLeftOffset &&
365 nXDiff <= aControlRect.GetWidth() - nSliderXOffset + nButtonRightOffset )
366 mpImpl->mnCurrentZoom = mpImpl->mnCurrentZoom + 5;
367 // click to slider
368 else if( nXDiff >= nSliderXOffset && nXDiff <= aControlRect.GetWidth() - nSliderXOffset )
369 mpImpl->mnCurrentZoom = Offset2Zoom( nXDiff );
370
370
371 if ( mpImpl->mnCurrentZoom < mpImpl->mnMinZoom )
372 mpImpl->mnCurrentZoom = mpImpl->mnMinZoom;
373 else if ( mpImpl->mnCurrentZoom > mpImpl->mnMaxZoom )
374 mpImpl->mnCurrentZoom = mpImpl->mnMaxZoom;
371 if ( mpImpl->mnCurrentZoom < mpImpl->mnMinZoom )
372 mpImpl->mnCurrentZoom = mpImpl->mnMinZoom;
373 else if ( mpImpl->mnCurrentZoom > mpImpl->mnMaxZoom )
374 mpImpl->mnCurrentZoom = mpImpl->mnMaxZoom;
375
375
376 if ( nOldZoom == mpImpl->mnCurrentZoom )
377 return sal_True;
376 if ( nOldZoom == mpImpl->mnCurrentZoom )
377 return sal_True;
378
378
379 if ( GetStatusBar().AreItemsVisible() )
380 GetStatusBar().SetItemData( GetId(), 0 ); // force repaint
379 if ( GetStatusBar().AreItemsVisible() )
380 GetStatusBar().SetItemData( GetId(), 0 ); // force repaint
381
381
382 mpImpl->mbOmitPaint = true; // optimization: paint before executing command,
383 // then omit painting which is triggered by the execute function
382 mpImpl->mbOmitPaint = true; // optimization: paint before executing command,
383 // then omit painting which is triggered by the execute function
384
384
385 SvxZoomSliderItem aZoomSliderItem( mpImpl->mnCurrentZoom );
385 SvxZoomSliderItem aZoomSliderItem( mpImpl->mnCurrentZoom );
386
386
387 ::com::sun::star::uno::Any a;
388 aZoomSliderItem.QueryValue( a );
387 ::com::sun::star::uno::Any a;
388 aZoomSliderItem.QueryValue( a );
389
389
390 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > aArgs( 1 );
391 aArgs[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ZoomSlider" ));
392 aArgs[0].Value = a;
390 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > aArgs( 1 );
391 aArgs[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ZoomSlider" ));
392 aArgs[0].Value = a;
393
393
394 execute( aArgs );
394 execute( aArgs );
395
395
396 mpImpl->mbOmitPaint = false;
396 mpImpl->mbOmitPaint = false;
397
397
398 return sal_True;
398 return sal_True;
399}
400
401// -----------------------------------------------------------------------
402
403sal_Bool SvxZoomSliderControl::MouseMove( const MouseEvent & rEvt )
404{
399}
400
401// -----------------------------------------------------------------------
402
403sal_Bool SvxZoomSliderControl::MouseMove( const MouseEvent & rEvt )
404{
405 if ( !mpImpl->mbValuesSet )
406 return sal_True;;
405 if ( !mpImpl->mbValuesSet )
406 return sal_True;;
407
407
408 const short nButtons = rEvt.GetButtons();
408 const short nButtons = rEvt.GetButtons();
409
409
410 // check mouse move with button pressed
411 if ( 1 == nButtons )
412 {
413 const Rectangle aControlRect = getControlRect();
414 const Point aPoint = rEvt.GetPosPixel();
415 const sal_Int32 nXDiff = aPoint.X() - aControlRect.Left();
410 // check mouse move with button pressed
411 if ( 1 == nButtons )
412 {
413 const Rectangle aControlRect = getControlRect();
414 const Point aPoint = rEvt.GetPosPixel();
415 const sal_Int32 nXDiff = aPoint.X() - aControlRect.Left();
416
416
417 if ( nXDiff >= nSliderXOffset && nXDiff <= aControlRect.GetWidth() - nSliderXOffset )
418 {
419 mpImpl->mnCurrentZoom = Offset2Zoom( nXDiff );
417 if ( nXDiff >= nSliderXOffset && nXDiff <= aControlRect.GetWidth() - nSliderXOffset )
418 {
419 mpImpl->mnCurrentZoom = Offset2Zoom( nXDiff );
420
420
421 if ( GetStatusBar().AreItemsVisible() )
422 GetStatusBar().SetItemData( GetId(), 0 ); // force repaint
421 if ( GetStatusBar().AreItemsVisible() )
422 GetStatusBar().SetItemData( GetId(), 0 ); // force repaint
423
423
424 mpImpl->mbOmitPaint = true; // optimization: paint before executing command,
425 // then omit painting which is triggered by the execute function
424 mpImpl->mbOmitPaint = true; // optimization: paint before executing command,
425 // then omit painting which is triggered by the execute function
426
426
427 // commit state change
428 SvxZoomSliderItem aZoomSliderItem( mpImpl->mnCurrentZoom );
427 // commit state change
428 SvxZoomSliderItem aZoomSliderItem( mpImpl->mnCurrentZoom );
429
429
430 ::com::sun::star::uno::Any a;
431 aZoomSliderItem.QueryValue( a );
430 ::com::sun::star::uno::Any a;
431 aZoomSliderItem.QueryValue( a );
432
432
433 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > aArgs( 1 );
434 aArgs[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ZoomSlider" ));
435 aArgs[0].Value = a;
433 ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > aArgs( 1 );
434 aArgs[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ZoomSlider" ));
435 aArgs[0].Value = a;
436
436
437 execute( aArgs );
437 execute( aArgs );
438
438
439 mpImpl->mbOmitPaint = false;
440 }
441 }
439 mpImpl->mbOmitPaint = false;
440 }
441 }
442
442
443 return sal_True;
443 return sal_True;
444}
444}
445
446/* vim: set noet sw=4 ts=4: */