package org.freeplane.plugin.latex; import java.awt.Dimension; import java.awt.event.KeyEvent; import javax.swing.Icon; import javax.swing.JEditorPane; import org.freeplane.core.ui.components.JRestrictedSizeScrollPane; import org.freeplane.core.ui.components.UITools; import org.freeplane.core.util.LogUtils; import org.freeplane.core.util.TextUtils; import org.freeplane.features.format.PatternFormat; import org.freeplane.features.map.NodeModel; import org.freeplane.features.nodestyle.NodeStyleController; import org.freeplane.features.nodestyle.NodeStyleModel; import org.freeplane.features.text.AbstractContentTransformer; import org.freeplane.features.text.TextController; import org.freeplane.features.text.TransformationException; import org.freeplane.features.text.mindmapmode.EditNodeBase; import org.freeplane.features.text.mindmapmode.EditNodeDialog; import org.freeplane.features.text.mindmapmode.MTextController; import org.freeplane.features.text.mindmapmode.EditNodeBase.IEditControl; import org.freeplane.features.text.mindmapmode.IEditBaseCreator; import org.scilab.forge.jlatexmath.TeXConstants; import org.scilab.forge.jlatexmath.TeXIcon; public class LatexRenderer extends AbstractContentTransformer implements IEditBaseCreator { private static final String LATEX = "\\latex"; public LatexRenderer() { super(20); } public Object transformContent(TextController textController, Object content, NodeModel node, Object transformedExtension) throws TransformationException { return content; } private String getLatexNode(final String nodeText, final String nodeFormat, final boolean includePrefix) { int startLength = LATEX.length() + 1; if(nodeText.length() > startLength && nodeText.startsWith(LATEX) && Character.isWhitespace(nodeText.charAt(startLength - 1))){ return includePrefix ? nodeText : nodeText.substring(startLength); } else if(LatexFormat.LATEX_FORMAT.equals(nodeFormat)){ return nodeText; } else { return null; } } @Override public Icon getIcon(TextController textController, Object content, NodeModel node, Object transformedExtension) { if(transformedExtension == node.getUserObject()){ String string = content.toString(); String nodeFormat = textController.getNodeFormat(node); if (PatternFormat.IDENTITY_PATTERN.equals(nodeFormat)) return null; final String latext = getLatexNode(string, nodeFormat, false); if (latext == null) return null; try { final NodeStyleController ncs = NodeStyleController.getController(textController.getModeController()); final int maxWidth = ncs.getMaxWidth(node); TeXText teXt = new TeXText(latext); int fontSize = Math.round(ncs.getFontSize(node) * UITools.FONT_SCALE_FACTOR); TeXIcon icon = teXt.createTeXIcon(TeXConstants.STYLE_DISPLAY, fontSize, TeXConstants.ALIGN_LEFT, maxWidth); return icon; } catch (final Exception e) { } } return null; } public EditNodeBase createEditor(NodeModel node, IEditControl editControl, String text, boolean editLong) { MTextController textController = MTextController.getController(); if (textController.isTextFormattingDisabled(node)) // Format=Text! return null; final KeyEvent firstKeyEvent = textController.getEventQueue().getFirstEvent(); String nodeFormat = textController.getNodeFormat(node); final String latexText = getLatexNode(text, nodeFormat, true); if(latexText != null){ JEditorPane textEditor = new JEditorPane(); textEditor.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true); final JRestrictedSizeScrollPane scrollPane = new JRestrictedSizeScrollPane(textEditor); scrollPane.setMinimumSize(new Dimension(0, 60)); final EditNodeDialog editNodeDialog = new LatexEditor(node, latexText, firstKeyEvent, editControl, false, textEditor); editNodeDialog.setTitle(TextUtils.getText("latex_editor")); textEditor.setContentType("text/latex"); return editNodeDialog; } return null; } }