diff --git a/README.md b/README.md index 5063d0f..98f70a6 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ Doc View - 支持在 Controller 内右键唤出菜单, 显示 Controller 内的接口文档。 - 支持在 Controller 的方法内右键唤出菜单, 显示该方法内的接口文档。 - 支持复制为 Markdown 到剪贴板。 +- 支持导出 Markdown 文件。 - 其他一些小功能点。 **注:因 API 问题,新插件仅支持 2020.1 和 2020.2 版本 。** @@ -36,9 +37,10 @@ Doc View 更新 ---- -## [v1.0.1](https://github.com/liuzhihang/doc-view/releases/tag/v1.0.1) (2020-11-03) +## [v1.0.2](https://github.com/liuzhihang/doc-view/releases/tag/v1.0.2) (2020-11-15) -- 修复请求路径拼装错误 +- 新增配置页面(依旧不支持配置) +- 新增导出单个为 Markdown 格式文件 [查看更多历史更新记录](./doc/ChangeNotes.md) diff --git a/doc/ChangeNotes.md b/doc/ChangeNotes.md index 7f0fdc3..b06d787 100644 --- a/doc/ChangeNotes.md +++ b/doc/ChangeNotes.md @@ -1,5 +1,17 @@ # ChangeNotes +## [v1.0.2](https://github.com/liuzhihang/doc-view/releases/tag/v1.0.2) (2020-11-15) + +- 新增配置页面(依旧不支持配置) +- 新增导出单个为 Markdown 格式文件 + + +## [v1.0.1](https://github.com/liuzhihang/doc-view/releases/tag/v1.0.1) (2020-11-03) + +- 去除支持 2020.3 +- 发布到插件仓库 +- 修复请求路径错误问题 + ## [v1.0.0](https://github.com/liuzhihang/doc-view/releases/tag/v1.0.0) (2020-11-01) diff --git a/parts/changeNotes.html b/parts/changeNotes.html index e38149f..b43a0d3 100644 --- a/parts/changeNotes.html +++ b/parts/changeNotes.html @@ -3,19 +3,18 @@ <h4>English introduction</h4> <ul> - <li>1.0.1 + <li>1.0.2 <ol> - <li>Repair request path assembly error</li> - + <li>Support exporting as Markdown file.</li> </ol> </li> <li><a href="https://github.com/liuzhihang/doc-view/blob/master/doc/ChangeNotes.md">More records</a></li> </ul> <h4>中文介绍</h4> <ul> - <li>1.0.1 + <li>1.0.2 <ol> - <li>修复请求路径拼装错误</li> + <li>支持导出为 Markdown 文件。</li> </ol> </li> <li><a href="https://github.com/liuzhihang/doc-view/blob/master/doc/ChangeNotes.md">更多记录</a></li> diff --git a/parts/pluginDescription.html b/parts/pluginDescription.html index 3e0da9f..d29f299 100644 --- a/parts/pluginDescription.html +++ b/parts/pluginDescription.html @@ -29,8 +29,7 @@ <h1>An IntelliJ IDEA plug-in that can directly generate Markdown documents throu the method. </li> <li>Support copying as Markdown to clipboard.</li> - <li>Some other small features.</li> - + <li>Support exporting as Markdown file.</li> </ul> <br/> @@ -46,7 +45,7 @@ <h1>An IntelliJ IDEA plug-in that can directly generate Markdown documents throu <li>支持在 Controller 内右键唤出菜单, 显示 Controller 内的接口文档。</li> <li>支持在 Controller 的方法内右键唤出菜单, 显示该方法内的接口文档。</li> <li>支持复制为 Markdown 到剪贴板。</li> - <li>其他一些小功能点。</li> + <li>支持导出为 Markdown 文件。</li> </ul> <br/> diff --git a/src/main/java/com/liuzhihang/doc/view/action/EditorPreviewAction.java b/src/main/java/com/liuzhihang/doc/view/action/EditorPreviewAction.java index d1d264b..6395d7c 100644 --- a/src/main/java/com/liuzhihang/doc/view/action/EditorPreviewAction.java +++ b/src/main/java/com/liuzhihang/doc/view/action/EditorPreviewAction.java @@ -5,22 +5,16 @@ import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.PlatformDataKeys; -import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.DialogWrapper; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiMethod; import com.liuzhihang.doc.view.component.Settings; -import com.liuzhihang.doc.view.dto.DocView; -import com.liuzhihang.doc.view.service.DocViewService; -import com.liuzhihang.doc.view.ui.PreviewForm; +import com.liuzhihang.doc.view.service.SpringDocViewService; import com.liuzhihang.doc.view.utils.CustomPsiUtils; import com.liuzhihang.doc.view.utils.NotificationUtils; -import java.util.Map; - /** * @author liuzhihang * @date 2020/2/26 21:57 @@ -58,26 +52,21 @@ public void actionPerformed(AnActionEvent e) { Settings settings = project.getService(Settings.class); - // 不是接口 且不包含指定的注解 - if (!targetClass.isInterface() && !AnnotationUtil.isAnnotated(targetClass, settings.getContainClassAnnotationName(), 0)) { - NotificationUtils.errorNotify("The current class is not an interface and has no Spring annotations", project); + + if (targetClass.isInterface()) { + NotificationUtils.errorNotify("The current version does not support the interface", project); return; } - // 当前方法 - PsiMethod targetMethod = CustomPsiUtils.getTargetMethod(editor, psiFile); + // Spring + if (AnnotationUtil.isAnnotated(targetClass, settings.getContainClassAnnotationName(), 0)) { - // 生成文档列表 - Map<String, DocView> docMap = DocViewService.getInstance().buildDocView(settings, targetClass, targetMethod); + SpringDocViewService.getInstance().doPreview(project, psiFile, editor, targetClass); - if (docMap == null || docMap.size() == 0) { - NotificationUtils.errorNotify("There is no public modification method in the class", project); return; } - - DialogWrapper dialog = new PreviewForm(project, psiFile, editor, targetClass, docMap); - dialog.show(); + NotificationUtils.errorNotify("Document generation is not supported here", project); } diff --git a/src/main/java/com/liuzhihang/doc/view/service/DocViewService.java b/src/main/java/com/liuzhihang/doc/view/service/SpringDocViewService.java similarity index 67% rename from src/main/java/com/liuzhihang/doc/view/service/DocViewService.java rename to src/main/java/com/liuzhihang/doc/view/service/SpringDocViewService.java index 4edf4ee..158f4b9 100644 --- a/src/main/java/com/liuzhihang/doc/view/service/DocViewService.java +++ b/src/main/java/com/liuzhihang/doc/view/service/SpringDocViewService.java @@ -2,12 +2,16 @@ import com.intellij.codeInsight.AnnotationUtil; import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.DialogWrapper; import com.intellij.psi.*; import com.liuzhihang.doc.view.component.Settings; import com.liuzhihang.doc.view.dto.Body; import com.liuzhihang.doc.view.dto.DocView; import com.liuzhihang.doc.view.dto.Header; import com.liuzhihang.doc.view.dto.Param; +import com.liuzhihang.doc.view.ui.PreviewForm; import com.liuzhihang.doc.view.utils.*; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; @@ -21,35 +25,45 @@ * @author liuzhihang * @date 2020/3/3 13:32 */ -public class DocViewService { +public class SpringDocViewService { - public static DocViewService getInstance() { - return ServiceManager.getService(DocViewService.class); + public static SpringDocViewService getInstance() { + return ServiceManager.getService(SpringDocViewService.class); } - public Map<String, DocView> buildDocView(@NotNull Settings settings, @NotNull PsiClass psiClass, PsiMethod psiMethod) { + public void doPreview(@NotNull Project project, PsiFile psiFile, Editor editor, PsiClass targetClass) { - if (psiClass.isInterface()) { - // 接口按照dubbo接口生成 + Settings settings = project.getService(Settings.class); - } else { + // 当前方法 + PsiMethod targetMethod = CustomPsiUtils.getTargetMethod(editor, psiFile); - if (psiMethod != null) { - // 单个方法 - DocView docView = buildClassMethodDoc(settings, psiClass, psiMethod); - Map<String, DocView> docMap = new HashMap<>(2); - if (docView != null) { - docMap.put(docView.getName(), docView); - } - return docMap; - } else { - // 单个类 的所有方法 - return buildClassDoc(settings, psiClass); + Map<String, DocView> docMap = new HashMap<>(); + + if (targetMethod != null) { + + if (checkMethod(settings, targetMethod)) { + NotificationUtils.errorNotify("The method does not meet the conditions", project); + return; + } + + DocView docView = buildClassMethodDoc(settings, targetClass, targetMethod); + docMap.put(docView.getName(), docView); + + } else { + // 生成文档列表 + docMap = buildClassDoc(settings, targetClass); + if (docMap.size() == 0) { + NotificationUtils.errorNotify("There is no public modification method in the class", project); + return; } } - return null; + + DialogWrapper dialog = new PreviewForm(project, psiFile, editor, targetClass, docMap); + dialog.show(); + } @NotNull @@ -58,29 +72,21 @@ private Map<String, DocView> buildClassDoc(Settings settings, @NotNull PsiClass Map<String, DocView> docMap = new HashMap<>(32); for (PsiMethod method : psiClass.getMethods()) { - DocView docView = buildClassMethodDoc(settings, psiClass, method); - if (docView != null) { - docMap.put(docView.getName(), docView); + + if (checkMethod(settings, method)) { + continue; } + + DocView docView = buildClassMethodDoc(settings, psiClass, method); + docMap.put(docView.getName(), docView); } return docMap; } - private DocView buildClassMethodDoc(Settings settings, PsiClass psiClass, @NotNull PsiMethod psiMethod) { + @NotNull + public DocView buildClassMethodDoc(Settings settings, PsiClass psiClass, @NotNull PsiMethod psiMethod) { - if (!CustomPsiModifierUtils.hasModifierProperty(psiMethod, PsiModifier.PUBLIC)) { - return null; - } - if (CustomPsiModifierUtils.hasModifierProperty(psiMethod, PsiModifier.STATIC)) { - return null; - } - if (psiMethod.isConstructor()) { - return null; - } - if (!AnnotationUtil.isAnnotated(psiMethod, settings.getContainMethodAnnotationName(), 0)) { - return null; - } // 请求路径 String path = CustomPsiAnnotationUtils.getPath(psiClass, psiMethod); @@ -157,4 +163,27 @@ private DocView buildClassMethodDoc(Settings settings, PsiClass psiClass, @NotNu return docView; } + /** + * 检查方法是否满足条件 + * + * @param settings + * @param psiMethod + * @return true 不满足条件 + */ + private boolean checkMethod(Settings settings, @NotNull PsiMethod psiMethod) { + if (!CustomPsiModifierUtils.hasModifierProperty(psiMethod, PsiModifier.PUBLIC)) { + return true; + } + if (CustomPsiModifierUtils.hasModifierProperty(psiMethod, PsiModifier.STATIC)) { + return true; + } + if (psiMethod.isConstructor()) { + return true; + } + if (!AnnotationUtil.isAnnotated(psiMethod, settings.getContainMethodAnnotationName(), 0)) { + return true; + } + return false; + } + } diff --git a/src/main/java/com/liuzhihang/doc/view/ui/Preview.form b/src/main/java/com/liuzhihang/doc/view/ui/Preview.form index 48dbf0f..0489f09 100644 --- a/src/main/java/com/liuzhihang/doc/view/ui/Preview.form +++ b/src/main/java/com/liuzhihang/doc/view/ui/Preview.form @@ -13,82 +13,72 @@ </properties> <border type="none"/> <children> - <grid id="fc2fd" binding="viewPanel" layout-manager="GridLayoutManager" row-count="1" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1"> - <margin top="0" left="0" bottom="0" right="0"/> + <splitpane id="91f69" binding="viewSplitPane"> <constraints> - <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/> + <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"> + <preferred-size width="200" height="200"/> + </grid> </constraints> - <properties/> + <properties> + <continuousLayout value="true"/> + <dividerLocation value="150"/> + <dividerSize value="-1"/> + <doubleBuffered value="false"/> + <enabled value="true"/> + <focusCycleRoot value="false"/> + <lastDividerLocation value="200"/> + </properties> <border type="none"/> <children> - <splitpane id="91f69" binding="viewSplitPane"> + <scrollpane id="4cd8a" binding="leftScrollPane"> <constraints> - <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"> - <preferred-size width="200" height="200"/> - </grid> + <splitpane position="left"/> </constraints> <properties> - <continuousLayout value="true"/> - <dividerLocation value="150"/> - <dividerSize value="-1"/> - <doubleBuffered value="false"/> - <enabled value="true"/> - <focusCycleRoot value="false"/> - <lastDividerLocation value="200"/> + <minimumSize width="100" height="-1"/> + <preferredSize width="150" height="-1"/> </properties> <border type="none"/> <children> - <scrollpane id="4cd8a" binding="leftScrollPane"> - <constraints> - <splitpane position="left"/> - </constraints> + <component id="b4f56" class="javax.swing.JList" binding="catalogList"> + <constraints/> <properties> - <minimumSize width="100" height="-1"/> - <preferredSize width="150" height="-1"/> + <model/> + <requestFocusEnabled value="true"/> + <selectionBackground color="-11434241"/> </properties> - <border type="none"/> - <children> - <component id="b4f56" class="javax.swing.JList" binding="catalogList"> - <constraints/> - <properties> - <model/> - <requestFocusEnabled value="true"/> - <selectionBackground color="-11434241"/> - </properties> - </component> - </children> - </scrollpane> - <scrollpane id="a695f" binding="rightScrollPane"> - <constraints> - <splitpane position="right"/> - </constraints> + </component> + </children> + </scrollpane> + <scrollpane id="a695f" binding="rightScrollPane"> + <constraints> + <splitpane position="right"/> + </constraints> + <properties> + <minimumSize width="100" height="-1"/> + <preferredSize width="-1" height="-1"/> + </properties> + <border type="empty"/> + <children> + <component id="4611d" class="javax.swing.JTextPane" binding="textPane"> + <constraints/> <properties> - <minimumSize width="100" height="-1"/> - <preferredSize width="-1" height="-1"/> + <contentType value="text/html"/> + <editable value="false"/> + <enabled value="true"/> + <selectionColor color="-13670966"/> + <text value="<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Doc View</title> <style> body ul { padding-left: 0 !important; } body table { margin: 0; border-bottom: 1px solid #dddddd; border-right: 1px solid #dddddd; border-collapse: collapse; border-spacing: 0; } table tr th { margin: 0; border-top: 1px solid #dddddd; /*内部边框样式*/ border-left: 1px solid #dddddd; /*内部边框样式*/ padding: 5px 5px; /*内边距*/ border-collapse: collapse; } table tr td { margin: 0; border-top: 1px solid #dddddd; /*内部边框样式*/ border-left: 1px solid #dddddd; /*内部边框样式*/ padding: 5px 5px; /*内边距*/ } </style> </head> <body> </body> </html>" noi18n="true"/> </properties> - <border type="empty"/> - <children> - <component id="4611d" class="javax.swing.JTextPane" binding="textPane"> - <constraints/> - <properties> - <contentType value="text/html"/> - <editable value="false"/> - <enabled value="true"/> - <selectionColor color="-12286721"/> - <text value="<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Doc View</title> <style> body ul { padding-left: 0 !important; } body table { margin: 0; border-bottom: 1px solid #dddddd; border-right: 1px solid #dddddd; border-collapse: collapse; border-spacing: 0; } table tr th { margin: 0; border-top: 1px solid #dddddd; /*内部边框样式*/ border-left: 1px solid #dddddd; /*内部边框样式*/ padding: 5px 5px; /*内边距*/ border-collapse: collapse; } table tr td { margin: 0; border-top: 1px solid #dddddd; /*内部边框样式*/ border-left: 1px solid #dddddd; /*内部边框样式*/ padding: 5px 5px; /*内边距*/ } </style> </head> <body> </body> </html>" noi18n="true"/> - </properties> - <clientProperties> - <JEditorPane.honorDisplayProperties class="java.lang.Boolean" value="true"/> - <JEditorPane.w3cLengthUnits class="java.lang.Boolean" value="false"/> - <html.disable class="java.lang.Boolean" value="false"/> - </clientProperties> - </component> - </children> - </scrollpane> + <clientProperties> + <JEditorPane.honorDisplayProperties class="java.lang.Boolean" value="true"/> + <JEditorPane.w3cLengthUnits class="java.lang.Boolean" value="false"/> + <html.disable class="java.lang.Boolean" value="false"/> + </clientProperties> + </component> </children> - </splitpane> + </scrollpane> </children> - </grid> + </splitpane> </children> </grid> </form> diff --git a/src/main/java/com/liuzhihang/doc/view/ui/PreviewForm.java b/src/main/java/com/liuzhihang/doc/view/ui/PreviewForm.java index 566bd81..a571d60 100644 --- a/src/main/java/com/liuzhihang/doc/view/ui/PreviewForm.java +++ b/src/main/java/com/liuzhihang/doc/view/ui/PreviewForm.java @@ -2,13 +2,8 @@ import com.intellij.ide.BrowserUtil; import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.fileChooser.FileChooser; -import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; -import com.intellij.openapi.ui.popup.util.PopupUtil; -import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiFile; import com.intellij.ui.GuiUtils; @@ -16,6 +11,7 @@ import com.intellij.util.ui.UIUtil; import com.liuzhihang.doc.view.dto.DocView; import com.liuzhihang.doc.view.utils.DocViewUtils; +import com.liuzhihang.doc.view.utils.ExportUtils; import com.liuzhihang.doc.view.utils.NotificationUtils; import org.intellij.plugins.markdown.ui.preview.MarkdownUtil; import org.jetbrains.annotations.NotNull; @@ -26,8 +22,6 @@ import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; -import java.io.File; -import java.io.IOException; import java.util.Map; import java.util.Vector; @@ -37,7 +31,6 @@ */ public class PreviewForm extends DialogWrapper { private JPanel rootJPanel; - private JPanel viewPanel; private JSplitPane viewSplitPane; private JScrollPane leftScrollPane; private JScrollPane rightScrollPane; @@ -78,7 +71,7 @@ public PreviewForm(@Nullable Project project, PsiFile psiFile, Editor editor, Ps private void initUI() { setTitle("Doc View"); - GuiUtils.replaceJSplitPaneWithIDEASplitter(viewPanel, true); + GuiUtils.replaceJSplitPaneWithIDEASplitter(rootJPanel, true); // 边框 leftScrollPane.setBorder(null); @@ -91,8 +84,8 @@ private void initUI() { UIUtil.applyStyle(UIUtil.ComponentStyle.SMALL, textPane); textPane.setBorder(JBUI.Borders.emptyLeft(7)); + catalogList.setBackground(UIUtil.getTextFieldBackground()); - textPane.setBackground(UIUtil.getTextFieldBackground()); } @@ -156,7 +149,7 @@ protected JComponent createCenterPanel() { @Override protected void doHelpAction() { - BrowserUtil.browse("https://doc-view.liuzhihang.com/"); + BrowserUtil.browse("https://docview.liuzhihang.com"); } @@ -194,28 +187,7 @@ protected ExportAction() { @Override protected void doAction(ActionEvent e) { - // 选择路径 - FileChooserDescriptor fileChooserDescriptor = new FileChooserDescriptor(false, true, false, false, false, false); - VirtualFile chooser = FileChooser.chooseFile(fileChooserDescriptor, project, null); - if (chooser != null) { - String path = chooser.getPath(); - - File file = new File(path + "/" + currentDocView.getName() + ".md"); - - if (file.exists()) { - // 文件已存在 - NotificationUtils.errorNotify("文件已存在, 导出 Markdown 失败!", project); - return; - } - try { - FileUtil.writeToFile(file, currentMarkdownText); - } catch (IOException ioException) { - NotificationUtils.errorNotify("导出 Markdown 失败!", project); - } - - } - - NotificationUtils.infoNotify("导出 Markdown 成功!", project); + ExportUtils.exportMarkdown(project, currentDocView.getName(), currentMarkdownText); } } diff --git a/src/main/java/com/liuzhihang/doc/view/ui/SettingsForm.java b/src/main/java/com/liuzhihang/doc/view/ui/SettingsForm.java index 8952f4d..d337ba5 100644 --- a/src/main/java/com/liuzhihang/doc/view/ui/SettingsForm.java +++ b/src/main/java/com/liuzhihang/doc/view/ui/SettingsForm.java @@ -3,7 +3,6 @@ import com.intellij.icons.AllIcons; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.ui.IdeBorderFactory; -import com.intellij.ui.TitledSeparator; import com.intellij.ui.components.labels.LinkLabel; import com.intellij.util.ui.JBUI; import org.jetbrains.annotations.Nullable; @@ -31,6 +30,8 @@ public SettingsForm() { supportLinkLabel.setListener((source, data) -> new SupportForm().show(), null); + domainPanel.setBorder(IdeBorderFactory.createTitledBorder("当前版本不支持配置!")); + } @Nullable @@ -41,6 +42,6 @@ public JComponent createCenterPanel() { private void createUIComponents() { // place custom component creation code here - domainPanel.setBorder(IdeBorderFactory.createTitledBorder("Domain")); + } } diff --git a/src/main/java/com/liuzhihang/doc/view/ui/SupportForm.form b/src/main/java/com/liuzhihang/doc/view/ui/SupportForm.form index 778f314..09cb46a 100644 --- a/src/main/java/com/liuzhihang/doc/view/ui/SupportForm.form +++ b/src/main/java/com/liuzhihang/doc/view/ui/SupportForm.form @@ -6,8 +6,8 @@ <xy x="29" y="20" width="735" height="704"/> </constraints> <properties> - <maximumSize width="450" height="500"/> - <minimumSize width="450" height="500"/> + <maximumSize width="400" height="450"/> + <minimumSize width="400" height="450"/> </properties> <border type="none"/> <children> @@ -203,12 +203,12 @@ <text value="6."/> </properties> </component> - <component id="8a505" class="javax.swing.JLabel"> + <component id="8a505" class="com.intellij.ui.components.labels.LinkLabel" binding="websiteLinkLabel"> <constraints> <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/> </constraints> <properties> - <text value="参与相关活动"/> + <text value="通过网站了解本项目"/> </properties> </component> <hspacer id="3c7bc"> diff --git a/src/main/java/com/liuzhihang/doc/view/ui/SupportForm.java b/src/main/java/com/liuzhihang/doc/view/ui/SupportForm.java index dd6c867..e85f84d 100644 --- a/src/main/java/com/liuzhihang/doc/view/ui/SupportForm.java +++ b/src/main/java/com/liuzhihang/doc/view/ui/SupportForm.java @@ -20,6 +20,7 @@ public class SupportForm extends DialogWrapper { private LinkLabel<String> ideaLinkLabel; private LinkLabel<String> prLinkLabel; private LinkLabel<String> shareLinkLabel; + private LinkLabel<String> websiteLinkLabel; public SupportForm() { super(null); @@ -31,6 +32,7 @@ public SupportForm() { ideaLinkLabel.setIcon(null); prLinkLabel.setIcon(null); shareLinkLabel.setIcon(null); + websiteLinkLabel.setIcon(null); rootPanel.setBorder(JBUI.Borders.empty(12, 15)); rootPanel.setBackground(UIManager.getColor("TextArea.background")); @@ -38,6 +40,7 @@ public SupportForm() { reportLinkLabel.setListener((source, data) -> BrowserUtil.browse(data), "https://github.com/liuzhihang/doc-view/issues"); ideaLinkLabel.setListener((source, data) -> BrowserUtil.browse(data), "https://plugins.jetbrains.com/plugin/15305-doc-view"); prLinkLabel.setListener((source, data) -> BrowserUtil.browse(data), "https://github.com/liuzhihang/doc-view/pulls"); + prLinkLabel.setListener((source, data) -> BrowserUtil.browse(data), "https://docview.liuzhihang.com"); } @Nullable diff --git a/src/main/java/com/liuzhihang/doc/view/utils/ExportUtils.java b/src/main/java/com/liuzhihang/doc/view/utils/ExportUtils.java new file mode 100644 index 0000000..a29d271 --- /dev/null +++ b/src/main/java/com/liuzhihang/doc/view/utils/ExportUtils.java @@ -0,0 +1,46 @@ +package com.liuzhihang.doc.view.utils; + +import com.intellij.openapi.fileChooser.FileChooser; +import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.liuzhihang.doc.view.dto.DocView; + +import java.io.File; +import java.io.IOException; + +/** + * @author liuzhihang + * @date 2020/11/15 14:58 + */ +public class ExportUtils { + + public static void exportMarkdown(Project project, String fileName, String markdownText) { + + // 选择路径 + FileChooserDescriptor fileChooserDescriptor = new FileChooserDescriptor(false, true, false, false, false, false); + VirtualFile chooser = FileChooser.chooseFile(fileChooserDescriptor, project, null); + if (chooser != null) { + String path = chooser.getPath(); + + File file = new File(path + "/" + fileName + ".md"); + + if (file.exists()) { + // 文件已存在 + NotificationUtils.errorNotify("文件已存在, 导出 Markdown 失败!", project); + return; + } + try { + FileUtil.writeToFile(file, markdownText); + } catch (IOException ioException) { + NotificationUtils.errorNotify("导出 Markdown 失败!", project); + } + + } + + NotificationUtils.infoNotify("导出 Markdown 成功!", project); + + } + +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index e1b15c7..25eb762 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -21,7 +21,7 @@ <projectService serviceImplementation="com.liuzhihang.doc.view.component.Settings"/> <!-- app 等级 --> - <applicationService serviceImplementation="com.liuzhihang.doc.view.service.DocViewService"/> + <applicationService serviceImplementation="com.liuzhihang.doc.view.service.SpringDocViewService"/> <applicationConfigurable instance="com.liuzhihang.doc.view.component.SettingsConfigurable" id="liuzhihang.api.doc.SettingsConfigurable"