服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

用jbuilder实现类似visualstudio的宏扩展功能


  对于visual studio的宏,大家应该很熟悉了,这是一篇关于jbuilder实现类似visual studio的宏扩展功能,我们就通过对一段代码是否注释掉作为简单例子。大家可以实现自己的一些扩展,算是抛玉引砖了。
  
  支持环境: jbuilder 4.0 - jbuilder 7.0
  
  使用jbuilder编译时需要在 project ---> project properties ---> required libaries中加上jbuilder下的 open tool sdk,编译成功后将生成的class打包成一个javacommentswitch.jar文件,其中包含这样一个文件meta-inf/manifest.mf,该文件内容如下:
  
  manifest-version: 1.0
  
  opentools-ui: javacommentswitch
  
  不需要什么详细的讲解,代码如下:
  
  /*===============================================
  文件一: ideactions.java
  ===============================================*/
  /**
  *
  
  title: jbuilder ide toolbox
  
  *
  description: http://www.vchelp.net/itbookreview/view_user.asp?user_name=ghost
  
  *
  copyright: copyright (c) 2002 ghost studio. all rights reserved.
  
  *
  company: ghost studio
  
  * @author 阿鬼 [mornlee@21cn.com]
  * @version 1.0
  */
  
  import com.borland.primetime.actions.actiongroup;
  import com.borland.primetime.editor.editorcontextactionprovider;
  import com.borland.primetime.editor.editorpane;
  import javax.swing.action;
  
  public class ideactions
  {
  private static final string string_actiongroupname = "jbuilder ide toolbox"; // activegroup's name
  public static final editorcontextactionprovider contextmenu_actionprovider = new editorcontextactionprovider()
  {
  public action getcontextaction(editorpane target)
  {
  actiongroup actiongroup = new actiongroup();
  actiongroup actionsubgroup = new actiongroup(string_actiongroupname);
  actionsubgroup.add(javacommentswitch.action_generatejavacommentswitch);
  // 此处可以增加更多的功能
  // ......
  actiongroup.add(actionsubgroup);
  return actiongroup;
  }
  
  public int getpriority()
  {
  return 0;
  }
  };
  
  public ideactions()
  {
  }
  
  static class ction
  implements editorcontextactionprovider
  {
  public action getcontextaction(editorpane target)
  {
  actiongroup actiongroup = new actiongroup();
  actiongroup actionsubgroup = new actiongroup(string_actiongroupname);
  actionsubgroup.add(javacommentswitch.action_generatejavacommentswitch);
  actiongroup.add(actionsubgroup);
  return actiongroup;
  }
  
  public int getpriority()
  {
  return 0;
  }
  
  ction()
  {
  }
  }
  
  }
  
  /*===============================================
  文件二: javacommentswitch.java
  ===============================================*/
  
  /**
  *
  
  title: jbuilder ide toolbox
  
  *
  description: http://www.vchelp.net/itbookreview/view_user.asp?user_name=ghost
  
  *
  copyright: copyright (c) 2002 ghost studio. all rights reserved.
  
  *
  company: ghost studio
  
  * @author 阿鬼 [mornlee@21cn.com]
  * @version 1.0
  */
  
  import com.borland.jbuilder.jot.*;
  import com.borland.jbuilder.node.jbproject;
  import com.borland.jbuilder.node.javafilenode;
  import com.borland.primetime.editor.*;
  import com.borland.primetime.ide.browser;
  import com.borland.primetime.node.filenode;
  import com.borland.primetime.node.node;
  import com.borland.primetime.vfs.url;
  import java.awt.event.actionevent;
  import java.beans.propertychangeevent;
  import java.beans.propertychangelistener;
  import java.io.file;
  import java.io.printstream;
  import javax.swing.*;
  import javax.swing.text.jtextcomponent;
  import javax.swing.text.keymap;
  
  public class javacommentswitch extends editoraction
  implements propertychangelistener
  {
  private static final string versionstring = "0.1";
  public static editoraction action_createjavacommentswitch = new javacommentswitch("javacommentswitch");
  protected static string str_long_description = "comment/uncomment for selection."; // 状态条显示
  protected static string str_short_description = "comment/uncomment for selection.";
  public static editoraction action_generatejavacommentswitch = new javacommentswitch("javacommentswitch", true);
  protected static string menu_str_long_description = "comment/uncomment for selection";
  protected static string menu_str_short_description = "comment/uncomment";
  static browser browser = null;
  private editorpane target;
  private string errormessagetext;
  private boolean ismenuaction;
  
  public javacommentswitch(string name)
  {
  super(name);
  target = null;
  errormessagetext = "";
  ismenuaction = false;
  }
  
  public javacommentswitch(string name, boolean ismenuaction)
  {
  super(name);
  target = null;
  errormessagetext = "";
  this.ismenuaction = ismenuaction;
  }
  
  public static void initopentool(byte majorversion, byte minorversion)
  {
  if(majorversion < 4) // 支持jbuilder 4.0以上
  return;
  editormanager.registercontextactionprovider(ideactions.contextmenu_actionprovider);
  action_generatejavacommentswitch.putvalue("longdescription", menu_str_long_description);
  action_generatejavacommentswitch.putvalue("shortdescription", menu_str_short_description);
  editoractions.addbindableeditoraction(action_createjavacommentswitch);
  action_createjavacommentswitch.putvalue("longdescription", str_long_description);
  action_createjavacommentswitch.putvalue("shortdescription", str_short_description);
  keymap keymap = editormanager.getkeymap(); // 支持快捷键 alt + f10
  if(keymap != null)
  {
  keystroke stroke[] = keymap.getkeystrokesforaction(action_createjavacommentswitch);
  if(stroke == null)
  keymap.addactionforkeystroke(keystroke.getkeystroke(java.awt.event.f10,
  java.awt.event.alt_mask ), action_createjavacommentswitch);
  }
  editormanager.addpropertychangelistener((propertychangelistener)action_createjavacommentswitch);
  }
  
  public void actionperformed(actionevent evt)
  {
  target = geteditortarget(evt);
  node thenode = getnode();
  if(thenode == null)
  return;
  jbproject proj = (jbproject)thenode.getproject();
  jotclass theclass = getclass(thenode);
  if(ismenuaction)
  if(theclass != null)
  runjavacommentswitch();
  else
  joptionpane.showmessagedialog(null,
       "current editor target is not a java class.",
       "error creating javadoc", 0);
  }
  
  /**
  * @description
  *
  * @param
  * @return
  * @exception
  */
  private boolean runjavacommentswitch()
  {
  string selection = target.getselectedtext();
  string newselection = "";
  // 去掉注释
  if(selection.trim().startswith("/*") && selection.trim().endswith("*/"))
  {
  stringbuffer sb = new stringbuffer(selection);
  newselection = sb.substring(2, selection.length() - 2);
  }
  // 添加注释
  else
  {
  newselection = string.valueof(string.valueof((new stringbuffer("/*")).append(selection).append("*/")));
  }
  target.replaceselection(newselection);
  return true;
  }
  
  public void propertychange(propertychangeevent evt)
  {
  string propertyname = evt.getpropertyname();
  if(propertyname.equals("keymap"))
  {

扫描关注微信公众号