function str = cfg_textfill(obj, left, right, tflag)

% function str = cfg_textfill(obj, left, right)
% Fill a text object, so that the left part is left justified and the
% right part right justified. If tflag is set, try to fit text in widget
% by truncating right until at least 5 characters are displayed.
%
% This code is part of a batch job configuration system for MATLAB. See 
%      help matlabbatch
% for a general overview.
%_______________________________________________________________________
% Copyright (C) 2007 Freiburg Brain Imaging

% Volkmar Glauche
% $Id: cfg_textfill.m 7473 2018-11-06 10:26:44Z guillaume $

rev = '$Rev: 7473 $'; %#ok

if ~ishandle(obj)
    cfg_message('matlabbatch:usage',...
          'First input must be a graphics handle.');
else
    try
        get(obj,'string');
    catch
        cfg_message('matlabbatch:usage',...
              'Input object must have a ''string'' property.');
    end;
end;
if ~iscellstr(left)
    if ischar(left)
        left = cellstr(left);
    else
        cfg_message('matlabbatch:usage',...
              'Second input must be a string array or cellstr.');
    end;
    % add one space as delimiter
    left = strcat(left, {' '});
end;
if ~iscellstr(right)
    if ischar(right)
        right = cellstr(right);
    else
        cfg_message('matlabbatch:usage',...
              'Third input must be a string array or cellstr.');
    end;
end;
if numel(left) ~= numel(right)
    cfg_message('matlabbatch:usage',...
          'Second and third input must have the same number of lines.');
end;  

if exist('OCTAVE_VERSION', 'builtin'), set(0,'currentfigure',ancestor(obj,'figure')); end
TempObj=copyobj(obj,get(obj,'Parent'));
set(TempObj,'Visible','off','Max',100);

% Find max extent of left string
lext = cfg_maxextent(TempObj, left);
mlext = max(lext);

% Find max extent of right string
rext = cfg_maxextent(TempObj, right);
mrext = max(rext);

% Find extent of single space
% Work around MATLAB inaccuracy by measuring 100 spaces and dividing by 100
spext = cfg_maxextent(TempObj, {repmat(' ',1,100)})/100;

% try to work out slider size
pos = get(TempObj,'Position');
oldun = get(TempObj,'units');
set(TempObj,'units','points');
ppos = get(TempObj,'Position');
set(TempObj,'units',oldun);
sc = pos(3)/ppos(3);
% assume slider width of 15 points
swidth=15*sc;

pos = get(obj,'Position');
width = max(mlext+mrext,pos(3)-swidth);
if tflag && mlext+mrext > pos(3)-swidth
    newrext = max(5*spext, pos(3)-swidth-mlext);
    trind = find(rext > newrext);
    for k = 1:numel(trind)
        tright = right{trind(k)};
        set(TempObj,'String',['...' tright]);
        ext = get(TempObj,'Extent');
        while ext(3) > newrext
            tright = tright(2:end);
            set(TempObj,'String',['...' tright]);
            ext = get(TempObj,'Extent');
        end;
        right{trind(k)} = ['...' tright];
        rext(trind(k)) = ext(3);
    end;
    % Re-estimate max extent of trimmed right string
    rext = cfg_maxextent(TempObj, right);
    mrext = max(rext);
    width = mlext+mrext;
end;

fillstr = cell(size(left));
for k = 1:numel(left)
    fillstr{k} = repmat(' ',1,floor((width-(lext(k)+rext(k)))/spext));
end;
str = strcat(left, fillstr, right);
delete(TempObj);
