2009-01-18 14 views
7

Estoy desarrollando un plugin editor para eclipse. Funciona bien en archivos dentro de proyectos eclipse, pero cuando se abre un archivo externo a través del menú "Archivo -> Abrir archivo" (que funciona con archivos, por ejemplo, Java), aparece una página que muestra nada más que una línea azul horizontal y el palabra "ERROR". El registro de errores de eclipse está vacío, al igual que el archivo de registro en el directorio .metadata.Plugin del editor Eclipse: "ERROR" al abrir el archivo fuera del proyecto

¿Cuál podría ser la causa? ¿Cómo puedo diagnosticar el error cuando no aparece ningún mensaje de error que me indique dónde buscar? No parece haber una forma de obtener un registro más detallado de eclipse.

Editar:

He descubierto que el origen del problema está cerca de lo jamesh mencionado, pero no un ClassCastException - simplemente no hay IDocument ejemplo para el visor de texto para mostrar porque StorageDocumentProvider.createDocument() devuelva null . La razón de esto es que sólo sabe cómo crear documentos para casos de org.eclipse.ui.IStorageEditorInput, pero en este caso se pone una instancia de org.eclipse.ui.ide.FileStoreEditorInput, que no implementa la interfaz, sino que implementa org.eclipse.ui.IURIEditorInput

+0

¿Recibo un premio?)? – jamesh

Respuesta

8

Tuve el mismo problema y finalmente encontré una solución que funcionaba para mí. Debe proporcionar 2 proveedores de documentos diferentes: primero extendiendo FileDocumentProvider para archivos dentro de su área de trabajo, y extendiendo por segunda vez TextFileDocumentProvider para otros recursos fuera de su área de trabajo. A continuación, se registra el proveedor adecuado según la entrada de sus editores doSetInput método como este:

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); 
} 

entonces en su nuevo proveedor de documentos (que se extiende TextFileDocumentProvider) insertar somethnig así:

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; 
    } 

Este funciona para mí :) Finalmente tengo que mencionar que no soy tan inteligente y que copié esta solución del proyecto Amateras (complemento del editor HTML de Opensource para eclipse)

+1

¡Gracias por esto! Realmente me sentí frustrado porque el ejemplo de Plug-in de Editor (Eclipse 3.7) no funcionó de la caja con archivos que no son del área de trabajo. FYI, en 3.7, la verificación de tipo en este código no funciona tal como está. Funciona si lo hace: 'instanceof IFileEditorInput' => XMLFileDocumentProvider,' else' => XMLTextDocumentProvider. Además, también funciona si simplemente usa XMLTextDocumentProvider (es decir, un TextFileDocumentProvider) en ambos casos. Más información [en esta publicación del foro] (http://www.eclipsezone.com/eclipse/forums/t98253.html#92158543). No estoy seguro de una razón para extender FileDocumentProvider. – tcovo

0

¿Usted intentó crear un JAVA archivo usando el editor, fuera del espacio de trabajo?

Al llamar al editor con la ruta del archivo, concat "file: //" al comienzo de la ruta del archivo.eg: si la ruta es C: //temp//Sample.java, modifíquela como archivo : // C: //temp//Sample.java.

+0

No estoy llamando al editor, estoy abriendo un archivo a través del menú de eclipse. Es un tipo de archivo específico cuya extensión hace que se abra en mi plugin de editor. Me limité a mencionar a Java como un ejemplo de editor donde funciona. –

2

estoy un poco lejos del código fuente en este momento, aunque sospecho que el problema es un ClassCastException:

  • Para un archivo de área de trabajo, el IEditorInput es org.eclipse.ui.IFileEditorInput.
  • Para un archivo que no sea espacio de trabajo local, el IEditorInput es org.eclipse.ui.IStorageEditorInput

La diferencia está en cómo se obtiene el contenido de la IEditorInput. El JDT realiza una comprobación explícita de instanceof para realizar el cambio.

No creo que el getAdapter(Class clazz) devolverá un java.io.InputStream si lo ofrece.

No entiendo muy bien por qué lo hacen así, pero se siente feo.

Editar: punto A más general sobre la depuración de aplicaciones Eclipse - que es realmente muy útil para tratar de reunir todos sus registros en un solo lugar (es decir, la consola).

Para hacer esto, asegúrese de utilizar las opciones de línea de comando -console y -consoleLog. Este último ha ayudado a ahorrar incontables horas de tiempo. Si aún no lo ha hecho, conozca las cuestiones más básicas sobre cómo usar la consola (ss y start son las más utilizadas). Esto ahorrará más tiempo diagnosticando una cierta clase de problema.

+0

Eso definitivamente suena como que podría ser la causa - lo verificará cuando pueda (estoy lejos de ese código también :) –

Cuestiones relacionadas