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 :
20 :
21 : #include <svtools/ivctrl.hxx>
22 : #include "imivctl.hxx"
23 : #include <vcl/bitmapex.hxx>
24 : #include <vcl/controllayout.hxx>
25 : #include <vcl/mnemonic.hxx>
26 : using namespace ::com::sun::star::accessibility;
27 :
28 : /*****************************************************************************
29 : |
30 : | class : SvxIconChoiceCtrlEntry
31 : |
32 : \*****************************************************************************/
33 :
34 0 : SvxIconChoiceCtrlEntry::SvxIconChoiceCtrlEntry( const String& rText, const Image& rImage, sal_uInt16 _nFlags )
35 : {
36 0 : aText = rText;
37 0 : aImage = rImage;
38 0 : pUserData = NULL;
39 :
40 0 : nFlags = _nFlags;
41 0 : eTextMode = IcnShowTextShort;
42 0 : pblink = 0;
43 0 : pflink = 0;
44 0 : }
45 :
46 0 : String SvxIconChoiceCtrlEntry::GetDisplayText() const
47 : {
48 0 : return MnemonicGenerator::EraseAllMnemonicChars( aText );
49 : }
50 :
51 : // ----------------------------------------------------------------------------
52 :
53 0 : SvxIconChoiceCtrlColumnInfo::SvxIconChoiceCtrlColumnInfo( const SvxIconChoiceCtrlColumnInfo& rInfo )
54 0 : : aColText( rInfo.aColText ), aColImage( rInfo.aColImage )
55 : {
56 0 : nWidth = rInfo.nWidth;
57 0 : eAlignment = rInfo.eAlignment;
58 0 : nSubItem = rInfo.nSubItem;
59 0 : }
60 :
61 : /*****************************************************************************
62 : |
63 : | class : SvtIconChoiceCtrl
64 : |
65 : \*****************************************************************************/
66 :
67 0 : SvtIconChoiceCtrl::SvtIconChoiceCtrl( Window* pParent, WinBits nWinStyle ) :
68 :
69 : // WB_CLIPCHILDREN on, as ScrollBars lie on the window!
70 : Control( pParent, nWinStyle | WB_CLIPCHILDREN ),
71 :
72 : _pCurKeyEvent ( NULL ),
73 0 : _pImp ( new SvxIconChoiceCtrl_Impl( this, nWinStyle ) ),
74 0 : _bAutoFontColor ( sal_False )
75 :
76 : {
77 0 : SetLineColor();
78 0 : _pImp->SetGrid( Size( 100, 70 ) );
79 0 : _pImp->InitSettings();
80 0 : _pImp->SetPositionMode( IcnViewPositionModeAutoArrange );
81 0 : }
82 :
83 0 : SvtIconChoiceCtrl::~SvtIconChoiceCtrl()
84 : {
85 0 : _pImp->CallEventListeners( VCLEVENT_OBJECT_DYING );
86 0 : delete _pImp;
87 0 : }
88 :
89 0 : SvxIconChoiceCtrlEntry* SvtIconChoiceCtrl::InsertEntry( const String& rText, const Image& rImage, sal_uLong nPos, const Point* pPos, sal_uInt16 nFlags )
90 : {
91 0 : SvxIconChoiceCtrlEntry* pEntry = new SvxIconChoiceCtrlEntry( rText, rImage, nFlags);
92 :
93 0 : _pImp->InsertEntry( pEntry, nPos, pPos );
94 :
95 0 : return pEntry;
96 : }
97 :
98 0 : sal_Bool SvtIconChoiceCtrl::EditedEntry( SvxIconChoiceCtrlEntry*, const rtl::OUString&, sal_Bool )
99 : {
100 0 : return sal_True;
101 : }
102 :
103 0 : sal_Bool SvtIconChoiceCtrl::EditingEntry( SvxIconChoiceCtrlEntry* )
104 : {
105 0 : return sal_True;
106 : }
107 :
108 0 : void SvtIconChoiceCtrl::DrawEntryImage( SvxIconChoiceCtrlEntry* pEntry, const Point& rPos, OutputDevice& rDev )
109 : {
110 0 : rDev.DrawImage( rPos, pEntry->GetImage() );
111 0 : }
112 :
113 0 : String SvtIconChoiceCtrl::GetEntryText( SvxIconChoiceCtrlEntry* pEntry, sal_Bool )
114 : {
115 0 : return pEntry->GetText();
116 : }
117 :
118 0 : sal_Bool SvtIconChoiceCtrl::HasBackground() const
119 : {
120 0 : return sal_False;
121 : }
122 :
123 0 : sal_Bool SvtIconChoiceCtrl::HasFont() const
124 : {
125 0 : return sal_False;
126 : }
127 :
128 0 : sal_Bool SvtIconChoiceCtrl::HasFontTextColor() const
129 : {
130 0 : return sal_True;
131 : }
132 :
133 0 : sal_Bool SvtIconChoiceCtrl::HasFontFillColor() const
134 : {
135 0 : return sal_True;
136 : }
137 :
138 0 : void SvtIconChoiceCtrl::Paint( const Rectangle& rRect )
139 : {
140 0 : _pImp->Paint( rRect );
141 0 : }
142 :
143 0 : void SvtIconChoiceCtrl::MouseButtonDown( const MouseEvent& rMEvt )
144 : {
145 0 : if( !_pImp->MouseButtonDown( rMEvt ) )
146 0 : Control::MouseButtonDown( rMEvt );
147 0 : }
148 :
149 0 : void SvtIconChoiceCtrl::MouseButtonUp( const MouseEvent& rMEvt )
150 : {
151 0 : if( !_pImp->MouseButtonUp( rMEvt ) )
152 0 : Control::MouseButtonUp( rMEvt );
153 0 : }
154 :
155 0 : void SvtIconChoiceCtrl::MouseMove( const MouseEvent& rMEvt )
156 : {
157 0 : if( !_pImp->MouseMove( rMEvt ) )
158 0 : Control::MouseMove( rMEvt );
159 0 : }
160 0 : void SvtIconChoiceCtrl::ArrangeIcons()
161 : {
162 0 : if ( GetStyle() & WB_ALIGN_TOP )
163 : {
164 0 : Size aFullSize;
165 0 : Rectangle aEntryRect;
166 :
167 0 : for ( sal_uLong i = 0; i < GetEntryCount(); i++ )
168 : {
169 0 : SvxIconChoiceCtrlEntry* pEntry = GetEntry ( i );
170 0 : aEntryRect = _pImp->GetEntryBoundRect ( pEntry );
171 :
172 0 : aFullSize.setWidth ( aFullSize.getWidth()+aEntryRect.GetWidth() );
173 : }
174 :
175 0 : _pImp->Arrange ( sal_False, aFullSize.getWidth() );
176 : }
177 0 : else if ( GetStyle() & WB_ALIGN_LEFT )
178 : {
179 0 : Size aFullSize;
180 0 : Rectangle aEntryRect;
181 :
182 0 : for ( sal_uLong i = 0; i < GetEntryCount(); i++ )
183 : {
184 0 : SvxIconChoiceCtrlEntry* pEntry = GetEntry ( i );
185 0 : aEntryRect = _pImp->GetEntryBoundRect ( pEntry );
186 :
187 0 : aFullSize.setHeight ( aFullSize.getHeight()+aEntryRect.GetHeight() );
188 : }
189 :
190 0 : _pImp->Arrange ( sal_False, 0, aFullSize.getHeight() );
191 : }
192 : else
193 : {
194 0 : _pImp->Arrange();
195 : }
196 0 : _pImp->Arrange( sal_False, 0, 1000 );
197 0 : }
198 0 : void SvtIconChoiceCtrl::Resize()
199 : {
200 0 : _pImp->Resize();
201 0 : Control::Resize();
202 0 : }
203 :
204 0 : Point SvtIconChoiceCtrl::GetPixelPos( const Point& rPosLogic ) const
205 : {
206 0 : Point aPos( rPosLogic );
207 0 : aPos += GetMapMode().GetOrigin();
208 0 : return aPos;
209 : }
210 :
211 0 : void SvtIconChoiceCtrl::DocumentRectChanged()
212 : {
213 0 : _aDocRectChangedHdl.Call( this );
214 0 : }
215 :
216 0 : void SvtIconChoiceCtrl::VisibleRectChanged()
217 : {
218 0 : _aVisRectChangedHdl.Call( this );
219 0 : }
220 :
221 0 : void SvtIconChoiceCtrl::GetFocus()
222 : {
223 0 : _pImp->GetFocus();
224 0 : Control::GetFocus();
225 : sal_uLong nPos;
226 0 : SvxIconChoiceCtrlEntry* pSelectedEntry = GetSelectedEntry ( nPos );
227 0 : if ( pSelectedEntry )
228 0 : _pImp->CallEventListeners( VCLEVENT_LISTBOX_SELECT, pSelectedEntry );
229 0 : }
230 :
231 0 : void SvtIconChoiceCtrl::LoseFocus()
232 : {
233 0 : _pImp->LoseFocus();
234 0 : Control::LoseFocus();
235 0 : }
236 :
237 0 : void SvtIconChoiceCtrl::SetFont( const Font& rFont )
238 : {
239 0 : if( rFont != GetFont() )
240 : {
241 0 : Control::SetFont( rFont );
242 0 : _pImp->FontModified();
243 : }
244 0 : }
245 :
246 0 : void SvtIconChoiceCtrl::SetPointFont( const Font& rFont )
247 : {
248 0 : if( rFont != GetPointFont() )
249 : {
250 0 : Control::SetPointFont( rFont );
251 0 : _pImp->FontModified();
252 : }
253 0 : }
254 0 : SvxIconChoiceCtrlEntry* SvtIconChoiceCtrl::GetEntry( const Point& rPixPos, sal_Bool bHit ) const
255 : {
256 0 : Point aPos( rPixPos );
257 0 : aPos -= GetMapMode().GetOrigin();
258 0 : return ((SvtIconChoiceCtrl*)this)->_pImp->GetEntry( aPos, bHit );
259 : }
260 :
261 0 : void SvtIconChoiceCtrl::SetStyle( WinBits nWinStyle )
262 : {
263 0 : _pImp->SetStyle( nWinStyle );
264 0 : }
265 :
266 0 : WinBits SvtIconChoiceCtrl::GetStyle() const
267 : {
268 0 : return _pImp->GetStyle();
269 : }
270 0 : void SvtIconChoiceCtrl::Command( const CommandEvent& rCEvt )
271 : {
272 0 : _pImp->Command( rCEvt );
273 0 : }
274 :
275 0 : void SvtIconChoiceCtrl::SetEntryTextMode( SvxIconChoiceCtrlTextMode eMode, SvxIconChoiceCtrlEntry* pEntry )
276 : {
277 0 : _pImp->SetEntryTextMode( eMode, pEntry );
278 0 : }
279 :
280 0 : sal_uLong SvtIconChoiceCtrl::GetEntryCount() const
281 : {
282 0 : return _pImp->GetEntryCount();
283 : }
284 :
285 0 : SvxIconChoiceCtrlEntry* SvtIconChoiceCtrl::GetEntry( sal_uLong nPos ) const
286 : {
287 0 : return _pImp->GetEntry( nPos );
288 : }
289 :
290 0 : void SvtIconChoiceCtrl::CreateAutoMnemonics( MnemonicGenerator& _rUsedMnemonics )
291 : {
292 0 : _pImp->CreateAutoMnemonics( &_rUsedMnemonics );
293 0 : }
294 :
295 0 : void SvtIconChoiceCtrl::CreateAutoMnemonics( void )
296 : {
297 0 : _pImp->CreateAutoMnemonics();
298 0 : }
299 :
300 0 : SvxIconChoiceCtrlEntry* SvtIconChoiceCtrl::GetSelectedEntry( sal_uLong& rPos ) const
301 : {
302 0 : return _pImp->GetFirstSelectedEntry( rPos );
303 : }
304 :
305 0 : void SvtIconChoiceCtrl::ClickIcon()
306 : {
307 : sal_uLong nPos;
308 0 : GetSelectedEntry ( nPos );
309 0 : _aClickIconHdl.Call( this );
310 0 : }
311 0 : sal_Bool SvtIconChoiceCtrl::IsEntryEditing() const
312 : {
313 0 : return _pImp->IsEntryEditing();
314 : }
315 :
316 0 : sal_Bool SvtIconChoiceCtrl::SetChoiceWithCursor ( sal_Bool bDo )
317 : {
318 0 : return _pImp->SetChoiceWithCursor (bDo);
319 : }
320 :
321 0 : void SvtIconChoiceCtrl::KeyInput( const KeyEvent& rKEvt )
322 : {
323 0 : sal_Bool bKeyUsed = DoKeyInput( rKEvt );
324 0 : if ( !bKeyUsed )
325 : {
326 0 : _pCurKeyEvent = (KeyEvent*)&rKEvt;
327 0 : Control::KeyInput( rKEvt );
328 0 : _pCurKeyEvent = NULL;
329 : }
330 0 : }
331 0 : sal_Bool SvtIconChoiceCtrl::DoKeyInput( const KeyEvent& rKEvt )
332 : {
333 : // under OS/2, we get key up/down even while editing
334 0 : if( IsEntryEditing() )
335 0 : return sal_True;
336 0 : _pCurKeyEvent = (KeyEvent*)&rKEvt;
337 0 : sal_Bool bHandled = _pImp->KeyInput( rKEvt );
338 0 : _pCurKeyEvent = NULL;
339 0 : return bHandled;
340 : }
341 0 : sal_uLong SvtIconChoiceCtrl::GetEntryListPos( SvxIconChoiceCtrlEntry* pEntry ) const
342 : {
343 0 : return _pImp->GetEntryListPos( pEntry );
344 : }
345 0 : SvxIconChoiceCtrlEntry* SvtIconChoiceCtrl::GetCursor( ) const
346 : {
347 0 : return _pImp->GetCurEntry( );
348 : }
349 0 : void SvtIconChoiceCtrl::SetCursor( SvxIconChoiceCtrlEntry* pEntry )
350 : {
351 0 : _pImp->SetCursor( pEntry );
352 0 : }
353 0 : void SvtIconChoiceCtrl::InvalidateEntry( SvxIconChoiceCtrlEntry* pEntry )
354 : {
355 0 : _pImp->InvalidateEntry( pEntry );
356 0 : }
357 :
358 0 : void SvtIconChoiceCtrl::StateChanged( StateChangedType nType )
359 : {
360 0 : Control::StateChanged( nType );
361 0 : }
362 :
363 :
364 0 : void SvtIconChoiceCtrl::DataChanged( const DataChangedEvent& rDCEvt )
365 : {
366 0 : if ( ((rDCEvt.GetType() == DATACHANGED_SETTINGS) ||
367 0 : (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
368 0 : (rDCEvt.GetType() == DATACHANGED_FONTS) ) &&
369 0 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
370 : {
371 0 : _pImp->InitSettings();
372 0 : Invalidate(INVALIDATE_NOCHILDREN);
373 : }
374 : else
375 0 : Control::DataChanged( rDCEvt );
376 0 : }
377 :
378 0 : void SvtIconChoiceCtrl::SetBackground( const Wallpaper& rPaper )
379 : {
380 0 : if( rPaper != GetBackground() )
381 : {
382 0 : const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
383 0 : Wallpaper aEmpty;
384 0 : if( rPaper == aEmpty )
385 0 : Control::SetBackground( rStyleSettings.GetFieldColor() );
386 : else
387 : {
388 0 : Wallpaper aBackground( rPaper );
389 : // HACK, as background might be transparent!
390 0 : if( !aBackground.IsBitmap() )
391 0 : aBackground.SetStyle( WALLPAPER_TILE );
392 :
393 0 : WallpaperStyle eStyle = aBackground.GetStyle();
394 0 : Color aBack( aBackground.GetColor());
395 0 : Color aTrans( COL_TRANSPARENT );
396 0 : if( aBack == aTrans && (
397 0 : (!aBackground.IsBitmap() ||
398 0 : aBackground.GetBitmap().IsTransparent() ||
399 : (eStyle != WALLPAPER_TILE && eStyle != WALLPAPER_SCALE))))
400 : {
401 0 : aBackground.SetColor( rStyleSettings.GetFieldColor() );
402 : }
403 0 : if( aBackground.IsScrollable() )
404 : {
405 0 : Rectangle aRect;
406 0 : aRect.SetSize( Size(32765, 32765) );
407 0 : aBackground.SetRect( aRect );
408 : }
409 : else
410 : {
411 0 : Rectangle aRect( _pImp->GetOutputRect() );
412 0 : aBackground.SetRect( aRect );
413 : }
414 0 : Control::SetBackground( aBackground );
415 : }
416 :
417 : // If text colors are attributed "hard," don't use automatism to select
418 : // a readable text color.
419 0 : Font aFont( GetFont() );
420 0 : aFont.SetColor( rStyleSettings.GetFieldTextColor() );
421 0 : SetFont( aFont );
422 :
423 0 : Invalidate(INVALIDATE_NOCHILDREN);
424 : }
425 0 : }
426 :
427 0 : void SvtIconChoiceCtrl::RequestHelp( const HelpEvent& rHEvt )
428 : {
429 0 : if ( !_pImp->RequestHelp( rHEvt ) )
430 0 : Control::RequestHelp( rHEvt );
431 0 : }
432 :
433 0 : void SvtIconChoiceCtrl::SetSelectionMode( SelectionMode eMode )
434 : {
435 0 : _pImp->SetSelectionMode( eMode );
436 0 : }
437 :
438 0 : Rectangle SvtIconChoiceCtrl::GetBoundingBox( SvxIconChoiceCtrlEntry* pEntry ) const
439 : {
440 0 : return _pImp->GetEntryBoundRect( pEntry );
441 : }
442 :
443 0 : void SvtIconChoiceCtrl::FillLayoutData() const
444 : {
445 0 : CreateLayoutData();
446 :
447 0 : SvtIconChoiceCtrl* pNonConstMe = const_cast< SvtIconChoiceCtrl* >( this );
448 :
449 : // loop through all entries
450 0 : sal_uInt16 nCount = (sal_uInt16)GetEntryCount();
451 0 : sal_uInt16 nPos = 0;
452 0 : while ( nPos < nCount )
453 : {
454 0 : SvxIconChoiceCtrlEntry* pEntry = GetEntry( nPos );
455 :
456 0 : Point aPos = _pImp->GetEntryBoundRect( pEntry ).TopLeft();
457 0 : String sEntryText = pEntry->GetDisplayText( );
458 0 : Rectangle aTextRect = _pImp->CalcTextRect( pEntry, &aPos, sal_False, &sEntryText );
459 :
460 0 : sal_Bool bLargeIconMode = WB_ICON == ( _pImp->GetStyle() & ( VIEWMODE_MASK ) );
461 0 : sal_uInt16 nTextPaintFlags = bLargeIconMode ? PAINTFLAG_HOR_CENTERED : PAINTFLAG_VER_CENTERED;
462 :
463 0 : _pImp->PaintItem( aTextRect, IcnViewFieldTypeText, pEntry, nTextPaintFlags, pNonConstMe, &sEntryText, GetLayoutData() );
464 :
465 0 : ++nPos;
466 0 : }
467 0 : }
468 :
469 0 : Rectangle SvtIconChoiceCtrl::GetEntryCharacterBounds( const sal_Int32 _nEntryPos, const sal_Int32 _nCharacterIndex ) const
470 : {
471 0 : Rectangle aRect;
472 :
473 0 : Pair aEntryCharacterRange = GetLineStartEnd( _nEntryPos );
474 0 : if ( aEntryCharacterRange.A() + _nCharacterIndex < aEntryCharacterRange.B() )
475 : {
476 0 : aRect = GetCharacterBounds( aEntryCharacterRange.A() + _nCharacterIndex );
477 : }
478 :
479 0 : return aRect;
480 : }
481 :
482 0 : void SvtIconChoiceCtrl::SetNoSelection()
483 : {
484 0 : _pImp->SetNoSelection();
485 0 : }
486 :
487 0 : void SvtIconChoiceCtrl::CallImplEventListeners(sal_uLong nEvent, void* pData)
488 : {
489 0 : CallEventListeners(nEvent, pData);
490 0 : }
491 0 : ::com::sun::star::uno::Reference< XAccessible > SvtIconChoiceCtrl::CreateAccessible()
492 : {
493 0 : Window* pParent = GetAccessibleParentWindow();
494 : DBG_ASSERT( pParent, "SvTreeListBox::CreateAccessible - accessible parent not found" );
495 :
496 0 : ::com::sun::star::uno::Reference< XAccessible > xAccessible;
497 0 : if ( pParent )
498 : {
499 0 : ::com::sun::star::uno::Reference< XAccessible > xAccParent = pParent->GetAccessible();
500 0 : if ( xAccParent.is() )
501 : {
502 0 : ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > xTemp(GetComponentInterface());
503 0 : xAccessible = _pImp->GetAccessibleFactory().createAccessibleIconChoiceCtrl( *this, xAccParent );
504 0 : }
505 : }
506 0 : return xAccessible;
507 : }
508 :
509 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|