}
}
+function getCaretPosition(editableDiv) {
+ var caretPos = 0,
+ sel, range;
+ if (window.getSelection) {
+ sel = window.getSelection();
+ if (sel.rangeCount) {
+ range = sel.getRangeAt(0);
+ if (range.commonAncestorContainer.parentNode == editableDiv) {
+ caretPos = range.endOffset;
+ }
+ }
+ } else if (document.selection && document.selection.createRange) {
+ range = document.selection.createRange();
+ if (range.parentElement() == editableDiv) {
+ var tempEl = document.createElement("span");
+ editableDiv.insertBefore(tempEl, editableDiv.firstChild);
+ var tempRange = range.duplicate();
+ tempRange.moveToElementText(tempEl);
+ tempRange.setEndPoint("EndToEnd", range);
+ caretPos = tempRange.text.length;
+ }
+ }
+ return caretPos;
+}
+
/**
* @depend ../library/cursorToEnd.js
*/
this.$el.find("> .text").blur();
return this;
},
+ isFocusAtBeginning: function() {
+ return getCaretPosition(this.$el.find("> .text")[0]) === 0;
+ },
decodeText: function(encodedText) {
return $("<div/>").html(encodedText).text();
},
backspace: function(e) {
- // TODO: Handle backspace at beginning of non-empty line
if (e.keyCode !== 8 /* backspace */ && e.keyCode !== 46 /* delete */) {
return;
}
+ if (this.model.hasChildren()) {
+ return;
+ }
+ var previousNode = this.model.previousNode(this.model.collection);
+ if (!previousNode) {
+ return;
+ }
if (this.model.get("text") === "") { // Or focus is at the beginning
- if (this.model.hasChildren()) {
- return;
- }
- var previousNode = this.model.previousNode(this.model.collection);
- if (!previousNode) {
- return;
- }
e.preventDefault();
this.model.remove(this.model.collection);
previousNode.getView().startEditingText({"atEnd":true});
+ } else if (this.isFocusAtBeginning()) {
+ e.preventDefault();
+ var text = this.model.get("text");
+ this.model.remove(this.model.collection);
+ // TODO: Keep focus between the two halves
+ // var focusReminderElement = this.$("<span class=\"focus\"></span>")
+ previousNode.setText(previousNode.get("text")/* + focusReminderElement*/ + text);
+ previousNode.getView().startEditingText(/*{"atMarker": focusReminderElement}*/);
}
},
textChange: function(e) {
}
}
+function getCaretPosition(editableDiv) {
+ var caretPos = 0,
+ sel, range;
+ if (window.getSelection) {
+ sel = window.getSelection();
+ if (sel.rangeCount) {
+ range = sel.getRangeAt(0);
+ if (range.commonAncestorContainer.parentNode == editableDiv) {
+ caretPos = range.endOffset;
+ }
+ }
+ } else if (document.selection && document.selection.createRange) {
+ range = document.selection.createRange();
+ if (range.parentElement() == editableDiv) {
+ var tempEl = document.createElement("span");
+ editableDiv.insertBefore(tempEl, editableDiv.firstChild);
+ var tempRange = range.duplicate();
+ tempRange.moveToElementText(tempEl);
+ tempRange.setEndPoint("EndToEnd", range);
+ caretPos = tempRange.text.length;
+ }
+ }
+ return caretPos;
+}
+
/**
* @depend ../library/cursorToEnd.js
*/
this.$el.find("> .text").blur();
return this;
},
+ isFocusAtBeginning: function() {
+ return getCaretPosition(this.$el.find("> .text")[0]) === 0;
+ },
decodeText: function(encodedText) {
return $("<div/>").html(encodedText).text();
},
backspace: function(e) {
- // TODO: Handle backspace at beginning of non-empty line
if (e.keyCode !== 8 /* backspace */ && e.keyCode !== 46 /* delete */) {
return;
}
+ if (this.model.hasChildren()) {
+ return;
+ }
+ var previousNode = this.model.previousNode(this.model.collection);
+ if (!previousNode) {
+ return;
+ }
if (this.model.get("text") === "") { // Or focus is at the beginning
- if (this.model.hasChildren()) {
- return;
- }
- var previousNode = this.model.previousNode(this.model.collection);
- if (!previousNode) {
- return;
- }
e.preventDefault();
this.model.remove(this.model.collection);
previousNode.getView().startEditingText({"atEnd":true});
+ } else if (this.isFocusAtBeginning()) {
+ e.preventDefault();
+ var text = this.model.get("text");
+ this.model.remove(this.model.collection);
+ // TODO: Keep focus between the two halves
+ // var focusReminderElement = this.$("<span class=\"focus\"></span>")
+ previousNode.setText(previousNode.get("text")/* + focusReminderElement*/ + text);
+ previousNode.getView().startEditingText(/*{"atMarker": focusReminderElement}*/);
}
},
textChange: function(e) {
+++ /dev/null
-<html>
-<head>
-<script src="_bower.js"></script>
-<script src="flowy.js"></script>
-<link rel="stylesheet" type="text/css" href="flowy.css">
-</head>
-<body>
-<div id="todo-app">
- A todo list:
- <div id="todo-list">
-
- </div>
-</div>
-</body>
-</html>
range.select();//Select the range (make it the visible selection
}
}
+
+function getCaretPosition(editableDiv) {
+ var caretPos = 0,
+ sel, range;
+ if (window.getSelection) {
+ sel = window.getSelection();
+ if (sel.rangeCount) {
+ range = sel.getRangeAt(0);
+ if (range.commonAncestorContainer.parentNode == editableDiv) {
+ caretPos = range.endOffset;
+ }
+ }
+ } else if (document.selection && document.selection.createRange) {
+ range = document.selection.createRange();
+ if (range.parentElement() == editableDiv) {
+ var tempEl = document.createElement("span");
+ editableDiv.insertBefore(tempEl, editableDiv.firstChild);
+ var tempRange = range.duplicate();
+ tempRange.moveToElementText(tempEl);
+ tempRange.setEndPoint("EndToEnd", range);
+ caretPos = tempRange.text.length;
+ }
+ }
+ return caretPos;
+}
this.$el.find("> .text").blur();
return this;
},
+ isFocusAtBeginning: function() {
+ return getCaretPosition(this.$el.find("> .text")[0]) === 0;
+ },
decodeText: function(encodedText) {
return $("<div/>").html(encodedText).text();
},
backspace: function(e) {
- // TODO: Handle backspace at beginning of non-empty line
if (e.keyCode !== 8 /* backspace */ && e.keyCode !== 46 /* delete */) {
return;
}
+ if (this.model.hasChildren()) {
+ return;
+ }
+ var previousNode = this.model.previousNode(this.model.collection);
+ if (!previousNode) {
+ return;
+ }
if (this.model.get("text") === "") { // Or focus is at the beginning
- if (this.model.hasChildren()) {
- return;
- }
- var previousNode = this.model.previousNode(this.model.collection);
- if (!previousNode) {
- return;
- }
e.preventDefault();
this.model.remove(this.model.collection);
previousNode.getView().startEditingText({"atEnd":true});
+ } else if (this.isFocusAtBeginning()) {
+ e.preventDefault();
+ var text = this.model.get("text");
+ this.model.remove(this.model.collection);
+ // TODO: Keep focus between the two halves
+ // var focusReminderElement = this.$("<span class=\"focus\"></span>")
+ previousNode.setText(previousNode.get("text")/* + focusReminderElement*/ + text);
+ previousNode.getView().startEditingText(/*{"atMarker": focusReminderElement}*/);
}
},
textChange: function(e) {