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 #include "precompiled_sd.hxx"
25 
26 #include "view/SlsToolTip.hxx"
27 #include "view/SlideSorterView.hxx"
28 #include "view/SlsLayouter.hxx"
29 #include "view/SlsTheme.hxx"
30 #include "sdpage.hxx"
31 #include "sdresid.hxx"
32 #include "glob.hrc"
33 #include <vcl/help.hxx>
34 
35 using ::rtl::OUString;
36 
37 namespace sd { namespace slidesorter { namespace view {
38 
ToolTip(SlideSorter & rSlideSorter)39 ToolTip::ToolTip (SlideSorter& rSlideSorter)
40     : mrSlideSorter(rSlideSorter),
41       msDefaultHelpText(),
42       msCurrentHelpText(),
43       mnHelpWindowHandle(0),
44       maTimer()
45 {
46     maTimer.SetTimeout(rSlideSorter.GetTheme()->GetIntegerValue(Theme::Integer_ToolTipDelay));
47     maTimer.SetTimeoutHdl(LINK(this, ToolTip, DelayTrigger));
48 }
49 
50 
51 
52 
~ToolTip(void)53 ToolTip::~ToolTip (void)
54 {
55     maTimer.Stop();
56     Hide();
57 }
58 
59 
60 
61 
SetPage(const model::SharedPageDescriptor & rpDescriptor)62 void ToolTip::SetPage (const model::SharedPageDescriptor& rpDescriptor)
63 {
64     if (mpDescriptor != rpDescriptor)
65     {
66         maTimer.Stop();
67         Hide();
68 
69         mpDescriptor = rpDescriptor;
70 
71         if (mpDescriptor)
72         {
73             SdPage* pPage = mpDescriptor->GetPage();
74             OUString sHelpText;
75             if (pPage != NULL)
76                 sHelpText = pPage->GetName();
77             else
78             {
79                 OSL_ASSERT(mpDescriptor->GetPage() != NULL);
80             }
81             if (sHelpText.getLength() == 0)
82             {
83                 sHelpText = String(SdResId(STR_PAGE));
84                 sHelpText += String::CreateFromInt32(mpDescriptor->GetPageIndex()+1);
85             }
86 
87             msDefaultHelpText = sHelpText;
88             msCurrentHelpText = sHelpText;
89             Show(false);
90         }
91         else
92         {
93             msDefaultHelpText = OUString();
94             msCurrentHelpText = OUString();
95         }
96     }
97 }
98 
99 
100 
101 
ShowDefaultHelpText(const::rtl::OUString & rsHelpText)102 void ToolTip::ShowDefaultHelpText (const ::rtl::OUString& rsHelpText)
103 {
104     if (msDefaultHelpText != rsHelpText)
105     {
106         const bool bIsVisible (Hide());
107 
108         msDefaultHelpText = rsHelpText;
109         msCurrentHelpText = rsHelpText;
110 
111         Show(bIsVisible);
112     }
113 }
114 
115 
116 
117 
ShowDefaultHelpText(void)118 void ToolTip::ShowDefaultHelpText (void)
119 {
120     if (msCurrentHelpText != msDefaultHelpText)
121     {
122         const bool bIsVisible (Hide());
123 
124         msCurrentHelpText = msDefaultHelpText;
125 
126         Show(bIsVisible);
127     }
128 }
129 
130 
131 
132 
ShowHelpText(const::rtl::OUString & rsHelpText)133 void ToolTip::ShowHelpText (const ::rtl::OUString& rsHelpText)
134 {
135     if (msCurrentHelpText != rsHelpText)
136     {
137         const bool bIsVisible (Hide());
138 
139         msCurrentHelpText = rsHelpText;
140 
141         Show(bIsVisible);
142     }
143 }
144 
145 
146 
147 
Show(const bool bNoDelay)148 void ToolTip::Show (const bool bNoDelay)
149 {
150     if (bNoDelay)
151         DoShow();
152     else
153         maTimer.Start();
154 }
155 
156 
157 
158 
DoShow(void)159 void ToolTip::DoShow (void)
160 {
161     if (maTimer.IsActive())
162     {
163         // The delay timer is active.  Wait for it to trigger the showing of
164         // the tool tip.
165         return;
166     }
167 
168     SharedSdWindow pWindow (mrSlideSorter.GetContentWindow());
169     if (msCurrentHelpText.getLength()>0 && pWindow)
170     {
171         Rectangle aBox (
172             mrSlideSorter.GetView().GetLayouter().GetPageObjectLayouter()->GetBoundingBox(
173                 mpDescriptor,
174                 PageObjectLayouter::Preview,
175                 PageObjectLayouter::WindowCoordinateSystem));
176 
177         // Do not show the help text when the (lower edge of the ) preview
178         // is not visible.  The tool tip itself may still be outside the
179         // window.
180         if (aBox.Bottom() >= pWindow->GetSizePixel().Height())
181             return;
182 
183         ::Window* pParent (pWindow.get());
184         while (pParent!=NULL && pParent->GetParent()!=NULL)
185             pParent = pParent->GetParent();
186         const Point aOffset (pWindow->GetWindowExtentsRelative(pParent).TopLeft());
187 
188         // We do not know how high the tool tip will be but want its top
189         // edge not its bottom to be at a specific position (a little below
190         // the preview).  Therefore we use a little trick and place the tool
191         // tip at the top of a rectangle that is placed below the preview.
192         aBox.Move(aOffset.X(), aOffset.Y() + aBox.GetHeight() + 3);
193         mnHelpWindowHandle = Help::ShowTip(
194             pWindow.get(),
195             aBox,
196             msCurrentHelpText,
197             QUICKHELP_CENTER | QUICKHELP_TOP);
198     }
199 }
200 
201 
202 
203 
Hide(void)204 bool ToolTip::Hide (void)
205 {
206     if (mnHelpWindowHandle>0)
207     {
208         Help::HideTip(mnHelpWindowHandle);
209         mnHelpWindowHandle = 0;
210         return true;
211     }
212     else
213         return false;
214 }
215 
216 
217 
218 
IMPL_LINK(ToolTip,DelayTrigger,void *,EMPTYARG)219 IMPL_LINK(ToolTip, DelayTrigger, void*, EMPTYARG)
220 {
221     DoShow();
222 
223     return 0;
224 }
225 
226 } } } // end of namespace ::sd::slidesorter::view
227