/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.dataprocess.gui.util.editor; import net.codjo.dataprocess.gui.util.ErrorDialog; import java.awt.Component; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.List; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JTextPane; import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.StyledEditorKit; /** * */ public class ColoredEditor extends JTextPane implements KeyListener { private final ICompletion completion; public ColoredEditor(ICompletion completion) { this.completion = completion; setEditorKit(new ColoredEditorKit()); addKeyListener(this); } public ICompletion getCompletion() { return completion; } public SyntaxDocument getSyntaxDocument() { return ((ColoredEditorKit)getEditorKit()).getDefaultDocument(); } @Override public boolean getScrollableTracksViewportWidth() { Component parent = getParent(); return parent == null || (getUI().getPreferredSize(this).width <= parent.getSize().width); } public void keyTyped(KeyEvent event) { } public void keyPressed(KeyEvent event) { if (event.getKeyChar() == ' ' && event.getModifiers() == KeyEvent.CTRL_MASK) { SyntaxDocument.WordElement wordElement = getCurrentWord(); if (wordElement == null) { return; } List<String> list = completion.getListWithPartial(wordElement.getPrefix()); if (list.size() > 1) { JPopupMenu popupMenu = new JPopupMenu(); for (String completor : list) { JMenuItem item = new JMenuItem(completor); item.addActionListener(new Putter(wordElement, completor)); popupMenu.add(item); } Point caretPosition = getCaret().getMagicCaretPosition(); popupMenu.show(this, (int)caretPosition.getX(), (int)caretPosition.getY() + 15); } else if (list.size() == 1) { try { getSyntaxDocument().replaceWord(wordElement, list.get(0)); } catch (BadLocationException ex) { ErrorDialog.show(null, "Editor error", ex); } } } } private SyntaxDocument.WordElement getCurrentWord() { try { return getSyntaxDocument().getCurrentWordElement(getCaretPosition()); } catch (BadLocationException ex) { ErrorDialog.show(null, "Editor error", ex); } return null; } public void keyReleased(KeyEvent event) { // Todo } static class ColoredEditorKit extends StyledEditorKit { private SyntaxDocument defaultDocument; public SyntaxDocument getDefaultDocument() { return defaultDocument; } @Override public Document createDefaultDocument() { defaultDocument = new SyntaxDocument(); return defaultDocument; } } private class Putter implements ActionListener { private String replaceBy; private final SyntaxDocument.WordElement wordElement; Putter(SyntaxDocument.WordElement wordElement, String replaceBy) { this.wordElement = wordElement; this.replaceBy = replaceBy; } public void actionPerformed(ActionEvent event) { try { getSyntaxDocument().replaceWord(wordElement, replaceBy); } catch (BadLocationException ex) { ErrorDialog.show(null, "Editor error", ex); } } } }