2013-11-01 4 views
47

मैं टैब खुले सत्र को बचाने के लिए एक IntelliJ विचार प्लगइन लिख रहा हूँ के लिए स्प्लिट विंडो सेटिंग Tab Session कहा जाता है। यह प्रश्न IntelliJ IDEA Plugin Development: Save groups of tabs, save them persistently and reload a set of tabs if requested by the user का अनुवर्ती है।प्राप्त कर रहा है और स्थापित करने IntelliJ विचार प्लगइन विकास

वर्तमान में, splitted विंडो समर्थित नहीं हैं। इसलिए मैं दो चीजें करना चाहता हूं:

  1. संपादक टैब के लिए कंटेनर वाले सभी विभाजित या अनसुलझा विंडो के बारे में जानकारी पुनर्प्राप्त करें। मुझे उनकी स्थिति और विभाजित दिशा की आवश्यकता है (क्षैतिज या लंबवत)।
  2. जब यह जानकारी सहेजा जाता है और एक टैब सत्र लोड करने की आवश्यकता, मैं वास्तव में splitted शीशे और उनके टैब फिर से संगठित करने के रूप में वे पहले थे की जरूरत है।

प्रलेखन की कमी के कारण मैं वर्तमान में browsing through the source code हूँ और कोड के इस होनहार टुकड़ा मिला:

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

यह मेरे EditorWindow[] windows = getSplittersFromFocus.getOrderedWindows() का उपयोग करके splitted खिड़कियों के सेट के माध्यम से चीज़ों को दोहरा सकते। उनमें संपादक टैब और उनकी चौड़ाई और ऊंचाई के बारे में जानकारी होती है। लेकिन मुझे विभाजित दिशा के बारे में कोई जानकारी नहीं मिली और विभाजित खिड़कियों का पुनर्निर्माण कैसे किया गया था जैसा कि वे पहले थे।

क्या कोई मदद कर सकता है?

+6

आप का प्रयास किया था [ओपन एपीआई और प्लगइन विकास] (http://devnet.jetbrains.com/community/idea/open_api_and_plugin_development) मंच? मेरे पास प्लगइन विकास के संबंध में मेरे कुछ प्रश्न हैं। मेरी पोस्ट में से एक के बाद दिमित्री जेमेरोव ने विकास के साथ जारी रखने में मेरी सहायता के लिए कोर आईडीईए एपीआई अपडेट की। – kukido

+1

हाँ मैंने किया: http://devnet.jetbrains.com/thread/451243?tstart=0 - और मैंने पूरी तरह से उस जवाब को याद किया! मुझे – Alp

+0

याद दिलाने के लिए धन्यवाद यह आपके प्रश्न से थोड़ा असंबंधित है, लेकिन इंटेलिजे संदर्भ से आपकी प्लगइन किस पहलू से भिन्न है? – gizmo

उत्तर

4

यह अपरीक्षित कोड है, लेकिन के रूप में यह बारीकी से EditorsSplitterswriteExternal और writePanel कार्यों के अंदर प्रक्रियाओं resmbles मैं सकारात्मक है कि यह काम करेंगे।

प्रस्तुत दो तरीके हैं: writeExternal की

  • पहुँच उत्पादन -> और अधिक स्थिर एपीआई होना चाहिए और जानकारी दर्ज करने के लिए
  • विभाजक की पहुँच घटकों आसान पहुँच प्रदान करता है -> इस तरह से writeExternal यह जानकारी दी गई है बनाता है; दुर्भाग्य से वहाँ शामिल गेटर के बिना कम से कम एक संरक्षित क्षेत्र (window.myPanelfindWindowWith अंदर) है
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; 
    } 
} 
संबंधित मुद्दे