www.gusucode.com > mbcguitools 工具箱 matlab 源码程序 > mbcguitools/@xregtable/get.m

    function out=get(hnd,varargin)
%TABLE/GET   Get interface for table object
%   GET(TBL,'Property') returns the value of the table Property
%   (or values, if Property is a cell array).  Execute get(TBL) to
%   see a full list of available properties.

%  Copyright 2000-2011 The MathWorks, Inc. and Ford Global Technologies, Inc.




%   
% Bail if we've not been given a table
if ~isa(hnd,'xregtable')
   error(message('mbc:xregtable:InvalidObject'))
end
out=[];
% Want to handle different 'subobjects' nicely, eg frame properties
% so parse the input first to look for 'x.y' inputs
global fud
fud=get(hnd.frame.handle,'UserData');
% Clear the data from frame: if we hold it then we end up with two copies
% which slows things down dramatically!

try
   % Try construct to prevent the table from being wrecked by an erroneous call
   if isempty(varargin)
      dispprops(hnd);
      return
   else
      set(hnd.frame.handle,'UserData',[]);
      inp=varargin{1};
   end
   
   % Loop over input selections
   rowsel=fud.cells.rowselection;
   colsel=fud.cells.colselection;
   k=size(rowsel,1);
   for j=1:k
      fud.cells.rowselection=[rowsel(j,1) rowsel(j,2)];
      fud.cells.colselection=[colsel(j,1) colsel(j,2)];
      pos=strfind(inp,'.');
      if isempty(pos)
         % If there's no x then set to 'toplevel'
         switch lower(inp)
         case {'number', 'numbers', 'value', 'values', 'type', 'format', 'string'}
            section='cells';
         otherwise
            section='toplevel';
         end
         property=inp;
      else
         section=inp(1:pos-1);
         property=inp(pos+1:end);
      end
      
      switch lower(section)
      case 'toplevel'
         outtmp=gettoplevel(hnd,property);  
      case 'frame'
         outtmp=getframes(hnd,property);
      case 'vslider'
         outtmp=getvslider(hnd,property);
      case 'hslider'
         outtmp=gethslider(hnd,property);
      case 'rows'
         outtmp=getrows(hnd,property);
      case 'cols'
         outtmp=getcols(hnd,property);
      case 'cells'
         outtmp=getcells(hnd,property);
      case 'filters'
         outtmp=getfilters(hnd,property);
      otherwise
         error(message('mbc:xregtable:InvalidPropertyName', section));
      end
      
      % Plug outtmp into out matrix
      
      % Need to be careful we only do this if indexing has bee used, ie on output from getcells
      % Do this by leaving alone if there's only one row in the rowselection
      if length(rowsel(:))>2
         out(rowsel(j,1):rowsel(j,2),colsel(j,1):colsel(j,2))=outtmp;
      else
         out=outtmp;
      end
      
   end
   
   
   
   
   % change back to default selection (all)
   fud.cells.rowselection=[fud.zeroindex(1) fud.rows.number];
   fud.cells.colselection=[fud.zeroindex(2) fud.cols.number];
   set(fud.frame.handle,'UserData',fud);
catch ME
   set(fud.frame.handle,'UserData',fud);
   clear global fud;
   rethrow(ME);
end
clear global fud;
return





%-----------------------------------------------------------------------
%-----------------------------------------------------------------------
% Functions to get properties within each section
%-----------------------------------------------------------------------
%-----------------------------------------------------------------------

%============================================================
% Top level properties
%============================================================

function out=gettoplevel(hnd,property)
global fud
switch lower(property)
    % all easy settings to get
    case 'parent'
        out=hnd.parent;
    case 'panel'
        out=hnd.panel;
    case 'position'
        % get position in pixels
        out=get(fud.panel,'Position');
        % convert to normalised if necessary
        if strcmp(fud.units,'normalised');
            un=get(hnd.panel,'Units');
            set(hnd.panel,'Units','pixels');
            figsize=get(hnd.panel,'Position');
            set(hnd.panel,'Units',un);
            figsize(1:2)=figsize(3:4);
            out=out./figsize;
        end
    case 'units'
        out=fud.units;
    case 'visible'
        out=fud.visible;
    case 'defaultcelltype'
        out=fud.defaultcelltype;
        out=invcodetype(out);
    case 'defaultcellformat'
        out=fud.defaultcellformat;
    case 'zeroindex'
        out=fud.zeroindex;
    case 'showzeros'
        % No direct field.  Reflects a certain setting of filters
        if strcmp(fud.filters.type,'eq') && fud.filters.value==0 && fud.filters.tol==0
            out='off';
        else
            out='on';
        end
    case 'redrawmode'
        if fud.redrawmode==0
            out='basic';
        elseif fud.redrawmode==1
            out='normal';
        else
            out='invalid setting';
        end
    case 'colormap'
        out=fud.colormap;
    case 'colorintervals'
        out=fud.colorintervals;
    case 'usecolors'
        out=fud.usecolors;
    case 'userdata'
        out=fud.userdata;
    case 'diagscroll'
        out=get(fud.dslider.handle,'Value');
        if out
            out='on';
        else
            out='off';
        end
    case 'toosmall'
        out=istoosmall(hnd,1);
    case 'bghandle'
        % another unpublished one: return handle to background axes
        out=hnd.frame.handle;
    case 'sliders'
        opts={'off','on'};
        out=opts{fud.sliders+1};
    case 'cellchangecallback'
        out=fud.cellchangecb;
        
        % methods called here.  Need a way of blocking output for this if possible
    case 'clear'
        % method for clearing out table completely.  Use external function for this one.
        clear(hnd,1);
        out = hnd;
    case 'redraw'
        % Need to expand selection out to cover fixed cells first
        fud.cells.rowselection=[1 fud.rows.number];
        fud.cells.colselection=[1 fud.cols.number];
        hnd=redraw(hnd,[1 1 1 1 1 1 1 1 1 1],1);
        out=hnd;
    case 'delete'
        delete(hnd,1);
        fud.frame.handle=[];
        out=hnd;
    otherwise
        error(message('mbc:xregtable:InvalidPropertyName', property));
end

return


%============================================================
% Frame properties
%============================================================

function out=getframes(hnd,property)
global fud
switch lower(property)
case 'visible'
	out=fud.frame.visible;
case 'hborder'
   out=fud.frame.hborder;
case 'vborder'
   out=fud.frame.vborder;
case 'position'
   % Prevents user from accessing position property below
   error(message('mbc:xregtable:InvalidPropertyName2'));
case {'backgroundcolor','color'}
   out=get(fud.frame.handle,'Color');
case 'boxcolor'
   out=fud.frame.boxcolor;
case 'box'
   out=get(fud.frame.handle,'Box');
otherwise
   % pass property onto frame object
   % might want to alter this to make the background axis properties look like a frame
   out=get(fud.frame.handle,property);
end

return


%============================================================
% Vslider properties
%============================================================

function out=getvslider(hnd,property)
global fud
switch lower(property)
case 'visible'
   out=fud.vslider.visible;
case 'width'
	out=fud.vslider.width;   
case 'position'
	% This isn't a external property
   error(message('mbc:xregtable:InvalidPropertyName3'));
case 'value'
   slud=get(fud.vslider.handle,'UserData');
   slval=get(fud.vslider.handle,'Value');
   slval=-slval';
   if isempty(slud.steps)
      slud.steps=[fud.rows.fixed+1 fud.rows.number];
   end
   rowval=slud.steps(slval,1);
   out=rowval-fud.zeroindex(1)+1;
case 'offset'
   out=fud.vslider.offset;
otherwise
   % pass property and value onto slider object
   out=get(fud.vslider.handle,property);
end

return

%============================================================
% Hslider properties
%============================================================

function out=gethslider(hnd,property)
global fud
switch lower(property)
case 'visible'
   out=fud.hslider.visible;
case 'width'
   out=fud.hslider.width;   
case 'position'
   % This isn't a external property
   error(message('mbc:xregtable:InvalidPropertyName4'));
case 'value'
   slud=get(fud.hslider.handle,'UserData');
   slval=get(fud.hslider.handle,'Value');
   if isempty(slud.steps)
      slud.steps=[fud.cols.fixed+1 fud.cols.number];
   end
   colval=slud.steps(slval,1);
   out=colval-fud.zeroindex(2)+1;
case 'offset'
   out=fud.hslider.offset;
otherwise
   % pass property and value onto slider object
   out=get(fud.hslider.handle,property);
end

return

%============================================================
% Rows properties
%============================================================

function out=getrows(hnd,property)
global fud

switch lower(property)
case 'number'
   out=fud.rows.number;
case 'size'
   out=fud.rows.size;
case 'fixed'
   out=fud.rows.fixed;
case 'spacing'
   out=fud.rows.spacing;
case 'onscreen'
   % return total number of rows fittable in current table config
   out=size(fud.cells.shandles,1)+size(fud.cells.ftophandles,1);
case 'autosize'
   opts={'none','minsize','fixed'};
   out=opts(fud.rows.autosize+1);
case 'autosizenumber'
   out=fud.rows.autosizenumber;
otherwise
   error(message('mbc:xregtable:InvalidPropertyName5', property));  
end

return



%============================================================
% Cols properties
%============================================================

function out=getcols(hnd,property)
global fud

switch lower(property)
case 'number'
   out=fud.cols.number;
case 'size'
   out=fud.cols.size;
case 'fixed'
   out=fud.cols.fixed;
case 'spacing'
   out=fud.cols.spacing;
case 'onscreen'
   % return total number of cols fittable in current table config
   out=size(fud.cells.shandles,2)+size(fud.cells.flefthandles,2);
case 'autosize'
   opts={'none','minsize','fixed'};
   out=opts(fud.cols.autosize+1);
case 'autosizenumber'
   out=fud.cols.autosizenumber;
otherwise
   error(message('mbc:xregtable:InvalidPropertyName6', property));  
end

return


%============================================================
% Cells properties
%============================================================

function out=getcells(hnd,property)
global fud

% For getting properties, need to make sure colselection and rowselection
% don't go outside the range of the current cells.

if fud.cells.colselection(2)>fud.cols.number || fud.cells.rowselection(2)>fud.rows.number
   error(message('mbc:xregtable:InvalidIndex1'));
end

switch lower(property)
case 'positions'
   error(message('mbc:xregtable:InvalidPropertyName7'));
case 'type'
   tp=fud.cells.ctype(fud.cells.rowselection(1):fud.cells.rowselection(2),...
      fud.cells.colselection(1):fud.cells.colselection(2)); 
   out=invcodetype(tp);
   
case {'number', 'value', 'numbers', 'values'}
   out=fud.cells.value(fud.cells.rowselection(1):fud.cells.rowselection(2),...
      fud.cells.colselection(1):fud.cells.colselection(2));
case 'string'
   strcell=fud.cells.string(fud.cells.rowselection(1):fud.cells.rowselection(2),...
      fud.cells.colselection(1):fud.cells.colselection(2));
   if length(strcell)==1
      out=strcell{1};
   else
      out=strcell;
   end
case 'visible'
   % need to get visible matrix, then convert to on's and off's
   out=fud.cells.visible(fud.cells.rowselection(1):fud.cells.rowselection(2),...
      fud.cells.colselection(1):fud.cells.colselection(2));
case 'format'
   fmtcell=fud.cells.format(fud.cells.rowselection(1):fud.cells.rowselection(2),...
      fud.cells.colselection(1):fud.cells.colselection(2));
   if length(fmtcell)==1
      out=fmtcell{1};
   else
      out=fmtcell;
   end
case 'rowselection'
   out=fud.cells.rowselection;
case 'colselection'
   out=fud.cells.colselection;
case 'position'
   error(message('mbc:xregtable:InvalidPropertyName8'));
   
   
   % Cell methods called here
case 'delete'
   % Need to trash arrays and delete objects if its in a fixed array
   % First get any fixed handles
   % create matrix indicating where selection is
   sel=false(fud.rows.number,fud.cols.number);
   sel(fud.cells.rowselection(1):fud.cells.rowselection(2),...
      fud.cells.colselection(1):fud.cells.colselection(2))=true;
   hndls1=fud.cells.fcornerhandles(sel(1:fud.rows.fixed,1:fud.cols.fixed));
   hndls2=fud.cells.ftophandles(sel(1:fud.rows.fixed,fud.cols.fixed+1:end));
   hndls3=fud.cells.flefthandles(sel(fud.rows.fixed+1:end,1:fud.cols.fixed));
   hndls=[hndls1(:);hndls2(:);hndls3(:)];
   hndls=hndls(hndls~=0);
   delete(hndls(:));
   
   % need to delete dead handles to ensure table works ok...
   fud.cells.fcornerhandles(sel(1:fud.rows.fixed,1:fud.cols.fixed))=0;
   fud.cells.ftophandles(sel(1:fud.rows.fixed,fud.cols.fixed+1:end))=0;
   fud.cells.flefthandles(sel(fud.rows.fixed+1:end,1:fud.cols.fixed))=0;
   
   % Now remove information in other matrices
   fud.cells.exist(fud.cells.rowselection(1):fud.cells.rowselection(2),...
      fud.cells.colselection(1):fud.cells.colselection(2))=false;
   fud.cells.visible(fud.cells.rowselection(1):fud.cells.rowselection(2),...
      fud.cells.colselection(1):fud.cells.colselection(2))={[]};
   fud.cells.type(fud.cells.rowselection(1):fud.cells.rowselection(2),...
      fud.cells.colselection(1):fud.cells.colselection(2))=0;
   fud.cells.value(fud.cells.rowselection(1):fud.cells.rowselection(2),...
      fud.cells.colselection(1):fud.cells.colselection(2))=NaN;
   fud.cells.string(fud.cells.rowselection(1):fud.cells.rowselection(2),...
      fud.cells.colselection(1):fud.cells.colselection(2))={''};
   fud.cells.userprops(fud.cells.rowselection(1):fud.cells.rowselection(2),...
      fud.cells.colselection(1):fud.cells.colselection(2))=false;
   fud.cells.uiprops(fud.cells.rowselection(1):fud.cells.rowselection(2),...
      fud.cells.colselection(1):fud.cells.colselection(2))={[]};
   fud.cells.format(fud.cells.rowselection(1):fud.cells.rowselection(2),...
      fud.cells.colselection(1):fud.cells.colselection(2))={[]};
   
   % Now do a redraw to reflect information changes
   
   % Honor redrawmode setting:
   if ~fud.redrawmode
      hnd=redraw(hnd,[1 1 0 0 0 0 0 0 0 0],1);
   else
      hnd=redraw(hnd,[1 1 0 0 1 0 1 0 0 0],1);   
   end
   out='TBL_METHODCALL';
  
otherwise
   % pass on call to indexed cells
   %out=get([fud.cells.handles{fud.cells.rowselection(1):fud.cells.rowselection(2),...
   %fud.cells.colselection(1):fud.cells.colselection(2)}],property);
   error(message('mbc:xregtable:InvalidPropertyName9'));
   
end
return


%============================================================
% Filters properties
%============================================================

function out=getfilters(hnd,property)
global fud

switch(lower(property))
case 'type'
   out=fud.filters.type;     
case 'value'
   out=fud.filters.value;   
case 'tolerance'
   out=fud.filters.tol;
otherwise
   error(message('mbc:xregtable:InvalidPropertyName10', property));
end

return