java类的编辑_StyledText实现的简单Java类文件编辑器

1 importjava.io.File;2 importjava.io.FileWriter;3 importjava.io.IOException;4 importjava.util.ArrayList;5 importjava.util.List;6 importjava.util.regex.Matcher;7 importjava.util.regex.Pattern;8

9 importorg.eclipse.jface.dialogs.MessageDialog;10 importorg.eclipse.jface.text.Document;11 importorg.eclipse.jface.text.IDocument;12 importorg.eclipse.jface.text.ITextSelection;13 importorg.eclipse.jface.text.contentassist.ContentAssistant;14 importorg.eclipse.jface.text.contentassist.IContentAssistant;15 importorg.eclipse.jface.text.source.ISourceViewer;16 importorg.eclipse.jface.text.source.SourceViewer;17 importorg.eclipse.jface.text.source.SourceViewerConfiguration;18 importorg.eclipse.swt.SWT;19 importorg.eclipse.swt.custom.StyleRange;20 importorg.eclipse.swt.custom.StyledText;21 importorg.eclipse.swt.custom.VerifyKeyListener;22 importorg.eclipse.swt.events.ModifyEvent;23 importorg.eclipse.swt.events.ModifyListener;24 importorg.eclipse.swt.events.SelectionAdapter;25 importorg.eclipse.swt.events.SelectionEvent;26 importorg.eclipse.swt.events.VerifyEvent;27 importorg.eclipse.swt.layout.FillLayout;28 importorg.eclipse.swt.widgets.Button;29 importorg.eclipse.swt.widgets.Composite;30 importorg.eclipse.swt.widgets.Control;31 importorg.eclipse.swt.widgets.Display;32 importorg.eclipse.swt.widgets.FileDialog;33 importorg.eclipse.swt.widgets.Shell;34 importorg.eclipse.wb.swt.SWTResourceManager;35

36 importswing2swt.layout.BorderLayout;37

38 public classClassEditor {39

40 protectedShell shell;41 privateSourceViewer sourceViewer;42 private List keywords = new ArrayList();43 privateStyledText styledText;44 //匹配Java关键字的正则表达式

45 public static final String REG= "\\b(abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|extends|false|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|native|new|null|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|true|transient|try|void|volatile|while)\\b";46

47 public static voidmain(String[] args) {48 try{49 ClassEditor window = newClassEditor();50 window.open();51 } catch(Exception e) {52 e.printStackTrace();53 }54 }55

56 /**

57 * Open the window.58 */

59 public voidopen() {60 Display display =Display.getDefault();61 createContents();62 shell.open();63 shell.layout();64 while (!shell.isDisposed()) {65 if (!display.readAndDispatch()) {66 display.sleep();67 }68 }69 }70

71 /**

72 * Create contents of the window.73 */

74 protected voidcreateContents() {75 shell = newShell();76 shell.setSize(612, 468);77 shell.setText("类文件编辑器");78 shell.setLayout(new BorderLayout(0, 0));79

80 sourceViewer = new SourceViewer(shell, null, SWT.V_SCROLL);81 //此处的Document非必备参数,但是当需要实现内容助手等复杂功能时,必须添加此参数,否则会一直报空指针异常82 //本人就是一直报异常,查看源码才找出这个问题的。内容助手底层代码使用到了这个Document对象。

83 sourceViewer.setDocument(newDocument());84 styledText =sourceViewer.getTextWidget();85 styledText.setText("/* */ package org.eclipse.jface.dialogs;\r\n/* */ \r\n/* */ import org.eclipse.swt.custom.StackLayout;\r\n/* */ import org.eclipse.swt.widgets.Composite;\r\n/* */ import org.eclipse.swt.widgets.ProgressBar;\r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ public class ProgressIndicator\r\n/* */ extends Composite\r\n/* */ {\r\n/* */ private static final int PROGRESS_MAX = 1000;\r\n/* 30 */ private boolean animated = true;\r\n/* */ \r\n/* */ \r\n/* */ private StackLayout layout;\r\n/* */ \r\n/* */ \r\n/* */ private ProgressBar determinateProgressBar;\r\n/* */ \r\n/* */ \r\n/* */ private ProgressBar indeterminateProgressBar;\r\n/* */ \r\n/* */ \r\n/* */ private double totalWork;\r\n/* */ \r\n/* */ private double sumWorked;\r\n/* */ \r\n/* */ \r\n/* */ public ProgressIndicator(Composite parent)\r\n/* */ {\r\n/* 49 */ this(parent, 0);\r\n/* */ }\r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ public ProgressIndicator(Composite parent, int style)\r\n/* */ {\r\n/* 62 */ super(parent, 0);\r\n/* */ \r\n/* */ \r\n/* 65 */ if ((style & 0x200) == 0) {\r\n/* 66 */ style |= 0x100;\r\n/* */ }\r\n/* 68 */ this.determinateProgressBar = new ProgressBar(this, style);\r\n/* 69 */ this.indeterminateProgressBar = new ProgressBar(this, style | \r\n/* 70 */ 0x2);\r\n/* 71 */ this.layout = new StackLayout();\r\n/* 72 */ setLayout(this.layout);\r\n/* */ }\r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ public void beginAnimatedTask()\r\n/* */ {\r\n/* 79 */ done();\r\n/* 80 */ this.layout.topControl = this.indeterminateProgressBar;\r\n/* 81 */ layout();\r\n/* 82 */ this.animated = true;\r\n/* */ }\r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ public void beginTask(int max)\r\n/* */ {\r\n/* 92 */ done();\r\n/* 93 */ this.totalWork = max;\r\n/* 94 */ this.sumWorked = 0.0D;\r\n/* 95 */ this.determinateProgressBar.setMinimum(0);\r\n/* 96 */ this.determinateProgressBar.setMaximum(1000);\r\n/* 97 */ this.determinateProgressBar.setSelection(0);\r\n/* 98 */ this.layout.topControl = this.determinateProgressBar;\r\n/* 99 */ layout();\r\n/* 100 */ this.animated = false;\r\n/* */ }\r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ public void done()\r\n/* */ {\r\n/* 107 */ if (!this.animated) {\r\n/* 108 */ this.determinateProgressBar.setMinimum(0);\r\n/* 109 */ this.determinateProgressBar.setMaximum(0);\r\n/* 110 */ this.determinateProgressBar.setSelection(0);\r\n/* */ }\r\n/* 112 */ this.layout.topControl = null;\r\n/* 113 */ layout();\r\n/* */ }\r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ public void sendRemainingWork()\r\n/* */ {\r\n/* 120 */ worked(this.totalWork - this.sumWorked);\r\n/* */ }\r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ public void worked(double work)\r\n/* */ {\r\n/* 128 */ if ((work == 0.0D) || (this.animated)) {\r\n/* 129 */ return;\r\n/* */ }\r\n/* 131 */ this.sumWorked += work;\r\n/* 132 */ if (this.sumWorked > this.totalWork) {\r\n/* 133 */ this.sumWorked = this.totalWork;\r\n/* */ }\r\n/* 135 */ if (this.sumWorked < 0.0D) {\r\n/* 136 */ this.sumWorked = 0.0D;\r\n/* */ }\r\n/* 138 */ int value = (int)(this.sumWorked / this.totalWork * 1000.0D);\r\n/* 139 */ if (this.determinateProgressBar.getSelection() < value) {\r\n/* 140 */ this.determinateProgressBar.setSelection(value);\r\n/* */ }\r\n/* */ }\r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ public void showError()\r\n/* */ {\r\n/* 149 */ this.determinateProgressBar.setState(1);\r\n/* 150 */ this.indeterminateProgressBar.setState(1);\r\n/* */ }\r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ public void showPaused()\r\n/* */ {\r\n/* 158 */ this.determinateProgressBar.setState(4);\r\n/* 159 */ this.indeterminateProgressBar.setState(4);\r\n/* */ }\r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ \r\n/* */ public void showNormal()\r\n/* */ {\r\n/* 167 */ this.determinateProgressBar.setState(0);\r\n/* 168 */ this.indeterminateProgressBar.setState(0);\r\n/* */ }\r\n/* */ }\r\n\r\n/* Location: D:\\Siemens\\Teamcenter8\\portal\\plugins\\org.eclipse.jface_3.5.0.I20090525-2000.jar\r\n * Qualified Name: org.eclipse.jface.dialogs.ProgressIndicator\r\n * Java Class Version: 1.2 (46.0)\r\n * JD-Core Version: 0.7.0.1\r\n */");86 styledText.setFont(SWTResourceManager.getFont("微软雅黑", 12, SWT.NORMAL));87 styledText.setAlwaysShowScrollBars(false);88 styledText.setSelectionBackground(SWTResourceManager.getColor(SWT.COLOR_BLACK));89 styledText.setBackground(SWTResourceManager.getColor(199, 237, 204));90 /**

91 * 1.文本修改监听,只有当文本框内的内容被修改时执行的操作,添加或删除文字时会执行的操作92 * 其余的比如按下Shift键等操作不会被监听到,此监听应该和下面的那个键盘监听区分开来93 * 2.这个监听中实现了输入Java关键字后自动着色功能94 * 3.实现思路95 * a,从SourceViewer对象中获取ITextSelection对象(所有Viewer中基本都有此对象)96 * b,获取当前光标所处的位置,然后根据此位置获取当前输入的单词的起始位置97 * c,计算当前输入的单词的长度并判断此单词是否是Java关键字,是就进行着色。98 */

99 styledText.addModifyListener(newModifyListener() {100 public voidmodifyText(ModifyEvent e) {101 ITextSelection selection =(ITextSelection) sourceViewer.getSelectionProvider().getSelection();102 int offset =selection.getOffset();103 String key =MyContentAssist.extractPrefix(sourceViewer,offset);104 int p = offset-key.length();105 if(key.length()>0&&keywords.contains(key)) {106 styledText.setStyleRange(new StyleRange(p, key.length(), SWTResourceManager.getColor(SWT.COLOR_DARK_MAGENTA), null));107 }else{108 styledText.setStyleRange(new StyleRange(p, key.length(), null, null));109 }110 }111 });112

113

114 Composite composite = newComposite(shell, SWT.NONE);115 composite.setLayoutData(BorderLayout.SOUTH);116 composite.setLayout(newFillLayout(SWT.HORIZONTAL));117

118 Button btnParse = newButton(composite, SWT.NONE);119 btnParse.setText("解析");120 btnParse.addSelectionListener(newSelectionAdapter() {121 @Override122 public voidwidgetSelected(SelectionEvent e) {123 /**

124 * 功能:删除所有的注释和空白行125 * 思路:用换行符将整个文本分成数组,然后将每一行的前8个去掉,并将最后7行删除,最后拼接起来126 * 缺点:太死板127 */

128 String string =styledText.getText();129 String[] split = string.split("\r\n");130 StringBuilder result = newStringBuilder();131 for(int i=0;i

142 * 另一种实现方式,用正则表达式匹配所有的注释,并删除143 * 但是此方法还没删除空白行144 */

145 //Pattern pattern = Pattern.compile("/\\*{1,2}[\\S\\s]*?\\*/");146 //Matcher matcher = pattern.matcher(string);147 //styledText.setText(matcher.replaceAll(""));

148 parseKey();149 }150 /**

151 * 此方法主要利用正则表达式为整个文本框中的代码中的关键字和引号中的字符串着色152 */

153 private voidparseKey() {154 String text =sourceViewer.getTextWidget().getText();155 Pattern pattern =Pattern.compile(REG);156 Matcher matcher =pattern.matcher(text);157 while(matcher.find()) {158 int start =matcher.start();159 int end =matcher.end();160 styledText.setStyleRange(new StyleRange(start, end-start, SWTResourceManager.getColor(SWT.COLOR_DARK_MAGENTA), null));161 }162 Pattern pattern2 = Pattern.compile("\".*\"");163 Matcher matcher2 =pattern2.matcher(text);164 while(matcher2.find()) {165 int start =matcher2.start();166 int end =matcher2.end();167 styledText.setStyleRange(new StyleRange(start, end-start, SWTResourceManager.getColor(SWT.COLOR_BLUE), null));168 }169 }170 });171

172 Button btnExport = newButton(composite, SWT.NONE);173 btnExport.setText("导出");174 btnExport.addSelectionListener(newSelectionAdapter() {175 @Override176 public voidwidgetSelected(SelectionEvent e) {177 FileDialog dialog = newFileDialog(shell,SWT.SAVE);178 dialog.setFilterExtensions(new String[] {"*.java"});179 dialog.setText("保存为...");180 String path =dialog.open();181 if(null==path) return;182 File file = newFile(path);183 try{184 if(!file.exists()) {185 file.createNewFile();186 }187 FileWriter writer = newFileWriter(file);188 writer.write(styledText.getText());189 writer.close();190 MessageDialog.openInformation(shell, "导出成功!", "文本已成功导出至"+path+"目录下!");191 } catch(IOException e1) {192 e1.printStackTrace();193 }194 }195 });196

197 Button btnExit = newButton(composite, SWT.NONE);198 btnExit.setText("关闭");199 composite.setTabList(newControl[]{btnParse, btnExport, btnExit});200 btnExit.addSelectionListener(newSelectionAdapter() {201 @Override202 public voidwidgetSelected(SelectionEvent e) {203 shell.dispose();204 }205 });206 initData();207 }208

209 private voidinitData() {210 keywords.add("private");211 keywords.add("void");212 keywords.add("new");213 keywords.add("this");214 keywords.add("return");215 keywords.add("class");216 keywords.add("if");217

218 /**

219 * 配置内容助理220 */

221 sourceViewer.configure(newSourceViewerConfiguration() {222 @Override223 publicIContentAssistant getContentAssistant(ISourceViewer sourceViewer) {224 ContentAssistant contentAssistant = newContentAssistant();225 contentAssistant.setInformationControlCreator(getInformationControlCreator(sourceViewer));226 contentAssistant.enableAutoActivation(true);227 contentAssistant.setContentAssistProcessor(newMyContentAssist(), IDocument.DEFAULT_CONTENT_TYPE);228 returncontentAssistant;229 }230 });231 /**

232 * 添加键盘监听,输入“Alt+/”时,打开内容助理233 */

234 styledText.addVerifyKeyListener(newVerifyKeyListener() {235 public voidverifyKey(VerifyEvent event) {236 if(event.stateMask == SWT.ALT && event.character =='/') {237 if(sourceViewer.canDoOperation(SourceViewer.CONTENTASSIST_PROPOSALS)) {238 sourceViewer.doOperation(SourceViewer.CONTENTASSIST_PROPOSALS);239 event.doit = false;240 }241 }242 }243 });244 }245 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值