Another round of ViXEn updates. Not part of build.

This commit is contained in:
ben%netscape.com 2001-03-06 09:41:14 +00:00
parent 3eac97f0d8
commit d957eb9771
14 changed files with 724 additions and 16 deletions

View File

@ -98,3 +98,39 @@ var vfdFocusObserver = {
}
};
function requestUndo ()
{
_dd("requestUndo");
var rootShell = vxUtils.getRootShell();
if (rootShell) rootShell.undo();
}
function requestRedo ()
{
_dd("requestRedo");
var rootShell = vxUtils.getRootShell();
if (rootShell) rootShell.redo();
}
var historyDNDObserver =
{
onDragStart: function ()
{
var tree = document.getElementById("historyTree");
if (!tree.selectedItems.length) return null;
var commandString = "";
for (var i = 0; i < tree.selectedItems.length; ++i) {
var currItem = tree.selectedItems[i];
if (currItem)
commandString += currItem.getAttribute("command");
}
_ddf("command-string dragged", commandString);
var flavourList = { };
flavourList["text/x-moz-vixen-command"] = { width: 2, data: commandString };
return flavourList;
}
};

View File

@ -2,6 +2,7 @@
<?xml-stylesheet href="chrome://communicator/skin/"?>
<?xml-stylesheet href="chrome://vixen/skin/history/history.css"?>
<?xml-stylesheet href="chrome://vixen/content/history/historyContent.css"?>
<window id="vxHistory" orient="vertical"
windowtype="vixen:history"
@ -13,6 +14,11 @@
<script src="chrome://global/content/nsJSComponentManager.js"></script>
<script src="chrome://vixen/content/vxUtils.js"></script>
<!-- drag and drop -->
<script src="chrome://global/content/nsJSSupportsUtils.js"></script>
<script src="chrome://global/content/nsTransferable.js"></script>
<script src="chrome://global/content/nsDragAndDrop.js"></script>
<!-- history -->
<script src="chrome://vixen/content/history/history.js"></script>
@ -22,10 +28,11 @@
<stringbundle id="historyBundle" src="chrome://vixen/locale/history/history.properties"/>
<tree id="historyTree" style="width: 0px; height; 0px;"
<tree id="historyTree" style="width: 0px; height; 0px; margin: 0px;" class="inset"
flex="1" datasources="rdf:null" multiple="true"
ref="urn:mozilla:vixen:transactions">
<treecolgroup>
<treecol/>
<treecol flex="1"/>
</treecolgroup>
<template>
@ -53,19 +60,23 @@
</bindings>
<action>
<treechildren>
<treeitem uri="?transaction">
<treerow class="transaction-row"
<treeitem uri="?transaction" command="?command-string">
<treerow class="transaction-row"
state="?transaction-state"
position="?transaction-position">
<treecell value="?description" command="?command-string"/>
<treecell state="?transaction-state"
class="treecell-history-grabber" allowevents="true" value="+"/>
<treecell class="treecell-history-cell"
state="?transaction-state"
value="?description" crop="right" flex="1"/>
</treerow>
</treeitem>
</treeitem>
</treechildren>
</action>
</rule>
</template>
<treechildren id="historyKids" flex="1"/>
<treechildren id="historyKids" flex="1" ondraggesture="nsDragAndDrop.startDrag(event, historyDNDObserver)"/>
</tree>
</window>

View File

@ -0,0 +1,41 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 2000 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Ben Goodger <ben@netscape.com> (Original Author)
*/
.treecell-history-grabber
{
-moz-binding : url("chrome://vixen/content/history/historyTreeBindings.xml#history-tree-cell");
padding : 0px;
}
.cell-grabber
{
-moz-binding : url("chrome://vixen/content/history/historyTreeBindings.xml#grabber-track");
width : 10px;
}
.cell-grabber[state="last-undo"]
{
-moz-binding : url("chrome://vixen/content/history/historyTreeBindings.xml#grabber-last-undo");
width : 10px;
}

View File

@ -0,0 +1,117 @@
<?xml version="1.0"?>
<bindings id="historyTreeItem"
xmlns="http://www.mozilla.org/xbl"
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<binding id="history-tree-cell" extends="chrome://global/content/treeBindings.xml#treecell">
<content>
<xul:box class="cell-grabber" inherits="state,value,crop" flex="1"/>
</content>
<implementation>
<method name="isInBounds">
<parameter name="aEvent"/>
<parameter name="aBoxObject"/>
<body>
<![CDATA[
return aEvent.clientX > aBoxObject.x && aEvent.clientX < aBoxObject.width;
]]>
</body>
</method>
<method name="unhookAttributes">
<body>
<![CDATA[
var tree = document.getElementById("historyTree");
tree.removeAttribute("dragstarttop");
tree.removeAttribute("dragstartbottom");
tree.removeAttribute("dragstartstate");
]]>
</body>
</method>
</implementation>
<handlers>
<handler event="mousedown">
<![CDATA[
var treecell = event.target;
var treecellBoxObject = treecell.boxObject.QueryInterface(Components.interfaces.nsIBoxObject);
var tree = document.getElementById("historyTree");
var treerow = treecell.parentNode;
tree.setAttribute("dragstarttop", treecellBoxObject.y);
tree.setAttribute("dragstartbottom", (treecellBoxObject.y + treecellBoxObject.height));
tree.setAttribute("dragstartstate", treerow.getAttribute("state"));
]]>
</handler>
<handler event="mousemove">
<![CDATA[
var tree = document.getElementById("historyTree");
var dragStartTop = tree.getAttribute("dragstarttop");
var dragStartBottom = tree.getAttribute("dragstartbottom");
if (dragStartTop || dragStartBottom) {
var treecell = event.target;
var treerow = treecell.parentNode;
var treecellBO = treecell.boxObject.QueryInterface(Components.interfaces.nsIBoxObject);
if (tree.getAttribute("currentnodetop") == treecellBO.y)
return;
tree.setAttribute("currentnodetop", treecellBO.y);
if (!this.isInBounds(event, treecellBO) ||
tree.getAttribute("dragstartstate") != "last-undo")
return;
if (event.clientY < dragStartTop)
requestUndo();
else if (event.clientY > dragStartBottom)
requestRedo();
tree.setAttribute("dragstarttop", treecellBO.y);
tree.setAttribute("dragstartbottom", (treecellBO.y + treecellBO.height));
}
return;
]]>
</handler>
<handler event="mouseup">
<![CDATA[
this.unhookAttributes();
]]>
</handler>
</handlers>
</binding>
<binding id="grabber-last-undo" extends="xul:box">
<content>
<xul:stack class="grabber-stack" flex="1">
<xul:box class="grabber-base">
<xul:spring class="track-left" flex="1"/>
<xul:spring class="track-center"/>
<xul:spring class="track-right" flex="1"/>
<xul:spring class="grabber-right" inherits="state"/>
</xul:box>
<xul:box class="grabber-container">
<xul:box class="grabber-box-1" flex="1">
<xul:box class="grabber-box-2" flex="1"/>
</xul:box>
</xul:box>
</xul:stack>
</content>
</binding>
<binding id="grabber-track" extends="xul:box">
<content>
<xul:spring class="track-left" flex="1"/>
<xul:spring class="track-center" inherits="state"/>
<xul:spring class="track-right" flex="1"/>
<xul:spring class="grabber-right" inherits="state"/>
</content>
</binding>
<binding id="cell-redo" extends="chrome://global/content/treeBindings.xml#treecell">
<content>
<xul:stack class="cell-redo-stack">
<xul:text class="cell-redo-lower" inherits="value,crop"/>
<xul:text class="cell-redo-upper" inherits="value,crop"/>
</xul:stack>
</content>
</binding>
</bindings>

View File

@ -0,0 +1,69 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 2000 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Ben Goodger <ben@netscape.com> (Original Author)
*/
var vxTransactionTable = { };
vxTransactionTable["create-element"] = vxCreateElementTxnConstructor;
vxTransactionTable["change-attribute"] = vxChangeAttributeTxnConstructor;
var vxTransactionDecoder = {
decode: function (aTransactionString)
{
var txns = aTransactionString.split(";");
for (var i = 0; i < txns.length; i++) {
var currTxnName = this.getTransactionName (txns[i]);
var fn = currTxnName == "aggregate-txn" ? this.decodeAggregate
: vxTransactionTable[currTxnName];
fn (txns[i]);
}
},
/*
aggregate-txn::{ mTransactions: [create-element::{
mLocalName: button};,change-attribute::{attributes: [value,id],values: [Button 2
,button_2],removeFlags: [false]};,] };aggregate-txn::{ mTransactions: [create-e
lement::{ mLocalName: button};,change-attribute::{attributes: [value,id],values:
[Button 3,button_3],removeFlags: [false]};,] };
},
*/
decodeAggregate: function (aTransactionString)
{
var txnString = aTransactionString.substring(aTransactionString.indexOf("::"),
aTransactionString.length);
var txns = txnString.split("//");
for (var i = 0; i < txns.length; i++) {
var currTxnName = this.getTransactionName (txns[i]);
var fn = currTxnName == "aggregate-txn" ? this.decodeAggregate
: vxTransactionTable[currTxnName];
fn (txns[i]);
}
},
getTransactionName: function (aTransactionString)
{
return aTransactionString.substring(0, aTransactionString.indexOf("::"));
}
};

View File

@ -0,0 +1,104 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 2000 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
* Ben Goodger <ben@netscape.com> (Original Author)
*/
/*@namespace xul url('http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul');*/
*[moz-vixen="true"]
{
-moz-binding : url("chrome://vixen/content/vfd/editBindings.xml#editBoxBinding");
}
*[moz-vixen="true"][orient="vertical"]
{
-moz-binding : url("chrome://vixen/content/vfd/editBindings.xml#editBoxBinding-vertical");
}
box[moz-vixen="true"]
{
-moz-binding : url("chrome://vixen/content/vfd/editBindings.xml#editBoxBinding-box");
}
box[moz-vixen="true"][orient="vertical"]
{
-moz-binding : url("chrome://vixen/content/vfd/editBindings.xml#editBoxBinding-box-vertical");
}
dropslot
{
-moz-binding : url("chrome://vixen/content/vfd/editBindings.xml#dropslot");
}
grabhandle
{
-moz-binding : url("chrome://vixen/content/vfd/editBindings.xml#grabhandle");
background-color : white;
}
.edit-grabhandle
{
width : 10px;
}
.edit-grabhandle-vertical
{
height : 10px;
}
/**
* XXX - put these here for now.
*/
.edit-children-master
{
border :1px solid blue;
}
.edit-children-dropslot-vertical
{
height : 10px;
background-color : blue;
}
.edit-children-dropslot
{
width : 10px;
background-color : blue;
}
.edit-children-container
{
border : 1px solid red;
}
.edit-expander-dropslot
{
border : 1px solid yellow;
height : 10px;
}
dropslot[dd-dragover="true"]
{
background-color : black;
}

View File

@ -0,0 +1,202 @@
<?xml version="1.0"?>
<bindings id="editModeBindings"
xmlns="http://www.mozilla.org/xbl"
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<binding id="editBoxBinding" extends="xul:box">
<content>
<xul:box class="edit-children-master">
<xul:dropslot class="edit-children-dropslot" type="before"/>
<xul:box class="edit-children-container" ondraggesture="this.startDrag(event);">
<children/>
</xul:box>
</xul:box>
<xul:dropslot flex="1" class="edit-expander-dropslot" type="child"/>
</content>
<implementation>
<method name="startDrag">
<parameter name="aEvent"/>
<body>
<![CDATA[
// XXX refine this
setDragNode(aEvent.target);
aEvent.preventBubble();
]]>
</body>
</method>
</implementation>
<handlers>
<!-- XXX - this is a hack until hyatt learns how to code -->
<handler event="draggesture">
<![CDATA[
this.startDrag(event);
]]>
</handler>
</handlers>
</binding>
<binding id="editBoxBinding-vertical" extends="chrome://vixen/content/vfd/editBindings.xml#editBoxBinding">
<content orient="vertical">
<xul:box class="edit-children-master" orient="vertical">
<xul:dropslot class="edit-children-dropslot-vertical" type="before"/>
<xul:box class="edit-children-container" orient="vertical" ondraggesture="this.startDrag(event);">
<children/>
</xul:box>
</xul:box>
<xul:dropslot flex="1" class="edit-expander-dropslot" type="child"/>
</content>
</binding>
<!-- for non-display elements (includes grab-handle) -->
<binding id="editBoxBinding-box" extends="chrome://vixen/content/vfd/editBindings.xml#editBoxBinding">
<content>
<xul:box class="edit-children-master">
<xul:dropslot class="edit-children-dropslot" type="before"/>
<xul:grabhandle class="edit-grabhandle"/>
<xul:box class="edit-children-container" ondraggesture="this.startDrag(event);">
<children/>
</xul:box>
</xul:box>
<xul:dropslot flex="1" class="edit-expander-dropslot" type="child"/>
</content>
</binding>
<binding id="editBoxBinding-box-vertical" extends="chrome://vixen/content/vfd/editBindings.xml#editBoxBinding-vertical">
<content orient="vertical">
<xul:box class="edit-children-master" orient="vertical">
<xul:dropslot class="edit-children-dropslot-vertical" type="before"/>
<xul:grabhandle class="edit-grabhandle-vertical"/>
<xul:box class="edit-children-container" orient="vertical" ondraggesture="this.startDrag(event);">
<children/>
</xul:box>
</xul:box>
<xul:dropslot flex="1" class="edit-expander-dropslot" type="child"/>
</content>
</binding>
<binding id="dropslot" extends="xul:box">
<content>
<xul:box class="dropslot-box" flex="1"/>
</content>
<implementation>
<property name="dragover">
<getter>
<![CDATA[
return this.getAttribute("dd-dragover");
]]>
</getter>
<setter>
<![CDATA[
this.setAttribute("dd-dragover", val);
return val;
]]>
</setter>
</property>
</implementation>
<handlers>
<handler event="dragover">
<![CDATA[
this.dragover = true;
// Retrieve the Drag Service
const kDragServiceContractID = "@mozilla.org/widget/dragservice;1";
var dragSvc = Components.classes[kDragServiceContractID].getService();
if (!dragSvc) throw Components.results.NS_ERROR_FAILURE;
dragSvc = dragSvc.QueryInterface(Components.interfaces.nsIDragService);
var session = dragSvc.getCurrentSession();
if (session.isDataFlavorSupported("text/unicode")) {
session.canDrop = true;
event.preventBubble();
}
]]>
</handler>
<handler event="dragexit">
<![CDATA[
this.dragover = false;
]]>
</handler>
<handler event="dragdrop">
<![CDATA[
// There are two cases here:
// 1). Dropping a DOM node dragged from within the document.
// The node is stored by the document's VFD Shell. (This is
// because we cannot unwrap DOMNodes from transferables as they
// are not xpconnect savvy).
// 2). Dropping a transaction from a palette or similar. The drop
// handler unwraps the transaction and executes it using the
// drop location as parameters.
if (hasDragData()) {
// case 1 defined above.
// XXX Fix this
var domNode = getDragNode();
// new container
var dropslot = event.originalTarget;
var insertionPt = dropslot.getAttribute("type");
var box = event.target;
switch (insertionPt) {
case "before":
var clonedNode = domNode.cloneNode(true);
box.parentNode.insertBefore(box, clonedNode);
break;
case "child":
var clonedNode = domNode.cloneNode(true);
box.appendChild(clonedNode);
}
domNode.parentNode.removeChild(domNode);
}
else {
// case 2 defined above.
// Retrieve the Drag Service
const kDragServiceContractID = "@mozilla.org/widget/dragservice;1";
var dragSvc = Components.classes[kDragServiceContractID].getService();
if (!dragSvc) throw Components.results.NS_ERROR_FAILURE;
dragSvc = dragSvc.QueryInterface(Components.interfaces.nsIDragService);
var session = dragSvc.getCurrentSession();
var numItems = session.numDropItems;
const ksArrayContractID = "@mozilla.org/supports-array;1";
var sArray = Components.classes[ksArrayContractID].createInstance();
if (!sArray) throw Components.results.NS_ERROR_FAILURE;
sArray = sArray.QueryInterface(Components.interfaces.nsISupportsArray);
for (var i = 0; i < numItems; ++i) {
const kxferableContractID = "@mozilla.org/widget/transferable;1";
var xferable = Components.classes[kxferableContractID].createInstance();
if (!xferable) throw Components.results.NS_ERROR_FAILURE;
xferable = xferable.QueryInterface(Components.interfaces.nsITransferable);
xferable.addDataFlavor("text/unicode");
session.getData(xferable, i);
var data = { };
var flavour = { };
var length = { };
xferable.getTransferData("text/unicode", data, length);
data = data.value.QueryInterface(Components.interfaces.nsISupportsWString);
data = data.data.substring(0, length.value / 2);
dump("*** dropped data = " + data + "\n");
// now execute the transaction using the VFD Shell's
// transaction decoder.
}
}
]]>
</handler>
</handlers>
</binding>
<binding id="grabhandle" extends="xul:box"/>
</bindings>

View File

@ -0,0 +1,19 @@
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://communicator/skin/"?>
<?xml-stylesheet href="chrome://vixen/content/vfd/editBindings.css"?>
<window id="editBindingsTest"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
orient="vertical">
<box moz-vixen="true" orient="vertical" flex="1">
<box><text value="Foopy" style="border: 1px solid green"/><spring flex="1"/></box>
<box><text value="Noopy" style="border: 1px solid green"/><spring flex="1"/></box>
</box>
<box moz-vixen="true" orient="vertical">
<box><text value="Foopy 2" style="border: 1px solid green"/><spring flex="1"/></box>
<box><text value="Noopy 2" style="border: 1px solid green"/><spring flex="1"/></box>
</box>
</window>

View File

@ -76,8 +76,10 @@ vxAggregateTxn.prototype = {
get commandString()
{
var commandString = "aggregate-txn";
// XXX TODO: elaborate
var commandString = "aggregate-txn::{ mTransactions: [";
for (var txn in this.mTransactionList)
commandString += this.mTransactionList[txn].commandString + ",";
commandString += "] };";
return commandString;
}
};

View File

@ -111,11 +111,11 @@ vxChangeAttributeTxn.prototype = {
// XXX TODO: update to support multiple attribute syntax
get commandString()
{
var commandString = "change-attribute,";
/* commandString += this.mRemoveFlag ? "remove," : "set,";
commandString += this.mElement.id + ",";
commandString += this.mAttribute + ",";
commandString += this.mValue;*/
var commandString = "change-attribute::{";
commandString += "attributes: [" + this.mAttributes + "],";
commandString += "values: [" + this.mValues + "],";
commandString += "removeFlags: [" + this.mRemoveFlags + "]";
commandString += "};";
return commandString;
},

View File

@ -89,7 +89,7 @@ vxCreateElementTxn.prototype = {
get commandString()
{
var commandString = "create-element";
var commandString = "create-element::{ mLocalName: " + this.mLocalName + "};";
return commandString;
},

View File

@ -195,6 +195,7 @@ vxVFDTransactionManager.prototype =
}
}
}
};
/**

View File

@ -19,11 +19,16 @@ vixen.jar:
content/vixen/vfd/vxCreateElementTxn.js (content/vfd/vxCreateElementTxn.js)
content/vixen/vfd/vxVFDSelectionManager.js (content/vfd/vxVFDSelectionManager.js)
content/vixen/vfd/vxVFDTransactionManager.js (content/vfd/vxVFDTransactionManager.js)
content/vixen/vfd/editBindings.xml (content/vfd/editBindings.xml)
content/vixen/vfd/editBindings.css (content/vfd/editBindings.css)
content/vixen/vfd/editBindingsTest.xul (content/vfd/editBindingsTest.xul)
content/vixen/txmgr/vxTransactionDataSource.js (content/txmgr/vxTransactionDataSource.js);
content/vixen/vfd/vxAggregateTxn.js (content/vfd/vxAggregateTxn.js)
content/vixen/vfd/vxBaseTxn.js (content/vfd/vxBaseTxn.js)
content/vixen/history/history.xul (content/history/history.xul)
content/vixen/history/history.js (content/history/history.js)
content/vixen/history/historyTreeBindings.xml (content/history/historyTreeBindings.xml)
content/vixen/history/historyContent.css (content/history/historyContent.css)
skin/modern/vixen/contents.rdf (skin/contents.rdf)
skin/modern/vixen/vfdScratch.css (skin/vfdScratch.css)
skin/modern/vixen/history/history.css (skin/history/history.css)

View File

@ -21,6 +21,12 @@
* Ben Goodger <ben@netscape.com> (Original Author)
*/
.transaction-row
{
border : none;
height : 20px;
}
.transaction-row[state="undo"]
{
background-color : window;
@ -45,6 +51,101 @@
#historyKids
{
background-color : appworkspace;
background-color : appworkspace;
}
.cell-grabber
{
background-color : threedface;
border-right : 1px solid threedface;
}
.cell-grabber[state="redo"]
{
border-right : 1px solid threedhighlight;
}
.grabber-right
{
border-right : 1px solid threedhighlight;
}
.grabber-right[state="redo"]
{
border-right : 1px solid threedshadow;
}
.grabber-box-1
{
background-color : threedface;
border-left : 1px solid threedface;
border-top : 1px solid threedface;
border-right : 1px solid threeddarkshadow;
border-bottom : 1px solid threeddarkshadow;
}
.grabber-box-2
{
border-left : 1px solid threedhighlight;
border-top : 1px solid threedhighlight;
border-bottom : 1px solid threedshadow;
border-right : 1px solid threedshadow;
}
.grabber-container
{
padding : 2px 2px 2px 1px;
}
.track-left
{
border-right : 1px solid threedshadow;
}
.track-right
{
border-left : 1px solid threedhighlight;
}
.track-center
{
background-color : appworkspace;
width : 1px;
}
.track-center[state="redo"]
{
background-color : threedface;
}
.treecell-history-cell
{
border : 1px solid transparent;
}
tree:focus > treechildren treeitem[selected="true"][current="true"] > treerow
{
border : none;
}
tree:focus > treechildren treeitem[selected="true"][current="true"] > treerow > .treecell-history-cell
{
border : 1px dotted captiontext;
}
.treecell-history-cell[state="redo"]
{
-moz-binding : url("chrome://vixen/content/history/historyTreeBindings.xml#cell-redo");
}
.cell-redo-upper
{
margin : 0px 1px 1px 0px;
color : threedshadow;
}
.cell-redo-lower
{
margin : 1px 0px 0px 1px;
color : threedhighlight;
}