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

    function List = dragcallback(obj)
%DRAGCALLBACK  Dynamic split callbacks
%
%   DRAGCALLBACK(OBJ) constructs the listeners that implement dragging and
%   returns them in a structure.

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


DragData = xregGui.RunTimePointer;
P = obj.DragBar.Peer;
List = struct(...
    'Snap', handle.listener(P, 'Snap', {@i_Snap, obj}), ...
    'DragStart', handle.listener(P, 'DragStarted', {@i_DragStart, obj, DragData}), ...
    'Drag', handle.listener(P, 'Drag', {@i_Drag, obj, DragData}), ...
    'DragStop', handle.listener(P, 'DragStopped', {@i_DragStop, obj, DragData}));




function i_Snap(src, evt, obj)
snapDirection = char(evt.JavaEvent.getDirection.toString);
ud=get(obj.xregcontainer,'UserData');
switch ud.state
    case 1
        S.TO_A = 'left';  % Stay at left
        S.TO_B = 'center'; % Move to center
        
    case 2
        S.TO_A = 'center';  % Move to center
        S.TO_B = 'right'; % Stay at right
        
    case 0
        S.TO_A = 'left'; % Move to left
        S.TO_B = 'right'; % Move to right
        
end
i_ChangeState(obj, 'state', S.(snapDirection));



function i_DragStart(src,evt, obj, DragData)

dragud.parent = get(obj.DragBar, 'Parent');
dragud.barPosition = get(obj.DragBar, 'Position');
PR = xregGui.PointerRepository;

minw = get(obj, 'minwidth');

switch get(obj, 'Orientation')
    case 'lr'
        dragud.ptrID = PR.stackSetPointer(dragud.parent,'lrdrag');
        dragud.positionIndex = [1 3];
    case 'ud'
        dragud.ptrID = PR.stackSetPointer(dragud.parent,'uddrag');
        dragud.positionIndex = [2 4];
        % minimum sizes need to be flipped for vertitcal as the top is
        % first and measurements are at bottom.
        minw = minw([2 1]);
end
dragud.barSize = dragud.barPosition(dragud.positionIndex(2));

% Work out the drag limits - how far the user is allowed to move the bar
% before it stops.
objectPosition = get(obj,'innerposition');
dragud.minDragDelta = objectPosition(dragud.positionIndex(1)) + minw(1) ...
    - dragud.barPosition(dragud.positionIndex(1));
dragud.maxDragDelta = objectPosition(dragud.positionIndex(1)) ...
    + objectPosition(dragud.positionIndex(2)) ...
    - dragud.barPosition(dragud.positionIndex(1)) ...
    - minw(2) - get(obj, 'barwidth');

SC = xregGui.SystemColorsDbl;
dragud.dragObject = uicontrol('Style','text',...
    'Parent',dragud.parent,...
    'Position',dragud.barPosition,...
    'BackgroundColor',SC.CTRL_SHADOW,...
    'HitTest', 'off', ...
    'Enable', 'inactive', ...
    'Visible','on');

DragData.info = dragud;



function i_Drag(src, evt, obj, DragData)
dragud = DragData.info;

dragDelta = i_GetDragDelta(evt, dragud);

pos = dragud.barPosition;
pos(dragud.positionIndex(1)) = pos(dragud.positionIndex(1)) + dragDelta;
set(dragud.dragObject, 'Position', pos); 



function i_DragStop(src, evt, obj, DragData)
dragud = DragData.info;
delete(dragud.dragObject);
PR = xregGui.PointerRepository;
PR.stackRemovePointer(dragud.parent, dragud.ptrID);
DragData.info = [];

dragDelta = i_GetDragDelta(evt, dragud);

% Width of "A" side in pixels
objectPosition = get(obj,'innerposition');
Awidth = dragud.barPosition(dragud.positionIndex(1)) ...
    + dragDelta ...
    - objectPosition(dragud.positionIndex(1));

% Split that this width corresponds to
split = Awidth/(objectPosition(dragud.positionIndex(2))-dragud.barPosition(dragud.positionIndex(2)));
if dragud.positionIndex(1)==1
    newSplit = [split 1-split];
else
    newSplit = [1-split split];
end

oldSplit = get(obj, 'split');
if ~all(oldSplit==newSplit)
    ud = get(obj.xregcontainer, 'UserData');
    if newSplit(1)==0 && (ud.behaviour==0 || ud.behaviour==1)
        i_ChangeState(obj, 'state', 'left');
    elseif newSplit(1)==1 && (ud.behaviour==2 || ud.behaviour==1)
        i_ChangeState(obj, 'state', 'right');
    else
        i_ChangeState(obj, 'split', newSplit, 'state', 'center');
    end
end



function delta = i_GetDragDelta(evt, dragud)
delta = mbcgui.util.unScaleSizeForDPI(evt.JavaEvent.getDragOffset);
if dragud.positionIndex(1)==2
    % Vertical coordinate is in opposite direction to java.
    delta = -delta;
end
delta = min(delta, dragud.maxDragDelta);
delta = max(delta, dragud.minDragDelta);


function i_ChangeState(obj, varargin)
ps = getBoolPackstatus(obj);
set(obj,'packstatus','on', varargin{:});
if ~ps
    set(obj,'packstatus','off');
end
firecb(obj);