2 new revisions: Revision: be06b8d3c028 Branch: rt1835-UndoRemoveElement Author: Brandon Roller<brandon.r.roller@xxxxxxxxx> Date: Tue Dec 30 20:12:11 2014 UTC Log: Added class to record typing in view https://code.google.com/p/brailleblaster/source/detail?r=be06b8d3c028 Revision: aff66dc780e8 Branch: rt1835-UndoRemoveElement Author: Brandon Roller<brandon.r.roller@xxxxxxxxx> Date: Tue Dec 30 20:13:40 2014 UTC Log: Added undo/redo when typing https://code.google.com/p/brailleblaster/source/detail?r=aff66dc780e8 ============================================================================== Revision: be06b8d3c028 Branch: rt1835-UndoRemoveElement Author: Brandon Roller<brandon.r.roller@xxxxxxxxx> Date: Tue Dec 30 20:12:11 2014 UTC Log: Added class to record typing in view https://code.google.com/p/brailleblaster/source/detail?r=be06b8d3c028 Added:/src/main/org/brailleblaster/perspectives/braille/views/wp/formatters/EditRecorder.java
======================================= --- /dev/null+++ /src/main/org/brailleblaster/perspectives/braille/views/wp/formatters/EditRecorder.java Tue Dec 30 20:12:11 2014 UTC
@@ -0,0 +1,91 @@ +package org.brailleblaster.perspectives.braille.views.wp.formatters; + +import org.brailleblaster.perspectives.braille.Manager; +import org.brailleblaster.perspectives.braille.eventQueue.EventFrame; +import org.brailleblaster.perspectives.braille.eventQueue.EventTypes; +import org.brailleblaster.perspectives.braille.eventQueue.ViewEvent; +import org.brailleblaster.perspectives.braille.messages.Message; +import org.brailleblaster.perspectives.braille.views.wp.TextView; +import org.eclipse.swt.custom.ExtendedModifyEvent; + +public class EditRecorder { + + EventFrame frame; + String currentLine; + Manager manager; + TextView text; + + public EditRecorder(Manager manager, TextView text) { + this.manager = manager; + this.text = text; + } + + public void recordEditEvent(Message m){ + EventFrame frame = new EventFrame(); + ExtendedModifyEvent e = (ExtendedModifyEvent)m.getValue("event"); ++ int lineStart = text.view.getOffsetAtLine(text.view.getLineAtOffset(e.start));
+ int offset = e.start - lineStart; + String lineText = text.view.getLine(text.view.getLineAtOffset(e.start)); + int index = offset; + while(index < lineText.length() && lineText.charAt(index) != ' ') + index++; + + int wordEnd = index; + index = offset; + while(index > 0 && lineText.charAt(index) != ' ') + index--; + + int wordStart = index;+ String recordedText = lineText.substring(wordStart, offset) + e.replacedText + lineText.substring(offset + e.length, wordEnd);
+ wordStart = lineStart + wordStart; + wordEnd = lineStart + wordEnd;+ frame.addEvent(new ViewEvent(EventTypes.Edit, wordStart, wordEnd, 0, 0, recordedText));
+ manager.addUndoEvent(frame); + } + + public void recordDeleteEvent(Message m){ + EventFrame frame = new EventFrame(); + ExtendedModifyEvent e = (ExtendedModifyEvent)m.getValue("event"); ++ int lineStart = text.view.getOffsetAtLine(text.view.getLineAtOffset(e.start));
+ int offset = e.start - lineStart; + String lineText = currentLine; + int index = offset;+ while(index < lineText.length() && (lineText.charAt(index) != ' ' || index < (offset + e.replacedText.length())))
+ index++; + + int wordEnd = index; + index = offset; + while(index > 0 && lineText.charAt(index) != ' ') + index--; + + int wordStart = index;+ String recordedText = lineText.substring(wordStart, offset) + lineText.substring(offset + e.length, wordEnd);
+ wordStart = lineStart + wordStart; + wordEnd = lineStart + wordEnd - e.replacedText.length();+ frame.addEvent(new ViewEvent(EventTypes.Edit, wordStart, wordEnd, 0, 0, recordedText));
+ manager.addUndoEvent(frame); + } + + public void recordLine(String currentLine){ + this.currentLine = currentLine; + } + + public void recordLine(int start, int end){ + int firstLine = text.view.getLineAtOffset(start); + int lastLine = text.view.getLineAtOffset(end); + currentLine = text.view.getLine(firstLine); + if(firstLine != lastLine){ + do{ + firstLine++; + this.currentLine += "\n"; + this.currentLine += text.view.getLine(firstLine); + } while(firstLine <= lastLine); + } + } + + public String getCurrentLine(){ + return currentLine; + } +} ============================================================================== Revision: aff66dc780e8 Branch: rt1835-UndoRemoveElement Author: Brandon Roller<brandon.r.roller@xxxxxxxxx> Date: Tue Dec 30 20:13:40 2014 UTC Log: Added undo/redo when typing https://code.google.com/p/brailleblaster/source/detail?r=aff66dc780e8 Modified: /src/main/org/brailleblaster/perspectives/braille/eventQueue/RedoQueue.java /src/main/org/brailleblaster/perspectives/braille/eventQueue/UndoQueue.java /src/main/org/brailleblaster/perspectives/braille/eventQueue/ViewEvent.java /src/main/org/brailleblaster/perspectives/braille/messages/BBEvent.java /src/main/org/brailleblaster/perspectives/braille/messages/Message.java/src/main/org/brailleblaster/perspectives/braille/stylers/TextUpdateHandler.java /src/main/org/brailleblaster/perspectives/braille/stylers/WhiteSpaceHandler.java
/src/main/org/brailleblaster/perspectives/braille/views/wp/TextView.java =======================================--- /src/main/org/brailleblaster/perspectives/braille/eventQueue/RedoQueue.java Tue Dec 23 16:39:37 2014 UTC +++ /src/main/org/brailleblaster/perspectives/braille/eventQueue/RedoQueue.java Tue Dec 30 20:13:40 2014 UTC
@@ -24,6 +24,10 @@ for(int i = 0; i < frame.size(); i++){ Event event = frame.get(i); switch(event.eventType){ + case Edit:+ TextUpdateHandler editUpdater = new TextUpdateHandler(manager, vi, list);
+ editUpdater.redoEdit(frame); + break; case Update: TextUpdateHandler tuh = new TextUpdateHandler(manager, vi, list); tuh.redoText(frame); =======================================--- /src/main/org/brailleblaster/perspectives/braille/eventQueue/UndoQueue.java Tue Dec 23 16:39:37 2014 UTC +++ /src/main/org/brailleblaster/perspectives/braille/eventQueue/UndoQueue.java Tue Dec 30 20:13:40 2014 UTC
@@ -47,6 +47,9 @@ WhiteSpaceHandler wsh = new WhiteSpaceHandler(manager, list); wsh.UndoDelete(frame); break; + case Edit:+ TextUpdateHandler editHandler = new TextUpdateHandler(manager, vi, list);
+ editHandler.undoEdit(frame); default: break; } =======================================--- /src/main/org/brailleblaster/perspectives/braille/eventQueue/ViewEvent.java Mon Dec 22 18:29:25 2014 UTC +++ /src/main/org/brailleblaster/perspectives/braille/eventQueue/ViewEvent.java Tue Dec 30 20:13:40 2014 UTC
@@ -3,13 +3,25 @@ public class ViewEvent extends Event{ String text;- public ViewEvent(EventTypes eventType, int textOffset, int brailleOffset, String text) {
+ int textEnd, brailleEnd; ++ public ViewEvent(EventTypes eventType, int textStart, int textEnd, int brailleOffset, int brailleEnd, String text) {
- super(eventType, textOffset, brailleOffset); + super(eventType, textStart, brailleOffset); this.text = text; + this.textEnd = textEnd; + this.brailleEnd = brailleEnd; } public String getText(){ return text; } + + public int getTextEnd(){ + return textEnd; + } + + public int getBrailleEnd(){ + return brailleEnd; + } } =======================================--- /src/main/org/brailleblaster/perspectives/braille/messages/BBEvent.java Wed Dec 10 20:14:45 2014 UTC +++ /src/main/org/brailleblaster/perspectives/braille/messages/BBEvent.java Tue Dec 30 20:13:40 2014 UTC
@@ -34,6 +34,7 @@ INCREMENT, DECREMENT, WHITESPACE_DELETION, + EDIT, UPDATE, INSERT_NODE, REMOVE_NODE, =======================================--- /src/main/org/brailleblaster/perspectives/braille/messages/Message.java Mon Dec 22 18:29:25 2014 UTC +++ /src/main/org/brailleblaster/perspectives/braille/messages/Message.java Tue Dec 30 20:13:40 2014 UTC
@@ -35,6 +35,7 @@import org.brailleblaster.perspectives.braille.document.BBSemanticsTable.Styles; import org.brailleblaster.perspectives.braille.mapping.elements.TextMapElement;
+import org.eclipse.swt.custom.ExtendedModifyEvent; import nu.xom.Text; @@ -190,6 +191,13 @@ m.put("isBoxline", isBoxline); return m; } + + public static Message createEditEventMesag(ExtendedModifyEvent e){ + Message m = new Message(BBEvent.EDIT); + m.put("event", e); + + return m; + } public void put(String key, Object value){ args.put(key, value); =======================================--- /src/main/org/brailleblaster/perspectives/braille/stylers/TextUpdateHandler.java Mon Dec 22 15:26:49 2014 UTC +++ /src/main/org/brailleblaster/perspectives/braille/stylers/TextUpdateHandler.java Tue Dec 30 20:13:40 2014 UTC
@@ -6,6 +6,7 @@ import org.brailleblaster.perspectives.braille.eventQueue.EventFrame; import org.brailleblaster.perspectives.braille.eventQueue.EventTypes; import org.brailleblaster.perspectives.braille.eventQueue.ModelEvent; +import org.brailleblaster.perspectives.braille.eventQueue.ViewEvent;import org.brailleblaster.perspectives.braille.mapping.elements.TextMapElement;
import org.brailleblaster.perspectives.braille.mapping.maps.MapList; import org.brailleblaster.perspectives.braille.messages.Message; @@ -84,4 +85,39 @@ return f; } + + public void undoEdit(EventFrame f){ + EventFrame frame = new EventFrame(); + while(!f.empty() && f.peek().getEventType().equals(EventTypes.Edit)){ + ViewEvent ev = (ViewEvent)f.pop(); + text.view.setCaretOffset(ev.getTextOffset()); + + int start = ev.getTextOffset(); + int end = ev.getTextOffset() + ev.getText().length();+ //String replacedtext = text.view.getText(ev.getTextOffset(), ev.getTextOffset() + ev.getText().length()); + String replacedtext = text.view.getTextRange(ev.getTextOffset(), ev.getTextEnd() - ev.getTextOffset());
++ frame.addEvent(new ViewEvent(EventTypes.Edit, start, end, 0, 0, replacedtext)); + text.undoEdit(ev.getTextOffset(), ev.getTextEnd() - ev.getTextOffset(), ev.getText());
+ } + + manager.addRedoEvent(frame); + } + + public void redoEdit(EventFrame f){ + EventFrame frame = new EventFrame(); + while(!f.empty() && f.peek().getEventType().equals(EventTypes.Edit)){ + ViewEvent ev = (ViewEvent)f.pop(); + text.view.setCaretOffset(ev.getTextOffset()); + + int start = ev.getTextOffset(); + int end = ev.getTextOffset() + ev.getText().length();+ String replacedText = text.view.getTextRange(ev.getTextOffset(), ev.getTextEnd() - ev.getTextOffset());
++ frame.addEvent(new ViewEvent(EventTypes.Edit, start, end, 0,0, replacedText)); + text.undoEdit(ev.getTextOffset(), ev.getTextEnd() - ev.getTextOffset(), ev.getText());
+ } + + manager.addUndoEvent(frame); + } } =======================================--- /src/main/org/brailleblaster/perspectives/braille/stylers/WhiteSpaceHandler.java Mon Dec 22 19:03:56 2014 UTC +++ /src/main/org/brailleblaster/perspectives/braille/stylers/WhiteSpaceHandler.java Tue Dec 30 20:13:40 2014 UTC
@@ -56,7 +56,7 @@ else braille.removeWhitespace(0, (Integer)message.getValue("length"));- eventFrame.addEvent(new ViewEvent(EventTypes.Whitespace, (Integer)message.getValue("offset"), brailleStart, (String)message.getValue("replacedText"))); + eventFrame.addEvent(new ViewEvent(EventTypes.Whitespace, (Integer)message.getValue("offset"), 0, brailleStart, 0,(String)message.getValue("replacedText")));
manager.addUndoEvent(eventFrame); } =======================================--- /src/main/org/brailleblaster/perspectives/braille/views/wp/TextView.java Tue Dec 23 16:46:40 2014 UTC +++ /src/main/org/brailleblaster/perspectives/braille/views/wp/TextView.java Tue Dec 30 20:13:40 2014 UTC
@@ -48,6 +48,7 @@ import org.brailleblaster.perspectives.braille.messages.Message; import org.brailleblaster.perspectives.braille.messages.Sender;import org.brailleblaster.perspectives.braille.viewInitializer.ViewInitializer; +import org.brailleblaster.perspectives.braille.views.wp.formatters.EditRecorder; import org.brailleblaster.perspectives.braille.views.wp.formatters.WhiteSpaceManager;
import org.brailleblaster.util.Notify; @@ -105,13 +106,15 @@ private EditMenu menu; private boolean multiSelected; - + private EditRecorder editRecorder; +public TextView (Manager manager, SashForm sash, BBSemanticsTable table) {
super (manager, sash, table); this.total = 0; this.spaceBeforeText = 0; this.spaceAfterText = 0; this.manager = manager; + this.editRecorder = new EditRecorder(manager, this); menu = new EditMenu(this, manager); multiSelected=false; readOnly = false; @@ -141,6 +144,11 @@ oldCursorPosition = view.getCaretOffset(); currentChar = e.keyCode; + if(selectionLength > 0)+ editRecorder.recordLine(selectionStart, selectionStart + selectionLength);
+ else+ editRecorder.recordLine(view.getLine(view.getLineAtOffset(view.getCaretOffset())));
+ if(readOnly){if((Character.isDigit(e.character) && !validEdit())|| (Character.isLetter(e.character) && !validEdit()) || e.keyCode == SWT.CR)
e.doit = false; @@ -296,7 +304,7 @@ if(!getLock()){if(currentChar == SWT.ARROW_DOWN || currentChar == SWT.ARROW_LEFT || currentChar == SWT.ARROW_RIGHT || currentChar == SWT.ARROW_UP || currentChar == SWT.PAGE_DOWN || currentChar == SWT.PAGE_UP){
if(e.caretOffset >= currentEnd || e.caretOffset < currentStart){ - if(textChanged == true){ + if(textChanged == true && currentChanges != 0){ sendUpdate(); } @@ -1134,10 +1142,12 @@ else if(e.start + e.replacedText.length() == currentEnd){ changes -= e.replacedText.length(); makeTextChange(changes); + recordEvent(e, true); } else { changes = e.length - selectionLength; makeTextChange(changes); + recordEvent(e, true); } } } @@ -1149,6 +1159,7 @@ sendAdjustRangeMessage("start", currentStart - oldCursorPosition); makeTextChange(changes); + recordEvent(e, true); } checkStyleRange(range); @@ -1174,8 +1185,10 @@ } else if(oldCursorPosition > currentEnd) deleteSpaceAndShift(view.getCaretOffset(), offset, e); - else + else{ makeTextChange(offset); + recordEvent(e, false); + } } else if(currentChar == SWT.DEL){ offset = -1; @@ -1198,8 +1211,10 @@ deleteSpaceAndShift(view.getCaretOffset(), offset, e);else if( (oldCursorPosition == currentEnd && nextStart == -1)|| (oldCursorPosition > currentEnd && (oldCursorPosition < nextStart || nextStart == -1)))
deleteSpaceAndShift(view.getCaretOffset(), offset, e); - else + else { makeTextChange(offset); + recordEvent(e, false); + } } else { offset = -1; @@ -1207,8 +1222,10 @@ deleteSpaceAndShift(selectionStart, offset, e);else if(selectionStart == currentEnd && (nextStart == -1 || selectionStart + selectionLength <= nextStart))
deleteSpaceAndShift(selectionStart, offset, e); - else + else { makeTextChange(offset); + recordEvent(e, false); + } }if(currentStart == currentEnd && (currentStart == previousEnd || currentStart == nextStart)){
@@ -1221,8 +1238,10 @@ } private void deleteSelection(ExtendedModifyEvent e){- if(selectionStart >= currentStart && selectionStart + selectionLength <= currentEnd) + if(selectionStart >= currentStart && selectionStart + selectionLength <= currentEnd){
makeTextChange(-selectionLength); + recordEvent(e, false); + }else if(selectionStart + selectionLength > currentEnd && selectionStart + selectionLength >= nextStart || previousEnd == -1){
int changes = 0; while(selectionLength > 0){ @@ -1321,6 +1340,14 @@ if(currentElement instanceof PageMapElement) view.setCaretOffset(previousEnd); } + + private void recordEvent(ExtendedModifyEvent e, boolean edit){ + Message message = Message.createEditEventMesag(e); + if(edit) + editRecorder.recordEditEvent(message); + else + editRecorder.recordDeleteEvent(message); + } private void handleReadOnlySelection(TextMapElement p, boolean partial){ int pos = p.end; @@ -1461,6 +1488,11 @@ } public void cut(){ + if(selectionLength > 0)+ editRecorder.recordLine(selectionStart, selectionStart + selectionLength);
+ else+ editRecorder.recordLine(view.getLine(view.getLineAtOffset(view.getCaretOffset())));
+ if(validCut()) view.cut(); } @@ -1800,6 +1832,7 @@ setListenerLock(true); menu.dispose(); recreateView(sashform); + editRecorder = new EditRecorder(manager, this); total = 0; spaceBeforeText = 0; spaceAfterText = 0; @@ -1934,4 +1967,10 @@ multiSelected = false; } } + + public void undoEdit(int start, int length, String text){ + int changes = text.length() - length; + replaceTextRange(start, length, text); + makeTextChange(changes); + } }