305 lines
12 KiB
JavaScript
305 lines
12 KiB
JavaScript
/*
|
|
*
|
|
* (c) Copyright Ascensio System Limited 2010-2018
|
|
*
|
|
* This program is a free software product. You can redistribute it and/or
|
|
* modify it under the terms of the GNU Affero General Public License (AGPL)
|
|
* version 3 as published by the Free Software Foundation. In accordance with
|
|
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
|
|
* that Ascensio System SIA expressly excludes the warranty of non-infringement
|
|
* of any third-party rights.
|
|
*
|
|
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
|
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
|
|
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
|
*
|
|
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
|
|
* EU, LV-1021.
|
|
*
|
|
* The interactive user interfaces in modified source and object code versions
|
|
* of the Program must display Appropriate Legal Notices, as required under
|
|
* Section 5 of the GNU AGPL version 3.
|
|
*
|
|
* Pursuant to Section 7(b) of the License you must retain the original Product
|
|
* logo when distributing the program. Pursuant to Section 7(e) we decline to
|
|
* grant you any rights under trademark law for use of our trademarks.
|
|
*
|
|
* All the Product's GUI elements, including illustrations and icon sets, as
|
|
* well as technical writing content are licensed under the terms of the
|
|
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
|
|
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
|
*
|
|
*/
|
|
/**
|
|
* SearchDialog.js
|
|
*
|
|
* Created by Maxim Kadushkin on 03 March 2014
|
|
* Copyright (c) 2018 Ascensio System SIA. All rights reserved.
|
|
*
|
|
*/
|
|
|
|
/*
|
|
* Usage
|
|
* -----
|
|
*
|
|
* Configuration
|
|
* -------------
|
|
*
|
|
* @cfg {Boolean} matchcase
|
|
* Show or hide option "Case sensitive"
|
|
*
|
|
* @cfg {Boolean} matchword
|
|
* Show or hide option "Whole word"
|
|
*
|
|
* @cfg {Boolean} markresult
|
|
* Show or hide option "Highlight results"
|
|
*
|
|
*
|
|
* Methods
|
|
* -------
|
|
*
|
|
* @method show
|
|
* @params {String} mode
|
|
* 'search' - dialog has only 'search' options, 'replace' options aren't allowed ;
|
|
* 'collapsed' - dialog has all options, 'replace' options are hidden initially
|
|
* undefined value - dialog has all options
|
|
* */
|
|
|
|
define([
|
|
'common/main/lib/component/Window'
|
|
], function () {
|
|
'use strict';
|
|
|
|
Common.UI.SearchDialog = Common.UI.Window.extend(_.extend({
|
|
options: {
|
|
width : 550,
|
|
title : 'Search & Replace',
|
|
modal : false,
|
|
cls : 'search',
|
|
toolclose : 'hide',
|
|
alias : 'SearchDialog'
|
|
},
|
|
|
|
initialize : function(options) {
|
|
_.extend(this.options, options || {});
|
|
|
|
this.template = [
|
|
'<div class="box">',
|
|
'<div class="input-row">',
|
|
'<span class="btn-placeholder" id="search-placeholder-btn-options"></span>',
|
|
'<input type="text" id="sd-text-search" class="form-control" maxlength="100" placeholder="'+this.textSearchStart+'">',
|
|
'</div>',
|
|
'<div class="input-row">',
|
|
'<input type="text" id="sd-text-replace" class="form-control" maxlength="100" placeholder="'+this.textReplaceDef+'">',
|
|
'</div>',
|
|
'<div class="input-row">',
|
|
'<label class="link" id="search-label-replace" result="replaceshow">'+this.txtBtnReplace+'</label>',
|
|
'</div>',
|
|
'</div>',
|
|
'<div class="separator horizontal"/>',
|
|
'<div class="footer right">',
|
|
'<button class="btn normal dlg-btn" result="replace" style="margin-right: 6px;">'+this.txtBtnReplace+'</button>',
|
|
'<button class="btn normal dlg-btn" result="replaceall" style="margin-right: 10px;">'+this.txtBtnReplaceAll+'</button>',
|
|
'<button class="btn normal dlg-btn iconic" result="back" style="margin-right: 6px;"><span class="icon img-commonctrl back" /></button>',
|
|
'<button class="btn normal dlg-btn iconic" result="next"><span class="icon img-commonctrl next" /></button>',
|
|
'</div>'
|
|
].join('');
|
|
|
|
this.options.tpl = _.template(this.template)(this.options);
|
|
|
|
Common.UI.Window.prototype.initialize.call(this, this.options);
|
|
},
|
|
|
|
render: function() {
|
|
Common.UI.Window.prototype.render.call(this);
|
|
|
|
this.miMatchCase = new Common.UI.MenuItem({
|
|
caption : this.textMatchCase,
|
|
checkable : true
|
|
});
|
|
|
|
this.miMatchWord = new Common.UI.MenuItem({
|
|
caption : this.options.matchwordstr || this.textWholeWords,
|
|
checkable : true
|
|
});
|
|
|
|
this.miHighlight = new Common.UI.MenuItem({
|
|
caption : this.textHighlight,
|
|
checkable : true
|
|
});
|
|
|
|
this.btnOptions = new Common.UI.Button({
|
|
id : 'search-btn-options',
|
|
cls : 'btn-toolbar',
|
|
iconCls : 'btn-settings',
|
|
// hint : me.tipMerge,
|
|
menu : new Common.UI.Menu({
|
|
items : [
|
|
this.miMatchCase,
|
|
this.miMatchWord,
|
|
this.miHighlight
|
|
]
|
|
})
|
|
});
|
|
|
|
if (this.options.extraoptions) {
|
|
this.btnOptions.menu.addItem({caption:'--'});
|
|
this.options.extraoptions.forEach(function(item){
|
|
this.btnOptions.menu.addItem(item);
|
|
},this);
|
|
}
|
|
|
|
this.btnOptions.render(this.$window.find('#search-placeholder-btn-options'));
|
|
|
|
if (!this.options.matchcase) this.miMatchCase.hide();
|
|
if (!this.options.matchword) this.miMatchWord.hide();
|
|
if (!this.options.markresult) this.miHighlight.hide(); else
|
|
if (this.options.markresult.applied) this.miHighlight.setChecked(true,true);
|
|
if (this.options.mode==='search') $(this.$window.find('.input-row').get(2)).hide();
|
|
|
|
this.txtSearch = this.$window.find('#sd-text-search');
|
|
this.txtReplace = this.$window.find('#sd-text-replace');
|
|
this.lblReplace = this.$window.find('#search-label-replace');
|
|
|
|
this.miHighlight.on('toggle', _.bind(this.onHighlight, this));
|
|
|
|
this.$window.find('.btn[result=back]').on('click', _.bind(this.onBtnClick, this, 'back'));
|
|
this.$window.find('.btn[result=next]').on('click', _.bind(this.onBtnClick, this, 'next'));
|
|
this.$window.find('.btn[result=replace]').on('click', _.bind(this.onBtnClick, this, 'replace'));
|
|
this.$window.find('.btn[result=replaceall]').on('click', _.bind(this.onBtnClick, this, 'replaceall'));
|
|
this.$window.find('label[result=replaceshow]').on('click', _.bind(this.onShowReplace, this));
|
|
this.txtSearch.on('keydown', null, 'search', _.bind(this.onKeyPress, this));
|
|
this.txtReplace.on('keydown', null, 'replace', _.bind(this.onKeyPress, this));
|
|
|
|
this.on('animate:before', _.bind(this.focus, this));
|
|
|
|
return this;
|
|
},
|
|
|
|
show: function(mode) {
|
|
Common.UI.Window.prototype.show.call(this);
|
|
|
|
!this.mode && !mode && (mode = 'search');
|
|
if (mode && this.mode != mode) this.setMode(mode);
|
|
|
|
if (this.options.markresult && this.miHighlight.checked) {
|
|
this.fireEvent('search:highlight', [this, true]);
|
|
}
|
|
|
|
this.focus();
|
|
},
|
|
|
|
focus: function() {
|
|
var me = this;
|
|
setTimeout(function(){
|
|
me.txtSearch.focus();
|
|
me.txtSearch.select();
|
|
}, 10);
|
|
},
|
|
|
|
onKeyPress: function(event) {
|
|
if (!this.isLocked()) {
|
|
if (event.keyCode == Common.UI.Keys.RETURN) {
|
|
if (event.data == 'search')
|
|
this.onBtnClick('next', event); else
|
|
if (event.data == 'replace' && this.mode == 'replace') {
|
|
this.onBtnClick('replace', event);
|
|
}
|
|
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
} else
|
|
if (event.keyCode == Common.UI.Keys.ESC && $('.asc-loadmask').length<1) {
|
|
this.hide();
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
}
|
|
}
|
|
},
|
|
|
|
onBtnClick: function(action, event) {
|
|
if ( $('.asc-loadmask').length ) return;
|
|
var opts = {
|
|
textsearch : this.txtSearch.val(),
|
|
textreplace : this.txtReplace.val(),
|
|
matchcase : this.miMatchCase.checked,
|
|
matchword : this.miMatchWord.checked,
|
|
highlight : this.miHighlight.checked
|
|
};
|
|
this.fireEvent('search:'+action, [this, opts]);
|
|
},
|
|
|
|
setMode: function(m) {
|
|
this.mode = m;
|
|
var $inputs = this.$window.find('.input-row');
|
|
|
|
if (m === 'no-replace') {
|
|
this.setTitle(this.textTitle2);
|
|
|
|
$inputs.eq(1).hide();
|
|
$inputs.eq(2).hide();
|
|
|
|
this.$window.find('.btn[result=replace]').hide();
|
|
this.$window.find('.btn[result=replaceall]').hide();
|
|
|
|
if (this.options.matchcase || this.options.matchword ||this.options.markresult) {
|
|
} else {
|
|
this.txtSearch.addClass('clear');
|
|
this.btnOptions.hide();
|
|
}
|
|
|
|
this.setHeight(170);
|
|
} else {
|
|
this.txtSearch.removeClass('clear');
|
|
this.setTitle(this.textTitle);
|
|
|
|
if (m==='search') {
|
|
$inputs.eq(2).show();
|
|
this.lblReplace.text(this.txtBtnReplace);
|
|
$inputs.eq(1).hide();
|
|
this.$window.find('.btn[result=replace]').hide();
|
|
this.$window.find('.btn[result=replaceall]').hide();
|
|
this.setHeight(200);
|
|
} else {
|
|
$inputs.eq(2).show();
|
|
this.lblReplace.text(this.txtBtnHideReplace);
|
|
$inputs.eq(1).show();
|
|
this.$window.find('.btn[result=replace]').show();
|
|
this.$window.find('.btn[result=replaceall]').show();
|
|
this.setHeight(230);
|
|
}
|
|
}
|
|
},
|
|
|
|
onShowReplace: function(e) {
|
|
this.setMode((this.mode=='replace') ? 'search' : 'replace');
|
|
|
|
var me = this;
|
|
_.defer(function(){
|
|
(me.mode=='replace') ? me.txtReplace.focus() : me.txtSearch.focus();
|
|
}, 300);
|
|
},
|
|
|
|
onHighlight: function(o, value) {
|
|
this.fireEvent('search:highlight', [this, value]);
|
|
},
|
|
|
|
getSettings: function() {
|
|
return {
|
|
textsearch: this.txtSearch.val(),
|
|
casesensitive: this.miMatchCase.checked,
|
|
wholewords: this.miMatchWord.checked };
|
|
},
|
|
|
|
textTitle : 'Search & Replace',
|
|
textTitle2 : 'Search',
|
|
txtBtnReplace : 'Replace',
|
|
txtBtnReplaceAll : 'Replace All',
|
|
textMatchCase : 'Case sensitive',
|
|
textWholeWords : 'Whole words only',
|
|
textHighlight : 'Highlight results',
|
|
textReplaceDef : 'Enter the replacement text',
|
|
textSearchStart : 'Enter text for search',
|
|
txtBtnHideReplace : 'Hide Replace'
|
|
}, Common.UI.SearchDialog || {}));
|
|
}); |