function A = viewgui(plottype,Parent,SystemData);
%VIEWGUI opens an LTI Viewer object
% $Revision: 1.10 $

%   Copyright (c) 1986-98 by The MathWorks, Inc.
%   Karen Gondoly 1-27-98.

ni=nargin;
error(nargchk(2,3,ni));

if ni<3,
   SystemData = struct('Systems',{cell(1,0)},'Names',{cell(1,0)},...
      'PlotStrs',[],'FRDindices',[]);
end

%---Generate property set
AllProps = {'Parent';
   'ArrayPlotVariable';
   'AxesPosition';
   'BackgroundAxes';
   'ChannelPlotVariable';
   'ColorOrder';
   'Configuration';
   'ConfigurationWindow';
   'FigureMenu';
   'FrequencyData';
   'FrequencyUnits';
   'FrequencyVector';
   'FrequencyVectorMode';
   'Handle';
   'InitialCondition';
   'InputPlotVariable';
   'InputSignal';
   'LineStyleOrder';
   'LineStylePreferences';
   'MagnitudeUnits';
   'MarkerOrder';
   'OutputPlotVariable';
   'PhaseUnits';
   'PlotStrings';
   'PlotTypeOrder';
   'ResponsePreferences';
   'RiseTimeLimits';
   'SettlingTimeThreshold';
   'SingularValueType';
   'Systems';
   'SystemNames';
   'SystemPlotVariable';
   'TimeData';
   'TimeVector';
   'TimeVectorMode';
   'UIContextMenu';
   'Visible';
   'Ylims';
   'YlimMode';
   'InitializeViewer';
   'ColorOrderRGB';
   'StatusText';
   'StatusFrame'};

NumProps = length(AllProps);
A = cell2struct(cell(NumProps,1),AllProps,1);

%---Open the initial figure
FigUnit = get(0,'DefaultFigureUnit');
FigPos = get(0,'DefaultFigurePosition');
a = figure('Color',[0.8 0.8 0.8], ...
   'CloseRequestFcn','rguifcn(''closewindow'',gcf);',...
   'HandleVisibility','callback',...
   'Name','LTI Viewer', ...
   'Menu','none',...
   'IntegerHandle','off', ...
   'NumberTitle','off', ...
   'Units',FigUnit, ...
   'Position',FigPos, ...
   'Units','Characters',...
   'ResizeFcn','viewresz(get(gcbf,''UserData''));',...
   'Visible','off',...
   'Tag','ResponseGUI');

%---Determine position of all 6 default BackgroundAxes configurations
%   Leave room at the bottom for a 25 pixel high status bar
set(a,'DefaultAxesUnits','Character');
tempax = axes('Parent',a,'visible','off');
AxesPos = get(tempax,'Position');
AxesPos(2)=AxesPos(2)+2.35;
AxesPos(4)=AxesPos(4)-2.35;
set(tempax,'Position',AxesPos);
%   Use the Normalized Position
set(tempax,'Units','norm');
DefaultAxesPos = get(tempax,'Position');
set(a,'DefaultAxesUnits','Normalized');
delete(tempax)

%---Set up Axes Positions.
AxesPos=cell(6,1);
AxesPos{1}=DefaultAxesPos;

AxesPos{2}=[[DefaultAxesPos(1), ...
         DefaultAxesPos(2)+(DefaultAxesPos(4)/2)+.0636, ...
         DefaultAxesPos(3) (DefaultAxesPos(4)/2)-.0636];
   [DefaultAxesPos(1:3), (DefaultAxesPos(4)/2)-.0636]];

AxesPos{3}=[[DefaultAxesPos(1), ...
         DefaultAxesPos(2)+2*((DefaultAxesPos(4)/3)+.0239) ...
         DefaultAxesPos(3) (DefaultAxesPos(4)/3)-.0345];
   [DefaultAxesPos(1), ...
         DefaultAxesPos(2)+(DefaultAxesPos(4)/3)+.0239, ...
         DefaultAxesPos(3), (DefaultAxesPos(4)/3)-.0345];
   [DefaultAxesPos(1:3), (DefaultAxesPos(4)/3)-.0345]];

AxesPos{4}=[[DefaultAxesPos(1), ...
         DefaultAxesPos(2)+(DefaultAxesPos(4)/2)+.0636, ...
         (DefaultAxesPos(3)/2)-.0605 (DefaultAxesPos(4)/2)-.0636];
   [DefaultAxesPos(1)+(DefaultAxesPos(3)/2)+.0605, ...
         DefaultAxesPos(2)+(DefaultAxesPos(4)/2)+.0636, ...
         (DefaultAxesPos(3)/2)-.0605 (DefaultAxesPos(4)/2)-.0636];
   [DefaultAxesPos(1), DefaultAxesPos(2), ...
         (DefaultAxesPos(3)/2)-.0605 (DefaultAxesPos(4)/2)-.0636];
   [DefaultAxesPos(1)+(DefaultAxesPos(3)/2)+.0605 DefaultAxesPos(2), ... 
         (DefaultAxesPos(3)/2)-.0605 (DefaultAxesPos(4)/2)-.0636]];

AxesPos{5}=[[DefaultAxesPos(1), ...
         DefaultAxesPos(2)+(DefaultAxesPos(4)/2)+.0636, ...
         (DefaultAxesPos(3)/2)-.0605 (DefaultAxesPos(4)/2)-.0636];
   [DefaultAxesPos(1)+(DefaultAxesPos(3)/2)+.0605, ...
         DefaultAxesPos(2)+(DefaultAxesPos(4)/2)+.0636, ...
         (DefaultAxesPos(3)/2)-.0605 (DefaultAxesPos(4)/2)-.0636];
   [DefaultAxesPos(1) DefaultAxesPos(2), ...
         (DefaultAxesPos(3)/3)-.0455 (DefaultAxesPos(4)/2)-.0636];
   [DefaultAxesPos(1)+DefaultAxesPos(3)/3+.0227 DefaultAxesPos(2), ...
         (DefaultAxesPos(3)/3)-.0455 (DefaultAxesPos(4)/2)-.0636];
   [DefaultAxesPos(1)+(2*DefaultAxesPos(3)/3)+.0455 DefaultAxesPos(2), ...
         (DefaultAxesPos(3)/3)-.0455 (DefaultAxesPos(4)/2)-.0636]];

AxesPos{6}=[[DefaultAxesPos(1) ,...
         DefaultAxesPos(2)+(DefaultAxesPos(4)/2)+.0636, ...
         (DefaultAxesPos(3)/3)-.0455 (DefaultAxesPos(4)/2)-.0636];
   [DefaultAxesPos(1)+DefaultAxesPos(3)/3+.0227 ,...
         DefaultAxesPos(2)+(DefaultAxesPos(4)/2)+.0636, ...
         (DefaultAxesPos(3)/3)-.0455 (DefaultAxesPos(4)/2)-.0636];
   [DefaultAxesPos(1)+(2*DefaultAxesPos(3)/3)+.0455 ,...
         DefaultAxesPos(2)+(DefaultAxesPos(4)/2)+.0636, ...
         (DefaultAxesPos(3)/3)-.0455 (DefaultAxesPos(4)/2)-.0636];
   [DefaultAxesPos(1) DefaultAxesPos(2), ...
         (DefaultAxesPos(3)/3)-.0455 (DefaultAxesPos(4)/2)-.0636];
   [DefaultAxesPos(1)+DefaultAxesPos(3)/3+.0227 DefaultAxesPos(2), ...
         (DefaultAxesPos(3)/3)-.0455 (DefaultAxesPos(4)/2)-.0636];
   [DefaultAxesPos(1)+(2*DefaultAxesPos(3)/3)+.0455 DefaultAxesPos(2), ...
         (DefaultAxesPos(3)/3)-.0455 (DefaultAxesPos(4)/2)-.0636]];

ConfigNumber = length(plottype);

AllPlotTypes = {'step';
   'impulse';
   'bode';
   'nyquist';
   'nichols';
   'sigma';
   'pzmap';
   'lsim';
   'initial'};

%---Add uimenus
FigMenu.FileMenu.Main=uimenu(a, ...
   'label','File');

FigMenu.FileMenu.NewMenu=uimenu(FigMenu.FileMenu.Main, ...
   'label','New Viewer...', ...
   'Accelerator','n', ...
   'Tag','NewMenu', ...
   'Callback','ltiview;');

FigMenu.FileMenu.Import=uimenu(FigMenu.FileMenu.Main, ...
   'Separator','on',...
   'Callback','rguifcn(''initimport'',gcbf);',...
   'label','Import...');

FigMenu.FileMenu.Export=uimenu(FigMenu.FileMenu.Main, ...
   'Callback','rguifcn(''export'',gcbf);',...
   'label','Export...');

FigMenu.FileMenu.Delete=uimenu(FigMenu.FileMenu.Main, ...
   'Callback','rguifcn(''initdelete'',gcbf);',...
   'Separator','on',...
   'label','Delete Systems...');

FigMenu.FileMenu.Refresh=uimenu(FigMenu.FileMenu.Main, ...
   'Callback','rguifcn(''refreshsys'',gcbf);',...
   'label','Refresh Systems');

FigMenu.FileMenu.Print=uimenu(FigMenu.FileMenu.Main, ...
   'Separator','on', ...
   'Callback','rguifcn(''printfig'',gcbf);', ...
   'Tag','PrintMenu', ...
   'Accelerator','p', ...
   'label','Print...');

FigMenu.FileMenu.Figure=uimenu(FigMenu.FileMenu.Main, ...
   'Callback','rguifcn(''makefig'',gcbf);', ...
   'Tag','FigureMenu', ...
   'label','Print to Figure...');

FigMenu.FileMenu.Close=uimenu(FigMenu.FileMenu.Main, ...
   'Accelerator','w', ...
   'Separator','on', ...
   'Tag','CloseMenu', ...
   'label','Close Viewer', ...
   'CallBack','rguifcn(''closewindow'',gcbf);');

FigMenu.ToolsMenu.Main=uimenu(a, ...
   'tag','ToolsMenu', ...
   'label','Tools');

FigMenu.ToolsMenu.ConfigMenu=uimenu(FigMenu.ToolsMenu.Main, ...
   'label','Viewer Configuration', ...
   'Tag','ViewPref', ...
   'Callback','rguifcn(''configure'',gcbf);');

FigMenu.ToolsMenu.Response=uimenu(FigMenu.ToolsMenu.Main, ...
   'label','Response Preferences', ...
   'Separator','on',...
   'Tag','RespMenu', ...
   'UserData',0,...
   'Accelerator','r', ...
   'Callback','rguifcn(''openresppref'',gcbf)');
FigMenu.ToolsMenu.Linestyle=uimenu(FigMenu.ToolsMenu.Main, ...
   'label','Linestyle Preferences', ...
   'Accelerator','l', ...
   'Tag','PlotMenu', ...
   'UserData',0,...
   'Callback','rguifcn(''openlinepref'',gcbf);');
%FigMenu.ToolsMenu.UserDefined=uimenu(FigMenu.ToolsMenu.Main, ...
%   'label','User-defined Plots', ...
%   'Separator','on',...
%   'Enable','off',...
%   'Tag','UserDefinedMenu');

FigMenu.HelpMenu.Main=uimenu(a, ...
   'label','Help');
 
FigMenu.HelpMenu.ControlsHelp=uimenu(FigMenu.HelpMenu.Main, ...
   'Callback','rguifcn(''help'',gcbf);', ...
   'label','Overview...');
 
FigMenu.HelpMenu.RespPrefHelp=uimenu(FigMenu.HelpMenu.Main, ...
   'Separator','on', ...
   'Callback','rguiropts(''help'',gcbf);', ...
   'label','Response Preferences...');
 
FigMenu.HelpMenu.LinePrefHelp=uimenu(FigMenu.HelpMenu.Main, ...
   'Callback','rguipopts(''help'',gcbf);', ...
   'label','Linestyle Preferences...');

for ctPos = 1:size(AxesPos{ConfigNumber},1),
   BackgroundAxes(ctPos,1) = axes('Parent',a, ...
      'Units','norm', ...
      'Visible','on', ...
      'Position',AxesPos{ConfigNumber}(ctPos,:));
end

FigPos = get(a,'Position');
A.StatusFrame = uicontrol(a,'style','frame',...
   'Unit','Character',...
   'Position',[3 0.5 FigPos(3)-6 2.5]);
A.StatusText = uicontrol(a,'style','text', ...
   'Unit','Character',...
   'HorizontalAlign','left',...
   'Position',[4 0.75 FigPos(3)-8 1.5], ...
   'Tag','StatusText', ...
   'String','Use the Import item under the File menu to load an LTI model.');

[garb,indresp]=setdiff(AllPlotTypes,plottype);
DefaultPlotTypes = [plottype(:);AllPlotTypes(sort(indresp))];

A.Handle = a;
A.FigureMenu = FigMenu;
A.ArrayPlotVariable = 'none';
A.AxesPosition = AxesPos;
A.BackgroundAxes = BackgroundAxes;
A.ChannelPlotVariable = 'none';

%---For the LTI Viewer, only use colors with a valid color plot symbol
CO = get(a,'defaultaxescolororder'); 
A.ColorOrder = cell(size(CO,1),1);
for ctC = 1:size(CO,1),
   A.ColorOrder{ctC} = legdstr(CO(ctC,:));
end
[b,i,j]=unique(A.ColorOrder);
A.ColorOrder = A.ColorOrder(sort(i));
A.Configuration = ConfigNumber;
A.FrequencyData = SystemData.FRDindices;
A.FrequencyUnits = 'radianspersecond';
A.FrequencyVectorMode = 'auto';
A.InputPlotVariable = 'none';
A.LineStyleOrder = get(a,'defaultaxeslinestyleorder');
%---Make sure LinestyleOrder is a cell array
if ~iscell(A.LineStyleOrder),
   A.LineStyleOrder = cellstr(A.LineStyleOrder);
end
%---Make sure all Linestyles are available
Ltemp = {'-';'--';'-.';':';'none'};
extraL = setxor(A.LineStyleOrder,Ltemp);
A.LineStyleOrder = [A.LineStyleOrder;extraL];
A.LineStylePreferences = 'off';
A.MarkerOrder = {'none';'x';'o';'+';'*';'s';'d';'p';'h'};
A.MagnitudeUnits = 'decibels';
A.RiseTimeLimits = [0.1,0.9];
A.SettlingTimeThreshold = 0.02;
A.SystemNames = SystemData.Names;
A.OutputPlotVariable = 'none';
A.Parent = Parent;
A.PhaseUnits = 'degrees';
A.PlotStrings = SystemData.PlotStrs;
A.PlotTypeOrder = DefaultPlotTypes;
A.ResponsePreferences = 'off';
A.SingularValueType = 0;
A.Systems = SystemData.Systems;
if isequal(get(0,'ScreenDepth'),1),
   A.SystemPlotVariable = 'linestyle';
else
   A.SystemPlotVariable = 'color';
end
A.TimeData = struct('Name',[],'Time',[],...
   'Amplitude',[]);
A.TimeVectorMode = 'auto';
SysVis = cell(length(SystemData),1);
SysVis(:) = {'on'};
A.Visible = SysVis;
A.YlimMode = 'auto';

A = class(A,'viewgui');

if iscell(A.PlotStrings) & isempty(A.PlotStrings{1}),
   A.PlotStrings = viewpstr(A);
end

set(a,'visible','on','UserData',A)
