R-DECO: An open-source Matlab based graphical user interface for the detection and correction of R-peaks 1.0.0

File: <base>/Common/LimitFigSize.m (7,168 bytes)
function Out = LimitFigSize(FigH, Prop, Ext)
% LimitFigSize - Set and get minimum or maximum figure size
% Out = LimitFigSize(FigH, Prop, Ext)
% INPUT:
%   FigH: Handle of a Matlab figure.
%         Optional, default: current figure.
%   Prop: String, command:
%         'min': Set minimum extent.
%         'max': Set maximum extent.
%         'get': Reply a struct with fields MinSize and MaxSize. If not limited,
%                the empty matrix [] is replied.
%         'clear': Clear the min and max limits.
%         Optional, default: 'min'
%   Ext:  [width, height] vector to determing the extent of the inner position
%         in pixels. Optional, default: Current extent.
%
% OUTPUT:
%   Out:  Output for the 'get' command.
%
% EXAMPLES:
%   FigH = figure;
%   LimitFigSize(FigH, 'min', [200, 200])
%   LimitFigSize('max', [400, 400])        % Current figure as default
%   LimitFigSize('min')                    % Current figure, current extent
%   Limit = LimitFigSize(FigH, 'get')
%
% NOTE: This function is based on undocumented functions, such that it might
% fail in future versions.
%
% Tested: Matlab 7.7, 7.8, 7.13, 8.6, WinXP/32, Win7/64
%         Not compatible to Matlab 6.5.
% Author: Jan Simon, Heidelberg, (C) 2012-2015 matlab.2010(a)n(MINUS)simon.de
%
% See also MaximizeFig, AlphaFig, ClipFig, TopFig, ToMonitorFig, WindowAPI.

% $JRev: R-i V:008 Sum:6o/8OiL6gm/Z Date:20-Dec-2015 17:20:36 $
% $License: BSD (use/copy/change/redistribute on own risk, mention the author) $
% $UnitTest: uTest_LimitFigSize $
% $File: Tools\GLGui\LimitFigSize.m $
% History:
% 001: 07-Oct-2012 15:02, First version.
% 005: 02-Nov-2014 02:31, Consider HG2 client.
%      BUGFIX: Replies empty matrix for 'get' if size has not been limited.

% Initialize: ==================================================================
% Global Interface: ------------------------------------------------------------
% Consider dependencies to Matlab versions:
MatlabVer = [100, 1] * sscanf(version, '%d.', 2);
hasHG2    = (MatlabVer >= 804);
hasHG1    = (MatlabVer >= 706);
% hasHG2 = isa(FigH, 'matlab.ui.Figure');
% hasHG2 = ~isnumeric(FigH);

if ~usejava('jvm') || MatlabVer < 700
   % Should this be an error, a warning or a message??
   warning(['JSimon:', mfilename, ':NeedJava'], ...
            '*** %s: Require java and Matlab >= R14.', mfilename);
   return;
end

% Initial values: --------------------------------------------------------------
% Program Interface: -----------------------------------------------------------
% Parse the inputs:
switch nargin
   case 0
      FigH = gcf;
      Prop = 'min';
      Ext  = [];
   case 1
      if numel(FigH) == 1 && ishandle(FigH)  % LimitFigSize(FigH)
         Prop = 'min';
         Ext  = [];
      elseif ischar(FigH)                    % LimitFigSize('string')
         Prop = FigH;
         Ext  = [];
         FigH = GetCurrentFigure(hasHG2);
      else                                   % LimitFigSize([W, H])
         Prop = 'min';
         Ext  = FigH;
         FigH = GetCurrentFigure(hasHG2);
      end
   case 2
      if ischar(FigH)                        % LimitFigSize('string', [W, H])
         Ext  = Prop;
         Prop = FigH;
         FigH = GetCurrentFigure(hasHG2);
      elseif numel(FigH) == 1 && ishandle(FigH)
         if ischar(Prop)                     % LimitFigSize(FigH, 'string')
            Ext  = [];
         else                                % LimitFigSize(FigH, [W, H])
            Ext  = Prop;
            Prop = 'min';
         end
      else
         error(['JSimon:', mfilename, ':BadHandle'], ...
            '*** %s: 1st input is not a figure handle or string.', mfilename);
      end
   case 3
      % Nothing to do
   otherwise
end

% Check if input is a figure handle:
if numel(FigH) ~= 1 || ~ishandle(FigH) || ...     % Short-circuit
      ~strcmpi(get(FigH, 'Type'), 'figure')
   error(['JSimon:', mfilename, ':BadHandle'], ...
          '*** %s: 1st input is not a figure handle.', mfilename);
end

% User Interface: --------------------------------------------------------------
% Do the work: =================================================================
% Get the Java frame:
if hasHG2
   % Suppress warnings:
   bakWarn = warning('off','MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame');
   jFrame  = get(handle(FigH), 'JavaFrame');  % Fails in Matlab < 7.0
   warning(bakWarn);
else
   jFrame = get(handle(FigH), 'JavaFrame');  % Fails in Matlab < 7.0
end

try
   if hasHG2      % HG2 since R2014b:
      jClient = jFrame.fHG2Client;
   elseif hasHG1  % R2008a up to 2014a:
      jClient = jFrame.fHG1Client;
   else           % R14 (7.0) to R2011a:
      jClient = jFrame.fFigureClient;
   end
catch ME          % Getting the client is not documented and subject to changes:
   error(['JSimon:', mfilename, ':NoJClient'], ...
      'Cannot get Java Figure Client: %s', ME.message);
end

% The com.mathworks.hg.peer.FigureFrameProxy is empty, if no DRAWNOW allowed to
% update the figure since its creation:
jWindow = jClient.getWindow;
if isempty(jWindow)
   drawnow;
   pause(0.02);
   jWindow = jClient.getWindow;
end

% Apply, clear or get the limits:
if strncmpi(Prop, 'min', 3)
   Ext = GetExtent(FigH, Ext);
   jWindow.setMinimumSize(java.awt.Dimension(Ext(1), Ext(2)));
elseif strncmpi(Prop, 'max', 3)
   Ext = GetExtent(FigH, Ext);
   jWindow.setMaximumSize(java.awt.Dimension(Ext(1), Ext(2)));
elseif strcmpi(Prop, 'clear')
   jWindow.setMinimumSize([]);
   jWindow.setMaximumSize([]);
elseif strcmpi(Prop, 'get')
   % Get difference to outer limits:
   bakUnits = get(FigH, 'Units');
   set(FigH, 'Units', 'pixels');
   DiffPos = get(FigH, 'OuterPosition') - get(FigH, 'Position');
   set(FigH, 'Units', bakUnits);

   jDim = jWindow.getMinimumSize;
   if isempty(jDim)  % Size has not been limited before:
      Out.MinSize = [];
   else
      Out.MinSize = [jDim.getWidth, jDim.getHeight] - DiffPos(3:4);
   end
   
   jDim = jWindow.getMaximumSize;
   if isempty(jDim)
      Out.MaxSize = [];
   else
      Out.MaxSize = [jDim.getWidth, jDim.getHeight] - DiffPos(3:4);
   end
end

% return;

% ******************************************************************************
function FigH = GetCurrentFigure(hasHG2)
% A DRAWNOW is required when the figure is created to update the Java handle.
% See GCF.

if hasHG2
   FigH = get(groot,'CurrentFigure');
else
   FigH = get(0, 'CurrentFigure');
end

if isempty(FigH)
   FigH = figure;
   drawnow;
end

% return;

% ******************************************************************************
function Ext = GetExtent(FigH, Ext)
% Get or convert extent to outer position.

bakUnits = get(FigH, 'Units');
set(FigH, 'Units', 'pixels');
OuterPos = get(FigH, 'OuterPosition');
if isempty(Ext)
   Ext = OuterPos(3:4);
elseif isnumeric(Ext) && numel(Ext) == 2 && all(Ext >= 0)
   InnerPos = get(FigH, 'Position');
   Ext      = [Ext(1) + OuterPos(3) - InnerPos(3), ...
               Ext(2) + OuterPos(4) - InnerPos(4)];
else
   error(['JSimon:', mfilename, ':BadSize'], ...
          '*** %s: Extent must be a positive [1 x 2] vector.', mfilename);
end
set(FigH, 'Units', bakUnits);

% return;