/**
*
*/
package org.nightlabs.jfire.reporting.admin.ui.oda.jfs.client.ui;
import javax.jdo.FetchPlan;
import javax.jdo.JDOHelper;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.base.ui.job.Job;
import org.nightlabs.base.ui.util.RCPUtil;
import org.nightlabs.eclipse.ui.dialog.ResizableTitleAreaDialog;
import org.nightlabs.jfire.reporting.admin.ui.resource.Messages;
import org.nightlabs.jfire.reporting.scripting.ScriptingConstants;
import org.nightlabs.jfire.scripting.Script;
import org.nightlabs.jfire.scripting.ScriptCategory;
import org.nightlabs.jfire.scripting.ScriptRegistryItem;
import org.nightlabs.jfire.scripting.id.ScriptRegistryItemID;
import org.nightlabs.jfire.scripting.ui.ScriptRegistryItemNode;
import org.nightlabs.jfire.scripting.ui.ScriptRegistryItemProvider;
import org.nightlabs.jfire.scripting.ui.ScriptRegistryItemTree;
import org.nightlabs.progress.ProgressMonitor;
/**
* @author Alexander Bieber <!-- alex [AT] nightlabs [DOT] de -->
*
*/
public class SelectedScriptComposite extends XComposite {
private Group group;
private Button browse;
private Text name;
private Text description;
private ScriptRegistryItemID scriptRegistryItemID;
private static class SelectScriptDialog extends ResizableTitleAreaDialog {
private Script selectedScript;
private ScriptRegistryItemTree itemTree;
public SelectScriptDialog(Shell parentShell) {
super(parentShell, null);
setShellStyle(getShellStyle() | SWT.RESIZE);
}
/**
* {@inheritDoc}
* @see org.nightlabs.base.ui.dialog.CenteredDialog#configureShell(org.eclipse.swt.widgets.Shell)
*/
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(Messages.getString("org.nightlabs.jfire.reporting.admin.ui.oda.jfs.client.ui.SelectedScriptComposite.selectSourceScriptShell.title")); //$NON-NLS-1$
}
@Override
protected Control createDialogArea(Composite parent) {
setTitle(Messages.getString("org.nightlabs.jfire.reporting.admin.ui.oda.jfs.client.ui.SelectedScriptComposite.selectSourceScriptShell.title")); //$NON-NLS-1$
setMessage(Messages.getString("org.nightlabs.jfire.reporting.admin.ui.oda.jfs.client.ui.SelectedScriptComposite.selectSourceScriptShell.message")); //$NON-NLS-1$
itemTree = new ScriptRegistryItemTree(parent, null);
itemTree.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
setSelectedScript();
}
});
itemTree.getTreeViewer().addDoubleClickListener(new IDoubleClickListener() {
@Override
public void doubleClick(DoubleClickEvent event) {
setSelectedScript();
if (getButton(IDialogConstants.OK_ID).isEnabled()) {
okPressed();
return;
}
ScriptRegistryItemNode node = itemTree.getFirstSelectedElement();
if (node != null && node.getRegistryItem() instanceof ScriptCategory) {
itemTree.getTreeViewer().expandToLevel(node, 1);
}
}
});
itemTree.setInput(ScriptRegistryItemProvider.sharedInstance().getTopLevelNodeForType(ScriptingConstants.SCRIPT_REGISTRY_ITEM_TYPE_ROOT));
itemTree.getTreeViewer().expandToLevel(3);
return itemTree;
}
protected void setSelectedScript() {
ScriptRegistryItemNode node = (ScriptRegistryItemNode) itemTree.getFirstSelectedElement();
if (node != null) {
if (node.getRegistryItem() != null && node.getRegistryItem() instanceof Script) {
selectedScript = (Script) node.getRegistryItem();
} else {
selectedScript = null;
}
} else {
selectedScript = null;
}
getButton(IDialogConstants.OK_ID).setEnabled(selectedScript != null);
}
public static Script openDialog() {
SelectScriptDialog dlg = new SelectScriptDialog(RCPUtil.getActiveShell());
if (dlg.open() == Window.OK) {
return dlg.selectedScript;
}
return null;
}
}
/**
* @param parent
* @param style
*/
public SelectedScriptComposite(Composite parent, int style) {
super(parent, style, LayoutMode.TIGHT_WRAPPER);
group = new Group(this, SWT.NONE);
group.setText(Messages.getString("org.nightlabs.jfire.reporting.admin.ui.oda.jfs.client.ui.SelectedScriptComposite.selectScriptGroup.text")); //$NON-NLS-1$
GridLayout gl = new GridLayout();
XComposite.configureLayout(LayoutMode.ORDINARY_WRAPPER, gl);
gl.numColumns = 2;
gl.makeColumnsEqualWidth = false;
group.setLayout(gl);
group.setLayoutData(new GridData(GridData.FILL_BOTH));
name = new Text(group, SWT.WRAP | SWT.BORDER | SWT.READ_ONLY);
name.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
browse = new Button(group, SWT.PUSH);
browse.setLayoutData(new GridData());
browse.setText(Messages.getString("org.nightlabs.jfire.reporting.admin.ui.oda.jfs.client.ui.SelectedScriptComposite.browseButton.text")); //$NON-NLS-1$
browse.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
Script script = SelectScriptDialog.openDialog();
if (script != null) {
setScriptRegistryItemID((ScriptRegistryItemID) JDOHelper.getObjectId(script));
}
}
});
description = new Text(group, SWT.BORDER | SWT.MULTI | SWT.WRAP | SWT.READ_ONLY | SWT.V_SCROLL | SWT.H_SCROLL);
GridData gd = new GridData(GridData.FILL_BOTH);
gd.horizontalSpan = 2;
description.setLayoutData(gd);
name.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
description.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_WHITE));
}
public void setScriptRegistryItemID(final ScriptRegistryItemID scriptRegistryItemID) {
this.scriptRegistryItemID = scriptRegistryItemID;
Display.getDefault().syncExec(new Runnable() {
public void run() {
name.setText(Messages.getString("org.nightlabs.jfire.reporting.admin.ui.oda.jfs.client.ui.SelectedScriptComposite.nameText.loadingText")); //$NON-NLS-1$
description.setText(""); //$NON-NLS-1$
}
});
Job loadJob = new Job(Messages.getString("org.nightlabs.jfire.reporting.admin.ui.oda.jfs.client.ui.SelectedScriptComposite.loadScriptJob.name")) { //$NON-NLS-1$
@Override
protected IStatus run(ProgressMonitor monitor) throws Exception {
final ScriptRegistryItem item = ScriptRegistryItemProvider.sharedInstance().getScriptRegistryItem(
scriptRegistryItemID,
new String[] {
FetchPlan.DEFAULT, ScriptRegistryItem.FETCH_GROUP_NAME,
ScriptRegistryItem.FETCH_GROUP_DESCRIPTION
},
getProgressMonitor()
);
Display.getDefault().asyncExec(new Runnable() {
public void run() {
name.setText(item.getName().getText());
if (!item.getDescription().isEmpty()) {
description.setText(item.getDescription().getText());
} else {
description.setText(Messages.getString("org.nightlabs.jfire.reporting.admin.ui.oda.jfs.client.ui.SelectedScriptComposite.description.fallbackText")); //$NON-NLS-1$
}
}
});
return Status.OK_STATUS;
}
};
loadJob.schedule();
}
public ScriptRegistryItemID getScriptRegistryItemID() {
return scriptRegistryItemID;
}
}