25 #include "WebFrame.h" |
25 #include "WebFrame.h" |
26 #include "WebFrameView.h" |
26 #include "WebFrameView.h" |
27 #include "BrCtl.h" |
27 #include "BrCtl.h" |
28 #include "StaticObjectsContainer.h" |
28 #include "StaticObjectsContainer.h" |
29 #include "WebSurface.h" |
29 #include "WebSurface.h" |
|
30 #include "WebSprite.h" |
30 |
31 |
31 #include "WebKitLogger.h" |
32 #include "WebKitLogger.h" |
32 |
33 |
33 const int KScrollbarWidth = 15; |
34 const int KMinScrollbarWidth = 10; |
|
35 const int KMaxScrollbarWidth = 15; |
34 const TUint32 KMinScrollBarTransparency = 150; |
36 const TUint32 KMinScrollBarTransparency = 150; |
35 const int KScrollBarFadeInterval = 30000; |
37 const int KScrollBarFadeInterval = 30000; |
36 const TInt32 KScrollBarTransparencyStep = 10; |
38 const TInt32 KScrollBarTransparencyStep = 10; |
37 const int KMinThumbSize = 30; |
39 const int KMinThumbSize = 30; |
38 |
40 |
95 m_hasHScroll = EFalse; |
99 m_hasHScroll = EFalse; |
96 m_webView = view; |
100 m_webView = view; |
97 m_scrollBarTransparency = KMinScrollBarTransparency; |
101 m_scrollBarTransparency = KMinScrollBarTransparency; |
98 m_dY = 0.0; |
102 m_dY = 0.0; |
99 m_dX = 0.0; |
103 m_dX = 0.0; |
|
104 m_rectVThum = TRect(); |
|
105 m_rectHThum = TRect(); |
|
106 m_rect.SetRect(m_webView->brCtl()->Rect().iTl, |
|
107 m_webView->brCtl()->Rect().Size()); |
|
108 m_scrollBarWidth = Max(0.04 * Min(m_rect.Width(), m_rect.Height()), KMinScrollbarWidth); |
100 calculateBitmapRects(); |
109 calculateBitmapRects(); |
101 |
110 |
102 err = SetupBitmaps(); |
111 err = SetupBitmaps(); |
103 |
112 |
104 if (err == KErrNone) { |
113 if (err == KErrNone) { |
105 constructSprite(m_spriteV, m_rectVThum.iTl, m_scrollBarV, m_scrollBarVMask); |
114 if (!m_spriteV) { |
106 constructSprite(m_spriteH, m_rectHThum.iTl, m_scrollBarH, m_scrollBarHMask); |
115 m_spriteV = CWebSprite::NewL(m_webView, m_rectVThum.iTl, m_scrollBarV, m_scrollBarVMask, ETrue); |
|
116 } |
|
117 else { |
|
118 m_spriteV->SetBitmap(m_scrollBarV, m_scrollBarVMask, ETrue); |
|
119 m_spriteV->SetPos(m_rectVThum.iTl); |
|
120 } |
|
121 |
|
122 if (!m_spriteH) { |
|
123 m_spriteH = CWebSprite::NewL(m_webView, m_rectHThum.iTl, m_scrollBarH, m_scrollBarHMask, ETrue); |
|
124 } |
|
125 else { |
|
126 m_spriteH->SetBitmap(m_scrollBarH, m_scrollBarHMask, ETrue); |
|
127 m_spriteH->SetPos(m_rectHThum.iTl); |
|
128 } |
|
129 m_spriteV->Hide(); |
|
130 m_spriteH->Hide(); |
107 } |
131 } |
108 |
132 |
109 return err; |
133 return err; |
110 } |
134 } |
111 |
135 |
164 } |
197 } |
165 else { |
198 else { |
166 |
199 |
167 if (m_hasVScroll) { |
200 if (m_hasVScroll) { |
168 drawThumbMask(m_gcVMask, m_rectVThum); |
201 drawThumbMask(m_gcVMask, m_rectVThum); |
169 updateSprite(m_spriteV, m_scrollBarV, m_scrollBarVMask); |
202 if (m_spriteV) { |
|
203 m_spriteV->Update(m_scrollBarV, m_scrollBarVMask); |
|
204 } |
170 } |
205 } |
171 |
206 |
172 if (m_hasHScroll) { |
207 if (m_hasHScroll) { |
173 drawThumbMask(m_gcHMask, m_rectHThum); |
208 drawThumbMask(m_gcHMask, m_rectHThum); |
174 updateSprite(m_spriteH, m_scrollBarH, m_scrollBarHMask); |
209 if (m_spriteH) { |
175 } |
210 m_spriteH->Update(m_scrollBarH, m_scrollBarHMask); |
176 } |
211 } |
|
212 } |
|
213 } |
|
214 } |
|
215 |
|
216 TBool WebScrollbarDrawer::canRedraw() |
|
217 { |
|
218 return ((m_webView && m_spriteV && m_spriteH) && |
|
219 (m_spriteV->IsShown() || m_spriteH->IsShown())); |
177 } |
220 } |
178 |
221 |
179 void WebScrollbarDrawer::redrawScrollbar() |
222 void WebScrollbarDrawer::redrawScrollbar() |
180 { |
223 { |
181 if (m_webView) { |
224 if (canRedraw()) { |
182 TInt err = KErrNone; |
225 clearSprites(); |
183 calculateBitmapRects(); |
226 removeBitmaps(); |
184 removeBitmaps(); |
227 InitScrollbar(m_webView); |
185 err = SetupBitmaps(); |
228 } |
186 if (err == KErrNone) { |
229 } |
187 m_spriteV.SetPosition(m_rectVThum.iTl); |
230 |
188 updateSprite(m_spriteV, m_scrollBarV, m_scrollBarVMask); |
|
189 m_spriteH.SetPosition(m_rectHThum.iTl); |
|
190 updateSprite(m_spriteH, m_scrollBarH, m_scrollBarHMask); |
|
191 } |
|
192 else { |
|
193 clearSprites(); |
|
194 } |
|
195 } |
|
196 } |
|
197 void WebScrollbarDrawer::drawScrollbar(WebView* view) |
231 void WebScrollbarDrawer::drawScrollbar(WebView* view) |
198 { |
232 { |
199 TPoint p = TPoint(1,1); |
233 TPoint p = TPoint(1,1); |
200 drawScrollbar(view, p); |
234 drawScrollbar(view, p); |
201 } |
235 } |
217 |
251 |
218 if (!m_webView) { |
252 if (!m_webView) { |
219 InitScrollbar(view); |
253 InitScrollbar(view); |
220 } |
254 } |
221 |
255 |
|
256 /* |
|
257 * According to spec vertical scrollbar is always visible |
|
258 * even if user is not scrolling in vertical direction |
|
259 * Horizontal scrollbar is shown only if user scroll in |
|
260 * horizontal direction. If content height < screen height |
|
261 * vertical scrollbar is not shown. The same for horizontal one. |
|
262 */ |
222 if (!m_hasHScroll) { //set it only once |
263 if (!m_hasHScroll) { //set it only once |
223 m_hasHScroll = (scrollPos.iX != 0) && (m_displayWidth < m_docWidth); |
264 m_hasHScroll = (Abs(scrollPos.iX) > 1) && (m_displayWidth < m_docWidth); |
|
265 if (m_hasHScroll) { |
|
266 m_spriteH->Update(m_rectHThum.iTl, m_scrollBarH, m_scrollBarHMask); |
|
267 |
|
268 } |
224 } |
269 } |
225 |
270 |
226 if (!m_hasVScroll) { //set it only once |
271 if (!m_hasVScroll) { //set it only once |
227 m_hasVScroll = (scrollPos.iY != 0) && (m_displayHeight < m_docHeight); |
272 m_hasVScroll = ( (Abs(scrollPos.iY) > 1) || (Abs(scrollPos.iX) > 1) ) && |
228 } |
273 (m_displayHeight < m_docHeight); |
229 |
274 if (m_hasVScroll) { |
230 if ((scrollPos.iY != 0) && (m_displayHeight < m_docHeight)) { |
275 m_spriteV->Update(m_rectVThum.iTl, m_scrollBarV, m_scrollBarVMask); |
|
276 } |
|
277 } |
|
278 |
|
279 if (m_hasVScroll) { |
231 m_dY += m_zoomFactor * ((float)scrollPos.iY * (float)m_displayHeight ) / (float)m_docHeight / 100; |
280 m_dY += m_zoomFactor * ((float)scrollPos.iY * (float)m_displayHeight ) / (float)m_docHeight / 100; |
232 |
281 |
233 if (m_rectVThum.iTl.iY + m_dY < m_rectV.iTl.iY) { |
282 if (m_rectVThum.iTl.iY + m_dY < m_rectV.iTl.iY) { |
234 m_dY = m_rectV.iTl.iY - m_rectVThum.iTl.iY; |
283 m_dY = m_rectV.iTl.iY - m_rectVThum.iTl.iY; |
235 } |
284 } |
245 if (Abs(m_dY) > 1) { |
294 if (Abs(m_dY) > 1) { |
246 m_rectVThum.Move(0, m_dY); |
295 m_rectVThum.Move(0, m_dY); |
247 m_dY = 0.0; |
296 m_dY = 0.0; |
248 } |
297 } |
249 |
298 |
250 m_spriteV.SetPosition(m_rectVThum.iTl); |
299 m_spriteV->SetPos(m_rectVThum.iTl); |
251 updateSprite(m_spriteV, m_scrollBarV, m_scrollBarVMask); |
300 //m_spriteV->Update(m_rectVThum.iTl, m_scrollBarV, m_scrollBarVMask); |
252 } |
301 } |
253 |
302 |
254 |
303 |
255 if ((scrollPos.iX != 0) && (m_displayWidth < m_docWidth)) { |
304 if (m_hasHScroll) { |
256 m_dX = m_zoomFactor * ((float)scrollPos.iX * (float)m_displayWidth ) / (float)m_docWidth / 100; |
305 m_dX = m_zoomFactor * ((float)scrollPos.iX * (float)m_displayWidth ) / (float)m_docWidth / 100; |
257 |
306 |
258 if (m_rectHThum.iTl.iX + m_dX < m_rectH.iTl.iX) { |
307 if (m_rectHThum.iTl.iX + m_dX < m_rectH.iTl.iX) { |
259 m_dX = m_rectH.iTl.iX - m_rectHThum.iTl.iX; |
308 m_dX = m_rectH.iTl.iX - m_rectHThum.iTl.iX; |
260 } |
309 } |
269 |
318 |
270 if (Abs(m_dX) > 1) { |
319 if (Abs(m_dX) > 1) { |
271 m_rectHThum.Move(m_dX, 0); |
320 m_rectHThum.Move(m_dX, 0); |
272 } |
321 } |
273 |
322 |
274 m_spriteH.SetPosition(m_rectHThum.iTl); |
323 m_spriteH->SetPos(m_rectHThum.iTl); |
275 updateSprite(m_spriteH, m_scrollBarH, m_scrollBarHMask); |
324 //m_spriteH->Update(m_rectHThum.iTl, m_scrollBarH, m_scrollBarHMask); |
276 } |
325 } |
277 |
326 } |
278 |
327 |
279 |
|
280 } |
|
281 |
|
282 void WebScrollbarDrawer::constructSprite(RWsSprite& sprite, TPoint& pos, |
|
283 CFbsBitmap* bitmap, CFbsBitmap* bitmapMask) |
|
284 { |
|
285 sprite = RWsSprite(m_webView->brCtl()->CCoeControlParent()->ControlEnv()->WsSession()); |
|
286 RDrawableWindow *window = (RDrawableWindow* )m_webView->brCtl()->CCoeControlParent()->DrawableWindow(); |
|
287 sprite.Construct(*window, pos, ESpriteNoChildClip); |
|
288 |
|
289 TSpriteMember spriteMem; |
|
290 spriteMem.iBitmap = 0;//bitmap; |
|
291 spriteMem.iMaskBitmap = 0;//bitmapMask; |
|
292 spriteMem.iInvertMask = EFalse; |
|
293 |
|
294 sprite.AppendMember(spriteMem); |
|
295 sprite.Activate(); |
|
296 } |
|
297 |
|
298 void WebScrollbarDrawer::updateSprite(RWsSprite& sprite, CFbsBitmap* bitmap, |
|
299 CFbsBitmap* bitmapMask) |
|
300 { |
|
301 TSpriteMember spriteMem; |
|
302 spriteMem.iBitmap = bitmap; |
|
303 spriteMem.iMaskBitmap = bitmapMask; |
|
304 spriteMem.iInvertMask = ETrue; |
|
305 sprite.UpdateMember(0, spriteMem); |
|
306 } |
|
307 |
328 |
308 TInt WebScrollbarDrawer::createBitmap(CFbsBitmap*& bm, CFbsBitGc*& gc, |
329 TInt WebScrollbarDrawer::createBitmap(CFbsBitmap*& bm, CFbsBitGc*& gc, |
309 CFbsBitmapDevice*& dev, TRect& rect) |
330 CFbsBitmapDevice*& dev, TRect& rect) |
310 { |
331 { |
311 TInt err = KErrNone; |
332 TInt err = KErrNone; |
312 bm = new CFbsBitmap(); |
333 bm = new CFbsBitmap(); |
313 if (!bm) { |
334 if (!bm) { |
314 err = KErrNoMemory; |
335 err = KErrNoMemory; |
315 } |
336 } |
316 if (err == KErrNone) { |
337 if (err == KErrNone) { |
317 bm->Create(rect.Size(), EColor256); |
338 err = bm->Create(rect.Size(), EColor256); |
318 } |
339 } |
319 TRAP(err, dev = CFbsBitmapDevice::NewL(bm)); |
340 if (err == KErrNone) { |
|
341 TRAP(err, dev = CFbsBitmapDevice::NewL(bm)); |
|
342 } |
320 if (err == KErrNone && dev != NULL) { |
343 if (err == KErrNone && dev != NULL) { |
321 err = dev->CreateContext(gc); |
344 err = dev->CreateContext(gc); |
322 } |
345 } |
323 if (err != KErrNone) { |
346 if (err != KErrNone) { |
324 delete dev; |
347 delete dev; |
325 } |
348 } |
326 return err; |
349 return err; |
346 } |
369 } |
347 } |
370 } |
348 |
371 |
349 TInt WebScrollbarDrawer::SetupBitmaps() |
372 TInt WebScrollbarDrawer::SetupBitmaps() |
350 { |
373 { |
351 TInt err = KErrNone; |
374 // if rect is empty don't create bitmap |
352 if (!m_scrollBarV) { |
375 TInt err = (m_rectVThum != TRect(0,0,0,0)) ? KErrNone : KErrNotReady; |
|
376 if (!m_scrollBarV && err == KErrNone) { |
353 err = createBitmap(m_scrollBarV, m_gcV, m_devV, m_rectVThum); |
377 err = createBitmap(m_scrollBarV, m_gcV, m_devV, m_rectVThum); |
354 } |
378 } |
355 |
379 |
356 if (!m_scrollBarVMask && err == KErrNone) { |
380 if (!m_scrollBarVMask && err == KErrNone) { |
357 err = createBitmap(m_scrollBarVMask, m_gcVMask, m_devVMask, m_rectVThum); |
381 err = createBitmap(m_scrollBarVMask, m_gcVMask, m_devVMask, m_rectVThum); |
360 if (err == KErrNone) { |
384 if (err == KErrNone) { |
361 drawThumb(m_gcV, m_rectVThum); |
385 drawThumb(m_gcV, m_rectVThum); |
362 drawThumbMask(m_gcVMask, m_rectVThum); |
386 drawThumbMask(m_gcVMask, m_rectVThum); |
363 } |
387 } |
364 |
388 |
|
389 // if rect is empty don't create bitmap |
|
390 if (err == KErrNotReady || KErrNone) { |
|
391 err = (m_rectHThum != TRect(0,0,0,0)) ? KErrNone : KErrNotReady; |
|
392 } |
|
393 |
365 if (!m_scrollBarH && err == KErrNone) { |
394 if (!m_scrollBarH && err == KErrNone) { |
366 err = createBitmap(m_scrollBarH, m_gcH, m_devH, m_rectHThum); |
395 err = createBitmap(m_scrollBarH, m_gcH, m_devH, m_rectHThum); |
367 } |
396 } |
368 |
397 |
369 if (!m_scrollBarHMask && err == KErrNone) { |
398 if (!m_scrollBarHMask && err == KErrNone) { |
373 if (err == KErrNone) { |
402 if (err == KErrNone) { |
374 drawThumb(m_gcH, m_rectHThum); |
403 drawThumb(m_gcH, m_rectHThum); |
375 drawThumbMask(m_gcHMask, m_rectHThum); |
404 drawThumbMask(m_gcHMask, m_rectHThum); |
376 } |
405 } |
377 |
406 |
|
407 if (err == KErrNotReady) { |
|
408 err = KErrNone; |
|
409 } |
378 return err; |
410 return err; |
379 } |
411 } |
380 |
412 |
381 |
413 |
382 void WebScrollbarDrawer::calculateBitmapRects() |
414 void WebScrollbarDrawer::calculateBitmapRects() |
383 { |
415 { |
384 m_zoomFactor = ((float)m_webView->scalingFactor() / 100); |
416 m_zoomFactor = ((float)m_webView->scalingFactor() / 100); |
385 m_rect.SetRect(m_webView->brCtl()->Rect().iTl, |
|
386 m_webView->brCtl()->Rect().Size()); |
|
387 int delta = 0; |
417 int delta = 0; |
388 int posX = m_zoomFactor * m_webView->mainFrame()->frameView()->contentPos().iX; |
418 int posX = m_zoomFactor * m_webView->mainFrame()->frameView()->contentPos().iX; |
389 int posY = m_zoomFactor * m_webView->mainFrame()->frameView()->contentPos().iY; |
419 int posY = m_zoomFactor * m_webView->mainFrame()->frameView()->contentPos().iY; |
390 m_docWidth = m_zoomFactor * m_webView->mainFrame()->frameView()->contentSize().iWidth; |
420 m_docWidth = m_zoomFactor * m_webView->mainFrame()->frameView()->contentSize().iWidth; |
391 m_displayWidth = m_rect.Width(); |
421 m_displayWidth = m_rect.Width(); |