package org.eclipse.iee.pad.formula.ui; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Collection; import org.eclipse.iee.editor.core.container.TextRenderCtx; import org.eclipse.iee.editor.core.pad.Pad; import org.eclipse.iee.pad.formula.FormulaPart; import org.eclipse.iee.pad.formula.SymbolicEngine; import org.eclipse.iee.pad.formula.SymbolicPart; import org.eclipse.iee.pad.formula.ui.utils.UIFormulaRenderer; import org.eclipse.iee.pad.formula.ui.utils.Function; import org.eclipse.swt.graphics.Image; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SymbolicPad extends AbstractFormulaPad<SymbolicPart> { private static final Logger logger = LoggerFactory.getLogger(SymbolicPad.class); private SymbolicEngine fSymbolicEngine; private PropertyChangeListener fListener; public SymbolicPad(UIFormulaRenderer formulaRenderer, TextRenderCtx renderCtx) { super(formulaRenderer, renderCtx); fSymbolicEngine = new SymbolicEngine(); fListener = new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if ("formula".equals(evt.getPropertyName())) { updateFormula((String) evt.getNewValue()); } } }; } @Override public String getType() { return "Symbolic"; } public void validateInput() { String text = getText(); fOriginalExpression = text; if (SymbolicEngine.validate(text)) { setInputIsValid(); fLastValidText = text; } else { setInputIsInvalid(); } } public void processInput() { if (fIsInputValid) { if (!getText().equals(fTranslatingExpression)) { /* Remove result images from following pads */ Collection<Pad<?, ?>> following = FormulaPadManager .getFollowingPads(this); for (Pad<?, ?> pad : following) { ((SymbolicPad) pad).updateLastResult(""); } } } fTranslatingExpression = fLastValidText; /* Set formula image */ fTexExpression = translateToLatex(fTranslatingExpression); Image image = getFormulaRenderer().getSymbolicImage(fTexExpression); updateFormulaImage(image); /* Generate code */ String output = generateSymjaOutputCode(fTranslatingExpression); updateLastResult(output); getDocumentPart().setFormula(fOriginalExpression); getContainer().updateDocument(); } public String generateSymjaOutputCode(String expression) { String variable = expression; char lastVariable = variable.charAt(expression.trim().length() - 1); if (lastVariable == '=') variable = expression.substring(0, expression.lastIndexOf('=')); String output = ""; output = fSymbolicEngine.getOutput(variable); if (lastVariable != '=') output = ""; return output; } public void updateLastResult(String result) { final Image image; fResult = result; if (result == "") image = null; else { String latex = translateToLatex(result); fTexExpression += latex; image = getFormulaRenderer().getSymbolicImage(latex); } Function updateImage = new Function() { @Override public void f() { updateLastResult(image); } }; asyncUIUpdate(updateImage); } public static String translateToLatex(String text) { String latex = ""; if (text.length() > 0 && text.charAt(text.length() - 1) == '=') { latex = SymbolicEngine.getTeX(text.substring(0, text.lastIndexOf('='))); latex = latex + "="; } else { latex = SymbolicEngine.getTeX(text); } logger.debug("tex: " + latex); return latex; } @Override protected Image createImage(String formula) { return getFormulaRenderer().getSymbolicImage(formula); } @Override protected void doBindValue(SymbolicPart value) { value.addPropertyChangeListener(fListener); updateFormula(value.getFormula()); } @Override protected void doUnbindValue(SymbolicPart oldValue) { oldValue.removePropertyChangeListener(fListener); } private void updateFormula(String formula) { setTranslatingExpression(formula); setOriginalExpression(formula); } }