webengine/osswebengine/WebKit/s60/webview/WebScrollbarDrawer.cpp
changeset 13 10e98eab6f85
parent 8 7c90e6132015
child 73 a1a5d4e727e8
equal deleted inserted replaced
8:7c90e6132015 13:10e98eab6f85
    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 
    58 
    60 
    59 
    61 
    60 WebScrollbarDrawer::WebScrollbarDrawer(): 
    62 WebScrollbarDrawer::WebScrollbarDrawer(): 
    61                                         m_webView(NULL),
    63                                         m_webView(NULL),
    62                                         m_scrollBarTransparency(KMinScrollBarTransparency),
    64                                         m_scrollBarTransparency(KMinScrollBarTransparency),
    63                                         m_scrollBarWidth(KScrollbarWidth),
    65                                         m_scrollBarWidth(KMinScrollbarWidth),
    64                                         m_dX(0), m_dY(0)
    66                                         m_dX(0), m_dY(0), m_spriteV(NULL), m_spriteH(NULL)
    65 {
    67 {
    66 }
    68 }
    67 
    69 
    68 
    70 
    69 
    71 
    72   if (m_scrollBarFader) {
    74   if (m_scrollBarFader) {
    73       m_scrollBarFader->Cancel();
    75       m_scrollBarFader->Cancel();
    74   }
    76   }
    75   delete m_scrollBarFader;
    77   delete m_scrollBarFader;
    76   
    78   
    77   removeBitmaps();  
    79   removeBitmaps();
       
    80   delete m_spriteV;
       
    81   delete m_spriteH;
    78 }
    82 }
    79 
    83 
    80 
    84 
    81 void WebScrollbarDrawer::removeBitmaps()
    85 void WebScrollbarDrawer::removeBitmaps()
    82 {
    86 {
    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 
   142 }
   166 }
   143 
   167 
   144 
   168 
   145 void WebScrollbarDrawer::clearSprites()
   169 void WebScrollbarDrawer::clearSprites()
   146 {
   170 {
   147    m_spriteV.Close();
   171    if (m_spriteV) {
   148    m_spriteH.Close();
   172        m_spriteV->Hide();
       
   173        m_spriteV->Update(NULL, NULL);
       
   174        
       
   175    }
       
   176    
       
   177    if (m_spriteH) {
       
   178        m_spriteH->Hide();
       
   179        m_spriteH->Update(NULL, NULL);
       
   180        
       
   181    }
   149 }
   182 }
   150 
   183 
   151 void WebScrollbarDrawer::fade()
   184 void WebScrollbarDrawer::fade()
   152 {
   185 {
   153   m_scrollBarTransparency += KScrollBarTransparencyStep;
   186   m_scrollBarTransparency += KScrollBarTransparencyStep;
   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();