@@ -26,7 +26,7 @@ function setEvents(value)
2626 persistent events
2727
2828 if isempty(events )
29- events = {} ;
29+ events = cell( 0 , 3 ) ;
3030 end
3131
3232 switch op
@@ -36,62 +36,56 @@ function setEvents(value)
3636 value = events ;
3737 end
3838
39- function value = getHandlers( )
40- % Gets the list of registered callbacks
39+ function funcID = getCallbackID( callback )
40+ % Generates a id for a callback handle function
4141 %
42- % handlerList = eventManager.getHandlers();
43- value = eventManager .handlers(' get' );
42+ % ID = getCallbackID(@disp)
43+ funcID = func2str(callback );
44+ funcDetails = functions(callback );
45+ if strcmp(funcDetails .type , ' anonymous' )
46+ workspace = functions(callback ).workspace{: };
47+ if isfield(workspace , ' obj' ) && isprop(workspace .obj , ' callback' ) && isprop(workspace .obj , ' figureId' )
48+ funcID = sprintf(' Function ''%s'' on figure %d ' , func2str(workspace .obj .callback ), workspace .obj .figureId );
49+ end
50+ end
4451 end
4552
46- function setHandlers(value )
47- % Sets the list of registered callbacks
53+ function callback = validateCallback(callback )
54+ % Validate the given callback and return handle for the
55+ % callback
4856 %
49- % eventManager.setHandlers(handlerList);
50- eventManager .handlers(' set' , value );
51- end
52-
53- function value = handlers(op , newValue )
54- % Helper to store the list of registered callbacks as static variable
55- %
56- % handlerList = eventManager.handlers('get');
57- % eventManager.handlers('set', handlerList);
58- persistent handlers
59-
60- if isempty(handlers )
61- handlers = {};
57+ % callback = validateCallback('disp');
58+ if ~isa(callback , ' function_handle' ) && (~isText(callback ) || isempty(char(callback )))
59+ throw(exceptions .invalidType(' Second value must be function name (text) or handle' ));
6260 end
63-
64- switch op
65- case ' set'
66- handlers = newValue ;
61+
62+ if isText(callback )
63+ callback = str2func(callback );
6764 end
68- value = handlers ;
6965 end
7066
71- function register(eventType , functionName )
67+ function register(eventType , callback )
7268 % Register a callback function for the given eventType. eventType
73- % should be an eventTypes enum and functionName should be name of the
69+ % should be an eventTypes enum and callback should be name or handle of the
7470 % callback function.
7571 %
7672 % eventManager.register(eventTypes.Plot, 'plotRefSLDHelper');
7773 eventType = validateOption(eventType , ' eventTypes' , ' Event type must be an eventTypes enum' ).value;
78-
79- if ~isText(functionName ) || isempty(char(functionName ))
80- throw(exceptions .invalidType(' Second value must be function name (text)' ));
81- end
74+ callback = eventManager .validateCallback(callback );
8275
8376 events = eventManager .getEvents();
84- handlers = eventManager .getHandlers( );
77+ funcID = eventManager .getCallbackID( callback );
8578
86- if isempty(events ) || ~any([events{: }] == eventType )
87- eventManagerInterface(' register' , eventType );
79+ if ~isempty(events )
80+ for i= 1 : size(events , 1 )
81+ if strcmp(events{i , 1 }, funcID ) && events{i , 2 } == eventType
82+ return
83+ end
84+ end
8885 end
8986
90- events{end + 1 } = eventType ;
91- handlers{end + 1 } = functionName ;
92-
93- eventManager .setEvents(events )
94- eventManager .setHandlers(handlers )
87+ events(end + 1 , : ) = {funcID , eventType , callback };
88+ eventManager .setEvents(events );
9589 end
9690
9791 function notify(eventType , data )
@@ -101,28 +95,50 @@ function notify(eventType, data)
10195 %
10296 % eventManager.notify(eventTypes.Message, 'wow');
10397 events = eventManager .getEvents();
104- handlers = eventManager .getHandlers();
105-
10698 eventType = validateOption(eventType , ' eventTypes' , ' Event type must be an eventTypes enum' ).value;
107- for i= 1 : length (events )
108- if ( eventType == events{i })
99+ for i= 1 : size (events , 1 )
100+ if eventType == events{i , 2 }
109101 try
110- funcHandle = str2func(handlers{ i }) ;
102+ funcHandle = events{ i , 3 } ;
111103 funcHandle(data );
112104 catch ME
113- fprintf(' EVENTMANAGER: calling %s function failed on line %d because: \n\n %s\n ' , handlers{ i }, ME .stack(1 ).line, ME .message );
105+ fprintf(' EVENTMANAGER: calling %s function failed on line %d because: \n\n %s\n ' , events{ i , 1 }, ME .stack(1 ).line, ME .message );
114106 end
115107 end
116108 end
117109 end
118110
119- function clear()
120- % Clear all register event callbacks
111+ function unregister(eventType , callback )
112+ % Remove specific event callbacks
113+ %
114+ % eventManager.unregister(eventTypes.Plot, 'plotRefSLDHelper');
115+ eventType = validateOption(eventType , ' eventTypes' , ' Event type must be an eventTypes enum' ).value;
116+ callback = eventManager .validateCallback(callback );
117+ events = eventManager .getEvents();
118+ for i= size(events , 1 ): -1 : 1
119+ if (eventType == events{i , 2 }) && strcmp(eventManager .getCallbackID(callback ), events{i , 1 })
120+ events(i , : ) = [];
121+ end
122+ end
123+ eventManager .setEvents(events );
124+ end
125+
126+ function clear(varargin )
127+ % Clear all register event callbacks or specific types
121128 %
122129 % eventManager.clear();
123- eventManager .setEvents({})
124- eventManager .setHandlers({})
125- eventManagerInterface(' clear' );
130+ % eventManager.clear(eventTypes.Plot);
131+ events = eventManager .getEvents();
132+ if isempty(events )
133+ return
134+ end
135+ if nargin == 0
136+ events = cell(0 , 3 );
137+ else
138+ eventType = validateOption(varargin{1 }, ' eventTypes' , ' Event type must be an eventTypes enum' ).value;
139+ events(eventType ==[events{: , 2 }], : ) = [];
140+ end
141+ eventManager .setEvents(events );
126142 end
127143
128144 end
0 commit comments