2013-11-01 4 views
47

Piszę wtyczkę IntelliJ IDEA do zapisywania sesji otwartych kart o nazwie Tab Session. To pytanie jest kontynuacją IntelliJ IDEA Plugin Development: Save groups of tabs, save them persistently and reload a set of tabs if requested by the user.Pobieranie i ustawianie ustawień okna podziału dla rozwoju wtyczki IntelliJ IDEA

Obecnie podzielone okna nie są obsługiwane. Dlatego chcę zrobić dwie rzeczy:

  1. Pobierz informacje o wszystkich podzielonych lub nieskompresowanych oknach, które są kontenerami dla kart edytora. Potrzebuję ich pozycji i podzielonego kierunku (poziomego lub pionowego).
  2. Po zapisaniu tej informacji i załadowaniu sesji karty należy zrekonstruować podzielone panele i ich zakładki dokładnie tak, jak poprzednio.

Ze względu na brak dokumentacji Obecnie jestem browsing through the source code i znaleźć ten obiecujący fragment kodu:

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

pozwala mi iterację zestaw podzielony okien za pomocą EditorWindow[] windows = getSplittersFromFocus.getOrderedWindows(). Zawierają zakładki edytora i informacje o ich szerokości i wysokości. Ale nie znalazłem żadnej informacji o podzielonym kierunku i jak zrekonstruować podzielone okna, tak jak poprzednio.

Czy ktoś może pomóc?

+6

Próbowałaś [Otwarte API i Plugin Development] (http://devnet.jetbrains.com/community/idea/open_api_and_plugin_development) forum? Mam odpowiedzi na kilka pytań dotyczących rozwoju wtyczek. Po jednym z moich postów Dmitrij Jemerow zaktualizował core IDEA API, aby pomóc mi kontynuować rozwój. – kukido

+1

tak, zrobiłem: http://devnet.jetbrains.com/thread/451243?tstart=0 - i zupełnie tęskniłem za tą odpowiedzią! dzięki za przypomnienie mi – Alp

+0

To jest trochę niezwiązane z twoim pytaniem, ale w jakich aspektach twoja wtyczka różni się od kontekstu IntelliJ? – gizmo

Odpowiedz

4

To jest niezrekwalifikowany kod, ale ponieważ dokładnie odzwierciedla procedury wewnątrz funkcji EditorsSplitterswriteExternal i writePanel, jestem pewien, że to zadziała.

Przedstawione są dwie metody: Wyjście

  • dostęp writeExternal -> powinny być bardziej stabilne API i oferuje łatwiejszy dostęp do pliku informacji
  • komponenty dostępu splitter -> w ten sposób writeExternal tworzy to informacja; niestety jest co najmniej jeden chroniony obszar bez getter zaangażowanego (window.myPanel wewnątrz 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; 
    } 
}