summaryrefslogtreecommitdiffstats
path: root/src/de/fhswf/in/inf/java2/aufgabe04/TextFieldWithContextMenu.java
blob: 41b229d58619047774d29d16d5f95452be3d74d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/**
 * File for the TextFieldWithContextMenu.
 */

package de.fhswf.in.inf.java2.aufgabe04;

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextField;
import javafx.scene.input.Clipboard;
import javafx.scene.input.DataFormat;

/**
 * A TextField with a ContextMenu.
 *
 * @author $Author: $
 * @version $Revision: $, $Date: $ UTC
 */
public class TextFieldWithContextMenu extends TextField
{
   Stack<String> undoStack = new Stack<>();
   
   private MenuItem undo = new MenuItem("Rückgängig");
   private MenuItem cut = new MenuItem("Ausschneiden");
   private MenuItem copy = new MenuItem("Kopieren");
   private MenuItem paste = new MenuItem("Einfügen");
   private MenuItem delete = new MenuItem("Löschen");
   private MenuItem selectAll = new MenuItem("Alles Markieren");
   
   private ContextMenu contextMenu;

   /**
    * Build the ContextMenu for the TextField.
    *
    */
   public TextFieldWithContextMenu()
   {
      
      //So empty is a valid pop and we never pop an empty stack
      undoStack.push("");
      
      undo.setOnAction(e -> {
            //The first time properties are strange.
            //The multiple pops are needed as the TextChangeListener
            //adds the actual text before and after the setText
            
            //Debugger is unusable while ContextMenu is open.
            //contextMenu.hide();
         
            undoStack.pop();
            setText(undoStack.pop());
            undoStack.pop();
         });

      cut.setOnAction(e -> {
            Map<DataFormat, Object> content = new HashMap<>();
            content.put(DataFormat.PLAIN_TEXT, getSelectedText());
            Clipboard.getSystemClipboard().setContent(content);
            deleteText(getSelection());
         });
      
      copy.setOnAction(e -> {
            Map<DataFormat, Object> content = new HashMap<>();
            content.put(DataFormat.PLAIN_TEXT, getSelectedText());
            Clipboard.getSystemClipboard().setContent(content);
         });
      
      paste.setOnAction(e -> {
            replaceSelection(Clipboard.getSystemClipboard().getString());
         });
      
      delete.setOnAction(e -> {
            replaceSelection("");
         });

      selectAll.setOnAction(e -> {
            selectRange(0, getText().length());
         });

      contextMenu = new ContextMenu(undo, cut, copy, paste, delete,
            selectAll);
      
      setContextMenu(contextMenu);
      
      contextMenu.setOnShowing(e -> {
            getContextMenu().getItems().forEach(f -> {
                  f.setDisable(true);
               });
            if (undoStack.size() > 1)
            {
               undo.setDisable(false);
            }
            if (getSelection().getLength() > 0)
            {
               copy.setDisable(false);
               cut.setDisable(false);
               delete.setDisable(false);
            }
            if (Clipboard.getSystemClipboard().getString() != null)
            {
               paste.setDisable(false);
            }
            if (getLength() > 0 && getSelection().getLength() < getLength())
            {
               selectAll.setDisable(false);
            }
         });
      
      textProperty().addListener(e -> {
            undoStack.push(getText());
         });
   }

}