(三)、改变标签颜色
构造工作表的标签所在类为 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
阅读(1987) | 评论(0) | 转发(0) |