gvSIG bugs #3432

Updated by Joaquín del Cerro Murciano about 9 years ago

Supongamos que queremos crear un documento vista nuevo y que queremos abrir su ventana de propiedades:
<pre>

ProjectManager projectManager = ApplicationLocator.getProjectManager();
ViewManager viewManager = (ViewManager) projectManager.getDocumentManager(ViewManager.TYPENAME);
view = (ViewDocument) viewManager.createDocument();
ProjectManager.getInstance().getCurrentProject().addDocument(view);
if (view!=null) {
IWindow propWin = view.getPropertiesWindow();
ApplicationManager manager = ApplicationLocator.getManager();
manager.getUIManager().addWindow(propWin);
}
</pre>



El addWindow final provoca un MDIFrame.refreshControls(), que en el isVisible de algunas extensiones acaba llamando a ApplicationLocator.getManager().getActiveComponent(ViewDocument.class);

Debido a un comportamiento indeseado del método getActiveComponent, éste acaba creando la ventana de la vista (que no se había llegado a crear en el código de ejemplo), y al crearse se llama a los listeners (MapControlCreationListener).

Uno de estos listeners (creado en el postInitialize de EditingExtension) llama a ApplicationLocator.getManager().refreshMenusAndToolBars(), que a su vez vuelve a llamar al isVisible de las extensiones y se entra en el bucle infinito.

Este bucle infinito está causado por la concurrencia de varios comportamientos que habría que estudiar si son deseables o podemos considerarlos bugs en sí mismos:
- ApplicationLocator.getManager().getActiveComponent(Class) crea la ventana del documento como efecto colateral en ciertas circustancias
- No parece una buena idea llamar a refreshMenusAndToolBars() desde un listener de MapControlCreationListeners. Cuando la ventana que contenga el mapcontrol se active, ya se llamará a MDIFrame.refreshControls()

Back