function GUI_example()
%% Простой GUI, созданный с помощью GUI Layout Toolbox
% http://www.mathworks.com/matlabcentral/fileexchange/27758-gui-layout-toolbox
%% Убираем старое окно программы, оставшееся от прошлого запуска
main_fig  =  findobj('Type',  'figure',  'Tag',  'GUI_example');
if ishandle(main_fig)
close(main_fig);
end
%
rng('shuffle')
%
% Все данные храним в структуре S
%% INTERFACE: *Main window
% Координаты для основного окна программы
un          = get(0, 'units');
set(0, 'units', 'pixels');
screenSize  = get(0, 'ScreenSize');
sW          = screenSize(3);
sH          = screenSize(4);
set(0, 'units', un);
% figure width and height (in pixels)
fW          = sW-400;
fH          = sH-400;
% Сначала создаем основную фигуру
S.hmain_fig=figure('Units'          ,'pixels'          ,...
                   'Position'       ,[50, 100, fW, fH] ,...
                   'MenuBar'        ,'none'            ,...
                   'Name'           ,'GUI EXAMPLE'     ,...
                   'NumberTitle'    ,'off'             ,...
                   'Resize'         ,'on'              ,...
                   'Tag'            , 'GUI_example'    ,...
                   'Visible'        , 'off'            ,... % DO NOT SHOW figure until we finish!!
                   'CloseRequestFcn', @main_closefcn   );
% Можно координаты задать точно, но можно с помощью команды move расположить 
% фигуру так, как нужно
movegui(S.hmain_fig,'center');
S.position=get(S.hmain_fig,'Position');
%% Создаем интерфейс
% Сначала создаем сетку с помощью Grid - будет две колонки.
% В колонке справа расположим два бокса (BOX) - в верхнем боксе кнопки
% управления, в нижнем боксе выводится дополнительная информация.
% В правой колонке будут только оси координат
%
% Сначала создаем сетку Grid
S.hgrid= uiextras.Grid( 'Parent', S.hmain_fig, 'Spacing', 1 );
% Расположение ячеек задаем с помощью 
set(S.hgrid, 'RowSizes', -1,'ColumnSizes', [-1 -1]); % один ряд, две колонки
%  Если размер равен -1, это значит, что размер выбирается автоматически.
%% INTERFACE: MAINBOX
% В левую колонку сетки Grid добавляем бокс (Box) для копок
% VBox - это значит, что элементы, расположенные в этом боксе будут
% распологаться автоматически вертикально
S.hbox_main = uiextras.VBox( 'Parent', S.hgrid); 
%% INTERFACE: MAINPANEL ===================================================
% Вертикальный бокс в левой колонке создан, создаем в нем панели
% Панель с кнопками управления
S.hpanel_main = uiextras.Panel('Parent',S.hbox_main,'Title'          , 'Управление',... 
                                                    'TitlePosition'  , 'CenterTop' ,...
                                                    'FontSize'       , 16          ,...
                                                    'ForegroundColor', 'r'         ,...
                                                    'FontWeight'     , 'bold'      ,...
                                                    'BorderType'     , 'none');
% В панели S.hpanel_main создаем бокс
S.hbox_control=uiextras.VBox( 'Parent', S.hpanel_main); 
%% INTERFACE: MAINPANEL *Generate DATA BUTTON
% Панель MAINPANEL создана, теперь можно добавлять кнопки
% Кнопка сгенерировать данные
S.hpb_gen_dat = uicontrol('style','push'    ,...
                                  'Parent'  ,S.hbox_control        ,...
                                  'FontSize',14                    ,...
                                  'String'  ,'Сгенерировать данные',...
                                  'CallBack',{@pb_gen_data,S});
%% INTERFACE: MAINPANEL *CLEAR DATA BUTTON
% Кнопка стереть данные
S.hpb_clear_dat = uicontrol('style','push'    ,...
                                    'Parent'  ,S.hbox_control        ,...
                                    'FontSize',14                    ,...
                                    'String'  ,'Стереть данные',...
                                    'CallBack',{@pb_del_data,S}); 
%% INTERFACE: STATPANEL ===================================================
% В тот же главный бокс S.hbox_main добавляем панель со статистикой
S.hpanel_stat = uiextras.Panel('Parent',S.hbox_main,'Title'          , 'Статистика',...
                                                    'TitlePosition'  , 'CenterTop' ,...
                                                    'FontSize'       , 16          ,...
                                                    'ForegroundColor', 'r'         ,...
                                                    'FontWeight'     , 'bold'      ,...
                                                    'BorderType'     , 'none'      );
% В панель со статистикой добавляем бокс
S.hbox_stat = uiextras.VBox( 'Parent', S.hpanel_stat); 
%% INTERFACE: STATPANEL *EDIT_BOXES
% В созданный бокс добавляем editboxes
S.hed_stat1=uicontrol('Style'          , 'edit'     ,...
                      'Parent'         , S.hbox_stat,...
                      'FontSize'       , 14         ,...
                      'ForegroundColor', 'k'        ,...
                      'String'         , '===•••===',...
                      'Enable'         , 'inactive');
S.hed_stat2=uiextras.Empty('Parent', S.hbox_stat) ;  % пустая клетка 
S.hed_stat3=uicontrol('Style'          , 'edit'     ,...
                      'Parent'         , S.hbox_stat,...
                      'FontSize'       , 14         ,...
                      'ForegroundColor', 'k'        ,...
                      'String'         , '===•••===',...
                      'Enable'         , 'inactive');   
%% INTERFACE: MAINBOX*SIZES       
% Задаем размер двух панелей, которые находятся в левой колонке сетки (Grid)
% Это панели управления и панели статистики
% S.hbox_main у нас содержит S.hpanel_main и S.hpanel_stat
set(S.hbox_main,'Sizes',[-1 -1]); 
%% INTERFACE: AXESPANEL    
% Панель с графиками
S.hpanel_tabs=uiextras.TabPanel('Parent',S.hgrid,'FontSize'       , 14,...
                                                 'ForegroundColor','b',...
                                                 'TabSize', 400); 
% Создаем оси в панели TabPanel 
S.hax1= axes('Parent',S.hpanel_tabs,'Tag','Axes 1');
S.hax2= axes('Parent',S.hpanel_tabs,'Tag','Axes 2');
S.hpanel_tabs.TabNames = {'Axes 1', 'Axes 2'};
S.hpanel_tabs.SelectedChild = 1;
%%

% set(S.hgrid, 'ColumnSizes', -1, 'RowSizes', [-1 -1]); 
% S.hpanel_tabs1=uiextras.TabPanel('Parent',S.hgrid); 
% S.hax1= axes('Parent',S.hpanel_tabs1,'ActivePositionProperty','Position','Tag','Axes 1');
% S.hax2= axes('Parent',S.hpanel_tabs1,'ActivePositionProperty','Position','Tag','Axes 2');
%% SHOW FIGURE
% Следующие операции нужны, чтобы пользователь не видел, как строится
% интерфейс. Это нужно только для GUILayot toolbox
% Если эти шаги пропустить, то пользователь увидит, как перестраивается
% сетка
%
% Сначала уменьшаем фигуру до одного пикселя и делаем ее видимой, тогда все
% элементы успевают перестроиться, но пользователь не видит это.
set(S.hmain_fig,'Position',[1 1 1 1]);
set(S.hmain_fig,'Visible','on');
drawnow;
% Опять скрываем фигуру и возвращаем ей прежние размеры
set(S.hmain_fig,'Visible','off');
set(S.hmain_fig,'Position',S.position);
drawnow
% Показываем фигуру пользователю
set(S.hmain_fig,'Visible','on');
drawnow
%% Общая концепция
% 1. Создаем сетку (uiextras.Grid),
% 2. На сетку помещаем панели (uiextras.Panel),
% 3. На панели помещаем боксы (uiextras.Box)
% 4. В боксы помещаем элементы управления: кнопки, оси или еще что-нибудь.
% Можно сначала создать единую панель, а на ней располагать сетки и боксы.
%% Программирование функций
S.X    =[];
S.Y1   =[];
S.Y2   =[];
S.mean1=[];
S.mean2=[];
S.hplt1=NaN; % NaN для handle
S.hplt2=NaN;
%% SUBFUNCTION: *pb_gen_data
function pb_gen_data(varargin)
% src=varargin{1};
% eventdata=varargin{2};
% S=varargin{3}; % при такой реализации обмена данных между функциями это не нужно
%
% Generate random data
N=randi(1000,1000);
N=N(find(N<100,1,'first'));
%
S.X=rand(N,1);
S.Y1=1./(1+exp(-S.X));
S.Y2=1/sqrt(2*pi).*exp(-(S.X).^2);
S.mean1=mean(S.Y1);
S.mean2=mean(S.Y2);
% Удаляем прошлые графики
if ishandle(S.hplt1)
delete(S.hplt1);
delete(S.hplt2);
end
%Plots
S.hplt1=stairs(S.hax1,S.Y1,'rO-','DisplayName','Y1');
S.hplt2=stairs(S.hax2,S.Y2,'b*-','DisplayName','Y2');
%Stat data
str1=['N = ' num2str(N) ' points' ];
str3=['Mean1 = ' num2str(S.mean1) ' Mean2 = ' num2str(S.mean2) ];
set(S.hed_stat1,'String',str1);
set(S.hed_stat3,'String',str3);
end %pb_gen_data
%% SUBFUNCTION: *pb_del_data
function pb_del_data(varargin)
% Удаляем прошлые графики
if ishandle(S.hplt1)
delete(S.hplt1);
delete(S.hplt2);
%
str='===•••===';
set(S.hed_stat1,'String',str);
set(S.hed_stat3,'String',str);
%
S.X   =[];
S.Y1  =[];
S.Y2  =[];
S.mean=[];
end
%
end %pb_del_data
%% *CloseRequestFcn
function main_closefcn(varargin)
% src=varargin{1};
% eventdata=varargin{2};    
% src - это хэндл к объекту, который вызвал функцию CloseRequestFcn
% eventdata - это событие
delete(S.hmain_fig);
end % main_closefcn
%          
%
end %GUI_example