[Libreoffice-commits] core.git: officecfg/registry sdext/source sd/inc sd/source

Srijan Bhatia (via logerrit) logerrit at kemper.freedesktop.org
Thu Jun 18 08:17:54 UTC 2020


 officecfg/registry/data/org/openoffice/Office/PresenterScreen.xcu   |   88 ++++++++
 officecfg/registry/schema/org/openoffice/Office/PresenterScreen.xcs |    5 
 sd/inc/bitmaps.hlst                                                 |    4 
 sd/source/ui/presenter/PresenterHelper.cxx                          |    8 
 sdext/source/presenter/PresenterController.hxx                      |    2 
 sdext/source/presenter/PresenterProtocolHandler.cxx                 |   75 +++++++
 sdext/source/presenter/PresenterToolBar.cxx                         |  105 +++++++++-
 sdext/source/presenter/PresenterWindowManager.cxx                   |   11 +
 sdext/source/presenter/PresenterWindowManager.hxx                   |    2 
 9 files changed, 286 insertions(+), 14 deletions(-)

New commits:
commit 41d75ee814d71513922a12fae82f2e7eecbcd5f5
Author:     Srijan Bhatia <srijanbhatiasun at gmail.com>
AuthorDate: Tue Jun 9 20:42:05 2020 +0530
Commit:     Heiko Tietze <heiko.tietze at documentfoundation.org>
CommitDate: Thu Jun 18 10:17:13 2020 +0200

    tdf#128964 Add time pause/resume button to Impress Presenter console
    
    Change-Id: I7263c3a8000b4d5930692cd2e32e84a22893dd66
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/95955
    Tested-by: Jenkins
    Tested-by: Heiko Tietze <heiko.tietze at documentfoundation.org>
    Reviewed-by: Heiko Tietze <heiko.tietze at documentfoundation.org>

diff --git a/officecfg/registry/data/org/openoffice/Office/PresenterScreen.xcu b/officecfg/registry/data/org/openoffice/Office/PresenterScreen.xcu
index 513da5440bb0..d5d3bc2e10eb 100644
--- a/officecfg/registry/data/org/openoffice/Office/PresenterScreen.xcu
+++ b/officecfg/registry/data/org/openoffice/Office/PresenterScreen.xcu
@@ -345,6 +345,86 @@
             </prop>
           </node>
           <node oor:name="k" oor:op="replace">
+            <prop oor:name="Name">
+              <value>PauseResumeTimer</value>
+            </prop>
+            <prop oor:name="Type">
+              <value>Button</value>
+            </prop>
+            <node oor:name="Normal">
+              <prop oor:name="Text">
+                <value xml:lang="en-US">Pause</value>
+              </prop>
+              <node oor:name="Icon">
+                <prop oor:name="NormalFileName">
+                  <value>bitmaps/ButtonPauseTimerNormal.png</value>
+                </prop>
+              </node>
+              <prop oor:name="Action">
+                <value>vnd.org.libreoffice.presenterscreen:PauseResumeTimer</value>
+              </prop>
+              <node oor:name="Font">
+                <prop oor:name="Size">
+                  <value>12</value>
+                </prop>
+                <prop oor:name="Style">
+                  <value>Bold</value>
+                </prop>
+                <prop oor:name="Color">
+                  <value>B3B7BC</value>
+                </prop>
+                <prop oor:name="Anchor">
+                  <value>Center</value>
+                </prop>
+              </node>
+            </node>
+            <node oor:name="MouseOver">
+              <node oor:name="Icon">
+                <prop oor:name="NormalFileName">
+                  <value>bitmaps/ButtonPauseTimerMouseOver.png</value>
+                </prop>
+              </node>
+              <node oor:name="Font">
+                <prop oor:name="Color">
+                  <value>FFFFFF</value>
+                </prop>
+              </node>
+            </node>
+            <node oor:name="Selected">
+              <prop oor:name="Text">
+                <value xml:lang="en-US">Resume</value>
+              </prop>
+              <node oor:name="Icon">
+                <prop oor:name="NormalFileName">
+                  <value>bitmaps/ButtonResumeTimerNormal.png</value>
+                </prop>
+              </node>
+              <node oor:name="Font">
+                <prop oor:name="Color">
+                  <value>B3B7BC</value>
+                </prop>
+              </node>
+              <prop oor:name="Action">
+                <value>vnd.org.libreoffice.presenterscreen:PauseResumeTimer</value>
+              </prop>
+            </node>
+            <node oor:name="MouseOverSelected">
+              <prop oor:name="Text">
+                <value xml:lang="en-US">Resume</value>
+              </prop>
+              <node oor:name="Icon">
+                <prop oor:name="NormalFileName">
+                  <value>bitmaps/ButtonResumeTimerMouseOver.png</value>
+                </prop>
+              </node>
+              <node oor:name="Font">
+                <prop oor:name="Color">
+                  <value>FFFFFF</value>
+                </prop>
+              </node>
+            </node>
+          </node>
+          <node oor:name="l" oor:op="replace">
             <prop oor:name="Name">
               <value>RestartTimer</value>
             </prop>
@@ -391,7 +471,7 @@
               </node>
             </node>
           </node>
-          <node oor:name="l" oor:op="replace">
+          <node oor:name="m" oor:op="replace">
             <prop oor:name="Type">
               <value>VerticalSeparator</value>
             </prop>
@@ -403,7 +483,7 @@
               </node>
             </node>
           </node>
-          <node oor:name="m" oor:op="replace">
+          <node oor:name="n" oor:op="replace">
             <prop oor:name="Name">
               <value>SwitchMonitor</value>
             </prop>
@@ -457,7 +537,7 @@
               </node>
             </node>
           </node>
-          <node oor:name="n" oor:op="replace">
+          <node oor:name="o" oor:op="replace">
             <prop oor:name="Type">
               <value>VerticalSeparator</value>
             </prop>
@@ -469,7 +549,7 @@
               </node>
             </node>
           </node>
-          <node oor:name="o" oor:op="replace">
+          <node oor:name="p" oor:op="replace">
             <prop oor:name="Name">
               <value>Help</value>
             </prop>
diff --git a/officecfg/registry/schema/org/openoffice/Office/PresenterScreen.xcs b/officecfg/registry/schema/org/openoffice/Office/PresenterScreen.xcs
index 01bb5a68b103..1dde3f5f35e1 100644
--- a/officecfg/registry/schema/org/openoffice/Office/PresenterScreen.xcs
+++ b/officecfg/registry/schema/org/openoffice/Office/PresenterScreen.xcs
@@ -282,6 +282,11 @@
           <desc>Description of a tool bar entry when it is selected.</desc>
         </info>
       </node-ref>
+      <node-ref oor:name="MouseOverSelected" oor:node-type="ToolBarDescription">
+        <info>
+          <desc>Description of a tool bar entry when it is selected and the mouse is over it.</desc>
+        </info>
+      </node-ref>
       <node-ref oor:name="Disabled" oor:node-type="ToolBarDescription">
         <info>
           <desc>Description of a tool bar entry when it is disabled.</desc>
diff --git a/sd/inc/bitmaps.hlst b/sd/inc/bitmaps.hlst
index 36a8b67720b2..69248b4759ba 100644
--- a/sd/inc/bitmaps.hlst
+++ b/sd/inc/bitmaps.hlst
@@ -122,6 +122,8 @@
 #define BMP_PRESENTERSCREEN_LABEL_MOUSE_OVER_RIGHT              "sd/res/presenterscreen-LabelMouseOverRight.png"
 #define BMP_PRESENTERSCREEN_BUTTON_SWITCH_MONITOR_NORMAL        "sd/res/presenterscreen-ButtonSwitchMonitorNormal.png"
 #define BMP_PRESENTERSCREEN_BUTTON_RESTART_TIMER_NORMAL         "sd/res/presenterscreen-ButtonRestartTimerNormal.png"
+#define BMP_PRESENTERSCREEN_BUTTON_PAUSE_TIMER_NORMAL           "sd/res/presenterscreen-ButtonPauseTimerNormal.png"
+#define BMP_PRESENTERSCREEN_BUTTON_RESUME_TIMER_NORMAL          "sd/res/presenterscreen-ButtonResumeTimerNormal.png"
 #define BMP_PRESENTERSCREEN_BORDER_TOOLBAR_RIGHT                "sd/res/presenterscreen-BorderToolbarRight.png"
 #define BMP_PRESENTERSCREEN_SCROLLBAR_THUMB_MIDDLE_NORMAL       "sd/res/presenterscreen-ScrollbarThumbMiddleNormal.png"
 #define BMP_PRESENTERSCREEN_BUTTON_EFFECT_NEXT_SELECTED         "sd/res/presenterscreen-ButtonEffectNextSelected.png"
@@ -134,6 +136,8 @@
 #define BMP_PRESENTERSCREEN_BUTTON_FRAME_RIGHT_MOUSE_OVER       "sd/res/presenterscreen-ButtonFrameRightMouseOver.png"
 #define BMP_PRESENTERSCREEN_BUTTON_SWITCH_MONITOR_MOUSE_OVER    "sd/res/presenterscreen-ButtonSwitchMonitorMouseOver.png"
 #define BMP_PRESENTERSCREEN_BUTTON_RESTART_TIMER_MOUSE_OVER     "sd/res/presenterscreen-ButtonRestartTimerMouseOver.png"
+#define BMP_PRESENTERSCREEN_BUTTON_PAUSE_TIMER_MOUSE_OVER       "sd/res/presenterscreen-ButtonPauseTimerMouseOver.png"
+#define BMP_PRESENTERSCREEN_BUTTON_RESUME_TIMER_MOUSE_OVER      "sd/res/presenterscreen-ButtonResumeTimerMouseOver.png"
 #define BMP_PRESENTERSCREEN_BUTTON_SLIDE_PREVIOUS_DISABLED      "sd/res/presenterscreen-ButtonSlidePreviousDisabled.png"
 #define BMP_PRESENTERSCREEN_BUTTON_MINUS_SELECTED               "sd/res/presenterscreen-ButtonMinusSelected.png"
 #define BMP_PRESENTERSCREEN_LABEL_MOUSE_OVER_CENTER             "sd/res/presenterscreen-LabelMouseOverCenter.png"
diff --git a/sd/source/ui/presenter/PresenterHelper.cxx b/sd/source/ui/presenter/PresenterHelper.cxx
index 912821982a97..0ce0a02f424f 100644
--- a/sd/source/ui/presenter/PresenterHelper.cxx
+++ b/sd/source/ui/presenter/PresenterHelper.cxx
@@ -330,6 +330,14 @@ Reference<rendering::XBitmap> SAL_CALL PresenterHelper::loadBitmap (
           BMP_PRESENTERSCREEN_BUTTON_RESTART_TIMER_MOUSE_OVER },
         { "bitmaps/ButtonRestartTimerNormal.png",
           BMP_PRESENTERSCREEN_BUTTON_RESTART_TIMER_NORMAL },
+        { "bitmaps/ButtonPauseTimerMouseOver.png",
+          BMP_PRESENTERSCREEN_BUTTON_PAUSE_TIMER_MOUSE_OVER },
+        { "bitmaps/ButtonPauseTimerNormal.png",
+          BMP_PRESENTERSCREEN_BUTTON_PAUSE_TIMER_NORMAL },
+        { "bitmaps/ButtonResumeTimerMouseOver.png",
+          BMP_PRESENTERSCREEN_BUTTON_RESUME_TIMER_MOUSE_OVER },
+        { "bitmaps/ButtonResumeTimerNormal.png",
+          BMP_PRESENTERSCREEN_BUTTON_RESUME_TIMER_NORMAL },
         { "bitmaps/LabelMouseOverCenter.png",
           BMP_PRESENTERSCREEN_LABEL_MOUSE_OVER_CENTER },
         { "bitmaps/LabelMouseOverLeft.png",
diff --git a/sdext/source/presenter/PresenterController.hxx b/sdext/source/presenter/PresenterController.hxx
index e860ce747fa3..400fb9174f11 100644
--- a/sdext/source/presenter/PresenterController.hxx
+++ b/sdext/source/presenter/PresenterController.hxx
@@ -63,6 +63,8 @@ class IPresentationTime
 {
 public:
     virtual void restart() = 0;
+    virtual bool isPaused() = 0;
+    virtual void setPauseStatus(const bool pauseStatus) = 0;
     virtual ~IPresentationTime();
 };
 
diff --git a/sdext/source/presenter/PresenterProtocolHandler.cxx b/sdext/source/presenter/PresenterProtocolHandler.cxx
index cb8cb6db2d27..029365e3b21d 100644
--- a/sdext/source/presenter/PresenterProtocolHandler.cxx
+++ b/sdext/source/presenter/PresenterProtocolHandler.cxx
@@ -90,6 +90,16 @@ namespace {
         rtl::Reference<PresenterController> mpPresenterController;
     };
 
+    class PauseResumeCommand : public Command
+    {
+    public:
+        explicit PauseResumeCommand(const rtl::Reference<PresenterController>& rpPresenterController);
+        virtual void Execute() override;
+        virtual Any GetState() const override;
+    private:
+        rtl::Reference<PresenterController> mpPresenterController;
+    };
+
     /// This command restarts the presentation timer.
     class RestartTimerCommand : public Command
     {
@@ -376,6 +386,8 @@ Command* PresenterProtocolHandler::Dispatch::CreateCommand (
         return new GotoPreviousSlideCommand(rpPresenterController);
     if (rsURLPath == "SwitchMonitor")
         return new SwitchMonitorCommand(rpPresenterController);
+    if (rsURLPath == "PauseResumeTimer")
+        return new PauseResumeCommand(rpPresenterController);
     if (rsURLPath == "RestartTimer")
         return new RestartTimerCommand(rpPresenterController);
     if (rsURLPath == "ShowNotes")
@@ -572,6 +584,56 @@ void SwitchMonitorCommand::Execute()
     mpPresenterController->SwitchMonitors();
 }
 
+//===== PauseResumeCommand ==============================================
+
+PauseResumeCommand::PauseResumeCommand (const rtl::Reference<PresenterController>& rpPresenterController)
+: mpPresenterController(rpPresenterController)
+{
+}
+
+void PauseResumeCommand::Execute()
+{
+    if ( ! mpPresenterController.is())
+        return;
+
+    ::rtl::Reference<PresenterWindowManager> pWindowManager (
+        mpPresenterController->GetWindowManager());
+    if ( ! pWindowManager.is())
+        return;
+
+    if (IPresentationTime* pPresentationTime = mpPresenterController->GetPresentationTime())
+    {
+        if(pPresentationTime->isPaused())
+        {
+            pPresentationTime->setPauseStatus(false);
+            pWindowManager->SetPauseState(false);
+        }
+        else
+        {
+            pPresentationTime->setPauseStatus(true);
+            pWindowManager->SetPauseState(true);
+        }
+    }
+}
+
+Any PauseResumeCommand::GetState() const
+{
+    if ( ! mpPresenterController.is())
+        return Any(false);
+
+    ::rtl::Reference<PresenterWindowManager> pWindowManager (
+        mpPresenterController->GetWindowManager());
+    if ( ! pWindowManager.is())
+        return Any(false);
+
+    if (IPresentationTime* pPresentationTime = mpPresenterController->GetPresentationTime())
+    {
+        return Any(pPresentationTime->isPaused());
+    }
+    else
+        return Any(false);
+}
+
 RestartTimerCommand::RestartTimerCommand (const rtl::Reference<PresenterController>& rpPresenterController)
 : mpPresenterController(rpPresenterController)
 {
@@ -579,8 +641,21 @@ RestartTimerCommand::RestartTimerCommand (const rtl::Reference<PresenterControll
 
 void RestartTimerCommand::Execute()
 {
+    if ( ! mpPresenterController.is())
+        return;
+
+    ::rtl::Reference<PresenterWindowManager> pWindowManager (
+        mpPresenterController->GetWindowManager());
+    if ( ! pWindowManager.is())
+        return;
+
     if (IPresentationTime* pPresentationTime = mpPresenterController->GetPresentationTime())
+    {
+        //Resets the pause status and restarts the timer
+        pPresentationTime->setPauseStatus(false);
+        pWindowManager->SetPauseState(false);
         pPresentationTime->restart();
+    }
 }
 
 //===== SetNotesViewCommand ===================================================
diff --git a/sdext/source/presenter/PresenterToolBar.cxx b/sdext/source/presenter/PresenterToolBar.cxx
index a21cf2a1c5cb..a0a57c6d8b44 100644
--- a/sdext/source/presenter/PresenterToolBar.cxx
+++ b/sdext/source/presenter/PresenterToolBar.cxx
@@ -130,7 +130,8 @@ namespace {
             const SharedElementMode& rpNormalMode,
             const SharedElementMode& rpMouseOverMode,
             const SharedElementMode& rpSelectedMode,
-            const SharedElementMode& rpDisabledMode);
+            const SharedElementMode& rpDisabledMode,
+            const SharedElementMode& rpMouseOverSelectedMode);
         void CurrentSlideHasChanged();
         void SetLocation (const awt::Point& rLocation);
         void SetSize (const geometry::RealSize2D& rSize);
@@ -166,6 +167,7 @@ namespace {
         SharedElementMode mpMouseOver;
         SharedElementMode mpSelected;
         SharedElementMode mpDisabled;
+        SharedElementMode mpMouseOverSelected;
         SharedElementMode mpMode;
         bool mbIsOver;
         bool mbIsPressed;
@@ -281,7 +283,8 @@ namespace {
             const SharedElementMode& rpNormalMode,
             const SharedElementMode& rpMouseOverMode,
             const SharedElementMode& rpSelectedMode,
-            const SharedElementMode& rpDisabledMode) override;
+            const SharedElementMode& rpDisabledMode,
+            const SharedElementMode& rpMouseOverSelectedMode) override;
     private:
         CurrentTimeLabel (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
         virtual ~CurrentTimeLabel() override;
@@ -297,11 +300,18 @@ namespace {
             const SharedElementMode& rpNormalMode,
             const SharedElementMode& rpMouseOverMode,
             const SharedElementMode& rpSelectedMode,
-            const SharedElementMode& rpDisabledMode) override;
+            const SharedElementMode& rpDisabledMode,
+            const SharedElementMode& rpMouseOverSelectedMode) override;
         virtual void restart() override;
+        virtual bool isPaused() override;
+        virtual void setPauseStatus(const bool pauseStatus) override;
+        virtual TimeValue getPauseTimeValue();
+        virtual void setPauseTimeValue(const TimeValue pauseTime);
     private:
         TimeValue maStartTimeValue;
+        TimeValue pauseTimeValue;
         PresentationTimeLabel (const ::rtl::Reference<PresenterToolBar>& rpToolBar);
+        bool paused;
         virtual ~PresentationTimeLabel() override;
         virtual void TimeHasChanged (const oslDateTime& rCurrentTime) override;
     };
@@ -628,10 +638,12 @@ void PresenterToolBar::ProcessEntry (
     SharedElementMode pMouseOverMode = std::make_shared<ElementMode>();
     SharedElementMode pSelectedMode = std::make_shared<ElementMode>();
     SharedElementMode pDisabledMode = std::make_shared<ElementMode>();
+    SharedElementMode pMouseOverSelectedMode = std::make_shared<ElementMode>();
     pNormalMode->ReadElementMode(rxProperties, "Normal", pNormalMode, rContext);
     pMouseOverMode->ReadElementMode(rxProperties, "MouseOver", pNormalMode, rContext);
     pSelectedMode->ReadElementMode(rxProperties, "Selected", pNormalMode, rContext);
     pDisabledMode->ReadElementMode(rxProperties, "Disabled", pNormalMode, rContext);
+    pMouseOverSelectedMode->ReadElementMode(rxProperties, "MouseOverSelected", pSelectedMode, rContext);
 
     // Create new element.
     ::rtl::Reference<Element> pElement;
@@ -655,7 +667,7 @@ void PresenterToolBar::ProcessEntry (
     }
     if (pElement.is())
     {
-        pElement->SetModes( pNormalMode, pMouseOverMode, pSelectedMode, pDisabledMode);
+        pElement->SetModes( pNormalMode, pMouseOverMode, pSelectedMode, pDisabledMode, pMouseOverSelectedMode);
         pElement->UpdateState();
         if (mpCurrentContainerPart)
             mpCurrentContainerPart->push_back(pElement);
@@ -1130,6 +1142,7 @@ Element::Element (
       mpMouseOver(),
       mpSelected(),
       mpDisabled(),
+      mpMouseOverSelected(),
       mpMode(),
       mbIsOver(false),
       mbIsPressed(false),
@@ -1147,12 +1160,14 @@ void Element::SetModes (
     const SharedElementMode& rpNormalMode,
     const SharedElementMode& rpMouseOverMode,
     const SharedElementMode& rpSelectedMode,
-    const SharedElementMode& rpDisabledMode)
+    const SharedElementMode& rpDisabledMode,
+    const SharedElementMode& rpMouseOverSelectedMode)
 {
     mpNormal = rpNormalMode;
     mpMouseOver = rpMouseOverMode;
     mpSelected = rpSelectedMode;
     mpDisabled = rpDisabledMode;
+    mpMouseOverSelected = rpMouseOverSelectedMode;
     mpMode = rpNormalMode;
 }
 
@@ -1201,6 +1216,8 @@ bool Element::SetState (
     // When the element is selected then ignore mouse over.
     if ( ! mbIsEnabled)
         mpMode = mpDisabled;
+    else if (mbIsSelected && mbIsOver)
+        mpMode = mpMouseOverSelected;
     else if (mbIsSelected)
         mpMode = mpSelected;
     else if (mbIsOver)
@@ -1751,9 +1768,10 @@ void CurrentTimeLabel::SetModes (
     const SharedElementMode& rpNormalMode,
     const SharedElementMode& rpMouseOverMode,
     const SharedElementMode& rpSelectedMode,
-    const SharedElementMode& rpDisabledMode)
+    const SharedElementMode& rpDisabledMode,
+    const SharedElementMode& rpMouseOverSelectedMode)
 {
-    TimeLabel::SetModes(rpNormalMode, rpMouseOverMode, rpSelectedMode, rpDisabledMode);
+    TimeLabel::SetModes(rpNormalMode, rpMouseOverMode, rpSelectedMode, rpDisabledMode, rpMouseOverSelectedMode);
     SetText(TimeFormatter::FormatTime(PresenterClockTimer::GetCurrentTime()));
 }
 
@@ -1778,15 +1796,41 @@ PresentationTimeLabel::PresentationTimeLabel (
       maStartTimeValue()
 {
     restart();
+    setPauseStatus(false);
+    TimeValue pauseTime(0,0);
+    setPauseTimeValue(pauseTime);
     mpToolBar->GetPresenterController()->SetPresentationTime(this);
 }
 
 void PresentationTimeLabel::restart()
 {
+    TimeValue pauseTime(0, 0);
+    setPauseTimeValue(pauseTime);
     maStartTimeValue.Seconds = 0;
     maStartTimeValue.Nanosec = 0;
 }
 
+bool PresentationTimeLabel::isPaused()
+{
+	return paused;
+}
+
+void PresentationTimeLabel::setPauseStatus(const bool pauseStatus)
+{
+	paused = pauseStatus;
+}
+
+TimeValue PresentationTimeLabel::getPauseTimeValue()
+{
+	return pauseTimeValue;
+}
+
+void PresentationTimeLabel::setPauseTimeValue(const TimeValue pauseTime)
+{
+    //store the time at which the presentation was paused
+	pauseTimeValue = pauseTime;
+}
+
 void PresentationTimeLabel::TimeHasChanged (const oslDateTime& rCurrentTime)
 {
     TimeValue aCurrentTimeValue;
@@ -1804,12 +1848,52 @@ void PresentationTimeLabel::TimeHasChanged (const oslDateTime& rCurrentTime)
         maStartTimeValue.Nanosec = 0;
     }
 
+    //The start time value is incremented by the amount of time
+    //the presentation was paused for in order to continue the
+    //timer from the same position
+    if(!isPaused())
+	{
+		TimeValue pauseTime = getPauseTimeValue();
+		if(pauseTime.Seconds != 0 || pauseTime.Nanosec != 0)
+		{
+            TimeValue incrementValue(0, 0);
+            incrementValue.Seconds = aCurrentTimeValue.Seconds - pauseTime.Seconds;
+            if(pauseTime.Nanosec > aCurrentTimeValue.Nanosec)
+            {
+                incrementValue.Nanosec = 1000000000 + aCurrentTimeValue.Nanosec - pauseTime.Nanosec;
+            }
+            else
+            {
+                incrementValue.Nanosec = aCurrentTimeValue.Nanosec - pauseTime.Nanosec;
+            }
+
+            maStartTimeValue.Seconds += incrementValue.Seconds;
+            maStartTimeValue.Nanosec += incrementValue.Nanosec;
+            if(maStartTimeValue.Nanosec >= 1000000000)
+            {
+                maStartTimeValue.Seconds += 1;
+                maStartTimeValue.Nanosec -= 1000000000;
+            }
+
+            TimeValue pauseTime_(0, 0);
+            setPauseTimeValue(pauseTime_);
+        }    	
+    }
+    else
+    {
+        TimeValue pauseTime = getPauseTimeValue();
+        if(pauseTime.Seconds == 0 && pauseTime.Nanosec == 0)
+        {
+            setPauseTimeValue(aCurrentTimeValue);
+        }
+    }
+
     TimeValue aElapsedTimeValue;
     aElapsedTimeValue.Seconds = aCurrentTimeValue.Seconds - maStartTimeValue.Seconds;
     aElapsedTimeValue.Nanosec = aCurrentTimeValue.Nanosec - maStartTimeValue.Nanosec;
 
     oslDateTime aElapsedDateTime;
-    if (osl_getDateTimeFromTimeValue(&aElapsedTimeValue, &aElapsedDateTime))
+    if (osl_getDateTimeFromTimeValue(&aElapsedTimeValue, &aElapsedDateTime) && !isPaused())
     {
         SetText(TimeFormatter::FormatTime(aElapsedDateTime));
         Invalidate(false);
@@ -1820,9 +1904,10 @@ void PresentationTimeLabel::SetModes (
     const SharedElementMode& rpNormalMode,
     const SharedElementMode& rpMouseOverMode,
     const SharedElementMode& rpSelectedMode,
-    const SharedElementMode& rpDisabledMode)
+    const SharedElementMode& rpDisabledMode,
+    const SharedElementMode& rpMouseOverSelectedMode)
 {
-    TimeLabel::SetModes(rpNormalMode, rpMouseOverMode, rpSelectedMode, rpDisabledMode);
+    TimeLabel::SetModes(rpNormalMode, rpMouseOverMode, rpSelectedMode, rpDisabledMode, rpMouseOverSelectedMode);
 
     oslDateTime aStartDateTime;
     if (osl_getDateTimeFromTimeValue(&maStartTimeValue, &aStartDateTime))
diff --git a/sdext/source/presenter/PresenterWindowManager.cxx b/sdext/source/presenter/PresenterWindowManager.cxx
index 713a14e15959..5f89cdfccc29 100644
--- a/sdext/source/presenter/PresenterWindowManager.cxx
+++ b/sdext/source/presenter/PresenterWindowManager.cxx
@@ -67,6 +67,7 @@ PresenterWindowManager::PresenterWindowManager (
       meLayoutMode(LM_Generic),
       mbIsSlideSorterActive(false),
       mbIsHelpViewActive(false),
+      mbisPaused(false),
       maLayoutListeners(),
       mbIsMouseClickPending(false)
 {
@@ -412,6 +413,16 @@ void PresenterWindowManager::SetHelpViewState (bool bIsActive)
     NotifyLayoutModeChange();
 }
 
+void PresenterWindowManager::SetPauseState (bool bIsPaused)
+{
+    if (mbisPaused == bIsPaused)
+        return;
+
+    mbisPaused = bIsPaused;
+
+    NotifyLayoutModeChange();
+}
+
 void PresenterWindowManager::SetViewMode (const ViewMode eMode)
 {
     switch (eMode)
diff --git a/sdext/source/presenter/PresenterWindowManager.hxx b/sdext/source/presenter/PresenterWindowManager.hxx
index 0886f3538e81..9c032e6df433 100644
--- a/sdext/source/presenter/PresenterWindowManager.hxx
+++ b/sdext/source/presenter/PresenterWindowManager.hxx
@@ -83,6 +83,7 @@ public:
 
     void SetSlideSorterState (bool bIsActive);
     void SetHelpViewState (bool bIsActive);
+    void SetPauseState (bool bIsPaused);
 
     enum LayoutMode { LM_Standard, LM_Notes, LM_Generic };
 private:
@@ -163,6 +164,7 @@ private:
     LayoutMode meLayoutMode;
     bool mbIsSlideSorterActive;
     bool mbIsHelpViewActive;
+    bool mbisPaused;
     typedef ::std::vector<css::uno::Reference<css::document::XEventListener> >
         LayoutListenerContainer;
     LayoutListenerContainer maLayoutListeners;


More information about the Libreoffice-commits mailing list