前两天一直在看gmf,这两天又看birt,关于gmf的很多东东都忘记了,所以今天又看看想把一些东西写出来,否则以后又得从头开始看了。因为要做一个图形编辑器,里面要有很多图片,而且图片要放在文本后面,比如一个html编辑器就需要有个文本框,而在文本框前面应该有文本信息,比如“姓名”。而在gmf中通过emf自动生成的都是先显示图片后显示文本,下了很多功夫也没研究出什么好方法,但还是对付实现了。默认情况下与editpart对应的figure是WrappingLabel,看一下它的paintFigure方法:
public void paintFigure(Graphics graphics) {
super.paintFigure(graphics);
if (hasIcons()) {
paintIcons(graphics);
}
}
这里paintIcons方法就是绘制前面小图标的方法,所以这里需要一个类继承WrappingLabel类,重写paintFigure方法,主要就是不让它调用paintIcons方法,因为paintIcons方法是私有的,所以不能重写它,只能重写paintFigure方法,把这个类取名MyWrappingLabel,实现如下:
public class MyWrappingLabel extends WrappingLabel{
public void paintFigure(Graphics graphics) {
if (isOpaque())
graphics.fillRectangle(getBounds());
if (getBorder() instanceof AbstractBackground)
((AbstractBackground) getBorder()).paintBackground(this, graphics, NO_INSETS);
}
public MyWrappingLabel() {
super();
// ToolbarLayout tbl = new ToolbarLayout();
// tbl.setVertical(false);
// this.setLayoutManager(tbl);
}
}
还需要在editpart里做相应的修改,因为上面只是把文本前面的图标去掉了,我们还要在文本后面加上我们想要的图标,这里我假设与editpart对应的figure类为CodeFigure,则gmf自动生成的代码类似如下:
public class CodeFigure extends RectangleFigure {
/**
* @generated
*/
private WrappingLabel fFigureCodeLabelFigure;
/**
* @generated
*/
public CodeFigure() {
FlowLayout layoutThis = new FlowLayout();
layoutThis.setStretchMinorAxis(false);
layoutThis.setMinorAlignment(FlowLayout.ALIGN_LEFTTOP);
layoutThis.setMajorAlignment(FlowLayout.ALIGN_LEFTTOP);
layoutThis.setMajorSpacing(5);
layoutThis.setMinorSpacing(5);
layoutThis.setHorizontal(true);
this.setLayoutManager(layoutThis);
createContents();
}
/**
* @generated
*/
private void createContents() {
fFigureCodeLabelFigure = new WrappingLabel();
fFigureCodeLabelFigure.setText("<...>");
this.add(fFigureCodeLabelFigure);
}
........等这里没有全贴出来,因为只需要在构造函数和createContents方法里做些手脚就可以搞定了
public class CodeFigure extends RectangleFigure {
/**
* @generated
*/
private WrappingLabel fFigureCodeLabelFigure;
/**
* @generated not
*/
public CodeFigure() {
GridLayout layout = new GridLayout(2, false);
setLayoutManager(layout);
createContents();
}
/**
* @generated not
*/
private void createContents() {
fFigureCodeLabelFigure = new MyWrappingLabel();
fFigureCodeLabelFigure.setText("aaaaaaaa");
add(fFigureCodeLabelFigure, new GridData(SWT.BEGINNING,
SWT.BEGINNING, false, false, 1, 1));
add(new ImageFigure(getImage()), new GridData(SWT.BEGINNING,
SWT.BEGINNING, false, false, 1, 1));
}
private Image getImage() {
return getImageImage("icons/full/obj16/Code.gif "); //$NON-NLS-1$
}
protected Image getImageImage(String path) {
Image image = JFaceResources.getImageRegistry().get(path);
if (image == null) {
ImageDescriptor descriptor = AbstractUIPlugin
.imageDescriptorFromPlugin("myemf.edit ", path); //$NON-NLS-1$
if (descriptor == null) {
descriptor = ImageDescriptor.getMissingImageDescriptor();
}
JFaceResources.getImageRegistry().put(path,
image = descriptor.createImage());
}
return image;
}
红色的地方是需要注意的地方,比如generated not, 比如原来是generated,如果不改动,则在下次从emf生成gmf的时候则会把修改的东西覆盖掉,而myemf.edit 是你存放图片的插件的名称(确切的说是插件id),而icons/full/obj16/Code.gif 是图片在相应插件下的相对路径。
好了小功告成!