Trex.I.ButtonFontTool = Trex.Mixin.create({ oninitialized: function(config) { var self = this; self.button = new Trex.Button(self.buttonCfg); self.weave(self.button, _NULL, self.handler); if (config.sync) { self.startSyncButtonWithStyle(); } self.bindKeyboard(config.hotKey, self.handler.bind(self)); }, rangeExecutor: function(processor, newStyle, range) { var el = null; if($tx.msie && this.wrapDummy && processor.isCollapsed()){ el = this.wrapDummy(processor, range); processor.execCommand(this.getQueryCommandName()); var rng = processor.createGoogRangeFromNodes(el, 1, el, 1); rng.select(); }else { processor.execCommand(this.getQueryCommandName()); } }, onAfterHandler: function(data) { // TODO 현재 툴의 state만 변경하면 되는데, 불필요하게 Trex.Ev.__CANVAS_PANEL_QUERY_STATUS를 fire한다. var canvas = this.canvas; if (canvas.triggerQueryStatus) { canvas.triggerQueryStatus(); } }, startSyncButtonWithStyle: function() { var self = this; self.canvas.observeJob(Trex.Ev.__CANVAS_PANEL_QUERY_STATUS, function(goog_range) { self.syncButton(self.queryCurrentStyle(goog_range)); }); }, queryCurrentStyle: function(goog_range) { var self = this; var state = self.canvas.query(function(processor) { var command = self.getQueryCommandName(); var minGeckoVersion = 20; var geckoQueryCommandStateNotWorkingVersion = ($tx.gecko && $tx.gecko_ver < minGeckoVersion); if (command && !$tx.opera && !geckoQueryCommandStateNotWorkingVersion) { // gecko? : FTDUEDTR-1181 // opera?: ... 인 경우에 bold 상태가 false로 나온다. ...인 경우는 제대로 나옴. return processor.queryCommandState(command); } else { var targetNode = self.findQueryingNode(goog_range); return !!targetNode && self.isStyleApplied(targetNode); } }); return state; }, computeNewStyle: function() { return _NULL; }, cachedProperty: _FALSE, syncButton: function(state) { if (this.cachedProperty != state) { this.button.setState(state); this.cachedProperty = state; } } });