idea 插件文档
新建action
- 新建一个action,在右键菜单栏中多出一个添加笔记的工具,并且通过api 获取选取的内容以及文件名称和文件类型,将这些信息保存在公共类中,方便掉用
- PopupAction.java
public class PopupAction extends AnAction {
/**
* 获取已经选中的文本内容
*
* @param e
*/
@Override
public void actionPerformed(AnActionEvent e) {
//获取当前编辑器对象
Editor editor = e.getRequiredData(CommonDataKeys.EDITOR);
//获取选择的数据模型
SelectionModel selectionModel = editor.getSelectionModel();
//获取当前选择的文本
String selectedText = selectionModel.getSelectedText();
// System.out.println(selectedText);
//选择的内容
DataCenter.SELECTED_TEXT = selectedText;
//文件名称
DataCenter.CURRENT_FILE_NAME = e.getRequiredData(CommonDataKeys.PSI_FILE).getViewProvider().getVirtualFile().getName();
DataCenter.CURRENT_FILE_TYPE =DataCenter.CURRENT_FILE_NAME.substring(DataCenter.CURRENT_FILE_NAME.lastIndexOf(".")+1);
AddNoteDialog addNoteDialog = new AddNoteDialog();
addNoteDialog.show();
}
}
展示添加笔记标题备注弹窗
- 添加笔记标题和备注的对话狂
- AddNoteDialog.java
public class AddNoteDialog extends DialogWrapper {
/**
* 标题输入框
*/
private EditorTextField etfTitle;
/**
* 内容输入框
*/
private EditorTextField etfMark;
public AddNoteDialog() {
super(true);
init();
setTitle("添加笔记");
}
@Nullable
@Override
protected JComponent createCenterPanel() {
JPanel panel = new JPanel(new BorderLayout());
etfTitle = new EditorTextField("笔记标题");
etfMark = new EditorTextField("笔记内容");
etfMark.setPreferredSize(new Dimension(200, 100));
panel.add(etfTitle, BorderLayout.NORTH);
panel.add(etfMark, BorderLayout.CENTER);
return panel;
}
@Override
protected JComponent createSouthPanel() {
JPanel panel = new JPanel(new FlowLayout());
JButton btnAdd = new JButton("添加笔记");
//按钮点击事件处理
btnAdd.addActionListener(e -> {
//获取标题
String title = etfTitle.getText();
//获取内容
String mark = etfMark.getText();
String currentFileName = DataCenter.CURRENT_FILE_NAME;
String fileType = DataCenter.CURRENT_FILE_TYPE;
String selectedText = DataCenter.SELECTED_TEXT;
NoteData noteData = new NoteData(title, mark, currentFileName,fileType, selectedText);
// 将笔记添加到集合中
DataCenter.NOTE_LIST.add(noteData);
// 将笔记添加到table中
DataCenter.TABLE_MODEL.addRow(DataConvert.convert(noteData));
MessageDialogBuilder.yesNo("操作结果","添加成功!").show();
// 关闭弹窗方法
AddNoteDialog.this.dispose();
});
panel.add(btnAdd);
return panel;
}
}
笔记列表对话窗
- 构建笔记列表对话窗,展示笔记列表内容
- NoteListWindow.java
/**
*
* 通过swing的ui界面自动生成
*/
public class NoteListWindow {
private JTextField tfTopic;
private JTable tbContent;
private JButton btnCreate;
private JButton btnClear;
private JButton btnClose;
private JPanel jContent;
public NoteListWindow(Project project, ToolWindow toolWindow) {
/**
* 初始化table_model
*/
init();
/**
* 监听事件
*/
btnCreate.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String text = tfTopic.getText();
String fileName = text + ".md";
if(StringUtils.isEmpty(text)){{
MessageDialogBuilder.yesNo("操作结果","文档标题没有输入");
return;
}}else {
VirtualFile virtualFile = FileChooser.chooseFile(FileChooserDescriptorFactory.createSingleFolderDescriptor(), project, project.getBaseDir());
if(virtualFile!=null){
String filePath = virtualFile.getPath() + "/" + fileName;
// 写文件接口
Processor processor = new MDFreeMarkProcessor();
try {
processor.process(new DefaultSourceNoteData(tfTopic.getText(), filePath, DataCenter.NOTE_LIST));
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
});
btnClear.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DataCenter.reset();
}
});
btnClose.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
toolWindow.hide(null);
}
});
}
public JPanel getjContent(){
return jContent;
}
public void init(){
// 将table_model 的内容在对话框中展示
tbContent.setModel(DataCenter.TABLE_MODEL);
tbContent.setEnabled(true);
}
}
笔记列表对话窗补充
- 笔记列表作为一个类似maven一样的工具窗口,需要实现ToolWindowFactory,通过该类创建对话窗
- NoteListWindowFactory.java
public class NoteListWindowFactory implements ToolWindowFactory {
@Override
public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
NoteListWindow noteListWindow = new NoteListWindow(project, toolWindow);
ContentFactory contentFactory = ContentFactory.SERVICE.getInstance();
Content content = contentFactory.createContent(noteListWindow.getjContent(), "", false);
toolWindow.getContentManager().addContent(content);
}
}
写出文档
- 接口写出文档
- NoteListWindow.java
// 将 文档标题,文档路径 以及 笔记列表进行封装
processor.process(new DefaultSourceNoteData(tfTopic.getText(), filePath, DataCenter.NOTE_LIST));
使用freemark写文档
- 接口写文档三大步
- AbstractFreeMarkerProcessor.java
@Override
public final void process(SourceNoteData sourceNoteData) throws Exception {
Template template = getTemplate();
Object model = getModel(sourceNoteData);
Writer writer = getWriter(sourceNoteData);
template.process(model, writer);
}
接口写文档具体实现
- 接口写文档具体实现
- MDFreeMarkProcessor.java
public class MDFreeMarkProcessor extends AbstractFreeMarkerProcessor {
@Override
protected Template getTemplate() throws Exception {
//加载模板字符串
String templateString = UrlUtil.loadText(MDFreeMarkProcessor.class.getResource("/template/md.ftl"));
//创建模板配置
String versionNumber = Configuration.getVersionNumber();
Configuration configuration = new Configuration();
//创建字符串模板的导入器
StringTemplateLoader stringTemplateLoader=new StringTemplateLoader();
//导入字符串模板
stringTemplateLoader.putTemplate("MDTemplate",templateString);
configuration.setTemplateLoader(stringTemplateLoader);
//获取模板
return configuration.getTemplate("MDTemplate");
}
@Override
protected Object getModel(SourceNoteData sourceNoteData) {
HashMap model = new HashMap();
model.put("topic",sourceNoteData.getTopic());
model.put("noteList",sourceNoteData.getNoteList());
return model;
}
@Override
protected Writer getWriter(SourceNoteData sourceNoteData) throws Exception {
String filePath = sourceNoteData.getFilePath();
File file = new File(filePath);
return new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"utf-8"));
}
ftl文件
- ftl文件
- md.ftl
## ${topic}
@[toc]
<#list noteList as note>
### ${note.title}
- ${note.mark}
- ${note.fileName}
```${note.fileType}
${note.content}
</#list>
### plugin配置
- plugin.xml内容
- plugin.xml
```xml
<description><![CDATA[
这是一款可以帮助程序在阅读代码是添加笔记,并将笔记生成文档的插件。<br>
<em>MarkDown文档</em>
]]></description>
<change-notes><![CDATA[
第一版,包含笔记添加和文档生成的主体功能<br>
<em>仅支持生成Markdown形式笔记。</em>
]]>
</change-notes>
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
<idea-version since-build="173.0"/>
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
on how to target different products -->
<depends>com.intellij.modules.platform</depends>
<extensions defaultExtensionNs="com.intellij">
<!-- Add your extensions here -->
<toolWindow id="MarkBook"
secondary="true"
anchor="right" factoryClass="com.zhixinhuixue.windows.NoteListWindowFactory" icon="">
</toolWindow>
</extensions>
<actions>
<!-- Add your actions here -->
<action id="MB_PopupAciton" class="com.zhixinhuixue.action.PopupAction" text="添加文档" description="添加文档">
<add-to-group group-id="EditorPopupMenu" anchor="first"/>
</action>
</actions>
</idea-plugin>
rst"/>