1
1
import { Directive , Injectable , Optional , SkipSelf , Renderer , ElementRef } from '@angular/core' ;
2
+ import { Observable } from 'rxjs/Observable' ;
3
+ import { Subject } from 'rxjs/Subject' ;
2
4
3
5
4
6
export type FocusOrigin = 'mouse' | 'keyboard' | 'program' ;
@@ -21,9 +23,11 @@ export class FocusOriginMonitor {
21
23
}
22
24
23
25
/** Register an element to receive focus classes. */
24
- registerElementForFocusClasses ( element : Element , renderer : Renderer ) {
25
- renderer . listen ( element , 'focus' , ( ) => this . _onFocus ( element , renderer ) ) ;
26
- renderer . listen ( element , 'blur' , ( ) => this . _onBlur ( element , renderer ) ) ;
26
+ registerElementForFocusClasses ( element : Element , renderer : Renderer ) : Observable < FocusOrigin > {
27
+ let subject = new Subject < FocusOrigin > ( ) ;
28
+ renderer . listen ( element , 'focus' , ( ) => this . _onFocus ( element , renderer , subject ) ) ;
29
+ renderer . listen ( element , 'blur' , ( ) => this . _onBlur ( element , renderer , subject ) ) ;
30
+ return subject . asObservable ( ) ;
27
31
}
28
32
29
33
/** Focuses the element via the specified focus origin. */
@@ -39,21 +43,23 @@ export class FocusOriginMonitor {
39
43
}
40
44
41
45
/** Handles focus events on a registered element. */
42
- private _onFocus ( element : Element , renderer : Renderer ) {
46
+ private _onFocus ( element : Element , renderer : Renderer , subject : Subject < FocusOrigin > ) {
47
+ this . _origin = this . _origin || 'program' ;
43
48
renderer . setElementClass ( element , 'cdk-focused' , true ) ;
44
49
renderer . setElementClass ( element , 'cdk-keyboard-focused' , this . _origin == 'keyboard' ) ;
45
50
renderer . setElementClass ( element , 'cdk-mouse-focused' , this . _origin == 'mouse' ) ;
46
- renderer . setElementClass ( element , 'cdk-program-focused' ,
47
- ! this . _origin || this . _origin == 'program' ) ;
51
+ renderer . setElementClass ( element , 'cdk-program-focused' , this . _origin == 'program' ) ;
52
+ subject . next ( this . _origin ) ;
48
53
this . _origin = null ;
49
54
}
50
55
51
56
/** Handles blur events on a registered element. */
52
- private _onBlur ( element : Element , renderer : Renderer ) {
57
+ private _onBlur ( element : Element , renderer : Renderer , subject : Subject < FocusOrigin > ) {
53
58
renderer . setElementClass ( element , 'cdk-focused' , false ) ;
54
59
renderer . setElementClass ( element , 'cdk-keyboard-focused' , false ) ;
55
60
renderer . setElementClass ( element , 'cdk-mouse-focused' , false ) ;
56
61
renderer . setElementClass ( element , 'cdk-program-focused' , false ) ;
62
+ subject . next ( null ) ;
57
63
}
58
64
}
59
65
0 commit comments