1
0
mirror of https://github.com/gryf/pentadactyl-pm.git synced 2025-12-19 22:37:58 +01:00

Try to move the caret within the viewport on entering Caret or Find mode. Closes issue #170.

This commit is contained in:
Kris Maglione
2011-10-03 21:11:26 -04:00
parent b19375d109
commit 654cf64c02
7 changed files with 93 additions and 9 deletions

View File

@@ -93,6 +93,8 @@ var Modes = Module("modes", {
modes.pop();
else if (!stack.pop && !this.pref)
this.pref = true;
if (!stack.pop)
buffer.resetCaret();
},
leave: function (stack) {

View File

@@ -187,7 +187,7 @@
<xml-block><escape><hl key="HelpXMLString">use strict</hl>;
XML.ignoreWhitespace = <hl key="Boolean">false</hl>;
XML.prettyPrinting = <hl key="Boolean">false</hl>;
<hl key="HelpXML">var</hl> INFO = <!-- Cursed manual XML highlighting! -->
<hl key="HelpXMLBase">var</hl> INFO = <!-- Cursed manual XML highlighting! -->
<hl key="HelpXMLTagStart">&lt;plugin
<hl key="HelpXMLAttribute">name</hl><hl key="HelpXMLString">flashblock</hl>
<hl key="HelpXMLAttribute">version</hl><hl key="HelpXMLString">1.0</hl>

View File

@@ -485,6 +485,75 @@ var Buffer = Module("Buffer", {
});
},
/**
* Resets the caret position so that it resides within the current
* viewport.
*/
resetCaret: function resetCaret() {
function visible(range) util.intersection(DOM(range).rect, viewport);
function getRanges(rect) {
let nodes = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils)
.nodesFromRect(rect.x, rect.y, 0, rect.width, rect.height, 0, false, false);
return Array.filter(nodes, function (n) n instanceof Ci.nsIDOMText)
.map(RangeFind.nodeContents);
}
let win = this.focusedFrame;
let sel = win.getSelection();
let viewport = DOM(win).rect;
if (sel.rangeCount) {
var range = sel.getRangeAt(0);
let vis = visible(range);
if (vis.width > 0 && vis.height > 0)
return;
var { rect } = DOM(range);
var reverse = rect.bottom > win.innerHeight;
rect = { x: rect.left, y: 0, width: rect.width, height: win.innerHeight };
}
else {
rect = { x: 0, y: 0, width: win.innerWidth, height: 0 };
}
var reduce = function (a, b) DOM(a).rect.top < DOM(b).rect.top ? a : b;
var dir = "forward";
var y = 0;
if (reverse) {
reduce = function (a, b) DOM(b).rect.bottom > DOM(a).rect.bottom ? b : a;
dir = "backward";
y = win.innerHeight - 1;
}
let ranges = getRanges(rect);
if (!ranges.length)
ranges = getRanges({ x: 0, y: y, width: win.innerWidth, height: 0 });
if (!ranges.length)
return;
range = ranges.reduce(reduce);
if (range) {
range.collapse(!reverse);
sel.removeAllRanges();
sel.addRange(range);
do {
if (visible(range).height > 0)
break;
var { startContainer, startOffset } = range;
sel.modify("move", dir, "line");
range = sel.getRangeAt(0);
}
while (startContainer != range.startContainer || startOffset != range.startOffset);
sel.modify("move", reverse ? "forward" : "backward", "lineboundary");
}
},
/**
* @property {nsISelectionController} The current document's selection
* controller.
@@ -887,7 +956,7 @@ var Buffer = Module("Buffer", {
* @param {boolean} useExternalEditor View the source in the external editor.
*/
viewSource: function viewSource(loc, useExternalEditor) {
let { dactyl, history, options } = this.modules;
let { dactyl, editor, history, options } = this.modules;
let window = this.topWindow;
@@ -940,6 +1009,8 @@ var Buffer = Module("Buffer", {
init: function init(doc, callback) {
this.callback = callable(callback) ? callback :
function (file, temp) {
let { editor } = overlay.activeModules;
editor.editFileExternally(update({ file: file.path }, callback || {}),
function () { temp && file.remove(false); });
return true;

View File

@@ -326,7 +326,13 @@ var DOM = Class("DOM", {
}),
}),
get rect() this[0] ? this[0].getBoundingClientRect() : {},
get rect() this[0] instanceof Ci.nsIDOMWindow ? { get width() this.innerWidth,
get height() this.innerHeight,
get bottom() this.height,
get right() this.width,
top: 0, left: 0,
__proto__: this[0] } :
this[0] ? this[0].getBoundingClientRect() : {},
get viewport() {
let r = this.rect;

View File

@@ -10,6 +10,7 @@ defineModule("finder", {
require: ["prefs"]
}, this);
this.lazyRequire("buffer", ["Buffer"]);
this.lazyRequire("overlay", ["overlay"]);
function equals(a, b) XPCNativeWrapper(a) == XPCNativeWrapper(b);
@@ -56,6 +57,8 @@ var RangeFinder = Module("rangefinder", {
this.commandline;
this.CommandMode(mode, this.content).open();
Buffer(this.content).resetCaret();
if (this.rangeFind && equals(this.rangeFind.window.get(), this.window))
this.rangeFind.reset();
this.find("", mode == this.modes.FIND_BACKWARD);

View File

@@ -177,18 +177,21 @@ HelpType;;;FontCode /* An option type */ \
HelpWarning /* The indicator for a warning */ \
color: red; font-weight: bold;
HelpXML;;;FontCode {
/* Highlighted XML */
HelpXMLBase;;;FontCode {
white-space: pre;
display: inline-block;
color: #C5F779;
background-color: #444444;
border: 1px dashed #aaaaaa;
font-family: Terminus, Fixed, monospace;
}
HelpXMLBlock;;;HelpXML {
HelpXML;;;HelpXMLBase {
/* Highlighted XML */
display: inline-block;
border: 1px dashed #aaaaaa;
}
HelpXMLBlock;;;HelpXMLBase {
display: block;
margin-left: 2em;
border: 1px dashed #aaaaaa;
}
HelpXMLAttribute color: #C5F779;
HelpXMLAttribute::after color: #E5E5E5; content: "=";

View File

@@ -24,7 +24,6 @@ FEATURES:
8 add support for filename special characters such as %
8 :redir and 'verbosefile'
8 middleclick in content == p, and if command line is open, paste there the clipboard buffer
8 all search commands should start searching from the top of the visible viewport
8 Add information to dactyl/HACKING file about testing and optimization
7 describe-key command (prompt for a key and display its binding with documentation)
7 use ctrl-n/p in insert mode for word completion