
function [out1] = hits_aux_draw_progress(in1,in2,in3,in4,in5)
% hits_aux_draw_progress  計算進捗の表示
%
% [進捗表示の準備をする]
% prgrs_st = hits_aux_draw_progress(Mode, Width, Height)
% のように，戻り値を指定すると，進捗表示のための初期化を行い，
% 諸設定を prgrs_st に代入します．この時の引数設定は以下の通りです．
% 
%   Mode = 'g' : GUIのプログレスバーを表示します．
%          't' : テキストで進捗状況を表示します．(省略時：'t')
%   Width, Height : 表示するウィンドウの大きさです．(省略時：Width=100,Height=50)
%
%   prgrs_st : 進捗表示に必要な諸設定が含まれています．
%
% [進捗を表示する]
% hits_aux_draw_progress(prgrs_st, out_format, step, total, skip)
% のように戻り値を省略すると，進捗表示を行います．
% prgrs_st.OutMode = 't' であればコンソールに，
% prgrs_st.OutMode = 'g' であればFigureウィンドウに出力されます．
% 上記以外の場合，表示をしません．
% この時の引数設定は以下の通りです．
% 
%   prgrs_st    : 初期化時の帰り値(プログレスバーの設定値)([]に設定時：後述)
%   out_format  : 表示フォーマット(sprintfを内部的に使用)(省略不可)
%   step        : 進捗したステップ数(省略不可)
%   total       : トータル必要なステップ数(省略不可)
%   skip        : 何回おきに表示を更新するか(省略時：1)
%
% [プログレスバーを閉じる]
% hits_aux_draw_progress(prgrs_st)
% のように，設定のみを引数として与えると，プログレスバーを閉じます．
%
% 例： GUIのプログレスバーを表示し，最後に閉じる．
%   prgrsbar = hits_aux_draw_progress('g',300,50);
%   for i=1:10
%       hits_aux_draw_progress(prgrsbar,'Step %d / %d', i, 10, 2);
%       pause(1)
%   end
%   hits_aux_draw_progress(prgrsbar);
%
% [簡易な使い方]
% hits_aux_draw_progress([], out_format, step, total, skip);
% とし，prgrs_stを[]として明示的に与えることで，
% 初期化なしでの，テキストモードでの表示ができます．
%
% 例：hits_aux_draw_progress([],'Step %d / %d',100,10,2);
%     とすると，結果として 'Step 10/100'が，2ステップに1回表示されます．


if(exist('in1','var') && isempty(in1))
    in1.hdl = -1;
    in1.hdltxt = -1;
    in1.OutMode = 't';
end

if ( nargout == 1)
    %初期化フェーズ
    mode = 1;
    if ~ischar(in1) || ~(strcmp(in1,'g') || strcmp(in1,'t') )
        in1 = '';
    end
    if ~isnumeric(in2) || isempty(in2)
        in2 = 100;
    end
    if ~isnumeric(in3) || isempty(in3)
        in3 = 50;
    end
elseif (nargout == 0)
    %基本表示フェーズ
    
    %in1は望む構造体か？
    in1_is_st = isfield(in1,'hdl') && isfield(in1,'hdltxt') && isfield(in1,'OutMode');
    if(~in1_is_st)
        warning('HITs:Bad_Arguments','引数が異常なため進捗バーの描画をスキップします');
    end
    
    %ハンドルは有効か？
    val_hdl = ishandle(in1.hdl) && ishandle(in1.hdltxt);
    
    if(~val_hdl && strcmpi(in1.OutMode,'g'))
        %ハンドルが有効じゃないので，テキストモードに移行
        in1.OutMode = 't';
    end
    
    %表示モードで，引数一個で，かつハンドルが生きていれば閉じる
    if(nargout ==0 && nargin == 1)
        if(isfield(in1,'hdl') && ishandle(in1.hdl))
             close(in1.hdl);
            return;
        end
        return;
    end
    mode = 2;   %異常がなさそうなので表示フェーズ
    if(nargin < 5); in5 = 1;end;    %スキップ数が設定されていなければ設定
else
    warning('HITs:Bad_Arguments','引数が異常なため進捗バーの描画をスキップします');
    return;
end

if mode==1
    out1.OutMode = in1;
    
    if(strcmpi(in1,'g'))
        wid = in2;
        hei = in3;
        
        % 初期化フェーズ
        out1.hdl=figure('name','Progress');
        pppos = get(out1.hdl,'position');
        pppos = [pppos(1) pppos(2) wid hei];
        set(out1.hdl,'position',pppos,'toolbar','no','menubar','no');
        out1.hdlax = axes('position',[0 0 1 1],'xtick',[],'ytick',[]);
        xlim(out1.hdlax,[0 1]);ylim(out1.hdlax,[0 1]);
        hold(out1.hdlax,'on');
        out1.hdltxt = text(0.1,0.65,'');
        out1.hdlrect_back = patch([0.1 0.1 0.90 0.90],[0.2 0.40 0.40 0.2],'c');
        out1.hdlrect = patch([0.1 0.1 0.10 0.10],[0.2 0.4 0.4 0.2],'b');
        fprintf('Progress bar is initialized.\n');
        drawnow;
    else
        out1.hdltxt = -1;
        out1.hdl = -1;
    end
    return;
end

if(mode==2)
    % 表示フェーズ
    if( rem( in3, in5)~=0 );return;end;
    vin{1}=in3;
    vin{2}=in4;
    txt = sprintf(in2,vin{:});
    
    if( strcmpi(in1.OutMode,'g'))
        set(in1.hdltxt,'String',txt);
        r_pos = 0.1 + 0.8*(in3 ./ in4);
        rect = get(in1.hdlrect,'XData');
        rect = [rect(1) rect(2) r_pos r_pos];
        set(in1.hdlrect,'XData',rect);
        drawnow;
    elseif( strcmpi(in1.OutMode,'t'))
        fprintf([txt '\n' ]);
    else
        %何もしない．
    end
    return;
end

end


