Initial commit
[pftoolbox.git] / GUI / xtable_edit.m
blob3404fd49e51d4e7babb82137462f21c14f79a3b8
1 function xtable_edit(action,varargin)\r
2 % Sorry, I didn't have enough time to write nice and documented GUI code.\r
3 \r
4 % Toolbox for nonlinear filtering.\r
5 % Copyright (C) 2005  Jakob Rosén <jakob.rosen@gmail.com>\r
6 %\r
7 % This program is free software; you can redistribute it and/or\r
8 % modify it under the terms of the GNU General Public License\r
9 % as published by the Free Software Foundation; either version 2\r
10 % of the License, or (at your option) any later version.\r
11 %\r
12 % This program is distributed in the hope that it will be useful,\r
13 % but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15 % GNU General Public License for more details.\r
16 %\r
17 % You should have received a copy of the GNU General Public License\r
18 % along with this program; if not, write to the Free Software\r
19 % Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\r
21 %myfont='FixedWidth';\r
22 myfont='default';\r
24 if strcmp(action,'init');\r
25         parentfig=varargin{1};\r
26         obj=varargin{2};\r
27         caller=varargin{3};\r
28         callback=varargin{4};\r
30         % Make the GUI show the correct information\r
31         if strcmp(caller,'h')||strcmp(caller,'hu')\r
32                 if strcmp(obj.wchar,'w')\r
33                         set(obj,'wchar','e');\r
34                 end\r
35         else\r
36                 if strcmp(obj.wchar,'e')\r
37                         set(obj,'wchar','w');\r
38                 end\r
39         end     \r
41         array=obj.array;\r
43         interpolate=obj.interpolate;\r
44         Ts=obj.Ts;\r
45         gradx=obj.gradx;\r
46         gradw=obj.gradw;\r
47         \r
48         if isempty(Ts)\r
49                 t_first='None';\r
50                 t_last='None';\r
51         else\r
52                 t_first=num2str(Ts(1));\r
53                 t_last=num2str(Ts(end));\r
54         end;\r
56         hf=figure('Name','xtable object editor');\r
58         uicontrol('Style','Text','String','3d expression matrix:','Units','normalized','Position',[0.0,0.90,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);\r
59         uicontrol('Style','Edit','String','','Units','normalized','Position',[0.4,0.90,0.4,0.05],'Tag','expression_edit','Callback',['xtable_edit(''expression_import'',',num2str(hf),')'],'Fontname',myfont);\r
60         uicontrol('Style','Pushbutton','String','Import','Units','normalized','Position',[0.85,0.90,0.15,0.05],'Callback',['xtable_edit(''expression_import'',',num2str(hf),')'],'Fontname',myfont);\r
62         uicontrol('Style','Text','String','Sample point vector:','Units','normalized','Position',[0.0,0.82,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);\r
63         uicontrol('Style','Edit','String','','Units','normalized','Position',[0.4,0.82,0.4,0.05],'Tag','Ts_edit','Callback',['xtable_edit(''Ts_import'',',num2str(hf),')'],'Fontname',myfont);\r
64         uicontrol('Style','Pushbutton','String','Import','Units','normalized','Position',[0.85,0.82,0.15,0.05],'Callback',['xtable_edit(''Ts_import'',',num2str(hf),')'],'Fontname',myfont);\r
66         uicontrol('Style','Text','String','gradx (for EKF):','Units','normalized','Position',[0.0,0.74,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);\r
67         uicontrol('Style','Edit','String','','Units','normalized','Position',[0.4,0.74,0.4,0.05],'Tag','gradx_edit','Callback',['xtable_edit(''gradx_import'',',num2str(hf),')'],'Fontname',myfont);\r
68         uicontrol('Style','Pushbutton','String','Import','Units','normalized','Position',[0.85,0.74,0.15,0.05],'Callback',['xtable_edit(''gradx_import'',',num2str(hf),')'],'Fontname',myfont);\r
70         uicontrol('Style','Text','String',sprintf('grad%s (for EKF):',obj.wchar),'Units','normalized','Position',[0.0,0.66,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);\r
71         uicontrol('Style','Edit','String','','Units','normalized','Position',[0.4,0.66,0.4,0.05],'Tag','gradw_edit','Callback',['xtable_edit(''gradw_import'',',num2str(hf),')'],'Fontname',myfont);\r
72         uicontrol('Style','Pushbutton','String','Import','Units','normalized','Position',[0.85,0.66,0.15,0.05],'Callback',['xtable_edit(''gradw_import'',',num2str(hf),')'],'Fontname',myfont);\r
75         if isempty(array)\r
76                 n=0;\r
77         else\r
78                 n=size(array,3);\r
79         end\r
81         if isempty(gradx)\r
82                 gxn='None';\r
83         else\r
84                 gxn=sprintf('%d x %d x %d',size(gradx,1),size(gradx,2),size(gradx,3));\r
85         end\r
87         if isempty(gradw)\r
88                 gwn='None';\r
89         else\r
90                 gwn=sprintf('%d x %d x %d',size(gradw,1),size(gradw,2),size(gradw,3));\r
91         end\r
94         p=-0.1;\r
95         uicontrol('Style','Text','String','Expression size:','Units','normalized','Position',[0.0,p+0.60,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);\r
96         uicontrol('Style','Text','String',sprintf('%d x %d',size(array,1),size(array,2)),'Units','normalized','Position',[0.4,p+0.60,0.4,0.05],'Tag','expression_size','HorizontalAlign','Left','Fontname',myfont);\r
97         uicontrol('Style','Text','String','Number of expressions:','Units','normalized','Position',[0.0,p+0.55,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);\r
98         uicontrol('Style','Text','String',num2str(n),'Units','normalized','Position',[0.4,p+0.55,0.4,0.05],'Tag','expression_number','HorizontalAlign','Left','Fontname',myfont);\r
99         uicontrol('Style','Text','String','Number of sample points:','Units','normalized','Position',[0.0,p+0.5,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);\r
100         uicontrol('Style','Text','String',num2str(length(Ts)),'Units','normalized','Position',[0.4,p+0.5,0.4,0.05],'Tag','Ts_number','HorizontalAlign','Left','Fontname',myfont);\r
101         uicontrol('Style','Text','String','First sample point:','Units','normalized','Position',[0.0,p+0.45,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);\r
102         uicontrol('Style','Text','String',t_first,'Units','normalized','Position',[0.4,p+0.45,0.4,0.05],'Tag','Ts_first','HorizontalAlign','Left','Fontname',myfont);\r
103         uicontrol('Style','Text','String','Last sample point:','Units','normalized','Position',[0.0,p+0.4,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);\r
104         uicontrol('Style','Text','String',t_last,'Units','normalized','Position',[0.4,p+0.4,0.4,0.05],'Tag','Ts_last','HorizontalAlign','Left','Fontname',myfont);\r
106         uicontrol('Style','Text','String','gradx size:','Units','normalized','Position',[0.0,0.2,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);\r
107         uicontrol('Style','Text','String',gxn,'Units','normalized','Position',[0.4,0.2,0.4,0.05],'Tag','gradx_size','HorizontalAlign','Left','Fontname',myfont);\r
108         uicontrol('Style','Text','String',sprintf('grad%s size:',obj.wchar),'Units','normalized','Position',[0.0,0.15,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);\r
109         uicontrol('Style','Text','String',gwn,'Units','normalized','Position',[0.4,0.15,0.4,0.05],'Tag','gradw_size','HorizontalAlign','Left','Fontname',myfont);\r
111         uicontrol('Style','Text','String','Interpolation:','Units','normalized','Position',[0.0,0.02,0.4,0.05],'HorizontalAlign','Left','Fontname',myfont);\r
112         uicontrol('Style','Radiobutton','String','None','Value',~interpolate,'Units','normalized','Position',[0.4,0.02,0.2,0.05],'Tag','radio1','Callback',['xtable_edit(''radio1'',',num2str(hf),')'],'HorizontalAlign','Left','Fontname',myfont);\r
113         uicontrol('Style','Radiobutton','String','Linear','Value',interpolate,'Units','normalized','Position',[0.6,0.02,0.2,0.05],'Tag','radio2','Callback',['xtable_edit(''radio2'',',num2str(hf),')'],'HorizontalAlign','Left','Fontname',myfont);\r
115         uicontrol('Style','Pushbutton','String','Save','Units','normalized','Position',[0.8,0.02,0.1,0.05],'Callback',['xtable_edit(''save'',',num2str(hf),')'],'Fontname',myfont);\r
116         uicontrol('Style','Pushbutton','String','Cancel','Units','normalized','Position',[0.9,0.02,0.1,0.05],'Callback',['delete(',num2str(hf),')'],'Fontname',myfont);\r
119         handles=guihandles(hf);\r
120         handles.array=array;\r
121         handles.obj=obj;\r
122         handles.caller=caller;\r
123         handles.callback=callback;\r
124         handles.parentfig=parentfig;\r
125         handles.interpolate=interpolate;\r
126         handles.Ts=Ts;\r
127         handles.gradx=gradx;\r
128         handles.gradw=gradw;\r
129         handles.wchar=obj.wchar;\r
130         guidata(hf,handles);\r
132         xtable_edit('check',hf);\r
135 elseif strcmp(action,'radio1')\r
136         hf=varargin{1};\r
137         handles=guidata(hf);\r
138         set(handles.radio1,'value',1);\r
139         set(handles.radio2,'value',0);\r
140         handles.interpolate=false;\r
141         guidata(hf,handles);\r
142         \r
143 elseif strcmp(action,'radio2')\r
144         hf=varargin{1};\r
145         handles=guidata(hf);\r
146         set(handles.radio2,'value',1);\r
147         set(handles.radio1,'value',0);\r
148         handles.interpolate=true;\r
149         guidata(hf,handles);\r
150         \r
151 elseif strcmp(action,'expression_import')\r
152         hf=varargin{1};\r
153         handles=guidata(hf);\r
154         expr_str=get(handles.expression_edit,'String');\r
155         if isempty(expr_str)\r
156                 msgbox('Error! Empty field');\r
157                 return;\r
158         else\r
159                 array=evalin('base',expr_str,'[]');\r
160                 if isempty(array)\r
161                         % An error occured while importing\r
162                         msgbox('Error! Did you type the correct name of the object?');\r
163                         return;\r
164                 elseif ~isa(array,'double')\r
165                         msgbox('Error! The object must be a matrix consisting of doubles!');\r
166                         return;\r
167                 elseif ndims(array)~=3\r
168                         msgbox('The data array must be three-dimensional!');\r
169                         return;\r
170                 else\r
171                         set(handles.expression_size,'String',sprintf('%d x %d',size(array,1),size(array,2)));\r
172                         set(handles.expression_number,'String',num2str(size(array,3)));\r
173                 end\r
174         end;\r
175         handles.array=array;\r
176         guidata(hf,handles);\r
178 elseif strcmp(action,'Ts_import')\r
179         hf=varargin{1};\r
180         handles=guidata(hf);\r
181         expr_str=get(handles.Ts_edit,'String');\r
182         if isempty(expr_str)\r
183                 msgbox('Error! Empty field');\r
184                 return;\r
185         else\r
186                 Ts=evalin('base',expr_str,'[]');\r
187                 if isempty(Ts)\r
188                         % An error occured while importing\r
189                         msgbox('Error! Did you type the correct name of the object?');\r
190                         return;\r
191                 elseif ~isa(Ts,'double')\r
192                         msgbox('Error! The object must be a matrix consisting of doubles!');\r
193                         return;\r
194                 elseif min(size(Ts,1),size(Ts,2))~=1||ndims(Ts)>2\r
195                         msgbox('The data matrix must be one-dimensional!');\r
196                         return;\r
197                 else\r
198                         set(handles.Ts_number,'String',num2str(length(Ts)));\r
199                         set(handles.Ts_first,'String',num2str(Ts(1)));\r
200                         set(handles.Ts_last,'String',num2str(Ts(end)));\r
201                 end\r
202         end;\r
203         handles.Ts=Ts;\r
204         guidata(hf,handles);\r
206 elseif strcmp(action,'gradx_import')\r
207         hf=varargin{1};\r
208         handles=guidata(hf);\r
209         expr_str=get(handles.gradx_edit,'String');\r
210         if isempty(expr_str)\r
211                 grad=[];\r
212         else\r
213                 grad=evalin('base',expr_str,'[]');\r
214                 if isempty(grad)\r
215                         % An error occured while importing\r
216                         msgbox('Error! Did you type the correct name of the object?');\r
217                         return;\r
218                 elseif ~isa(grad,'double')\r
219                         msgbox('Error! The object must be a matrix consisting of doubles!');\r
220                         return;\r
221                 elseif ndims(grad)~=3\r
222                         msgbox('The gradient array must be three-dimensional!');\r
223                         return;\r
224                 end\r
225         end;\r
227         if isempty(grad)\r
228                 gxn='None';\r
229         else\r
230                 gxn=sprintf('%d x %d x %d',size(grad,1),size(grad,2),size(grad,3));\r
231         end\r
233         set(handles.gradx_size,'String',gxn);\r
234         handles.gradx=grad;\r
235         guidata(hf,handles);\r
237 elseif strcmp(action,'gradw_import')\r
238         hf=varargin{1};\r
239         handles=guidata(hf);\r
240         expr_str=get(handles.gradw_edit,'String');\r
241         if isempty(expr_str)\r
242                 grad=[];\r
243         else\r
244                 grad=evalin('base',expr_str,'[]');\r
245                 if isempty(grad)\r
246                         % An error occured while importing\r
247                         msgbox('Error! Did you type the correct name of the object?');\r
248                         return;\r
249                 elseif ~isa(grad,'double')\r
250                         msgbox('Error! The object must be a matrix consisting of doubles!');\r
251                         return;\r
252                 elseif ndims(grad)~=3\r
253                         msgbox('The gradient array must be three-dimensional!');\r
254                         return;\r
255                 end\r
256         end;\r
258         if isempty(grad)\r
259                 gwn='None';\r
260         else\r
261                 gwn=sprintf('%d x %d x %d',size(grad,1),size(grad,2),size(grad,3));\r
262         end\r
264         set(handles.gradw_size,'String',gwn);\r
265         handles.gradw=grad;\r
266         guidata(hf,handles);\r
268 elseif strcmp(action,'save')\r
270         hf=varargin{1};\r
271         handles=guidata(hf);\r
273         caller=handles.caller;\r
274         obj=handles.obj;\r
276         if isempty(handles.array)\r
277                 msgbox('The expression array must not be empty!');\r
278                 return;\r
279         end;\r
281         if isempty(handles.Ts)\r
282                 msgbox('The sample points vector must not be empty!');\r
283                 return;\r
284         end;\r
286         if length(handles.Ts)~=size(handles.array,3)\r
287                 msgbox('Error! The number of expressions and the number of sample points must be equal!');\r
288                 return;\r
289         end\r
291         if ~isempty(handles.gradx)\r
292                 if sum(size(handles.gradx)~=size(handles.array))\r
293                         msgbox('Error! The gradients need to have the same size as the data array.');\r
294                         return;\r
295                 end\r
296         end\r
298         if ~isempty(handles.gradw)\r
299                 if sum(size(handles.gradw)~=size(handles.array))\r
300                         msgbox('Error! The gradients need to have the same size as the data array.');\r
301                         return;\r
302                 end\r
303         end\r
306 %       if handles.interpolation&&size(array,3)<2\r
307 %               msgbox('The number of expressions must be at least 2 in interpolation mode.');\r
308 %       end\r
310         set(obj,'array',handles.array);\r
311         set(obj,'Ts',handles.Ts);\r
312         set(obj,'interpolate',handles.interpolate);\r
313         set(obj,'gradx',handles.gradx);\r
314         set(obj,'gradw',handles.gradw);\r
316         parentfig=handles.parentfig;\r
317         parenthandles=guidata(parentfig);\r
319         parenthandles.(caller)=obj;\r
320         guidata(parentfig,parenthandles);       % Save data\r
321         \r
322         eval(handles.callback);\r
323         close(hf)\r
325 end;\r