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 #include "MediaPlaybackPanel.hxx"
20 #include <vcl/outdev.hxx>
21 #include <avmedia/mediawindow.hxx>
22 #include <avmedia/mediaplayer.hxx>
23 #include <svtools/miscopt.hxx>
24 #include <avmedia/mediaitem.hxx>
25 #include <sfx2/sfxsids.hrc>
26 #include <sfx2/dispatch.hxx>
27 #include <avmedia/MediaControlBase.hxx>
28
29 #include <com/sun/star/lang/IllegalArgumentException.hpp>
30
31 using namespace avmedia;
32
33 namespace svx { namespace sidebar {
34
MediaPlaybackPanel(vcl::Window * pParent,const css::uno::Reference<css::frame::XFrame> & rxFrame,SfxBindings * pBindings)35 MediaPlaybackPanel::MediaPlaybackPanel (
36 vcl::Window* pParent,
37 const css::uno::Reference<css::frame::XFrame>& rxFrame,
38 SfxBindings* pBindings)
39 : PanelLayout(pParent, "MediaPlaybackPanel", "svx/ui/mediaplayback.ui", rxFrame),
40 MediaControlBase(),
41 maMediaController(SID_AVMEDIA_TOOLBOX, *pBindings, *this),
42 maIdle("MediaPlaybackPanel"),
43 mpBindings(pBindings)
44 {
45 get(mpTimeEdit, "timeedit");
46 get(mpPlayToolBox, "playtoolbox");
47 get(mpMuteToolBox, "mutetoolbox");
48 get(mpTimeSlider, "timeslider");
49 get(mpVolumeSlider, "volumeslider");
50 get(mpZoomListBox, "zoombox");
51 Initialize();
52 }
53
Create(vcl::Window * pParent,const Reference<XFrame> & rxFrame,SfxBindings * pBindings)54 VclPtr< vcl::Window > MediaPlaybackPanel::Create(
55 vcl::Window* pParent,
56 const Reference< XFrame >& rxFrame,
57 SfxBindings* pBindings)
58 {
59 if (pParent == nullptr)
60 throw lang::IllegalArgumentException("no parent Window given to MediaPlaybackPanel::Create", nullptr, 0);
61 if ( ! rxFrame.is())
62 throw lang::IllegalArgumentException("no XFrame given to MediaPlaybackPanel::Create", nullptr, 1);
63 if (pBindings == nullptr)
64 throw lang::IllegalArgumentException("no SfxBindings given to MediaPlaybackPanel::Create", nullptr, 2);
65
66 return VclPtr<MediaPlaybackPanel>::Create(
67 pParent,
68 rxFrame,
69 pBindings);
70 }
71
~MediaPlaybackPanel()72 MediaPlaybackPanel::~MediaPlaybackPanel()
73 {
74 disposeOnce();
75 }
76
Initialize()77 void MediaPlaybackPanel::Initialize()
78 {
79 InitializeWidgets();
80 mpVolumeSlider->SetSlideHdl(LINK(this, MediaPlaybackPanel, VolumeSlideHdl));
81 mpPlayToolBox->SetSelectHdl(LINK(this, MediaPlaybackPanel, PlayToolBoxSelectHdl));
82 mpMuteToolBox->SetSelectHdl(LINK(this, MediaPlaybackPanel, PlayToolBoxSelectHdl));
83 mpTimeSlider->SetSlideHdl(LINK(this, MediaPlaybackPanel, SeekHdl));
84
85 maIdle.SetPriority( TaskPriority::HIGHEST );
86 maIdle.SetInvokeHandler( LINK( this, MediaPlaybackPanel, TimeoutHdl ) );
87 maIdle.Start();
88 mpBindings->Invalidate(SID_AVMEDIA_TOOLBOX);
89 }
90
dispose()91 void MediaPlaybackPanel::dispose()
92 {
93 mpTimeEdit.disposeAndClear();
94 PanelLayout::dispose();
95 }
96
NotifyItemUpdate(const sal_uInt16 nSID,const SfxItemState eState,const SfxPoolItem * pState)97 void MediaPlaybackPanel::NotifyItemUpdate(
98 const sal_uInt16 nSID,
99 const SfxItemState eState,
100 const SfxPoolItem* pState)
101 {
102 if( nSID == SID_AVMEDIA_TOOLBOX )
103 {
104 if(eState >= SfxItemState::DEFAULT)
105 {
106 mpMediaItem.reset(pState ? static_cast< MediaItem* >(pState->Clone()) : nullptr);
107 Update();
108 }
109 }
110 }
111
UpdateToolBoxes(MediaItem aMediaItem)112 void MediaPlaybackPanel::UpdateToolBoxes(MediaItem aMediaItem)
113 {
114 mpPlayToolBox->Disable();
115 avmedia::MediaControlBase::UpdateToolBoxes(aMediaItem);
116 }
117
Update()118 void MediaPlaybackPanel::Update()
119 {
120 if (mpMediaItem)
121 {
122 UpdateToolBoxes( *mpMediaItem );
123 UpdateTimeSlider( *mpMediaItem );
124 UpdateVolumeSlider( *mpMediaItem );
125 UpdateTimeField( *mpMediaItem, mpMediaItem->getTime() );
126 }
127 }
128
IMPL_LINK_NOARG(MediaPlaybackPanel,VolumeSlideHdl,Slider *,void)129 IMPL_LINK_NOARG( MediaPlaybackPanel, VolumeSlideHdl, Slider*, void)
130 {
131 MediaItem aItem(SID_AVMEDIA_TOOLBOX);
132 aItem.setVolumeDB( static_cast< sal_Int16 > (mpVolumeSlider->GetThumbPos()));
133 mpBindings->GetDispatcher()->ExecuteList(SID_AVMEDIA_TOOLBOX, SfxCallMode::RECORD, { &aItem });
134 }
135
IMPL_LINK_NOARG(MediaPlaybackPanel,SeekHdl,Slider *,void)136 IMPL_LINK_NOARG( MediaPlaybackPanel, SeekHdl, Slider*, void)
137 {
138 MediaItem aItem(SID_AVMEDIA_TOOLBOX);
139 aItem.setState( MediaState::Pause );
140 double nTime = 0;
141 if (mpMediaItem)
142 nTime = mpTimeSlider->GetThumbPos() * mpMediaItem->getDuration() / AVMEDIA_TIME_RANGE;
143 aItem.setTime(nTime);
144 mpBindings->GetDispatcher()->ExecuteList(SID_AVMEDIA_TOOLBOX, SfxCallMode::RECORD, { &aItem });
145 mpBindings->Invalidate(SID_AVMEDIA_TOOLBOX);
146 }
147
IMPL_LINK_NOARG(MediaPlaybackPanel,TimeoutHdl,Timer *,void)148 IMPL_LINK_NOARG( MediaPlaybackPanel, TimeoutHdl, Timer*, void)
149 {
150 mpBindings->Invalidate(SID_AVMEDIA_TOOLBOX);
151 }
152
IMPL_LINK(MediaPlaybackPanel,PlayToolBoxSelectHdl,ToolBox *,pControl,void)153 IMPL_LINK( MediaPlaybackPanel, PlayToolBoxSelectHdl, ToolBox*, pControl, void)
154 {
155 MediaItem aItem(SID_AVMEDIA_TOOLBOX);
156 switch(pControl->GetCurItemId())
157 {
158 case AVMEDIA_TOOLBOXITEM_PLAY:
159 {
160 aItem.setState( MediaState::Play );
161
162 if( !mpMediaItem || (mpMediaItem->getTime() == mpMediaItem->getDuration() ))
163 aItem.setTime( 0.0 );
164 else
165 aItem.setTime( mpMediaItem->getTime());
166 }
167 break;
168
169 case AVMEDIA_TOOLBOXITEM_PAUSE:
170 {
171 aItem.setState( MediaState::Pause );
172 }
173 break;
174
175 case AVMEDIA_TOOLBOXITEM_STOP:
176 {
177 aItem.setState( MediaState::Stop );
178 aItem.setTime( 0.0 );
179 }
180 break;
181
182 case AVMEDIA_TOOLBOXITEM_MUTE:
183 {
184 aItem.setMute( !mpMuteToolBox->IsItemChecked( AVMEDIA_TOOLBOXITEM_MUTE ) );
185 }
186 break;
187
188 case AVMEDIA_TOOLBOXITEM_LOOP:
189 {
190 aItem.setLoop( !mpPlayToolBox->IsItemChecked( AVMEDIA_TOOLBOXITEM_LOOP ) );
191 }
192 break;
193 default: break;
194 }
195 if(aItem.getMaskSet() != AVMediaSetMask::NONE)
196 {
197 mpBindings->GetDispatcher()->ExecuteList(SID_AVMEDIA_TOOLBOX, SfxCallMode::RECORD, { &aItem } );
198 mpBindings->Invalidate(SID_AVMEDIA_TOOLBOX);
199 }
200 }
201
202 } } // end of namespace svx::sidebar
203
204 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
205