论坛首页 Java版

一步一步,跟我做插件!

浏览 14383 次
该帖已经被评为精华帖
作者 正文
最后更新时间:2004-09-07
本贴是写一个Eclipse3.0下的一个插件开发,

其实都是些很容易的东东,

只不过别人都不爱写罢了,
偶也是随手乱画几笔,
请不要见笑,
首先,声明一下,
在Eclipse3.0下开发插件,如果是简单的插件,
写的代码很少,很少,
如果是功能很全的,
那么,要用到的知识会很多,
你也不要问我,
我JAVA水平很差的,
:)


好!开始!

起飞了!
   
最后更新时间:2004-09-07
建工程,

如图,

选中,编辑器类的插件,
这个插件主要是生成的代码多,

写的少!

如果还不知道这两个图是怎么出来的,
那么,显然你的水平,比你还稍有不足,

应该不学写插件,
而学学使用插件,
   
0 请登录后投票
最后更新时间:2004-09-07
生成的工程如图所示,

偶起的工程名为,JSPedit

想编辑JSP文件,
只对JSP文件,加个语法加亮的功能,

至少,.就能弹出类的方法的这种插件,偶是一辈子都做不来的,

你可以,按偶的这个方法,写JS 的插件,CSS的插件,VM的插件,
。。。。。。
或者把这些个插件,都写成一个插件,
。。。HOHO

值的注意的是,
JSPedit 下面,有一个文件,

这个可是个入口的东东,
不能没有,
在edit 下面,有12个文件,

数好了,
下面,我们就在这上面,进行改动了,

如果这一步还没完成的话,
请参考,网上的那个,helloWorld插件的例子,
如eclipse的帮助 ,或找个人问问,
但别问偶,
:)
   
0 请登录后投票
最后更新时间:2004-09-07
插件主文件,
看到了吧,
事件的东东,基本全在这里呢,

别以为偶比你看懂了多少东西,
偶也那么回事,

不过,这回这个文件,不用修改
   
0 请登录后投票
最后更新时间:2004-09-07
打开这个文件,
如图:

嘿嘿,小加一些语法
[code:1]
package jspedit.editors;

import org.eclipse.jface.text.rules.*;

public class XMLPartitionScanner extends RuleBasedPartitionScanner {
public final static String XML_DEFAULT = "__xml_default";
public final static String XML_COMMENT = "__xml_comment";
public final static String XML_TAG = "__xml_tag";

public final static String JSP_HEADER_TAG = "__jsp_header_tag";
public final static String JSP_COMMENT_TAG = "__jsp_comment_tag";
public final static String JSP_TAG = "__jsp_tag";
public final static String JSP_OUT_TAG = "__jsp_out_tag";

public XMLPartitionScanner() {

IToken xmlComment = new Token(XML_COMMENT);
IToken tag = new Token(XML_TAG);

IToken jspHeaderTag = new Token(JSP_HEADER_TAG);
IToken jspCommentTag = new Token(JSP_COMMENT_TAG);
IToken jspTag = new Token(JSP_TAG);
IToken jspOutTag = new Token(JSP_OUT_TAG);

IPredicateRule[] rules = new IPredicateRule[12];

rules[0] = new MultiLineRule("<!--", "-->", xmlComment);
rules[1] = new MultiLineRule("<%--", "--%>", jspCommentTag);
rules[2] = new MultiLineRule("<%@", "%>", jspHeaderTag);
rules[3] = new MultiLineRule("<%=", "%>", jspOutTag);
rules[4] = new MultiLineRule("<%", "%>", jspTag);
rules[5] = new MultiLineRule("<html:", ">", jspTag);
rules[6] = new MultiLineRule("<logic:", ">", jspTag);
rules[7] = new MultiLineRule("<bean:", ">", jspTag);
rules[8] = new MultiLineRule("</html:", ">", jspTag);
rules[9] = new MultiLineRule("</logic:", ">", jspTag);
rules[10] = new MultiLineRule("</bean:", ">", jspTag);
rules[11] = new TagRule(tag);

setPredicateRules(rules);
}
}
[/code:1]
   
0 请登录后投票
最后更新时间:2004-09-07
我最烦人的就是,那个双击事件,
一点子选中一行,
偶喜欢,JAVA的那种,在。号分开的,

那么,小改一下,这个文件,

当然,你也可以不改的,
没多大关系

[code:1]
package jspedit.editors;

import org.eclipse.jface.text.*;

public class XMLDoubleClickStrategy implements ITextDoubleClickStrategy {
protected ITextViewer fText;

public void doubleClicked(ITextViewer part) {
int pos = part.getSelectedRange().x;

if (pos < 0)
return;

fText = part;

if (!selectComment(pos)) {
selectWord(pos);
}
}
protected boolean selectComment(int caretPos) {
IDocument doc = fText.getDocument();
int startPos, endPos;

try {
int pos = caretPos;
char c = ' ';

while (pos >= 0) {
c = doc.getChar(pos);
if (c == '\\') {
pos -= 2;
continue;
}
if (c == Character.LINE_SEPARATOR || c == '\"' || c=='.' || c==' ')
break;
--pos;
}

if (c != '\"')
return false;

startPos = pos;

pos = caretPos;
int length = doc.getLength();
c = ' ';

while (pos < length) {
c = doc.getChar(pos);
if (c == Character.LINE_SEPARATOR || c == '\"'|| c=='.' || c==' ')
break;
++pos;
}
if (c != '\"')
return false;

endPos = pos;

int offset = startPos + 1;
int len = endPos - offset;
fText.setSelectedRange(offset, len);
return true;
} catch (BadLocationException x) {
}

return false;
}
protected boolean selectWord(int caretPos) {

IDocument doc = fText.getDocument();
int startPos, endPos;

try {

int pos = caretPos;
char c;

while (pos >= 0) {
c = doc.getChar(pos);
if (!Character.isJavaIdentifierPart(c))
break;
--pos;
}

startPos = pos;

pos = caretPos;
int length = doc.getLength();

while (pos < length) {
c = doc.getChar(pos);
if (!Character.isJavaIdentifierPart(c))
break;
++pos;
}

endPos = pos;
selectRange(startPos, endPos);
return true;

} catch (BadLocationException x) {
}

return false;
}

private void selectRange(int startPos, int stopPos) {
int offset = startPos + 1;
int length = stopPos - offset;
fText.setSelectedRange(offset, length);
}
}
[/code:1]

看清楚了,
就是加了一个‘。’字符的东东,
让他也做为一个词的分割符,
   
0 请登录后投票
最后更新时间:2004-09-07
好,到这里,这个插件,基本完成任务了,

找一个漂亮的图标文件,

改一下,plugin.xml
[code:1]
extensions="jsp"
            icon="icons/key.gif"

[/code:1]
嘿嘿,可以发布了
   
0 请登录后投票
最后更新时间:2004-09-07
[code:1]
<extension
         id="dearmite jsp editor"
         name="dearmite jsp editor"
         point="org.eclipse.ui.editors">
      <editor
            name="dearmite jsp Editor"
            extensions="jsp"
            icon="icons/key.gif"
            contributorClass="org.eclipse.ui.texteditor.BasicTextEditorActionContributor"
            class="jspedit.editors.XMLEditor"
            id="jspedit.editors.XMLEditor">
      </editor>
   </extension>

[/code:1]

这是偶的插件的文件里面的东东,

你可以通过这个图形化的东东来修改这个,
也可以把偶的COPY过去,
   
0 请登录后投票
最后更新时间:2004-09-07
看到,这图的那个小手,
放在哪里没???

这个功能就是发布插件的功能,

上面的那个BUILD configure当然是发布的选项了,

把工程的所有东东全选上,

其实不用改的,全选上,是把SRC目录也选上,

支持开源!!!!
   
0 请登录后投票
最后更新时间:2004-09-07
午休了,吃饭了,

下午写语法加亮的东东,

BYE
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐