diff m-toolbox/m/gui/gltpda/ltpdagui.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/m/gui/gltpda/ltpdagui.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,524 @@
+function ltpdagui(varargin)
+
+% =========================================================================
+%                               LTPDA GUI
+% =========================================================================
+% 
+%  Open the main LTPDA GUI.
+%
+%  $Id: ltpdagui.m,v 1.27 2009/01/23 12:40:51 nicola Exp $
+
+warning off all
+global LTPDAinvar LTPDAoutvar active labels scaleX
+
+tabbedFigName = 'Family GUI';
+   screenSize = get(0,'screensize');
+   scaleX     = screenSize(3)/1280;
+   if scaleX<1, scaleX = 1; end
+   setappdata(0, 'ltpda_gui_scalefactor',scaleX);
+   guiSize = [1 1 600*scaleX 550*scaleX];
+guiSize = round([(screenSize(3)-guiSize(3))/2 , (screenSize(4)-guiSize(4))/2 , guiSize(3) , guiSize(4)]);
+
+if ~isempty(findobj('Tag','LTPDAGUI')) && nargin==0, return; end
+
+if isempty(LTPDAinvar),  LTPDAinvar  = {}; end
+if isempty(LTPDAoutvar), LTPDAoutvar = {}; end
+
+userID = getappdata(0,'ltpda_repo_user');
+  if isempty(userID), userID = ''; end
+passwd = getappdata(0,'ltpda_repo_pass');
+  if isempty(passwd), passwd = ''; end
+  
+if nargin==0, setappdata(0,'startup',1); [userID passwd] = utils.mysql.logindlg(userID,'',1,tabbedFigName,guiSize); try cd(getappdata(0,'DefaultDataDirectory')); catch, end; end
+  if isempty(userID), userID = 'JohnDoe'; passwd=''; end
+
+setappdata(0,'ltpda_repo_user',userID)
+setappdata(0,'ltpda_repo_pass',passwd)
+
+if nargin==0
+    clc
+    disp('Please wait: starting LTPDA GUI...')
+    disp('Loading Simulink...')
+    drawnow
+    load_system('simulink')
+    load_system('ltpda_library')
+end
+
+try stop(timerfindall); delete(timerfindall); catch end
+t1 = timer('TimerFcn',@CheckTimerAlive,'ExecutionMode','fixedRate','Period',0.3);
+t2 = timer('TimerFcn',@CheckTimerAlive,'ExecutionMode','fixedRate','Period',1);
+start(t1)
+start(t2)
+
+%%
+
+tag = '';
+units = 'normalized';
+position = [0,0,1,1];
+
+% text color in the label:
+  foregroundcolor = [0.2,0.2,0.2];
+% color in the background, behind tabs:
+  backgroundcolor = [0.7,0.7,1];
+% background color, inside every tab:
+  panelbackgroundcolor = [0.98,0.98,0.98];
+% color of the small highlight line, above the selected tab
+  titlehighlightcolor = [1,0.3,0];
+
+horizontalalignment = 'center';
+
+active = 0;
+string = {'Main LTPDA panel','Parameters','Output','';'Repository','Partial execution','Nested loops','Globals'};
+   nrows = size(string,1);
+   if nrows>1
+       for nn=1:nrows, labels{nn} = string(nn,:); end
+       string = string(1,:);
+   end
+   ntab = numel(string);
+   for jj=ntab:-1:1, ntab = ntab - strcmp(string(jj),''); end
+     
+% Cycle to retrieve parameters from the user:
+  for mm=1:2:nargin
+      property = lower(varargin{mm});
+      value = varargin{mm+1};
+      switch property
+          case {'title','string'}
+              string = value;
+              nrows = size(string,1);
+              if nrows>1
+                  for nn=1:nrows, labels{nn} = string(nn,:);end
+                  string = string(1,:);
+              end
+              ntab = numel(string);
+              for jj=ntab:-1:1, ntab = ntab - strcmp(string(jj),''); end
+          case {'frameposition','position'}
+              position = value;
+          case {'framebackgroundcolor','backgroundcolor'}
+              backgroundcolor = value;
+          case {'framebordertype','bordertype'}
+              bordertype = value;
+          case {'titleforegroundcolor','foregroundcolor'}
+              foregroundcolor = value;
+          case {'selecteditem','active'}
+              active = value;
+          case 'redraw'
+              if value == 1 % main panel
+                  TopBottomTabCbk([],[],1,1)
+                  active = 1;
+                  return
+              end
+              if value == 1.1 % the user clicked the Start button
+                  TopBottomTabCbk([],[],1,1)
+                  active = 1;
+                  runSim = 1;
+              end
+              if value == 2 % Parameters panel
+                  TopBottomTabCbk([],[],2,1)
+                  active = 1;
+                  return
+              end
+              if value == 6 % globals panel
+                  TopBottomTabCbk([],[],4,2)
+                  active = 1;
+                  return
+              end
+              if value == 8 % nested loops
+                  TopBottomTabCbk([],[],3,2)
+                  active = 1;
+                  return
+              end
+              
+          case 'callback'
+              if value==1 && strcmp(bdroot,'ltpda_library')
+                  HelpCallback();
+                  return;
+              end
+              if value==1 && isempty(findobj('Name',tabbedFigName))
+                  return;
+              end
+          otherwise
+              eval([property '= ' value ';']);
+      end
+  end
+
+parent   = findobj('Tag','LTPDAGUI');
+if ~isempty(parent), clf(parent); set(parent,'Resize','on','ResizeFcn',{@GUIResize,guiSize});
+else parent = figure('Position',guiSize,'Name',tabbedFigName,'Resize','on','ResizeFcn',{@GUIResize,guiSize},'NumberTitle','off','Toolbar','none','Menubar','none');
+end
+
+set(parent,'Tag','LTPDAGUI','NextPlot','new');
+
+if ~exist('margins','var'), margins = {1,'pixels'}; end
+if ~iscell(margins), margins = {margins,units}; end
+if ~exist('bordertype','var'), bordertype = 'none'; end
+if ~exist('titlebackgroundcolor','var'), titlebackgroundcolor = 0.95*panelbackgroundcolor; end
+if ~active, active = 1; end
+
+clear htab
+htab = uipanel( ...
+  'Parent',parent, ...
+  'Units',units, ...
+  'Position',position, ...
+  'BackgroundColor',backgroundcolor, ...
+  'BorderType',bordertype, ...
+  'Visible','on', ...
+  'Tag',tag);
+
+  set(htab,'Units','pixels');
+  tabpos = get(htab,'Position');
+  
+
+status = uicontainer( ...
+  'Parent',htab, ...
+  'BackgroundColor',backgroundcolor, ...
+  'Units',margins{2}, ...
+  'Position',[1,1,1,1], ...
+  'Visible','off');
+
+  set(status,'Units','pixels');
+  charsz = get(status,'Position');
+
+margins = [charsz(1:2),charsz(1:2)].*margins{1};
+set(status,'Units','characters');
+set(status,'Position',[1,1,1,1]);
+set(status,'Units','pixels');
+charsz = get(status,'Position');
+titleheight = 2.4*charsz(4);
+titleheight = titleheight*scaleX;
+
+margins(3:4) = -(margins(1:2)+margins(3:4));
+[loop,sign] = deal(1:ntab,[1,ntab,1,0]);
+
+addtitle = 2*[sign(3:4),-1,-1];
+ttextpos = [0.05,0.08,0.9,0.76];
+    
+  for kk=1:ntab
+    title(kk) = uipanel( ...
+      'Parent',htab, ...
+      'Units','pixels', ...
+      'BackgroundColor',titlebackgroundcolor, ...
+      'BorderType','beveledout', ...
+      'ButtonDownFcn',{@TopBottomTabCbk,kk,1}, ...
+      'Visible','on');
+
+    ttext(kk) = uicontrol( ...
+      'Parent',title(kk), ...
+      'Units','normalized', ...
+      'Position',ttextpos, ...
+      'ForegroundColor',foregroundcolor, ...
+      'BackgroundColor',titlebackgroundcolor, ...
+      'HorizontalAlignment',horizontalalignment, ...
+      'Style','text', ...
+      'String',string{kk}, ...
+      'FontSize',11*scaleX,...
+      'Enable','inactive', ...
+      'HitTest','off',...
+      'Visible','on');
+
+  end
+
+  set(htab,'Units','pixels');
+  dimension = get(htab,'Position');
+  dimension(4) = dimension(4)-nrows*titleheight+5;
+  panel = uipanel('Parent',htab,'Tag','mainPanel','Units','pixels','Position',dimension,'BackgroundColor',panelbackgroundcolor,'BorderType','beveledout','Visible','on');
+  
+  dimension = get(htab,'Position');
+  logosize = [52,52];
+  dimension = [dimension(3)-logosize(1)-3 , dimension(4)-logosize(2) , logosize];
+  logo = axes('Parent',htab,'Units','pixels','Position',dimension,'Tag','Logo');
+  image(imread('iconltp.jpg'),'Parent',logo,'AlphaData',imread('iconltpalpha.gif'),'ButtonDownFcn','try open_system(gcs); catch, end;');
+  axis(logo,'off'); axis(logo,'square');
+  set(logo,'HandleVisibility','callback');
+
+  dimension = get(htab,'Position');
+  logosize = [40 40];
+  dimension = [dimension(3)-logosize(1)-70 , dimension(4)-logosize(2)-9 , logosize];
+  start2 = axes('Parent',htab,'Units','pixels','Position',dimension,'Tag','Start2');
+  image(imread('startgreen.jpg'),'Parent',start2,'AlphaData',imread('startalpha.gif'),'ButtonDownFcn','ltpdagui(''redraw'',1.1);','Tag','StartButton');
+  axis(start2,'off');
+  set(start2,'HandleVisibility','callback');
+  
+  if active>ntab, active=ntab; end
+  
+  inset(1) = uicontrol( ...
+    'Parent',htab, ...
+    'Units','pixels', ...
+    'BackgroundColor',panelbackgroundcolor, ...
+    'Style','text', ...
+    'Visible','on');
+  if ~isnan(titlehighlightcolor)
+    inset(2) = uicontrol( ...
+      'Parent',htab, ...
+      'Units','pixels', ...
+      'BackgroundColor',titlehighlightcolor, ...
+      'Style','text', ...
+      'Visible','on');
+    inset(3) = uicontrol( ...
+      'Parent',htab, ...
+      'Units','pixels', ...
+      'BackgroundColor',0.85*titlehighlightcolor, ...
+      'Style','text', ...
+      'Visible','on');
+  end
+ 
+% =======================================================================
+%                             OTHER BUTTONS
+  for xx=2:nrows
+      localString = labels{xx};
+      ntab = numel(localString);
+      for tt=1:ntab
+        titles(xx,tt) = uipanel( ...
+          'Parent',htab, ...
+          'Units','pixels', ...
+          'BackgroundColor',titlebackgroundcolor, ...
+          'BorderType','beveledout', ...
+          'ButtonDownFcn',{@TopBottomTabCbk,tt,xx}, ...
+          'Visible','on');
+
+        uicontrol( ...
+          'Parent',titles(xx,tt), ...
+          'Units','normalized', ...
+          'Position',ttextpos, ...
+          'ForegroundColor',foregroundcolor, ...
+          'BackgroundColor',titlebackgroundcolor, ...
+          'HorizontalAlignment',horizontalalignment, ...
+          'Style','text', ...
+          'String',localString{tt}, ...
+          'Enable','inactive', ...
+          'FontSize',11*scaleX,...
+          'HitTest','off',...
+          'Visible','on');
+       
+     end
+  end
+% =======================================================================
+
+  TopBottomTabResizeCbk();
+
+panelTitle = get(ttext(active),'string');
+setappdata(0, 'ltpda_currPanel', panel);
+
+% =======================================================================
+% =======================================================================
+% =======================================================================
+CheckTimerAlive()
+
+   switch panelTitle
+      case 'Main LTPDA panel'
+         if exist('runSim','var') && runSim==1
+            runSim = 0; %#ok<NASGU>
+            pan1main(panel,1)
+         else pan1main(panel)
+         end
+      case 'Parameters'
+         pan2param(panel)
+      case 'Repository'
+         pan3repo(panel)
+      case 'Import from workspace'
+         pan4import(panel)
+      case 'Output'
+         pan5output(panel)
+      case 'Globals'
+         pan6globals(panel)
+      case 'Partial execution'
+         pan7partial(panel)
+      case 'Nested loops'
+       % panXyettocome(panel)
+         pan8nested(panel)
+
+   end
+
+% =======================================================================
+% =======================================================================
+% =======================================================================
+
+
+%%
+    %--------------------------------------------------------------------------
+    function TopBottomTabCbk(hobj,evdt,indx,numbrow) %#ok<INUSL>
+    % Executed when the user clicks on a another tab or resize.
+    
+    if numbrow>1 % the user clicked on another row
+        for pp=ntab:-1:1, ntab = ntab - strcmp(string(pp),''); end
+        if ntab==1, active=1; end
+
+      % Swop rows:  
+        temp = labels(1);
+        labels(1) = labels(numbrow);
+        labels(numbrow) = temp;
+        clear temp
+      % Rebuild the proper list:
+        for ii=1:nrows
+            temp(ii,1:numel(labels{ii}))=labels{ii};
+        end
+    else
+        active = indx;
+        for ii=1:nrows
+            temp(ii,1:numel(labels{ii}))=labels{ii};
+        end
+    end
+    
+  % ======================================
+    ltpdagui('title',temp,'active',indx);
+  % ======================================
+
+    end
+    %--------------------------------------------------------------------------
+
+    %--------------------------------------------------------------------------
+    function TopBottomTabResizeCbk(varargin)
+    % Properly draws the panels.
+
+    units = get(htab,'Units');
+    set(htab,'Units','pixels');
+    tabpos = get(htab,'Position');
+    tabpos(3) = tabpos(3)-120;
+    set(htab,'Units',units);
+    ntab = numel(string);
+    for oo=ntab:-1:1, ntab = ntab - strcmp(string(oo),''); end
+
+    titlepos = [0,0,0,titleheight];
+    panelpos = [0,0,tabpos(3),tabpos(4)-titleheight]+margins;
+    titlepos(2) = panelpos(2)+panelpos(4);
+    panelpos(2) = panelpos(2)-titleheight*(nrows-1)+6;
+    
+    n = sum(cellfun('length',string))+2*ntab;
+    titlepos(1) = panelpos(1)+(1-sign(3))*panelpos(3);
+    upperpos = titlepos(2);
+    for k=loop
+        titlepos(3) = panelpos(3)*(length(string{k})+2)/n;
+        addtopos = addtitle.*[k==1,1,k==1|k==ntab,1];
+        titlepos(1) = titlepos(1)-(1-sign(3))*titlepos(3);
+        titlepos(2) = upperpos - titlepos(4)*(nrows-1)+3+1;
+        set(title(k),'Position',titlepos+addtopos);
+        titlepos(1) = titlepos(1)+sign(3)*titlepos(3);
+    end
+    
+  % =======================================================================  
+
+    if nrows>1
+        for xxx=2:nrows
+            localString = labels{xxx};
+            ntab = numel(localString);
+            for i=ntab:-1:1, ntab = ntab - strcmp(localString(i),''); end
+            n = sum(cellfun('length',localString))+2*ntab;
+            titlepos(1) = panelpos(1)+(1-sign(3))*panelpos(3);
+            titlepos(2) = titlepos(2) + titlepos(4)-2;
+            for k=1:ntab
+                titlepos(3) = panelpos(3)*(length(localString{k})+2)/n;
+                addtopos = addtitle.*[k==1,1,k==1|k==ntab,1];
+                titlepos(1) = titlepos(1)-(1-sign(3))*titlepos(3);
+                if ntab==1, titlepos(3)=titlepos(3)-2; end
+                set(titles(xxx,k),'Position',titlepos+addtopos);
+                titlepos(1) = titlepos(1)+sign(3)*titlepos(3);
+            end
+            if ntab<numel(localString)
+                for qq=ntab+1:numel(localString)
+                    nullpos=[0,0,1,1];
+                    set(titles(xxx,qq),'Position',nullpos);
+                end
+            end
+        end
+    end
+  
+  % =======================================================================  
+
+    titlepos = get(title(active),'Position');
+    titlepos = titlepos-addtitle.*[active==sign(1),1,active==sign(1),1];
+    titlepos(3) = titlepos(3)-addtitle(3)*(active==sign(2));
+    ntab = numel(string);
+    for i=ntab:-1:1, ntab = ntab - strcmp(string(i),''); end
+    if ntab==1, titlepos(3) = titlepos(3)-4; end
+    
+    set(title(active),'Position',titlepos,'BackgroundColor',panelbackgroundcolor);
+    set(ttext(active),'FontWeight','bold','BackgroundColor',panelbackgroundcolor);
+
+    insetpos = [titlepos(1)+1,titlepos(2)+sign(4)*titlepos(4)-2,titlepos(3)-1,3];
+    set(inset(1),'Position',insetpos);
+    try
+      insetpos = insetpos+[0,(1-2*sign(4))*titleheight+2*sign(4),0,-2];
+      set(inset(2),'Position',insetpos);
+      set(inset(3),'Position',insetpos+[2,1-2*sign(4),-4,0]);
+    catch
+    end
+     end
+    %--------------------------------------------------------------------------
+
+    %--------------------------------------------------------------------------
+    function GUIResize(varargin)
+    % Called whenever the user resize the GUI window.
+    
+        guiSize = varargin{3};
+        newSize = get(findobj('Tag','LTPDAGUI'),'Position');
+        
+      % To avoid a width lower than the fixed minimum: 
+        if newSize(3)<guiSize(3), newSize(3)=guiSize(3); end
+      % To avoid an height lower than the fixed minimum: 
+        if newSize(4)<guiSize(4), newSize(4)=guiSize(4); end
+      % To avoid a window moved outside the screen border:
+        screenSize = get(0,'screensize');
+        if newSize(2)+newSize(4)+30>screenSize(4), newSize(2)=screenSize(4)-newSize(4)-40; end
+        if newSize(1)+newSize(3)>screenSize(3), newSize(1)=screenSize(3)-newSize(3)-5; end
+       
+        set(findobj('Tag','LTPDAGUI'),'Position',newSize);
+        
+      % Redraw the GUI on the current panel:
+      % pause(0.1)
+        if ~getappdata(0,'startup'), TopBottomTabCbk([],[],active,1)
+        else setappdata(0,'startup',0);
+        end
+                
+    end
+    %--------------------------------------------------------------------------
+
+%%
+    %----------------------------------------------------------------------
+    function CheckTimerAlive(varargin)   
+        % This is the function to execute a continuous timer check
+        
+        % Keep alive the first timer:
+          alltimers = timerfindall;
+          if strcmp(get(alltimers(1),'Running'),'off'), start(alltimers(1)); end
+    end
+    %----------------------------------------------------------------------
+    
+    %----------------------------------------------------------------------
+    function HelpCallback(varargin)
+    % Whenever the user doubleclick a block in the library window (ie, the
+    % OpenFcn callback is executed from the library).
+       
+       openSys = find_system('SearchDepth',0);
+       for ii=1:numel(openSys)
+          if ~isempty(find_system(openSys{ii},'FindAll','on','Type','Annotation','Tag','ltpda model'))
+             add_block(gcb,[openSys{ii},'/',get_param(gcb,'Name')],'MakeNameUnique','on')
+             return;
+          end
+       end
+       try
+          childpath = find_system(gcbh,'LookUnderMasks','all','BlockType','M-S-Function');
+          functionname = get_param(childpath,'Tag');
+          
+          description = get_param(gcbh,'Description');
+          funcname = findstr('functionName=',description);
+          if funcname
+             i = funcname+14;
+             while ~strcmp(description(i),';'), i=i+1; end
+             functionname = description(funcname+14:i-2);
+          end
+          
+          [func,classes] = strtok(get(gcbh,'Tag'));
+          if strcmp(func,'method')
+             helptext = help([strtrim(classes),'/',functionname]);
+          else
+             helptext = help(functionname);
+          end
+          
+          helpFigure    =   figure('MenuBar','none','Toolbar','none','Name',strcat(functionname,' help'),'NumberTitle','off','Units','pixels','Position',[200,200,500,300],'Resize','on','ResizeFcn','refresh(gcf)','Tag','helpwindow','Color', get(0, 'defaultuicontrolbackgroundcolor'));
+          % Help text:
+          uicontrol('Parent',helpFigure,'Units','normalized','HorizontalAlignment','left','Position',[0 0 1 1],'FontSize',8,'String',helptext,'Visible','on','max',100,'Style','edit');
+       catch
+       end
+    end
+    %----------------------------------------------------------------------
+
+end
\ No newline at end of file