Recuperar y configurar la configuración de la ventana dividida para el desarrollo del complemento IntelliJ IDEA


Estoy escribiendo un plugin IntelliJ IDEA para guardar sesiones de pestañas abiertas llamado Tab Session. Esta pregunta es una continuación del desarrollo del plugin IntelliJ IDEA: Guarde grupos de pestañas, guárdelas persistentemente y vuelva a cargar un conjunto de pestañas si lo solicita el usuario .

Actualmente, las ventanas divididas no son compatibles. Por lo tanto, quiero hacer dos cosas:

  1. Recupere información sobre todas las ventanas divididas o no divididas que son contenedores para pestañas del editor. Necesito su posición y dirección de división (horizontal o vertical).
  2. 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 a través del código fuente y encontré este prometedor fragmento de código:

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

Me permite iterar a través del conjunto de ventanas divididas usando EditorWindow[] windows = getSplittersFromFocus.getOrderedWindows(). Contienen al editor pestañas e información sobre su anchura y altura. Pero no encontré ninguna información sobre la dirección de división y cómo reconstruir las ventanas divididas como lo eran antes.

Alguien Puede ayudar?

Author: Community, 2013-11-01

1 answers

Este es un código no probado, pero ya que vuelve a mezclar los procedimientos dentro de EditorsSplitters writeExternal y writePanel funciones Estoy seguro de que esto funcionará.

Se presentan dos métodos:

  • la salida de acceso de writeExternal - > debe ser la API más estable y ofrece un acceso más fácil a la información del archivo
  • componentes de acceso de splitter - > de esta manera writeExternal crea su información; lamentablemente hay al menos un campo protegido sin getter involucrado (window.myPanel dentro 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;
    }
}
 4
Author: TheConstructor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-04 09:30:14