workcraft/workcraft

View on GitHub
workcraft/WorkcraftCore/src/org/workcraft/gui/controls/TextEditor.java

Summary

Maintainability
A
1 hr
Test Coverage
package org.workcraft.gui.controls;

import org.workcraft.dom.visual.SizeHelper;
import org.workcraft.utils.DesktopApi;

import javax.swing.*;
import javax.swing.text.DefaultEditorKit;
import javax.swing.undo.UndoManager;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

public class TextEditor extends JTextArea {

    private final float defaultFontSize;

    private UndoManager history;

    public TextEditor() {
        this(UIManager.getFont("TextArea.font"));
    }

    public TextEditor(Font font) {
        setFont(font);
        defaultFontSize = font.getSize2D();
        setMargin(SizeHelper.getTextMargin());

        addKeystrokeAction(DesktopApi.getIncreaseKeyStroke(), () -> {
            float size = getFont().getSize2D() + defaultFontSize / 10.0f;
            setFont(getFont().deriveFont(size));
        });

        addKeystrokeAction(DesktopApi.getDecreaseKeyStroke(), () -> {
            float size = getFont().getSize2D() - defaultFontSize / 10.0f;
            setFont(getFont().deriveFont(size));
        });

        addKeystrokeAction(DesktopApi.getRestoreKeyStroke(), () -> setFont(getFont().deriveFont(defaultFontSize)));
    }

    public void addPopupMenu() {
        JPopupMenu popup = new JPopupMenu();

        JMenuItem miCopy = new JMenuItem(new DefaultEditorKit.CopyAction());
        miCopy.setText("Copy");
        miCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, DesktopApi.getMenuKeyMask()));
        miCopy.setMnemonic(KeyEvent.VK_C);
        popup.add(miCopy);

        if (isEditable()) {
            JMenuItem miPaste = new JMenuItem(new DefaultEditorKit.PasteAction());
            miPaste.setText("Paste");
            miPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, DesktopApi.getMenuKeyMask()));
            miPaste.setMnemonic(KeyEvent.VK_P);
            popup.add(miPaste);

            JMenuItem miCut = new JMenuItem(new DefaultEditorKit.CutAction());
            miCut.setText("Cut");
            miCut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, DesktopApi.getMenuKeyMask()));
            miCut.setMnemonic(KeyEvent.VK_T);
            popup.add(miCut);

            popup.addSeparator();
        }

        JMenuItem miSelect = new JMenuItem("Select all");
        miSelect.addActionListener(event -> selectAll());
        miSelect.setText("Select All");
        miSelect.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, DesktopApi.getMenuKeyMask()));
        miSelect.setMnemonic(KeyEvent.VK_A);
        popup.add(miSelect);

        JMenuItem miClear = new JMenuItem("Clear");
        miClear.addActionListener(event -> setText(""));
        miClear.setMnemonic(KeyEvent.VK_R);
        popup.add(miClear);

        setComponentPopupMenu(popup);
    }

    public void addKeystrokeAction(KeyStroke keystroke, Runnable action) {
        // Bind keystroke it to the input map and add it to the action map
        getInputMap().put(keystroke, keystroke);
        getActionMap().put(keystroke, new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                action.run();
            }
        });
    }

    public void addUndoManager() {
        // Listen to the undo/redo events
        history = new UndoManager();
        getDocument().addUndoableEditListener(event -> history.addEdit(event.getEdit()));

        addKeystrokeAction(DesktopApi.getUndoKeyStroke(), () -> {
            if (history.canUndo()) {
                history.undo();
            }
        });

        addKeystrokeAction(DesktopApi.getRedoKeyStroke(), () -> {
            if (history.canRedo()) {
                history.redo();
            }
        });
    }

    @Override
    public void setText(String text) {
        if (history != null) {
            history.discardAllEdits();
        }
        super.setText(text);
    }

}