/** * $Id: mxHtmlTextShape.java,v 1.1 2012/11/15 13:26:44 gaudenz Exp $ * Copyright (c) 2010, Gaudenz Alder, David Benson */ package com.mxgraph.shape; import com.mxgraph.canvas.mxGraphics2DCanvas; import com.mxgraph.util.mxConstants; import com.mxgraph.util.mxLightweightLabel; import com.mxgraph.util.mxUtils; import com.mxgraph.view.mxCellState; import javax.swing.*; import java.awt.*; import java.util.Map; /** * To set global CSS for all HTML labels, use the following code: * <p/> * <pre> * mxGraphics2DCanvas.putTextShape(mxGraphics2DCanvas.TEXT_SHAPE_HTML, * new mxHtmlTextShape() * { * protected String createHtmlDocument(Map<String, Object> style, String text) * { * return mxUtils.createHtmlDocument(style, text, 1, 0, * "<style type=\"text/css\">.selectRef { " + * "font-size:9px;font-weight:normal; }</style>"); * } * } * ); * </pre> */ public class mxHtmlTextShape implements mxITextShape { /** * Specifies if linefeeds should be replaced with breaks in HTML markup. * Default is true. */ protected boolean replaceHtmlLinefeeds = true; /** * Returns replaceHtmlLinefeeds */ public boolean isReplaceHtmlLinefeeds() { return replaceHtmlLinefeeds; } /** * Returns replaceHtmlLinefeeds */ public void setReplaceHtmlLinefeeds(boolean value) { replaceHtmlLinefeeds = value; } /** * */ protected String createHtmlDocument(Map<String, Object> style, String text) { return mxUtils.createHtmlDocument(style, text); } /** * */ public void paintShape(mxGraphics2DCanvas canvas, String text, mxCellState state, Map<String, Object> style) { mxLightweightLabel textRenderer = mxLightweightLabel.getSharedInstance(); CellRendererPane rendererPane = canvas.getRendererPane(); Rectangle rect = state.getLabelBounds().getRectangle(); Graphics2D g = canvas.getGraphics(); if (textRenderer != null && rendererPane != null && (g.getClipBounds() == null || g.getClipBounds().intersects(rect))) { double scale = canvas.getScale(); int x = rect.x; int y = rect.y; int w = rect.width; int h = rect.height; if (!mxUtils.isTrue(style, mxConstants.STYLE_HORIZONTAL, true)) { g.rotate(-Math.PI / 2, x + w / 2, y + h / 2); g.translate(w / 2 - h / 2, h / 2 - w / 2); int tmp = w; w = h; h = tmp; } // Replaces the linefeeds with BR tags if (isReplaceHtmlLinefeeds()) { text = text.replaceAll("\n", "<br>"); } // Renders the scaled text textRenderer.setText(createHtmlDocument(style, text)); textRenderer.setFont(mxUtils.getFont(style, canvas.getScale())); g.scale(scale, scale); rendererPane.paintComponent(g, textRenderer, rendererPane, (int)(x / scale) + mxConstants.LABEL_INSET, (int)(y / scale) + mxConstants.LABEL_INSET, (int)(w / scale), (int)(h / scale), true); } } }