java - jidea - Recuperando y configurando la ventana dividida para el desarrollo del complemento IntelliJ IDEA
intellij idea para linux (1)
Estoy escribiendo un complemento IntelliJ IDEA para guardar sesiones de pestañas abiertas llamadas Tab Session . Esta pregunta es una continuación del desarrollo de IntelliJ IDEA Plugin: guarde grupos de pestañas, guárdelas de forma persistente y vuelva a cargar un conjunto de pestañas si así lo solicita el usuario .
Actualmente, las ventanas divididas no son compatibles. Por lo tanto, quiero hacer dos cosas:
- Recupere información sobre todas las ventanas divididas o no divididas que son contenedores para las pestañas del editor. Necesito su posición y dirección dividida (horizontal o vertical).
- Cuando se guarda esta información y se necesita cargar una sesión de pestañas, necesito reconstruir los paneles divididos y sus pestañas exactamente como estaban antes.
Debido a la falta de documentación, actualmente estoy navegando por el código fuente y encontré esta prometedora pieza de código:
private EditorsSplitters getSplittersFromFocus() {
return FileEditorManagerEx.getInstanceEx(myProject).getSplitters();
}
Me permite iterar a través del conjunto de ventanas EditorWindow[] windows = getSplittersFromFocus.getOrderedWindows()
usando EditorWindow[] windows = getSplittersFromFocus.getOrderedWindows()
. Contienen las pestañas del editor e información sobre su ancho y alto. Pero no encontré ninguna información sobre la dirección de división y cómo reconstruir las ventanas divididas como lo estaban antes.
¿Alguien puede ayudar?
Este es un código no probado, pero a medida que resune los procedimientos dentro de EditorsSplitters writeExternal
y writePanel
, estoy seguro de que esto funcionará.
Presentado son dos métodos:
- la salida de acceso de
writeExternal
-> debería ser la API más estable y ofrece un acceso más fácil a la información del archivo - acceder a los componentes del splitter -> de esta manera
writeExternal
crea su información; lamentablemente hay al menos un campo protegido sin getter involucrado (window.myPanel
dentro defindWindowWith
)
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;
}
}