]> source.dussan.org Git - sonarqube.git/commitdiff
Revert on the Cloud Widget
authorStas Vilchik <vilchiks@gmail.com>
Thu, 9 Jan 2014 09:06:20 +0000 (15:06 +0600)
committerStas Vilchik <vilchiks@gmail.com>
Thu, 9 Jan 2014 09:06:29 +0000 (15:06 +0600)
sonar-server/src/main/webapp/WEB-INF/app/views/layouts/_head.html.erb
sonar-server/src/main/webapp/javascripts/third-party/d3-cloud/LICENSE [deleted file]
sonar-server/src/main/webapp/javascripts/third-party/d3-cloud/d3.layout.cloud.js [deleted file]
sonar-server/src/main/webapp/javascripts/widgets/word-cloud.js [deleted file]
sonar-server/wro.xml

index dee89d3d3836ed345c55b1ac6bed6c5880da2e94..77d4b16e06d4677b03f733d3c136e73ec398dc1a 100644 (file)
@@ -46,7 +46,6 @@
     <%= javascript_include_tag 'third-party/backbone.marionette.min' %>
     <%= javascript_include_tag 'third-party/jquery.ba-throttle-debounce.min.js' %>
     <%= javascript_include_tag 'third-party/select2.min' %>
-    <%= javascript_include_tag 'third-party/d3-cloud/d3.layout.cloud' %>
 
     <%= javascript_include_tag 'widgets/widget' %>
     <%= javascript_include_tag 'widgets/bubble-chart' %>
@@ -54,7 +53,6 @@
     <%= javascript_include_tag 'widgets/stack-area' %>
     <%= javascript_include_tag 'widgets/pie-chart' %>
     <%= javascript_include_tag 'widgets/histogram' %>
-    <%= javascript_include_tag 'widgets/word-cloud' %>
 
     <%= javascript_include_tag 'select-list' %>
 
diff --git a/sonar-server/src/main/webapp/javascripts/third-party/d3-cloud/LICENSE b/sonar-server/src/main/webapp/javascripts/third-party/d3-cloud/LICENSE
deleted file mode 100755 (executable)
index 36ea512..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-Copyright (c) 2013, Jason Davies.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-  * Redistributions of source code must retain the above copyright notice, this
-    list of conditions and the following disclaimer.
-
-  * Redistributions in binary form must reproduce the above copyright notice,
-    this list of conditions and the following disclaimer in the documentation
-    and/or other materials provided with the distribution.
-
-  * The name Jason Davies may not be used to endorse or promote products
-    derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL JASON DAVIES BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/sonar-server/src/main/webapp/javascripts/third-party/d3-cloud/d3.layout.cloud.js b/sonar-server/src/main/webapp/javascripts/third-party/d3-cloud/d3.layout.cloud.js
deleted file mode 100755 (executable)
index 3fb8476..0000000
+++ /dev/null
@@ -1,401 +0,0 @@
-// Word cloud layout by Jason Davies, http://www.jasondavies.com/word-cloud/
-// Algorithm due to Jonathan Feinberg, http://static.mrfeinberg.com/bv_ch03.pdf
-(function(exports) {
-  function cloud() {
-    var size = [256, 256],
-        text = cloudText,
-        font = cloudFont,
-        fontSize = cloudFontSize,
-        fontStyle = cloudFontNormal,
-        fontWeight = cloudFontNormal,
-        rotate = cloudRotate,
-        padding = cloudPadding,
-        spiral = archimedeanSpiral,
-        words = [],
-        timeInterval = Infinity,
-        event = d3.dispatch("word", "end"),
-        timer = null,
-        cloud = {};
-
-    cloud.start = function() {
-      var board = zeroArray((size[0] >> 5) * size[1]),
-          bounds = null,
-          n = words.length,
-          i = -1,
-          tags = [],
-          data = words.map(function(d, i) {
-            d.text = text.call(this, d, i);
-            d.font = font.call(this, d, i);
-            d.style = fontStyle.call(this, d, i);
-            d.weight = fontWeight.call(this, d, i);
-            d.rotate = rotate.call(this, d, i);
-            d.size = ~~fontSize.call(this, d, i);
-            d.padding = padding.call(this, d, i);
-            return d;
-          }).sort(function(a, b) { return b.size - a.size; });
-
-      if (timer) clearInterval(timer);
-      timer = setInterval(step, 0);
-      step();
-
-      return cloud;
-
-      function step() {
-        var start = +new Date,
-            d;
-        while (+new Date - start < timeInterval && ++i < n && timer) {
-          d = data[i];
-          d.x = (size[0] * (Math.random() + .5)) >> 1;
-          d.y = (size[1] * (Math.random() + .5)) >> 1;
-          cloudSprite(d, data, i);
-          if (d.hasText && place(board, d, bounds)) {
-            tags.push(d);
-            event.word(d);
-            if (bounds) cloudBounds(bounds, d);
-            else bounds = [{x: d.x + d.x0, y: d.y + d.y0}, {x: d.x + d.x1, y: d.y + d.y1}];
-            // Temporary hack
-            d.x -= size[0] >> 1;
-            d.y -= size[1] >> 1;
-          }
-        }
-        if (i >= n) {
-          cloud.stop();
-          event.end(tags, bounds);
-        }
-      }
-    }
-
-    cloud.stop = function() {
-      if (timer) {
-        clearInterval(timer);
-        timer = null;
-      }
-      return cloud;
-    };
-
-    cloud.timeInterval = function(x) {
-      if (!arguments.length) return timeInterval;
-      timeInterval = x == null ? Infinity : x;
-      return cloud;
-    };
-
-    function place(board, tag, bounds) {
-      var perimeter = [{x: 0, y: 0}, {x: size[0], y: size[1]}],
-          startX = tag.x,
-          startY = tag.y,
-          maxDelta = Math.sqrt(size[0] * size[0] + size[1] * size[1]),
-          s = spiral(size),
-          dt = Math.random() < .5 ? 1 : -1,
-          t = -dt,
-          dxdy,
-          dx,
-          dy;
-
-      while (dxdy = s(t += dt)) {
-        dx = ~~dxdy[0];
-        dy = ~~dxdy[1];
-
-        if (Math.min(dx, dy) > maxDelta) break;
-
-        tag.x = startX + dx;
-        tag.y = startY + dy;
-
-        if (tag.x + tag.x0 < 0 || tag.y + tag.y0 < 0 ||
-            tag.x + tag.x1 > size[0] || tag.y + tag.y1 > size[1]) continue;
-        // TODO only check for collisions within current bounds.
-        if (!bounds || !cloudCollide(tag, board, size[0])) {
-          if (!bounds || collideRects(tag, bounds)) {
-            var sprite = tag.sprite,
-                w = tag.width >> 5,
-                sw = size[0] >> 5,
-                lx = tag.x - (w << 4),
-                sx = lx & 0x7f,
-                msx = 32 - sx,
-                h = tag.y1 - tag.y0,
-                x = (tag.y + tag.y0) * sw + (lx >> 5),
-                last;
-            for (var j = 0; j < h; j++) {
-              last = 0;
-              for (var i = 0; i <= w; i++) {
-                board[x + i] |= (last << msx) | (i < w ? (last = sprite[j * w + i]) >>> sx : 0);
-              }
-              x += sw;
-            }
-            delete tag.sprite;
-            return true;
-          }
-        }
-      }
-      return false;
-    }
-
-    cloud.words = function(x) {
-      if (!arguments.length) return words;
-      words = x;
-      return cloud;
-    };
-
-    cloud.size = function(x) {
-      if (!arguments.length) return size;
-      size = [+x[0], +x[1]];
-      return cloud;
-    };
-
-    cloud.font = function(x) {
-      if (!arguments.length) return font;
-      font = d3.functor(x);
-      return cloud;
-    };
-
-    cloud.fontStyle = function(x) {
-      if (!arguments.length) return fontStyle;
-      fontStyle = d3.functor(x);
-      return cloud;
-    };
-
-    cloud.fontWeight = function(x) {
-      if (!arguments.length) return fontWeight;
-      fontWeight = d3.functor(x);
-      return cloud;
-    };
-
-    cloud.rotate = function(x) {
-      if (!arguments.length) return rotate;
-      rotate = d3.functor(x);
-      return cloud;
-    };
-
-    cloud.text = function(x) {
-      if (!arguments.length) return text;
-      text = d3.functor(x);
-      return cloud;
-    };
-
-    cloud.spiral = function(x) {
-      if (!arguments.length) return spiral;
-      spiral = spirals[x + ""] || x;
-      return cloud;
-    };
-
-    cloud.fontSize = function(x) {
-      if (!arguments.length) return fontSize;
-      fontSize = d3.functor(x);
-      return cloud;
-    };
-
-    cloud.padding = function(x) {
-      if (!arguments.length) return padding;
-      padding = d3.functor(x);
-      return cloud;
-    };
-
-    return d3.rebind(cloud, event, "on");
-  }
-
-  function cloudText(d) {
-    return d.text;
-  }
-
-  function cloudFont() {
-    return "serif";
-  }
-
-  function cloudFontNormal() {
-    return "normal";
-  }
-
-  function cloudFontSize(d) {
-    return Math.sqrt(d.value);
-  }
-
-  function cloudRotate() {
-    return (~~(Math.random() * 6) - 3) * 30;
-  }
-
-  function cloudPadding() {
-    return 1;
-  }
-
-  // Fetches a monochrome sprite bitmap for the specified text.
-  // Load in batches for speed.
-  function cloudSprite(d, data, di) {
-    if (d.sprite) return;
-    c.clearRect(0, 0, (cw << 5) / ratio, ch / ratio);
-    var x = 0,
-        y = 0,
-        maxh = 0,
-        n = data.length;
-    --di;
-    while (++di < n) {
-      d = data[di];
-      c.save();
-      c.font = d.style + " " + d.weight + " " + ~~((d.size + 1) / ratio) + "px " + d.font;
-      var w = c.measureText(d.text + "m").width * ratio,
-          h = d.size << 1;
-      if (d.rotate) {
-        var sr = Math.sin(d.rotate * cloudRadians),
-            cr = Math.cos(d.rotate * cloudRadians),
-            wcr = w * cr,
-            wsr = w * sr,
-            hcr = h * cr,
-            hsr = h * sr;
-        w = (Math.max(Math.abs(wcr + hsr), Math.abs(wcr - hsr)) + 0x1f) >> 5 << 5;
-        h = ~~Math.max(Math.abs(wsr + hcr), Math.abs(wsr - hcr));
-      } else {
-        w = (w + 0x1f) >> 5 << 5;
-      }
-      if (h > maxh) maxh = h;
-      if (x + w >= (cw << 5)) {
-        x = 0;
-        y += maxh;
-        maxh = 0;
-      }
-      if (y + h >= ch) break;
-      c.translate((x + (w >> 1)) / ratio, (y + (h >> 1)) / ratio);
-      if (d.rotate) c.rotate(d.rotate * cloudRadians);
-      c.fillText(d.text, 0, 0);
-      if (d.padding) c.lineWidth = 2 * d.padding, c.strokeText(d.text, 0, 0);
-      c.restore();
-      d.width = w;
-      d.height = h;
-      d.xoff = x;
-      d.yoff = y;
-      d.x1 = w >> 1;
-      d.y1 = h >> 1;
-      d.x0 = -d.x1;
-      d.y0 = -d.y1;
-      d.hasText = true;
-      x += w;
-    }
-    var pixels = c.getImageData(0, 0, (cw << 5) / ratio, ch / ratio).data,
-        sprite = [];
-    while (--di >= 0) {
-      d = data[di];
-      if (!d.hasText) continue;
-      var w = d.width,
-          w32 = w >> 5,
-          h = d.y1 - d.y0;
-      // Zero the buffer
-      for (var i = 0; i < h * w32; i++) sprite[i] = 0;
-      x = d.xoff;
-      if (x == null) return;
-      y = d.yoff;
-      var seen = 0,
-          seenRow = -1;
-      for (var j = 0; j < h; j++) {
-        for (var i = 0; i < w; i++) {
-          var k = w32 * j + (i >> 5),
-              m = pixels[((y + j) * (cw << 5) + (x + i)) << 2] ? 1 << (31 - (i % 32)) : 0;
-          sprite[k] |= m;
-          seen |= m;
-        }
-        if (seen) seenRow = j;
-        else {
-          d.y0++;
-          h--;
-          j--;
-          y++;
-        }
-      }
-      d.y1 = d.y0 + seenRow;
-      d.sprite = sprite.slice(0, (d.y1 - d.y0) * w32);
-    }
-  }
-
-  // Use mask-based collision detection.
-  function cloudCollide(tag, board, sw) {
-    sw >>= 5;
-    var sprite = tag.sprite,
-        w = tag.width >> 5,
-        lx = tag.x - (w << 4),
-        sx = lx & 0x7f,
-        msx = 32 - sx,
-        h = tag.y1 - tag.y0,
-        x = (tag.y + tag.y0) * sw + (lx >> 5),
-        last;
-    for (var j = 0; j < h; j++) {
-      last = 0;
-      for (var i = 0; i <= w; i++) {
-        if (((last << msx) | (i < w ? (last = sprite[j * w + i]) >>> sx : 0))
-            & board[x + i]) return true;
-      }
-      x += sw;
-    }
-    return false;
-  }
-
-  function cloudBounds(bounds, d) {
-    var b0 = bounds[0],
-        b1 = bounds[1];
-    if (d.x + d.x0 < b0.x) b0.x = d.x + d.x0;
-    if (d.y + d.y0 < b0.y) b0.y = d.y + d.y0;
-    if (d.x + d.x1 > b1.x) b1.x = d.x + d.x1;
-    if (d.y + d.y1 > b1.y) b1.y = d.y + d.y1;
-  }
-
-  function collideRects(a, b) {
-    return a.x + a.x1 > b[0].x && a.x + a.x0 < b[1].x && a.y + a.y1 > b[0].y && a.y + a.y0 < b[1].y;
-  }
-
-  function archimedeanSpiral(size) {
-    var e = size[0] / size[1];
-    return function(t) {
-      return [e * (t *= .1) * Math.cos(t), t * Math.sin(t)];
-    };
-  }
-
-  function rectangularSpiral(size) {
-    var dy = 4,
-        dx = dy * size[0] / size[1],
-        x = 0,
-        y = 0;
-    return function(t) {
-      var sign = t < 0 ? -1 : 1;
-      // See triangular numbers: T_n = n * (n + 1) / 2.
-      switch ((Math.sqrt(1 + 4 * sign * t) - sign) & 3) {
-        case 0:  x += dx; break;
-        case 1:  y += dy; break;
-        case 2:  x -= dx; break;
-        default: y -= dy; break;
-      }
-      return [x, y];
-    };
-  }
-
-  // TODO reuse arrays?
-  function zeroArray(n) {
-    var a = [],
-        i = -1;
-    while (++i < n) a[i] = 0;
-    return a;
-  }
-
-  var cloudRadians = Math.PI / 180,
-      cw = 1 << 11 >> 5,
-      ch = 1 << 11,
-      canvas,
-      ratio = 1;
-
-  if (typeof document !== "undefined") {
-    canvas = document.createElement("canvas");
-    canvas.width = 1;
-    canvas.height = 1;
-    ratio = Math.sqrt(canvas.getContext("2d").getImageData(0, 0, 1, 1).data.length >> 2);
-    canvas.width = (cw << 5) / ratio;
-    canvas.height = ch / ratio;
-  } else {
-    // node-canvas support
-    var Canvas = require("canvas");
-    canvas = new Canvas(cw << 5, ch);
-  }
-
-  var c = canvas.getContext("2d"),
-      spirals = {
-        archimedean: archimedeanSpiral,
-        rectangular: rectangularSpiral
-      };
-  c.fillStyle = c.strokeStyle = "red";
-  c.textAlign = "center";
-
-  exports.cloud = cloud;
-})(typeof exports === "undefined" ? d3.layout || (d3.layout = {}) : exports);
diff --git a/sonar-server/src/main/webapp/javascripts/widgets/word-cloud.js b/sonar-server/src/main/webapp/javascripts/widgets/word-cloud.js
deleted file mode 100644 (file)
index 6ca36c9..0000000
+++ /dev/null
@@ -1,206 +0,0 @@
-/*global d3:false, _:false */
-/*jshint eqnull:true */
-
-window.SonarWidgets = window.SonarWidgets == null ? {} : window.SonarWidgets;
-
-(function () {
-
-  window.SonarWidgets.WordCloud = function () {
-    // Set default values
-    this._components = [];
-    this._metrics = [];
-    this._metricsPriority = [];
-    this._width = window.SonarWidgets.WordCloud.defaults.width;
-    this._height = window.SonarWidgets.WordCloud.defaults.height;
-    this._margin = window.SonarWidgets.WordCloud.defaults.margin;
-    this._options = {};
-
-    // Export global variables
-    this.metrics = function (_) {
-      return param.call(this, '_metrics', _);
-    };
-
-    this.metricsPriority = function (_) {
-      return param.call(this, '_metricsPriority', _);
-    };
-
-    this.components = function (_) {
-      return param.call(this, '_components', _);
-    };
-
-    this.width = function (_) {
-      return param.call(this, '_width', _);
-    };
-
-    this.height = function (_) {
-      return param.call(this, '_height', _);
-    };
-
-    this.margin = function (_) {
-      return param.call(this, '_margin', _);
-    };
-
-    this.options = function (_) {
-      return param.call(this, '_options', _);
-    };
-  };
-
-  window.SonarWidgets.WordCloud.prototype.render = function (container) {
-    var widget = this,
-        containerS = container;
-
-    container = d3.select(container);
-
-    this.width(container.property('offsetWidth'));
-
-    this.svg = container.append('svg')
-        .attr('class', 'sonar-d3');
-    this.gWrap = this.svg.append('g');
-
-    this.plotWrap = this.gWrap.append('g')
-        .classed('plot', true);
-
-    this.gWrap
-        .attr('transform', trans(this.margin().left, this.margin().top));
-
-
-    // Configure metrics
-    this.colorMetric = this.metricsPriority()[0];
-    this.getColorMetric = function(d) {
-      return d.measures[widget.colorMetric].val;
-    };
-
-    this.sizeMetric = this.metricsPriority()[1];
-    this.getSizeMetric = function(d) {
-      return d.measures[widget.sizeMetric].val;
-    };
-
-    this.fm = function(value, name) {
-      var type = this.metrics()[name].type;
-
-      switch (type) {
-        case 'FLOAT':
-          return d3.format('.1f')(value);
-        case 'INT':
-          return d3.format('d')(value);
-        default :
-          return value;
-      }
-    };
-
-
-    // Configure scales
-    this.color = d3.scale.sqrt()
-        .domain(d3.extent(this.components(), function(d) {
-          return widget.getColorMetric(d);
-        }))
-        .range(['#ee0000', '#2360bf']);
-
-    this.size = d3.scale.linear()
-        .domain(d3.extent(this.components(), function(d) {
-          return widget.getSizeMetric(d);
-        }))
-        .range([10, 48]);
-
-
-    // Update widget
-    this.update(containerS);
-
-    return this;
-  };
-
-
-
-  window.SonarWidgets.WordCloud.prototype.update = function(container) {
-    container = d3.select(container);
-
-    var widget = this,
-        width = container.property('offsetWidth');
-    this.width(width > 100 ? width : 100);
-
-
-    // Update available size
-    this.availableWidth = this.width() - this.margin().left - this.margin().right;
-    this.availableHeight = 1000;
-    this.height(this.availableHeight + this.margin().top + this.margin().bottom);
-
-
-    // Update svg canvas
-    this.svg
-        .attr('width', this.width())
-        .attr('height', this.height());
-
-
-    // Update plot
-    this.plotWrap
-        .transition()
-        .attr('transform', trans(this.availableWidth / 2, this.availableHeight / 2));
-
-
-    // Configure cloud
-    var wordsData = this.components().map(function(d) {
-      return {
-        text: d.name,
-        size: widget.size(widget.getSizeMetric(d)),
-        color: widget.color(widget.getColorMetric(d))
-      };
-    });
-
-    this.cloud = d3.layout.cloud().size([this.availableWidth, this.availableHeight])
-        .words(wordsData)
-        .padding(5)
-        .rotate(0)
-        .font("Arial")
-        .fontSize(function(d) { return d.size; })
-        .on("end", draw)
-        .start();
-
-    function draw(words) {
-      widget.words = widget.plotWrap.selectAll("text")
-          .data(words);
-
-      widget.words.enter().append("text")
-          .style("font-size", function(d) { return d.size + "px"; })
-          .style("font-family", "Arial")
-          .style("fill", function(d) { return d.color; })
-          .attr("text-anchor", "middle")
-          .text(function(d) { return d.text; });
-
-      widget.words
-          .transition()
-          .attr("transform", function(d) {
-            return "translate(" + [d.x, d.y] + ")rotate(" + d.rotate + ")";
-          });
-
-      widget.words.exit().remove();
-    }
-  };
-
-
-
-  window.SonarWidgets.WordCloud.defaults = {
-    width: 350,
-    height: 300,
-    margin: { top: 0, right: 0, bottom: 0, left: 0 }
-  };
-
-
-
-  // Some helper functions
-
-  // Gets or sets parameter
-  function param(name, value) {
-    if (value == null) {
-      return this[name];
-    } else {
-      this[name] = value;
-      return this;
-    }
-  }
-
-  // Helper for create the translate(x, y) string
-  function trans(left, top) {
-    return 'translate(' + left + ', ' + top + ')';
-  }
-
-})();
index 2fb8b9328c2c5539e064b490bd0aafe504701887..3b110261c92e49d06999334e0fb35a147e878730 100644 (file)
@@ -26,8 +26,6 @@
     <js>/javascripts/third-party/backbone.marionette.min.js</js>
     <js>/javascripts/third-party/jquery.ba-throttle-debounce.min.js</js>
     <js>/javascripts/third-party/select2.min.js</js>
-    <js>/javascripts/third-party/d3-cloud/d3.layout.cloud.js</js>
-
 
     <js>/javascripts/widgets/widget.js</js>
     <js>/javascripts/widgets/bubble-chart.js</js>
@@ -35,7 +33,6 @@
     <js>/javascripts/widgets/stack-area.js</js>
     <js>/javascripts/widgets/pie-chart.js</js>
     <js>/javascripts/widgets/histogram.js</js>
-    <js>/javascripts/widgets/word-cloud.js</js>
 
     <js>/javascripts/select-list.js</js>