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 <vcl/graphicfilter.hxx>
36 : #include <vcl/settings.hxx>
37 : #include <vcl/builderfactory.hxx>
38 :
39 : #define GALLERY_BRWBOX_TITLE 1
40 :
41 0 : GalleryPreview::GalleryPreview(vcl::Window* pParent, WinBits nStyle, GalleryTheme* pTheme)
42 : : Window(pParent, nStyle)
43 : , DropTargetHelper(this)
44 : , DragSourceHelper(this)
45 0 : , mpTheme(pTheme)
46 : {
47 0 : SetHelpId( HID_GALLERY_WINDOW );
48 0 : InitSettings();
49 0 : }
50 :
51 0 : VCL_BUILDER_DECL_FACTORY(GalleryPreview)
52 : {
53 0 : WinBits nWinBits = WB_TABSTOP;
54 0 : OString sBorder = VclBuilder::extractCustomProperty(rMap);
55 0 : if (!sBorder.isEmpty())
56 0 : nWinBits |= WB_BORDER;
57 0 : rRet = VclPtr<GalleryPreview>::Create(pParent, nWinBits);
58 0 : }
59 :
60 0 : Size GalleryPreview::GetOptimalSize() const
61 : {
62 0 : return LogicToPixel(Size(70, 88), MAP_APPFONT);
63 : }
64 :
65 0 : bool GalleryPreview::SetGraphic( const INetURLObject& _aURL )
66 : {
67 0 : bool bRet = true;
68 0 : Graphic aGraphic;
69 0 : if( ::avmedia::MediaWindow::isMediaURL( _aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ), "" ) )
70 : {
71 0 : aGraphic = BitmapEx( GAL_RES( RID_SVXBMP_GALLERY_MEDIA ) );
72 : }
73 : else
74 : {
75 0 : GraphicFilter& rFilter = GraphicFilter::GetGraphicFilter();
76 0 : GalleryProgress aProgress( &rFilter );
77 0 : if( rFilter.ImportGraphic( aGraphic, _aURL, GRFILTER_FORMAT_DONTKNOW ) )
78 0 : bRet = false;
79 : }
80 :
81 0 : SetGraphic( aGraphic );
82 0 : Invalidate();
83 0 : return bRet;
84 : }
85 :
86 0 : void GalleryPreview::InitSettings()
87 : {
88 0 : SetBackground( Wallpaper( GALLERY_BG_COLOR ) );
89 0 : SetControlBackground( GALLERY_BG_COLOR );
90 0 : SetControlForeground( GALLERY_FG_COLOR );
91 0 : }
92 :
93 0 : void GalleryPreview::DataChanged( const DataChangedEvent& rDCEvt )
94 : {
95 0 : if ( ( rDCEvt.GetType() == DataChangedEventType::SETTINGS ) && ( rDCEvt.GetFlags() & AllSettingsFlags::STYLE ) )
96 0 : InitSettings();
97 : else
98 0 : Window::DataChanged( rDCEvt );
99 0 : }
100 :
101 0 : bool GalleryPreview::ImplGetGraphicCenterRect( const Graphic& rGraphic, Rectangle& rResultRect ) const
102 : {
103 0 : const Size aWinSize( GetOutputSizePixel() );
104 0 : Size aNewSize( LogicToPixel( rGraphic.GetPrefSize(), rGraphic.GetPrefMapMode() ) );
105 0 : bool bRet = false;
106 :
107 0 : if( aNewSize.Width() && aNewSize.Height() )
108 : {
109 : // scale to fit window
110 0 : const double fGrfWH = (double) aNewSize.Width() / aNewSize.Height();
111 0 : const double fWinWH = (double) aWinSize.Width() / aWinSize.Height();
112 :
113 0 : if ( fGrfWH < fWinWH )
114 : {
115 0 : aNewSize.Width() = (long) ( aWinSize.Height() * fGrfWH );
116 0 : aNewSize.Height()= aWinSize.Height();
117 : }
118 : else
119 : {
120 0 : aNewSize.Width() = aWinSize.Width();
121 0 : aNewSize.Height()= (long) ( aWinSize.Width() / fGrfWH);
122 : }
123 :
124 0 : const Point aNewPos( ( aWinSize.Width() - aNewSize.Width() ) >> 1,
125 0 : ( aWinSize.Height() - aNewSize.Height() ) >> 1 );
126 :
127 0 : rResultRect = Rectangle( aNewPos, aNewSize );
128 0 : bRet = true;
129 : }
130 :
131 0 : return bRet;
132 : }
133 :
134 0 : void GalleryPreview::Paint(vcl::RenderContext& rRenderContext, const Rectangle& rRect)
135 : {
136 0 : Window::Paint(rRenderContext, rRect);
137 :
138 0 : if (ImplGetGraphicCenterRect(aGraphicObj.GetGraphic(), aPreviewRect))
139 : {
140 0 : const Point aPos( aPreviewRect.TopLeft() );
141 0 : const Size aSize( aPreviewRect.GetSize() );
142 :
143 0 : if( aGraphicObj.IsAnimated() )
144 0 : aGraphicObj.StartAnimation(&rRenderContext, aPos, aSize);
145 : else
146 0 : aGraphicObj.Draw(&rRenderContext, aPos, aSize);
147 : }
148 0 : }
149 :
150 0 : void GalleryPreview::MouseButtonDown(const MouseEvent& rMEvt)
151 : {
152 0 : if (mpTheme && (rMEvt.GetClicks() == 2))
153 0 : static_cast<GalleryBrowser2*>(GetParent())->TogglePreview(this);
154 0 : }
155 :
156 0 : void GalleryPreview::Command(const CommandEvent& rCEvt)
157 : {
158 0 : Window::Command(rCEvt);
159 :
160 0 : if (mpTheme && (rCEvt.GetCommand() == CommandEventId::ContextMenu))
161 : {
162 0 : GalleryBrowser2* pGalleryBrowser = static_cast<GalleryBrowser2*>(GetParent());
163 0 : pGalleryBrowser->ShowContextMenu(this, (rCEvt.IsMouseEvent() ? &rCEvt.GetMousePosPixel() : NULL));
164 : }
165 0 : }
166 :
167 0 : void GalleryPreview::KeyInput(const KeyEvent& rKEvt)
168 : {
169 0 : if(mpTheme)
170 : {
171 0 : GalleryBrowser2* pBrowser = static_cast< GalleryBrowser2* >( GetParent() );
172 :
173 0 : switch( rKEvt.GetKeyCode().GetCode() )
174 : {
175 : case( KEY_BACKSPACE ):
176 0 : pBrowser->TogglePreview( this );
177 0 : break;
178 :
179 : case( KEY_HOME ):
180 0 : pBrowser->Travel( GALLERYBROWSERTRAVEL_FIRST );
181 0 : break;
182 :
183 : case( KEY_END ):
184 0 : pBrowser->Travel( GALLERYBROWSERTRAVEL_LAST );
185 0 : break;
186 :
187 : case( KEY_LEFT ):
188 : case( KEY_UP ):
189 0 : pBrowser->Travel( GALLERYBROWSERTRAVEL_PREVIOUS );
190 0 : break;
191 :
192 : case( KEY_RIGHT ):
193 : case( KEY_DOWN ):
194 0 : pBrowser->Travel( GALLERYBROWSERTRAVEL_NEXT );
195 0 : break;
196 :
197 : default:
198 : {
199 0 : if (!pBrowser->KeyInput(rKEvt, this))
200 0 : Window::KeyInput(rKEvt);
201 : }
202 0 : break;
203 : }
204 : }
205 : else
206 : {
207 0 : Window::KeyInput(rKEvt);
208 : }
209 0 : }
210 :
211 0 : sal_Int8 GalleryPreview::AcceptDrop( const AcceptDropEvent& rEvt )
212 : {
213 : sal_Int8 nRet;
214 :
215 0 : if (mpTheme)
216 0 : nRet = static_cast<GalleryBrowser2*>(GetParent())->AcceptDrop(*this, rEvt);
217 : else
218 0 : nRet = DND_ACTION_NONE;
219 :
220 0 : return nRet;
221 : }
222 :
223 0 : sal_Int8 GalleryPreview::ExecuteDrop( const ExecuteDropEvent& rEvt )
224 : {
225 : sal_Int8 nRet;
226 :
227 0 : if (mpTheme)
228 0 : nRet = static_cast<GalleryBrowser2*>(GetParent())->ExecuteDrop(*this, rEvt);
229 : else
230 0 : nRet = DND_ACTION_NONE;
231 :
232 0 : return nRet;
233 : }
234 :
235 0 : void GalleryPreview::StartDrag( sal_Int8, const Point& )
236 : {
237 0 : if(mpTheme)
238 0 : static_cast<GalleryBrowser2*>(GetParent())->StartDrag(this);
239 0 : }
240 :
241 0 : void GalleryPreview::PreviewMedia( const INetURLObject& rURL )
242 : {
243 0 : if (rURL.GetProtocol() != INetProtocol::NotValid)
244 : {
245 0 : ::avmedia::MediaFloater* pFloater = avmedia::getMediaFloater();
246 :
247 0 : if (!pFloater)
248 : {
249 0 : SfxViewFrame::Current()->GetBindings().GetDispatcher()->Execute( SID_AVMEDIA_PLAYER, SfxCallMode::SYNCHRON );
250 0 : pFloater = avmedia::getMediaFloater();
251 : }
252 :
253 0 : if (pFloater)
254 0 : pFloater->setURL( rURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ), "", true );
255 : }
256 0 : }
257 :
258 0 : void drawTransparenceBackground(vcl::RenderContext& rOut, const Point& rPos, const Size& rSize)
259 : {
260 0 : const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
261 :
262 0 : if (rStyleSettings.GetPreviewUsesCheckeredBackground())
263 : {
264 : // draw checkered background
265 : static const sal_uInt32 nLen(8);
266 0 : static const Color aW(COL_WHITE);
267 0 : static const Color aG(0xef, 0xef, 0xef);
268 :
269 0 : rOut.DrawCheckered(rPos, rSize, nLen, aW, aG);
270 : }
271 : else
272 : {
273 0 : rOut.SetLineColor();
274 0 : rOut.SetFillColor(rStyleSettings.GetFieldColor());
275 0 : rOut.DrawRect(Rectangle(rPos, rSize));
276 : }
277 0 : }
278 :
279 0 : GalleryIconView::GalleryIconView( GalleryBrowser2* pParent, GalleryTheme* pTheme ) :
280 : ValueSet( pParent, WB_TABSTOP | WB_3DLOOK | WB_BORDER | WB_ITEMBORDER | WB_DOUBLEBORDER | WB_VSCROLL | WB_FLATVALUESET ),
281 : DropTargetHelper( this ),
282 : DragSourceHelper( this ),
283 0 : mpTheme ( pTheme )
284 : {
285 :
286 0 : EnableFullItemMode( false );
287 :
288 0 : SetHelpId( HID_GALLERY_WINDOW );
289 0 : InitSettings();
290 0 : SetExtraSpacing( 2 );
291 0 : SetItemWidth( S_THUMB + 6 );
292 0 : SetItemHeight( S_THUMB + 6 );
293 0 : }
294 :
295 0 : void GalleryIconView::InitSettings()
296 : {
297 0 : SetBackground( Wallpaper( GALLERY_BG_COLOR ) );
298 0 : SetControlBackground( GALLERY_BG_COLOR );
299 0 : SetControlForeground( GALLERY_FG_COLOR );
300 0 : SetColor( GALLERY_BG_COLOR );
301 0 : }
302 :
303 0 : void GalleryIconView::DataChanged( const DataChangedEvent& rDCEvt )
304 : {
305 0 : if ( ( rDCEvt.GetType() == DataChangedEventType::SETTINGS ) && ( rDCEvt.GetFlags() & AllSettingsFlags::STYLE ) )
306 0 : InitSettings();
307 : else
308 0 : ValueSet::DataChanged( rDCEvt );
309 0 : }
310 :
311 0 : void GalleryIconView::UserDraw(const UserDrawEvent& rUDEvt)
312 : {
313 0 : const sal_uInt16 nId = rUDEvt.GetItemId();
314 :
315 0 : if (nId && mpTheme)
316 : {
317 0 : const Rectangle& rRect = rUDEvt.GetRect();
318 0 : const Size aSize(rRect.GetWidth(), rRect.GetHeight());
319 0 : BitmapEx aBitmapEx;
320 0 : Size aPreparedSize;
321 0 : OUString aItemTextTitle;
322 0 : OUString aItemTextPath;
323 :
324 0 : mpTheme->GetPreviewBitmapExAndStrings(nId - 1, aBitmapEx, aPreparedSize, aItemTextTitle, aItemTextPath);
325 :
326 0 : bool bNeedToCreate(aBitmapEx.IsEmpty());
327 :
328 0 : if (!bNeedToCreate && aItemTextTitle.isEmpty())
329 : {
330 0 : bNeedToCreate = true;
331 : }
332 :
333 0 : if (!bNeedToCreate && aPreparedSize != aSize)
334 : {
335 0 : bNeedToCreate = true;
336 : }
337 :
338 0 : if (bNeedToCreate)
339 : {
340 0 : SgaObject* pObj = mpTheme->AcquireObject(nId - 1);
341 :
342 0 : if(pObj)
343 : {
344 0 : aBitmapEx = pObj->createPreviewBitmapEx(aSize);
345 0 : aItemTextTitle = GalleryBrowser2::GetItemText(*mpTheme, *pObj, GALLERY_ITEM_TITLE);
346 :
347 0 : mpTheme->SetPreviewBitmapExAndStrings(nId - 1, aBitmapEx, aSize, aItemTextTitle, aItemTextPath);
348 0 : GalleryTheme::ReleaseObject(pObj);
349 : }
350 : }
351 :
352 0 : if (!aBitmapEx.IsEmpty())
353 : {
354 0 : const Size aBitmapExSizePixel(aBitmapEx.GetSizePixel());
355 : const Point aPos(
356 0 : ((aSize.Width() - aBitmapExSizePixel.Width()) >> 1) + rRect.Left(),
357 0 : ((aSize.Height() - aBitmapExSizePixel.Height()) >> 1) + rRect.Top());
358 0 : OutputDevice* pDev = rUDEvt.GetDevice();
359 :
360 0 : if(aBitmapEx.IsTransparent())
361 : {
362 : // draw checkered background for full rectangle.
363 0 : drawTransparenceBackground(*pDev, rRect.TopLeft(), rRect.GetSize());
364 : }
365 :
366 0 : pDev->DrawBitmapEx(aPos, aBitmapEx);
367 : }
368 :
369 0 : SetItemText(nId, aItemTextTitle);
370 : }
371 0 : }
372 :
373 0 : void GalleryIconView::MouseButtonDown(const MouseEvent& rMEvt)
374 : {
375 0 : ValueSet::MouseButtonDown(rMEvt);
376 :
377 0 : if (rMEvt.GetClicks() == 2)
378 0 : static_cast<GalleryBrowser2*>(GetParent())->TogglePreview(this, &rMEvt.GetPosPixel());
379 0 : }
380 :
381 0 : void GalleryIconView::Command(const CommandEvent& rCEvt)
382 : {
383 0 : ValueSet::Command(rCEvt);
384 :
385 0 : if (rCEvt.GetCommand() == CommandEventId::ContextMenu)
386 : {
387 0 : GalleryBrowser2* pGalleryBrowser = static_cast<GalleryBrowser2*>(GetParent());
388 0 : pGalleryBrowser->ShowContextMenu(this, (rCEvt.IsMouseEvent() ? &rCEvt.GetMousePosPixel() : nullptr));
389 : }
390 0 : }
391 :
392 0 : void GalleryIconView::KeyInput(const KeyEvent& rKEvt)
393 : {
394 0 : if (!mpTheme || !static_cast<GalleryBrowser2*>(GetParent())->KeyInput(rKEvt, this))
395 0 : ValueSet::KeyInput(rKEvt);
396 0 : }
397 :
398 0 : sal_Int8 GalleryIconView::AcceptDrop(const AcceptDropEvent& rEvt)
399 : {
400 0 : return(static_cast<GalleryBrowser2*>(GetParent())->AcceptDrop(*this, rEvt));
401 : }
402 :
403 0 : sal_Int8 GalleryIconView::ExecuteDrop(const ExecuteDropEvent& rEvt)
404 : {
405 0 : return(static_cast<GalleryBrowser2*>(GetParent())->ExecuteDrop(*this, rEvt));
406 : }
407 :
408 0 : void GalleryIconView::StartDrag(sal_Int8, const Point&)
409 : {
410 0 : const CommandEvent aEvt(GetPointerPosPixel(), CommandEventId::StartDrag, true);
411 0 : vcl::Region aRegion;
412 :
413 : // call this to initiate dragging for ValueSet
414 0 : ValueSet::StartDrag(aEvt, aRegion);
415 0 : static_cast<GalleryBrowser2*>(GetParent())->StartDrag(this);
416 0 : }
417 :
418 0 : GalleryListView::GalleryListView( GalleryBrowser2* pParent, GalleryTheme* pTheme ) :
419 : BrowseBox( pParent, WB_TABSTOP | WB_3DLOOK | WB_BORDER ),
420 : mpTheme( pTheme ),
421 0 : mnCurRow( 0 )
422 : {
423 :
424 0 : SetHelpId( HID_GALLERY_WINDOW );
425 :
426 0 : InitSettings();
427 :
428 0 : SetMode( BrowserMode::AUTO_VSCROLL | BrowserMode::AUTOSIZE_LASTCOL | BrowserMode::AUTO_HSCROLL );
429 0 : SetDataRowHeight( 28 );
430 0 : InsertDataColumn( GALLERY_BRWBOX_TITLE, GAL_RESSTR(RID_SVXSTR_GALLERY_TITLE), 256 );
431 0 : }
432 :
433 0 : void GalleryListView::InitSettings()
434 : {
435 0 : SetBackground( Wallpaper( GALLERY_BG_COLOR ) );
436 0 : SetControlBackground( GALLERY_BG_COLOR );
437 0 : SetControlForeground( GALLERY_FG_COLOR );
438 0 : }
439 :
440 0 : void GalleryListView::DataChanged( const DataChangedEvent& rDCEvt )
441 : {
442 0 : if ( ( rDCEvt.GetType() == DataChangedEventType::SETTINGS ) && ( rDCEvt.GetFlags() & AllSettingsFlags::STYLE ) )
443 0 : InitSettings();
444 : else
445 0 : BrowseBox::DataChanged( rDCEvt );
446 0 : }
447 :
448 0 : bool GalleryListView::SeekRow( long nRow )
449 : {
450 0 : mnCurRow = nRow;
451 0 : return true;
452 : }
453 :
454 0 : OUString GalleryListView::GetCellText(long _nRow, sal_uInt16 /*nColumnId*/) const
455 : {
456 0 : OUString sRet;
457 0 : if( mpTheme && ( _nRow < static_cast< long >( mpTheme->GetObjectCount() ) ) )
458 : {
459 0 : SgaObject* pObj = mpTheme->AcquireObject( _nRow );
460 :
461 0 : if( pObj )
462 : {
463 0 : sRet = GalleryBrowser2::GetItemText( *mpTheme, *pObj, GALLERY_ITEM_TITLE );
464 0 : GalleryTheme::ReleaseObject( pObj );
465 : }
466 : }
467 :
468 0 : return sRet;
469 : }
470 :
471 0 : Rectangle GalleryListView::GetFieldCharacterBounds(sal_Int32 _nRow,sal_Int32 _nColumnPos,sal_Int32 nIndex)
472 : {
473 : DBG_ASSERT(_nColumnPos >= 0 && _nColumnPos <= USHRT_MAX, "GalleryListView::GetFieldCharacterBounds: _nColumnId overflow");
474 0 : Rectangle aRect;
475 0 : if ( SeekRow(_nRow) )
476 : {
477 0 : SvxFont aFont( GetFont() );
478 0 : AccessibleStringWrap aStringWrap( *this, aFont, GetCellText(_nRow, sal::static_int_cast<sal_uInt16>( GetColumnId( sal::static_int_cast<sal_uInt16>(_nColumnPos) ) ) ) );
479 :
480 : // get the bounds inside the string
481 0 : aStringWrap.GetCharacterBounds(nIndex, aRect);
482 :
483 : // offset to
484 : }
485 0 : return aRect;
486 : }
487 :
488 0 : sal_Int32 GalleryListView::GetFieldIndexAtPoint(sal_Int32 _nRow,sal_Int32 _nColumnPos,const Point& _rPoint)
489 : {
490 : DBG_ASSERT(_nColumnPos >= 0 && _nColumnPos <= USHRT_MAX, "GalleryListView::GetFieldIndexAtPoint: _nColumnId overflow");
491 0 : sal_Int32 nRet = -1;
492 0 : if ( SeekRow(_nRow) )
493 : {
494 0 : SvxFont aFont( GetFont() );
495 0 : AccessibleStringWrap aStringWrap( *this, aFont, GetCellText(_nRow, sal::static_int_cast<sal_uInt16>(GetColumnId(sal::static_int_cast<sal_uInt16>(_nColumnPos)))) );
496 0 : nRet = aStringWrap.GetIndexAtPoint(_rPoint);
497 : }
498 0 : return nRet;
499 : }
500 :
501 0 : void GalleryListView::PaintField(vcl::RenderContext& rDev, const Rectangle& rRect, sal_uInt16 /*nColumnId*/) const
502 : {
503 0 : rDev.Push( PushFlags::CLIPREGION );
504 0 : rDev.IntersectClipRegion( rRect );
505 :
506 0 : if( mpTheme && ( static_cast<size_t>(mnCurRow) < mpTheme->GetObjectCount() ) )
507 : {
508 0 : const Size aSize(rRect.GetHeight(), rRect.GetHeight());
509 0 : BitmapEx aBitmapEx;
510 0 : Size aPreparedSize;
511 0 : OUString aItemTextTitle;
512 0 : OUString aItemTextPath;
513 :
514 0 : mpTheme->GetPreviewBitmapExAndStrings(mnCurRow, aBitmapEx, aPreparedSize, aItemTextTitle, aItemTextPath);
515 :
516 0 : bool bNeedToCreate(aBitmapEx.IsEmpty());
517 :
518 0 : if(!bNeedToCreate && (aItemTextTitle.isEmpty() || aPreparedSize != aSize))
519 0 : bNeedToCreate = true;
520 :
521 0 : if(bNeedToCreate)
522 : {
523 0 : SgaObject* pObj = mpTheme->AcquireObject(mnCurRow);
524 :
525 0 : if(pObj)
526 : {
527 0 : aBitmapEx = pObj->createPreviewBitmapEx(aSize);
528 0 : aItemTextTitle = GalleryBrowser2::GetItemText(*mpTheme, *pObj, GALLERY_ITEM_TITLE);
529 0 : aItemTextPath = GalleryBrowser2::GetItemText(*mpTheme, *pObj, GALLERY_ITEM_PATH);
530 :
531 0 : mpTheme->SetPreviewBitmapExAndStrings(mnCurRow, aBitmapEx, aSize, aItemTextTitle, aItemTextPath);
532 0 : GalleryTheme::ReleaseObject(pObj);
533 : }
534 : }
535 :
536 0 : const long nTextPosY(rRect.Top() + ((rRect.GetHeight() - rDev.GetTextHeight()) >> 1));
537 :
538 0 : if(!aBitmapEx.IsEmpty())
539 : {
540 0 : const Size aBitmapExSizePixel(aBitmapEx.GetSizePixel());
541 : const Point aPos(
542 0 : ((aSize.Width() - aBitmapExSizePixel.Width()) >> 1) + rRect.Left(),
543 0 : ((aSize.Height() - aBitmapExSizePixel.Height()) >> 1) + rRect.Top());
544 :
545 0 : if(aBitmapEx.IsTransparent())
546 : {
547 : // draw checkered background
548 0 : drawTransparenceBackground(rDev, aPos, aBitmapExSizePixel);
549 : }
550 :
551 0 : rDev.DrawBitmapEx(aPos, aBitmapEx);
552 : }
553 :
554 0 : rDev.DrawText(Point(rRect.Left() + rRect.GetHeight() + 6, nTextPosY), aItemTextTitle);
555 : }
556 :
557 0 : rDev.Pop();
558 0 : }
559 :
560 0 : void GalleryListView::Command( const CommandEvent& rCEvt )
561 : {
562 0 : BrowseBox::Command( rCEvt );
563 :
564 0 : if( rCEvt.GetCommand() == CommandEventId::ContextMenu )
565 : {
566 0 : const Point* pPos = NULL;
567 :
568 0 : if( rCEvt.IsMouseEvent() && ( GetRowAtYPosPixel( rCEvt.GetMousePosPixel().Y() ) != BROWSER_ENDOFSELECTION ) )
569 0 : pPos = &rCEvt.GetMousePosPixel();
570 :
571 0 : static_cast<GalleryBrowser2*>( GetParent() )->ShowContextMenu( this, pPos );
572 : }
573 0 : }
574 :
575 0 : void GalleryListView::KeyInput( const KeyEvent& rKEvt )
576 : {
577 0 : if( !mpTheme || !static_cast< GalleryBrowser2* >( GetParent() )->KeyInput( rKEvt, this ) )
578 0 : BrowseBox::KeyInput( rKEvt );
579 0 : }
580 :
581 0 : void GalleryListView::DoubleClick( const BrowserMouseEvent& rEvt )
582 : {
583 0 : BrowseBox::DoubleClick( rEvt );
584 :
585 0 : if( rEvt.GetRow() != BROWSER_ENDOFSELECTION )
586 0 : static_cast<GalleryBrowser2*>( GetParent() )->TogglePreview( this, &rEvt.GetPosPixel() );
587 0 : }
588 :
589 0 : void GalleryListView::Select()
590 : {
591 0 : if( maSelectHdl.IsSet() )
592 0 : maSelectHdl.Call( this );
593 0 : }
594 :
595 0 : sal_Int8 GalleryListView::AcceptDrop( const BrowserAcceptDropEvent& )
596 : {
597 0 : sal_Int8 nRet = DND_ACTION_NONE;
598 :
599 0 : if( mpTheme && !mpTheme->IsReadOnly() )
600 0 : nRet = DND_ACTION_COPY;
601 :
602 0 : return nRet;
603 : }
604 :
605 0 : sal_Int8 GalleryListView::ExecuteDrop( const BrowserExecuteDropEvent& rEvt )
606 : {
607 0 : ExecuteDropEvent aEvt( rEvt );
608 :
609 0 : aEvt.maPosPixel.Y() += GetTitleHeight();
610 :
611 0 : return( static_cast<GalleryBrowser2*>( GetParent() )->ExecuteDrop( *this, aEvt ) );
612 : }
613 :
614 0 : void GalleryListView::StartDrag( sal_Int8, const Point& rPosPixel )
615 : {
616 0 : static_cast<GalleryBrowser2*>( GetParent() )->StartDrag( this, &rPosPixel );
617 435 : }
618 :
619 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|