source: trunk/src/uigetfile_uvmat.m @ 610

Last change on this file since 610 was 610, checked in by sommeria, 8 years ago

various bugs fixed after tests under widows
introduce uigetfile_uvmat for series/status (some problems need to be solved)

File size: 11.6 KB
Line 
1%'uigetfile_uvmat': browser faster than the Matlab fct uigetfile
2%------------------------------------------------------------------------
3% hfig=uigetfile_uvmat(OutputDir,option)
4%
5% OUTPUT:
6% fileinput: detected file name, including path
7%
8% INPUT:
9% title: = displayed title, 'status': display advancement of a series calculation
10% InputDir: directory to browse at first display
11
12function fileinput=uigetfile_uvmat(title,InputName)
13fileinput=''; %default file selection
14if strcmp(title,'status_display')
15    option='status_display';
16else
17    option='browser';
18end
19if exist(InputName,'dir')
20    InputDir=InputName;
21      InputFileName='';
22elseif exist(InputName,'file')
23    [InputDir,InputFileName,Ext]=fileparts(InputName);
24    if isempty(InputFileName)% if InputName is already the root
25        InputFileName=InputDir;
26        if  ~isempty(strcmp (computer, {'PCWIN','PCWIN64'}))%case of Windows systems
27            InputDir=[InputDir '\'];% append '\' for a correct action of dir
28            InputFileName=[InputFileName '\'];
29        end
30    end
31    if isdir(InputName)
32        InputFileName=['+/' InputFileName Ext];
33    end
34else
35    InputDir=pwd;%look in the current work directory if the input file does not exist
36    InputFileName='';
37end
38hfig=findobj(allchild(0),'tag',option);
39if isempty(hfig)
40    set(0,'Unit','points')
41    ScreenSize=get(0,'ScreenSize');% get the size of the screen, to put the fig on the upper right
42    Width=350;% fig width in points (1/72 inch)
43    Height=min(0.8*ScreenSize(4),500);
44    Left=ScreenSize(3)- Width-40; %right edge close to the right, with margin=40
45    Bottom=ScreenSize(4)-Height-40; %put fig at top right
46    hfig=figure('name',option,'tag',option,'MenuBar','none','NumberTitle','off','Unit','points','Position',[Left,Bottom,Width,Height],'UserData',InputDir);
47    uicontrol('Style','listbox','Units','normalized', 'Position',[0.05 0.09 0.9 0.71], 'Callback', @(src,event)view_file(option,src,event),'tag','list',...
48        'FontUnits','points','FontSize',12);
49    uicontrol('Style','edit','Units','normalized', 'Position', [0.05 0.87 0.9 0.1],'tag','titlebox','Max',2,...
50        'String',InputDir,'FontUnits','points','FontSize',12,'FontWeight','bold');
51    uicontrol('Style','pushbutton','Units','normalized', 'Position', [0.7 0.01 0.2 0.07],'Callback',@(src,event)close(option,src,event),...
52        'String','Close','FontWeight','bold','FontUnits','points','FontSize',12);
53    uicontrol('Style','pushbutton','Tag','refresh','Units','normalized','Position', [0.1 0.01 0.2 0.07],'Callback',@refresh_GUI,...
54        'String','Refresh','FontWeight','bold','FontUnits','points','FontSize',12);
55    %set(hrefresh,'UserData',StatusData)
56    if strcmp(option,'status_display') %put a run advancement display
57        set(hfig,'DeleteFcn',@stop_status)
58        uicontrol('Style','frame','Units','normalized', 'Position',[0.05 0.81 0.01 0.05],'BackgroundColor',[1 0 0],'tag','waitbar');
59        uicontrol('Style','frame','Units','normalized', 'Position', [0.05 0.81 0.9 0.05]);
60    else  %put a title and additional pushbuttons
61        uicontrol('Style','text','Units','normalized', 'Position', [0.15 0.81 0.8 0.03],...
62            'String',title,'FontUnits','points','FontSize',12,'FontWeight','bold','ForegroundColor','blue','HorizontalAlignment','left');
63        uicontrol('Style','pushbutton','Tag','backward','Units','normalized','Position',[0.05 0.8 0.1 0.07],...
64            'String','<--','FontWeight','bold','FontUnits','points','FontSize',12,'Callback',@backward);
65        uicontrol('Style','pushbutton','Units','normalized', 'Position', [0.4 0.01 0.2 0.07],...
66            'String','Home','FontWeight','bold','FontUnits','points','FontSize',12,'Callback',@home_dir);
67    end
68    drawnow
69end
70refresh_GUI(findobj(hfig,'Tag','refresh'),InputFileName)% refresh the list of content of the current dir 
71if ~strcmp(option,'status_display') 
72    uiwait(hfig)
73    fileinput=get(hfig,'UserData');% retrieve the input file selection
74    delete(hfig)
75end
76
77
78
79%------------------------------------------------------------------------   
80% --- launched by refreshing the display figure
81function refresh_GUI(hObject,InputFileName)
82%------------------------------------------------------------------------
83if ~exist('InputFileName','var')
84    InputFileName='';
85end
86hfig=get(hObject,'parent');
87DirName=get(hfig,'UserData');
88ListFiles=list_files(DirName);% list the directory content
89hlist=findobj(hfig,'tag','list');% find the list object
90set(hlist,'String',ListFiles)
91Value=[];
92if ~isempty(InputFileName)
93    Value=find(strcmp(InputFileName,ListFiles));
94end
95if isempty(Value)
96    Value=1;
97end
98set(hlist,'Value',Value)
99
100if strcmp(get(hfig,'Tag'),'status_display')
101   
102    hseries=findobj(allchild(0),'tag','series');
103    hstatus=findobj(hseries,'tag','status_display');
104    StatusData=get(hstatus,'UserData');
105    TimeStart=0;
106    if isfield(StatusData,'TimeStart')
107        TimeStart=StatusData.TimeStart;
108    end
109   
110   
111    htitlebox=findobj(hfig,'tag','titlebox');
112    hlist=findobj(hfig,'tag','list');
113    OutputDir=get(hfig,'UserData');
114   
115    testrecent=0;
116    datnum=zeros(numel(ListDisplay),1);
117    for ilist=1:numel(ListDisplay)
118        ListDisplay{ilist}=ListFiles(ilist).name;
119        if ListFiles(ilist).isdir
120            ListDisplay{ilist}=['/' ListDisplay{ilist}];
121        elseif isfield(ListFiles(ilist),'datenum')
122            datnum(ilist)=ListFiles(ilist).datenum;%only available in recent matlab versions
123            testrecent=1;
124            if datnum(ilist)<TimeStart
125                ListDisplay{ilist}=[ListDisplay{ilist} '  --OLD--'];
126            end
127        end
128    end
129   
130    %% Look at date of creation
131    ListDisplay=ListDisplay(datnum~=0);
132    datnum=datnum(datnum~=0);%keep the non zero values corresponding to existing files
133   
134    NbOutputFile=[];
135    if isempty(datnum)
136        if testrecent
137            message='no result created yet';
138        else
139            message='';
140        end
141    else
142        [first,indfirst]=min(datnum);
143        [last,indlast]=max(datnum);
144        NbOutputFile_str='?';
145        if isfield(StatusData,'NbOutputFile')
146            NbOutputFile=StatusData.NbOutputFile;
147            NbOutputFile_str=num2str(NbOutputFile);
148        end
149        message={[num2str(numel(datnum)) ' file(s) done over ' NbOutputFile_str] ;['oldest modification:  ' ListDisplay{indfirst} ' : ' datestr(first)];...
150            ['latest modification:  ' ListDisplay{indlast} ' : ' datestr(last)]};
151    end
152    set(htitlebox,'String', [DirName{1};message])
153   
154    %% update the waitbar
155    hwaitbar=findobj(hfig,'tag','waitbar');
156    if ~isempty(NbOutputFile)
157        BarPosition=get(hwaitbar,'Position');
158        BarPosition(3)=0.9*numel(datnum)/NbOutputFile;
159        set(hwaitbar,'Position',BarPosition)
160    end
161end
162
163%------------------------------------------------------------------------   
164% --- launched by selecting an item on the file list
165function view_file(option,hObject,event)
166%------------------------------------------------------------------------
167list=get(hObject,'String');
168index=get(hObject,'Value');
169hfig=get(hObject,'parent');%handle of the fig
170DirName=get(hfig,'UserData');
171SelectName=regexprep(list{index},'^\+/','');% remove the +/ used to mark dir
172if strcmp(SelectName,'..')% the upward dir option has been selected
173    FullSelectName=fileparts(DirName);
174else
175    %ind_dot=regexp(SelectName,'\.\.\.');
176    % if ~isempty(ind_dot)
177    %     SelectName=SelectName(1:ind_dot-1);
178    % end
179    FullSelectName=fullfile(DirName,SelectName);
180end
181if exist(FullSelectName,'dir')% a directory has been selected
182%     ListFiles=dir(FullSelectName);
183%     ListDisplay=cell(numel(ListFiles),1);
184%     for ilist=2:numel(ListDisplay)% suppress the first line '.'
185%         ListDisplay{ilist-1}=ListFiles(ilist).name;
186%     end
187%     set(hObject,'Value',1)
188%     set(hObject,'String',ListDisplay)
189%     if strcmp(selectname,'..')
190%         FullSelectName=fileparts(fileparts(FullSelectName));
191%     end
192    hbackward=findobj(hfig,'Tag','backward');
193    set(hbackward,'UserData',DirName); %store the current dir for future backward action
194    ListFiles=list_files(FullSelectName);
195    set(hObject,'Value',1)
196    set(hObject,'String',ListFiles)
197    set(hfig,'UserData',FullSelectName)% record the new dir name
198    htitlebox=findobj(hfig,'tag','titlebox');  % display the new dir name 
199    set(htitlebox,'String',FullSelectName)
200elseif exist(FullSelectName,'file')%visualise the field if it exists
201    FileType=get_file_type(FullSelectName);
202    if strcmp(FileType,'txt')
203        edit(FullSelectName)
204    elseif strcmp(FileType,'xml')
205        editxml(FullSelectName)
206            elseif strcmp(FileType,'figure')
207        open(FullSelectName)
208    else
209        %uvmat(FullSelectName);
210        switch option
211            case 'browser'
212        hfig=get(hObject,'parent');
213        set(hfig,'UserData',FullSelectName);
214        uiresume(hfig)
215            case 'status_display'
216           uvmat(FullSelectName);
217        end
218        set(gcbo,'Value',1)
219    end
220end
221
222%-------------------------------------------------------------------------   
223% list the content of a directory
224function ListFiles=list_files(DirName)
225%-------------------------------------------------------------------------
226ListStruct=dir(DirName);% get structure of the current directory
227if numel(ListStruct)<1
228    ListFiles={};
229    return
230end
231if strcmp(ListStruct(1).name,'.')
232    ListStruct(1)=[];%removes the first line ='.'
233end
234ListCells=struct2cell(ListStruct);% transform dir struct to a cell arrray
235ListFiles=ListCells(1,:);%list of file names
236check_dir=cell2mat(ListCells(4,:));% check directories
237ListFiles(check_dir)=regexprep(ListFiles(check_dir),'^.+','+/$0');% put '+/' in front of dir name display
238[tild,index_sort]=sort(check_dir,2,'descend');% sort
239ListFiles=ListFiles(index_sort);% list of names sorted by alaphabetical order and dir and file
240cell_remove=regexp(ListFiles,'^(-|\.|\+/\.)');% detect strings beginning by '-' ,'.' or '+/.'(dir beginning by . )
241check_keep=cellfun('isempty', cell_remove);               
242ListFiles=[{'+/..'} ListFiles(check_keep)];
243
244%------------------------------------------------------------------------   
245% --- launched by selecting home
246function home_dir(hObject,event)
247%------------------------------------------------------------------------
248DirName=pwd;
249ListFiles=list_files(DirName);% list the directory content
250hfig=get(hObject,'parent');
251    set(hfig,'UserData',DirName)% record the new dir name
252    htitlebox=findobj(hfig,'tag','titlebox');  % display the new dir name 
253    set(htitlebox,'String',DirName)
254    hlist=findobj(hfig,'tag','list');% find the list object
255set(hlist,'String',ListFiles)
256%------------------------------------------------------------------------
257
258%------------------------------------------------------------------------   
259% --- launched by pressing the backward (<--) button
260function backward(hObject,event)
261%------------------------------------------------------------------------
262PrevDir=get(hObject,'UserData');
263if ~isempty(PrevDir)
264hfig=get(hObject,'parent');
265set(hfig,'UserData',PrevDir)
266htitlebox=findobj(hfig,'tag','titlebox');  % display the new dir name
267set(htitlebox,'String',PrevDir)
268refresh_GUI(findobj(hfig,'Tag','refresh'))
269end
270
271%-------------------------------------------------------------------------   
272% launched by deleting the status figure (only used in mode series status')
273function close(option,hObject, eventdata)
274%-------------------------------------------------------------------------
275if strcmp(option,'status_display')
276    hseries=findobj(allchild(0),'tag','series');
277    hstatus=findobj(hfig,'Tag','status_display');
278    set(hhciv.status,'value',0) %reset the status uicontrol in the GUI civ
279    set(hhciv.status,'BackgroundColor',[0 1 0])
280end
281delete(gcbf)
282
Note: See TracBrowser for help on using the repository browser.