draw.js
author Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
Mon Dec 21 23:52:38 2009 +0000 (2 months ago)
changeset 123 bc4c90cbd778
parent 56ed61272b607d
permissions -rw-r--r--
For OS X
     1 // Copyright (c) 2008 Tony Garnock-Jones <tonyg@lshift.net>
     2 // Copyright (c) 2008 LShift Ltd. <query@lshift.net>
     3 //
     4 // Permission is hereby granted, free of charge, to any person
     5 // obtaining a copy of this software and associated documentation files
     6 // (the "Software"), to deal in the Software without restriction,
     7 // including without limitation the rights to use, copy, modify, merge,
     8 // publish, distribute, sublicense, and/or sell copies of the Software,
     9 // and to permit persons to whom the Software is furnished to do so,
    10 // subject to the following conditions:
    11 //
    12 // The above copyright notice and this permission notice shall be
    13 // included in all copies or substantial portions of the Software.
    14 //
    15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
    16 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
    17 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
    18 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
    19 // BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
    20 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    21 // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
    22 // SOFTWARE.
    23 
    24 DrawDvcs = {
    25     renderRepository: function (repo) {
    26         var childCount = {};
    27         var ordering = [];
    28         var i, j, item, parent, column, row;
    29 
    30         var worklist = repo.childlessRevisions();
    31         while (worklist.length) {
    32             item = worklist.shift();
    33             ordering.push(item);
    34 
    35             var parents = repo.lookupParents(item);
    36             for (i = 0; i < parents.length; i++) {
    37                 parent = parents[i];
    38                 if (childCount[parent] == undefined) {
    39                     childCount[parent] = repo.lookupChildren(parent).length;
    40                 }
    41                 childCount[parent] = childCount[parent] - 1;
    42                 if (childCount[parent] === 0) {
    43                     worklist.push(parent);
    44                 }
    45             }
    46         }
    47 
    48         var slots = [];
    49         var assignments = {};
    50 
    51         function allocateSlot(item) {
    52             var column = assignments[item];
    53             if (typeof(column) != 'number') {
    54                 column = null;
    55                 for (var j = 0; j < slots.length; j++) {
    56                     if (slots[j] === null) {
    57                         column = j;
    58                         break;
    59                     }
    60                 }
    61                 if (column === null) {
    62                     slots.push(item);
    63                     column = slots.length - 1;
    64                 }
    65             }
    66             return column;
    67         }
    68 
    69         var finalAssignments = [];
    70         var cells = [];
    71         var oldrow = [];
    72 
    73         for (i = 0; i < ordering.length; i++) {
    74             item = ordering[i];
    75             var hasKid = typeof(assignments[item]) == 'number';
    76             column = allocateSlot(item);
    77             var parentIds = repo.lookupParents(item);
    78             var parentColumns = [];
    79             slots[column] = null;
    80 
    81             for (j = 0; j < parentIds.length; j++) {
    82                 parent = parentIds[j];
    83                 var c2 = (j === 0)
    84                     ? (typeof(assignments[parent]) == 'number'
    85                        ? allocateSlot(parent)
    86                        : column)
    87                     : allocateSlot(parent);
    88                 parentColumns.push(c2);
    89                 slots[c2] = parent;
    90                 assignments[parent] = c2;
    91             }
    92 
    93             finalAssignments.push(column);
    94 
    95             row = [];
    96             for (j = 0; j < slots.length; j++) {
    97                 var oldCell = (oldrow.length >= j ? oldrow[j] : 0);
    98                 if (oldCell & 16) {
    99                     row[j] = (oldCell & 4) ? 1 : 0;
   100                 } else {
   101                     row[j] = (oldCell & (1 | 4 | 8)) ? 1 : 0;
   102                 }
   103             }
   104             row[column] = 16 | (hasKid ? 1 : 0);
   105             for (j = 0; j < parentColumns.length; j++) {
   106                 var parentColumn = parentColumns[j];
   107                 var n1 = Math.min(parentColumn, column) + 1;
   108                 var n2 = Math.max(parentColumn, column);
   109                 for (var k = n1; k < n2; k++) {
   110                     row[k] = row[k] | 2;
   111                 }
   112                 if (parentColumn == column) {
   113                     row[parentColumn] = row[parentColumn] | 4;
   114                 } else {
   115                     row[parentColumn] = row[parentColumn] | (column > parentColumn ? 8 : 4);
   116                     row[column] = row[column] | (column > parentColumn ? 2 : 8);
   117                 }
   118             }
   119             cells.push(row);
   120             oldrow = row;
   121         }
   122 
   123         var results = [];
   124         for (i = 0; i < ordering.length; i++) {
   125             item = ordering[i];
   126             column = finalAssignments[i];
   127 
   128             row = cells[i];
   129 
   130             var result = {revId: item, pictures: []};
   131             for (j = 0; j < row.length; j++) {
   132                 var v = row[j];
   133                 result.pictures.push((v & 16 ? "blob_" : "stick_") + (v & 15) + ".png");
   134             }
   135             results.push(result);
   136         }
   137 
   138         return results;
   139     },
   140 
   141     simpleRenderRepository: function (repo) {
   142         var ordering = DrawDvcs.renderRepository(repo);
   143         var html = "";
   144         for (var i = 0; i < ordering.length; i++) {
   145             var item = ordering[i];
   146             var rev = repo.lookupRev(item.revId);
   147             var pictures = item.pictures;
   148             for (var j = 0; j < pictures.length; j++) {
   149                 html = html + "<img src='img/" + pictures[j] + "' />";
   150             }
   151             html = html+" "+item.revId+" ("+rev.branch+") "+(rev.metadata||{}).summary+"<br />\n";
   152         }
   153         return "<p style='line-height: 0px; white-space: nowrap;'>" + html + "</p>";
   154     }
   155 };