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 <vcl/svapp.hxx>
22 : #include <sfx2/viewfrm.hxx>
23 : #include <sfx2/dispatch.hxx>
24 : #include <avmedia/mediaplayer.hxx>
25 : #include "helpid.hrc"
26 : #include "galbrws2.hxx"
27 : #include "svx/galtheme.hxx"
28 : #include "svx/galmisc.hxx"
29 : #include "svx/galctrl.hxx"
30 : #include "editeng/AccessibleStringWrap.hxx"
31 : #include <editeng/svxfont.hxx>
32 : #include "galobj.hxx"
33 : #include <avmedia/mediawindow.hxx>
34 : #include "gallery.hrc"
35 : #include <svtools/filter.hxx>
36 :
37 : // -----------
38 : // - Defines -
39 : // -----------
40 :
41 : #define GALLERY_BRWBOX_TITLE 1
42 : #define GALLERY_BRWBOX_PATH 2
43 :
44 : // ------------------
45 : // - GalleryPreview -
46 : // ------------------
47 : DBG_NAME(GalleryPreview)
48 :
49 0 : GalleryPreview::GalleryPreview( GalleryBrowser2* pParent, GalleryTheme* pTheme ) :
50 : Window( pParent, WB_TABSTOP | WB_BORDER ),
51 : DropTargetHelper( this ),
52 : DragSourceHelper( this ),
53 0 : mpTheme( pTheme )
54 : {
55 : DBG_CTOR(GalleryPreview,NULL);
56 :
57 0 : SetHelpId( HID_GALLERY_WINDOW );
58 0 : InitSettings();
59 0 : }
60 :
61 : // ------------------------------------------------------------------------
62 :
63 0 : GalleryPreview::GalleryPreview( Window* pParent, const ResId & rResId ) :
64 : Window( pParent, rResId ),
65 : DropTargetHelper( this ),
66 : DragSourceHelper( this ),
67 0 : mpTheme( NULL )
68 : {
69 : DBG_CTOR(GalleryPreview,NULL);
70 :
71 0 : SetHelpId( HID_GALLERY_PREVIEW );
72 0 : InitSettings();
73 0 : }
74 :
75 : // ------------------------------------------------------------------------
76 :
77 0 : GalleryPreview::~GalleryPreview()
78 : {
79 : DBG_DTOR(GalleryPreview,NULL);
80 0 : }
81 :
82 :
83 0 : bool GalleryPreview::SetGraphic( const INetURLObject& _aURL )
84 : {
85 0 : bool bRet = true;
86 0 : Graphic aGraphic;
87 0 : if( ::avmedia::MediaWindow::isMediaURL( _aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ) ) )
88 : {
89 0 : aGraphic = BitmapEx( GAL_RES( RID_SVXBMP_GALLERY_MEDIA ) );
90 : }
91 : else
92 : {
93 0 : GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
94 0 : GalleryProgress aProgress( &rFilter );
95 0 : if( rFilter.ImportGraphic( aGraphic, _aURL, GRFILTER_FORMAT_DONTKNOW ) )
96 0 : bRet = false;
97 : }
98 :
99 0 : SetGraphic( aGraphic );
100 0 : Invalidate();
101 0 : return bRet;
102 : }
103 :
104 : // ------------------------------------------------------------------------
105 :
106 0 : void GalleryPreview::InitSettings()
107 : {
108 0 : SetBackground( Wallpaper( GALLERY_BG_COLOR ) );
109 0 : SetControlBackground( GALLERY_BG_COLOR );
110 0 : SetControlForeground( GALLERY_FG_COLOR );
111 0 : }
112 :
113 : // -----------------------------------------------------------------------
114 :
115 0 : void GalleryPreview::DataChanged( const DataChangedEvent& rDCEvt )
116 : {
117 0 : if ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
118 0 : InitSettings();
119 : else
120 0 : Window::DataChanged( rDCEvt );
121 0 : }
122 :
123 : // ------------------------------------------------------------------------
124 :
125 0 : sal_Bool GalleryPreview::ImplGetGraphicCenterRect( const Graphic& rGraphic, Rectangle& rResultRect ) const
126 : {
127 0 : const Size aWinSize( GetOutputSizePixel() );
128 0 : Size aNewSize( LogicToPixel( rGraphic.GetPrefSize(), rGraphic.GetPrefMapMode() ) );
129 0 : sal_Bool bRet = sal_False;
130 :
131 0 : if( aNewSize.Width() && aNewSize.Height() )
132 : {
133 : // scale to fit window
134 0 : const double fGrfWH = (double) aNewSize.Width() / aNewSize.Height();
135 0 : const double fWinWH = (double) aWinSize.Width() / aWinSize.Height();
136 :
137 0 : if ( fGrfWH < fWinWH )
138 : {
139 0 : aNewSize.Width() = (long) ( aWinSize.Height() * fGrfWH );
140 0 : aNewSize.Height()= aWinSize.Height();
141 : }
142 : else
143 : {
144 0 : aNewSize.Width() = aWinSize.Width();
145 0 : aNewSize.Height()= (long) ( aWinSize.Width() / fGrfWH);
146 : }
147 :
148 0 : const Point aNewPos( ( aWinSize.Width() - aNewSize.Width() ) >> 1,
149 0 : ( aWinSize.Height() - aNewSize.Height() ) >> 1 );
150 :
151 0 : rResultRect = Rectangle( aNewPos, aNewSize );
152 0 : bRet = sal_True;
153 : }
154 :
155 0 : return bRet;
156 : }
157 :
158 : // ------------------------------------------------------------------------
159 :
160 0 : void GalleryPreview::Paint( const Rectangle& rRect )
161 : {
162 0 : Window::Paint( rRect );
163 :
164 0 : if( ImplGetGraphicCenterRect( aGraphicObj.GetGraphic(), aPreviewRect ) )
165 : {
166 0 : const Point aPos( aPreviewRect.TopLeft() );
167 0 : const Size aSize( aPreviewRect.GetSize() );
168 :
169 0 : if( aGraphicObj.IsAnimated() )
170 0 : aGraphicObj.StartAnimation( this, aPos, aSize );
171 : else
172 0 : aGraphicObj.Draw( this, aPos, aSize );
173 : }
174 0 : }
175 :
176 : // ------------------------------------------------------------------------
177 :
178 0 : void GalleryPreview::MouseButtonDown( const MouseEvent& rMEvt )
179 : {
180 0 : if( mpTheme && ( rMEvt.GetClicks() == 2 ) )
181 0 : ( (GalleryBrowser2*) GetParent() )->TogglePreview( this );
182 0 : }
183 :
184 : // ------------------------------------------------------------------------
185 :
186 0 : void GalleryPreview::Command(const CommandEvent& rCEvt )
187 : {
188 0 : Window::Command( rCEvt );
189 :
190 0 : if( mpTheme && ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU ) )
191 0 : ( (GalleryBrowser2*) GetParent() )->ShowContextMenu( this,
192 0 : ( rCEvt.IsMouseEvent() ? &rCEvt.GetMousePosPixel() : NULL ) );
193 0 : }
194 :
195 : // ------------------------------------------------------------------------
196 :
197 0 : void GalleryPreview::KeyInput( const KeyEvent& rKEvt )
198 : {
199 0 : if( mpTheme )
200 : {
201 0 : GalleryBrowser2* pBrowser = static_cast< GalleryBrowser2* >( GetParent() );
202 :
203 0 : switch( rKEvt.GetKeyCode().GetCode() )
204 : {
205 : case( KEY_BACKSPACE ):
206 0 : pBrowser->TogglePreview( this );
207 0 : break;
208 :
209 : case( KEY_HOME ):
210 0 : pBrowser->Travel( GALLERYBROWSERTRAVEL_FIRST );
211 0 : break;
212 :
213 : case( KEY_END ):
214 0 : pBrowser->Travel( GALLERYBROWSERTRAVEL_LAST );
215 0 : break;
216 :
217 : case( KEY_LEFT ):
218 : case( KEY_UP ):
219 0 : pBrowser->Travel( GALLERYBROWSERTRAVEL_PREVIOUS );
220 0 : break;
221 :
222 : case( KEY_RIGHT ):
223 : case( KEY_DOWN ):
224 0 : pBrowser->Travel( GALLERYBROWSERTRAVEL_NEXT );
225 0 : break;
226 :
227 : default:
228 : {
229 0 : if( !pBrowser->KeyInput( rKEvt, this ) )
230 0 : Window::KeyInput( rKEvt );
231 : }
232 0 : break;
233 : }
234 : }
235 : else
236 0 : Window::KeyInput( rKEvt );
237 0 : }
238 :
239 : // ------------------------------------------------------------------------
240 :
241 0 : sal_Int8 GalleryPreview::AcceptDrop( const AcceptDropEvent& rEvt )
242 : {
243 : sal_Int8 nRet;
244 :
245 0 : if( mpTheme )
246 0 : nRet = ( (GalleryBrowser2*) GetParent() )->AcceptDrop( *this, rEvt );
247 : else
248 0 : nRet = DND_ACTION_NONE;
249 :
250 0 : return nRet;
251 : }
252 :
253 : // ------------------------------------------------------------------------
254 :
255 0 : sal_Int8 GalleryPreview::ExecuteDrop( const ExecuteDropEvent& rEvt )
256 : {
257 : sal_Int8 nRet;
258 :
259 0 : if( mpTheme )
260 0 : nRet = ( (GalleryBrowser2*) GetParent() )->ExecuteDrop( *this, rEvt );
261 : else
262 0 : nRet = DND_ACTION_NONE;
263 :
264 0 : return nRet;
265 : }
266 :
267 : // ------------------------------------------------------------------------
268 :
269 0 : void GalleryPreview::StartDrag( sal_Int8, const Point& )
270 : {
271 0 : if( mpTheme )
272 0 : ( (GalleryBrowser2*) GetParent() )->StartDrag( this );
273 0 : }
274 :
275 : // ------------------------------------------------------------------------
276 :
277 0 : void GalleryPreview::PreviewMedia( const INetURLObject& rURL )
278 : {
279 0 : if( rURL.GetProtocol() != INET_PROT_NOT_VALID )
280 : {
281 0 : ::avmedia::MediaFloater* pFloater = AVMEDIA_MEDIAWINDOW();
282 :
283 0 : if( !pFloater )
284 : {
285 0 : SfxViewFrame::Current()->GetBindings().GetDispatcher()->Execute( SID_AVMEDIA_PLAYER, SFX_CALLMODE_SYNCHRON );
286 0 : pFloater = AVMEDIA_MEDIAWINDOW();
287 : }
288 :
289 0 : if( pFloater )
290 0 : pFloater->setURL( rURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ), true );
291 : }
292 0 : }
293 :
294 : // ------------------------------------------------------------------------
295 :
296 : // -------------------
297 : // - GalleryIconView -
298 : // -------------------
299 : DBG_NAME(GalleryIconView)
300 :
301 0 : GalleryIconView::GalleryIconView( GalleryBrowser2* pParent, GalleryTheme* pTheme ) :
302 : ValueSet( pParent, WB_TABSTOP | WB_3DLOOK | WB_BORDER | WB_ITEMBORDER | WB_DOUBLEBORDER | WB_VSCROLL | WB_FLATVALUESET ),
303 : DropTargetHelper( this ),
304 : DragSourceHelper( this ),
305 0 : mpTheme ( pTheme )
306 : {
307 : DBG_CTOR(GalleryIconView,NULL);
308 :
309 0 : EnableFullItemMode( sal_False );
310 :
311 0 : SetHelpId( HID_GALLERY_WINDOW );
312 0 : InitSettings();
313 0 : SetExtraSpacing( 2 );
314 0 : SetItemWidth( S_THUMB + 6 );
315 0 : SetItemHeight( S_THUMB + 6 );
316 0 : }
317 :
318 : // ------------------------------------------------------------------------
319 :
320 0 : GalleryIconView::~GalleryIconView()
321 : {
322 : DBG_DTOR(GalleryIconView,NULL);
323 0 : }
324 :
325 : // ------------------------------------------------------------------------
326 :
327 0 : void GalleryIconView::InitSettings()
328 : {
329 0 : SetBackground( Wallpaper( GALLERY_BG_COLOR ) );
330 0 : SetControlBackground( GALLERY_BG_COLOR );
331 0 : SetControlForeground( GALLERY_FG_COLOR );
332 0 : SetColor( GALLERY_BG_COLOR );
333 0 : }
334 :
335 : // -----------------------------------------------------------------------
336 :
337 0 : void GalleryIconView::DataChanged( const DataChangedEvent& rDCEvt )
338 : {
339 0 : if ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
340 0 : InitSettings();
341 : else
342 0 : ValueSet::DataChanged( rDCEvt );
343 0 : }
344 :
345 : // ------------------------------------------------------------------------
346 :
347 0 : void GalleryIconView::UserDraw( const UserDrawEvent& rUDEvt )
348 : {
349 0 : const sal_uInt16 nId = rUDEvt.GetItemId();
350 :
351 0 : if( nId && mpTheme )
352 : {
353 0 : SgaObject* pObj = mpTheme->AcquireObject( nId - 1 );
354 :
355 0 : if( pObj )
356 : {
357 0 : const Rectangle& rRect = rUDEvt.GetRect();
358 0 : OutputDevice* pDev = rUDEvt.GetDevice();
359 0 : Graphic aGraphic;
360 :
361 0 : if( pObj->IsThumbBitmap() )
362 : {
363 0 : Bitmap aBmp( pObj->GetThumbBmp() );
364 :
365 0 : if( pObj->GetObjKind() == SGA_OBJ_SOUND )
366 0 : aBmp.Replace( COL_LIGHTMAGENTA, COL_WHITE );
367 :
368 0 : if( ( pDev->GetBitCount() <= 8 ) && ( aBmp.GetBitCount() >= 8 ) )
369 0 : aBmp.Dither( BMP_DITHER_FLOYD );
370 :
371 0 : aGraphic = aBmp;
372 : }
373 : else
374 0 : aGraphic = pObj->GetThumbMtf();
375 :
376 0 : Size aSize( aGraphic.GetSizePixel( pDev ) );
377 :
378 0 : if ( aSize.Width() && aSize.Height() )
379 : {
380 0 : if( ( aSize.Width() > rRect.GetWidth() ) || ( aSize.Height() > rRect.GetHeight() ) )
381 : {
382 0 : Point aNewPos;
383 0 : const double fBmpWH = (double) aSize.Width() / aSize.Height();
384 0 : const double fThmpWH = (double) rRect.GetWidth() / rRect.GetHeight();
385 :
386 : // Bitmap an Thumbgroesse anpassen
387 0 : if ( fBmpWH < fThmpWH )
388 : {
389 0 : aSize.Width() = (long) ( rRect.GetHeight() * fBmpWH );
390 0 : aSize.Height()= rRect.GetHeight();
391 : }
392 : else
393 : {
394 0 : aSize.Width() = rRect.GetWidth();
395 0 : aSize.Height()= (long) ( rRect.GetWidth() / fBmpWH );
396 : }
397 : }
398 :
399 0 : const Point aPos( ( ( rRect.GetWidth() - aSize.Width() ) >> 1 ) + rRect.Left(),
400 0 : ( ( rRect.GetHeight() - aSize.Height() ) >> 1 ) + rRect.Top() );
401 :
402 0 : aGraphic.Draw( pDev, aPos, aSize );
403 : }
404 :
405 0 : SetItemText( nId, GalleryBrowser2::GetItemText( *mpTheme, *pObj, GALLERY_ITEM_TITLE) );
406 0 : mpTheme->ReleaseObject( pObj );
407 : }
408 : }
409 0 : }
410 :
411 : // ------------------------------------------------------------------------
412 :
413 0 : void GalleryIconView::MouseButtonDown( const MouseEvent& rMEvt )
414 : {
415 0 : ValueSet::MouseButtonDown( rMEvt );
416 :
417 0 : if( rMEvt.GetClicks() == 2 )
418 0 : ( (GalleryBrowser2*) GetParent() )->TogglePreview( this, &rMEvt.GetPosPixel() );
419 0 : }
420 :
421 : // ------------------------------------------------------------------------
422 :
423 0 : void GalleryIconView::Command( const CommandEvent& rCEvt )
424 : {
425 0 : ValueSet::Command( rCEvt );
426 :
427 0 : if( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
428 : {
429 0 : ( (GalleryBrowser2*) GetParent() )->ShowContextMenu( this,
430 0 : ( rCEvt.IsMouseEvent() ? &rCEvt.GetMousePosPixel() : NULL ) );
431 : }
432 0 : }
433 :
434 : // ------------------------------------------------------------------------
435 :
436 0 : void GalleryIconView::KeyInput( const KeyEvent& rKEvt )
437 : {
438 0 : if( !mpTheme || !static_cast< GalleryBrowser2* >( GetParent() )->KeyInput( rKEvt, this ) )
439 0 : ValueSet::KeyInput( rKEvt );
440 0 : }
441 :
442 : // ------------------------------------------------------------------------
443 :
444 0 : sal_Int8 GalleryIconView::AcceptDrop( const AcceptDropEvent& rEvt )
445 : {
446 0 : return( static_cast< GalleryBrowser2* >( GetParent() )->AcceptDrop( *this, rEvt ) );
447 : }
448 :
449 : // ------------------------------------------------------------------------
450 :
451 0 : sal_Int8 GalleryIconView::ExecuteDrop( const ExecuteDropEvent& rEvt )
452 : {
453 0 : return( static_cast< GalleryBrowser2* >( GetParent() )->ExecuteDrop( *this, rEvt ) );
454 : }
455 :
456 : // ------------------------------------------------------------------------
457 :
458 0 : void GalleryIconView::StartDrag( sal_Int8, const Point& )
459 : {
460 0 : const CommandEvent aEvt( GetPointerPosPixel(), COMMAND_STARTDRAG, sal_True );
461 0 : Region aRegion;
462 :
463 : // call this to initiate dragging for ValueSet
464 0 : ValueSet::StartDrag( aEvt, aRegion );
465 0 : static_cast< GalleryBrowser2* >( GetParent() )->StartDrag( this );
466 0 : }
467 :
468 : // -------------------
469 : // - GalleryListView -
470 : // -------------------
471 : DBG_NAME(GalleryListView)
472 :
473 0 : GalleryListView::GalleryListView( GalleryBrowser2* pParent, GalleryTheme* pTheme ) :
474 : BrowseBox( pParent, WB_TABSTOP | WB_3DLOOK | WB_BORDER ),
475 : mpTheme( pTheme ),
476 0 : mnCurRow( 0 )
477 : {
478 : DBG_CTOR(GalleryListView,NULL);
479 :
480 0 : SetHelpId( HID_GALLERY_WINDOW );
481 :
482 0 : InitSettings();
483 :
484 0 : SetMode( BROWSER_AUTO_VSCROLL | BROWSER_AUTOSIZE_LASTCOL );
485 0 : SetDataRowHeight( 28 );
486 0 : InsertDataColumn( GALLERY_BRWBOX_TITLE, GAL_RESSTR(RID_SVXSTR_GALLERY_TITLE), 256 );
487 0 : InsertDataColumn( GALLERY_BRWBOX_PATH, GAL_RESSTR(RID_SVXSTR_GALLERY_PATH), 256 );
488 0 : }
489 :
490 : // ------------------------------------------------------------------------
491 :
492 0 : GalleryListView::~GalleryListView()
493 : {
494 : DBG_DTOR(GalleryListView,NULL);
495 0 : }
496 :
497 : // ------------------------------------------------------------------------
498 :
499 0 : void GalleryListView::InitSettings()
500 : {
501 0 : SetBackground( Wallpaper( GALLERY_BG_COLOR ) );
502 0 : SetControlBackground( GALLERY_BG_COLOR );
503 0 : SetControlForeground( GALLERY_FG_COLOR );
504 0 : }
505 :
506 : // -----------------------------------------------------------------------
507 :
508 0 : void GalleryListView::DataChanged( const DataChangedEvent& rDCEvt )
509 : {
510 0 : if ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
511 0 : InitSettings();
512 : else
513 0 : BrowseBox::DataChanged( rDCEvt );
514 0 : }
515 :
516 : // ------------------------------------------------------------------------
517 :
518 0 : sal_Bool GalleryListView::SeekRow( long nRow )
519 : {
520 0 : mnCurRow = nRow;
521 0 : return sal_True;
522 : }
523 :
524 : // -----------------------------------------------------------------------------
525 :
526 0 : String GalleryListView::GetCellText(long _nRow, sal_uInt16 nColumnId) const
527 : {
528 0 : String sRet;
529 0 : if( mpTheme && ( _nRow < static_cast< long >( mpTheme->GetObjectCount() ) ) )
530 : {
531 0 : SgaObject* pObj = mpTheme->AcquireObject( _nRow );
532 :
533 0 : if( pObj )
534 : {
535 : sRet = GalleryBrowser2::GetItemText( *mpTheme, *pObj,
536 0 : ( GALLERY_BRWBOX_TITLE == nColumnId ) ? GALLERY_ITEM_TITLE : GALLERY_ITEM_PATH );
537 :
538 0 : mpTheme->ReleaseObject( pObj );
539 : }
540 : }
541 :
542 0 : return sRet;
543 : }
544 :
545 : // -----------------------------------------------------------------------------
546 :
547 0 : Rectangle GalleryListView::GetFieldCharacterBounds(sal_Int32 _nRow,sal_Int32 _nColumnPos,sal_Int32 nIndex)
548 : {
549 : DBG_ASSERT(_nColumnPos >= 0 && _nColumnPos <= USHRT_MAX, "GalleryListView::GetFieldCharacterBounds: _nColumnId overflow");
550 0 : Rectangle aRect;
551 0 : if ( SeekRow(_nRow) )
552 : {
553 0 : SvxFont aFont( GetFont() );
554 0 : AccessibleStringWrap aStringWrap( *this, aFont, GetCellText(_nRow, sal::static_int_cast<sal_uInt16>( GetColumnId( sal::static_int_cast<sal_uInt16>(_nColumnPos) ) ) ) );
555 :
556 : // get the bounds inside the string
557 0 : aStringWrap.GetCharacterBounds(nIndex, aRect);
558 :
559 : // offset to
560 : }
561 0 : return aRect;
562 : }
563 :
564 : // -----------------------------------------------------------------------------
565 :
566 0 : sal_Int32 GalleryListView::GetFieldIndexAtPoint(sal_Int32 _nRow,sal_Int32 _nColumnPos,const Point& _rPoint)
567 : {
568 : DBG_ASSERT(_nColumnPos >= 0 && _nColumnPos <= USHRT_MAX, "GalleryListView::GetFieldIndexAtPoint: _nColumnId overflow");
569 0 : sal_Int32 nRet = -1;
570 0 : if ( SeekRow(_nRow) )
571 : {
572 0 : SvxFont aFont( GetFont() );
573 0 : AccessibleStringWrap aStringWrap( *this, aFont, GetCellText(_nRow, sal::static_int_cast<sal_uInt16>(GetColumnId(sal::static_int_cast<sal_uInt16>(_nColumnPos)))) );
574 0 : nRet = aStringWrap.GetIndexAtPoint(_rPoint);
575 : }
576 0 : return nRet;
577 : }
578 :
579 : // ------------------------------------------------------------------------
580 :
581 0 : void GalleryListView::PaintField( OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColumnId ) const
582 : {
583 0 : rDev.Push( PUSH_CLIPREGION );
584 0 : rDev.IntersectClipRegion( rRect );
585 :
586 0 : if( mpTheme && ( mnCurRow < mpTheme->GetObjectCount() ) )
587 : {
588 0 : SgaObject* pObj = mpTheme->AcquireObject( mnCurRow );
589 :
590 0 : if( pObj )
591 : {
592 0 : const long nTextPosY = rRect.Top() + ( ( rRect.GetHeight() - rDev.GetTextHeight() ) >> 1 );
593 :
594 0 : if( GALLERY_BRWBOX_TITLE == nColumnId )
595 : {
596 0 : Rectangle aOutputRect( rRect.TopLeft(), Size( rRect.GetHeight(), rRect.GetHeight() ) );
597 0 : GraphicObject aGrfObj;
598 :
599 0 : if( pObj->GetObjKind() == SGA_OBJ_SOUND )
600 0 : aGrfObj = Graphic( BitmapEx( GAL_RES( RID_SVXBMP_GALLERY_MEDIA ) ) );
601 0 : else if( pObj->IsThumbBitmap() )
602 0 : aGrfObj = Graphic( pObj->GetThumbBmp() );
603 : else
604 0 : aGrfObj = Graphic( pObj->GetThumbMtf() );
605 :
606 0 : Size aSize( rDev.LogicToPixel( aGrfObj.GetPrefSize(), aGrfObj.GetPrefMapMode() ) );
607 :
608 0 : if( aSize.Width() && aSize.Height() )
609 : {
610 0 : if( ( aSize.Width() > aOutputRect.GetWidth() ) || ( aSize.Height() > aOutputRect.GetHeight() ) )
611 : {
612 0 : Point aNewPos;
613 0 : const double fBmpWH = (double) aSize.Width() / aSize.Height();
614 0 : const double fThmpWH = (double) aOutputRect.GetWidth() / aOutputRect.GetHeight();
615 :
616 : // Bitmap an Thumbgroesse anpassen
617 0 : if ( fBmpWH < fThmpWH )
618 : {
619 0 : aSize.Width() = (long) ( aOutputRect.GetHeight() * fBmpWH );
620 0 : aSize.Height()= aOutputRect.GetHeight();
621 : }
622 : else
623 : {
624 0 : aSize.Width() = aOutputRect.GetWidth();
625 0 : aSize.Height()= (long) ( aOutputRect.GetWidth() / fBmpWH );
626 : }
627 : }
628 :
629 0 : aSize.Width() = Max( aSize.Width(), 4L );
630 0 : aSize.Height() = Max( aSize.Height(), 4L );
631 :
632 0 : const Point aPos( ( ( aOutputRect.GetWidth() - aSize.Width() ) >> 1 ) + aOutputRect.Left(),
633 0 : ( ( aOutputRect.GetHeight() - aSize.Height() ) >> 1 ) + aOutputRect.Top() );
634 :
635 0 : aGrfObj.Draw( &rDev, aPos, aSize );
636 : }
637 :
638 0 : rDev.DrawText( Point( aOutputRect.Right() + 6, nTextPosY ), GalleryBrowser2::GetItemText( *mpTheme, *pObj, GALLERY_ITEM_TITLE ) );
639 : }
640 0 : else if( GALLERY_BRWBOX_PATH == nColumnId )
641 0 : rDev.DrawText( Point( rRect.Left(), nTextPosY ), GalleryBrowser2::GetItemText( *mpTheme, *pObj, GALLERY_ITEM_PATH ) );
642 :
643 0 : mpTheme->ReleaseObject( pObj );
644 : }
645 : }
646 :
647 0 : rDev.Pop();
648 0 : }
649 :
650 : // ------------------------------------------------------------------------
651 :
652 0 : void GalleryListView::Command( const CommandEvent& rCEvt )
653 : {
654 0 : BrowseBox::Command( rCEvt );
655 :
656 0 : if( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
657 : {
658 0 : const Point* pPos = NULL;
659 :
660 0 : if( rCEvt.IsMouseEvent() && ( GetRowAtYPosPixel( rCEvt.GetMousePosPixel().Y() ) != BROWSER_ENDOFSELECTION ) )
661 0 : pPos = &rCEvt.GetMousePosPixel();
662 :
663 0 : ( (GalleryBrowser2*) GetParent() )->ShowContextMenu( this, pPos );
664 : }
665 0 : }
666 :
667 : // ------------------------------------------------------------------------
668 :
669 0 : void GalleryListView::KeyInput( const KeyEvent& rKEvt )
670 : {
671 0 : if( !mpTheme || !static_cast< GalleryBrowser2* >( GetParent() )->KeyInput( rKEvt, this ) )
672 0 : BrowseBox::KeyInput( rKEvt );
673 0 : }
674 :
675 : // ------------------------------------------------------------------------
676 :
677 0 : void GalleryListView::DoubleClick( const BrowserMouseEvent& rEvt )
678 : {
679 0 : BrowseBox::DoubleClick( rEvt );
680 :
681 0 : if( rEvt.GetRow() != BROWSER_ENDOFSELECTION )
682 0 : ( (GalleryBrowser2*) GetParent() )->TogglePreview( this, &rEvt.GetPosPixel() );
683 0 : }
684 :
685 : // ------------------------------------------------------------------------
686 :
687 0 : void GalleryListView::Select()
688 : {
689 0 : if( maSelectHdl.IsSet() )
690 0 : maSelectHdl.Call( this );
691 0 : }
692 :
693 : // ------------------------------------------------------------------------
694 :
695 0 : sal_Int8 GalleryListView::AcceptDrop( const BrowserAcceptDropEvent& )
696 : {
697 0 : sal_Int8 nRet = DND_ACTION_NONE;
698 :
699 0 : if( mpTheme && !mpTheme->IsReadOnly() )
700 0 : nRet = DND_ACTION_COPY;
701 :
702 0 : return nRet;
703 : }
704 :
705 : // ------------------------------------------------------------------------
706 :
707 0 : sal_Int8 GalleryListView::ExecuteDrop( const BrowserExecuteDropEvent& rEvt )
708 : {
709 0 : ExecuteDropEvent aEvt( rEvt );
710 :
711 0 : aEvt.maPosPixel.Y() += GetTitleHeight();
712 :
713 0 : return( ( (GalleryBrowser2*) GetParent() )->ExecuteDrop( *this, aEvt ) );
714 : }
715 :
716 : // ------------------------------------------------------------------------
717 :
718 0 : void GalleryListView::StartDrag( sal_Int8, const Point& rPosPixel )
719 : {
720 0 : ( (GalleryBrowser2*) GetParent() )->StartDrag( this, &rPosPixel );
721 0 : }
722 :
723 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|