gecko-dev/mailnews/import/resources/content/fieldMapImport.js

512 lines
14 KiB
JavaScript

var importService = 0;
var fieldMap = null;
var transferType = null;
var recordNum = 0;
var amAtEnd = false;
var addInterface = null;
var dialogResult = null;
var dragStart = false;
var dragData = null;
function OnLoadFieldMapImport()
{
top.importService = Components.classes["@mozilla.org/import/import-service;1"].getService();
top.importService = top.importService.QueryInterface(Components.interfaces.nsIImportService);
top.transferType = "moz/fieldmap";
top.recordNum = 0;
// We need a field map object...
// assume we have one passed in? or just make one?
if (window.arguments && window.arguments[0]) {
top.fieldMap = window.arguments[0].fieldMap;
top.addInterface = window.arguments[0].addInterface;
top.dialogResult = window.arguments[0].result;
}
if (top.fieldMap == null) {
top.fieldMap = top.importService.CreateNewFieldMap();
top.fieldMap.DefaultFieldMap( top.fieldMap.numMozFields);
}
doSetOKCancel( FieldImportOKButton, 0);
ListFields();
OnNextRecord();
}
function SetDivText(id, text)
{
var div = document.getElementById(id);
if ( div )
{
if ( div.childNodes.length == 0 )
{
var textNode = document.createTextNode(text);
div.appendChild(textNode);
}
else if ( div.childNodes.length == 1 )
div.childNodes[0].nodeValue = text;
}
}
function FieldSelectionChanged()
{
var tree = document.getElementById('fieldList');
if ( tree && tree.selectedItems && (tree.selectedItems.length == 1) )
{
}
}
function IndexInMap( index)
{
var count = top.fieldMap.mapSize;
var i;
for (i = 0; i < count; i++) {
if (top.fieldMap.GetFieldMap( i) == index)
return( true);
}
return( false);
}
function ListFields() {
if (top.fieldMap == null)
return;
var body = document.getElementById("fieldBody");
var count = top.fieldMap.mapSize;
var index;
var i;
for (i = 0; i < count; i++) {
index = top.fieldMap.GetFieldMap( i);
AddFieldToList( body, top.fieldMap.GetFieldDescription( index), index, top.fieldMap.GetFieldActive( i));
}
count = top.fieldMap.numMozFields;
for (i = 0; i < count; i++) {
if (!IndexInMap( i))
AddFieldToList( body, top.fieldMap.GetFieldDescription( i), i, false);
}
}
function CreateField( name, index, on, cBoxIndex)
{
var item = document.createElement('treeitem');
var row = document.createElement('treerow');
var cell = document.createElement('treecell');
cell.setAttribute('label', name);
item.setAttribute('field-index', index);
var cCell = document.createElement( 'treecell');
var cBox = document.createElement( 'checkbox');
if (on == true)
cBox.setAttribute( 'checked', "true");
cBox.setAttribute( 'label', name);
cCell.appendChild( cBox);
cCell.setAttribute( 'allowevents', "true");
row.appendChild( cCell);
/* row.appendChild(cell); */
cell = document.createElement( 'treecell');
cell.setAttribute( "class", "importsampledata");
cell.setAttribute( 'label', " ");
cell.setAttribute( 'noDrag', "true");
row.appendChild( cell);
item.appendChild(row);
return( item);
}
function AddFieldToList(body, name, index, on)
{
var item = CreateField( name, index, on, body.childNodes.length);
body.appendChild(item);
}
function BeginDrag( event)
{
top.dragStart = false;
var tree = document.getElementById("fieldList");
if ( event.target == tree ) {
return( true); // continue propagating the event
}
if (!tree) {
return( false);
}
var dragService = Components.classes["@mozilla.org/widget/dragservice;1"].getService();
if ( dragService ) dragService = dragService.QueryInterface(Components.interfaces.nsIDragService);
if ( !dragService ) {
return(false);
}
var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance();
if ( trans ) trans = trans.QueryInterface(Components.interfaces.nsITransferable);
if ( !trans ) {
return(false);
}
var genData = Components.classes["@mozilla.org/supports-wstring;1"].createInstance();
if ( genData ) genData = genData.QueryInterface(Components.interfaces.nsISupportsWString);
if (!genData) {
return(false);
}
// trans.addDataFlavor( "text/unicode");
trans.addDataFlavor( top.transferType);
// the index is on the <treeitem> which is two levels above the <treecell> which is
// the target of the event.
if (event.target.getAttribute( 'noDrag') == "true") {
return( false);
}
var index = event.target.parentNode.parentNode.getAttribute("field-index");
if (!index)
index = event.target.parentNode.parentNode.parentNode.getAttribute( "field-index");
if (!index)
return( false);
var indexStr = ("" + index);
genData.data = indexStr;
// trans.setTransferData ( "text/unicode", genData, indexStr.length * 2);
trans.setTransferData ( top.transferType, genData, indexStr.length * 2);
var transArray = Components.classes["@mozilla.org/supports-array;1"].createInstance();
if ( transArray ) transArray = transArray.QueryInterface(Components.interfaces.nsISupportsArray);
if ( !transArray ) {
return(false);
}
// put it into the transferable as an |nsISupports|
var genTrans = trans.QueryInterface(Components.interfaces.nsISupports);
transArray.AppendElement(genTrans);
var nsIDragService = Components.interfaces.nsIDragService;
top.dragStart = true;
dragService.invokeDragSession ( event.target, transArray, null, nsIDragService.DRAGDROP_ACTION_MOVE);
return( false); // don't propagate the event if a drag has begun
}
function SetRow( row, dstIndex, dstBox, dstField)
{
row.setAttribute( 'field-index', dstIndex);
if (dstBox == true) {
row.firstChild.firstChild.firstChild.checked = true;
}
else {
row.firstChild.firstChild.firstChild.checked = false;
}
/* row.firstChild.childNodes[1].setAttribute( "label", dstField); */
row.firstChild.firstChild.firstChild.setAttribute( 'label', dstField);
}
function AssignRow( toRow, fromRow)
{
/*
SetRow( toRow, fromRow.getAttribute( 'field-index'),
fromRow.firstChild.firstChild.firstChild.checked,
fromRow.firstChild.childNodes[1].getAttribute( "label"));
*/
SetRow( toRow, fromRow.getAttribute( 'field-index'),
fromRow.firstChild.firstChild.firstChild.checked,
fromRow.firstChild.firstChild.firstChild.getAttribute( "label"));
}
function FindRowFromIndex( body, index)
{
for (var i = 0; i < body.childNodes.length; i++) {
if (body.childNodes[i].getAttribute( 'field-index') == index)
return( i);
}
return( -1);
}
function FindRowFromItem( body, item)
{
for (var i = 0; i < body.childNodes.length; i++) {
if (body.childNodes[i] == item)
return( i);
}
return( -1);
}
function DropOnTree( event)
{
var treeRoot = document.getElementById("fieldList");
if (!treeRoot) return(false);
// target is the <treecell>, and the <treeitem> is two levels above
var treeItem = event.target.parentNode.parentNode;
if (!treeItem) return(false);
// get drop hint attributes
var dropBefore = treeItem.getAttribute("dd-droplocation");
var dropOn = treeItem.getAttribute("dd-dropon");
// calculate drop action
var dropAction;
if (dropBefore == "true") dropAction = "before";
else if (dropOn == "true") dropAction = "on";
else dropAction = "after";
dump( "DropAction: " + dropAction + "\n");
// calculate parent container node
/* bookmarks.js uses this, not sure what it's for???
var containerItem = treeItem;
if (dropAction != "on")
containerItem = treeItem.parentNode.parentNode;
*/
var dragService = Components.classes["@mozilla.org/widget/dragservice;1"].getService();
if ( dragService ) dragService = dragService.QueryInterface(Components.interfaces.nsIDragService);
if ( !dragService ) return(false);
var dragSession = dragService.getCurrentSession();
if ( !dragSession ) return(false);
var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance();
if ( trans ) trans = trans.QueryInterface(Components.interfaces.nsITransferable);
if ( !trans ) return(false);
trans.addDataFlavor( top.transferType);
// trans.addDataFlavor( "text/unicode");
var body = document.getElementById( "fieldBody");
if (!body)
return( false);
for ( var i = 0; i < dragSession.numDropItems; ++i )
{
dragSession.getData ( trans, i );
var dataObj = new Object();
var bestFlavor = new Object();
var len = new Object();
try {
trans.getAnyTransferData( bestFlavor, dataObj, len);
if ( dataObj ) {
dataObj = dataObj.value.QueryInterface(Components.interfaces.nsISupportsWString);
}
if ( !dataObj ) {
continue;
}
var fIndex = parseInt( dataObj.data);
dump( "Source row: " + fIndex + "\n");
// so now what, move the given row to the new position!
// find the source row index
var srcRow = FindRowFromIndex( body, fIndex);
if (srcRow < 0) {
dump( "*** Error finding source row\n");
continue;
}
var dstRow = FindRowFromItem( body, treeItem);
if (dstRow < 0) {
dump( "*** Error finding destination row\n");
continue;
}
// always do before unless we can't
if (dropAction == "on" || dropAction == "after") {
dstRow++;
if (dstRow >= body.childNodes.length) {
if (srcRow == (body.childNodes.length - 1))
continue;
dstRow = -1;
}
}
var maxIndex = body.childNodes.length - 1;
var dstBox = body.childNodes[srcRow].firstChild.firstChild.firstChild.checked;
var dstField = body.childNodes[srcRow].firstChild.firstChild.firstChild.getAttribute( 'label');
var dstIndex = body.childNodes[srcRow].getAttribute( 'field-index');
dump( "FieldDrag from " + srcRow + " to " + dstRow + "\n");
if (dstRow < 0) {
// remove the row and append it to the end!
// Move srcRow to the end!
while (srcRow < maxIndex) {
AssignRow( body.childNodes[srcRow], body.childNodes[srcRow + 1]);
srcRow++;
}
SetRow( body.childNodes[maxIndex], dstIndex, dstBox, dstField);
}
else {
if (dstRow == srcRow)
continue;
if (srcRow < dstRow)
dstRow--;
if (dstRow == srcRow)
continue;
if (dstRow < srcRow) {
// move dstRow down to srcRow
while (dstRow < srcRow) {
AssignRow( body.childNodes[srcRow], body.childNodes[srcRow - 1]);
srcRow--;
}
}
else {
// move dstRow up to srcRow
while (srcRow < dstRow) {
AssignRow( body.childNodes[srcRow], body.childNodes[srcRow + 1]);
srcRow++;
}
}
SetRow( body.childNodes[dstRow], dstIndex, dstBox, dstField);
}
}
catch( ex) {
dump( "Caught drag exception in DropOnTree\n");
dump( ex);
dump( "\n");
}
}
return(false);
}
function DragOverTree( event)
{
if (!top.dragStart)
return( false);
var validFlavor = false;
var dragSession = null;
var retVal = true;
var dragService = Components.classes["@mozilla.org/widget/dragservice;1"].getService();
if ( dragService ) dragService = dragService.QueryInterface(Components.interfaces.nsIDragService);
if ( !dragService ) return(false);
dragSession = dragService.getCurrentSession();
if ( !dragSession ) return(false);
if ( dragSession.isDataFlavorSupported( top.transferType) ) validFlavor = true;
// if ( dragSession.isDataFlavorSupported( "text/unicode") ) validFlavor = true;
if (event.target == document.getElementById( "fieldBody")) return( false);
// touch the attribute on the rowgroup to trigger the repaint with the drop feedback.
if ( validFlavor )
{
//XXX this is really slow and likes to refresh N times per second.
var rowGroup = event.target.parentNode.parentNode;
rowGroup.setAttribute ( "dd-triggerrepaint", 0 );
dragSession.canDrop = true;
// necessary??
retVal = false; // do not propagate message
}
return(retVal);
}
function ShowSampleData( data)
{
var fBody = document.getElementById( "fieldBody");
var fields = data.split( "\n");
for (var i = 0; i < fBody.childNodes.length; i++) {
if (i < fields.length) {
// fBody.childNodes[i].firstChild.childNodes[2].setAttribute( 'label', fields[i]);
fBody.childNodes[i].firstChild.childNodes[1].setAttribute( 'label', fields[i]);
}
else {
// fBody.childNodes[i].firstChild.childNodes[2].setAttribute( 'label', " ");
fBody.childNodes[i].firstChild.childNodes[1].setAttribute( 'label', " ");
}
}
}
function FetchSampleData()
{
if (!top.addInterface)
return( false);
var num = top.recordNum - 1;
if (num < 0)
num = 0;
var data = top.addInterface.GetData( "sampleData-"+num);
var result = false;
if (data != null) {
data = data.QueryInterface( Components.interfaces.nsISupportsWString);
if (data != null) {
ShowSampleData( data.data);
result = true;
}
}
return( result);
}
function OnPreviousRecord()
{
if (top.recordNum <= 1)
return;
top.recordNum--;
top.amAtEnd = false;
if (FetchSampleData()) {
document.getElementById('recordNumber').setAttribute('value', ("" + top.recordNum));
}
}
function OnNextRecord()
{
if (top.amAtEnd)
return;
top.recordNum++;
if (!FetchSampleData()) {
top.amAtEnd = true;
top.recordNum--;
}
else
document.getElementById('recordNumber').setAttribute('value', ("" + top.recordNum));
}
function FieldImportOKButton()
{
var body = document.getElementById( "fieldBody");
var max = body.childNodes.length;
var fIndex;
var on;
for (var i = 0; i < max; i++) {
fIndex = body.childNodes[i].getAttribute( 'field-index');
on = body.childNodes[i].firstChild.firstChild.firstChild.checked;
top.fieldMap.SetFieldMap( i, fIndex);
if (on == true)
top.fieldMap.SetFieldActive( i, true);
else
top.fieldMap.SetFieldActive( i, false);
}
top.dialogResult.ok = true;
return true;
}