Symbol table refactoring
This commit is contained in:
parent
73f268aa54
commit
28861851fb
|
@ -322,6 +322,9 @@ define([
|
|||
oRangeNames[272] = 'Supplementary Private Use Area A';
|
||||
oRangeNames[273] = 'Supplementary Private Use Area B';
|
||||
|
||||
var CELL_WIDTH = 31;
|
||||
var CELL_HEIGHT = 33;
|
||||
|
||||
var aFontSelects = [];
|
||||
var aRanges = [];
|
||||
var aRecents = [];
|
||||
|
@ -337,11 +340,16 @@ define([
|
|||
var sInitSymbol = "";
|
||||
|
||||
var nLastScroll = -1000;
|
||||
var bShowTooltip = true;
|
||||
|
||||
var sLastId = "";
|
||||
var nLastTime = -1000;
|
||||
|
||||
var lastTime = -1;
|
||||
var lastKeyCode = -1;
|
||||
|
||||
Common.Views.SymbolTableDialog = Common.UI.Window.extend(_.extend({
|
||||
options: {
|
||||
width: 400,
|
||||
width: 450,
|
||||
style: 'min-width: 230px;',
|
||||
cls: 'modal-dlg',
|
||||
buttons: ['ok', 'cancel']
|
||||
|
@ -353,8 +361,8 @@ define([
|
|||
}, options || {});
|
||||
|
||||
this.template = [
|
||||
'<div class="box" style="height: 260px;">',
|
||||
'<table cols="2" style="width: 100%;margin-bottom: 10px;">',
|
||||
'<div class="box">',
|
||||
'<table cols="2" style="width: 100%;">',
|
||||
'<tr>',
|
||||
'<td style="padding-right: 10px;padding-bottom: 8px;">',
|
||||
'<label class="input-label">' + this.textFont + '</label>',
|
||||
|
@ -366,21 +374,38 @@ define([
|
|||
'</td>',
|
||||
'</tr>',
|
||||
'<tr>',
|
||||
'<td colspan="2" style="padding-bottom: 8px;">',
|
||||
'<div id="scrollable-table-div"></div>',
|
||||
'<td colspan="2" style="padding-bottom: 16px;">',
|
||||
'<div id="symbol-table-scrollable-div" style="position: relative;">',
|
||||
'<div style="width: 100%;">',
|
||||
'<div id="id-preview">',
|
||||
'<div>',
|
||||
'<div style="position: absolute; top: 0;"><div id="id-preview-data" tabindex="0"></div></div>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'</div>',
|
||||
'</td>',
|
||||
'</tr>',
|
||||
'<tr>',
|
||||
'<td colspan="2" style="padding-bottom: 8px;">',
|
||||
'<td colspan="2" style="padding-bottom: 16px;">',
|
||||
'<label class="input-label">' + this.textRecent + '</label>',
|
||||
'<div id="symbol-table-recent"></div>',
|
||||
'<div style="width: 100%; padding-right: 10px;"><div id="symbol-table-recent" tabindex="0"></div>',
|
||||
'</td>',
|
||||
'</tr>',
|
||||
'<tr>',
|
||||
'<td colspan="2">',
|
||||
'<td style="padding-right: 10px;">',
|
||||
'<label class="input-label">' + this.textCode + '</label>',
|
||||
'</td>',
|
||||
'<td>',
|
||||
'</td>',
|
||||
'</tr>',
|
||||
'<tr>',
|
||||
'<td style="padding-right: 10px;">',
|
||||
'<div id="symbol-table-text-code"></div>',
|
||||
'</td>',
|
||||
'<td>',
|
||||
'<div id="symbol-table-label-font" style="overflow: hidden; text-overflow: ellipsis;white-space: nowrap;max-width: 160px;"></div>',
|
||||
'</td>',
|
||||
'</tr>',
|
||||
'</table>',
|
||||
'</div>'
|
||||
|
@ -389,6 +414,9 @@ define([
|
|||
this.options.tpl = _.template(this.template)(this.options);
|
||||
this.api = this.options.api;
|
||||
|
||||
var filter = Common.localStorage.getKeysFilter();
|
||||
this.appPrefix = (filter && filter.length) ? filter.split(',')[0] : '';
|
||||
|
||||
var fontList = this.api.pluginMethod_GetFontList();
|
||||
fontList.sort(function(a, b){
|
||||
if(a.m_wsFontName < b.m_wsFontName) return -1;
|
||||
|
@ -487,7 +515,8 @@ define([
|
|||
cls : 'input-group-nr',
|
||||
data : aFontSelects,
|
||||
editable : false,
|
||||
menuStyle : 'min-width: 100%; max-height: 200px;'
|
||||
search : true,
|
||||
menuStyle : 'min-width: 100%; max-height: 209px;'
|
||||
}).on('selected', function(combo, record) {
|
||||
var oCurrentRange = me.getRangeBySymbol(aRanges, nCurrentSymbol);
|
||||
nCurrentFont = record.value;
|
||||
|
@ -507,6 +536,7 @@ define([
|
|||
}
|
||||
bMainFocus = true;
|
||||
me.updateView();
|
||||
me.previewPanel.focus();
|
||||
});
|
||||
this.cmbFonts.setValue(nCurrentFont);
|
||||
|
||||
|
@ -514,7 +544,13 @@ define([
|
|||
el : $window.find('#symbol-table-cmb-range'),
|
||||
cls : 'input-group-nr',
|
||||
editable : false,
|
||||
menuStyle : 'min-width: 100%; max-height: 200px;'
|
||||
menuStyle : 'min-width: 100%; max-height: 209px;'
|
||||
}).on('selected', function(combo, record) {
|
||||
var oCurrentRange = me.getRangeByName(aRanges, parseInt(record.value));
|
||||
nCurrentSymbol = oCurrentRange.Start;
|
||||
bMainFocus = true;
|
||||
me.updateView(undefined, undefined, undefined, undefined, false);
|
||||
me.previewPanel.focus();
|
||||
});
|
||||
this.updateRangeSelector();
|
||||
|
||||
|
@ -526,10 +562,36 @@ define([
|
|||
validateOnBlur: false,
|
||||
validateOnChange: true
|
||||
}).on('changing', function(cmp, newValue, oldValue) {
|
||||
me.isTextChanged = true;
|
||||
var value = parseInt(newValue, 16);
|
||||
if(!isNaN(value) && value > 0x1F){
|
||||
var oRange = me.getRangeBySymbol(aRanges, value);
|
||||
if(oRange){
|
||||
var bUpdateTable = (me.$window.find("#c" + value).length === 0);
|
||||
nCurrentSymbol = value;
|
||||
bMainFocus = true;
|
||||
me.updateView(bUpdateTable, undefined, false);
|
||||
}
|
||||
}
|
||||
}).on('change:after', function(cmp, newValue, oldValue) {
|
||||
me.updateInput();
|
||||
});
|
||||
|
||||
// this.updateView(undefined, undefined, undefined, true);
|
||||
//fill recents
|
||||
this.fillRecentSymbols();
|
||||
|
||||
var container = this.$window.find('#fake-symbol-table-wrap');
|
||||
container.perfectScrollbar({
|
||||
theme: 'custom-theme',
|
||||
minScrollbarLength: 50
|
||||
});
|
||||
|
||||
this.previewPanel = this.$window.find('#id-preview-data');
|
||||
this.previewParent = this.previewPanel.parent();
|
||||
this.previewScrolled = this.$window.find('#id-preview');
|
||||
this.previewInner = this.previewScrolled.find('div:first-child');
|
||||
this.recentPanel = this.$window.find('#symbol-table-recent');
|
||||
this.fontLabel = this.$window.find("#symbol-table-label-font");
|
||||
this.updateView(undefined, undefined, undefined, true);
|
||||
|
||||
$window.find('.dlg-btn').on('click', _.bind(this.onBtnClick, this));
|
||||
},
|
||||
|
@ -537,16 +599,43 @@ define([
|
|||
show: function() {
|
||||
Common.UI.Window.prototype.show.apply(this, arguments);
|
||||
|
||||
if (!this.binding)
|
||||
this.binding = {};
|
||||
this.binding.keydownSymbols = _.bind(this.onKeyDown,this);
|
||||
this.binding.keypressSymbols = _.bind(this.onKeyPress,this);
|
||||
$(document).on('keydown.' + this.cid, '#symbol-table-scrollable-div #id-preview-data, #symbol-table-recent', this.binding.keydownSymbols);
|
||||
$(document).on('keypress.' + this.cid, '#symbol-table-scrollable-div #id-preview-data, #symbol-table-recent', this.binding.keypressSymbols);
|
||||
|
||||
var me = this;
|
||||
_.delay(function(){
|
||||
// me.inputUrl.cmpEl.find('input').focus();
|
||||
me.previewPanel.focus();
|
||||
},50);
|
||||
},
|
||||
|
||||
close: function(suppressevent) {
|
||||
$(document).off('keydown.' + this.cid, this.binding.keydownSymbols);
|
||||
$(document).off('keypress.' + this.cid, this.binding.keypressSymbols);
|
||||
|
||||
Common.UI.Window.prototype.close.apply(this, arguments);
|
||||
},
|
||||
|
||||
setSettings: function (props) {
|
||||
},
|
||||
|
||||
getSettings: function () {
|
||||
return this.getPasteSymbol(this.$window.find('.cell-selected').attr('id'));
|
||||
},
|
||||
|
||||
getPasteSymbol: function(cellId) {
|
||||
var bUpdateRecents = cellId[0] === 'c';
|
||||
var sFont;
|
||||
if(bUpdateRecents){
|
||||
sFont = aFontSelects[nCurrentFont].displayValue;
|
||||
} else {
|
||||
var nFontId = parseInt(cellId.split('_')[2]);
|
||||
sFont = aFontSelects[nFontId].displayValue;
|
||||
}
|
||||
return {font: sFont, symbol: this.encodeSurrogateChar(nCurrentSymbol), updateRecents: bUpdateRecents};
|
||||
},
|
||||
|
||||
onBtnClick: function(event) {
|
||||
|
@ -559,8 +648,13 @@ define([
|
|||
},
|
||||
|
||||
_handleInput: function(state) {
|
||||
var settings = this.getPasteSymbol(this.$window.find('.cell-selected').attr('id'));
|
||||
if (state=='ok') {
|
||||
settings.updateRecents && this.checkRecent(nCurrentSymbol, settings.font);
|
||||
settings.updateRecents && this.updateRecents();
|
||||
}
|
||||
if (this.options.handler) {
|
||||
this.options.handler.call(this, this, state);
|
||||
this.options.handler.call(this, this, state, settings);
|
||||
}
|
||||
|
||||
this.close();
|
||||
|
@ -662,8 +756,7 @@ define([
|
|||
return -1;
|
||||
},
|
||||
|
||||
createTable: function(arrSym, nRowsCount, nColsCount, oDiv){
|
||||
|
||||
createTable: function(arrSym, nRowsCount, nColsCount){
|
||||
var nDivCount = nRowsCount*nColsCount;
|
||||
var nCellsCounter = 0;
|
||||
var sInnerHtml = '';
|
||||
|
@ -692,23 +785,24 @@ define([
|
|||
nCellsCounter = 0;
|
||||
}
|
||||
}
|
||||
oDiv.innerHTML = sInnerHtml;
|
||||
this.previewPanel.html(sInnerHtml);
|
||||
// this.previewPanel[0].innerHTML = sInnerHtml;
|
||||
},
|
||||
|
||||
fillRecentSymbols: function(){
|
||||
var sRecents = window.localStorage.getItem('recentSymbols');
|
||||
var sRecents = Common.localStorage.getItem(this.appPrefix + 'recentSymbols');
|
||||
var aRecentCookies;
|
||||
if(sRecents != ''){
|
||||
aRecentCookies = JSON.parse(sRecents);
|
||||
}
|
||||
if(Array.isArray(aRecentCookies)){
|
||||
if(_.isArray(aRecentCookies)){
|
||||
aRecents = aRecentCookies;
|
||||
}
|
||||
},
|
||||
|
||||
saveRecent: function(){
|
||||
var sJSON = JSON.stringify(aRecents);
|
||||
window.localStorage.setItem('recentSymbols', sJSON);
|
||||
Common.localStorage.setItem(this.appPrefix + 'recentSymbols', sJSON);
|
||||
},
|
||||
|
||||
checkRecent: function(sSymbol, sFont){
|
||||
|
@ -730,10 +824,10 @@ define([
|
|||
},
|
||||
|
||||
createCell: function(nSymbolCode, sFontName){
|
||||
var sId;
|
||||
var sId = '',
|
||||
symbol = '';
|
||||
if(sFontName){
|
||||
var nFontIndex = 0;
|
||||
aFontSelects[nCurrentFont].displayValue
|
||||
for(var i = 0; i < aFontSelects.length; ++i){
|
||||
if(aFontSelects[i].displayValue === sFontName){
|
||||
nFontIndex = i;
|
||||
|
@ -741,52 +835,77 @@ define([
|
|||
}
|
||||
}
|
||||
sId = 'r_' + nSymbolCode + '_' + nFontIndex;
|
||||
}
|
||||
else{
|
||||
symbol = '&#' + nSymbolCode.toString();
|
||||
} else if (nSymbolCode!==undefined) {
|
||||
sId = 'r' + nSymbolCode;
|
||||
symbol = '&#' + nSymbolCode.toString();
|
||||
}
|
||||
var _ret = $('<div id=\"' + sId + '\">&#' + nSymbolCode.toString() + '</div>');
|
||||
var _ret = $('<div id=\"' + sId + '\">' + symbol + '</div>');
|
||||
_ret.addClass('cell');
|
||||
_ret.addClass('noselect');
|
||||
_ret.mousedown(cellClickHandler);
|
||||
_ret.mousedown(_.bind(this.cellClickHandler, this));
|
||||
if(sFontName){
|
||||
_ret.css('font-family', '\'' + sFontName + '\'');
|
||||
}
|
||||
//_ret.mouseup(function (e) {
|
||||
// e.stopPropagation();
|
||||
//});
|
||||
return _ret;
|
||||
},
|
||||
|
||||
updateRecents: function(){
|
||||
var oRecentsDiv = $('#recent-table');
|
||||
oRecentsDiv.empty();
|
||||
var nRecents = Math.min(this.getColsCount(), aRecents.length);
|
||||
if(aRecents.length === 0){
|
||||
oRecentsDiv.css('border', '1px solid rgb(247, 247, 247)');
|
||||
cellClickHandler: function (e) {
|
||||
var id = $(e.target).attr('id');
|
||||
if(!id){
|
||||
return;
|
||||
}
|
||||
oRecentsDiv.css('border', '1px solid rgb(122, 122, 122)');
|
||||
for(var i = 0; i < nRecents; ++i){
|
||||
var oCell = this.createCell(aRecents[i].symbol, aRecents[i].font);
|
||||
var nTime = (new Date()).getTime();
|
||||
if(id === sLastId && (nTime - nLastTime) < 300 ){
|
||||
this.cellDblClickHandler(e)
|
||||
}
|
||||
else{
|
||||
if(id[0] === 'c'){
|
||||
nCurrentSymbol = parseInt(id.slice(1, id.length));
|
||||
bMainFocus = true;
|
||||
}
|
||||
else{
|
||||
var aStrings = id.split('_');
|
||||
nCurrentSymbol = parseInt(aStrings[1]);
|
||||
nFontNameRecent = parseInt(aStrings[2]);
|
||||
bMainFocus = false;
|
||||
}
|
||||
this.updateView(false);
|
||||
}
|
||||
sLastId = e.target.id;
|
||||
nLastTime = nTime;
|
||||
},
|
||||
|
||||
cellDblClickHandler: function (e){
|
||||
var settings = this.getPasteSymbol($(e.target).attr('id'));
|
||||
settings.updateRecents && this.checkRecent(nCurrentSymbol, settings.font);
|
||||
settings.updateRecents && this.updateView(false, undefined, undefined, true);
|
||||
this.fireEvent('symbol:dblclick', [this, settings]);
|
||||
},
|
||||
|
||||
updateRecents: function(){
|
||||
var oRecentsDiv = this.recentPanel;
|
||||
oRecentsDiv.empty();
|
||||
var nCols = this.getColsCount(),
|
||||
nRecents = aRecents.length;
|
||||
oRecentsDiv.width(nCols * CELL_WIDTH);
|
||||
for(var i = 0; i < nCols; ++i){
|
||||
var oCell = (i<nRecents) ? this.createCell(aRecents[i].symbol, aRecents[i].font) : this.createCell();
|
||||
oCell.css('border-bottom', 'none');
|
||||
oRecentsDiv.append(oCell);
|
||||
if(i === (nRecents - 1)){
|
||||
if(i === (nCols - 1)){
|
||||
oCell.css('border-right', 'none');
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
getColsCount: function(){
|
||||
var nMaxWidth = $('#main-div').innerWidth() - 17 - 2;
|
||||
var nMaxWidth = this.$window.find('#symbol-table-scrollable-div').innerWidth();
|
||||
return ((nMaxWidth/CELL_WIDTH) >> 0);
|
||||
},
|
||||
|
||||
getMaxHeight: function(){
|
||||
|
||||
var nMaxHeight = $('#main-div').innerHeight() - 10 - $('#header-div').outerHeight(true) - $('#recent-symbols-wrap').outerHeight(true)
|
||||
- $('#value-wrap').outerHeight(true) - $('#insert-button').outerHeight(true) - 2;
|
||||
var nMaxHeight = this.$window.find('#symbol-table-scrollable-div').innerHeight();
|
||||
return nMaxHeight;
|
||||
},
|
||||
|
||||
|
@ -822,9 +941,8 @@ define([
|
|||
}
|
||||
aSymbols.push(nCode);
|
||||
}
|
||||
var oSymbolTable = $('#symbols-table')[0];
|
||||
$('#symbols-table').css('font-family', '\'' + aFontSelects[nCurrentFont].displayValue + '\'');
|
||||
this.createTable(aSymbols, nRowsCount, nColsCount, oSymbolTable);
|
||||
this.previewPanel.css('font-family', '\'' + aFontSelects[nCurrentFont].displayValue + '\'');
|
||||
this.createTable(aSymbols, nRowsCount, nColsCount);
|
||||
return nRowsSkip;
|
||||
},
|
||||
|
||||
|
@ -838,18 +956,18 @@ define([
|
|||
|
||||
if(bMainFocus){
|
||||
if(aFontSelects[nCurrentFont]){
|
||||
$("#font-name-label").text(aFontSelects[nCurrentFont].displayValue);
|
||||
this.fontLabel.text(aFontSelects[nCurrentFont].displayValue);
|
||||
}
|
||||
else{
|
||||
$("#font-name-label").text('');
|
||||
this.fontLabel.text('');
|
||||
}
|
||||
}
|
||||
else{
|
||||
if(aFontSelects[nFontNameRecent]){
|
||||
$("#font-name-label").text(aFontSelects[nFontNameRecent].displayValue);
|
||||
this.fontLabel.text(aFontSelects[nFontNameRecent].displayValue);
|
||||
}
|
||||
else{
|
||||
$("#font-name-label").text('');
|
||||
this.fontLabel.text('');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -857,15 +975,10 @@ define([
|
|||
//fill fonts combo box
|
||||
this.cmbFonts.setValue(nCurrentFont);
|
||||
}
|
||||
/*
|
||||
|
||||
//main table
|
||||
var nRowsCount = this.getRowsCount();
|
||||
|
||||
var nHeight = nRowsCount*CELL_HEIGHT - 1;
|
||||
$('#scrollable-table-div').height(nHeight);
|
||||
$('#scrollable-table-div').css('margin-bottom', this.getMaxHeight() - nHeight);
|
||||
|
||||
|
||||
bScrollMouseUp = false;
|
||||
if(bUpdateTable !== false){
|
||||
//fill table
|
||||
|
@ -876,27 +989,35 @@ define([
|
|||
var nAllRowsCount = Math.ceil(nSymbolsCount/this.getColsCount());
|
||||
var nFullHeight = nAllRowsCount*CELL_HEIGHT;
|
||||
|
||||
var nOldHeight = $("#fake-symbol-table-wrap").height();
|
||||
$("#fake-symbol-table-wrap").height(nHeight);
|
||||
$("#fake-symbol-table").height(nFullHeight);
|
||||
this.previewInner.height(nFullHeight);
|
||||
|
||||
if (!this.scrollerY)
|
||||
this.scrollerY = new Common.UI.Scroller({
|
||||
el: this.previewScrolled,
|
||||
minScrollbarLength: Math.max((CELL_HEIGHT*2.0/3.0 + 0.5) >> 0, ((nHeight/8.0 + 0.5) >> 0)),
|
||||
alwaysVisibleY: true,
|
||||
wheelSpeed: Math.min((Math.floor(this.previewPanel.height()/CELL_HEIGHT) * CELL_HEIGHT)/10, 20),
|
||||
useKeyboard: false,
|
||||
onChange: _.bind(function(){
|
||||
if (this.scrollerY) {
|
||||
this._preventUpdateScroll = true;
|
||||
this.onScrollEnd();
|
||||
this._preventUpdateScroll = false;
|
||||
this.previewParent.height(nHeight);
|
||||
this.previewParent.css({top: this.scrollerY.getScrollTop()});
|
||||
}
|
||||
}, this)
|
||||
});
|
||||
if (!this._preventUpdateScroll) {
|
||||
this.scrollerY.update({
|
||||
minScrollbarLength: Math.max((CELL_HEIGHT*2.0/3.0 + 0.5) >> 0, ((nHeight/8.0 + 0.5) >> 0))
|
||||
});
|
||||
this.scrollerY.scrollTop(nRowSkip*CELL_HEIGHT);
|
||||
}
|
||||
|
||||
var container = document.getElementById('fake-symbol-table-wrap');
|
||||
// if(nOldHeight !== nHeight){
|
||||
// Ps.destroy();
|
||||
// Ps = new PerfectScrollbar('#' + container.id, {
|
||||
// minScrollbarLength: Math.max((CELL_HEIGHT*2.0/3.0 + 0.5) >> 0, ((nHeight/8.0 + 0.5) >> 0))
|
||||
// });
|
||||
// }
|
||||
bShowTooltip = false;
|
||||
container.scrollTop = nRowSkip*CELL_HEIGHT;
|
||||
// Ps.update();
|
||||
bShowTooltip = true;
|
||||
var aCells = $('#symbols-table > .cell');
|
||||
aCells.mousedown(cellClickHandler);
|
||||
//aCells.mouseup(function (e) {
|
||||
// e.stopPropagation();
|
||||
//});
|
||||
var aCells = this.previewPanel.find('.cell');
|
||||
aCells.off('mousedown');
|
||||
aCells.mousedown(_.bind(this.cellClickHandler, this));
|
||||
}
|
||||
|
||||
//fill recent
|
||||
|
@ -905,31 +1026,74 @@ define([
|
|||
}
|
||||
|
||||
//reset selection
|
||||
$('.cell').removeClass('cell-selected');
|
||||
this.$window.find('.cell').removeClass('cell-selected');
|
||||
|
||||
//select current cell
|
||||
if(bMainFocus){
|
||||
$('#c' + nCurrentSymbol).addClass('cell-selected');
|
||||
this.$window.find('#c' + nCurrentSymbol).addClass('cell-selected');
|
||||
}
|
||||
else{
|
||||
$('#r_' + nCurrentSymbol + '_' + nFontNameRecent).addClass('cell-selected');
|
||||
this.$window.find('#r_' + nCurrentSymbol + '_' + nFontNameRecent).addClass('cell-selected');
|
||||
}
|
||||
|
||||
//update input
|
||||
if(bUpdateInput !== false){
|
||||
this.updateInput();
|
||||
}
|
||||
*/
|
||||
},
|
||||
|
||||
onScrollEnd: function(){
|
||||
if(this.scrollerY.getScrollTop() === nLastScroll){
|
||||
return;
|
||||
}
|
||||
|
||||
var nSymbolsCount = this.getAllSymbolsCount(aRanges);
|
||||
var nColsCount = this.getColsCount();
|
||||
var nRows = this.getRowsCount();
|
||||
var nAllRowsCount = Math.ceil(nSymbolsCount/nColsCount);
|
||||
var nFullHeight = nAllRowsCount*CELL_HEIGHT;
|
||||
var nRowSkip = Math.max(0, Math.min(nAllRowsCount - nRows, (nAllRowsCount*this.scrollerY.getScrollTop()/nFullHeight + 0.5) >> 0));
|
||||
nLastScroll = this.scrollerY.getScrollTop();
|
||||
if(!bMainFocus){
|
||||
nCurrentSymbol = this.getCodeByLinearIndex(aRanges, nRowSkip*nColsCount);
|
||||
bMainFocus = true;
|
||||
}
|
||||
else{
|
||||
var oFirstCell = this.previewPanel.children()[0];
|
||||
if(oFirstCell){
|
||||
var id = oFirstCell.id;
|
||||
if(id){
|
||||
var nOldFirstCode = parseInt(id.slice(1, id.length));
|
||||
var nOldFirstLinearIndex = this.getLinearIndexByCode(aRanges, nOldFirstCode);
|
||||
var nOldCurrentLinearIndex = this.getLinearIndexByCode(aRanges, nCurrentSymbol);
|
||||
var nDiff = nOldCurrentLinearIndex - nOldFirstLinearIndex;
|
||||
var nNewCurLinearIndex = nRowSkip*nColsCount + nDiff;
|
||||
nCurrentSymbol = this.getCodeByLinearIndex(aRanges, nNewCurLinearIndex);
|
||||
var nFirstIndex = nRowSkip*nColsCount;
|
||||
nNewCurLinearIndex -= nColsCount;
|
||||
while(nCurrentSymbol === -1 && nNewCurLinearIndex >= nFirstIndex){
|
||||
nCurrentSymbol = this.getCodeByLinearIndex(aRanges, nNewCurLinearIndex);
|
||||
nNewCurLinearIndex -= nColsCount;
|
||||
}
|
||||
if(nCurrentSymbol === -1){
|
||||
nCurrentSymbol = this.getCodeByLinearIndex(aRanges, nFirstIndex);
|
||||
}
|
||||
}
|
||||
else{
|
||||
nCurrentSymbol = this.getCodeByLinearIndex(aRanges, nRowSkip*nColsCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
this.updateView(true, this.getCodeByLinearIndex(aRanges, nRowSkip*nColsCount));
|
||||
},
|
||||
|
||||
updateInput: function(){
|
||||
|
||||
var sVal = nCurrentSymbol.toString(16).toUpperCase();
|
||||
var sValLen = sVal.length;
|
||||
for(var i = sValLen; i < 5; ++i){
|
||||
sVal = '0' + sVal;
|
||||
}
|
||||
$('#symbol-code-input').val(sVal);
|
||||
this.inputCode.setValue(sVal);
|
||||
},
|
||||
|
||||
updateRangeSelector: function() {
|
||||
|
@ -952,6 +1116,134 @@ define([
|
|||
}
|
||||
},
|
||||
|
||||
onKeyDown: function(e){
|
||||
if(document.activeElement){
|
||||
if(document.activeElement.nodeName && document.activeElement.nodeName.toLowerCase() === 'span'){
|
||||
return;
|
||||
}
|
||||
}
|
||||
var value = e.which || e.charCode || e.keyCode || 0;
|
||||
var bFill = true;
|
||||
if(bMainFocus){
|
||||
var nCode = -1;
|
||||
if ( value === 37 ){//left
|
||||
nCode = this.getCodeByLinearIndex(aRanges, this.getLinearIndexByCode(aRanges, nCurrentSymbol) - 1);
|
||||
}
|
||||
else if ( value === 38 ){//top
|
||||
nCode = this.getCodeByLinearIndex(aRanges, this.getLinearIndexByCode(aRanges, nCurrentSymbol) - this.getColsCount());
|
||||
}
|
||||
else if ( value === 39 ){//right
|
||||
nCode = this.getCodeByLinearIndex(aRanges, this.getLinearIndexByCode(aRanges, nCurrentSymbol) + 1);
|
||||
}
|
||||
else if ( value === 40 ){//bottom
|
||||
nCode = this.getCodeByLinearIndex(aRanges, this.getLinearIndexByCode(aRanges, nCurrentSymbol) + this.getColsCount());
|
||||
}
|
||||
else if(value === 36){//home
|
||||
if(aRanges.length > 0){
|
||||
nCode = aRanges[0].Start;
|
||||
}
|
||||
}
|
||||
else if(value === 35){//end
|
||||
if(aRanges.length > 0){
|
||||
nCode = aRanges[aRanges.length - 1].End;
|
||||
}
|
||||
}
|
||||
else if(value === 13){//enter
|
||||
this.checkRecent(nCurrentSymbol, aFontSelects[nCurrentFont].displayName);
|
||||
this.fireEvent('symbol:dblclick', {font: aFontSelects[nCurrentFont].displayName, symbol: this.encodeSurrogateChar(nCurrentSymbol)});
|
||||
}
|
||||
else{
|
||||
bFill = false;
|
||||
}
|
||||
if(nCode > -1){
|
||||
nCurrentSymbol = nCode;
|
||||
var bUpdateTable = this.$window.find('#c' + nCurrentSymbol).length === 0;
|
||||
this.updateView(bUpdateTable);
|
||||
}
|
||||
}
|
||||
else{
|
||||
var oSelectedCell, aStrings;
|
||||
if ( value === 37 ){//left
|
||||
oSelectedCell = this.$window.find('.cell-selected')[0];
|
||||
if(oSelectedCell && oSelectedCell.id[0] === 'r'){
|
||||
var oPresCell = this.$window.find(oSelectedCell).prev();
|
||||
if(oPresCell.length > 0){
|
||||
aStrings = this.$window.find(oPresCell).attr('id').split('_');
|
||||
nCurrentSymbol = parseInt(aStrings[1]);
|
||||
nFontNameRecent = parseInt(aStrings[2]);
|
||||
this.updateView(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ( value === 39 ){//right
|
||||
oSelectedCell = this.$window.find('.cell-selected')[0];
|
||||
if(oSelectedCell && oSelectedCell.id[0] === 'r'){
|
||||
var oNextCell = this.$window.find(oSelectedCell).next();
|
||||
if(oNextCell.length > 0){
|
||||
aStrings = this.$window.find(oNextCell).attr('id').split('_');
|
||||
nCurrentSymbol = parseInt(aStrings[1]);
|
||||
nFontNameRecent = parseInt(aStrings[2]);
|
||||
this.updateView(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(value === 36){//home
|
||||
var oFirstCell = this.$window.find('#recent-table').children()[0];
|
||||
if(oFirstCell){
|
||||
aStrings = oFirstCell.id.split('_');
|
||||
nCurrentSymbol = parseInt(aStrings[1]);
|
||||
nFontNameRecent = parseInt(aStrings[2]);
|
||||
this.updateView(false);
|
||||
}
|
||||
}
|
||||
else if(value === 35){//end
|
||||
var aChildren = this.recentPanel.children();
|
||||
var oLastCell = aChildren[aChildren.length - 1];
|
||||
if(oLastCell){
|
||||
aStrings = oLastCell.id.split('_');
|
||||
nCurrentSymbol = parseInt(aStrings[1]);
|
||||
nFontNameRecent = parseInt(aStrings[2]);
|
||||
this.updateView(false);
|
||||
}
|
||||
}
|
||||
else if(value === 13){//enter
|
||||
this.fireEvent('symbol:dblclick', {font: aFontSelects[nFontNameRecent].displayName, symbol: this.encodeSurrogateChar(nCurrentSymbol)});
|
||||
}
|
||||
else{
|
||||
bFill = false;
|
||||
}
|
||||
}
|
||||
|
||||
if(bFill){
|
||||
lastKeyCode = value;
|
||||
lastTime = (new Date()).getTime();
|
||||
}
|
||||
},
|
||||
|
||||
onKeyPress: function(e){
|
||||
if(document.activeElement){
|
||||
if(document.activeElement.nodeName && document.activeElement.nodeName.toLowerCase() === 'span'){
|
||||
return;
|
||||
}
|
||||
}
|
||||
var value = e.which || e.charCode || e.keyCode || 0;
|
||||
if(lastKeyCode === value){
|
||||
if(Math.abs(lastTime - (new Date()).getTime()) < 1000){
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(!isNaN(value) && value > 0x1F){
|
||||
var oRange = this.getRangeBySymbol(aRanges, value);
|
||||
if(oRange){
|
||||
var bUpdateTable = (this.$window.find("#c" + value).length === 0);
|
||||
nCurrentSymbol = value;
|
||||
bMainFocus = true;
|
||||
this.updateView(bUpdateTable, undefined, true);
|
||||
}
|
||||
}
|
||||
e.preventDefault && e.preventDefault();
|
||||
},
|
||||
|
||||
textTitle: 'Symbol Table',
|
||||
textFont: 'Font',
|
||||
textRange: 'Range',
|
||||
|
|
54
apps/common/main/resources/less/symboltable.less
Normal file
54
apps/common/main/resources/less/symboltable.less
Normal file
|
@ -0,0 +1,54 @@
|
|||
#symbol-table-scrollable-div, #symbol-table-recent {
|
||||
div{
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.cell{
|
||||
width: 31px;
|
||||
height: 33px;
|
||||
border-right: 1px solid @gray-soft;
|
||||
border-bottom: 1px solid @gray-soft;
|
||||
background: #ffffff;
|
||||
align-content: center;
|
||||
vertical-align: middle;
|
||||
text-align: center;
|
||||
font-size: 22px;
|
||||
-khtml-user-select: none;
|
||||
user-select: none;
|
||||
-moz-user-select: none;
|
||||
-webkit-user-select: none;
|
||||
cursor: default;
|
||||
overflow:hidden;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.cell-selected{
|
||||
background-color: @gray-darker;
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
|
||||
#symbol-table-recent {
|
||||
width: 100%;
|
||||
height: 32px;
|
||||
overflow: hidden;
|
||||
border: @gray-soft solid 1px;
|
||||
}
|
||||
|
||||
#symbol-table-scrollable-div {
|
||||
#id-preview {
|
||||
width: 100%;
|
||||
height: 132px !important;
|
||||
position:relative;
|
||||
overflow:hidden;
|
||||
border: @gray-soft solid 1px;
|
||||
}
|
||||
|
||||
#id-preview-data {
|
||||
width: 100%;
|
||||
height: 134px !important;
|
||||
position:relative;
|
||||
overflow:hidden;
|
||||
}
|
||||
}
|
|
@ -2481,7 +2481,8 @@ define([
|
|||
api: me.api,
|
||||
handler: function(dlg, result) {
|
||||
if (result == 'ok') {
|
||||
// dlg.getSettings();
|
||||
var settings = dlg.getSettings();
|
||||
me.api.pluginMethod_PasteHtml("<span style=\"font-family:'" + settings.font + "'\">" + settings.symbol + "</span>");
|
||||
}
|
||||
Common.NotificationCenter.trigger('edit:complete', me.toolbar);
|
||||
}
|
||||
|
|
|
@ -118,6 +118,7 @@
|
|||
@import "../../../../common/main/resources/less/toolbar.less";
|
||||
@import "../../../../common/main/resources/less/language-dialog.less";
|
||||
@import "../../../../common/main/resources/less/winxp_fix.less";
|
||||
@import "../../../../common/main/resources/less/symboltable.less";
|
||||
|
||||
// App
|
||||
// --------------------------------------------------
|
||||
|
|
Loading…
Reference in a new issue