本文通过数据库文档生成插件实例,为大家讲解org.eclipse.ui.menus扩展点,menus效果如下图所示:
点击之后的界面:
plugin.xml如下图所示:
locationURI,用来标识用户界面中与该菜单项关联的命令将要出现的位置:
locationURI="[scheme]:[identifier]?[argument-list]"
locationURI属性被分解为三个清晰的部分:模式(scheme)、标识符(identifier)和参数列表(argument list)
scheme标识添加项将要添加至的UI对象的类型。它可以是以下值的其中这一:
identifier定义了将要添加至的菜单、弹出项或工具栏的唯一标识符。一些常用的标识符包括:
agrument list。参数列表由可以是"before"或"after"的布局,一个等号(“=”),以及菜单 、弹出项或工具栏的一些项的标识符组成。标识符也可以是“additions”,表示元素应当被放置于给定菜单、弹出项或工具栏的默认位置 ("="等号后面可以接着一个acitonID,这样子就布局到这个action的后面,实现分组布局)。
org.eclipse.ui.menus扩展点官方介绍:http://help.eclipse.org/kepler/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Fguide%2Fworkbench_cmd_menus.htm
大家可能在一些老的教程里面看到过org.eclipse.ui.actionSets扩展点,与org.eclipse.ui.menus功能类似,建议使用org.eclipse.ui.menus扩展点,org.eclipse.ui.actionSets已被官方弃用。
文档模板,放到了eclipse的安装目录下了,大家下载源码运行时,需要将db_doc文件夹copy到eclipse相关安装目录,使用的是freemarker,可以自定义模板,只需要吧模板放到该目录下即可:
(提示:当前插件使用时,必须是spring boot项目,并且数据库是通过yml方式配置的,才能直接生成文档,如果你的项目结构和本文不一样,也可以使用,不过需要自己填写数据库信息)
本项目只能生成mysql的数据库文档,项目用到了3个jar包,需要将jar包添加到plugin.xml的Runtime中,否则打包后会找不到jar包,如下图所示:
eclipse本身是swt开发的,本工具的界面也是用swt开发的,界面风格和eclipse很搭,swt的布局我搞的不是太懂,所以全部都是绝对布局,相关的swt代码如下:
package com.msun.plug.ui;
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import com.msun.plug.bean.DbDocBean;
import com.msun.plug.util.FileUtil;
import com.msun.plug.util.FreeMarkerUtils;
import com.msun.plug.util.UIUtil;
import com.msun.plug.util.db.DBHelper;
/**
* Title: 插件开发
* Description: 生成db doc文档的界面
* Copyright: MSun (c) 2018年8月14日
*
* @author jiujiya
* @version 1.0
*/
public class DbDocUI {
/** 主窗体 */
private Shell shell;
// 文档模板
Combo styleList;
// 文档名称
Text projectText;
// 文档路径
Text pathText;
// 数据库IP
Text dbIpText;
// 端口号
Text dbPortText;
// 用户名
Text dbUserText;
// 密码
Text dbPsText;
// 密码
Text dbNameText;
// 数据bean
DbDocBean bean;
// 生成按钮
Button createButton;
// 打开按钮
Button openButton;
public static void main(String[] args) {
new DbDocUI(new DbDocBean()).show();
}
public DbDocUI(DbDocBean bean) {
this.bean = bean;
shell = new Shell(192);
shell.setText("数据库文档生成工具");
shell.setLayout(null);
addView();
// 设置主窗体大小
shell.setSize(430, 400);
UIUtil.centerWindow(shell);
}
/**
* 添加界面
* @throws Exception
*/
private void addView(){
int y = 10;
Label titleLabel = new Label(shell, 0);
titleLabel.setText("温馨提示:选中项目,可自动生成文档");
titleLabel.setFont(new Font(titleLabel.getDisplay(), "宋体", 8, SWT.UNDERLINE_LINK));
titleLabel.setBounds(20, y+3, 300, 20);
y += 30;
Label styleLabel = new Label(shell, 0);
styleLabel.setText("文档模板:");
styleLabel.setBounds(20, y+3, 70, 28);
styleList = new Combo(shell, SWT.READ_ONLY);
styleList.setBounds(100, y, 220, 28);
styleList.setItems(bean.styleList);
styleList.select(0);
Label styleCustom = new Label(shell, 0);
styleCustom.setText("自定义模板?");
styleCustom.setFont(new Font(titleLabel.getDisplay(), "宋体", 8, SWT.NORMAL));
styleCustom.setBounds(328, y+7, 90, 28);
styleCustom.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
try {
Desktop.getDesktop().open(new File(bean.ftlBasePath));
} catch (IOException e1) {
e1.printStackTrace();
}
}
});
y += 40;
Label projectLabel = new Label(shell, 0);
projectLabel.setText("文档名称:");
projectLabel.setBounds(20, y+3, 70, 28);
projectText = new Text(shell, 2048);
projectText.setBounds(100, y, 300, 28);
projectText.setText(bean.projectText);
y += 40;
Label pathLabel = new Label(shell, 0);
pathLabel.setText("文档路径:");
pathLabel.setBounds(20, y+3, 70, 28);
pathText = new Text(shell, 2048);
pathText.setBounds(100, y, 300, 28);
pathText.setText(bean.pathText);
y += 40;
Label dbIpLabel = new Label(shell, 0);
dbIpLabel.setText("数据库IP:");
dbIpLabel.setBounds(20, y+3, 70, 28);
dbIpText = new Text(shell, 2048);
dbIpText.setBounds(100, y, 140, 28);
dbIpText.setText(bean.dbIpText);
Label dbPortLabel = new Label(shell, 0);
dbPortLabel.setText("端口号:");
dbPortLabel.setBounds(260, y+3, 70, 28);
dbPortText = new Text(shell, 2048);
dbPortText.setBounds(330, y, 70, 28);
dbPortText.setText(bean.dbPortText);
y += 40;
Label dbUserLabel = new Label(shell, 0);
dbUserLabel.setText("用户名:");
dbUserLabel.setBounds(20 + 12, y+3, 60, 28);
dbUserText = new Text(shell, 2048);
dbUserText.setBounds(100, y, 115, 28);
dbUserText.setText(bean.dbUserText);
Label dbPsLabel = new Label(shell, 0);
dbPsLabel.setText("密码:");
dbPsLabel.setBounds(235, y+3, 50, 28);
dbPsText = new Text(shell, 2048);
dbPsText.setBounds(285, y, 115, 28);
dbPsText.setText(bean.dbPsText);
y += 40;
Label dbNameLabel = new Label(shell, 0);
dbNameLabel.setText("数据库名:");
dbNameLabel.setBounds(20, y+3, 70, 28);
dbNameText = new Text(shell, 2048);
dbNameText.setBounds(100, y, 300, 28);
dbNameText.setText(bean.dbNameText);
y += 60;
createButton = new Button(shell, 0);
createButton.setText("确认生成");
createButton.setBounds(70, y, 120, 28);
openButton = new Button(shell, 0);
openButton.setText("打开文档路径");
openButton.setBounds(220, y, 120, 28);
openButton.setVisible(false);
createButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent arg0) {
createDoc();
}
});
openButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent arg0) {
try {
Desktop.getDesktop().open(new File(pathText.getText()));
} catch (IOException e) {
UIUtil.error(shell, e);
e.printStackTrace();
}
}
});
// 如果数据库名称不为空,自动生成
if(!bean.dbNameText.equals("")) {
createDoc();
}
}
/**
* 生成文档
* @throws IOException
*/
public void createDoc() {
createButton.setEnabled(false);
createButton.setText("文档生成中");
Display.getDefault().asyncExec(new Runnable() {
public void run() {
try {
// 初始化数据库链接
DBHelper.driverName = bean.driverClassName;
DBHelper.dbname = dbNameText.getText();
DBHelper.user = dbUserText.getText();
DBHelper.password = dbPsText.getText();
DBHelper.url = "jdbc:mysql://" + dbIpText.getText() + ":" + dbPortText.getText() + "/"
+ dbNameText.getText() + "?characterEncoding=utf8";
// 初始化模板引擎
FreeMarkerUtils.initFreeMarker(bean.ftlBasePath);
/** 模板引擎所需要的数据Map */
Map templateData = new HashMap();
templateData.put("projectName", projectText.getText());
templateData.put("tables", DBHelper.getTableAndColumns());
// 生成word文件
if("".equals(pathText.getText().trim())) {
throw new RuntimeException("文档路径不能为空");
}
String fileName = pathText.getText() + projectText.getText() + ".doc";
FileUtil.addDirs(fileName);
FreeMarkerUtils.crateFile(templateData, styleList.getText(), fileName, true);
openButton.setVisible(true);
createButton.setText("重新生成");
} catch (Exception e) {
e.printStackTrace();
createButton.setText("确认生成");
UIUtil.error(shell, e);
} finally {
createButton.setEnabled(true);
}
}
});
}
public void show() {
shell.open();
Display display = shell.getDisplay();
while (!(shell.isDisposed()))
if (!(display.readAndDispatch()))
display.sleep();
}
public void close() {
shell.dispose();
}
}
源码下载地址:https://download.csdn.net/download/jiujiya123/10644671
(本教程是从一个项目中抽取出来的,可能会多引用了一些jar,另外Msun是以前项目名称,可自行修改)