Draw2d中 Figure实现直接编辑框的功能

在GEF中,有直接编辑策略,实现直接编辑的功能不是什么难事。但,

如何在Draw2d中实现直接编辑框的功能呢?

思路:用一个带有Text的Shell,实现直接编辑框的功能。

关键点:Shell的大小设置(关系到该框的外观);Shell的位置设置(关系到是否达到直接编辑框的效果);

例子代码:

private Shell textshell;//可以定义一个全局变量,保证该编辑框的唯一性
 private void createTextShell(String oldTextValue){
  Point point = getRealLocation();//关键点1:shell的位置设置----该方法本文后面有说明
  if (textshell == null || textshell.isDisposed()) {
   textshell = new Shell(Display.getCurrent().getActiveShell(), SWT.NONE);
  }
  textshell.setLocation(point.x, point.y);
  textshell.setSize(110, 20);    //关键点2:shell的大小和text的大小设置,根据需要设置合适的大小
  final Text text = new Text(textshell, SWT.BORDER);//在Shell中定义text
  text.setSize(110, 18);
  text.setText(oldTextValue);
  text.setFont(FontFactory.getFont("Arial", 9, SWT.BOLD));//设置text中的字体,FontFactory是自己定义的类,用户可以定义,这里不讨论
  text.setSelection(0, text.getText().length());//设置text的选中字符,比如这里就是全选
  text.addFocusListener(new FocusListener(){

   @Override
   public void focusGained(FocusEvent e) {
   }

   @Override
   public void focusLost(FocusEvent e) {
    //可以在这里,就是失去焦点的时候把合法的值提交
    }
      
     });
  text.addModifyListener(new ModifyListener() {
   @Override
   public void modifyText(ModifyEvent e) {
     //可以在这里对Text框中输入字符的合法性进行判断  

   }
  });
  textshell.open();//别忘了打开shell
 }

private Point getRealLocation(){//得到编辑框的位置,使得该框正好覆盖在在Draw2d的Figure上,实现直接编辑的功能
  Shell parentShell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
  int pgx = parentShell.getLocation().x;
  int pgy = parentShell.getLocation().y;// 1.shell相对于window窗口的坐标。

//利用该pgx,pgy,当移动RCP的窗口时,使得编辑框始终覆盖在对于的Figure上

 

Point point = getLocation(); //2. getLocation()是Draw2d中Figure类的方法,这里得到的point就是要实现直接编辑功能Figure的位置

 

FigureCanvas fCanvas = ...//这个是Draw2d的最顶层的Canvas容器,在你自己的项目中找到它,目的是获得滚动条的位置

int xSel = fCanvas.getHorizontalBar().getSelection();
int ySel = fCanvas.getVerticalBar().getSelection(); //3. 滚动条坐标

//xxx,yyy,就是根据自己RCP实际窗口的位置及Figure在整个窗口视图中的位置继续调整的数据,可以自己设置,

//直到实现该text刚好覆盖在Figure上面,实现直接编辑的功能
 int realx = pgx +point.x - xSel + xxx;
 int realy = pgy+point.y- ySel + yyy ;
 point = new Point(realx, realy);

  return point;
 }

猜你喜欢

转载自niub.iteye.com/blog/1786626