检索并设置IntelliJ IDEA插件开发的分割窗口设置
我正在编写一个IntelliJ IDEA插件,用于保存称为选项卡会话的打开选项卡的会话 。 这个问题是IntelliJ IDEA插件开发的后续工作:保存选项卡组,并持久保存,并在用户请求时重新加载一组选项卡 。
目前,不支持拆分窗口。 所以我想做两件事情:
- 检索有关编辑器选项卡容器的所有拆分或未拆分窗口的信息。 我需要他们的位置和分裂方向(水平或垂直)。
- 当这个信息被保存并且一个标签会话需要被加载时,我需要重build与之前一样的拆分窗格和它们的标签。
由于缺乏文档我目前正在浏览源代码 ,发现这个有前途的一段代码:
private EditorsSplitters getSplittersFromFocus() { return FileEditorManagerEx.getInstanceEx(myProject).getSplitters(); }
它允许我通过使用EditorWindow[] windows = getSplittersFromFocus.getOrderedWindows()
遍历EditorWindow[] windows = getSplittersFromFocus.getOrderedWindows()
。 它们包含编辑器选项卡以及有关其宽度和高度的信息。 但是我没有find任何关于拆分方向的信息,以及如何像以前一样重build拆分的窗口。
谁能帮忙?
这是未经testing的代码,但因为它紧密地重写EditorsSplitters writeExternal
和writePanel
函数内的程序,我认为这将工作。
介绍有两种方法:
-
writeExternal
– >的访问输出应该是更稳定的API,并提供更容易的文件信息访问 - 访问分离器的组件 – >这种方式
writeExternal
创build它的信息; 可悲的是至less有一个保护领域没有getter(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; } }
- IntelliJ IDEA中错误的Manifest.mf创build.jar
- 如何更改IntelliJ IDEA中“默认gradle包装”的版本?
- IntelliJ能显示一个像Eclipse一样的可search的maven依赖项吗?
- 错误:java:无效的源版本:8在Intellij。 这是什么意思?
- “错误:无法确定所选JDK中的Java VM可执行文件”的原因是什么?
- 什么gitignore从.idea文件夹?
- Intellij IDEA不从Groovy项目中的@Grab导入依赖项
- 在intellij IDEA中使用gradle构build获取gradle依赖关系
- Intellij 14奇怪的编辑器/游标行为