Chinaunix首页 | 论坛 | 博客
  • 博客访问: 651801
  • 博文数量: 160
  • 博客积分: 2384
  • 博客等级: 大尉
  • 技术积分: 1366
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-01 11:35
文章分类
文章存档

2015年(45)

2014年(36)

2012年(28)

2011年(37)

2010年(2)

2009年(10)

2008年(2)

分类: 系统运维

2009-03-05 14:44:47

(三)、改变标签颜色
构造工作表的标签所在类为 svtools/inc/tabbar.hxx中的TabBar类。
分析这个类其中void TabBar::Paint( const Rectangle& )中绘制标签,所以我们从这里入手改变标签颜色。
里面有四个变量:
1112     Color                   aFaceColor;
1113     Color                   aSelectColor;
1114     Color                   aFaceTextColor;
1115     Color                   aSelectTextColor;
1116     ImplGetColors( aFaceColor, aFaceTextColor, aSelectColor, aSelectTextColor );

从名字上完全可以猜到他们的用途。可以查看上面的函数ImplGetColors函数,如何设置了四个颜色。Ooo默认为为其设置的颜色就是默认的灰和白。

TabBar每次初始化和构造的时候都要插入标签。这里的标签是一个多边形,是一个结构体,也在tabbar.cxx文件中声明。

68 struct
ImplTabBarItem                                                                                                  
  69 {
  70     USHORT          mnId;
  71     TabBarPageBits  mnBits;
  72     XubString       maText;
  73     XubString       maHelpText;
  74     Rectangle       maRect;
  75     long            mnWidth;
  76     ULONG           mnHelpId;
  77     BOOL            mbShort;
  78     BOOL            mbSelect;
  79     BOOL            mbEnable;
  80 // Ryan add begin
  81     Color           maFaceColor;//设置的颜色
  82     BOOL            mbSetColor;//是否设置
  83 // Ryan add end
  84
  85                     ImplTabBarItem( USHORT nItemId, const XubString& rText,
  86                                     TabBarPageBits nPageBits ) :
  87                         maText( rText )
  88                     {
  89                         mnId     = nItemId;
  90                         mnBits   = nPageBits;
  91                         mnWidth  = 0;
  92                         mnHelpId = 0;
  93                         mbShort  = FALSE;
  94                         mbSelect = FALSE;
  95                         mbEnable = TRUE;
  96                         // Ryan add begin
  97                         mbSetColor = FALSE;
  98                         // Ryan add end
  99                     }
 100 };

结构体的每项就是标签的内容,我添加了所设置的颜色和是否设置两个属性。

svtools/inc/tabbar.hxx中添加我们自己的三个函数。
427     // Ryan add begin
        //设置当前标签的颜色
428     void            SetPaintColor( const Color& aFaceColor );
        //某个标签是否设置了标签颜色
429     BOOL            IsPageSetColor( USHORT nPageId, Color& aFacecolor );
        //设置某个标签的颜色
430     void            SetPageColor( USHORT nPageId, const Color& afaceColor );
431     // Ryan add end

svtools/source/control/tabbar.cxx的函数实现:
1006 //------------------------------------------------------------------------
1007 // Ryan add begin
1008 BOOL TabBar::IsPageSetColor( USHORT nPageId, Color& aFaceColor )
1009 {
1010     USHORT nPos = GetPagePos( nPageId );
1011     if ( nPos != TAB_PAGE_NOTFOUND )
1012     {
1013         if ( mpItemList->GetObject( nPos )->mbSetColor )
1014         {
1015             aFaceColor = mpItemList->GetObject( nPos )->maFaceColor;
1016             return TRUE;
1017         }
1018     }
1019    
1020     return FALSE;
1021 }
1022 // Ryan add end

1025 // Ryan add begin
1026 void TabBar::SetPageColor( USHORT nPageId, const Color& aFaceColor )
1027 {
1028     USHORT nPos = GetPagePos( nPageId );
1029     if ( nPos !=  TAB_PAGE_NOTFOUND )
1030     {
1031         mpItemList->GetObject( nPos )->maFaceColor = aFaceColor;
1032         mpItemList->GetObject( nPos )->mbSetColor = TRUE;
1033
1034         // Leiste neu ausgeben
1035         if ( IsReallyVisible() && IsUpdateMode() )
1036             Invalidate();
1037
1038         CallEventListeners( VCLEVENT_TABBAR_PAGETEXTCHANGED, reinterpret_cast(sal::static_int_cast(nP     ageId)) );
1039        
1040     }
1041
1042 }
1043 // Ryan add end

1046 //Ryan add begin
1047 void TabBar::SetPaintColor( const Color& aFaceColor )
1048 {
1049     USHORT nPos = GetPagePos( GetCurPageId() );
1050     if ( nPos != TAB_PAGE_NOTFOUND )
1051     {
1052         if ( 16777215 == aFaceColor.GetColor() )
1053         {
1054             mpItemList->GetObject( nPos )->mbSetColor = FALSE;
1055             mpItemList->GetObject( nPos )->maFaceColor = aFaceColor;
1056         }
1057         else
1058         {
1059             mpItemList->GetObject( nPos )->maFaceColor = aFaceColor;
1060             mpItemList->GetObject( nPos )->mbSetColor = TRUE;
1061         }
1062         // Leiste neu ausgeben
1063         if ( IsReallyVisible() && IsUpdateMode() )
1064             Invalidate();
1065
1066         CallEventListeners( VCLEVENT_TABBAR_PAGETEXTCHANGED, reinterpret_cast(sal::static_int_cast(Ge     tCurPageId())) );
1067        
1068     }
1069 }
1070 // Ryan add end

void TabBar::Paint( const Rectangle& )中每次绘制的时候判断标签是否设置颜色,如果设置就用设置的颜色,否则设定系统的颜色。
1223                    // Ryan add begin
1224                    // SetFillColor( aNewSelectColor );
1225                    if ( pItem->mbSetColor )
1226                    {
1227                         SetFillColor( pItem->maFaceColor );
1228                        
1229                         SetTextColor( Color(RGB_COLORDATA(
1230                                         255 - pItem->maFaceColor.GetRed(),
1231                                         255 - pItem->maFaceColor.GetBlue(),
1232                                         255 - pItem->maFaceColor.GetGreen()
1233                                          ) ) );
1234                    }
1235                    else
1236                    {
1237                         SetFillColor( aSelectColor );
1238                         SetTextColor( aSelectTextColor );
1239                    }
1240                     //SetTextColor( aSelectTextColor );
                        // Ryan add end


在sc/source/ui/view/tabvwshf.cxx中处理函数和状态处理函数中进行颜色设置的调用。
void ScTabViewShell::ExecuteTable( SfxRequest& rReq )中添加
349         // Ryan add begin
350         case FID_TAB_COLORSET:
351             {
352                 Color aNewFaceColor, aOldFaceColor ;
353            
354                 if( pReqArgs != NULL )
355                 {
356                     const SfxPoolItem* pItem;
357                     if( IS_AVAILABLE( FID_TAB_COLORSET, &pItem ) )
358                         aNewFaceColor.SetColor(((const SvxColorItem*)pItem)->GetValue().GetColor());
359                 }
360            
361                 BOOL bTemp = pViewData->GetViewShell()->GetTabControl()->IsPageSetColor( static_cast( pViewDa    ta->GetTabNo() )+1, aOldFaceColor );
362                 if (!bTemp && (aNewFaceColor.GetColor() == 16777215))
363                 {
364                     break;
365                 }
366                 if ( aNewFaceColor.GetColor() != aOldFaceColor.GetColor())
367                 {
368                     pViewData->GetViewShell()->GetTabControl()->SetPaintColor( aNewFaceColor );
369                     pViewData->GetDocShell()->SetModified(TRUE) ;//变为更新状态, 这个时候保存功能和按钮都会Enable
370                 }
371             }
372             break;
373         // Ryan add end

void ScTabViewShell::GetStateTable( SfxItemSet& rSet )中添加如下代码(不需要获取其详细状态,相当于什么也没有做):
820             // Ryan add begin                                                            
821             case FID_TAB_COLORSET:
822                 {
823                 }
824                 break;
825             // Ryan add end

从ViewShell访问TabBar类的操作,分析了若干个类的继承关系,从ScTabControl访问是最起当的。
sc/source/ui/inc/tabview.hxx中添加:
282     // Ryan add begin                                                                    
283     ScTabControl*   GetTabControl() const;
284     // Ryan add end

重新编译sc模块。选择颜色就可以设定标签颜色了。

以为大功告成的时候,你操作一下重命名或者是插入标签操作,所设定的颜色全部消失了。跟了一下代码路线,发现每当作更新操作的时候,Ooo都要把以前全部Clear掉,然后再重新插入,是否有点不合理呢?
发现在sc/source/ui/view/tabcont.cxx中, void ScTabControl::UpdateStatus()扮演这个角色。
352     if (bModified)
353     {
354         Clear();
每当执行Clear()的时候所有标签要重新构建一次并进行插入。

我是这么做的,在它Clear之前我把设置过的标签进行保存,等重新建立以后我把,设置过标签的颜色再次进行设置。
339     // Ryan add begin
340    
341     std::vector bSetColor;
342     Color aTempColor;
343     std::vector aFaceColor;
344     std::vector aPageName;
345     for (i = 0; i < nCount; i++)
346     {
347         aPageName.push_back( GetPageText( static_cast(i)+1 ) );
348         bSetColor.push_back( static_cast(IsPageSetColor( static_cast(i)+1, aTempColor ) ) );
349         aFaceColor.push_back( aTempColor );
350     }
351     // Ryan add end
352     if (bModified)
353     {
354         Clear();

然后再进行设置
355         // Ryan add begin
356         /*
357         for (i=0; i358             if (pDoc->IsVisible(i))
359             if (pDoc->GetName(i,aString))
360                 if ( pDoc->IsScenario(i) )
361                     InsertPage( static_cast(i)+1, aString, TPB_SPECIAL );
362                 else
363                     InsertPage( static_cast(i)+1, aString );
364          */
365         for (i=0; i366         {
367             if (pDoc->IsVisible(i))
368             {
369                 if (pDoc->GetName(i,aString))
370                 {
371                     if ( pDoc->IsScenario(i) )
372                         InsertPage( static_cast(i)+1, aString, TPB_SPECIAL );
373                     else
374                         InsertPage( static_cast(i)+1, aString );
375                     for (int j = 0; j < nCount; j++)
376                     {  
377                         if ( bSetColor.at(j) && aString == aPageName.at(j) )
378                         {
379                             SetPageColor( static_cast(i)+1, aFaceColor.at(j) );
380                         }
381                     }
382                 }
383             }
384         }                                                                                                               
385         // Ryan add end

387     SetCurPageId( static_cast(pViewData->GetTabNo()) + 1 );
388    // Ryan add begin
389     sal_uInt16 nTemp = static_cast(pViewData->GetTabNo());
390     if ( bSetColor.at(nTemp) )
391     {
392         SetPageColor( static_cast(nTemp)+1, aFaceColor.at(nTemp) );
393     }
394     // Ryan add end





阅读(1930) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~