47 votes

Récupération et définition des paramètres de fenêtre fractionnée pour le développement du plug-in IntelliJ IDEA

Je suis en train d'écrire un IntelliJ IDEA plugin pour sauvegarder les sessions d'onglets ouverts appelé Onglet Session. Cette question est une question de suivi de IntelliJ IDÉE de Développement d'un Plugin: Enregistrer des groupes d'onglets, de les enregistrer de façon persistante et de recharger un ensemble d'onglets si demandé par l'utilisateur.

Actuellement, répartis de windows ne sont pas pris en charge. C'est pourquoi je veux faire deux choses:

  1. Récupérer des informations sur tous séparés ou unsplitted windows qui sont des conteneurs pour les onglets d'édition. J'ai besoin de leur position et de la direction de fractionnement (horizontale ou verticale).
  2. Lorsque cette information est enregistrée et un onglet session doit être chargé, j'ai besoin de reconstruire l'coupée en deux volets et leurs onglets exactement comme ils étaient avant.

En raison du manque de documentation, je suis actuellement en parcourant le code source et trouvé cette prometteuse morceau de code:

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

Il me permet d'itérer sur l'ensemble de splitted windows à l'aide d' EditorWindow[] windows = getSplittersFromFocus.getOrderedWindows(). Ils contiennent les onglets d'édition et de l'information au sujet de leur largeur et la hauteur. Mais je n'ai pas trouver toutes les informations à propos de la direction de fractionnement et comment reconstruire la splittés de windows comme ils étaient avant.

Quelqu'un peut-il aider?

4voto

TheConstructor Points 2012

C'est du code non testé, mais comme il est étroitement resmbles les procédures à l'intérieur de EditorsSplitters writeExternal et writePanel fonctions, je suis positif.

Présenté deux méthodes:

  • accès sortie d' writeExternal -> doit être le plus stable de l'API et offre un accès plus facile aux informations sur le fichier
  • les composants d'accès de splitter -> de cette façon, writeExternal crée de l'information; malheureusement, il y a au moins un champ protégé sans getter impliqués (window.myPanel à l'intérieur d' 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;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X