Search in sources :

Example 1 with SHTMLWriter

use of com.lightdev.app.shtm.SHTMLWriter in project freeplane by freeplane.

the class EditNodeTextField method show.

/* (non-Javadoc)
	 * @see org.freeplane.view.swing.map.INodeTextField#show()
	 */
@SuppressWarnings("serial")
@Override
public void show(final RootPaneContainer frame) {
    final ModeController modeController = Controller.getCurrentModeController();
    final IMapViewManager viewController = modeController.getController().getMapViewManager();
    final MTextController textController = (MTextController) TextController.getController(modeController);
    nodeView = (NodeView) SwingUtilities.getAncestorOfClass(NodeView.class, parent);
    font = parent.getFont();
    zoom = viewController.getZoom();
    if (zoom != 1F) {
        final float fontSize = (int) (Math.rint(font.getSize() * zoom));
        font = font.deriveFont(fontSize);
    }
    final HTMLEditorKit kit = new ScaledEditorKit() {

        @Override
        public void write(Writer out, Document doc, int pos, int len) throws IOException, BadLocationException {
            if (doc instanceof HTMLDocument) {
                HTMLWriter w = new SHTMLWriter(out, (HTMLDocument) doc, pos, len);
                w.write();
            } else {
                super.write(out, doc, pos, len);
            }
        }
    };
    textfield.setEditorKit(kit);
    final InputMap inputMap = textfield.getInputMap();
    final ActionMap actionMap = textfield.getActionMap();
    actionMap.put(DefaultEditorKit.pasteAction, pasteAction);
    inputMap.put((KeyStroke) boldAction.getValue(Action.ACCELERATOR_KEY), "boldAction");
    actionMap.put("boldAction", boldAction);
    inputMap.put((KeyStroke) italicAction.getValue(Action.ACCELERATOR_KEY), "italicAction");
    actionMap.put("italicAction", italicAction);
    inputMap.put((KeyStroke) underlineAction.getValue(Action.ACCELERATOR_KEY), "underlineAction");
    actionMap.put("underlineAction", underlineAction);
    inputMap.put((KeyStroke) redAction.getValue(Action.ACCELERATOR_KEY), "redAction");
    actionMap.put("redAction", redAction);
    inputMap.put((KeyStroke) greenAction.getValue(Action.ACCELERATOR_KEY), "greenAction");
    actionMap.put("greenAction", greenAction);
    inputMap.put((KeyStroke) blueAction.getValue(Action.ACCELERATOR_KEY), "blueAction");
    actionMap.put("blueAction", blueAction);
    inputMap.put((KeyStroke) blackAction.getValue(Action.ACCELERATOR_KEY), "blackAction");
    actionMap.put("blackAction", blackAction);
    inputMap.put((KeyStroke) defaultColorAction.getValue(Action.ACCELERATOR_KEY), "defaultColorAction");
    actionMap.put("defaultColorAction", defaultColorAction);
    inputMap.put((KeyStroke) removeFormattingAction.getValue(Action.ACCELERATOR_KEY), "removeFormattingAction");
    actionMap.put("removeFormattingAction", removeFormattingAction);
    final Color nodeTextColor = parent.getForeground();
    textfield.setCaretColor(nodeTextColor);
    final StringBuilder ruleBuilder = new StringBuilder(100);
    ruleBuilder.append("body {");
    final int labelHorizontalAlignment = parent.getHorizontalAlignment();
    ruleBuilder.append(new CssRuleBuilder().withCSSFont(font, UITools.FONT_SCALE_FACTOR).withColor(nodeTextColor).withBackground(getBackground()).withAlignment(labelHorizontalAlignment));
    ruleBuilder.append("}\n");
    final HTMLDocument document = (HTMLDocument) textfield.getDocument();
    final StyleSheet styleSheet = document.getStyleSheet();
    styleSheet.addRule(ruleBuilder.toString());
    textfield.setText(text);
    final MapView mapView = nodeView.getMap();
    if (!mapView.isValid())
        mapView.validate();
    final NodeStyleController nsc = NodeStyleController.getController(modeController);
    maxWidth = Math.max(mapView.getZoomed(nsc.getMaxWidth(node).toBaseUnitsRounded()), parent.getWidth());
    final Icon icon = parent.getIcon();
    if (icon != null) {
        maxWidth -= mapView.getZoomed(icon.getIconWidth());
        maxWidth -= mapView.getZoomed(parent.getIconTextGap());
    }
    Insets parentInsets = parent.getZoomedInsets();
    maxWidth -= parentInsets.left + parentInsets.right;
    extraWidth = ResourceController.getResourceController().getIntProperty("editor_extra_width", 80);
    extraWidth = mapView.getZoomed(extraWidth);
    final TextFieldListener textFieldListener = new TextFieldListener();
    this.textFieldListener = textFieldListener;
    textfield.addFocusListener(textFieldListener);
    textfield.addKeyListener(textFieldListener);
    textfield.addMouseListener(textFieldListener);
    mapViewChangeListener = new MapViewChangeListener();
    Controller.getCurrentController().getMapViewManager().addMapViewChangeListener(mapViewChangeListener);
    SpellCheckerController.getController().enableAutoSpell(textfield, true);
    mapView.scrollNodeToVisible(nodeView);
    assert (parent.isValid());
    final int nodeWidth = parent.getWidth();
    final int textFieldBorderWidth = 2;
    textfield.setBorder(new MatteBorder(textFieldBorderWidth, textFieldBorderWidth, textFieldBorderWidth, textFieldBorderWidth, nodeView.getSelectedColor()));
    final Dimension textFieldMinimumSize = textfield.getPreferredSize();
    textFieldMinimumSize.width += 1;
    if (textFieldMinimumSize.width < extraWidth)
        textFieldMinimumSize.width = extraWidth;
    if (textFieldMinimumSize.width < 10)
        textFieldMinimumSize.width = 10;
    if (textFieldMinimumSize.width > maxWidth) {
        textFieldMinimumSize.width = maxWidth;
        setLineWrap();
        textFieldMinimumSize.height = textfield.getPreferredSize().height;
    }
    final ZoomableLabelUI parentUI = (ZoomableLabelUI) parent.getUI();
    final LayoutData layoutData = parentUI.getLayoutData(parent);
    Rectangle iconR = layoutData.iconR;
    final Rectangle textR = layoutData.textR;
    int textFieldX = parentInsets.left - textFieldBorderWidth + (iconR.width > 0 ? textR.x - iconR.x : 0);
    final EventBuffer eventQueue = MTextController.getController().getEventQueue();
    KeyEvent firstEvent = eventQueue.getFirstEvent();
    Point mouseEventPoint = null;
    if (firstEvent == null) {
        MouseEvent currentEvent = eventQueue.getMouseEvent();
        if (currentEvent != null) {
            MouseEvent mouseEvent = (MouseEvent) currentEvent;
            if (mouseEvent.getComponent().equals(parent)) {
                mouseEventPoint = mouseEvent.getPoint();
                mouseEventPoint.x -= textR.x;
                mouseEventPoint.y -= textR.y;
            }
        }
    }
    textFieldMinimumSize.width = Math.max(textFieldMinimumSize.width, nodeWidth - textFieldX - (parentInsets.right - textFieldBorderWidth));
    textFieldMinimumSize.height = Math.max(textFieldMinimumSize.height, textR.height);
    textfield.setSize(textFieldMinimumSize.width, textFieldMinimumSize.height);
    final int textY = Math.max(textR.y - (textFieldMinimumSize.height - textR.height) / 2, 0);
    final Dimension newParentSize = new Dimension(textFieldX + textFieldMinimumSize.width + parentInsets.right, 2 * textY + textFieldMinimumSize.height);
    horizontalSpace = newParentSize.width - textFieldMinimumSize.width;
    verticalSpace = 2 * textY;
    final int widthAddedToParent = newParentSize.width - parent.getWidth();
    final Point location = new Point(textR.x - textFieldBorderWidth, textY);
    final int widthAddedToTextField = textFieldMinimumSize.width - (textR.width + 2 * textFieldBorderWidth);
    if (widthAddedToTextField > 0) {
        switch(labelHorizontalAlignment) {
            case SwingConstants.CENTER:
                location.x -= (widthAddedToTextField - widthAddedToParent) / 2;
                if (mouseEventPoint != null)
                    mouseEventPoint.x += widthAddedToTextField / 2;
                break;
            case SwingConstants.RIGHT:
                location.x -= widthAddedToTextField - widthAddedToParent;
                if (mouseEventPoint != null)
                    mouseEventPoint.x += widthAddedToTextField;
                break;
        }
    }
    keepNodePosition();
    parent.setPreferredSize(newParentSize);
    parent.setText("");
    parent.setHorizontalAlignment(JLabel.LEFT);
    if (!layoutMapOnTextChange) {
        mapView.doLayout();
        UITools.convertPointToAncestor(parent, location, mapView);
    }
    textfield.setBounds(location.x, location.y, textFieldMinimumSize.width, textFieldMinimumSize.height);
    if (layoutMapOnTextChange)
        parent.add(textfield, 0);
    else
        mapView.add(textfield, 0);
    redispatchKeyEvents(textfield, firstEvent);
    if (firstEvent == null) {
        int pos = document.getLength();
        if (mouseEventPoint != null)
            pos = textfield.viewToModel(mouseEventPoint);
        textfield.setCaretPosition(pos);
    }
    document.addDocumentListener(documentListener);
    if (textController.isMinimized(node)) {
        layout();
    }
    textfield.repaint();
    textfield.requestFocusInWindow();
}
Also used : Insets(java.awt.Insets) HTMLDocument(javax.swing.text.html.HTMLDocument) Rectangle(java.awt.Rectangle) EventBuffer(org.freeplane.features.text.mindmapmode.EventBuffer) ModeController(org.freeplane.features.mode.ModeController) ScaledEditorKit(org.freeplane.core.ui.components.html.ScaledEditorKit) HTMLDocument(javax.swing.text.html.HTMLDocument) Document(javax.swing.text.Document) KeyEvent(java.awt.event.KeyEvent) SHTMLWriter(com.lightdev.app.shtm.SHTMLWriter) MatteBorder(javax.swing.border.MatteBorder) ZoomableLabelUI(org.freeplane.view.swing.map.ZoomableLabelUI) MapView(org.freeplane.view.swing.map.MapView) HTMLWriter(javax.swing.text.html.HTMLWriter) SHTMLWriter(com.lightdev.app.shtm.SHTMLWriter) MouseEvent(java.awt.event.MouseEvent) CssRuleBuilder(org.freeplane.core.ui.components.html.CssRuleBuilder) ActionMap(javax.swing.ActionMap) Color(java.awt.Color) HTMLEditorKit(javax.swing.text.html.HTMLEditorKit) Dimension(java.awt.Dimension) Point(java.awt.Point) Point(java.awt.Point) IMapViewManager(org.freeplane.features.ui.IMapViewManager) StyleSheet(javax.swing.text.html.StyleSheet) IMapViewChangeListener(org.freeplane.features.ui.IMapViewChangeListener) LayoutData(org.freeplane.view.swing.map.ZoomableLabelUI.LayoutData) NodeStyleController(org.freeplane.features.nodestyle.NodeStyleController) InputMap(javax.swing.InputMap) MTextController(org.freeplane.features.text.mindmapmode.MTextController) Icon(javax.swing.Icon) HTMLWriter(javax.swing.text.html.HTMLWriter) Writer(java.io.Writer) SHTMLWriter(com.lightdev.app.shtm.SHTMLWriter)

Aggregations

SHTMLWriter (com.lightdev.app.shtm.SHTMLWriter)1 Color (java.awt.Color)1 Dimension (java.awt.Dimension)1 Insets (java.awt.Insets)1 Point (java.awt.Point)1 Rectangle (java.awt.Rectangle)1 KeyEvent (java.awt.event.KeyEvent)1 MouseEvent (java.awt.event.MouseEvent)1 Writer (java.io.Writer)1 ActionMap (javax.swing.ActionMap)1 Icon (javax.swing.Icon)1 InputMap (javax.swing.InputMap)1 MatteBorder (javax.swing.border.MatteBorder)1 Document (javax.swing.text.Document)1 HTMLDocument (javax.swing.text.html.HTMLDocument)1 HTMLEditorKit (javax.swing.text.html.HTMLEditorKit)1 HTMLWriter (javax.swing.text.html.HTMLWriter)1 StyleSheet (javax.swing.text.html.StyleSheet)1 CssRuleBuilder (org.freeplane.core.ui.components.html.CssRuleBuilder)1 ScaledEditorKit (org.freeplane.core.ui.components.html.ScaledEditorKit)1