idea 插件文档

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"/>

```
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值