1 /**************************************************************
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
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26
27 #include <vcl/svapp.hxx>
28 #include <sfx2/viewfrm.hxx>
29 #include <sfx2/dispatch.hxx>
30 #include <avmedia/mediaplayer.hxx>
31 #include "helpid.hrc"
32 #include "galbrws2.hxx"
33 #include "svx/galtheme.hxx"
34 #include "svx/galmisc.hxx"
35 #include "svx/galctrl.hxx"
36 #include "editeng/AccessibleStringWrap.hxx"
37 #include <editeng/svxfont.hxx>
38 #include "galobj.hxx"
39 #include <avmedia/mediawindow.hxx>
40 #include "gallery.hrc"
41 #include <svtools/filter.hxx>
42
43 // -----------
44 // - Defines -
45 // -----------
46
47 #define GALLERY_BRWBOX_TITLE 1
48 #define GALLERY_BRWBOX_PATH 2
49
50 // ------------------
51 // - GalleryPreview -
52 // ------------------
DBG_NAME(GalleryPreview)53 DBG_NAME(GalleryPreview)
54
55 GalleryPreview::GalleryPreview( GalleryBrowser2* pParent, GalleryTheme* pTheme ) :
56 Window( pParent, WB_TABSTOP | WB_BORDER ),
57 DropTargetHelper( this ),
58 DragSourceHelper( this ),
59 mpTheme( pTheme )
60 {
61 DBG_CTOR(GalleryPreview,NULL);
62
63 SetHelpId( HID_GALLERY_WINDOW );
64 InitSettings();
65 }
66
67 // ------------------------------------------------------------------------
68
GalleryPreview(Window * pParent,const ResId & rResId)69 GalleryPreview::GalleryPreview( Window* pParent, const ResId & rResId ) :
70 Window( pParent, rResId ),
71 DropTargetHelper( this ),
72 DragSourceHelper( this ),
73 mpTheme( NULL )
74 {
75 DBG_CTOR(GalleryPreview,NULL);
76
77 SetHelpId( HID_GALLERY_PREVIEW );
78 InitSettings();
79 }
80
81 // ------------------------------------------------------------------------
82
~GalleryPreview()83 GalleryPreview::~GalleryPreview()
84 {
85
86 DBG_DTOR(GalleryPreview,NULL);
87 }
88
89
SetGraphic(const INetURLObject & _aURL)90 bool GalleryPreview::SetGraphic( const INetURLObject& _aURL )
91 {
92 bool bRet = true;
93 Graphic aGraphic;
94 if( ::avmedia::MediaWindow::isMediaURL( _aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ) ) )
95 {
96 aGraphic = BitmapEx( GAL_RESID( RID_SVXBMP_GALLERY_MEDIA ) );
97 }
98 else
99 {
100 GraphicFilter* pFilter = GraphicFilter::GetGraphicFilter();
101 GalleryProgress aProgress( pFilter );
102 if( pFilter->ImportGraphic( aGraphic, _aURL, GRFILTER_FORMAT_DONTKNOW ) )
103 bRet = false;
104 }
105
106 SetGraphic( aGraphic );
107 Invalidate();
108 return bRet;
109 }
110
111 // ------------------------------------------------------------------------
112
InitSettings()113 void GalleryPreview::InitSettings()
114 {
115 SetBackground( Wallpaper( GALLERY_BG_COLOR ) );
116 SetControlBackground( GALLERY_BG_COLOR );
117 SetControlForeground( GALLERY_FG_COLOR );
118 }
119
120 // -----------------------------------------------------------------------
121
DataChanged(const DataChangedEvent & rDCEvt)122 void GalleryPreview::DataChanged( const DataChangedEvent& rDCEvt )
123 {
124 if ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
125 InitSettings();
126 else
127 Window::DataChanged( rDCEvt );
128 }
129
130 // ------------------------------------------------------------------------
131
ImplGetGraphicCenterRect(const Graphic & rGraphic,Rectangle & rResultRect) const132 sal_Bool GalleryPreview::ImplGetGraphicCenterRect( const Graphic& rGraphic, Rectangle& rResultRect ) const
133 {
134 const Size aWinSize( GetOutputSizePixel() );
135 Size aNewSize( LogicToPixel( rGraphic.GetPrefSize(), rGraphic.GetPrefMapMode() ) );
136 sal_Bool bRet = sal_False;
137
138 if( aNewSize.Width() && aNewSize.Height() )
139 {
140 // scale to fit window
141 const double fGrfWH = (double) aNewSize.Width() / aNewSize.Height();
142 const double fWinWH = (double) aWinSize.Width() / aWinSize.Height();
143
144 if ( fGrfWH < fWinWH )
145 {
146 aNewSize.Width() = (long) ( aWinSize.Height() * fGrfWH );
147 aNewSize.Height()= aWinSize.Height();
148 }
149 else
150 {
151 aNewSize.Width() = aWinSize.Width();
152 aNewSize.Height()= (long) ( aWinSize.Width() / fGrfWH);
153 }
154
155 const Point aNewPos( ( aWinSize.Width() - aNewSize.Width() ) >> 1,
156 ( aWinSize.Height() - aNewSize.Height() ) >> 1 );
157
158 rResultRect = Rectangle( aNewPos, aNewSize );
159 bRet = sal_True;
160 }
161
162 return bRet;
163 }
164
165 // ------------------------------------------------------------------------
166
Paint(const Rectangle & rRect)167 void GalleryPreview::Paint( const Rectangle& rRect )
168 {
169 Window::Paint( rRect );
170
171 if( ImplGetGraphicCenterRect( aGraphicObj.GetGraphic(), aPreviewRect ) )
172 {
173 const Point aPos( aPreviewRect.TopLeft() );
174 const Size aSize( aPreviewRect.GetSize() );
175
176 if( aGraphicObj.IsAnimated() )
177 aGraphicObj.StartAnimation( this, aPos, aSize );
178 else
179 aGraphicObj.Draw( this, aPos, aSize );
180 }
181 }
182
183 // ------------------------------------------------------------------------
184
MouseButtonDown(const MouseEvent & rMEvt)185 void GalleryPreview::MouseButtonDown( const MouseEvent& rMEvt )
186 {
187 if( mpTheme && ( rMEvt.GetClicks() == 2 ) )
188 ( (GalleryBrowser2*) GetParent() )->TogglePreview( this );
189 }
190
191 // ------------------------------------------------------------------------
192
Command(const CommandEvent & rCEvt)193 void GalleryPreview::Command(const CommandEvent& rCEvt )
194 {
195 Window::Command( rCEvt );
196
197 if( mpTheme && ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU ) )
198 ( (GalleryBrowser2*) GetParent() )->ShowContextMenu( this,
199 ( rCEvt.IsMouseEvent() ? &rCEvt.GetMousePosPixel() : NULL ) );
200 }
201
202 // ------------------------------------------------------------------------
203
KeyInput(const KeyEvent & rKEvt)204 void GalleryPreview::KeyInput( const KeyEvent& rKEvt )
205 {
206 if( mpTheme )
207 {
208 GalleryBrowser2* pBrowser = static_cast< GalleryBrowser2* >( GetParent() );
209
210 switch( rKEvt.GetKeyCode().GetCode() )
211 {
212 case( KEY_BACKSPACE ):
213 pBrowser->TogglePreview( this );
214 break;
215
216 case( KEY_HOME ):
217 pBrowser->Travel( GALLERYBROWSERTRAVEL_FIRST );
218 break;
219
220 case( KEY_END ):
221 pBrowser->Travel( GALLERYBROWSERTRAVEL_LAST );
222 break;
223
224 case( KEY_LEFT ):
225 case( KEY_UP ):
226 pBrowser->Travel( GALLERYBROWSERTRAVEL_PREVIOUS );
227 break;
228
229 case( KEY_RIGHT ):
230 case( KEY_DOWN ):
231 pBrowser->Travel( GALLERYBROWSERTRAVEL_NEXT );
232 break;
233
234 default:
235 {
236 if( !pBrowser->KeyInput( rKEvt, this ) )
237 Window::KeyInput( rKEvt );
238 }
239 break;
240 }
241 }
242 else
243 Window::KeyInput( rKEvt );
244 }
245
246 // ------------------------------------------------------------------------
247
AcceptDrop(const AcceptDropEvent & rEvt)248 sal_Int8 GalleryPreview::AcceptDrop( const AcceptDropEvent& rEvt )
249 {
250 sal_Int8 nRet;
251
252 if( mpTheme )
253 nRet = ( (GalleryBrowser2*) GetParent() )->AcceptDrop( *this, rEvt );
254 else
255 nRet = DND_ACTION_NONE;
256
257 return nRet;
258 }
259
260 // ------------------------------------------------------------------------
261
ExecuteDrop(const ExecuteDropEvent & rEvt)262 sal_Int8 GalleryPreview::ExecuteDrop( const ExecuteDropEvent& rEvt )
263 {
264 sal_Int8 nRet;
265
266 if( mpTheme )
267 nRet = ( (GalleryBrowser2*) GetParent() )->ExecuteDrop( *this, rEvt );
268 else
269 nRet = DND_ACTION_NONE;
270
271 return nRet;
272 }
273
274 // ------------------------------------------------------------------------
275
StartDrag(sal_Int8,const Point &)276 void GalleryPreview::StartDrag( sal_Int8, const Point& )
277 {
278 if( mpTheme )
279 ( (GalleryBrowser2*) GetParent() )->StartDrag( this );
280 }
281
282 // ------------------------------------------------------------------------
283
PreviewMedia(const INetURLObject & rURL)284 void GalleryPreview::PreviewMedia( const INetURLObject& rURL )
285 {
286 if( rURL.GetProtocol() != INET_PROT_NOT_VALID )
287 {
288 ::avmedia::MediaFloater* pFloater = AVMEDIA_MEDIAWINDOW();
289
290 if( !pFloater )
291 {
292 SfxViewFrame::Current()->GetBindings().GetDispatcher()->Execute( SID_AVMEDIA_PLAYER, SFX_CALLMODE_SYNCHRON );
293 pFloater = AVMEDIA_MEDIAWINDOW();
294 }
295
296 if( pFloater )
297 pFloater->setURL( rURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ), true );
298 }
299 }
300
301 // ------------------------------------------------------------------------
302
drawTransparenceBackground(OutputDevice & rOut,const Point & rPos,const Size & rSize)303 void drawTransparenceBackground(OutputDevice& rOut, const Point& rPos, const Size& rSize)
304 {
305 const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
306
307 if(rStyleSettings.GetPreviewUsesCheckeredBackground())
308 {
309 // draw checkered background
310 static const sal_uInt32 nLen(8);
311 static const Color aW(COL_WHITE);
312 static const Color aG(0xef, 0xef, 0xef);
313
314 rOut.DrawCheckered(rPos, rSize, nLen, aW, aG);
315 }
316 else
317 {
318 rOut.SetLineColor();
319 rOut.SetFillColor(rStyleSettings.GetFieldColor());
320 rOut.DrawRect(Rectangle(rPos, rSize));
321 }
322 }
323
324 // -------------------
325 // - GalleryIconView -
326 // -------------------
DBG_NAME(GalleryIconView)327 DBG_NAME(GalleryIconView)
328
329 GalleryIconView::GalleryIconView( GalleryBrowser2* pParent, GalleryTheme* pTheme ) :
330 ValueSet( pParent, WB_TABSTOP | WB_3DLOOK | WB_BORDER | WB_ITEMBORDER | WB_DOUBLEBORDER | WB_VSCROLL | WB_FLATVALUESET ),
331 DropTargetHelper( this ),
332 DragSourceHelper( this ),
333 mpTheme ( pTheme )
334 {
335 DBG_CTOR(GalleryIconView,NULL);
336 EnableFullItemMode( sal_False );
337
338 SetHelpId( HID_GALLERY_WINDOW );
339 InitSettings();
340 SetExtraSpacing( 2 );
341 SetItemWidth( S_THUMB + 6 );
342 SetItemHeight( S_THUMB + 6 );
343 }
344
345 // ------------------------------------------------------------------------
346
~GalleryIconView()347 GalleryIconView::~GalleryIconView()
348 {
349
350 DBG_DTOR(GalleryIconView,NULL);
351 }
352
353 // ------------------------------------------------------------------------
354
InitSettings()355 void GalleryIconView::InitSettings()
356 {
357 SetBackground( Wallpaper( GALLERY_BG_COLOR ) );
358 SetControlBackground( GALLERY_BG_COLOR );
359 SetControlForeground( GALLERY_FG_COLOR );
360 SetColor( GALLERY_BG_COLOR );
361 }
362
363 // -----------------------------------------------------------------------
364
DataChanged(const DataChangedEvent & rDCEvt)365 void GalleryIconView::DataChanged( const DataChangedEvent& rDCEvt )
366 {
367 if ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
368 InitSettings();
369 else
370 ValueSet::DataChanged( rDCEvt );
371 }
372
373 // ------------------------------------------------------------------------
374
UserDraw(const UserDrawEvent & rUDEvt)375 void GalleryIconView::UserDraw( const UserDrawEvent& rUDEvt )
376 {
377 const sal_uInt16 nId = rUDEvt.GetItemId();
378
379 if( nId && mpTheme )
380 {
381 const Rectangle& rRect = rUDEvt.GetRect();
382 const Size aSize(rRect.GetWidth(), rRect.GetHeight());
383 BitmapEx aBitmapEx;
384 Size aPreparedSize;
385 String aItemTextTitle;
386 String aItemTextPath;
387
388 mpTheme->GetPreviewBitmapExAndStrings(nId - 1, aBitmapEx, aPreparedSize, aItemTextTitle, aItemTextPath);
389
390 bool bNeedToCreate(aBitmapEx.IsEmpty());
391
392 if(!bNeedToCreate && !aItemTextTitle.Len())
393 {
394 bNeedToCreate = true;
395 }
396
397 if(!bNeedToCreate && aPreparedSize != aSize)
398 {
399 bNeedToCreate = true;
400 }
401
402 if(bNeedToCreate)
403 {
404 SgaObject* pObj = mpTheme->AcquireObject(nId - 1);
405
406 if(pObj)
407 {
408 aBitmapEx = pObj->createPreviewBitmapEx(aSize);
409 aItemTextTitle = GalleryBrowser2::GetItemText(*mpTheme, *pObj, GALLERY_ITEM_TITLE);
410
411 mpTheme->SetPreviewBitmapExAndStrings(nId - 1, aBitmapEx, aSize, aItemTextTitle, aItemTextPath);
412 mpTheme->ReleaseObject(pObj);
413 }
414 }
415
416 if(!aBitmapEx.IsEmpty())
417 {
418 const Size aBitmapExSizePixel(aBitmapEx.GetSizePixel());
419 const Point aPos(
420 ((aSize.Width() - aBitmapExSizePixel.Width()) >> 1) + rRect.Left(),
421 ((aSize.Height() - aBitmapExSizePixel.Height()) >> 1) + rRect.Top());
422 OutputDevice* pDev = rUDEvt.GetDevice();
423
424 if(aBitmapEx.IsTransparent())
425 {
426 // draw checkered background
427 drawTransparenceBackground(*pDev, aPos, aBitmapExSizePixel);
428 }
429
430 pDev->DrawBitmapEx(aPos, aBitmapEx);
431 }
432
433 SetItemText(nId, aItemTextTitle);
434
435 //SgaObject* pObj = mpTheme->AcquireObject( nId - 1 );
436 //
437 //if( pObj )
438 //{
439 // const Rectangle& rRect = rUDEvt.GetRect();
440 // const Size aSize(rRect.GetWidth(), rRect.GetHeight());
441 // const BitmapEx aBitmapEx(pObj->createPreviewBitmapEx(aSize));
442 // const Size aBitmapExSizePixel(aBitmapEx.GetSizePixel());
443 //
444 // if(!aBitmapEx.IsEmpty())
445 // {
446 // const Point aPos(
447 // ((aSize.Width() - aBitmapExSizePixel.Width()) >> 1) + rRect.Left(),
448 // ((aSize.Height() - aBitmapExSizePixel.Height()) >> 1) + rRect.Top());
449 // OutputDevice* pDev = rUDEvt.GetDevice();
450 //
451 // if(aBitmapEx.IsTransparent())
452 // {
453 // // draw checkered background
454 // drawTransparenceBackground(*pDev, aPos, aBitmapExSizePixel);
455 // }
456 //
457 // pDev->DrawBitmapEx(aPos, aBitmapEx);
458 // }
459 //
460 // //const Rectangle& rRect = rUDEvt.GetRect();
461 // //OutputDevice* pDev = rUDEvt.GetDevice();
462 // //Graphic aGraphic;
463 // //bool bTransparent(false);
464 // //
465 // //if( pObj->IsThumbBitmap() )
466 // //{
467 // // BitmapEx aBitmapEx;
468 // //
469 // // if( pObj->GetObjKind() == SGA_OBJ_SOUND )
470 // // {
471 // // Bitmap aTemp = pObj->GetThumbBmp().GetBitmap();
472 // //
473 // // aTemp.Replace( COL_LIGHTMAGENTA, COL_WHITE );
474 // // aBitmapEx = BitmapEx(aTemp);
475 // // }
476 // // else
477 // // {
478 // // aBitmapEx = pObj->GetThumbBmp();
479 // // bTransparent = aBitmapEx.IsTransparent();
480 // // }
481 // //
482 // // if( ( pDev->GetBitCount() <= 8 ) && ( aBitmapEx.GetBitCount() >= 8 ) )
483 // // {
484 // // aBitmapEx.Dither( BMP_DITHER_FLOYD );
485 // // }
486 // //
487 // // aGraphic = aBitmapEx;
488 // //}
489 // //else
490 // //{
491 // // aGraphic = pObj->GetThumbMtf();
492 // // bTransparent = true;
493 // //}
494 // //
495 // //Size aSize( aGraphic.GetSizePixel( pDev ) );
496 // //
497 // //if ( aSize.Width() && aSize.Height() )
498 // //{
499 // // if( ( aSize.Width() > rRect.GetWidth() ) || ( aSize.Height() > rRect.GetHeight() ) )
500 // // {
501 // // Point aNewPos;
502 // // const double fBmpWH = (double) aSize.Width() / aSize.Height();
503 // // const double fThmpWH = (double) rRect.GetWidth() / rRect.GetHeight();
504 // //
505 // // // Bitmap an Thumbgroesse anpassen
506 // // if ( fBmpWH < fThmpWH )
507 // // {
508 // // aSize.Width() = (long) ( rRect.GetHeight() * fBmpWH );
509 // // aSize.Height()= rRect.GetHeight();
510 // // }
511 // // else
512 // // {
513 // // aSize.Width() = rRect.GetWidth();
514 // // aSize.Height()= (long) ( rRect.GetWidth() / fBmpWH );
515 // // }
516 // // }
517 // //
518 // // const Point aPos( ( ( rRect.GetWidth() - aSize.Width() ) >> 1 ) + rRect.Left(),
519 // // ( ( rRect.GetHeight() - aSize.Height() ) >> 1 ) + rRect.Top() );
520 // //
521 // // if(bTransparent)
522 // // {
523 // // // draw checkered background
524 // // drawTransparenceBackground(*pDev, aPos, aSize);
525 // // }
526 // //
527 // // aGraphic.Draw( pDev, aPos, aSize );
528 // //}
529 //
530 // SetItemText( nId, GalleryBrowser2::GetItemText( *mpTheme, *pObj, GALLERY_ITEM_TITLE) );
531 // mpTheme->ReleaseObject( pObj );
532 //}
533 }
534 }
535
536 // ------------------------------------------------------------------------
537
MouseButtonDown(const MouseEvent & rMEvt)538 void GalleryIconView::MouseButtonDown( const MouseEvent& rMEvt )
539 {
540 ValueSet::MouseButtonDown( rMEvt );
541
542 if( rMEvt.GetClicks() == 2 )
543 ( (GalleryBrowser2*) GetParent() )->TogglePreview( this, &rMEvt.GetPosPixel() );
544 }
545
546 // ------------------------------------------------------------------------
547
Command(const CommandEvent & rCEvt)548 void GalleryIconView::Command( const CommandEvent& rCEvt )
549 {
550 ValueSet::Command( rCEvt );
551
552 if( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
553 {
554 ( (GalleryBrowser2*) GetParent() )->ShowContextMenu( this,
555 ( rCEvt.IsMouseEvent() ? &rCEvt.GetMousePosPixel() : NULL ) );
556 }
557 }
558
559 // ------------------------------------------------------------------------
560
KeyInput(const KeyEvent & rKEvt)561 void GalleryIconView::KeyInput( const KeyEvent& rKEvt )
562 {
563 if( !mpTheme || !static_cast< GalleryBrowser2* >( GetParent() )->KeyInput( rKEvt, this ) )
564 ValueSet::KeyInput( rKEvt );
565 }
566
567 // ------------------------------------------------------------------------
568
AcceptDrop(const AcceptDropEvent & rEvt)569 sal_Int8 GalleryIconView::AcceptDrop( const AcceptDropEvent& rEvt )
570 {
571 return( static_cast< GalleryBrowser2* >( GetParent() )->AcceptDrop( *this, rEvt ) );
572 }
573
574 // ------------------------------------------------------------------------
575
ExecuteDrop(const ExecuteDropEvent & rEvt)576 sal_Int8 GalleryIconView::ExecuteDrop( const ExecuteDropEvent& rEvt )
577 {
578 return( static_cast< GalleryBrowser2* >( GetParent() )->ExecuteDrop( *this, rEvt ) );
579 }
580
581 // ------------------------------------------------------------------------
582
StartDrag(sal_Int8,const Point &)583 void GalleryIconView::StartDrag( sal_Int8, const Point& )
584 {
585 const CommandEvent aEvt( GetPointerPosPixel(), COMMAND_STARTDRAG, sal_True );
586 Region aRegion;
587
588 // call this to initiate dragging for ValueSet
589 ValueSet::StartDrag( aEvt, aRegion );
590 static_cast< GalleryBrowser2* >( GetParent() )->StartDrag( this );
591 }
592
593 // -------------------
594 // - GalleryListView -
595 // -------------------
DBG_NAME(GalleryListView)596 DBG_NAME(GalleryListView)
597
598 GalleryListView::GalleryListView( GalleryBrowser2* pParent, GalleryTheme* pTheme ) :
599 BrowseBox( pParent, WB_TABSTOP | WB_3DLOOK | WB_BORDER ),
600 mpTheme( pTheme ),
601 mnCurRow( 0 ),
602 mbInit( sal_False )
603 {
604 DBG_CTOR(GalleryListView,NULL);
605
606 SetHelpId( HID_GALLERY_WINDOW );
607
608 InitSettings();
609
610 SetMode( BROWSER_AUTO_VSCROLL | BROWSER_AUTOSIZE_LASTCOL );
611 SetDataRowHeight( 28 );
612 InsertDataColumn( GALLERY_BRWBOX_TITLE, String( GAL_RESID( RID_SVXSTR_GALLERY_TITLE ) ), 256 );
613 InsertDataColumn( GALLERY_BRWBOX_PATH, String( GAL_RESID( RID_SVXSTR_GALLERY_PATH ) ), 256 );
614 }
615
616 // ------------------------------------------------------------------------
617
~GalleryListView()618 GalleryListView::~GalleryListView()
619 {
620
621 DBG_DTOR(GalleryListView,NULL);
622 }
623
624 // ------------------------------------------------------------------------
625
InitSettings()626 void GalleryListView::InitSettings()
627 {
628 SetBackground( Wallpaper( GALLERY_BG_COLOR ) );
629 SetControlBackground( GALLERY_BG_COLOR );
630 SetControlForeground( GALLERY_FG_COLOR );
631 }
632
633 // -----------------------------------------------------------------------
634
DataChanged(const DataChangedEvent & rDCEvt)635 void GalleryListView::DataChanged( const DataChangedEvent& rDCEvt )
636 {
637 if ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
638 InitSettings();
639 else
640 BrowseBox::DataChanged( rDCEvt );
641 }
642
643 // ------------------------------------------------------------------------
644
SeekRow(long nRow)645 sal_Bool GalleryListView::SeekRow( long nRow )
646 {
647 mnCurRow = nRow;
648 return sal_True;
649 }
650
651 // -----------------------------------------------------------------------------
652
GetCellText(long _nRow,sal_uInt16 nColumnId) const653 String GalleryListView::GetCellText(long _nRow, sal_uInt16 nColumnId) const
654 {
655 String sRet;
656 if( mpTheme && ( _nRow < static_cast< long >( mpTheme->GetObjectCount() ) ) )
657 {
658 SgaObject* pObj = mpTheme->AcquireObject( _nRow );
659
660 if( pObj )
661 {
662 sRet = GalleryBrowser2::GetItemText( *mpTheme, *pObj,
663 ( GALLERY_BRWBOX_TITLE == nColumnId ) ? GALLERY_ITEM_TITLE : GALLERY_ITEM_PATH );
664
665 mpTheme->ReleaseObject( pObj );
666 }
667 }
668
669 return sRet;;
670 }
671
672 // -----------------------------------------------------------------------------
673
GetFieldCharacterBounds(sal_Int32 _nRow,sal_Int32 _nColumnPos,sal_Int32 nIndex)674 Rectangle GalleryListView::GetFieldCharacterBounds(sal_Int32 _nRow,sal_Int32 _nColumnPos,sal_Int32 nIndex)
675 {
676 DBG_ASSERT(_nColumnPos >= 0 && _nColumnPos <= USHRT_MAX, "GalleryListView::GetFieldCharacterBounds: _nColumnId overflow");
677 Rectangle aRect;
678 if ( SeekRow(_nRow) )
679 {
680 SvxFont aFont( GetFont() );
681 AccessibleStringWrap aStringWrap( *this, aFont, GetCellText(_nRow, sal::static_int_cast<sal_uInt16>( GetColumnId( sal::static_int_cast<sal_uInt16>(_nColumnPos) ) ) ) );
682
683 // get the bounds inside the string
684 aStringWrap.GetCharacterBounds(nIndex, aRect);
685
686 // offset to
687 }
688 return aRect;
689 }
690
691 // -----------------------------------------------------------------------------
692
GetFieldIndexAtPoint(sal_Int32 _nRow,sal_Int32 _nColumnPos,const Point & _rPoint)693 sal_Int32 GalleryListView::GetFieldIndexAtPoint(sal_Int32 _nRow,sal_Int32 _nColumnPos,const Point& _rPoint)
694 {
695 DBG_ASSERT(_nColumnPos >= 0 && _nColumnPos <= USHRT_MAX, "GalleryListView::GetFieldIndexAtPoint: _nColumnId overflow");
696 sal_Int32 nRet = -1;
697 if ( SeekRow(_nRow) )
698 {
699 SvxFont aFont( GetFont() );
700 AccessibleStringWrap aStringWrap( *this, aFont, GetCellText(_nRow, sal::static_int_cast<sal_uInt16>(GetColumnId(sal::static_int_cast<sal_uInt16>(_nColumnPos)))) );
701 nRet = aStringWrap.GetIndexAtPoint(_rPoint);
702 }
703 return nRet;
704 }
705
706 // ------------------------------------------------------------------------
707
PaintField(OutputDevice & rDev,const Rectangle & rRect,sal_uInt16 nColumnId) const708 void GalleryListView::PaintField( OutputDevice& rDev, const Rectangle& rRect, sal_uInt16 nColumnId ) const
709 {
710 rDev.Push( PUSH_CLIPREGION );
711 rDev.IntersectClipRegion( rRect );
712
713 if( mpTheme && ( mnCurRow < mpTheme->GetObjectCount() ) )
714 {
715 const Size aSize(rRect.GetHeight(), rRect.GetHeight());
716 BitmapEx aBitmapEx;
717 Size aPreparedSize;
718 String aItemTextTitle;
719 String aItemTextPath;
720
721 mpTheme->GetPreviewBitmapExAndStrings(mnCurRow, aBitmapEx, aPreparedSize, aItemTextTitle, aItemTextPath);
722
723 bool bNeedToCreate(aBitmapEx.IsEmpty());
724
725 if(!bNeedToCreate && GALLERY_BRWBOX_TITLE == nColumnId && !aItemTextTitle.Len())
726 {
727 bNeedToCreate = true;
728 }
729
730 if(!bNeedToCreate && GALLERY_BRWBOX_PATH == nColumnId && !aItemTextPath.Len())
731 {
732 bNeedToCreate = true;
733 }
734
735 if(!bNeedToCreate && aPreparedSize != aSize)
736 {
737 bNeedToCreate = true;
738 }
739
740 if(bNeedToCreate)
741 {
742 SgaObject* pObj = mpTheme->AcquireObject(mnCurRow);
743
744 if(pObj)
745 {
746 aBitmapEx = pObj->createPreviewBitmapEx(aSize);
747 aItemTextTitle = GalleryBrowser2::GetItemText(*mpTheme, *pObj, GALLERY_ITEM_TITLE);
748 aItemTextPath = GalleryBrowser2::GetItemText(*mpTheme, *pObj, GALLERY_ITEM_PATH);
749
750 mpTheme->SetPreviewBitmapExAndStrings(mnCurRow, aBitmapEx, aSize, aItemTextTitle, aItemTextPath);
751 mpTheme->ReleaseObject(pObj);
752 }
753 }
754
755 const long nTextPosY(rRect.Top() + ((rRect.GetHeight() - rDev.GetTextHeight()) >> 1));
756
757 if(GALLERY_BRWBOX_TITLE == nColumnId)
758 {
759 if(!aBitmapEx.IsEmpty())
760 {
761 const Size aBitmapExSizePixel(aBitmapEx.GetSizePixel());
762 const Point aPos(
763 ((aSize.Width() - aBitmapExSizePixel.Width()) >> 1) + rRect.Left(),
764 ((aSize.Height() - aBitmapExSizePixel.Height()) >> 1) + rRect.Top());
765
766 if(aBitmapEx.IsTransparent())
767 {
768 // draw checkered background
769 drawTransparenceBackground(rDev, aPos, aBitmapExSizePixel);
770 }
771
772 rDev.DrawBitmapEx(aPos, aBitmapEx);
773 }
774
775 rDev.DrawText(Point(rRect.Left() + rRect.GetHeight() + 6, nTextPosY), aItemTextTitle);
776 }
777 else if(GALLERY_BRWBOX_PATH == nColumnId)
778 {
779 rDev.DrawText(Point(rRect.Left(), nTextPosY), aItemTextPath);
780 }
781
782
783 //SgaObject* pObj = mpTheme->AcquireObject( mnCurRow );
784 //
785 //if( pObj )
786 //{
787 // const long nTextPosY = rRect.Top() + ( ( rRect.GetHeight() - rDev.GetTextHeight() ) >> 1 );
788 //
789 // if( GALLERY_BRWBOX_TITLE == nColumnId )
790 // {
791 // const Size aSize(rRect.GetHeight(), rRect.GetHeight());
792 // const BitmapEx aBitmapEx(pObj->createPreviewBitmapEx(aSize));
793 // const Size aBitmapExSizePixel(aBitmapEx.GetSizePixel());
794 //
795 // if(!aBitmapEx.IsEmpty())
796 // {
797 // const Point aPos(
798 // ((aSize.Width() - aBitmapExSizePixel.Width()) >> 1) + rRect.Left(),
799 // ((aSize.Height() - aBitmapExSizePixel.Height()) >> 1) + rRect.Top());
800 //
801 // if(aBitmapEx.IsTransparent())
802 // {
803 // // draw checkered background
804 // drawTransparenceBackground(rDev, aPos, aBitmapExSizePixel);
805 // }
806 //
807 // rDev.DrawBitmapEx(aPos, aBitmapEx);
808 // }
809 //
810 //
811 // //Rectangle aOutputRect( rRect.TopLeft(), Size( rRect.GetHeight(), rRect.GetHeight() ) );
812 // //GraphicObject aGrfObj;
813 // //bool bTransparent(false);
814 // //
815 // //if( pObj->GetObjKind() == SGA_OBJ_SOUND )
816 // //{
817 // // aGrfObj = Graphic( BitmapEx( GAL_RESID( RID_SVXBMP_GALLERY_MEDIA ) ) );
818 // //}
819 // //else if( pObj->IsThumbBitmap() )
820 // //{
821 // // const BitmapEx aBitmapEx(pObj->GetThumbBmp());
822 // //
823 // // bTransparent = aBitmapEx.IsTransparent();
824 // // aGrfObj = Graphic(aBitmapEx);
825 // //}
826 // //else
827 // //{
828 // // aGrfObj = Graphic( pObj->GetThumbMtf() );
829 // // bTransparent = true;
830 // //}
831 // //
832 // //Size aSize( rDev.LogicToPixel( aGrfObj.GetPrefSize(), aGrfObj.GetPrefMapMode() ) );
833 // //
834 // //if( aSize.Width() && aSize.Height() )
835 // //{
836 // // if( ( aSize.Width() > aOutputRect.GetWidth() ) || ( aSize.Height() > aOutputRect.GetHeight() ) )
837 // // {
838 // // Point aNewPos;
839 // // const double fBmpWH = (double) aSize.Width() / aSize.Height();
840 // // const double fThmpWH = (double) aOutputRect.GetWidth() / aOutputRect.GetHeight();
841 // //
842 // // // Bitmap an Thumbgroesse anpassen
843 // // if ( fBmpWH < fThmpWH )
844 // // {
845 // // aSize.Width() = (long) ( aOutputRect.GetHeight() * fBmpWH );
846 // // aSize.Height()= aOutputRect.GetHeight();
847 // // }
848 // // else
849 // // {
850 // // aSize.Width() = aOutputRect.GetWidth();
851 // // aSize.Height()= (long) ( aOutputRect.GetWidth() / fBmpWH );
852 // // }
853 // // }
854 // //
855 // // aSize.Width() = Max( aSize.Width(), 4L );
856 // // aSize.Height() = Max( aSize.Height(), 4L );
857 // //
858 // // const Point aPos( ( ( aOutputRect.GetWidth() - aSize.Width() ) >> 1 ) + aOutputRect.Left(),
859 // // ( ( aOutputRect.GetHeight() - aSize.Height() ) >> 1 ) + aOutputRect.Top() );
860 // //
861 // // if(bTransparent)
862 // // {
863 // // // draw checkered background
864 // // drawTransparenceBackground(rDev, aPos, aSize);
865 // // }
866 // //
867 // // aGrfObj.Draw( &rDev, aPos, aSize );
868 // //}
869 //
870 // // aOutputRect.Right() is here rRect.Left() + rRect.GetHeight()
871 // rDev.DrawText( Point( rRect.Left() + rRect.GetHeight() + 6, nTextPosY ), GalleryBrowser2::GetItemText( *mpTheme, *pObj, GALLERY_ITEM_TITLE ) );
872 // }
873 // else if( GALLERY_BRWBOX_PATH == nColumnId )
874 // {
875 // rDev.DrawText( Point( rRect.Left(), nTextPosY ), GalleryBrowser2::GetItemText( *mpTheme, *pObj, GALLERY_ITEM_PATH ) );
876 // }
877 //
878 // mpTheme->ReleaseObject( pObj );
879 //}
880 }
881
882 rDev.Pop();
883 }
884
885 // ------------------------------------------------------------------------
886
Command(const CommandEvent & rCEvt)887 void GalleryListView::Command( const CommandEvent& rCEvt )
888 {
889 BrowseBox::Command( rCEvt );
890
891 if( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
892 {
893 const Point* pPos = NULL;
894
895 if( rCEvt.IsMouseEvent() && ( GetRowAtYPosPixel( rCEvt.GetMousePosPixel().Y() ) != BROWSER_ENDOFSELECTION ) )
896 pPos = &rCEvt.GetMousePosPixel();
897
898 ( (GalleryBrowser2*) GetParent() )->ShowContextMenu( this, pPos );
899 }
900 }
901
902 // ------------------------------------------------------------------------
903
KeyInput(const KeyEvent & rKEvt)904 void GalleryListView::KeyInput( const KeyEvent& rKEvt )
905 {
906 if( !mpTheme || !static_cast< GalleryBrowser2* >( GetParent() )->KeyInput( rKEvt, this ) )
907 BrowseBox::KeyInput( rKEvt );
908 }
909
910 // ------------------------------------------------------------------------
911
DoubleClick(const BrowserMouseEvent & rEvt)912 void GalleryListView::DoubleClick( const BrowserMouseEvent& rEvt )
913 {
914 BrowseBox::DoubleClick( rEvt );
915
916 if( rEvt.GetRow() != BROWSER_ENDOFSELECTION )
917 ( (GalleryBrowser2*) GetParent() )->TogglePreview( this, &rEvt.GetPosPixel() );
918 }
919
920 // ------------------------------------------------------------------------
921
Select()922 void GalleryListView::Select()
923 {
924 if( maSelectHdl.IsSet() )
925 maSelectHdl.Call( this );
926 }
927
928 // ------------------------------------------------------------------------
929
AcceptDrop(const BrowserAcceptDropEvent &)930 sal_Int8 GalleryListView::AcceptDrop( const BrowserAcceptDropEvent& )
931 {
932 sal_Int8 nRet = DND_ACTION_NONE;
933
934 if( mpTheme && !mpTheme->IsReadOnly() && !mpTheme ->IsImported() )
935 {
936 if( !mpTheme->IsDragging() )
937 nRet = DND_ACTION_COPY;
938 else
939 nRet = DND_ACTION_COPY;
940 }
941
942 return nRet;
943 }
944
945 // ------------------------------------------------------------------------
946
ExecuteDrop(const BrowserExecuteDropEvent & rEvt)947 sal_Int8 GalleryListView::ExecuteDrop( const BrowserExecuteDropEvent& rEvt )
948 {
949 ExecuteDropEvent aEvt( rEvt );
950
951 aEvt.maPosPixel.Y() += GetTitleHeight();
952
953 return( ( (GalleryBrowser2*) GetParent() )->ExecuteDrop( *this, aEvt ) );
954 }
955
956 // ------------------------------------------------------------------------
957
StartDrag(sal_Int8,const Point & rPosPixel)958 void GalleryListView::StartDrag( sal_Int8, const Point& rPosPixel )
959 {
960 ( (GalleryBrowser2*) GetParent() )->StartDrag( this, &rPosPixel );
961 }
962