message.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /**
  2. * message.js - message element for blessed
  3. * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).
  4. * https://github.com/chjj/blessed
  5. */
  6. /**
  7. * Modules
  8. */
  9. var Node = require('./node');
  10. var Box = require('./box');
  11. /**
  12. * Message / Error
  13. */
  14. function Message(options) {
  15. if (!(this instanceof Node)) {
  16. return new Message(options);
  17. }
  18. options = options || {};
  19. options.tags = true;
  20. Box.call(this, options);
  21. }
  22. Message.prototype.__proto__ = Box.prototype;
  23. Message.prototype.type = 'message';
  24. Message.prototype.log =
  25. Message.prototype.display = function(text, time, callback) {
  26. var self = this;
  27. if (typeof time === 'function') {
  28. callback = time;
  29. time = null;
  30. }
  31. if (time == null) time = 3;
  32. // Keep above:
  33. // var parent = this.parent;
  34. // this.detach();
  35. // parent.append(this);
  36. if (this.scrollable) {
  37. this.screen.saveFocus();
  38. this.focus();
  39. this.scrollTo(0);
  40. }
  41. this.show();
  42. this.setContent(text);
  43. this.screen.render();
  44. if (time === Infinity || time === -1 || time === 0) {
  45. var end = function() {
  46. if (end.done) return;
  47. end.done = true;
  48. if (self.scrollable) {
  49. try {
  50. self.screen.restoreFocus();
  51. } catch (e) {
  52. ;
  53. }
  54. }
  55. self.hide();
  56. self.screen.render();
  57. if (callback) callback();
  58. };
  59. setTimeout(function() {
  60. self.onScreenEvent('keypress', function fn(ch, key) {
  61. if (key.name === 'mouse') return;
  62. if (self.scrollable) {
  63. if ((key.name === 'up' || (self.options.vi && key.name === 'k'))
  64. || (key.name === 'down' || (self.options.vi && key.name === 'j'))
  65. || (self.options.vi && key.name === 'u' && key.ctrl)
  66. || (self.options.vi && key.name === 'd' && key.ctrl)
  67. || (self.options.vi && key.name === 'b' && key.ctrl)
  68. || (self.options.vi && key.name === 'f' && key.ctrl)
  69. || (self.options.vi && key.name === 'g' && !key.shift)
  70. || (self.options.vi && key.name === 'g' && key.shift)) {
  71. return;
  72. }
  73. }
  74. if (self.options.ignoreKeys && ~self.options.ignoreKeys.indexOf(key.name)) {
  75. return;
  76. }
  77. self.removeScreenEvent('keypress', fn);
  78. end();
  79. });
  80. // XXX May be affected by new element.options.mouse option.
  81. if (!self.options.mouse) return;
  82. self.onScreenEvent('mouse', function fn(data) {
  83. if (data.action === 'mousemove') return;
  84. self.removeScreenEvent('mouse', fn);
  85. end();
  86. });
  87. }, 10);
  88. return;
  89. }
  90. setTimeout(function() {
  91. self.hide();
  92. self.screen.render();
  93. if (callback) callback();
  94. }, time * 1000);
  95. };
  96. Message.prototype.error = function(text, time, callback) {
  97. return this.display('{red-fg}Error: ' + text + '{/red-fg}', time, callback);
  98. };
  99. /**
  100. * Expose
  101. */
  102. module.exports = Message;