package org.nightlabs.jfire.scripting.admin.ui.editor;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.forms.IFormPart;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.IFormPage;
import org.nightlabs.base.ui.entity.editor.EntityEditor;
import org.nightlabs.base.ui.entity.editor.EntityEditorPageControllerModifyEvent;
import org.nightlabs.base.ui.entity.editor.EntityEditorPageWithProgress;
import org.nightlabs.base.ui.entity.editor.IEntityEditorPageController;
import org.nightlabs.base.ui.entity.editor.IEntityEditorPageFactory;
import org.nightlabs.jfire.scripting.Script;
import org.nightlabs.jfire.scripting.admin.ui.editor.scriptedit.ScriptEdit;
import org.nightlabs.jfire.scripting.admin.ui.editor.scriptedit.ScriptEditFactory;
import org.nightlabs.jfire.scripting.admin.ui.editor.scriptedit.ScriptEditFactoryRegistry;
/**
*
* @author vince - vince at guinaree dot com
*
*/
public class ScriptEditorContentPage
extends EntityEditorPageWithProgress
implements IScriptEditorContentPage
{
public static class Factory implements IEntityEditorPageFactory{
@Override
public IFormPage createPage(FormEditor formEditor) {
return new ScriptEditorContentPage(formEditor);
}
@Override
public IEntityEditorPageController createPageController(EntityEditor editor) {
ScriptEditorPageController controller = editor.getController().getSinglePageController(ScriptEditorPageController.class);
if (controller != null)
return controller;
return new ScriptEditorPageController(editor);
}
}
private static final String DEFAULT_PAGE_FORM_TITLE = "Content";
public ScriptEditorContentPage(FormEditor editor) {
super(editor, ScriptEditorContentPage.class.getName(), DEFAULT_PAGE_FORM_TITLE);
}
private Composite container;
private Map<String, ScriptEdit> language2ScriptEdit = new HashMap<String, ScriptEdit>();
private Script script;
private ScriptEdit scriptEdit;
@Override
protected void handleControllerObjectModified(final EntityEditorPageControllerModifyEvent modifyEvent)
{
super.handleControllerObjectModified(modifyEvent);
getManagedForm().getForm().getDisplay().asyncExec(new Runnable() {
public void run() {
if (scriptEdit != null)
// Dispose old UI.
for (IFormPart part : getManagedForm().getParts())
getManagedForm().removePart(part);
for (Control child : container.getChildren())
child.dispose();
scriptEdit = null;
// Get the new current Script instance.
script = (Script) modifyEvent.getNewObject();
if (script == null)
return;
// Find the factory for the current language or re-use a previously used ScriptEdit.
scriptEdit = language2ScriptEdit.get(script.getLanguage());
if (scriptEdit == null) {
ScriptEditFactory factory = ScriptEditFactoryRegistry.sharedInstance().getScriptEditFactoryForLanguage(script.getLanguage(), true);
scriptEdit = factory.createScriptEdit();
language2ScriptEdit.put(script.getLanguage(), scriptEdit);
}
// tell the ScriptEdit in which IFormPage it is (to allow it creating sections).
getManagedForm().getForm().setText(getPageFormTitle());
setPartName(getPageFormTitle());
scriptEdit.setFormPage(ScriptEditorContentPage.this);
// Assign current script to be edited.
scriptEdit.setScript(script);
//scriptEdit.setDirtyStateManager()
scriptEdit.setController((ScriptEditorPageController)getPageController());
// Create new UI.
scriptEdit.createControl(container);
getManagedForm().reflow(true);
container.layout();
}
});
}
@Override
protected void addSections(Composite parent) {
container = parent;
}
@Override
protected String getPageFormTitle() {
return DEFAULT_PAGE_FORM_TITLE;
}
@Override
public void setPartName(String partName) {
super.setPartName(partName);
}
}