Marker在BIRT中的使用
概要
用过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
相关推荐
使用vue2-water-marker组件实现水印预览
本教程将详细讲解如何利用百度地图API和CSS3来实现marker的动画效果。 首先,让我们理解什么是百度地图的marker。Marker是百度地图API中的一个对象,用于在地图上表示一个具体的地理位置。它通常由一个图标和一个...
以下将详细讲解如何在Android中使用百度地图API实现Marker的平滑移动。 首先,我们需要在项目中集成百度地图SDK。这通常通过在build.gradle文件中添加依赖来完成,例如: ```groovy dependencies { ...
### Eclipse 平台扩展点清单知识点详解 #### 一、概述 Eclipse 是一款非常流行的开源集成开发环境(IDE),支持多种编程语言,尤其是 Java 的开发。为了满足不同开发者的需求,Eclipse 提供了大量的可扩展性机制。...
在Android开发中,高德地图是一个广泛...总的来说,实现高德地图的Marker聚合功能是一个涉及地图API、数据结构和用户交互的综合任务。通过自定义组件和合理的数据处理,我们可以为用户提供更清晰、更友好的地图体验。
6. **优化性能**:为了提供流畅的用户体验,确保在主线程以外执行 Marker 的位置更新操作,可以使用 Handler 或 Runnable 来实现。 7. **考虑兼容性**:如果你的应用需要支持多种Android版本,可能需要针对不同版本...
本项目聚焦于在Android平台上如何利用百度地图SDK实现自定义Marker,以满足个性化需求。 首先,我们需要理解百度地图SDK的基本用法。在Android项目中,需要引入百度地图的SDK库,这可以通过在`build.gradle`文件中...
在使用高德地图进行开发时,我们经常需要在地图上展示一些特定的点,并且有...例如,你可以根据图片内容为不同的marker设置不同的图标,或者使用图片序列来创建动态效果。总的来说,这需要结合实际项目需求来具体实现。
本教程将详细介绍如何在Android应用中使用百度地图SDK v3.0.0来添加覆盖物Marker以及创建InfoWindow,以此来增强地图的交互性和信息展示。 首先,我们需要在项目中引入百度地图SDK。这通常涉及到在`build.gradle`...
首先,我们需要通过Eclipse的在线安装功能来获取freemarkEditor插件。步骤如下: 1. 启动Eclipse,进入工具栏的“帮助”(Help)菜单,然后选择“安装新软件”(Install New Software)。 2. 在弹出的对话框中,点击右...
在本实例中,我们将探讨如何利用SuperMap iClient 6R for JavaScript来添加marker(标记)并进行连线,以实现地理空间数据的可视化。 首先,我们需要了解JavaScript中的marker是什么。Marker通常表示地图上的一个...
Eclipse插件开发是Java开发领域中的一个重要...对于想要深入了解Eclipse平台或RCP开发的人员来说,这是一份宝贵的资源。通过实践这些案例,你将能够熟练掌握Eclipse插件开发的技巧,为自己的开发工作带来极大的便利。
在使用Google Maps API进行Web开发时,经常需要在地图上添加标记(Marker)来指示特定的位置。本教程将深入探讨如何在Google Maps中控制Marker的显示与隐藏,以实现更灵活的地图交互体验。 首先,我们需要了解...
这个例子展示了如何使用OpenLayers创建一个简单的地图应用,将本地图片作为背景,并在地图上添加marker标记。你可以根据自己的需求修改这些代码,例如更改图片和标记的URL,或者调整地图的视图和标记的位置。同时,...
自定义Marker布局可以使用View来设计,然后将其转换成Bitmap,以满足不同的业务需求。例如,可以使用CircleImageView来设计Marker的样式,然后加载网络图片。 知识点五:加载网络图片 加载网络图片可以使用第三方...
- 在Android中,你可以使用`ValueAnimator`或`ObjectAnimator`来实现平滑的动画效果。设置一个时间间隔,每次更新Marker的新位置,使其逐渐接近下一个插值点。 - 动画的更新频率和步长应适中,以保持视觉上的流畅...
- 使用`Point`对象遍历所有的Overlay(包括Marker、Polygon等),调用`contains()`方法判断点击位置是否在某个Overlay内。 - 如果点击的Overlay是Marker,可以通过`Marker`对象的`setTitle()`或`setSnippet()`方法...
本章将讲述如何利用Marker在地图生成点,并实现点击Marker弹出该点对应的信息。 1.点击点获取坐标 2.在我的项目里,会将地图上的一些飞机作为Marker,点击并弹出该飞机对应的详情 3.点击地图其他区域,将清除所有...
对于拖动的圆环范围,我们可以使用`Circle`对象来表示。首先,创建一个圆环: ```java float radius = 1000; // 半径1000米 CircleOptions circleOptions = new CircleOptions().center(initialPosition).radius...
在这个活动中,开发者可能使用了百度地图SDK提供的`MapView`类来加载地图,并调用`BaiduMap`对象的`addOverlay()`方法添加marker。同时,可能还注册了`OnMarkerClickListener`,以便当用户点击marker时能触发相应的...