< prev index next >

modules/javafx.controls/src/main/java/javafx/scene/control/TextInputControl.java

Print this page

        

*** 63,72 **** --- 63,73 ---- import javafx.scene.text.Font; import java.text.BreakIterator; import java.util.ArrayList; import java.util.Collections; + import java.util.Date; import java.util.List; import com.sun.javafx.util.Utils; import com.sun.javafx.binding.ExpressionHelper; import com.sun.javafx.scene.NodeHelper;
*** 568,585 **** if (newText.equals(oldText)) { // Undo record not required as there is no change in the text. return; } ! // If you select some stuff and type anything, then we need to ! // create an undo record. If the range is a single character and ! // is right next to the index of the last undo record end index, then ! // we don't need to create a new undo record. In all other cases ! // we do. int endOfUndoChange = undoChange == undoChangeHead ? -1 : undoChange.start + undoChange.newText.length(); if (createNewUndoRecord || nonEmptySelection || endOfUndoChange == -1 || forceNewUndoRecord || ! (endOfUndoChange != change.start && endOfUndoChange != change.end) || change.end - change.start > 1) { undoChange = undoChange.add(change.start, oldText, newText); } else if (change.start != change.end && change.text.isEmpty()) { // I know I am deleting, and am located at the end of the range of the current undo record if (undoChange.newText.length() > 0) { undoChange.newText = undoChange.newText.substring(0, change.start - undoChange.start); --- 569,606 ---- if (newText.equals(oldText)) { // Undo record not required as there is no change in the text. return; } ! /* ! * A new undo record is created, if ! * 1. createNewUndoRecord is true, currently it is set to true for paste operation ! * 2. Text is selected and a character is typed ! * 3. This is the first operation to be added to undo record ! * 4. forceNewUndoRecord is true, currently it is set to true if there is no text present ! * 5. Space character is typed ! * 6. 2500 milliseconds are elapsed since the undo record was created ! * 7. Cursor position is changed and a character is typed ! * 8. A range of text is replaced programmatically using replaceText() ! * Otherwise, the last undo record is updated or discarded. ! */ ! int endOfUndoChange = undoChange == undoChangeHead ? -1 : undoChange.start + undoChange.newText.length(); + boolean isNewSpaceChar = false; + if (newText.equals(" ")) { + if (UndoRedoChange.isSpaceCharSequence()) { + isNewSpaceChar = false; + } else { + isNewSpaceChar = true; + UndoRedoChange.setSpaceCharSequence(true); + } + } else { + UndoRedoChange.setSpaceCharSequence(false); + } if (createNewUndoRecord || nonEmptySelection || endOfUndoChange == -1 || forceNewUndoRecord || ! isNewSpaceChar || UndoRedoChange.ifChangeDurationElapsed() || ! (endOfUndoChange != change.start && endOfUndoChange != change.end) || change.end - change.start > 0) { undoChange = undoChange.add(change.start, oldText, newText); } else if (change.start != change.end && change.text.isEmpty()) { // I know I am deleting, and am located at the end of the range of the current undo record if (undoChange.newText.length() > 0) { undoChange.newText = undoChange.newText.substring(0, change.start - undoChange.start);
*** 1465,1474 **** --- 1486,1498 ---- * are two special UndoRedoChange objects in this chain representing the * head and the tail so we can have beforeFirst and afterLast * behavior as necessary. */ static class UndoRedoChange { + static long prevRecordTime; + static final long CHANGE_DURATION = 2500; // milliseconds + static boolean spaceCharSequence = false; int start; String oldText; String newText; UndoRedoChange prev; UndoRedoChange next;
*** 1480,1492 **** --- 1504,1528 ---- c.start = start; c.oldText = oldText; c.newText = newText; c.prev = this; next = c; + prevRecordTime = (new Date()).getTime(); return c; } + static boolean ifChangeDurationElapsed() { + return ((new Date()).getTime() - prevRecordTime > CHANGE_DURATION) ; + } + + static void setSpaceCharSequence(boolean value) { + spaceCharSequence = value; + } + static boolean isSpaceCharSequence() { + return spaceCharSequence; + } + public UndoRedoChange discard() { prev.next = next; return prev; }
< prev index next >