www.gusucode.com > mbclayouts 工具箱 matlab 源码程序 > mbclayouts/@xregsplitlayout/resizebar.m

    function resizebar(obj)
%RESIZEBAR Divider bar resizing function for splitlayout
%
%   RESIZEBAR(SRCOBJ,EVT,OBJ)

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


ud = obj.datastore.info;
figh = ancestor(get(obj,'Parent'), 'figure');

objud.Manager = MotionManager(figh);
objud.Manager.EnableTree = false;
objud.initpos = get(obj.rsbutton,'Position');
objud.stpos = get(figh,'CurrentPoint');

% limits
sz = get(obj,'Position');
minw = ud.minwidth;
if strcmp(ud.minwidthunits,'normalized')
    if ud.orientation
        minw = minw.*sz(4);
    else
        minw = minw.*sz(3);
    end
end
if (ud.orientation)
    objud.mind = sz(2)-objud.initpos(2)+minw(2);
    objud.maxd = sz(2)+sz(4)-objud.initpos(2)-objud.initpos(4)-minw(1);
else
    objud.mind = sz(1)-objud.initpos(1)+minw(1);
    objud.maxd = sz(1)+sz(3)-objud.initpos(1)-objud.initpos(3)-minw(2);
end
objud.or = ud.orientation;
% create dummy dragging object
objud.dragobj = uicontrol('Style','text',...
    'Parent',get(obj, 'Parent'),...
    'Position',objud.initpos,...
    'BackgroundColor',[.6 .6 .6],...
    'Visible','on');
objud.figure = figh;

bm = xregGui.ButtonUpManager(figh);
bm.getNextEvent({@i_terminate, objud.dragobj, obj});
objud.Manager.MouseMoveFcn = {@i_drag,objud.dragobj, obj};

set(obj.rsbutton,'Value',1);
set(objud.dragobj,'UserData',objud);



function i_drag(srcobj,evt,moveobj, obj)
% update dummy object position
objud = get(moveobj,'UserData');
cp = evt.CurrentPoint;

% work out delta
if objud.or
    delta = cp(2)-objud.stpos(2);
else
    delta = cp(1)-objud.stpos(1);
end

% limit delta
delta = max([delta objud.mind]);
delta = min([delta objud.maxd]);

objpos = objud.initpos;
if objud.or
    objpos(2) = objpos(2)+delta;
else
    objpos(1) = objpos(1)+delta;
end

set(moveobj,'Position',objpos);



function i_terminate(srcobj,evt,moveobj, obj)
% get position, delete drag object, resize pack
objud = get(moveobj,'UserData');
objud.Manager.MouseMoveFcn = '';
figh = objud.figure;

delete(moveobj);

cp = get(figh,'CurrentPoint');
if objud.or
    delta = cp(2)-objud.stpos(2);
else
    delta = cp(1)-objud.stpos(1);
end
if delta
    % limit delta
    delta = max([delta objud.mind]);
    delta = min([delta objud.maxd]);

    % resize packing
    sp = get(obj,'split');
    oldsp = sp;
    sz = get(obj,'Position');

    ud = obj.datastore.info;
    if objud.or
        sp(1) = sp(1)-delta./(sz(4)-ud.divwidth);
        sp(2) = sp(2)+delta./(sz(4)-ud.divwidth);
    else
        sp(1) = sp(1)+delta./(sz(3)-ud.divwidth);
        sp(2) = sp(2)-delta./(sz(3)-ud.divwidth);
    end

    if sp~=oldsp
        ps = get(obj,'boolpackstatus');
        set(obj,'packstatus','on','split',sp);
        if ~ps
            set(obj,'boolpackstatus',false);
        end
    end
end

% undo everything
set(obj.rsbutton,'Value',0);
objud.Manager.EnableTree = true;

% fire callback
if delta
    firecb(obj);
end