diff m-toolbox/m/gui/gltpda/g_setmethod.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/g_setmethod.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,144 @@
+function methName = g_setmethod(varargin)
+% GUI callback, to support the hollow block - ie. the block with no
+% function name. This function will popup the small figure to set it.
+%
+%  $Id: g_setmethod.m,v 1.3 2009/02/01 17:20:03 nicola Exp $
+
+   global selBlocks
+
+   guiFontSize = getappdata(0, 'ltpda_gui_fontsize');
+   screenSize = get(0,'ScreenSize');
+   backColor   = [1 1 1];
+   close(findobj('Tag','setMethod'))
+   [meth,clas] = strtok(get(gcbh,'Tag'));
+   if ~strcmp(meth,'method'), warning('*** This block didn''t contain a valid LTPDA method.'); delete_block(gcbh); return; end %#ok<WNTAG>
+   clas = strtrim(clas);
+   methName = '';
+
+   position   = [(screenSize(3)-250)/2   (screenSize(4)-70)/2   250   70];
+   setMethFig = figure('Position',position,'Name','Which function?','Tag','setMethod','Resize','off','NumberTitle','off','Toolbar','none','Menubar','none');
+   set(setMethFig,'CloseRequestFcn','delete_block(gcbh);uiresume;closereq');
+ % Class text
+   uicontrol('Parent',setMethFig,'BackgroundColor',backColor,'HorizontalAlignment','left','Position',[10 position(4)-25 100 20],'String','Class:','FontName','Times New Roman','FontSize',guiFontSize,'FontWeight','normal','Visible','on','Style','text');
+ % Method text
+   uicontrol('Parent',setMethFig,'BackgroundColor',backColor,'HorizontalAlignment','left','Position',[120 position(4)-25 140 20],'String','Method:','FontName','Times New Roman','FontSize',guiFontSize,'FontWeight','normal','Visible','on','Style','text');
+ % Class edit field
+   clasEdit = uicontrol('Parent',setMethFig,'Tag','clasEdit','BackgroundColor',backColor,'HorizontalAlignment','left','Position',[10 position(4)-45 100 20],'String',clas,'FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Visible','on','Callback',@editMethodCbk,'Style','edit');
+ % Method edit field
+   methEdit = uicontrol('Parent',setMethFig,'Tag','methEdit','BackgroundColor',backColor,'HorizontalAlignment','left','Position',[120 position(4)-45 120 20],'String','','FontName','Times New Roman','FontSize',guiFontSize+1,'FontWeight','normal','Visible','on','Callback',@editMethodCbk,'Style','edit');
+
+   uicontrol(methEdit)
+   uiwait
+
+   %----------------------------------------------------------------------
+   function editMethodCbk(varargin)
+      
+      clasName = get(clasEdit,'String');
+      methName = get(methEdit,'String');
+      
+      if isempty(clasName) || ~ismember(clasName,utils.helper.ltpda_classes) % empty or not a valid LTPDA class
+         set(clasEdit,'String','')
+         delete(findobj(gcf,'Tag','invalidmethod'))
+         uicontrol('Parent',gcf,'Tag','invalidclass','BackgroundColor',backColor,'HorizontalAlignment','left','Position',[10 3 140 15],'String','* Invalid class','FontName','Times New Roman','FontSize',guiFontSize-1,'FontWeight','normal','Visible','on','Style','text');
+         uicontrol(clasEdit);
+         return;
+      end
+      if isempty(methName) || ~ismethod(clasName,methName)
+         set(methEdit,'String','')
+         delete(findobj(gcf,'Tag','invalidclass'))
+         uicontrol('Parent',gcf,'Tag','invalidmethod','BackgroundColor',backColor,'HorizontalAlignment','left','Position',[120 3 140 15],'String','* Invalid method','FontName','Times New Roman','FontSize',guiFontSize-1,'FontWeight','normal','Visible','on','Style','text');
+         uicontrol(methEdit);
+         return;
+      end
+      
+      blockName = methName;
+      ii = 1;
+      while ~isempty(find_system(gcs,'SearchDepth',1,'Name',[blockName,num2str(ii)])), ii=ii+1; end
+      blockName = [blockName,num2str(ii)];
+      
+      set(gcbh,'LinkStatus','inactive','Name',blockName,'MaskDisplay',['disp(''',methName,''')'],'Tag',['method ',clasName],'AncestorBlock','')
+      set(utils.prog.find_in_models(gcbh,'LookUnderMasks','all','BlockType','M-S-Function','FunctionName','ltpdasim'),'Tag',methName,'Name',methName);
+      
+    % Check if it's a copied block:
+      prevMeth = get(gcbh,'UserData');
+      if ~isempty(prevMeth)
+         set(gcbh,'UserData','');
+         [funcName,blkHdl] = strtok(prevMeth,'-');
+         if strcmp(funcName,methName)
+            blkHdl = str2double(blkHdl(2:end));
+            newBlk = replace_block(gcs,'Name',get(gcbh,'Name'),getfullname(blkHdl),'noprompt');
+            GUIprefs = getappdata(0, 'GUIpreferences');
+            GUIprefs.Copied = 0;
+            setappdata(0, 'GUIpreferences',GUIprefs);
+            set_param(newBlk{1},'Selected','on');
+            selBlocks = get_param(newBlk{1},'Handle');
+         end
+      end
+            
+      minfoObj = eval([clasName,'.getInfo(''',methName,''');']);
+      category = minfoObj.mcategory;
+      minInput = minfoObj.argsmin;
+      if strcmp(category,'Constructor')
+         lineHandles = get(gcbh,'LineHandles');
+         if lineHandles.Inport~=-1, delete_line(lineHandles.Inport); end
+         setInports(gcbh,0)
+         set(gcbh,'BackgroundColor','green')
+      elseif strcmp(category,'Output')
+         replace_block(gcb,'Outport','Terminator','noprompt');
+         set(gcbh,'BackgroundColor','lightBlue')
+      elseif minInput>1
+         setInports(gcbh,minInput)
+      end
+      
+      closereq
+      uiresume
+      
+   end
+   %----------------------------------------------------------------------
+   
+   %----------------------------------------------------------------------
+   function setInports(varargin)
+      % Called whenever the block to be added has argsmin>1, so it needs
+      % multiple data inputs:
+
+      load_system('simulink')
+      currBlock = varargin{1};
+      newInports = varargin{2};
+      prevInport  = find_system(currBlock,'SearchDepth',1,'LookUnderMasks','all','BlockType','Inport');
+
+      % To remove previous data inport and line:
+      try %#ok<ALIGN>
+         blockLines   = get_param(prevInport,'LineHandles');
+         if (blockLines.Outport(1)~=-1 && ~isempty(blockLines.Outport(1))),   delete_line(blockLines.Outport(1)); end
+         delete_block(prevInport);
+      catch end
+
+      % To add new inports, mux and lines:
+      if newInports>1
+         muxblock = add_block('built-in/Mux', [getfullname(currBlock),'/Mux']);
+         set(muxblock,'Position',[70 , 10 , 73 , 150])
+         set(muxblock,'Inputs',num2str(newInports))
+         for ii=1:newInports
+            newBlock = add_block('built-in/Inport', [getfullname(currBlock),'/Inport1'],'MakeNameUnique','on');
+            set_param(newBlock,'Port',num2str(ii));
+            newBlock = get_param(newBlock,'Handle');
+            set(newBlock,'Position',[10 , 10+30*(ii-1) , 30 , 30+30*(ii-1)])
+            set(newBlock,'Tag',num2str(ii))
+            add_line(currBlock,[get(newBlock,'Name'),'/1'],[get(muxblock,'Name'),'/',num2str(ii)]);
+         end
+
+         funcBlock = find_system(currBlock,'SearchDepth',1,'LookUnderMasks','all','BlockType','M-S-Function');
+         funcBlock = get_param(funcBlock,'Name');
+         add_line(currBlock,[get(muxblock,'Name'),'/1'],[funcBlock,'/1']);
+         
+      else % no inputs
+         groundBlk = add_block('simulink/Sources/Ground', [gcb,'/Ground'],'MakeNameUnique','on');
+         funcBlock = find_system(currBlock,'SearchDepth',1,'LookUnderMasks','all','BlockType','M-S-Function');
+         funcBlock = get_param(funcBlock,'Name');
+         add_line(currBlock,[get(groundBlk,'Name'),'/1'],[funcBlock,'/1']);
+      end
+
+   end
+   %----------------------------------------------------------------------
+   
+end
\ No newline at end of file