您的位置:软件 > 开发者网络 > 开发工具 > Java > 正文
用JBuilder实现类似Visual Studio的宏扩展功能
[文章信息]
作者:
时间:2003-04-04
出处:
责任编辑:
[文章导读]
我们就通过对一段代码是否注释掉作为简单例子。大家可以实现自己的一些扩展,算是抛玉引砖了
advertisement
热点推荐
· 11.15软件精选 制作MSI文件
· 闪客五周年之闪客光荣榜
· 用Winamp“品尝”无限音乐
· 网络加、解密的技术应用
· 闪客五周年之闪客光荣榜:zoron
[正文]
  对于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"))
{
Keymap keymap = EditorManager.getKeymap();
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);
}
}
}

protected Node getNode()
{
Browser browser = Browser.getActiveBrowser();
Node node = browser.getActiveNode();
if((node instanceof JavaFileNode) && (node.getProject() instanceof JBProject))
return node;
else
return null;
}

protected JotClass getClass(Node node)
{
if((node instanceof JavaFileNode) && (node.getProject() instanceof JBProject))
{
JBProject project = (JBProject)node.getProject();
String filename = ((JavaFileNode)node).getUrl().getFile();
JotPackages pkg = project.getJotPackages();
Url url = new Url(new File(filename));
JotFile jfile = pkg.getFile(url);
JotClass jclasses[] = jfile.getClasses();
if(jclasses.length > 1)
{
System.err.println("More than one class found in source file");
errorMessageText = "More than one class found in source file";
return null;
}
if(jclasses.length == 0)
{
System.err.println("No classes found in source file");
errorMessageText = "No classes found in source file";
return null;
} else
{
return jclasses[0];
}
} else
{
return null;
}
}
}


·"WAP天极之IT新闻资讯,50万元等你拿"    ·天极WAP之游戏狂图,50万元等你下载


发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容阅读排行榜
  • 11.15软件精选 制作MSI文件
  • 闪客五周年之闪客光荣榜
  • 兰欣推出我国第一款网络游戏专用音箱
  • 玩家发现117亡灵种族Bug
  • [配置推荐]极品HIFI配置
  • 东瀛美少女COSPLAY(55)
  • 用Winamp“品尝”无限音乐
  • 迷你型PStwo全面透析专题
  • Advertisement

    天极无线
    待机彩图    >>更多
    多彩动画    >>更多
    美妙和弦    >>更多
    天使在唱歌
    壁虎漫步
    PrettyBoy
    LoveLoveLove
    我是你的小小狗
    单身情歌
    十面埋伏
    祝酒歌
    回心转意
    波斯猫
    太委屈
    S.H.E
    潘玮柏
    M2M
    蔡依林
    阿牛
    林志炫
    陈弈迅
    刀郎
    黑龙
    S.H.E
    陶晶莹
    情人玫瑰坊
    音乐风云
    新片速递
    神秘测试
    都市约会
    ·天极彩信天天精彩
    ·图铃梦工厂下载无限!
    ·找寻童真,卡通专题
    ·夏日激情交友社区!
    ·星座运程,预测人生

    CSEEK搜索