outdent.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /**
  2. * @fileoverview
  3. * Tool '내어쓰기' Source,
  4. * Class Trex.Tool.Outdent 와 configuration을 포함
  5. *
  6. */
  7. TrexConfig.addTool(
  8. "outdent",
  9. {
  10. sync: _FALSE,
  11. status: _FALSE,
  12. hotKey: { // shift + tab - 내어쓰기
  13. shiftKey: _TRUE,
  14. keyCode: 9
  15. }
  16. }
  17. );
  18. Trex.Tool.Outdent = Trex.Class.create({
  19. $const: {
  20. __Identity: 'outdent'
  21. },
  22. $extend: Trex.Tool,
  23. oninitialized: function(config) {
  24. this.weave(new Trex.Button(this.buttonCfg), _NULL, this.handler);
  25. this.createHandlers();
  26. if ($tx.opera == _FALSE) {
  27. this.observeBackspace();
  28. }
  29. this.bindKeyboard(config.hotKey, this.shiftTabKeyHandler.bind(this));
  30. },
  31. handler: function() {
  32. var self = this;
  33. this.canvas.execute(function(processor) {
  34. self.onOutdentClicked.handle(processor);
  35. });
  36. },
  37. shiftTabKeyHandler: function() {
  38. var self = this;
  39. this.canvas.execute(function(processor) {
  40. self.onShiftTabPressed.handle(processor);
  41. });
  42. },
  43. observeBackspace: function() {
  44. var canvas = this.canvas;
  45. var self = this;
  46. canvas.observeKey({ keyCode: Trex.__KEY.BACKSPACE }, function() {
  47. canvas.query(function(processor) {
  48. self.onBackspace.handle(processor);
  49. });
  50. });
  51. },
  52. createHandlers: function() {
  53. var IndentTool = Trex.Tool.Indent;
  54. var Judge = IndentTool.Judge;
  55. var Operation = IndentTool.Operation;
  56. var Handler = IndentTool.Handler;
  57. var Chain = Trex.ChainHandler;
  58. var onDefaultOutdent = Chain.connect([
  59. new Chain(Judge.ListItem, Operation.OutdentListItem),
  60. new Chain(Judge.BlockNode, Operation.OutdentBlockNode)
  61. ]);
  62. var propagate = Chain.connect([
  63. new Chain(Judge.AlwaysTrue, Operation.Propagate)
  64. ]);
  65. var onCollapsedShiftTabPressed = Chain.connect([
  66. new Chain(Judge.ListItem, Operation.OutdentListItem),
  67. new Chain(Judge.ChildOfFirstTableCell, Operation.GoToAboveTable),
  68. new Chain(Judge.ChildOfTableCell, Operation.GoToPreviousCell),
  69. new Chain(Judge.BlockNode, Operation.OutdentBlockNode)
  70. ]);
  71. var onCollapsedBackspace = Chain.connect([
  72. new Chain(Judge.And(Judge.HeadOfParagraph, Judge.OneDepthList), Operation.Propagate),
  73. new Chain(Judge.And(Judge.HeadOfParagraph, Judge.ListItem), Operation.OutdentListItem),
  74. new Chain(Judge.And(Judge.HeadOfParagraph, Judge.IndentedBlockNode), Operation.OutdentBlockNode),
  75. new Chain(Judge.AlwaysTrue, Operation.Propagate)
  76. ]);
  77. this.onShiftTabPressed = new Handler(onCollapsedShiftTabPressed, onDefaultOutdent, onDefaultOutdent);
  78. this.onOutdentClicked = new Handler(onDefaultOutdent, onDefaultOutdent, onDefaultOutdent);
  79. this.onBackspace = new Handler(onCollapsedBackspace, propagate, propagate);
  80. }
  81. });