diff --git a/NEWS b/NEWS index ab597946..694e404f 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@
2007-xx-xx:
* version 0.6
+ * native / and ? search and n and N working again
* the URL in the status line can be selected with the mouse again
* commandline history now works properly on Windows
* filename completion now works on Windows
diff --git a/chrome/content/vimperator/commands.js b/chrome/content/vimperator/commands.js
index 7474b27d..80a60526 100644
--- a/chrome/content/vimperator/commands.js
+++ b/chrome/content/vimperator/commands.js
@@ -682,6 +682,16 @@ function Commands() //{{{
help: "If [arg] is specified then limit the list to those marks mentioned."
}
));
+ addDefaultCommand(new Command(["noh[lsearch]"],
+ function(args)
+ {
+ vimperator.search.clear();
+ },
+ {
+ short_help: "Clear the current selection",
+ help: "TODO"
+ }
+ ));
addDefaultCommand(new Command(["norm[al]"],
function(args)
{
diff --git a/chrome/content/vimperator/default.css b/chrome/content/vimperator/default.css
index 56196df3..25eaa7c7 100644
--- a/chrome/content/vimperator/default.css
+++ b/chrome/content/vimperator/default.css
@@ -28,7 +28,7 @@ table.vimperator {
border-width: 1px;
border-style: dotted;
border-color: gray;
- margin-bottom: 2em; /* FIXME: just a quick hack until we have proper pages */
+ /*margin-bottom: 2em; /* FIXME: just a quick hack until we have proper pages */
}
table.vimperator td {
border-width: 0px;
diff --git a/chrome/content/vimperator/find.js b/chrome/content/vimperator/find.js
index f61d2ec7..e5800017 100644
--- a/chrome/content/vimperator/find.js
+++ b/chrome/content/vimperator/find.js
@@ -11,9 +11,7 @@ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
for the specific language governing rights and limitations under the
License.
-The Initial Developer of the Original Code is Shawn Betts.
-Portions created by the Initial Developer are Copyright (C) 2004,2005
-by the Initial Developer. All Rights Reserved.
+(c) 2006-2007: Martin Stubenschrott
Alternatively, the contents of this file may be used under the terms of
either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -28,443 +26,122 @@ the provisions above, a recipient may use your version of this file under
the terms of any one of the MPL, the GPL or the LGPL.
}}} ***** END LICENSE BLOCK *****/
-// Finder for vimperator
-// Author: Nigel McNie
-// Original Author: Shawn Betts
-//
-// The algorithm was taken from conkeror , but
-// extensively refactored and changed to behave like vim (naturally!)
-// The window to search in (which frame)
-//var gWin = null;
-//var gSelCtrl = null;
-
-//function highlight(range, node) {
-// var startContainer = range.startContainer;
-// var startOffset = range.startOffset;
-// var endOffset = range.endOffset;
-// var docfrag = range.extractContents();
-// var before = startContainer.splitText(startOffset);
-// var parent = before.parentNode;
-// node.appendChild(docfrag);
-// parent.insertBefore(node, before);
-// return node;
-//}
-
-// Clears the current selection
-// @todo this should be in vimperator.js, and not depend on searcher.gSelCtrl
-function clearSelection() {
- //var selctrl = gSelCtrl;
- var selctrl = vimperator.search.gSelCtrl;
- var sel = selctrl.getSelection(Components.interfaces.nsISelectionController.SELECTION_NORMAL);
- sel.removeAllRanges();
- gFindBar.highlightDoc();
-}
-
-// Sets what is currently selected
-// @todo as for clearSelection
-function setSelection(range) {
- try {
- var selctrlcomp = Components.interfaces.nsISelectionController;
- //var selctrl = gSelCtrl;
- var selctrl = vimperator.search.gSelCtrl;
- var sel = selctrl.getSelection(selctrlcomp.SELECTION_NORMAL);
- sel.removeAllRanges();
- sel.addRange(range.cloneRange());
-
- selctrl.scrollSelectionIntoView(selctrlcomp.SELECTION_NORMAL,
- selctrlcomp.SELECTION_FOCUS_REGION,
- true);
- }
- catch (e) {
- alert("setSelection: " + e);
- }
-}
-
-// Highlight find matches and move selection to the first occurrence
-// starting from pt.
-// @todo move into searcher and clean up
-function highlightFind(str, color, wrapped, dir, pt)
-{
- try {
- var gWin = vimperator.search.gWin;//document.commandDispatcher.focusedWindow;
- if (!gWin) {
- alert('gWin does not exist here...');
- alert(vimperator.search.gWin);
- }
- var doc = gWin.document;
- var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"].createInstance()
- .QueryInterface(Components.interfaces.nsIFind);
- var searchRange;
- var startPt;
- var endPt;
- var body = doc.body;
-
- finder.findBackwards = !dir;
-
- searchRange = doc.createRange();
- startPt = doc.createRange();
- endPt = doc.createRange();
-
- var count = body.childNodes.length;
-
- // Search range in the doc
- searchRange.setStart(body,0);
- searchRange.setEnd(body, count);
-
- if (!dir) {
- if (pt == null) {
- startPt.setStart(body, count);
- startPt.setEnd(body, count);
- } else {
- startPt.setStart(pt.startContainer, pt.startOffset);
- startPt.setEnd(pt.startContainer, pt.startOffset);
- }
- endPt.setStart(body, 0);
- endPt.setEnd(body, 0);
- } else {
- if (pt == null) {
- startPt.setStart(body, 0);
- startPt.setEnd(body, 0);
- } else {
- startPt.setStart(pt.endContainer, pt.endOffset);
- startPt.setEnd(pt.endContainer, pt.endOffset);
- }
- endPt.setStart(body, count);
- endPt.setEnd(body, count);
- }
- // search the doc
- var retRange = null;
- var selectionRange = null;
-
- if (!wrapped) {
- do {
- retRange = finder.Find(str, searchRange, startPt, endPt);
- var keepSearching = false;
- if (retRange) {
- var sc = retRange.startContainer;
- var ec = retRange.endContainer;
- var scp = sc.parentNode;
- var ecp = ec.parentNode;
- var sy1 = abs_point(scp).y;
- var ey2 = abs_point(ecp).y + ecp.offsetHeight;
-
- startPt = retRange.startContainer.ownerDocument.createRange();
- if (!dir) {
- startPt.setStart(retRange.startContainer, retRange.startOffset);
- startPt.setEnd(retRange.startContainer, retRange.startOffset);
- } else {
- startPt.setStart(retRange.endContainer, retRange.endOffset);
- startPt.setEnd(retRange.endContainer, retRange.endOffset);
- }
- // We want to find a match that is completely
- // visible, otherwise the view will scroll just a
- // bit to fit the selection in completely.
-// alert ("sy1: " + sy1 + " scry: " + gWin.scrollY);
-// alert ("ey2: " + ey2 + " bot: " + (gWin.scrollY + gWin.innerHeight));
- keepSearching = (dir && sy1 < gWin.scrollY)
- || (!dir && ey2 >= gWin.scrollY + gWin.innerHeight);
- }
- } while (retRange && keepSearching);
- } else {
- retRange = finder.Find(str, searchRange, startPt, endPt);
- }
-
- if (retRange) {
- setSelection(retRange);
- selectionRange = retRange.cloneRange();
- // highlightAllBut(str, retRange, color);
- } else {
-
- }
-
- return selectionRange;
- } catch(e) { alert('highlightFind:'+e); }
-}
-
-function clearHighlight()
-{
- gFindBar.highlightDoc();
- var win = window.content;
- var doc = win.document;
- if (!document)
- return;
-
- var elem = null;
- while ((elem = doc.getElementById("__vimperator-findbar-search-id"))) {
- var child = null;
- var docfrag = doc.createDocumentFragment();
- var next = elem.nextSibling;
- var parent = elem.parentNode;
- while ((child = elem.firstChild)) {
- docfrag.appendChild(child);
- }
- parent.removeChild(elem);
- parent.insertBefore(docfrag, next);
- }
-}
-
-/*
- * Finds the absolute X and Y co-ordinates of a given node from the top left of
- * the document
- *
- * Taken from conkeror utils.js
- */
-function abs_point (node) {
- var orig = node;
- var pt = {};
- try {
- pt.x = node.offsetLeft;
- pt.y = node.offsetTop;
-
- // Find imagemap's coordinates
- if (node.tagName == "AREA") {
- var coords = node.getAttribute("coords").split(",");
- pt.x += Number(coords[0]);
- pt.y += Number(coords[1]);
- }
-
- node = node.offsetParent;
-
- while (node.tagName != "BODY") {
- pt.x += node.offsetLeft;
- pt.y += node.offsetTop;
- node = node.offsetParent;
- }
- }
- catch (e) {
- // Ignore
- }
- return pt;
-}
-
-// Vimperator searcher
// make sure you only create this object when the "vimperator" object is ready
-//vimperator.search = new function()
+// vimperator.search = new function()
function Search() //{{{
{
var self = this; // needed for callbacks since "this" is the "vimperator" object in a callback
- this.gWin = null;
- this.gSelCtrl = null;
- this.gFindState = [];
+ var lastsearch = ""; // keep track of the last searched string
+ var found = false; // true if the last search was successful
// Event handlers for search - closure is needed
vimperator.registerCallback("change", vimperator.modes.SEARCH_FORWARD, function(command){ self.searchKeyPressed(command); });
vimperator.registerCallback("submit", vimperator.modes.SEARCH_FORWARD, function(command){ self.searchSubmitted(command); });
- vimperator.registerCallback("cancel", vimperator.modes.SEARCH_FORWARD, function(){ self.searchCancelled(); });
+ vimperator.registerCallback("cancel", vimperator.modes.SEARCH_FORWARD, function(){ self.searchCanceled(); });
+ // TODO: allow advanced modes in register/triggerCallback
+ vimperator.registerCallback("change", vimperator.modes.SEARCH_BACKWARD, function(command){ self.searchKeyPressed(command); });
+ vimperator.registerCallback("submit", vimperator.modes.SEARCH_BACKWARD, function(command){ self.searchSubmitted(command); });
+ vimperator.registerCallback("cancel", vimperator.modes.SEARCH_BACKWARD, function(){ self.searchCanceled(); });
-
- // Called when the search dialog is asked for. Sets up everything necessary
- // for this round of searching
- this.openSearchDialog = function()
+ // Called when the search dialog is asked for
+ // If you omit "mode", it will default to forward searching
+ this.openSearchDialog = function(mode)
{
- // Get a reference to the focused window if necessary
- if (this.gWin == null) this.gWin = document.commandDispatcher.focusedWindow;
+ if (mode == vimperator.modes.SEARCH_BACKWARD)
+ vimperator.commandline.open('?', '', vimperator.modes.SEARCH_BACKWARD);
+ else
+ vimperator.commandline.open('/', '', vimperator.modes.SEARCH_FORWARD);
- // Change the currently selected text to not be the attention colour
- // @todo: check what this REALLY does
- try {
- this.gSelCtrl = this.getFocusedSelCtrl();
- this.gSelCtrl.setDisplaySelection(Components.interfaces.nsISelectionController.SELECTION_ATTENTION);
- this.gSelCtrl.repaintSelection(Components.interfaces.nsISelectionController.SELECTION_NORMAL);
- }
- catch (e) {
- alert('Could not change the colour of the current selection:' + e);
- }
-
- // Initialize the state list for this attempt at searching
- var state = this.createInitialFindState();
- this.gFindState = [];
- this.gFindState.push(state);
- this.resumeFindState(state);
-
- vimperator.commandline.open('/', '', vimperator.modes.SEARCH_FORWARD);
+ // TODO: focus the top of the currently visible screen
}
- // Called when the current search needs to be repeated in the forward
- // direction
- // @todo will need re-jigging when reverse search comes in
- this.findNext = function() {
- this.find(this.lastFindState()["search-str"], true, this.lastFindState()["range"]);
- this.resumeFindState(this.lastFindState());
- // if there is still a search result
- if (this.lastFindState()["range"]) {
- if (this.lastFindState()["wrapped"]) {
- vimperator.echoerr("search hit BOTTOM, continuing at TOP");
- this.lastFindState()["wrapped"] = false;
- }
- else {
- // TODO: this could probably be done in a nicer way - perhaps
- // echoErr could not clobber all of this information somehow?
- vimperator.echo('/' + this.lastFindState()["search-str"]);
- }
- }
+ // Finds text in a page
+ // TODO: backwards seems impossible i fear :(
+ this.find = function(str, backwards)
+ {
+ const FIND_NORMAL = 0;
+ const FIND_TYPEAHEAD = 1;
+ const FIND_LINKS = 2;
+
+ var res = getBrowser().fastFind.find(str, FIND_TYPEAHEAD);
+ res == Components.interfaces.nsITypeAheadFind.FIND_FOUND ? found = true : found = false;
}
- // Called when the current search needs to be repeated in the backward
- // direction
- this.findPrevious = function() {
- this.find(this.lastFindState()["search-str"], false, this.lastFindState()["range"]);
- this.resumeFindState(this.lastFindState());
- // if there is still a search result
- if (this.lastFindState()["range"]) {
- if (this.lastFindState()["wrapped"]) {
- vimperator.echoerr("search hit TOP, continuing at BOTTOM");
- this.lastFindState()["wrapped"] = false;
- }
- else {
- vimperator.echo('/' + this.lastFindState()["search-str"]);
- }
+ // Called when the current search needs to be repeated
+ this.findAgain = function(reverse)
+ {
+ // this hack is needed to make n/N work with the correct string, if
+ // we typed /foo after the original search
+ if (getBrowser().fastFind.searchString != lastsearch)
+ this.find(lastsearch, false);
+
+ var backward = vimperator.hasMode(vimperator.modes.SEARCH_BACKWARD);
+ var up = reverse ? !backward : backward;
+ var result = getBrowser().fastFind.findAgain(up, null);
+
+ if (result == Components.interfaces.nsITypeAheadFind.FIND_NOTFOUND)
+ vimperator.echoerr("E486: Pattern not found: " + lastsearch);
+ else if (result == Components.interfaces.nsITypeAheadFind.FIND_WRAPPED)
+ {
+ // hack needed, because wrapping causes a "scroll" event which clears
+ // our command line
+ setTimeout( function() {
+ if (up)
+ vimperator.echoerr("search hit TOP, continuing at BOTTOM");
+ else
+ vimperator.echoerr("search hit BOTTOM, continuing at TOP");
+ }, 10);
}
}
// Called when the user types a key in the search dialog. Triggers a find attempt
- this.searchKeyPressed = function(command) {
- if (command != "") {
- var str = vimperator.commandline.getCommand();
- this.find(str, true, this.lastFindState()["point"]);
- this.resumeFindState(this.lastFindState());
- }
- else {
- clearSelection();
- }
+ this.searchKeyPressed = function(command)
+ {
+ // TODO: check for 'incsearch'
+ var backward = vimperator.hasMode(vimperator.modes.SEARCH_BACKWARD);
+ this.find(command, backward);
}
// Called when the enter key is pressed to trigger a search
- this.searchSubmitted = function(command) {
+ this.searchSubmitted = function(command)
+ {
+ gFindBar._highlightDoc("yellow", "black", command);
+
+ // need to find again to draw the highlight of the current search
+ // result over the "highlight all" search results
+ if (found)
+ {
+ // XXX: still not really working everywhere, inspite of this
+ setTimeout(function() {
+ var backward = vimperator.hasMode(vimperator.modes.SEARCH_BACKWARD);
+ this.find(command, backward);
+ }, 100);
+ }
+
//removeMode(MODE_SEARCH);
vimperator.setMode(vimperator.modes.NORMAL);
- if (this.lastFindState()["range"] == null) {
- vimperator.echoerr("E492: Pattern not found: " + this.lastFindState()["search-str"]);
- }
+ vimperator.focusContent();
+
+ lastsearch = command;
}
// Called when the search is cancelled - for example if someone presses
// escape while typing a search
- this.searchCancelled = function() {
+ this.searchCanceled = function()
+ {
//removeMode(MODE_SEARCH);
vimperator.setMode(vimperator.modes.NORMAL);
- clearSelection();
+ //gFindBar._highlightDoc();
+ this.clear();
vimperator.focusContent();
}
-
- //
- // Helper methods
- //
-
- // Turn on the selection in all frames
- // @todo to tell the truth, I have no idea what this does
- this.getFocusedSelCtrl = function() {
- var ds = getBrowser().docShell;
- var dsEnum = ds.getDocShellEnumerator(Components.interfaces.nsIDocShellTreeItem.typeContent,
- Components.interfaces.nsIDocShell.ENUMERATE_FORWARDS);
- while (dsEnum.hasMoreElements()) {
- ds = dsEnum.getNext().QueryInterface(Components.interfaces.nsIDocShell);
- if (ds.hasFocus) {
- var display = ds.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
- .getInterface(Components.interfaces.nsISelectionDisplay);
- if (!display) return null;
- return display.QueryInterface(Components.interfaces.nsISelectionController);
- }
- }
-
- // One last try
- return getBrowser().docShell
- .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
- .getInterface(Components.interfaces.nsISelectionDisplay)
- .QueryInterface(Components.interfaces.nsISelectionController);
- }
-
- // Creates a default find state
- this.createInitialFindState = function() {
- var state = [];
- state["screenx"] = this.gWin.scrollX;
- state["screeny"] = this.gWin.scrollY;
- state["search-str"] = "";
- state["wrapped"] = false;
- state["point"] = null;
- state["range"] = document.createRange();
- state["selection"] = null;
- state["direction"] = true;
- return state;
- }
-
- // Given a find state, moves the browser to the way it should be in the
- // state - highlighting the correct thing and the screen scrolled to the
- // correct location
- this.resumeFindState = function(state) {
- if (state["selection"]) {
- setSelection(state["selection"]);
- }
- else {
- clearSelection();
- }
- this.gWin.scrollTo(state["screenx"], state["screeny"]);
- }
-
- // Retrieves the current find state that we're in
- // @todo rename to currentFindState?
- this.lastFindState = function() {
- return this.gFindState[this.gFindState.length - 1];
- }
-
- // Adds a find state to the stack of such states. This is done every time a find is successful
- this.addFindState = function(screenX, screenY, searchStr, wrapped, point, range, selection, direction) {
- var state = [];
- state["screenx"] = screenX;
- state["screeny"] = screenY;
- state["search-str"] = searchStr;
- state["wrapped"] = wrapped;
- state["point"] = point;
- state["range"] = range;
- state["selection"] = selection;
- state["direction"] = direction;
- this.gFindState.push(state);
- }
-
- // Finds text in a page
- this.find = function(str, dir, pt)
+ this.clear = function()
{
- var norecurse = arguments[3];
-
- var matchRange;
- clearHighlight();
-
- // Should we wrap this time?
- var wrapped = this.lastFindState()["wrapped"];
- var point = pt;
- if (this.lastFindState()["wrapped"] == false
- && this.lastFindState()["range"] == null
- && this.lastFindState()["search-str"] == str
- && this.lastFindState()["direction"] == dir) {
- wrapped = true;
- point = null;
- }
- gFindBar.highlightDoc('yellow', 'black', str);
- matchRange = highlightFind(str, "lightblue", wrapped, dir, point);
- if (matchRange == null) {
- // No more matches in this direction. So add the state and then find
- // again to wrap around. But only find again once to prevent infinite
- // recursion if an error occurs
- this.addFindState(this.gWin.scrollX, this.gWin.scrollY, str, wrapped, point,
- matchRange, this.lastFindState()["selection"], dir);
- if (!norecurse)
- this.find(str, dir, pt, true);
- }
- else {
- this.addFindState(this.gWin.scrollX, this.gWin.scrollY, str, wrapped,
- point, matchRange, matchRange, dir);
- }
+ gFindBar._highlightDoc();
}
+
} //}}}
-//// @TODO should be moved into commands.js
-//vimperator.commands.add(new Command(["noh[lsearch]"],
-// clearSelection,
-// {
-// short_help: "Clear the current selection"
-// }
-//));
-
// vim: set fdm=marker sw=4 ts=4 et:
diff --git a/chrome/content/vimperator/hints.js b/chrome/content/vimperator/hints.js
index 565c22bc..6c3ddeb6 100644
--- a/chrome/content/vimperator/hints.js
+++ b/chrome/content/vimperator/hints.js
@@ -95,6 +95,8 @@ function Hints() //{{{
var rect = elem.getClientRects()[0];
if (rect)
{
+ if (!rect.left || !rect.top)
+ vimperator.log("HUI: no rect.left or top");
elem.absoLeft = rect.left;
elem.absoTop = rect.top;
}
@@ -171,9 +173,9 @@ function Hints() //{{{
// for extended hint mode, show all - even currently hidden - hints
//if (vimperator.hasMode(vimperator.modes.QUICK_HINT) && (elem.absoTop < area[1] || elem.absoTop > area[3] ||
- if ((elem.absoTop < area[1] || elem.absoTop > area[3] ||
- elem.absoLeft > area[2] || elem.absoLeft < area[0]))
- continue;
+// if ((elem.absoTop < area[1] || elem.absoTop > area[3] ||
+// elem.absoLeft > area[2] || elem.absoLeft < area[0]))
+// continue;
// if (elem.offsetWidth == 0 && elem.offsetHeight == 0)
// continue;
@@ -688,9 +690,9 @@ function Hints() //{{{
}
window.document.addEventListener("DOMContentLoaded", initDoc, null);
- //window.document.addEventListener("DOMContentLoaded", function() { vimperator.log("contentloaded"); }, null);
- //window.addEventListener("load", function() { vimperator.log("load"); }, null);
- //window.document.addEventListener("pageshow", function() { vimperator.log("pageshow"); }, null);
+ window.document.addEventListener("DOMContentLoaded", function() { vimperator.log("contentloaded"); }, null);
+ window.addEventListener("load", function() { vimperator.log("load"); }, null);
+ window.document.addEventListener("pageshow", function() { vimperator.log("pageshow"); }, null);
// FIXME: add resize support
//window.addEventListener("resize", onResize, null);
} //}}}
diff --git a/chrome/content/vimperator/mappings.js b/chrome/content/vimperator/mappings.js
index 7631aa19..61ad5388 100644
--- a/chrome/content/vimperator/mappings.js
+++ b/chrome/content/vimperator/mappings.js
@@ -938,27 +938,32 @@ function Mappings() //{{{
));
// search management
- addDefaultMap(new Map(vimperator.modes.NORMAL, ["g/"],
- function() { vimperator.search.openSearchDialog(); },
+ addDefaultMap(new Map(vimperator.modes.NORMAL, ["/"],
+ function() { vimperator.search.openSearchDialog(vimperator.modes.SEARCH_FORWARD); },
{
short_help: "Search forward for a pattern",
- help: "Buggy on many sites, use / if you want a reliable search!"
+ help: "TODO"
+ }
+ ));
+ addDefaultMap(new Map(vimperator.modes.NORMAL, ["?"],
+ function() { vimperator.search.openSearchDialog(vimperator.modes.SEARCH_BACKWARD); },
+ {
+ short_help: "Search backwards for a pattern",
+ help: "TODO"
}
));
addDefaultMap(new Map(vimperator.modes.NORMAL, ["n"],
- function() { vimperator.search.findNext(); },
+ function() { vimperator.search.findAgain(false); },
{
short_help: "Find next",
- help: "Repeat the last \"g/\" 1 time (until count is supported).
" +
- "NOTE: As \"g/\" is a little broken right now, use <F3> to go to the next search item of the \"/\" search for now."
+ help: "Repeat the last search 1 time (until count is supported)."
}
));
addDefaultMap(new Map(vimperator.modes.NORMAL, ["N"],
- function() { vimperator.search.findPrevious(); },
+ function() { vimperator.search.findAgain(true); },
{
short_help: "Find previous",
- help: "Repeat the last \"g/\" 1 time (until count is supported) in the opposite direction.
" +
- "NOTE: As \"g/\" is a little broken right now, use <S-F3> to go to the previous search item of the \"/\" search for now."
+ help: "Repeat the last search 1 time (until count is supported) in the opposite direction."
}
));
diff --git a/chrome/content/vimperator/options.js b/chrome/content/vimperator/options.js
index 7d8b2f29..3f97c35a 100644
--- a/chrome/content/vimperator/options.js
+++ b/chrome/content/vimperator/options.js
@@ -415,7 +415,7 @@ function Options() //{{{
addOption(new Option(["hintstyle", "hs"], "string",
{
short_help: "CSS specification of unfocused hints appearance",
- default_value: "z-index:5000; font-family:monospace; font-size:12px; color:black; background-color:yellow; " +
+ default_value: "z-index:5000; font-family:monospace; font-size:12px; color:white; background-color:red; " +
"border-color:ButtonShadow; border-width:0px; border-style:solid; padding:0px 1px 0px 1px; position:absolute;"
}
));