specialchar.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. (function(){
  2. /**
  3. * @fileoverview
  4. * Tool '특수문자' Source,
  5. * Class Trex.Tool.SpecialChar 와 configuration을 포함
  6. *
  7. */
  8. var _DOC = document,
  9. _WIN = window,
  10. _DOC_EL = _DOC.documentElement,
  11. _FALSE = false,
  12. _TRUE = true,
  13. _NULL = null,
  14. _UNDEFINED;
  15. TrexMessage.addMsg({
  16. '@specialchar.cancel.image': "#iconpath/btn_l_cancel.gif?v=2",
  17. '@specialchar.confirm.image': "#iconpath/btn_l_confirm.gif?v=2",
  18. '@specialchar.title': "선택한 기호"
  19. });
  20. Trex.Class.overwrite(Trex.Tool.SpecialChar, {
  21. oninitialized: function() {
  22. var _canvas = this.canvas;
  23. var _toolHandler = function(value) {
  24. if(!value){
  25. return;
  26. }
  27. _canvas.execute(function(processor) {
  28. if ($tx.msie_docmode < 9) {
  29. // ie에서 특수문자 입력시 savedCaret 내부가 아닌 상위 p태그의 이전으로 insert가 되는 현상이 있어서 분기.
  30. var timekey = 'char' + (new Date()).getTime();
  31. processor.pasteContent('<span id="' + timekey + '">' + value + '</span>', _FALSE);
  32. var spanInDoc = processor.doc.getElementById(timekey);
  33. $tom.unwrap(spanInDoc);
  34. } else {
  35. processor.pasteContent(value, _FALSE);
  36. }
  37. });
  38. };
  39. /* button & menu weave */
  40. this.resetWeave();
  41. this.weave.bind(this)(
  42. /* button */
  43. new Trex.Button(this.buttonCfg),
  44. /* menu */
  45. new Trex.Menu.SpecialChar(this.menuCfg),
  46. /* handler */
  47. _toolHandler
  48. );
  49. }
  50. });
  51. Trex.MarkupTemplate.add(
  52. 'menu.specialchar.input', [
  53. '<dl class="tx-menu-matrix-input">',
  54. ' <dt><span>@specialchar.title</span></dt>',
  55. ' <dd><input type="text" value=""/></dd>',
  56. ' <dd><img class="tx-menu-btn-confirm" src="@specialchar.confirm.image" align="absmiddle"/></dd>',
  57. ' <dd><img class="tx-menu-btn-cancel" src="@specialchar.cancel.image" align="absmiddle"/></dd>',
  58. '</dl>'
  59. ].join("")
  60. );
  61. Trex.Menu.SpecialChar = Trex.Class.create({
  62. $extend: Trex.Menu.Matrix,
  63. ongenerated: function() {
  64. var _elMenu = this.elMenu;
  65. var _elInputSet = Trex.MarkupTemplate.get('menu.specialchar.input').evaluateAsDom({});
  66. $tom.append($tom.collect(_elMenu, 'div.tx-menu-inner'), _elInputSet);
  67. var _elInput = this.elInput = $tom.collect(_elInputSet, 'input');
  68. var _elImgs = $tom.collectAll(_elInputSet, 'img');
  69. if(_elImgs.length == 2) {
  70. $tx.observe(_elImgs[0], "click", function() {
  71. this._command(this.elInput.value);
  72. this.hide();
  73. }.bind(this));
  74. $tx.observe(_elImgs[1], "click", function() {
  75. this.onCancel();
  76. }.bind(this));
  77. }
  78. $tx.observe( _elInput, "keydown", function(ev){
  79. if ( ev.keyCode == 13 ){
  80. $tx.stop(ev);
  81. this._command(this.elInput.value);
  82. this.hide();
  83. }
  84. }.bind(this));
  85. },
  86. onregenerated: function() {
  87. this.elInput.value = "";
  88. this.elInput.focus();
  89. },
  90. onSelect: function(ev) {
  91. var _elInput = this.elInput;
  92. var el = $tx.findElement(ev, 'span');
  93. if (el.tagName && el.tagName.toLowerCase() != 'span') {
  94. return;
  95. }
  96. _elInput.value += (!el.innerText || el.innerText == "&nbsp;" || el.innerText.trim() == "")? "": el.innerText;
  97. $tx.stop(ev);
  98. _elInput.focus();
  99. if ($tx.msie) { //NOTE: #FTDUEDTR-1044
  100. try {
  101. var _sel = _DOC.selection.createRange();
  102. _sel.move("character", _elInput.value.length);
  103. _sel.select();
  104. } catch (ignore) {}
  105. }
  106. }
  107. });
  108. var thisToolName = 'specialchar';
  109. Editor.forEachEditor(function (editor) {
  110. editor.getTool()[thisToolName].oninitialized();
  111. });
  112. Editor.editorForAsyncLoad.getTool()[thisToolName].forceActivate();
  113. })();