package org.nightlabs.jfire.scripting.admin.ui.editor;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.Section;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.base.ui.custom.XCombo;
import org.nightlabs.base.ui.editor.ToolBarSectionPart;
import org.nightlabs.base.ui.entity.editor.EntityEditorUtil;
import org.nightlabs.base.ui.job.Job;
import org.nightlabs.jfire.scripting.Script;
import org.nightlabs.jfire.scripting.dao.ScriptRegistryItemDAO;
import org.nightlabs.progress.ProgressMonitor;
/**
*
* @author vince - vince at guinaree dot com
*
*/
public class ScriptMetaSection
extends ToolBarSectionPart
{
private ScriptEditorPageController controller;
private List<String> languages;
private Script script;
public ScriptMetaSection(FormPage page, Composite parent, final ScriptEditorPageController controller){
super(page, parent, ExpandableComposite.EXPANDED | ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE, "Meta");
this.controller = controller;
getSection().setExpanded(true);
createClient(getSection(), page.getEditor().getToolkit());
}
@Override
public boolean setFormInput(Object input) {
this.script = (Script) input;
return super.setFormInput(input);
}
private boolean ignoreModifyEvents = false;
@Override
public void refresh() {
ignoreModifyEvents = true;
try {
if (script == null)
return; // data not yet loaded => silently ignore
// put data from this.script into UI
resultClassNameText.setText(script.getResultClassName());
selectLanguage();
super.refresh();
} finally {
ignoreModifyEvents = false;
}
}
private void selectLanguage()
{
// ensure that this is executed on the UI thread.
if (Display.getCurrent() == null)
throw new IllegalStateException("Thread mismatch! selectLanguage() executed on non-SWT-UI-thread!");
if (languages == null)
return; // languages not yet loaded from the server (done asynchronously in a job)
if (script == null)
return; // languages are loaded, but no entity to be edited - thus, there is no currently selected language
int idx = languages.indexOf(script.getLanguage());
languageCombo.select(idx);
}
@Override
public void commit(boolean onSave) {
// write UI data into the edited object, i.e. 'this.script'
script.setResultClassName(resultClassNameText.getText());
controller.fireModifyEvent(null, script, false);
super.commit(onSave);
}
private XCombo languageCombo;
protected void createClient(Section section, FormToolkit toolkit) {
section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
Composite container = EntityEditorUtil.createCompositeClient(toolkit, section, 1);
createLanguageLabel(container,1);
languageCombo = new XCombo(container, SWT.READ_ONLY);
languageCombo.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
// Add a selectionListener to this combo and mark the editor dirty when the value's changed.
languageCombo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (ignoreModifyEvents)
return;
script.setLanguage(languageCombo.getText());
markDirty();
}
});
languageCombo.add(null, "Loading...");
languageCombo.select(0);
languageCombo.setEnabled(false);
final Display display = languageCombo.getDisplay();
Job loadLanguagesJob = new Job("Loading languages") {
@Override
protected IStatus run(ProgressMonitor monitor) throws Exception
{
// Load data an a Job's thread (NOT UI thread).
final List<String> l = new ArrayList<String>(
ScriptRegistryItemDAO.sharedInstance().getlanguages()
);
// Get back to the UI thread to display the data.
display.asyncExec(new Runnable() {
public void run() {
ignoreModifyEvents = true;
try {
languages = l;
// on the UI thread
languageCombo.removeAll();
for (String language : languages) {
languageCombo.add(null, language);
}
languageCombo.setEnabled(true);
selectLanguage();
} finally {
ignoreModifyEvents = false;
}
}
});
return Status.OK_STATUS;
}
};
loadLanguagesJob.setPriority(Job.SHORT);
loadLanguagesJob.schedule();
createResultLabel(container, 1);
createResultClassNameText(container);
}
private Text resultClassNameText;
private void createResultClassNameText(Composite container){
resultClassNameText = new Text(container, XComposite.getBorderStyle(container));
GridData gd = new GridData(GridData.FILL_HORIZONTAL);
resultClassNameText.setLayoutData(gd);
resultClassNameText.addModifyListener(new ModifyListener(){
@Override
public void modifyText(ModifyEvent e) {
if (ignoreModifyEvents)
return;
markDirty();
}
});
}
private void createLanguageLabel(Composite container, int span){
Label label=new Label(container, SWT.LEFT);
label.setText("Language:");
GridData grid=new GridData(GridData.FILL_HORIZONTAL);
grid.horizontalSpan=span;
label.setLayoutData(grid);
}
private void createResultLabel(Composite container, int span){
Label label =new Label(container, SWT.LEFT);
label.setText("Result type:");
GridData gd=new GridData(GridData.FILL_HORIZONTAL);
gd.horizontalSpan=span;
label.setLayoutData(gd);
}
}