package org.nightlabs.jfire.dynamictrade.ui.articlecontainer.detail;
import javax.script.ScriptException;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.nightlabs.base.ui.composite.MessageComposite;
import org.nightlabs.base.ui.composite.XComposite;
import org.nightlabs.base.ui.composite.XComposite.LayoutMode;
import org.nightlabs.base.ui.language.I18nTextEditorMultiLine;
import org.nightlabs.base.ui.language.I18nTextEditor.EditMode;
import org.nightlabs.base.ui.message.MessageType;
import org.nightlabs.eclipse.ui.dialog.ResizableTrayDialog;
import org.nightlabs.i18n.I18nText;
import org.nightlabs.jfire.dynamictrade.ui.resource.Messages;
import org.nightlabs.script.JSHTMLExecuter;
/**
*
* @author Fitas Amine <!-- fitas[at]nightlabs[dot]de -->
*/
public class ProductNameDialog
extends ResizableTrayDialog
{
private I18nTextEditorMultiLine productNameEditor;
private boolean editable;
private Button previewEditButton;
private MessageComposite statusMessageLabel;
private ProductNameDialogType productNameDialogType;
private I18nText productName;
XComposite previewEditButtonComposite;
public I18nText getProductName() {
return productName;
}
public void setProductName(I18nText productName) {
this.productName = productName;
}
public ProductNameDialog(Shell parentShell, I18nText productName, boolean editable)
{
this(parentShell,productName,editable,ProductNameDialogType.TEXT_EDIT);
}
public ProductNameDialog(Shell parentShell, I18nText productName, boolean editable,ProductNameDialogType productNameDialogType)
{
super(parentShell, Messages.RESOURCE_BUNDLE);
this.editable = editable;
this.productName = productName;
this.productNameDialogType = productNameDialogType;
setShellStyle(getShellStyle() | SWT.RESIZE);
}
@Override
protected Control createDialogArea(Composite parent)
{
getShell().setText(Messages.getString("org.nightlabs.jfire.dynamictrade.ui.articlecontainer.detail.ProductNameDialog.title")); //$NON-NLS-1$
Composite area = (Composite) super.createDialogArea(parent);
area.setLayout(new GridLayout(1,false));
if(this.productNameDialogType != ProductNameDialogType.TEXT_EDIT)
{
this.statusMessageLabel = new MessageComposite(area, SWT.NONE, "", MessageType.INFORMATION); //$NON-NLS-1$
this.statusMessageLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
this.statusMessageLabel.setMessage(Messages.getString("org.nightlabs.jfire.dynamictrade.ui.articlecontainer.detail.ProductNameDialog.message"),MessageType.INFORMATION); //$NON-NLS-1$
}
this.productNameEditor = new I18nTextEditorMultiLine(area);
this.productNameEditor.setEditable(editable);
this.productNameEditor.setI18nText(productName, EditMode.BUFFERED);
this.productNameEditor.setLayoutData(new GridData(GridData.FILL_BOTH));
// adds preview button in the case of Script Editing
if(this.productNameDialogType != ProductNameDialogType.TEXT_EDIT)
{
previewEditButtonComposite = new XComposite(area, SWT.NONE, LayoutMode.TIGHT_WRAPPER);
previewEditButtonComposite.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL));
RowLayout rowLayout = new RowLayout(SWT.HORIZONTAL);
rowLayout.wrap = false;
rowLayout.pack = false;
rowLayout.justify = true;
previewEditButtonComposite.setLayout(rowLayout);
previewEditButton = new Button(previewEditButtonComposite, SWT.PUSH);
//previewEditButton.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL));
previewEditButton.setText(Messages.getString("org.nightlabs.jfire.dynamictrade.ui.articlecontainer.detail.ProductNameDialog.preview")); //$NON-NLS-1$
//previewEditButton.setSize(new Point(200,20));
previewEditButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0)
{
toggleDialogScriptMode();
}
});
}
setDialogMode(productNameDialogType);
return area;
}
@Override
protected void okPressed()
{
if(this.productNameDialogType != ProductNameDialogType.TEXT_EDIT)
if(!validateScript())
return;
super.okPressed();
productNameEditor.copyToOriginal();
}
private void toggleDialogScriptMode()
{
switch (productNameDialogType) {
case SCRIPT_EDIT:
setDialogMode(ProductNameDialogType.SCRIPT_PREVIEW);
break;
case SCRIPT_PREVIEW:
setDialogMode(ProductNameDialogType.SCRIPT_EDIT);
break;
}
}
private void setDialogMode(ProductNameDialogType type)
{
// you can not switch from Text Mode to Script !!!
if(productNameDialogType == ProductNameDialogType.TEXT_EDIT)
return;
this.productNameDialogType = type;
switch (type) {
case SCRIPT_EDIT:
this.productNameEditor.setEditable(editable);
this.productNameEditor.setI18nText(getProductName(), EditMode.BUFFERED);
this.previewEditButton.setText(Messages.getString("org.nightlabs.jfire.dynamictrade.ui.articlecontainer.detail.ProductNameDialog.preview")); //$NON-NLS-1$
this.statusMessageLabel.setMessage(Messages.getString("org.nightlabs.jfire.dynamictrade.ui.articlecontainer.detail.ProductNameDialog.message"),MessageType.INFORMATION); //$NON-NLS-1$
previewEditButton.setFocus();
break;
case SCRIPT_PREVIEW:
JSHTMLExecuter script = new JSHTMLExecuter(productNameEditor.getI18nText());
if(!(script.containsValidScript() > 0))
return;
// store the previous contents
getProductName().copyFrom(productNameEditor.getI18nText());
try{
I18nText result = script.execute();
this.productNameEditor.setI18nText(result, EditMode.BUFFERED);
this.productNameEditor.setEditable(false);
this.previewEditButton.setText(Messages.getString("org.nightlabs.jfire.dynamictrade.ui.articlecontainer.detail.ProductNameDialog.edit")); //$NON-NLS-1$
this.statusMessageLabel.setMessage("Script preview",MessageType.INFORMATION);
previewEditButton.setFocus();
}
catch (ScriptException e) {
this.productNameDialogType = ProductNameDialogType.SCRIPT_EDIT;
productNameEditor.setEditable(editable);
previewEditButton.setSelection(false);
previewEditButton.setFocus();
statusMessageLabel.setMessage(e.getMessage(),MessageType.ERROR);
productNameEditor.addFocusListener( new FocusListener(){
@Override
public void focusGained(FocusEvent arg0) {
statusMessageLabel.setMessage(Messages.getString("org.nightlabs.jfire.dynamictrade.ui.articlecontainer.detail.ProductNameDialog.message"),MessageType.INFORMATION); //$NON-NLS-1$
productNameEditor.removeFocusListener(this);
}
@Override
public void focusLost(FocusEvent arg0) {
// TODO Auto-generated method stub
}
});
}
break;
}
previewEditButtonComposite.pack();
}
private boolean validateScript()
{
JSHTMLExecuter script = new JSHTMLExecuter(productNameEditor.getI18nText());
String err = script.validateContent();
if(err != null)
{
statusMessageLabel.setMessage(err,MessageType.ERROR);
productNameEditor.addFocusListener( new FocusListener(){
@Override
public void focusGained(FocusEvent arg0) {
statusMessageLabel.setMessage(Messages.getString("org.nightlabs.jfire.dynamictrade.ui.articlecontainer.detail.ProductNameDialog.message"),MessageType.INFORMATION); //$NON-NLS-1$
productNameEditor.removeFocusListener(this);
}
@Override
public void focusLost(FocusEvent arg0) {
// TODO Auto-generated method stub
}
});
return false;
}
return true;
}
}