Code covered by the BSD License  

Highlights from
Continuous Sound and Vibration Analysis

image thumbnail
from Continuous Sound and Vibration Analysis by Edward Zechmann
This program analyzes sound and vibrations data using metrics for continuous noise and vibrations.

choosebox(varargin)
function [selection,value] = choosebox(varargin)
%CHOOSEBOX  Two-listed item selection dialog box.
%   [SELECTION,OK] = CHOOSEBOX('ListString',S) creates a modal dialog box 
%   which allows you to select a string or multiple strings from a list.
%   Single or multiple strings can be transferred from a base list to a
%   selection list using an arrow-button. Single strings also can be
%   transferred by double-clicking; single or multiple strings are
%   transferred by pressing <CR>.
%   SELECTION is a vector of indices of the selected strings (length 1
%   in the single selection mode). The indices will be in the order of
%   selection from the base list. If a group of multiple strings is
%   selected, its order inside the group will not change, but different
%   groups are ordered by their selection. 
%   OK is 1 if you push the OK button, or 0 if you push the Cancel 
%   button or close the figure. In that case SELECTION will be [],
%   regardless to the actual selection list.
%   Important parameter is 'ChooseMode', see list below.
%
%   Inputs are in parameter,value pairs:
%
%   Parameter       Description
%   'ChooseMode'    string; can be 'pick' or 'copy'.
%                   When set to 'pick', transferred string items from the
%                   base list box are removed. When retransferred, they
%                   again are listed in their initial positions.
%                   When set to 'copy', transferred string items remain in
%                   the base list and can be transferred several times.
%                   default is 'pick'.
%   'ListString'    cell array of strings for the base list box.
%   'SelectionMode' string; can be 'single' or 'multiple'; defaults to
%                   'multiple'.
%   'ListSize'      [width height] of listbox in pixels; defaults
%                   to [160 300].
%   'InitialValue'  vector of indices of which items of the list box
%                   are initially selected; defaults to none [].
%   'Name'          String for the figure's title. Defaults to ''.
%   'PromptString'  string matrix or cell array of strings which appears 
%                   as text above the base list box.  Defaults to {}.
%   'SelectString'  string matrix or cell array of strings which appears
%                   as text above the selection list box. Defaults to {}.
%   'OKString'      string for the OK button; defaults to 'OK'.
%   'CancelString'  string for the Cancel button; defaults to 'Cancel'.
%   'uh'            uicontrol button height, in pixels; default = 18.
%   'fus'           frame/uicontrol spacing, in pixels; default = 8.
%   'ffs'           frame/figure spacing, in pixels; default = 8.
%
%   Example:
%     d = dir;
%     str = {d.name};
%     [s,v] = choosebox('Name','File deletion',...
%                     'PromptString','Files remaining in this directory:',...
%                     'SelectString','Files to delete:',...
%                     'ListString',str)
%
%   inspired by listdlg.m from Mathworks.
%
%   programmed by Peter Wasmeier, Technical University of Munich
%   p.wasmeier@bv.tum.de
%   11-12-03

%   Original listdlg file by
%   T. Krauss, 12/7/95, P.N. Secakusuma, 6/10/97
%   Copyright 1984-2002 The MathWorks, Inc.
%   $Revision: 1.20 $  $Date: 2002/04/09 01:36:06 $

%   Test:  d = dir;[s,v] = choosebox('Name','File deletion','PromptString','Files remaining in this directory:','SelectString','Files to delete:','ListString',{d.name});


error(nargchk(1,inf,nargin))

arrow=[...
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
     0     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     0
     0     1     1     1     1     1     1     0     1     1     1     1     1     1     1     1     0
     0     1     1     1     1     1     1     0     0     1     1     1     1     1     1     1     0
     0     1     1     1     1     1     1     0     0     0     1     1     1     1     1     1     0
     0     1     1     1     1     1     1     0     0     0     0     1     1     1     1     1     0
     0     1     1     0     0     0     0     0     0     0     0     0     1     1     1     1     0
     0     1     1     0     0     0     0     0     0     0     0     0     0     1     1     1     0
     0     1     1     0     0     0     0     0     0     0     0     0     0     0     1     1     0
     0     1     1     0     0     0     0     0     0     0     0     0     0     1     1     1     0
     0     1     1     0     0     0     0     0     0     0     0     0     1     1     1     1     0
     0     1     1     1     1     1     1     0     0     0     0     1     1     1     1     1     0
     0     1     1     1     1     1     1     0     0     0     1     1     1     1     1     1     0
     0     1     1     1     1     1     1     0     0     1     1     1     1     1     1     1     0
     0     1     1     1     1     1     1     0     1     1     1     1     1     1     1     1     0
     0     1     1     1     1     1     1     1     1     1     1     1     1     1     1     1     0
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0];
for i=1:3
   rarrow(:,:,i)=arrow;
   larrow(:,:,i)=fliplr(arrow);
end
clear arrow;

figname = '';
smode = 2;   % (multiple)
cmode = 1;   % remove from left hand side
promptstring = {};
selectstring={};
liststring = [];
listsize = [160 300];
initialvalue = [];
okstring = 'Ok';
cancelstring = 'Cancel';
fus = 8;
ffs = 8;
uh = 18;

if mod(length(varargin),2) ~= 0
    % input args have not com in pairs, woe is me
    error('Arguments to LISTDLG must come param/value in pairs.')
end
for i=1:2:length(varargin)
    switch lower(varargin{i})
     case 'name'
      figname = varargin{i+1};
     case 'promptstring'
      promptstring = varargin{i+1};
     case 'selectstring'
      selectstring = varargin{i+1};
     case 'selectionmode'
      switch lower(varargin{i+1})
       case 'single'
        smode = 1;
       case 'multiple'
        smode = 2;
      end
     case 'choosemode'
      switch lower(varargin{i+1})
       case 'pick'
        cmode = 1;
       case 'copy'
        cmode = 2;
      end
     case 'listsize'
      listsize = varargin{i+1};
     case 'liststring'
      liststring = varargin{i+1};
     case 'initialvalue'
      initialvalue = varargin{i+1};
     case 'uh'
      uh = varargin{i+1};
     case 'fus'
      fus = varargin{i+1};
     case 'ffs'
      ffs = varargin{i+1};
     case 'okstring'
      okstring = varargin{i+1};
     case 'cancelstring'
      cancelstring = varargin{i+1};
     otherwise
      error(['Unknown parameter name passed to LISTDLG.  Name was ' varargin{i}])
    end
end

if isstr(promptstring)
    promptstring = cellstr(promptstring); 
end

if isstr(selectstring)
    selectstring = cellstr(selectstring); 
end

if isempty(initialvalue)
    initialvalue = 1;
end

if isempty(liststring)
    error('ListString parameter is required.')
end

ex = get(0,'defaultuicontrolfontsize')*1.7;  % height extent per line of uicontrol text (approx)

fp = get(0,'defaultfigureposition');
w = 4*fus +2*ffs+2*listsize(1)+50;
h = 2*ffs+7*fus+ex*length(promptstring)+listsize(2)+2*uh;
fp = [fp(1) fp(2)+fp(4)-h w h];  % keep upper left corner fixed

fig_props = { ...
    'name'                   figname ...
    'resize'                 'off' ...
    'numbertitle'            'off' ...
    'menubar'                'none' ...
    'windowstyle'            'modal' ...
    'visible'                'off' ...
    'createfcn'              ''    ...
    'position'               fp   ...
    'closerequestfcn'        'delete(gcbf)' ...
            };

ad.fromstring=cellstr(liststring);
ad.tostring='';
ad.pos_left=[1:size(ad.fromstring,2)]';
ad.pos_right=[];
ad.value=0;
ad.cmode=cmode;
setappdata(0,'ListDialogAppData',ad)

fig = figure(fig_props{:});

uicontrol('style','frame',...
          'position',[1 1 fp([3 4])])
uicontrol('style','frame',...
          'position',[ffs ffs 2*fus+listsize(1) 2*fus+uh])
uicontrol('style','frame',...
          'position',[ffs+2*fus+50+listsize(1) ffs 2*fus+listsize(1) 2*fus+uh])
uicontrol('style','frame',...
          'position',[ffs ffs+3*fus+uh 2*fus+listsize(1) ...
                    listsize(2)+3*fus+ex*length(promptstring)+(uh+fus)*(smode==2)])
uicontrol('style','frame',...
          'position',[ffs+2*fus+50+listsize(1) ffs+3*fus+uh 2*fus+listsize(1) ...
                    listsize(2)+3*fus+ex*length(promptstring)+(uh+fus)*(smode==2)])

if length(promptstring)>0
    prompt_text = uicontrol('style','text','string',promptstring,...
                            'horizontalalignment','left','units','pixels',...
                            'position',[ffs+fus fp(4)-(ffs+fus+ex*length(promptstring)) ...
                    listsize(1) ex*length(promptstring)]);
end
if length(selectstring)>0
    select_text = uicontrol('style','text','string',selectstring,...
                            'horizontalalignment','left','units','pixels',...
                            'position',[ffs+3*fus+listsize(1)+50 fp(4)-(ffs+fus+ex*length(promptstring)) ...
                    listsize(1) ex*length(selectstring)]);
end

btn_wid = listsize(1);

leftbox = uicontrol('style','listbox',...
                    'position',[ffs+fus ffs+uh+4*fus listsize(1) listsize(2)+25],...
                    'string',ad.fromstring,...
                    'backgroundcolor','w',...
                    'max',2,...
                    'tag','leftbox',...
                    'value',initialvalue, ...
                    'callback',{@doFromboxClick});
         
rightbox = uicontrol('style','listbox',...
                    'position',[ffs+3*fus+listsize(1)+50 ffs+uh+4*fus listsize(1) listsize(2)+25],...
                    'string',ad.tostring,...
                    'backgroundcolor','w',...
                    'max',2,...
                    'tag','rightbox',...
                    'value',[], ...
                    'callback',{@doToboxClick});

ok_btn = uicontrol('style','pushbutton',...
                   'string',okstring,...
                   'position',[ffs+fus ffs+fus btn_wid uh],...
                   'callback',{@doOK});

cancel_btn = uicontrol('style','pushbutton',...
                       'string',cancelstring,...
                       'position',[ffs+3*fus+btn_wid+50 ffs+fus btn_wid uh],...
                       'callback',{@doCancel});

toright_btn = uicontrol('style','pushbutton',...
                       'position',[ffs+2*fus+10+listsize(1) ffs+uh+4*fus+(smode==2)*(fus+uh)+listsize(2)/2-25 30 30],...
                       'cdata',rarrow,...
                       'callback',{@doRight});

toleft_btn = uicontrol('style','pushbutton',...
                       'position',[ffs+2*fus+10+listsize(1) ffs+uh+4*fus+(smode==2)*(fus+uh)+listsize(2)/2+25 30 30],...
                       'cdata',larrow,...
                       'callback',{@doLeft});


try
    set(fig, 'visible','on');
    uiwait(fig);
catch
    if ishandle(fig)
        delete(fig)
    end
end

if isappdata(0,'ListDialogAppData')
    ad = getappdata(0,'ListDialogAppData');
    selection = ad.pos_right;
    value = ad.value;
    rmappdata(0,'ListDialogAppData')
else
    % figure was deleted
    selection = [];
    value = 0;
end

function doOK(varargin)
ad=getappdata(0,'ListDialogAppData');
ad.value = 1;
setappdata(0,'ListDialogAppData',ad)
delete(gcbf);

function doCancel(varargin)
ad.value = 0;
ad.pos_right = [];
setappdata(0,'ListDialogAppData',ad)
delete(gcbf);

function doFromboxClick(varargin)
% if this is a doubleclick, doOK
if strcmp(get(gcbf,'SelectionType'),'open')
    doRight;
end

function doToboxClick(varargin)
% if this is a doubleclick, doOK
if strcmp(get(gcbf,'SelectionType'),'open')
    doLeft;
end

function doRight(varargin)
ad=getappdata(0,'ListDialogAppData');
leftbox=findobj('Tag','leftbox');
rightbox=findobj('Tag','rightbox');
selection=get(leftbox,'Value');
ad.pos_right=[ad.pos_right;ad.pos_left(selection)];
ad.tostring=[ad.tostring ad.fromstring(selection)];
if ad.cmode==1 % remove selected items
    ad.pos_left(selection)=[];
    ad.fromstring(selection)=[];
end
setappdata(0,'ListDialogAppData',ad)
set(leftbox,'String',ad.fromstring,'Value',[]);
set(rightbox,'String',ad.tostring,'Value',[]);

function doLeft(varargin)
ad=getappdata(0,'ListDialogAppData');
leftbox=findobj('Tag','leftbox');
rightbox=findobj('Tag','rightbox');
selection=get(rightbox,'Value');
if ad.cmode==1 % if selected items had been removed
    % Sort in the items from right hand side again
    for i=1:length(selection)
        next_item=min(find(ad.pos_left>ad.pos_right(selection(i))));
        if isempty(next_item)   % Inserting item is last one
            ad.pos_left(end+1)=ad.pos_right(selection(i));
            ad.fromstring(end+1)=ad.tostring(selection(i));
        elseif next_item==ad.pos_left(1)    % Inserting item is first one
            ad.pos_left=[ad.pos_right(selection(i));ad.pos_left];
            ad.fromstring=[ad.tostring(selection(i)) ad.fromstring];
        else                    % Inserting item is anywhere in the middle
            ad.pos_left=[ad.pos_left(1:next_item-1);ad.pos_right(selection(i));ad.pos_left(next_item:end)];
            ad.fromstring=[ad.fromstring(1:next_item-1) ad.tostring(selection(i)) ad.fromstring(next_item:end)];
        end
    end
end
ad.pos_left=ad.pos_left(:);     % Make sure it is a nx1-vector
ad.pos_right(selection)=[];
ad.tostring(selection)=[];
setappdata(0,'ListDialogAppData',ad)
set(leftbox,'String',ad.fromstring,'Value',[]);
set(rightbox,'String',ad.tostring,'Value',[]);

Contact us at files@mathworks.com