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 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 53 ToolTip::~ToolTip (void) 54 { 55 maTimer.Stop(); 56 Hide(); 57 } 58 59 60 61 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 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 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 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 148 void ToolTip::Show (const bool bNoDelay) 149 { 150 if (bNoDelay) 151 DoShow(); 152 else 153 maTimer.Start(); 154 } 155 156 157 158 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 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 219 IMPL_LINK(ToolTip, DelayTrigger, void*, EMPTYARG) 220 { 221 DoShow(); 222 223 return 0; 224 } 225 226 } } } // end of namespace ::sd::slidesorter::view 227