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);