home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 January / 01_02.iso / software / netscape62win / mail.xpi / bin / chrome / messenger.jar / content / messenger / fieldMapImport.js < prev    next >
Text File  |  2001-03-21  |  15KB  |  512 lines

  1. var importService = 0;
  2. var fieldMap = null;
  3. var transferType = null;
  4. var recordNum = 0;
  5. var amAtEnd = false;
  6. var addInterface = null;
  7. var dialogResult = null;
  8. var dragStart = false;
  9. var dragData = null;
  10.  
  11. function OnLoadFieldMapImport()
  12. {
  13.   top.importService = Components.classes["@mozilla.org/import/import-service;1"].getService();
  14.   top.importService = top.importService.QueryInterface(Components.interfaces.nsIImportService);
  15.   top.transferType = "moz/fieldmap";
  16.   top.recordNum = 0;
  17.  
  18.   // We need a field map object...
  19.   // assume we have one passed in? or just make one?
  20.   if (window.arguments && window.arguments[0]) {
  21.     top.fieldMap = window.arguments[0].fieldMap;
  22.     top.addInterface = window.arguments[0].addInterface;
  23.     top.dialogResult = window.arguments[0].result;
  24.   }
  25.   if (top.fieldMap == null) {
  26.     top.fieldMap = top.importService.CreateNewFieldMap();
  27.     top.fieldMap.DefaultFieldMap( top.fieldMap.numMozFields);
  28.   }
  29.  
  30.   doSetOKCancel( FieldImportOKButton, 0);
  31.  
  32.   ListFields();
  33.   OnNextRecord();
  34. }
  35.  
  36. function SetDivText(id, text)
  37. {
  38.   var div = document.getElementById(id);
  39.  
  40.   if ( div )
  41.   {
  42.     if ( div.childNodes.length == 0 )
  43.     {
  44.       var textNode = document.createTextNode(text);
  45.       div.appendChild(textNode);
  46.     }
  47.     else if ( div.childNodes.length == 1 )
  48.       div.childNodes[0].nodeValue = text;
  49.   }
  50. }
  51.  
  52.  
  53. function FieldSelectionChanged()
  54. {
  55.   var tree = document.getElementById('fieldList');
  56.   if ( tree && tree.selectedItems && (tree.selectedItems.length == 1) )
  57.   {
  58.   }
  59. }
  60.  
  61.  
  62. function IndexInMap( index)
  63. {
  64.   var count = top.fieldMap.mapSize;
  65.   var i;
  66.   for (i = 0; i < count; i++) {
  67.     if (top.fieldMap.GetFieldMap( i) == index)
  68.       return( true);
  69.   }
  70.  
  71.   return( false);
  72. }
  73.  
  74. function ListFields() {
  75.   if (top.fieldMap == null)
  76.     return;
  77.  
  78.   var body = document.getElementById("fieldBody");
  79.   var count = top.fieldMap.mapSize;
  80.   var index;
  81.   var i;
  82.   for (i = 0; i < count; i++) {
  83.     index = top.fieldMap.GetFieldMap( i);
  84.     AddFieldToList( body, top.fieldMap.GetFieldDescription( index), index, top.fieldMap.GetFieldActive( i));
  85.   }
  86.  
  87.   count = top.fieldMap.numMozFields;
  88.   for (i = 0; i < count; i++) {
  89.     if (!IndexInMap( i))
  90.       AddFieldToList( body, top.fieldMap.GetFieldDescription( i), i, false);
  91.   }
  92. }
  93.  
  94.  
  95. function CreateField( name, index, on, cBoxIndex)
  96. {
  97.   var item = document.createElement('treeitem');
  98.   var row = document.createElement('treerow');
  99.   var cell = document.createElement('treecell');
  100.   cell.setAttribute('label', name);
  101.   item.setAttribute('field-index', index);
  102.  
  103.   var cCell = document.createElement( 'treecell');
  104.   var cBox = document.createElement( 'checkbox');
  105.   if (on == true)
  106.     cBox.setAttribute( 'checked', "true");
  107.   cBox.setAttribute( 'label', name);
  108.  
  109.   cCell.appendChild( cBox);
  110.   cCell.setAttribute( 'allowevents', "true");
  111.  
  112.   row.appendChild( cCell);
  113.   /* row.appendChild(cell); */
  114.  
  115.   cell = document.createElement( 'treecell');
  116.   cell.setAttribute( "class", "importsampledata");
  117.   cell.setAttribute( 'label', " ");
  118.   cell.setAttribute( 'noDrag', "true");
  119.  
  120.   row.appendChild( cell);
  121.  
  122.   item.appendChild(row);
  123.  
  124.   return( item);
  125. }
  126.  
  127. function AddFieldToList(body, name, index, on)
  128. {
  129.   var item = CreateField( name, index, on, body.childNodes.length);
  130.   body.appendChild(item);
  131. }
  132.  
  133. function BeginDrag( event)
  134. {
  135.   top.dragStart = false;
  136.  
  137.   var tree = document.getElementById("fieldList");
  138.   if ( event.target == tree ) {
  139.     return( true);          // continue propagating the event
  140.     }
  141.  
  142.   if (!tree) {
  143.     return( false);
  144.   }
  145.  
  146.   var dragService = Components.classes["@mozilla.org/widget/dragservice;1"].getService();
  147.   if ( dragService ) dragService = dragService.QueryInterface(Components.interfaces.nsIDragService);
  148.   if ( !dragService ) {
  149.     return(false);
  150.   }
  151.  
  152.   var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance();
  153.   if ( trans ) trans = trans.QueryInterface(Components.interfaces.nsITransferable);
  154.   if ( !trans ) {
  155.     return(false);
  156.   }
  157.  
  158.   var genData = Components.classes["@mozilla.org/supports-wstring;1"].createInstance();
  159.   if ( genData ) genData = genData.QueryInterface(Components.interfaces.nsISupportsWString);
  160.   if (!genData) {
  161.     return(false);
  162.   }
  163.  
  164.     // trans.addDataFlavor( "text/unicode");
  165.     trans.addDataFlavor( top.transferType);
  166.  
  167.   // the index is on the <treeitem> which is two levels above the <treecell> which is
  168.   // the target of the event.
  169.   if (event.target.getAttribute( 'noDrag') == "true") {
  170.     return( false);
  171.   }
  172.  
  173.   var index = event.target.parentNode.parentNode.getAttribute("field-index");
  174.   if (!index)
  175.     index = event.target.parentNode.parentNode.parentNode.getAttribute( "field-index");
  176.   if (!index)
  177.     return( false);
  178.  
  179.   var indexStr = ("" + index);
  180.   genData.data = indexStr;
  181.  
  182.   // trans.setTransferData ( "text/unicode", genData, indexStr.length * 2);
  183.   trans.setTransferData ( top.transferType, genData, indexStr.length * 2);
  184.  
  185.   var transArray = Components.classes["@mozilla.org/supports-array;1"].createInstance();
  186.   if ( transArray ) transArray = transArray.QueryInterface(Components.interfaces.nsISupportsArray);
  187.   if ( !transArray )  {
  188.     return(false);
  189.   }
  190.  
  191.   // put it into the transferable as an |nsISupports|
  192.   var genTrans = trans.QueryInterface(Components.interfaces.nsISupports);
  193.   transArray.AppendElement(genTrans);
  194.  
  195.   var nsIDragService = Components.interfaces.nsIDragService;
  196.   top.dragStart = true;
  197.  
  198.   dragService.invokeDragSession ( event.target, transArray, null, nsIDragService.DRAGDROP_ACTION_MOVE);
  199.  
  200.  
  201.   return( false);  // don't propagate the event if a drag has begun
  202. }
  203.  
  204.  
  205. function SetRow( row, dstIndex, dstBox, dstField)
  206. {
  207.   row.setAttribute( 'field-index', dstIndex);
  208.   if (dstBox == true) {
  209.     row.firstChild.firstChild.firstChild.checked = true;
  210.   }
  211.   else {
  212.     row.firstChild.firstChild.firstChild.checked = false;
  213.   }
  214.  
  215.   /* row.firstChild.childNodes[1].setAttribute( "label", dstField); */
  216.  
  217.   row.firstChild.firstChild.firstChild.setAttribute( 'label', dstField);
  218. }
  219.  
  220.  
  221. function AssignRow( toRow, fromRow)
  222. {
  223.   /*
  224.   SetRow( toRow,  fromRow.getAttribute( 'field-index'),
  225.           fromRow.firstChild.firstChild.firstChild.checked,
  226.           fromRow.firstChild.childNodes[1].getAttribute( "label"));
  227.   */
  228.   SetRow( toRow,  fromRow.getAttribute( 'field-index'),
  229.           fromRow.firstChild.firstChild.firstChild.checked,
  230.           fromRow.firstChild.firstChild.firstChild.getAttribute( "label"));
  231. }
  232.  
  233.  
  234. function FindRowFromIndex( body, index)
  235. {
  236.   for (var i = 0; i < body.childNodes.length; i++) {
  237.     if (body.childNodes[i].getAttribute( 'field-index') == index)
  238.       return( i);
  239.   }
  240.  
  241.   return( -1);
  242. }
  243.  
  244. function FindRowFromItem( body, item)
  245. {
  246.   for (var i = 0; i < body.childNodes.length; i++) {
  247.     if (body.childNodes[i] == item)
  248.       return( i);
  249.   }
  250.  
  251.   return( -1);
  252. }
  253.  
  254. function DropOnTree( event)
  255. {
  256.  
  257.   var treeRoot = document.getElementById("fieldList");
  258.   if (!treeRoot)  return(false);
  259.  
  260.   // target is the <treecell>, and the <treeitem> is two levels above
  261.   var treeItem = event.target.parentNode.parentNode;
  262.   if (!treeItem)  return(false);
  263.  
  264.   // get drop hint attributes
  265.   var dropBefore = treeItem.getAttribute("dd-droplocation");
  266.   var dropOn = treeItem.getAttribute("dd-dropon");
  267.  
  268.   // calculate drop action
  269.   var dropAction;
  270.   if (dropBefore == "true") dropAction = "before";
  271.   else if (dropOn == "true")  dropAction = "on";
  272.   else        dropAction = "after";
  273.  
  274.   dump( "DropAction: " + dropAction + "\n");
  275.  
  276.   // calculate parent container node
  277.   /* bookmarks.js uses this, not sure what it's for???
  278.   var containerItem = treeItem;
  279.   if (dropAction != "on")
  280.     containerItem = treeItem.parentNode.parentNode;
  281.   */
  282.  
  283.   var dragService = Components.classes["@mozilla.org/widget/dragservice;1"].getService();
  284.   if ( dragService ) dragService = dragService.QueryInterface(Components.interfaces.nsIDragService);
  285.   if ( !dragService ) return(false);
  286.  
  287.   var dragSession = dragService.getCurrentSession();
  288.   if ( !dragSession ) return(false);
  289.  
  290.   var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance();
  291.   if ( trans ) trans = trans.QueryInterface(Components.interfaces.nsITransferable);
  292.   if ( !trans )   return(false);
  293.   trans.addDataFlavor( top.transferType);
  294.   // trans.addDataFlavor( "text/unicode");
  295.  
  296.   var body = document.getElementById( "fieldBody");
  297.   if (!body)
  298.     return( false);
  299.  
  300.   for ( var i = 0; i < dragSession.numDropItems; ++i )
  301.   {
  302.     dragSession.getData ( trans, i );
  303.     var dataObj = new Object();
  304.     var bestFlavor = new Object();
  305.     var len = new Object();
  306.     try {
  307.       trans.getAnyTransferData( bestFlavor, dataObj, len);
  308.       if ( dataObj )  {
  309.         dataObj = dataObj.value.QueryInterface(Components.interfaces.nsISupportsWString);
  310.       }
  311.       if ( !dataObj ) {
  312.         continue;
  313.       }
  314.  
  315.       var fIndex = parseInt( dataObj.data);
  316.  
  317.       dump( "Source row: " + fIndex + "\n");
  318.  
  319.       // so now what, move the given row to the new position!
  320.       // find the source row index
  321.       var srcRow = FindRowFromIndex( body, fIndex);
  322.       if (srcRow < 0) {
  323.         dump( "*** Error finding source row\n");
  324.         continue;
  325.       }
  326.       var dstRow = FindRowFromItem( body, treeItem);
  327.       if (dstRow < 0) {
  328.         dump( "*** Error finding destination row\n");
  329.         continue;
  330.       }
  331.  
  332.       // always do before unless we can't
  333.       if (dropAction == "on" || dropAction == "after") {
  334.         dstRow++;
  335.         if (dstRow >= body.childNodes.length) {
  336.           if (srcRow == (body.childNodes.length - 1))
  337.             continue;
  338.           dstRow = -1;
  339.         }
  340.       }
  341.  
  342.       var maxIndex = body.childNodes.length - 1;
  343.       var dstBox = body.childNodes[srcRow].firstChild.firstChild.firstChild.checked;
  344.       var dstField = body.childNodes[srcRow].firstChild.firstChild.firstChild.getAttribute( 'label');
  345.       var dstIndex = body.childNodes[srcRow].getAttribute( 'field-index');
  346.  
  347.       dump( "FieldDrag from " + srcRow + " to " + dstRow + "\n");
  348.  
  349.       if (dstRow < 0) {
  350.         // remove the row and append it to the end!
  351.         // Move srcRow to the end!
  352.         while (srcRow < maxIndex) {
  353.           AssignRow( body.childNodes[srcRow], body.childNodes[srcRow + 1]);
  354.           srcRow++;
  355.         }
  356.  
  357.         SetRow( body.childNodes[maxIndex], dstIndex, dstBox, dstField);
  358.       }
  359.       else {
  360.         if (dstRow == srcRow)
  361.           continue;
  362.         if (srcRow < dstRow)
  363.           dstRow--;
  364.         if (dstRow == srcRow)
  365.           continue;
  366.  
  367.         if (dstRow < srcRow) {
  368.           // move dstRow down to srcRow
  369.           while (dstRow < srcRow) {
  370.             AssignRow( body.childNodes[srcRow], body.childNodes[srcRow - 1]);
  371.             srcRow--;
  372.           }
  373.         }
  374.         else {
  375.           // move dstRow up to srcRow
  376.           while (srcRow < dstRow) {
  377.             AssignRow( body.childNodes[srcRow], body.childNodes[srcRow + 1]);
  378.             srcRow++;
  379.           }
  380.         }
  381.         SetRow( body.childNodes[dstRow], dstIndex, dstBox, dstField);
  382.       }
  383.  
  384.     }
  385.     catch( ex) {
  386.       dump( "Caught drag exception in DropOnTree\n");
  387.       dump( ex);
  388.       dump( "\n");
  389.     }
  390.   }
  391.  
  392.   return(false);
  393. }
  394.  
  395.  
  396. function DragOverTree( event)
  397. {
  398.   if (!top.dragStart)
  399.     return( false);
  400.  
  401.   var validFlavor = false;
  402.   var dragSession = null;
  403.   var retVal = true;
  404.  
  405.   var dragService = Components.classes["@mozilla.org/widget/dragservice;1"].getService();
  406.   if ( dragService ) dragService = dragService.QueryInterface(Components.interfaces.nsIDragService);
  407.   if ( !dragService ) return(false);
  408.  
  409.   dragSession = dragService.getCurrentSession();
  410.   if ( !dragSession ) return(false);
  411.  
  412.   if ( dragSession.isDataFlavorSupported( top.transferType) ) validFlavor = true;
  413.   // if ( dragSession.isDataFlavorSupported( "text/unicode") )  validFlavor = true;
  414.  
  415.   if (event.target == document.getElementById( "fieldBody")) return( false);
  416.  
  417.   // touch the attribute on the rowgroup to trigger the repaint with the drop feedback.
  418.   if ( validFlavor )
  419.   {
  420.     //XXX this is really slow and likes to refresh N times per second.
  421.     var rowGroup = event.target.parentNode.parentNode;
  422.     rowGroup.setAttribute ( "dd-triggerrepaint", 0 );
  423.     dragSession.canDrop = true;
  424.     // necessary??
  425.     retVal = false; // do not propagate message
  426.   }
  427.   return(retVal);
  428. }
  429.  
  430. function ShowSampleData( data)
  431. {
  432.   var fBody = document.getElementById( "fieldBody");
  433.   var fields = data.split( "\n");
  434.   for (var i = 0; i < fBody.childNodes.length; i++) {
  435.     if (i < fields.length) {
  436.       // fBody.childNodes[i].firstChild.childNodes[2].setAttribute( 'label', fields[i]);
  437.       fBody.childNodes[i].firstChild.childNodes[1].setAttribute( 'label', fields[i]);
  438.     }
  439.     else {
  440.       // fBody.childNodes[i].firstChild.childNodes[2].setAttribute( 'label', " ");
  441.       fBody.childNodes[i].firstChild.childNodes[1].setAttribute( 'label', " ");
  442.     }
  443.   }
  444.  
  445. }
  446.  
  447. function FetchSampleData()
  448. {
  449.   if (!top.addInterface)
  450.     return( false);
  451.  
  452.   var num = top.recordNum - 1;
  453.   if (num < 0)
  454.     num = 0;
  455.   var data = top.addInterface.GetData( "sampleData-"+num);
  456.   var result = false;
  457.   if (data != null) {
  458.     data = data.QueryInterface( Components.interfaces.nsISupportsWString);
  459.     if (data != null) {
  460.       ShowSampleData( data.data);
  461.       result = true;
  462.     }
  463.   }
  464.  
  465.   return( result);
  466. }
  467.  
  468. function OnPreviousRecord()
  469. {
  470.   if (top.recordNum <= 1)
  471.     return;
  472.   top.recordNum--;
  473.   top.amAtEnd = false;
  474.   if (FetchSampleData()) {
  475.     document.getElementById('recordNumber').setAttribute('value', ("" + top.recordNum));
  476.   }
  477. }
  478.  
  479. function OnNextRecord()
  480. {
  481.   if (top.amAtEnd)
  482.     return;
  483.   top.recordNum++;
  484.   if (!FetchSampleData()) {
  485.     top.amAtEnd = true;
  486.     top.recordNum--;
  487.   }
  488.   else
  489.     document.getElementById('recordNumber').setAttribute('value', ("" + top.recordNum));
  490. }
  491.  
  492. function FieldImportOKButton()
  493. {
  494.   var body = document.getElementById( "fieldBody");
  495.   var max = body.childNodes.length;
  496.   var fIndex;
  497.   var on;
  498.   for (var i = 0; i < max; i++) {
  499.     fIndex = body.childNodes[i].getAttribute( 'field-index');
  500.     on = body.childNodes[i].firstChild.firstChild.firstChild.checked;
  501.     top.fieldMap.SetFieldMap( i, fIndex);
  502.     if (on == true)
  503.       top.fieldMap.SetFieldActive( i, true);
  504.     else
  505.       top.fieldMap.SetFieldActive( i, false);
  506.   }
  507.  
  508.   top.dialogResult.ok = true;
  509.  
  510.   return true;
  511. }
  512.