function NLIN_WENFigure

% створюємо глобальну змінну TS, куди будуть записуватись дані
global TS; TS.index=0;
global TSTemp; TSTemp.index=0;

% визначаємо поточну розподільчу здатність, встановивши одиниці в PIXELS
set(0,'Units','pixels');
SCREEN_SIZE=get(0,'ScreenSize');
% SCREEN_SIZE = [left bottom width height]
SCRHeight=SCREEN_SIZE(1,4);

% створюємо фігуру розміром 100 x 600, що знаходиться у верхному лівому
% куті з відсутпом у 10 пікселів зверху та зліва
fg=figure('Position',[10,SCRHeight-630,300,600], 'Units','pixels', ...
          'HandleVisibility','on', 'MenuBar','none', 'Name','Wavelet Entropy research', ...
          'Resize','off', 'Tag','WaveLet entropy set properties figure', ...
          'NumberTitle','off', 'DeleteFcn',@DeleteFcn_Callback);
      
% записуємо handle фігури
handles.rootFigure=fg;

% створюємо меню користувача
menuRoot=uimenu('Parent',fg, 'Label','Файл', 'Tag', 'Menu File');
menuTemp=uimenu('Parent',menuRoot, 'Label','Читать', 'Tag','Menu File Load', 'Callback',@MenuFileLoad_Callback);
      
% створюємо статичний текст 
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,575,297,25], ...
          'String','Имеющиеся ряды:', 'FontName','Times New Roman', ...
          'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо ListBox
handles.ListBoxTS=uicontrol(fg, 'Style','listbox', 'Units','pixels', 'Position',[3,475,297,100], ...
          'String','', 'FontName','Times New Roman', ...
          'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'normal', ...
          'Tag', 'ListBoxTS', 'ListboxTop', 5);

% ==================================================================================================
% створюємо статичний текст та випадаючий список для введення типу вейвлет-перетворення
handles.WTTransformTypeText=uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', ...
          'Position',[3,425,175,25], 'String','Тип преобразования:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.WTTransformTypeEdit=uicontrol(fg, 'Style','popupmenu', 'Tag', 'WTTransformTypeEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[178,425,122,25], ...
          'String',['DWT     '; 'CWT     '; 'DWT (cs)'],...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal', ...
          'Value',1);

% створюємо статичний текст та випадаючий список для введення типу ентропії
handles.WTEntropyTypeText=uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', ...
          'Position',[3,400,175,25], 'String','Тип энтропии:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.WTEntropyTypeEdit=uicontrol(fg, 'Style','popupmenu', 'Tag', 'WTEntropyTypeEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[178,400,122,25], ...
          'String',['Scales'; 'Points'], 'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal', ...
          'Value',1);

% створюємо статичний текст та edit для введення значення початкового масштабу
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,375,225,25], ...
          'String','Начальный масштаб:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.sScaleEdit=uicontrol(fg, 'Style','Edit', 'Tag', 'sScaleEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[228,375,72,25], ...
          'String','0', 'FontName','Courier New', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо статичний текст та edit для введення значення кінцевого масштабу
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,350,225,25], ...
          'String','Конечный масштаб:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.eScaleEdit=uicontrol(fg, 'Style','Edit', 'Tag', 'eScaleEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[228,350,72,25], ...
          'String','0', 'FontName','Courier New', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо кнопку для розрахунку динамічної ентропії
handles.calcWEPushbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','calcWEButton', ...
          'Units','pixels', 'Position',[65,325,170,25], 'String','Рассчитать WE', ...
          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
          'Callback',@calcWEButton_Callback);

% ==================================================================================================
% створюємо статичний текст та edit для введення значення початкової ширини вікна
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,275,225,25], ...
          'String','Начальная ширина окна:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.beginWidthMovingWindowEdit=uicontrol(fg, 'Style','Edit', 'Tag', 'beginWidthMovingWindowEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[228,275,72,25], ...
          'String','1000', 'FontName','Courier New', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо статичний текст та edit для введення кроку зміни ширини вікна
handles.windowMovingText=uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', ...
          'Position',[3,250,250,25], 'String','Шаг перемещения окна:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.windowMovingEdit=uicontrol(fg, 'Style','Edit', 'Tag', 'windowMovingEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[228,250,72,25], ...
          'String','10', 'FontName','Courier New', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо кнопку для введення виду переміщення вікна
handles.kindOfMovingWindowPushbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','kindOfMovingWindowPushbutton', ...
          'Units','pixels', 'Position',[75,225,150,25], 'String','Перемещение окна', ...
          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
          'Max', 1, 'Min', 0, 'Value', 0, 'Callback',@kindOfMovingWindow_Callback);

% ==================================================================================================
% створюємо кнопку для розрахунку динамічної ентропії
handles.calcDynamicWEPushbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','calcDynamicWEButton', ...
          'Units','pixels', 'Position',[65,200,170,25], 'String','Динамическая WE', ...
          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
          'Callback',@calcDynamicWEButton_Callback);

% ==================================================================================================
% створюємо статичний текст та edit для введення значення початкового масштабу
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,150,225,25], ...
          'String','Начальный масштаб:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.beginScaleEdit=uicontrol(fg, 'Style','Edit', 'Tag', 'beginScaleEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[228,150,72,25], ...
          'String','1', 'FontName','Courier New', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо статичний текст та edit для введення значення кінцевого масштабу
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,125,225,25], ...
          'String','Конечный масштаб:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.endScaleEdit=uicontrol(fg, 'Style','Edit', 'Tag', 'endScaleEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[228,125,72,25], ...
          'String','200', 'FontName','Courier New', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо статичний текст та edit для введення значення кількості масштабів у вікні
uicontrol(fg, 'Style','text', 'Tag','', 'Units','pixels', 'Position',[3,100,225,25], ...
          'String','Количество масштабов:', ...
          'FontName','Times New Roman', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');
handles.scalesEdit=uicontrol(fg, 'Style','Edit', 'Tag', 'scalesEdit', ...
          'BackgroundColor',[1.0 1.0 1.0], 'Units','pixels', 'Position',[228,100,72,25], ...
          'String','10', 'FontName','Courier New', 'FontSize', 12, 'FontAngle', 'normal', 'FontWeight', 'normal');

% створюємо кнопку для розрахунку масштабової ентропії
handles.calcScalesWEPushbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','calcScalesWEButton', ...
          'Units','pixels', 'Position',[65,75,170,25], 'String','Рассчитать MWE', ...
          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
          'Callback',@calcScalesWEButton_Callback);

% створюємо кнопку для розрахунку динамічної масштабової ентропії
handles.calcDynamicScalesWEPushbutton=uicontrol(fg, 'Style','pushbutton', 'Tag','calcDynamicScalesWEButton', ...
          'Units','pixels', 'Position',[65,50,170,25], 'String','Динамическая MWE', ...
          'FontName','Times New Roman', 'FontSize', 10, 'FontAngle', 'normal', 'FontWeight', 'bold', ...
          'Callback',@calcDynamicScalesWEButton_Callback);

guidata(fg,handles);

% =============================================================================================================================
% Функція, що виконується при закритті фігури
function DeleteFcn_Callback(h,eventdata,handles)

% очищення пам"яті, що використовувалась для локальних змінних
global TSTemp;
clear TSTemp;

% =============================================================================================================================
% якщо клацнули по кнопці "Перемещение окна"
function kindOfMovingWindow_Callback(h,eventdata,handles)

handles=guidata(gcbo);
if (CmpStr(get(handles.kindOfMovingWindowPushbutton,'String'),'Перемещение окна')==0)
    set(handles.kindOfMovingWindowPushbutton,'String','Увеличение окна');
    set(handles.windowMovingText,'String','Шаг увеличения окна');
else
    set(handles.kindOfMovingWindowPushbutton,'String','Перемещение окна');
    set(handles.windowMovingText,'String','Шаг перемещения окна');
end

% =============================================================================================================================
% при натисненні на кнопку "Рассчитать WE"
function calcWEButton_Callback(h,eventdata,handles)

global TSTemp;
handles=guidata(gcbo);

index=get(handles.ListBoxTS,'Value');
X=TSTemp.data{index}.datas;

ttType=get(handles.WTTransformTypeEdit,'Value');    % 1 - DWT, 2 - CWT, 3 - DWT (constant scales)
teType=get(handles.WTEntropyTypeEdit,'Value');      % 1 - Scales, 2 - Points

tsScale=str2num(get(handles.sScaleEdit,'String'));
teScale=str2num(get(handles.eScaleEdit,'String'));

[SWT,POWER,Pj]=waventropy(X,ttType,teType,1,tsScale,teScale);

% очищуємо локальні змінні
clear index X ttType teType SWT POWER Pj;

% =============================================================================================================================
% при натисненні на кнопку "Динамическая WE"
function calcDynamicWEButton_Callback(h,eventdata,handles)

global TSTemp;
handles=guidata(gcbo);

index=get(handles.ListBoxTS,'Value');
X=TSTemp.data{index}.datas;

ttType=get(handles.WTTransformTypeEdit,'Value');    % 1 - DWT, 2 - CWT, 3 - DWT (constant scales)
teType=get(handles.WTEntropyTypeEdit,'Value');      % 1 - Scales, 2 - Points

wWidth=str2num(get(handles.beginWidthMovingWindowEdit,'String'));
wStep=str2num(get(handles.windowMovingEdit,'String'));
if (CmpStr(get(handles.kindOfMovingWindowPushbutton,'String'),'Перемещение окна')==0)
    actionType=1;        % переміщення вікна
else
    actionType=0;        % збільшення вікна
end

SWT=waventropy_dynamic(X,wWidth,wStep,actionType,ttType,teType,1);

% очищуємо локальні змінні
clear index X ttType teType wWidth wStep actionType SWT POWER Pj;

% =============================================================================================================================
% при натисненні на кнопку "Масштабовая WE"
function calcScalesWEButton_Callback(h,eventdata,handles)

global TSTemp;
handles=guidata(gcbo);

index=get(handles.ListBoxTS,'Value');
X=TSTemp.data{index}.datas;

ttType=get(handles.WTTransformTypeEdit,'Value');    % 1 - DWT, 2 - CWT, 3 - DWT (constant scales)
teType=get(handles.WTEntropyTypeEdit,'Value');      % 1 - Scales, 2 - Points

scaleBegin=str2num(get(handles.beginScaleEdit,'String'));
scaleEnd=str2num(get(handles.endScaleEdit,'String'));
scalesCount=str2num(get(handles.scalesEdit,'String'));

if (ttType==2) || (ttType==3)
    [SWT,POWER,Pj]=waventropy_scales(X,ttType,teType,scaleBegin,scaleEnd,scalesCount,1);
else
    msgbox('Такой метод рассчета не поддерживается','ВНИМАНИЕ!');
end

% очищуємо локальні змінні
clear index X ttType teType SWT POWER Pj;

% =============================================================================================================================
% при натисненні на кнопку "Динамическая SWE"
function calcDynamicScalesWEButton_Callback(h,eventdata,handles)

global TSTemp;
handles=guidata(gcbo);

index=get(handles.ListBoxTS,'Value');
X=TSTemp.data{index}.datas;

ttType=get(handles.WTTransformTypeEdit,'Value');    % 1 - DWT, 2 - CWT, 3 - DWT (constant scales)
teType=get(handles.WTEntropyTypeEdit,'Value');      % 1 - Scales, 2 - Points

wWidth=str2num(get(handles.beginWidthMovingWindowEdit,'String'));
wStep=str2num(get(handles.windowMovingEdit,'String'));
if (CmpStr(get(handles.kindOfMovingWindowPushbutton,'String'),'Перемещение окна')==0)
    actionType=1;        % переміщення вікна
else
    actionType=0;        % збільшення вікна
end

scaleBegin=str2num(get(handles.beginScaleEdit,'String'));
scaleEnd=str2num(get(handles.endScaleEdit,'String'));
scalesCount=str2num(get(handles.scalesEdit,'String'));

if (ttType==2) || (ttType==3)
    SWT=waventropy_dynamic_scales(X,wWidth,wStep,actionType,ttType,teType,scaleBegin,scaleEnd,scalesCount,1);
else
    msgbox('Такой метод рассчета не поддерживается','ВНИМАНИЕ!');
end

% очищуємо локальні змінні
clear index X ttType teType wWidth wStep actionType SWT POWER Pj scaleBegin scaleEnd scalesCount;

% =============================================================================================================================
% вибір пункту меню "Прочитати файл"
function MenuFileLoad_Callback(h,eventdata,handles)

% читаємо ім"я файла
[FILENAME,PATHNAME,FILTERINDEX]=uigetfile( ...
    {'*.txt;*.dat;*.ts', 'Файлы с данными (*.txt, *.dat, *.ts)'; ...
     '*.ts',             'Файлы с временными рядами (*.ts)'; ...
     '*.txt',            'Текстовые файлы (*.txt)'; ...
     '*.dat',            'Текстовый файлы с данными (*.dat)'}, ...
     'Выберите файл с временным рядом');

if ((FILENAME(1,1)~=0) & (PATHNAME(1,1)~=0))
    % читаємо дані з вибраного файла
    [NAMES,DATAS,DATES]=loadTS(PATHNAME,FILENAME);

    global TSTemp;
    
    % повідомляємо про прочитаний файл
    TSTemp.index=TSTemp.index+1;
    TSTemp.data{TSTemp.index}.datas=DATAS;
    TSTemp.data{TSTemp.index}.names=NAMES
    TSTemp.data{TSTemp.index}.dates=DATES
    
    % отримуємо handle ListBox
    handles=guidata(gcbo);
    ListBoxTS=handles.ListBoxTS;
    STRINGS=get(ListBoxTS,'String');
    STRINGS=appendString(STRINGS,FILENAME);
    set(ListBoxTS,'String',STRINGS);
end