2009-01-18 18 views
7

मैं ग्रहण के लिए एक संपादक प्लगइन विकसित कर रहा हूं। यह ग्रहण परियोजनाओं के भीतर फ़ाइलों पर ठीक काम करता है, लेकिन जब "फाइल -> ओपन फाइल" मेनू (जो जावा फाइलों के साथ फाइल करता है) के माध्यम से एक बाहरी फ़ाइल खोला जाता है, तो मुझे एक पृष्ठ दिखाई देता है लेकिन एक क्षैतिज नीली रेखा और शब्द "त्रुटि"। Eclipse का त्रुटि लॉग खाली है, जैसा कि .metadata निर्देशिका में लॉग फ़ाइल है।ग्रहण संपादक प्लगइन: परियोजना के बाहर फ़ाइल खोलते समय "त्रुटि"

इसका कारण क्या हो सकता है? जब मुझे कोई त्रुटि संदेश नहीं होता है तो मुझे त्रुटि का निदान कैसे किया जा सकता है जो मुझे बताता है कि कहां देखना है? ग्रहण से अधिक विस्तृत लॉगिंग प्राप्त करने का कोई तरीका प्रतीत नहीं होता है।

संपादित करें:

मैं पाया है कि समस्या के स्रोत क्या उल्लेख किया jamesh के करीब है, लेकिन नहीं एक ClassCastException - वहाँ बस पाठ दर्शक प्रदर्शित करने के लिए क्योंकि StorageDocumentProvider.createDocument() रिटर्न शून्य के लिए कोई IDocument उदाहरण है । इस का कारण यह है कि यह केवल जानता है कि org.eclipse.ui.IStorageEditorInput की घटनाओं के लिए दस्तावेज़ बनाने के लिए कैसे, लेकिन इस मामले में यह org.eclipse.ui.ide.FileStoreEditorInput का एक उदाहरण है, जो कि इंटरफ़ेस को लागू नहीं करता है हो जाता है, लेकिन इसके बजाय लागू करता org.eclipse.ui.IURIEditorInput

+0

क्या मुझे पुरस्कार मिलता है;)? – jamesh

उत्तर

8

मुझे वही समस्या थी और अंत में मेरे लिए समाधान समाधान मिला। आपको 2 अलग-अलग दस्तावेज़ प्रदाताओं को प्रदान करना होगा - पहले आपके वर्कस्पेस के अंदर फ़ाइलों के लिए फ़ाइल डॉक्यूमेंटप्रोवाइडर और दूसरा वर्कस्पेस के बाहर अन्य संसाधनों के लिए TextFileDocumentProvider विस्तारित करना। तो फिर तुम सही प्रदाता अपने संपादकों doSetInput इस तरह विधि में इनपुट के अनुसार रजिस्टर:

private IDocumentProvider createDocumentProvider(IEditorInput input) { 
    if(input instanceof IFileEditorInput){ 
     return new XMLTextDocumentProvider(); 
    } else if(input instanceof IStorageEditorInput){ 
     return new XMLFileDocumentProvider(); 
    } else { 
     return new XMLTextDocumentProvider(); 
    } 
} 

@Override 
protected final void doSetInput(IEditorInput input) throws CoreException { 
    setDocumentProvider(createDocumentProvider(input)); 
    super.doSetInput(input); 
} 

फिर अपने नए दस्तावेज़ प्रदाता में (TextFileDocumentProvider विस्तार) somethnig इस तरह सम्मिलित करें:

protected FileInfo createFileInfo(Object element) throws CoreException { 
     FileInfo info = super.createFileInfo(element); 
     if(info==null){ 
      info = createEmptyFileInfo(); 
     } 
     IDocument document = info.fTextFileBuffer.getDocument(); 
     if (document != null) { 

      /* register your partitioner and other things here 
         same way as in your fisrt document provider */ 
     } 
     return info; 
    } 

यह मेरे लिए काम करता है :) अंततः मुझे यह उल्लेख करना होगा कि मैं इतना चालाक नहीं हूं और मैंने इस समाधान को प्रोजेक्ट अमेटेरस (ग्रहण के लिए ओपनसॉर्स एचटीएमएल एडिटर प्लगइन) से कॉपी किया है

+1

इसके लिए धन्यवाद! मैं वास्तव में निराश था कि संपादक प्लग-इन उदाहरण (ग्रहण 3.7) गैर-वर्कस्पेस फ़ाइलों के साथ बॉक्स से बाहर काम नहीं करता था। एफवाईआई, 3.7 में, इस कोड में टाइपिंग की तरह काम नहीं करता है। यह काम करता है यदि आप इसके बजाय करते हैं: 'उदाहरण IFileEditorInput' => XMLFileDocumentProvider, 'else' => XMLTextDocumentProvider। इसके अलावा, यह भी काम करता है अगर आप दोनों मामलों में XMLTextDocumentProvider (यानी एक TextFileDocumentProvider) का उपयोग करते हैं। अधिक जानकारी [इस मंच पोस्ट में] (http://www.eclipsezone.com/eclipse/forums/t98253.html#92158543)। मुझे FileDocumentProvider का विस्तार करने का कोई कारण नहीं है। – tcovo

0

आप एक जावा बनाने की कोशिश की है वर्कस्पेस के बाहर, संपादक का उपयोग कर फ़ाइल?

फ़ाइल पथ के साथ संपादक को कॉल करते समय, फ़ाइल path.eg की शुरुआत में "फ़ाइल: //" को सम्मिलित करें: यदि पथ सी: //temp//Sample.java है, तो इसे फ़ाइल के रूप में संशोधित करें : // सी: //temp//Sample.java।

+0

मैं संपादक को बिल्कुल नहीं बुला रहा हूं, मैं ग्रहण के मेनू के माध्यम से एक फाइल खोल रहा हूं। यह एक विशिष्ट फ़ाइल प्रकार है जिसका एक्सटेंशन इसे मेरे संपादक प्लगइन में खोला जाने का कारण बनता है। मैंने जावा को केवल एक संपादक के उदाहरण के रूप में वर्णित किया जहां यह काम करता है। –

2

मैं इस समय स्रोत कोड से दूर एक छोटे से कर रहा हूँ, हालांकि मुझे लगता है समस्या एक ClassCastException है:

  • एक कार्यस्थान फ़ाइल के लिए, IEditorInputorg.eclipse.ui.IFileEditorInput है।
  • एक स्थानीय गैर कार्यक्षेत्र फ़ाइल के लिए, IEditorInput अंतर कैसे आप IEditorInput से सामग्री प्राप्त है org.eclipse.ui.IStorageEditorInput

है। स्विच करने के लिए जेडीटी एक स्पष्ट instanceof जांच करता है।

मुझे नहीं लगता कि getAdapter(Class clazz)java.io.InputStream लौटाएगा यदि आप इसे पेश करते हैं।

मुझे समझ में नहीं आता कि वे ऐसा क्यों करते हैं, लेकिन यह बदसूरत लगता है।

संपादित करें: ग्रहण क्षुधा डीबगिंग के बारे में एक अधिक सामान्य बिंदु - यह वास्तव में बहुत कोशिश करते हैं और एक ही स्थान पर (अर्थात कंसोल) में अपने सभी लॉग इकट्ठा करने के लिए उपयोगी है।

ऐसा करने के लिए, सुनिश्चित करें कि आप कमांड लाइन विकल्प -console और -consoleLog का उपयोग करें। उत्तरार्द्ध ने अनगिनत घंटों को बचाने में मदद की है। यदि आप पहले से नहीं हैं, तो कंसोल का उपयोग कैसे करें (ss और start मेरे सबसे अधिक उपयोग किए जाने वाले) के बारे में सबसे बुनियादी चीजें सीखें। यह समस्या के एक निश्चित वर्ग का निदान करने में कुछ और समय बचाएगा।

+0

यह निश्चित रूप से लगता है कि यह कारण हो सकता है - यह जांच करेगा कि जब मैं कर सकता हूं (मैं अभी भी उस कोड से दूर हूं :) –

संबंधित मुद्दे