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

这是未经测试的代码,但是由于它紧密地重编了EditorsSplitters 29328562927734630630和window.myPanel41函数内部的过程,因此我很肯定这会起作用。

提出了两种方法:

访问输出writeExternal->应该是更稳定的API,并提供对文件信息的更轻松访问

访问分离器的组件->这样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 fileNames = new ArrayList();

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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值