function varargout = buildRun1GUI(varargin)
% function varargout = buildRun1GUI(varargin)
% Purpose: There are three methods for which the GUI can be used to generate
%          the user-defined GUI:
%          1) User provide menu definition thru a GUI interactive input
%             gui4gui.fig. By selecting the GUI generation button, the
%             collected menu definition data will be passed to this
%             function to generate the user GUI.
%          2) User enters menu definition directly into a file. Then, the
%             user manually run this program to generate the user GUI.
%          3) Combination of the above two methods.
% varargin: Caller provides menu definition data as a structure GID.
%           Only varargin{1} is relevant, any additional input will be
%           ignored. The caller is usually gui4gui. It collects GID
%           interactively (or semi-interactively) and then calls genGUI to 
%           generate the application GUI.
% If nargin == 0, then this GUI assumes that the menu definition data has
% already been generated and saved in gui4gui_input.mat. It uses this
% file to generate the GUI without going thru gui4gui
% Date created: May 21, 2009
% Kadin Tseng, SCV, Boston University
version = '1.0';

if nargin > 0 & isstruct(varargin{1})
  GID = varargin{1};
else  
% loads the data structure that defines the menus
% for the MODE code, there are two situations where this GUI generator might
% be used: Real time task or Fixed duration task. They are both very similar
% in the input requirement but nevertheless requires distinctive m-files
%  varargin{1}
  load run1_inputfile;
%  eval('load varargin{1}');
end

% additional GUI settings:
% fontsize and fontweight for the RUN button
% The title fontsize is 2 sizes larger than the basic user setting
fontsize_title = GID.fontsize + 2;
fontweight_title = GID.fontweight;
fontsize_run = GID.fontsize + 2;
fontweight_run = GID.fontweight;

fid = fopen([GID.guiName '.m'],'w+');

fprintf(fid,'function %s(varargin)\n',GID.guiName);
fprintf(fid,'fh = figure(''Visible'',''off'', ...\n');
fprintf(fid,'            ''HandleVisibility'',''callback'', ...\n');
fprintf(fid,'            ''NumberTitle'',''off'', ...  %% turns off MATLAB GUI window title\n');
fprintf(fid,'            ''Name'',''%s'', ...    %% now, define my own\n',GID.guiName);
fprintf(fid,'            ''Units'',''normalized'', ...\n');
fprintf(fid,'            ''Position'',[%d %d %d %d], ...\n',GID.position);
fprintf(fid,'            ''Color'',''%s'', ...   %% match bg of MODE_new.jpg\n',GID.bgcolor);
fprintf(fid,'            ''Resize'',''%s'');\n',GID.resize);

fprintf(fid,'set(fh,''MenuBar'',''none'');  %% removes MATLAB default menu bar\n');

fprintf(fid,'x0 = 0.1; y0 = 0.85;\n');
fprintf(fid,'x0run = 0.825; y0run = 0.075; %% lower-left corner coord. of the run button\n');
fprintf(fid,'dxst1 = 0.075; dyst1 = 0.05;  %% for static text 1\n');
fprintf(fid,'dxet1 = 0.100; dyet1 = 0.05;  %% for edit text 1\n');
fprintf(fid,'dxst2 = 0.400; dyst2 = 0.10;  %% for static text 2\n');
fprintf(fid,'dxpb1 = 0.050; dypb1 = 0.05;  %% for PDF logo pushbuttons\n');
fprintf(fid,'dxrun = 0.100; dyrun = 0.075; %% for "Run" pushbutton\n');

fprintf(fid,'%% First, create a Heading for the secondary GUI with a static text box\n');
fprintf(fid,'dx = 0.6; dy = 0.125;\n');

fprintf(fid,'st0h = uicontrol(fh, ...\n');
fprintf(fid,'            ''style'',''text'', ...\n');
brkpt = regexp(GID.title,'!');  % check for "!", definde here as line break

%%%% to do: regexprep would be more direct; implementation problem with fprintf 

numLines = length(brkpt) + 1;
switch numLines
  case 1    % one-line title
    fprintf(fid,'            ''String'',[''%s''], ...\n',GID.title);
  case 2    % two-line title
    fprintf(fid,'            ''String'',[''%s'' char(10) ''%s''], ...\n',GID.title(1:brkpt-1),GID.title(brkpt+1:end));
  case 3    % three-line title
    fprintf(fid,'            ''String'',[''%s'' char(10) ''%s'' char(10) ''%s''], ...\n', ...
      GID.title(1:brkpt(1)-1),GID.title(brkpt(1)+1:brkpt(2)-1),GID.title(brkpt(2)+1:end));
  otherwise
    disp('Title with more than 3 lines is not anticipated.')
    disp(' "!" is reserved by the GUI builder to force a new line.')
    disp('Make sure not to use it as part of your GUI title text.')
    return
end
fprintf(fid,'            ''Units'',''normalized'', ...\n');
fprintf(fid,'            ''Position'',[x0,y0,dx,dy], ...\n');
fprintf(fid,'            ''FontSize'',%d, ...\n',fontsize_run);
fprintf(fid,'            ''FontWeight'',''%s'');\n',fontweight_run);
fprintf(fid,'\n');
fprintf(fid,'%% Create static box, edit box, static box, logo (that points to a doc; optional)\n');
fprintf(fid,'y0 = y0 - dy*1.05; space = dxst1*0.20;\n');
nlines = size(GID.string,1);
for line=1:nlines
str = GID.string(line,:);
fprintf(fid,'data.str{%d} = ''%s'';\n',line,str{1});
fprintf(fid,'data.default{%d} = %f;\n',line,str2double(str{2}));
fprintf(fid,'  st1h(%d) = uicontrol(fh,''style'',''text'', ...\n',line);
fprintf(fid,'      ''String'',''%s'', ...\n',str{1});
fprintf(fid,'      ''Units'',''normalized'', ...\n');
fprintf(fid,'      ''Position'',[x0,y0,dxst1,dyst1], ...\n');
fprintf(fid,'      ''FontSize'',%d, ...\n',GID.fontsize);
fprintf(fid,'      ''FontWeight'',''%s'');\n',GID.fontweight);
fprintf(fid,'  et1h(%d) = uicontrol(fh,''Style'',''edit'', ...\n',line);
fprintf(fid,'      ''String'',''%s'', ...\n',str{2});
fprintf(fid,'      ''Units'',''normalized'', ...\n');
fprintf(fid,'      ''Position'',[x0+dxst1+space,y0,dxet1,dyet1], ...\n');
fprintf(fid,'      ''FontSize'',%d, ...\n',GID.fontsize);
fprintf(fid,'      ''FontWeight'',''%s'', ...\n','normal');
fprintf(fid,'      ''callback'',{@edit1_Callback ''%s''});\n',str{1});
fprintf(fid,'  st2h(%d) = uicontrol(fh,''style'',''text'', ...\n',line);
fprintf(fid,'      ''String'',''%s'', ...\n',str{3});
fprintf(fid,'      ''Units'',''normalized'', ...\n');
fprintf(fid,'      ''Position'',[x0+dxst1+dxet1+space*2,y0-0.02,dxst2,dyst2], ...\n');
fprintf(fid,'      ''FontSize'',%d, ...\n',GID.fontsize);
fprintf(fid,'      ''FontWeight'',''%s'');\n',GID.fontweight);
fprintf(fid,'  pb1h(%d) = uicontrol(fh,''Style'',''pushbutton'', ...\n',line);
fprintf(fid,'      ''String'',''PDF'', ...\n');
fprintf(fid,'      ''Units'',''normalized'', ...\n');
fprintf(fid,'      ''Position'',[x0+dxst1+dxet1+dxst2+space*3,y0,dxpb1,dypb1], ...\n');
fprintf(fid,'      ''FontSize'',%d, ...\n',GID.fontsize);
fprintf(fid,'      ''FontWeight'',''%s'', ...\n',GID.fontweight);
fprintf(fid,'      ''callback'',{@opendoc1_Callback ''%s''});\n',str{4});
fprintf(fid,'  y0 = y0 - max([dyst1 dyst2 dyet1 dypb1])*1.1;\n');

end   % end of "line" loop

fprintf(fid, ...
    ['%% save the edit text handles to data\n' ...
     'data.et1h = et1h(1:end);\n']);
fprintf(fid,'for i=1:length(data.str)\n');
fprintf(fid,'   eval([''data.'' data.str{i} ''= data.default{i};'']);\n');
fprintf(fid,'end\n');

fprintf(fid,'data.guiName = ''%s'';\n',GID.guiName);
fprintf(fid,'setappdata(fh, ''myData'', data);\n');

% Foonotes and RUN button
fprintf(fid,'%%align(st0h,''HorizontalAlignment'',''center'');\n');
fprintf(fid,'st3h = uicontrol(fh,''style'',''text'', ...\n');
fprintf(fid,'      ''String'',''%s'', ...\n',GID.fn1);
fprintf(fid,'      ''Units'',''normalized'', ...\n');
fprintf(fid,'      ''Position'',[0.05,0.08,0.60,0.05], ...\n');
fprintf(fid,'      ''HorizontalAlignment'',''Left'', ...\n');
fprintf(fid,'      ''foregroundColor'',[1 0 0], ...\n');
fprintf(fid,'      ''FontSize'',%d, ...\n',GID.fontsize);
fprintf(fid,'      ''FontWeight'',''%s'');\n', GID.fontweight);
fprintf(fid,'st4h = uicontrol(fh,''style'',''text'', ...\n');
fprintf(fid,'      ''String'',''%s'', ...\n',GID.fn2);
fprintf(fid,'      ''Units'',''normalized'', ...\n');
fprintf(fid,'      ''Position'',[0.05,0.02,0.60,0.05], ...\n');
fprintf(fid,'      ''HorizontalAlignment'',''Left'', ...\n');
fprintf(fid,'      ''foregroundColor'',[1 0 0], ...\n');
fprintf(fid,'      ''FontSize'',%d, ...\n',GID.fontsize);
fprintf(fid,'      ''FontWeight'',''%s'');\n',GID.fontweight);
fprintf(fid,'\n');

% this is for either RT or FD (by virtue of GID value)advanced run

fprintf(fid,'runh = uicontrol(fh,''Style'',''pushbutton'', ...\n');
fprintf(fid,'      ''String'',''RUN'', ...\n');
fprintf(fid,'      ''Units'',''normalized'', ...\n');
fprintf(fid,'      ''Position'',[x0run,y0run,dxrun,dyrun], ...\n');
fprintf(fid,'      ''FontSize'',%d, ...\n',fontsize_run);
fprintf(fid,'      ''FontWeight'',''%s'', ...\n',fontweight_run);
fprintf(fid,'      ''callback'',{@run1_Callback ''%s''});\n',GID.run);
fprintf(fid,'PDFbuttons(pb1h);\n');
fprintf(fid,'\n\n');

% use the bgcolor of uicontrol for the GUI figure
fprintf(fid,'etbgcolor = get(et1h(1),''BackgroundColor'');\n');
fprintf(fid,'set(fh,''Color'',etbgcolor);\n');
% Now, turns on the GUI figure
fprintf(fid,'set(fh,''Visible'',''on'');\n');
fprintf(fid,'\n\n');

% Callback functions needed fot this GUI are generated below
% callback function of the "doc1" type
fprintf(fid, ...
    ['function opendoc1_Callback(hObject,eventdata,varargin)\n' ...
     '%% hObject    handle to Exit_menu_item (see GCBO)\n' ...
     '%% eventdata  reserved - to be defined in a future version of MATLAB\n' ...
     'open(varargin{1});\n' ...
     '\n\n']);

% edit text callback
fprintf(fid, ...
  ['function edit1_Callback(hObject, eventdata, varargin)\n' ...
   '%% hObject    handle to edit1 (see GCBO)\n' ...
   '%% eventdata  reserved - to be defined in a future version of MATLAB\n' ...
   '\n' ...
   '%% Hints: get(hObject,''String'') returns contents of edit1 as text\n' ...
   '%%        str2double(get(hObject,''String'')) returns contents of edit1 as a double\n' ...
   '\n' ...
   'fh = get(hObject,''parent'');\n' ...
   'data = getappdata(fh, ''myData'');\n' ...
   'value = str2num(get(hObject,''String''));\n' ...
   'eval([''data.'' varargin{1} ''= value;'']);\n' ...
   'setappdata(fh,''myData'',data);\n' ...
   '\n\n']);

% RUN callback
fprintf(fid, ...
  ['function run1_Callback(hObject, eventdata, varargin)\n' ...
   '%% hObject    handle to run1_Callback \n' ...
   '%% eventdata  reserved - to be defined in a future version of MATLAB\n' ...
   '%% Hints: get(hObject,''String'') returns contents of edit1 as text\n' ...
   '%%        str2double(get(hObject,''String'')) returns contents of edit1 as a double\n' ...
   'fh = get(hObject,''parent'');\n' ...
   'data = getappdata(fh, ''myData'');\n']);
   fprintf(fid,'for i=1:length(data.str)\n');
   fprintf(fid,'   eval([data.str{i} ''= data.'' data.str{i} '';'']);  %% e.g., A9 = data.A9;\n');
   fprintf(fid,'end\n');

fprintf(fid, ...
  ['%% Prevent user from changing the contents of edit boxes\n' ...
   'editBoxEnable2(data,''Off'');\n' ...
   'old_color=get(hObject,''BackgroundColor''); %% save original button color\n' ...
   'set(hObject, ''BackgroundColor'', [1 0 0]); %% Change button color\n' ...
   'set(hObject, ''String'', ''running ...'');\n' ...
   '%% open(''RTcaption.pdf'');\n' ...
   'drawnow    %% to make sure that the "Run" button change color right away\n' ...
   'eval(varargin{1})   %% run the m-file specified by varargin{1}\n']);
fprintf(fid, ...
  ['set(hObject, ''String'', ''Run'');\n' ...
   'set(hObject, ''BackgroundColor'', old_color);\n' ...
   'editBoxEnable2(data,''On'');\n']);
fprintf(fid,'\n\n');

fclose(fid);
disp([char(10) '***** The ' GID.guiName ' GUI is built successfully *****' char(10)]);
