indent.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /**
  2. * @fileoverview
  3. * '들여쓰기' Icon Source,
  4. * Class Trex.Tool.Indent configuration을 포함
  5. *
  6. */
  7. TrexConfig.addTool(
  8. "indent",
  9. {
  10. sync: _FALSE,
  11. status: _FALSE,
  12. hotKey: {
  13. // tab - 들여쓰기
  14. keyCode: 9
  15. }
  16. }
  17. );
  18. Trex.Tool.Indent = Trex.Class.create({
  19. $const: {
  20. __Identity: 'indent'
  21. },
  22. $extend: Trex.Tool,
  23. oninitialized: function(config) {
  24. this.weave(new Trex.Button(this.buttonCfg), _NULL, this.handler);
  25. this.bindKeyboard(config.hotKey, this.tabKeyHandler.bind(this));
  26. this.createHandlers();
  27. },
  28. handler: function() {
  29. var self = this, canvas = self.canvas;
  30. canvas.execute(function(processor) {
  31. self.onIndentClicked.handle(processor);
  32. });
  33. },
  34. tabKeyHandler: function() {
  35. var self = this;
  36. this.canvas.execute(function(processor) {
  37. self.onTabPressed.handle(processor);
  38. });
  39. },
  40. createHandlers: function() {
  41. var IndentTool = Trex.Tool.Indent;
  42. var Judge = IndentTool.Judge;
  43. var Operation = IndentTool.Operation;
  44. var Handler = IndentTool.Handler;
  45. var ChainHandler = Trex.ChainHandler;
  46. var onDefaultIndent = ChainHandler.connect([
  47. new ChainHandler(Judge.ListItem, Operation.IndentListItem),
  48. new ChainHandler(Judge.BlockNode, Operation.IndentBlockNode)
  49. ]);
  50. var onCollapsedTabPressed = ChainHandler.connect([
  51. new ChainHandler(Judge.And(Judge.HeadOfParagraph, Judge.ListItem), Operation.IndentListItem),
  52. new ChainHandler(Judge.ChildOfLastTableCell, Operation.GoToBelowTable),
  53. new ChainHandler(Judge.ChildOfTableCell, Operation.GoToNextCell),
  54. new ChainHandler(Judge.AlwaysTrue, Operation.IndentBlockNode)
  55. // new ChainHandler(Judge.And(Judge.HeadOfParagraph, Judge.BlockNode), Operation.IndentBlockNode),
  56. // new ChainHandler(Judge.AlwaysTrue, Operation.AddFourSpaces)
  57. ]);
  58. this.onTabPressed = new Handler(onCollapsedTabPressed, onDefaultIndent, onDefaultIndent);
  59. this.onIndentClicked = new Handler(onDefaultIndent, onDefaultIndent, onDefaultIndent);
  60. }
  61. });
  62. Trex.Tool.Indent.Handler = Trex.Class.create({
  63. initialize: function (collasped, selection, tableCell) {
  64. var IndentTool = Trex.Tool.Indent;
  65. var RangeIndenter = IndentTool.RangeIndenter;
  66. var TableCellIndenter = IndentTool.TableCellIndenter;
  67. this.collapsedRange = new RangeIndenter(collasped);
  68. this.selectedRange = new RangeIndenter(selection);
  69. this.tableCellSelected = new TableCellIndenter(tableCell);
  70. },
  71. handle: function(processor) {
  72. var tableCells = (processor.table) ? processor.table.getTdArr() : [];
  73. if (tableCells.length > 0) {
  74. this.tableCellSelected.indent(processor);
  75. } else if (processor.isCollapsed()) {
  76. this.collapsedRange.indent(processor);
  77. } else {
  78. this.selectedRange.indent(processor);
  79. }
  80. }
  81. });
  82. Trex.ChainHandler = Trex.Class.create({
  83. $const: {
  84. connect: function(handlers) {
  85. var firstHandler = handlers[0];
  86. for (var i = 1; i < handlers.length; i++) {
  87. handlers[i - 1].setNext(handlers[i]);
  88. }
  89. return firstHandler;
  90. }
  91. },
  92. initialize: function(judge, executor) {
  93. this.judge = judge;
  94. this.executor = executor;
  95. return this;
  96. },
  97. setNext: function(successor) {
  98. this.successor = successor;
  99. return this.successor;
  100. },
  101. handle: function() {
  102. var args = arguments;
  103. if (this.judge.apply(this, args)) {
  104. this.executor.apply(this, args);
  105. } else if (this.successor) {
  106. this.successor.handle.apply(this.successor, args);
  107. }
  108. }
  109. });