跟着实例学eclipse插件开发--第三篇:数据库文档生成插件

本文通过数据库文档生成插件实例,为大家讲解org.eclipse.ui.menus扩展点,menus效果如下图所示:

跟着实例学eclipse插件开发--第三篇:数据库文档生成插件_第1张图片

点击之后的界面:

跟着实例学eclipse插件开发--第三篇:数据库文档生成插件_第2张图片

plugin.xml如下图所示:




 
	 
    	  
	
	 
    	  
	
	
		 
			 
				 
			
	    
	

locationURI,用来标识用户界面中与该菜单项关联的命令将要出现的位置:

locationURI="[scheme]:[identifier]?[argument-list]"

locationURI属性被分解为三个清晰的部分:模式(scheme)、标识符(identifier)和参数列表(argument list)

scheme标识添加项将要添加至的UI对象的类型。它可以是以下值的其中这一:

  • menu———程序主菜单或视图下拉菜单
  • popup———视图或编辑器的上下文菜单
  • toolbar———程序主工具栏或视图中的工具栏

identifier定义了将要添加至的菜单、弹出项或工具栏的唯一标识符。一些常用的标识符包括:

  • org.eclipse.ui.main.menu———Eclipse主菜单的标识符
  • org.eclipse.ui.main.toolbar———Eclipse主工具栏的标识符
  • org.eclipse.ui.popup.any———任意上下文菜单的标识符。

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插件开发--第三篇:数据库文档生成插件_第3张图片

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是以前项目名称,可自行修改)

你可能感兴趣的:(elipse插件开发)