/** * @fileoverview * 직접 편집이 가능한 기능을 포함한 Tool '글상자' Source, * Class Trex.Tool.RichTextBox 와 configuration을 포함 * */ TrexConfig.addTool( "richtextbox", { sync: _FALSE, status: _TRUE, rows: 4, cols: 6, borderwidth: 1, bordercolor: '#cbcbcb', bgcolor: '#ffffff', padding: "10px", styles: [ { klass: "", image: "#iconpath/textbox/thum_line01.gif?v=2", data: "solid" }, { klass: "", image: "#iconpath/textbox/thum_line02.gif?v=2", data: "double" }, { klass: "", image: "#iconpath/textbox/thum_line03.gif?v=2", data: "dashed" }, { klass: "", image: "#iconpath/textbox/thum_line04.gif?v=2", data: "none" } ], options: Trex.__CONFIG_COMMON.textbox.options, thumbs: Trex.__CONFIG_COMMON.thumbs } ); TrexMessage.addMsg({ '@richtextbox.add': "더하기", '@richtextbox.sub': "빼기", '@richtextbox.alert': "1 이상 20 이하의 숫자만 입력 가능합니다.", '@richtextbox.bg.color': "배경색", '@richtextbox.border.color': "선 색", '@richtextbox.border.style': "선 스타일", '@richtextbox.border.width': "선 굵기" }); Trex.Tool.RichTextBox = Trex.Class.create({ $const: { __Identity: 'richtextbox' }, $extend: Trex.Tool, oninitialized: function() { var _canvas = this.canvas; var _toolbar = this.toolbar; var _tool = this; var _toolHandler = this.handler = function() { var _this = _tool.menu; var _style = { "borderStyle": _this.elPreview.style.borderStyle, "borderWidth": _this.elPreview.style.borderWidth, "borderColor": _this.elPreview.style.borderColor, "backgroundColor": _this.elPreview.style.backgroundColor, "padding": _this.padding }; var _tag = "div"; var _attributes = { "className": 'txc-textbox', style: _style }; _canvas.execute(function(processor) { var _nodes = processor.blocks(function() { return '%wrapper,%paragraph'; }); var _bNode; _nodes = _nodes.findAll(function(node) { if($tom.kindOf(node, "%innergroup")) { _bNode = processor.wrap($tom.children(node), _tag, _attributes); _toolbar.fireJobs('cmd.textbox.added', _bNode); return _FALSE; } else { return _TRUE; } }); _bNode = processor.wrap(_nodes, _tag, _attributes); _toolbar.fireJobs('cmd.textbox.added', _bNode); }); }; /* button & menu weave */ this.weave.bind(this)( /* button */ new Trex.Button(this.buttonCfg), /* menu */ new Trex.Menu.RichTextbox(this.menuCfg), /* handler */ _toolHandler ); } }); Trex.MarkupTemplate.add( 'richtextbox.colorpallete', ['
', '
', ' ', //==> _elThumb '
', ' ', ' ', '
'].join("") ); Trex.Menu.RichTextbox = Trex.Class.create({ $extend: Trex.Menu, ongenerated: function(config) { var _this = this; var _styleHashMap = {}; config.options.each(function(option) { _styleHashMap[option.data] = option.style; }); this.borderWidth = config.borderWidth || 1; this.borderColor = config.borderColor || '#cbcbcb'; this.bgColor = config.bgColor || '#ffffff'; this.padding = config.padding; var _generateBorderStyle = this.generateBorderStyle.bind(this); var _generateBorderWidth = this.generateBorderWidth.bind(this); var _generateBorderColor = this.generateBorderColor.bind(this); var _generateBgColor = this.generateBgColor.bind(this); var _elMenu = this.elMenu; var _elHeader = $tom.collect(_elMenu, 'div.tx-menu-header'); var _elPreviewArea = $tom.collect(_elHeader, 'div.tx-menu-preview-area'); this.elPreview = $tom.collect(_elPreviewArea, 'div.tx-menu-preview'); var _elSwitch = this.elSwitch = $tom.collect(_elHeader, 'div.tx-menu-switch'); var _elSimple = $tom.collect(_elSwitch, 'div.tx-menu-simple'); var _elAdvanced = $tom.collect(_elSwitch, 'div.tx-menu-advanced'); var _elInner = $tom.collect(_elMenu, 'div.tx-menu-inner'); var _elFooter = $tom.collect(_elMenu, 'div.tx-menu-footer'); var _elConfirm = $tom.collect(_elFooter, 'img.tx-menu-confirm'); var _elCancel = $tom.collect(_elFooter, 'img.tx-menu-cancel'); (function create_thumbs_for_simplemode(){ var _el = _this.simplePalette= tx.div({ className: 'tx-menu-list'}); _elInner.appendChild(_el); var _rows = config.rows; var _cols = config.cols; _el.innerHTML = Trex.HtmlCreator.createTableMarkup(_rows, _cols, config.options); $tx.observe(_el, 'click', function(ev){ var _el = $tx.element(ev); TrexEvent.fire(_el, { 'span': function(){ var _class; if(_el.firstChild && _el.firstChild.nodeType == 1 && _el.firstChild.tagName.toLowerCase() == 'img') { _class = _el.firstChild.title; } else { _class = _el.innerText; } var _style = _styleHashMap[_class]; applyPreviewStyle(_style); } }); $tx.stop(ev); }); })(); (function createElementsInInnerContainerForAdvancedMode(){ var _el = _this.advancedPalette = tx.div({ className: "tx-advanced-list" }); _elInner.appendChild(_el); _el.appendChild( tx.dl({ style: { "height": "24px" } }, tx.dt(TXMSG("@richtextbox.border.style")), _generateBorderStyle())); _el.appendChild(tx.dl(tx.dt(TXMSG("@richtextbox.border.width")), _generateBorderWidth())); _el.appendChild(tx.dl(tx.dt(TXMSG("@richtextbox.border.color")), _generateBorderColor())); _el.appendChild(tx.dl(tx.dt(TXMSG("@richtextbox.bg.color")), _generateBgColor())); })(); var copyStyles = function(){ _this.borderWidthInput.value = parseInt(_this.elPreview.style.borderWidth); _this.borderColorInput.style.backgroundColor = _this.elPreview.style.borderTopColor; _this.bgColorInput.style.backgroundColor = _this.elPreview.style.backgroundColor; }; var applyPreviewStyle = function (style){ _this.elPreview.style.border = style['border']; _this.elPreview.style.backgroundColor = style['backgroundColor'] }; var selectMode = function(mode){ if(mode =="simple"){ $tx.addClassName(_elSimple, "tx-selected"); $tx.show(_this.simplePalette); $tx.removeClassName(_elAdvanced, "tx-selected"); $tx.hide(_this.advancedPalette); }else if(mode =="advanced"){ $tx.removeClassName(_elSimple, "tx-selected"); $tx.hide(_this.simplePalette); $tx.addClassName(_elAdvanced, "tx-selected"); $tx.show(_this.advancedPalette); copyStyles(); } _this.fireJobs(Trex.Ev.__MENU_LAYER_CHANGE_SIZE, { detail: { menu: _this } }); }; (function bindingEvents(){ $tx.observe(_elSimple, 'click', selectMode.bind(_this, "simple") ); $tx.observe(_elAdvanced, 'click', selectMode.bind(_this, "advanced") ); $tx.observe(_elConfirm, 'click', _this.onSelect.bind(_this)); $tx.observe(_elCancel, 'click', function(){ _this.onCancel(); }); })(); selectMode("simple"); applyPreviewStyle(_styleHashMap['txc-textbox13']); }, generateBorderStyle: function(){ var _this = this; var _elWrap = tx.dd({ className: 'tx-border-area' }); $tx.observe(_elWrap, 'click', function(ev) { var _el = $tx.element(ev); TrexEvent.fire(_el, { 'img': function(element){ var _data = element.getAttribute("data"); _this.elPreview.style.borderStyle = _data; if(_data == 'double' && _this.borderWidthInput.value.toNumber() < 3){ _this.elPreview.style.borderWidth = "3px"; _this.borderWidthInput.value = "3"; } } }); $tx.stop(ev); }); _elWrap.innerHTML = Trex.HtmlCreator.createTableMarkup(1, 4, this.config.styles); return _elWrap; }, generateBorderWidth: function() { var _this = this; var _elWrap = tx.dd({ className: 'tx-border-area' }); var _elInput = this.borderWidthInput = tx.input({ type: 'text', value: this.borderWidth }); _elWrap.appendChild(_elInput); var _drawDeco = function(width) { if(width > 20 ) { alert(TXMSG("@richtextbox.alert")); _elInput.value = 20; }else if(width < 1){ alert(TXMSG("@richtextbox.alert")); _elInput.value = 1; }else{ _this.elPreview.style.borderWidth = width + "px"; _elInput.value = width; } }; $tx.observe(_elInput, 'blur', function(ev) { _drawDeco(_elInput.value.toNumber(), ev); }); $tx.observe( _elInput, "keydown", function(ev){ if( ev.keyCode == $tx.KEY_RETURN ) $tx.stop(ev); }); var _elAddBtn = tx.a({ href:'javascript:;', className: 'btn_add' }, TXMSG("@richtextbox.add")); _elWrap.appendChild(_elAddBtn); $tx.observe(_elAddBtn, 'click', function(ev) { _drawDeco(_elInput.value.toNumber() + 1); $tx.stop(ev); }); var _elSubBtn = tx.a({ href:'javascript:;', className: 'btn_sub' }, TXMSG("@richtextbox.sub")); _elWrap.appendChild(_elSubBtn); $tx.observe(_elSubBtn, 'click', function(ev) { _drawDeco(_elInput.value.toNumber() - 1); $tx.stop(ev); }); return _elWrap; }, generateBorderColor: function() { var _this = this; var _elWrap = Trex.MarkupTemplate.get("richtextbox.colorpallete").evaluateAsDom({"color": this.borderColor, "wrapClass": "tx-color-wrap"}); var _elPallete = $tom.collect(_elWrap, "div.tx-colorpallete"); var _changeBorderColor = function(color) { _this.elPreview.style.borderColor = _elThumb.style.backgroundColor = _this.borderColor = color; }; var _colorPallete = _NULL; var _toggleColorPallete = function() { if (_colorPallete == _NULL) { _colorPallete = _this.createColorPallete(_elPallete, _changeBorderColor); _colorPallete.show(); } else { if (!$tx.visible(_elPallete)) _colorPallete.show(); else _colorPallete.hide(); } }; this.externalBorderColorToggler = function(){ if ($tx.visible(_elPallete)) { _colorPallete.hide(); } }; var _elThumb = this.borderColorInput = $tom.collect(_elWrap, ".tx-color-box a"); $tx.observe(_elThumb, 'click', function(ev) { _this.externalBgColorToggler(); _toggleColorPallete(); $tx.stop(ev); }); var _elArrow = $tom.collect(_elWrap, "a.tx-color-arrow-down"); $tx.observe(_elArrow, 'click', function(ev) { _this.externalBgColorToggler(); _toggleColorPallete(); $tx.stop(ev); }); return _elWrap; }, createColorPallete: function(element, cmd) { var self = this; var pallete = new Trex.Menu.ColorPallete({el: element, thumbs: this.config.thumbs}); pallete.setCommand(cmd); pallete.observeJob(Trex.Ev.__MENU_LAYER_SHOW, function(ev){ self.fireJobs(Trex.Ev.__MENU_LAYER_SHOW, ev); }); pallete.observeJob(Trex.Ev.__MENU_LAYER_HIDE, function(ev){ self.fireJobs(Trex.Ev.__MENU_LAYER_HIDE, ev); }); pallete.observeJob(Trex.Ev.__MENU_LAYER_CHANGE_SIZE, function(ev){ self.fireJobs(Trex.Ev.__MENU_LAYER_CHANGE_SIZE, ev); }); return pallete; }, generateBgColor: function() { var _this = this; var _elWrap = Trex.MarkupTemplate.get("richtextbox.colorpallete").evaluateAsDom({"color":this.bgColor}); var _elPallete = $tom.collect(_elWrap, "div.tx-colorpallete"); var _changeBgColor = function(color) { _this.elPreview.style.backgroundColor = _elThumb.style.backgroundColor = _this.bgColor = color; }; var _colorPallete = _NULL; var _toggleColorPallete = function() { if (_colorPallete == _NULL) { _colorPallete = _this.createColorPallete(_elPallete, _changeBgColor); _colorPallete.show(); } else { if (!$tx.visible(_elPallete)) _colorPallete.show(); else _colorPallete.hide(); } }; this.externalBgColorToggler = function(){ if ($tx.visible(_elPallete)) { _colorPallete.hide(); } }; var _elThumb = this.bgColorInput = $tom.collect(_elWrap, ".tx-color-box a"); $tx.observe(_elThumb, 'click', function(ev) { _this.externalBorderColorToggler(); _toggleColorPallete(); $tx.stop(ev); }); var _elArrow = $tom.collect(_elWrap, "a.tx-color-arrow-down"); $tx.observe(_elArrow, 'click', function(ev) { _this.externalBorderColorToggler(); _toggleColorPallete(); $tx.stop(ev); }); return _elWrap; } });