当前位置: 首页 > 面试题库 >

检索和设置IntelliJ IDEA插件开发的拆分窗口设置

魏成济
2023-03-14
问题内容

我正在编写一个IntelliJ IDEA插件,用于保存称为Tab Session的打开选项卡的会话。该问题是IntelliJIDEA插件开发的后续工作:保存选项卡组,永久保存它们,并根据用户的要求重新加载一组选项卡。

当前,不支持分割窗口。因此,我想做两件事:

  1. 检索有关所有拆分窗口或未拆分窗口的信息,这些窗口是编辑器选项卡的容器。我需要它们的位置和分割方向(水平或垂直)。
  2. 保存此信息并需要加载选项卡会话时,我需要像以前一样完全重建拆分的窗格及其选项卡。

由于缺乏文档,我目前正在浏览源代码,并发现了这段有希望的代码:

private EditorsSplitters getSplittersFromFocus() {
  return FileEditorManagerEx.getInstanceEx(myProject).getSplitters();
}

它允许我使用来遍历一组分割的窗口EditorWindow[] windows = getSplittersFromFocus.getOrderedWindows()。它们包含编辑器选项卡以及有关其宽度和高度的信息。但是我没有找到有关拆分方向以及如何像以前一样重建拆分后的窗口的任何信息。

有人可以帮忙吗?


问题答案:

这是未经测试的代码,但是由于它紧密地重新组合了EditorsSplitters
writeExternalwritePanel函数内部的过程,因此我相信这是可行的。

提出了两种方法:

  • writeExternal->的访问输出应该是更稳定的API,并且可以更轻松地访问文件信息
  • 访问splitter的组件->以这种方式writeExternal创建它的信息;可悲的是,至少有一个保护场没有涉及吸气剂(window.myPanel内部findWindowWith

    import com.intellij.openapi.actionSystem.AnAction;
    import com.intellij.openapi.actionSystem.AnActionEvent;
    import com.intellij.openapi.fileEditor.FileEditorManager;
    import com.intellij.openapi.fileEditor.impl.EditorsSplitters;
    import com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl;
    import com.intellij.openapi.project.Project;
    import com.intellij.openapi.ui.Splitter;
    import org.jdom.Element;

    import javax.swing.;
    import java.awt.
    ;
    import java.util.ArrayList;

    public class SplitterAction extends AnAction {

    public SplitterAction() {
        super("Splitter _Action");
    }
    
    private static class Info {
    
    }
    
    private static class SplitInfo extends Info {
        public Info    first;
        public Info    second;
        public boolean vertical;
        public float   proportions;
    }
    
    private static class FileInfo extends Info {
        public String[] fileNames;
    }
    
    @Override
    public void actionPerformed(AnActionEvent anActionEvent) {
        final Project project = anActionEvent.getProject();
        final FileEditorManagerImpl fileEditorManager = (FileEditorManagerImpl) FileEditorManager.getInstance(project);
        EditorsSplitters splitters = fileEditorManager.getSplitters();
        // com.intellij.openapi.fileEditor.impl.EditorsSplitters.writeExternal() and
        // com.intellij.openapi.fileEditor.impl.EditorsSplitters#writePanel inspired this
        final Component component = splitters.getComponent(0);
        final SplitInfo infos = splitterVisitor(component);
    
        // or you could use this
        Element root = new Element("root");
        splitters.writeExternal(root);
    
        elementVisitor(root);
    
        // to restore from writeExternal the following should suffice
        splitters.readExternal(root);
        splitters.openFiles();
    }
    
    /**
     * Reads writeExternal output
     */
    private Info elementVisitor(Element root) {
        final Element splitter = root.getChild("splitter");
        if (splitter != null) {
            // see com.intellij.openapi.fileEditor.impl.EditorsSplitters#writePanel
            final SplitInfo splitInfo = new SplitInfo();
            // "vertical" or "horizontal"
            splitInfo.vertical = "vertical".equals(splitter.getAttributeValue("split-orientation"));
            splitInfo.proportions = Float.parseFloat(splitter.getAttributeValue("split-proportion"));
            Element first = splitter.getChild("split-first");
            if (first != null) {
                splitInfo.first = elementVisitor(first);
            }
            Element second = splitter.getChild("split-second");
            if (second != null) {
                splitInfo.second = elementVisitor(second);
            }
            return splitInfo;
        }
        final Element leaf = root.getChild("leaf");
        if (leaf != null) {
            final ArrayList<String> fileNames = new ArrayList<String>();
            for (Element file : leaf.getChildren("file")) {
                final String fileName = file.getAttributeValue("leaf-file-name");
                fileNames.add(fileName);
                // further attributes see com.intellij.openapi.fileEditor.impl.EditorsSplitters#writeComposite
            }
            final FileInfo fileInfo = new FileInfo();
            fileInfo.fileNames = fileNames.toArray(new String[fileNames.size()]);
            return fileInfo;
        }
        return null;
    }
    
    /**
     * Acts directly upon Component
     */
    private SplitInfo splitterVisitor(Component component) {
        if (component instanceof JPanel && ((JPanel) component).getComponentCount() > 0) {
            final Component child = ((JPanel) component).getComponent(0);
            if (child instanceof Splitter) {
                final Splitter splitter = (Splitter) child;
                final SplitInfo splitInfos = new SplitInfo();
                splitInfos.vertical = splitter.isVertical();
                splitInfos.proportions = splitter.getProportion();
                splitInfos.first = splitterVisitor(splitter.getFirstComponent());
                splitInfos.second = splitterVisitor(splitter.getSecondComponent());
                return splitInfos;
            }
            // TODO: retrieve file information
        }
        return null;
    }
    

    }



 类似资料:
  • 我正在编写一个名为Tab Session的IntelliJ IDEA插件,用于保存打开选项卡的会话。这个问题是IntelliJ IDEA插件开发的后续问题:保存选项卡组,持续保存它们,并在用户请求时重新加载一组选项卡。 目前,不支持分割窗口。因此,我想做两件事情: 检索作为编辑器选项卡容器的所有拆分或未拆分窗口的信息。我需要它们的位置和拆分方向(水平或垂直)。 当这些信息被保存并且需要加载一个标签

  • 如果你必须定期在服务器上进行维护工作,你可能需要在维护期间暂停监控并停止接收来自 Navicat Monitor 的警报。Navicat Monitor 可让你设置维护窗口时间段以禁用监控选择的实例。在此期间,Navicat Monitor 不会发出警报,也不会发送通知。若要设置实例的维护窗口,请前往“配置”->“全部实例”。 【注意】你也可以手动暂停单个实例的监控。请参阅暂停监控一个实例。 设置

  • 我已经在PhpStom中设置了PlantUML插件。 我已经下载了Graphviz 2.36并安装在我的机器上。 我已经搜索了如何设置Graphviz以便使用PlantUML在PhpStorm中做一个用例,但是我找不到任何信息

  • 我正在尝试为KendoDropDownList设置下拉窗口的宽度。使用以下代码: 下拉列表显示并且是KendoDropDownList。所以我知道调用var ddl=$(“#dropdownlist”)。kendoDropDownList()正在工作。但是,我在调用kendoDDL时遇到一个异常。列表宽度(400)。 0x800a138f-JavaScript运行时错误:无法获取未定义或空引用的属

  • 使用 Online Editor 对 Weex 尝鲜是一个不错的选择,但如果你想更专业的开发 Weex,本节会教你如何搭建本地开发环境进行 Weex 开发。 安装依赖 Weex 官方提供了weex-cli 的脚手架工具来辅助开发和调试。 首先,你需要 Node.js 和 Weex CLI。 安装 Node.js 方式多种多样,最简单的方式是在 Node.js 官网 下载可执行程序直接安装即可。 更

  • 如果你已经有了 Maven 的开发环境,那你可以跳过本节。 本书例子需要 JDK 和 Apache Maven,都可以免费下载到。 1.安装配置 JDK 建议用 JDK 7+ 2.下载 IDE JAVA 的 IDE 很多,主流的有 Eclipse: http://www.eclipse.org NetBeans: http://www.netbeans.org Intellij Idea Comm