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

2015年(45)

2014年(36)

2012年(28)

2011年(37)

2010年(2)

2009年(10)

2008年(2)

分类: 系统运维

2009-03-04 10:49:46

首先我们来明确一下功能需求。

在工作表标签上单击鼠标右键展开其右键菜单,单击“工作表标签颜色”的菜单项,展开颜色子菜单,如上图所示,选中当前标签的颜色所对应的颜色项,默认选中“默认”菜单项, 单击菜单中的颜色项,该颜色项被选中(其前部显示选中状态的对号),关闭菜单,同时在工作表标签上应用该颜色。

当文件编辑完成之后和文件内容一同保存。

(一)增加右键菜单项“工作表标签颜色”。

sc/source/ui/src/popup.src文件是有关弹出菜单项的命名资源文件。

Menu RID_POPUP_TAB中加入“工作表标签颜色”菜单项的命名。加入如下代码:                       

        // Ryan add beging

        MenuItem
        {
            Identifier = FID_TAB_COLORSET ;
            HelpId = FID_TAB_COLORSET ;
            Text [ en-US ] = "Set Sheet Color" ;
        };

        // Ryan add end

在对应的本地化模块中,做汉化内容的显示。也就是文件sc/source/ui/src/localize.sdf中加入如下代码:

// Ryan add begin

sc  source\ui\src\popup.src 0   menuitem    RID_POPUP_CELLS SID_SELECTALL   SID_SELECTALL       0   zh-CN   全部选中(~S)                2002-02-02 02:02:02

// Ryan add end

资源文件的投文件 sc/inc/sc.hrc 中给我们新的菜单项分配一个Id. 添加如下代码:

// Ryan add begin

#define FID_TAB_COLORSET        (TAB_POPUP_START+8)

// Ryan add end

在sc/sdi/scalc.sdi中设置FID_TAB_COLORSET的属性。没有搞懂各元素的意思,仿造其他的就好了。

在sc/sdi/docsh.sdi的interface TableSelection和
sc/sdi/tabvwsh.sdi的interface Tables中 中分别添加处理函数(ExecMethod)和状态函数(StateMethod)。

FID_TAB_COLORSET    [ ExecMethod = ExecuteTable; StateMethod = GetStateTable; ]

进入SC模块重新编译, 拷贝生成的库文件和资源文件到安装目录,菜单项就可以显示了。
cd unxlngi6.pro/lib/
cp * /opt/openoffice.org/basis3.0/program/
cd ../bin/

cp *.res /opt/openoffice.org/basis3.0/program/resource/

(二)点击“工作表标签颜色”菜单项弹出PopupMenu,我们创建一个这样的类。

分创造类的头文件和源文件。命名为:sc/inc/TabBarColor.hxx, sc/source/ui/cctrl/TabBarColor.cxx.

如何创建类呢?我们仿造一下Ooo中已经存在的类似东西。仿造svx/inc/svx/fntszctl.hxx这个类怎么实现的就可以了。删除没有用的函数,添加我们自己的函数,把名字修改了就可以。这就叫“优秀的艺术家是拷贝,伟大的艺术家是偷盗”。
sc/inc/TabBarColor.hxx的内容如下:

 31 // Ryan add begin
 32 #ifndef _SC_TABBARCOLOR_HXX
 33 #define _SC_TABBARCOLOR_HXX
 34
 35
 36 // include ---------------------------------------------------------------
 37
 38 #include
 39 #include
 40
 41 class SfxBindings;
 42 class PopupMenu;
 43
 44 // class ScTabBarColorControl ------------------------------------------
 45
 46 class ScTabBarColorControl : public SfxMenuControl
 47 {
 48 private:
 49     PopupMenu*      pMenu;
 50     Menu&           rParent;
 51
 52 //#if 0 // _SOLAR__PRIVATE
 53     DECL_LINK( MenuSelect, PopupMenu* );
 54 //#endif
 55
 56 public:
 57     ScTabBarColorControl(   USHORT nId, Menu&, SfxBindings& );                                                          
 58     ~ScTabBarColorControl();
 59
 60     virtual PopupMenu*  GetPopup() const;
 62     void    SetCheckItem();
 63     SFX_DECL_MENU_CONTROL();
 64     //char* chColor;
 65 };
    // Ryan add end

sc/source/ui/cctrl/TabBarColor.cxx源文件中,创建弹出窗口的时候插入菜单项。
主要代码:
ScTabBarColorControl::ScTabBarColorControl
(
    USHORT             _nId,
    Menu&            rMenu,
    SfxBindings&    rBindings
) :
    SfxMenuControl( _nId, rBindings ),

    pMenu    ( new PopupMenu ),
    rParent    ( rMenu )
{
    rMenu.SetPopupMenu( _nId, pMenu );

    String aString[] = {
                        String( ScResId(RID_TABBAR_DEFAULT) ),
                        String( ScResId(RID_TABBAR_COLOR1) ),
                        String( ScResId(RID_TABBAR_COLOR2) ),
                        String( ScResId(RID_TABBAR_COLOR3) ),
                        String( ScResId(RID_TABBAR_COLOR4) ),
                        String( ScResId(RID_TABBAR_COLOR5) ),
                        String( ScResId(RID_TABBAR_COLOR6) ),
                        String( ScResId(RID_TABBAR_COLOR7) ),
                        String( ScResId(RID_TABBAR_COLOR8) ),
                        String( ScResId(RID_TABBAR_COLOR9) ),
                        String( ScResId(RID_TABBAR_COLOR10) ),
                        String( ScResId(RID_TABBAR_COLOR11) ),
                        String( ScResId(RID_TABBAR_COLOR12) ),
                        String( ScResId(RID_TABBAR_COLOR13) ),
                        String( ScResId(RID_TABBAR_COLOR14) ),
                        String( ScResId(RID_TABBAR_COLOR15) ),
                        String( ScResId(RID_TABBAR_COLOR16) ),
                        String( ScResId(RID_TABBAR_COLOR17) ),
                        String( ScResId(RID_TABBAR_COLOR18) ),
                        String( ScResId(RID_TABBAR_COLOR19) ),
                        String( ScResId(RID_TABBAR_COLOR20) ),
                        String( ScResId(RID_TABBAR_COLOR21) )
                };

    ImageList aEntryImages( ScResId(RID_IMAGELIST_TABBARCOLOR) );
    pMenu->InsertItem( 0, aString[0] );
    for (int i = 1; i < 22; i++)
    {
        pMenu->InsertItem(i, aString[i], aEntryImages.GetImage( i ) );
    }
   
    SetCheckItem();
    pMenu->SetSelectHdl(  LINK( this, ScTabBarColorControl, MenuSelect ) );
}

以上的菜单项内容和图片资源都在资源文件中申明,并做本地化。

每次选定菜单项的时候我们返回所选择的Color.
IMPL_LINK( ScTabBarColorControl, MenuSelect, PopupMenu*, pMen )
{
    USHORT nItemId = pMenu->GetCurItemId();
    Color aColor;
    switch(nItemId)
    {
        case 0:
            aColor = Color( RGB_COLORDATA(255, 255, 255) );
            break;
        case 1:
            aColor = Color( RGB_COLORDATA(249, 251, 118) );
            break;
        case 2:
            aColor = Color( RGB_COLORDATA(248, 249, 0) );
            break;
        case 3:
            aColor = Color( RGB_COLORDATA(187, 189, 0) );
            break;
        case 4:
            aColor = Color( RGB_COLORDATA(154, 211, 168) );
            break;
        case 5:
            aColor = Color( RGB_COLORDATA(0, 171, 94) );
            break;
        case 6:
            aColor = Color( RGB_COLORDATA(0, 135, 75) );
            break;
        case 7:
            aColor = Color( RGB_COLORDATA(158, 210, 244) );
            break;
        case 8:
            aColor = Color( RGB_COLORDATA(61, 82, 171) );
            break;
        case 9:
            aColor = Color( RGB_COLORDATA(46, 59, 135) );
            break;
        case 10:
            aColor = Color( RGB_COLORDATA(186, 151, 199) );
            break;
        case 11:
            aColor = Color( RGB_COLORDATA(124, 0, 151) );
            break;
        case 12:
            aColor = Color( RGB_COLORDATA(97, 0, 119) );
            break;
        case 13:
            aColor = Color( RGB_COLORDATA(235, 124, 176) );
            break;
        case 14:
            aColor = Color( RGB_COLORDATA(299, 0, 144) );
            break;
        case 15:
            aColor = Color( RGB_COLORDATA(176, 0, 133) );
            break;
        case 16:
            aColor = Color( RGB_COLORDATA(228, 53, 35) );
            break;
        case 17:
            aColor = Color( RGB_COLORDATA(174, 53, 35) );
            break;
        case 18:
            aColor = Color( RGB_COLORDATA(141, 0, 0) );
            break;
        case 19:
            aColor = Color( RGB_COLORDATA(202, 202, 202) );
            break;
        case 20:
            aColor = Color( RGB_COLORDATA(141, 141, 141) );
            break;
        case 21:
            aColor = Color( RGB_COLORDATA(0, 0, 0) );
            break;
        default:
            aColor = Color( RGB_COLORDATA(255, 255, 255) );
            break;
    }
    SvxColorItem aItem( aColor, FID_TAB_COLORSET );//和Slot Id 自动关联。
    GetBindings().GetDispatcher()->Execute( FID_TAB_COLORSET, SFX_CALLMODE_RECORD, &aItem, 0L );
    return 1;
}

根据菜单项的颜色,确定其选定状态。
void ScTabBarColorControl::SetCheckItem()
{
    ScViewData* pViewData=ScDocShell::GetViewData();
    Color aFaceColor;
    int nTemp = static_cast(pViewData->GetTabNo());   
    if ( !pViewData->GetViewShell()->GetTabControl()->IsPageSetColor( static_cast(nTemp)+1, aFaceColor ) )
    {
        pMenu->CheckItem( 0 );
    }
    else
    {
        switch( aFaceColor.GetColor() )
        {
            case 16382838:
                pMenu->CheckItem( 1 );
                break;
            case 16316672:
                pMenu->CheckItem( 2 );
                break;
            case 12303616:
                pMenu->CheckItem( 3 );
                break;
            case 10146728:
                pMenu->CheckItem( 4 );
                break;
            case 43870:
                pMenu->CheckItem( 5 );
                break;
            case 34635:
                pMenu->CheckItem( 6 );
                break;
            case 10408692:
                pMenu->CheckItem( 7 );
                break;
            case 4018859:
                pMenu->CheckItem( 8 );
                break;
            case 3029895:
                pMenu->CheckItem( 9 );
                break;
            case 12228551:
                pMenu->CheckItem( 10 );
                break;
            case 8126615:
                pMenu->CheckItem( 11 );
                break;
            case 6357111:
                pMenu->CheckItem( 12 );
                break;
            case 15432880:
                pMenu->CheckItem( 13 );
                break;
            case 2818192:
                pMenu->CheckItem( 14 );
                break;
            case 11534469:
                pMenu->CheckItem( 15 );
                break;
            case 14955811:
                pMenu->CheckItem( 16 );
                break;
            case 11416867:
                pMenu->CheckItem( 17 );
                break;
            case 9240576:
                pMenu->CheckItem( 18 );
                break;
            case 13290186:
                pMenu->CheckItem( 19 );
                break;
            case 9276813:
                pMenu->CheckItem( 20 );
                break;
            case 0:
                pMenu->CheckItem( 21 );
                break;
            default:
                break;
        }
    }
}

在sc/source/ui/app/scdll.cxx 注册我们的FID_TAB_COLORSET,这样就可以我们定义的FID_TAB_COLORSET和ScTabBarColorControl相关,会根据Ooo的工厂机制动态创建弹出窗口。
ScTabBarColorControl            ::RegisterControl(FID_TAB_COLORSET,         pMod );

修改sc/source/ui/cctrl/makefile.mk,加入TabBarColor.obj
重新编译。点击的时候就可以弹出菜单了。
阅读(2131) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-01-20 20:13:14

你好,作者,你有这部分工程的代码吗,我想研究下,如果可以的话发到我的邮箱中,qiuwei0911@gmail.com,谢谢