本站首页 返回顶部 关于博主

Marker在BIRT中的使用

PDF版

概要
  用过BIRT的人应该知道,在进行报表设计的时候,如果当前打开的报表中存在错误,那么在Problems视图中就会列出相关的错误信息。当用户点击其中一条信息的时候,系统就会定位到错误的位置。
  本文将介绍BIRT中是如何实现此功能的。

什么是marker?
  如果要在Problem视图中显示错误信息,并实现错误定位功能,就需要用到marker。
  什么是marker呢?简单的说,他就是一个信息记录,在这个记录里,可能保存了问题的信息(message)、位置(location)、严重程度(priority)等等。
  我们知道,基于Eclipse的应用程序可能由很多plugin组成,它们往往比较复杂。而每个plugin都不得不管理自己的资源,并做好错误信息(或 其他信息)与用户之间的交互工作。为了辅助plugin的作者实现这样的功能,并使其符合使用者的习惯,Eclipse平台提供了一种机制:通过 marker来管理这些信息。 marker可以用在Problems、Tasks、Bookmarks等视图中,当然,只要愿意,它也可以用在你自己定义的视图中。

Marker的相关知识
  Marker的类型和属性都是可以扩展的。我们可以看看接口org.eclipse.core.resources.IMarker,它定义了一些 marker相关的类型和属性常量。在实际的使用过程中,我们要实现这个接口。如果给一个marker,我们从它本身得到的相关信息包括id、类型、属性值等等,除此之外,我们还可以给它自定义属性。
  Maker的属性是用属性名唯一标识的,每个属性名对应一个属性值。属性值只能是三种数据类型:Boolean、Integer、String。
  至于如何定义新的marker,可以参见Eclipse帮助文件,它讲述得很详细。

BIRT中的实现
  在BIRT中,我们没有定义新的marker,它的类型为IMarker.PROBLEM,各种属性(IMarker.MESSAGE、IMarker.LINE_NUMBER、IMarker.LOCATION、IMarker.SEVERITY),都是IMarker中预定义的。

1.创建marker
  创建marker使用的函数是IResouce.createMarker(type);这儿,我们使用的type是IMarker.PROBLEM。

在IDEMultiPageReportEditor.refreshMark()函数中,我们先把原来的marker从file中删掉。代码如下:

           file.deleteMarkers(IMarker.PROBLEM,true,IResource.DEPTH_INFINITE);

接着从ReportDesignHandle得到所有的Warning和Error信息,存放到List中。

           List list = reportDesignHandle.getErrorList( );
           int errorListSize = list.size( );
           list.addAll( reportDesignHandle.getWarningList( ) ); 

最后,遍历List,并创建marker,把List中的信息加到marker中去。

           for ( int i = 0, m = list.size( ); i < m; i++ )
           {
              ErrorDetail errorDetail = (ErrorDetail) list.get( i );
              IMarker marker = file.createMarker( IMarker.PROBLEM );
              Map<String, Object> attrib = new HashMap<String, Object>( );
              // The first part is from error list, the other is from warning
              // list
              if ( i < errorListSize )
              {
                  attrib.put( IMarker.SEVERITY, IMarker.SEVERITY_ERROR );
              }
              else
              {
                  attrib.put( IMarker.SEVERITY, IMarker.SEVERITY_WARNING );
              }
              attrib.put( IMarker.MESSAGE, errorDetail.getMessage( ) );
              attrib.put( IMarker.LINE_NUMBER, errorDetail.getLineNo( ) );
              attrib.put( IMarker.LOCATION, errorDetail.getTagName( ) );              
             if ( errorDetail.getElement( ) != null
                     && errorDetail.getElement( ).getID( ) != 0 )
              {
                  attrib.put( ELEMENT_ID,
                         new Integer( (int) errorDetail.getElement( )
                                .getID( ) ) );
              }
             // set all attributes together to reduce notification events
              marker.setAttributes( attrib );
           } 

2.显示marker
  我们先把这些Marker从IResouce中读出来,仍然是通过id获取marker.使用的函数是IResource.findMarkers(type, true, IResource.DEPTH_INFINITE),它的函数返回值是一个IMarker数组。然后再把这个数组中的内容显示到ProblemView中去。
  由于我们使用的marker type是IMarker.PROBLEM,ProblemView会完成相应的工作,对此,我们不需要做任何工作。

3.定位marker
  当用户双击Problems视图中的marker的时候。如果该marker对应layout中的某个element,那么layout中的这个 element就会被选中,并高亮现实;如果对应masterpage中的某个element,那么就会转到masterpage中,并选中此 element;如果marker信息中在layout和masterpage中找不到对应的element,那么它就转到XML Source中,高亮选中错误的行。

  当用户双击选中的marker的时候,IDE会通过editorPart.getAdapter(class)得到当前EditorPart的IGotoMarker地实现,并调用IGotoMarker.()实现错误定位的功能。
  因此,我们需要IDEMultiPageReportEditor.getAdapter(class)中加入如下代码:

    public Object getAdapter( Class type )
    {
       …………
       if ( type == IGotoMarker.class )
       {
           return new BIRTGotoMarker( this );
       }
       …………
    } 

这儿BIRTGotoMarker是IGotoMarker接口的一个实现。BIRTGotoMarker中,我们需要实现public void gotoMarker( IMarker marker )这个函数就可以。

  Marker在BIRT中的使用的情况大致如此, 更详细的信息,大家可以参见BIRT的源代码。

 BIRT更多信息
  Eclipse BIRT,即Business Intelligence and Reporting Tools,中文译作商业智能与报表工具,是Eclipse开源项目之一。它是一种基于Eclipse的可视化Java报表设计工具。更多BIRT相关的 信息,可以访问安讯中国的官方网站:http://www.actuatechina.com

  Eclipse源代码可以通过CVS获取:
    Host:dev.eclipse.org
    Path:/cvsroot/birt
    Connection type:pserver
    User:anonymous
    Password:(空)


参考资料
1.Eclipse Corner Article:Mark My Word by Dejan Glozic, IBM and Jeff McAffer, OTI
2.Eclipse Platform API Specification




请你留言