@@ -24,11 +24,41 @@ import {
24
24
OriginConnectionPosition ,
25
25
OVERLAY_PROVIDERS ,
26
26
} from '../core' ;
27
+ import { MdTooltipInvalidPositionError } from './tooltip-errors' ;
27
28
import { Observable } from 'rxjs/Observable' ;
28
29
import { Subject } from 'rxjs/Subject' ;
29
30
30
31
export type TooltipPosition = 'before' | 'after' | 'above' | 'below' ;
31
32
33
+ const TOOLTIP_POSITION_CONFIG : {
34
+ [ key : string ] : {
35
+ origin : OriginConnectionPosition ,
36
+ position : OverlayConnectionPosition ,
37
+ transformOrigin : string
38
+ }
39
+ } = {
40
+ before : {
41
+ origin : { originX : 'start' , originY : 'center' } ,
42
+ position : { overlayX : 'end' , overlayY : 'center' } ,
43
+ transformOrigin : 'right'
44
+ } ,
45
+ after : {
46
+ origin : { originX : 'end' , originY : 'center' } ,
47
+ position : { overlayX : 'start' , overlayY : 'center' } ,
48
+ transformOrigin : 'left'
49
+ } ,
50
+ above : {
51
+ origin : { originX : 'center' , originY : 'top' } ,
52
+ position : { overlayX : 'center' , overlayY : 'bottom' } ,
53
+ transformOrigin : 'bottom'
54
+ } ,
55
+ below : {
56
+ origin : { originX : 'center' , originY : 'bottom' } ,
57
+ position : { overlayX : 'center' , overlayY : 'top' } ,
58
+ transformOrigin : 'top'
59
+ }
60
+ } ;
61
+
32
62
/** Time in ms to delay before changing the tooltip visibility to hidden */
33
63
export const TOUCHEND_HIDE_DELAY = 1500 ;
34
64
@@ -59,6 +89,10 @@ export class MdTooltip {
59
89
}
60
90
61
91
set position ( value : TooltipPosition ) {
92
+ if ( ! TOOLTIP_POSITION_CONFIG . hasOwnProperty ( value ) ) {
93
+ throw new MdTooltipInvalidPositionError ( value , Object . keys ( TOOLTIP_POSITION_CONFIG ) ) ;
94
+ }
95
+
62
96
if ( value !== this . _position ) {
63
97
this . _position = value ;
64
98
@@ -136,8 +170,8 @@ export class MdTooltip {
136
170
137
171
/** Create the overlay config and position strategy */
138
172
private _createOverlay ( ) : void {
139
- let origin = this . _getOrigin ( ) ;
140
- let position = this . _getOverlayPosition ( ) ;
173
+ let origin = TOOLTIP_POSITION_CONFIG [ this . position ] . origin ;
174
+ let position = TOOLTIP_POSITION_CONFIG [ this . position ] . position ;
141
175
let strategy = this . _overlay . position ( ) . connectedTo ( this . _elementRef , origin , position ) ;
142
176
let config = new OverlayState ( ) ;
143
177
config . positionStrategy = strategy ;
@@ -152,26 +186,6 @@ export class MdTooltip {
152
186
this . _tooltipInstance = null ;
153
187
}
154
188
155
- /** Returns the origin position based on the user's position preference */
156
- private _getOrigin ( ) : OriginConnectionPosition {
157
- switch ( this . position ) {
158
- case 'before' : return { originX : 'start' , originY : 'center' } ;
159
- case 'after' : return { originX : 'end' , originY : 'center' } ;
160
- case 'above' : return { originX : 'center' , originY : 'top' } ;
161
- case 'below' : return { originX : 'center' , originY : 'bottom' } ;
162
- }
163
- }
164
-
165
- /** Returns the overlay position based on the user's preference */
166
- private _getOverlayPosition ( ) : OverlayConnectionPosition {
167
- switch ( this . position ) {
168
- case 'before' : return { overlayX : 'end' , overlayY : 'center' } ;
169
- case 'after' : return { overlayX : 'start' , overlayY : 'center' } ;
170
- case 'above' : return { overlayX : 'center' , overlayY : 'bottom' } ;
171
- case 'below' : return { overlayX : 'center' , overlayY : 'top' } ;
172
- }
173
- }
174
-
175
189
/** Updates the tooltip message and repositions the overlay according to the new message length */
176
190
private _setTooltipMessage ( message : string ) {
177
191
// Must wait for the message to be painted to the tooltip so that the overlay can properly
@@ -228,7 +242,7 @@ export class TooltipComponent {
228
242
show ( position : TooltipPosition ) : void {
229
243
this . _closeOnInteraction = false ;
230
244
this . _visibility = 'visible' ;
231
- this . _setTransformOrigin ( position ) ;
245
+ this . _transformOrigin = TOOLTIP_POSITION_CONFIG [ position ] . transformOrigin ;
232
246
233
247
// Cancel the delayed hide if it is scheduled
234
248
if ( this . _hideTimeoutId ) {
@@ -258,16 +272,6 @@ export class TooltipComponent {
258
272
return this . _visibility === 'visible' ;
259
273
}
260
274
261
- /** Sets the tooltip transform origin according to the tooltip position */
262
- _setTransformOrigin ( value : TooltipPosition ) {
263
- switch ( value ) {
264
- case 'before' : this . _transformOrigin = 'right' ; break ;
265
- case 'after' : this . _transformOrigin = 'left' ; break ;
266
- case 'above' : this . _transformOrigin = 'bottom' ; break ;
267
- case 'below' : this . _transformOrigin = 'top' ; break ;
268
- }
269
- }
270
-
271
275
_afterVisibilityAnimation ( e : AnimationTransitionEvent ) : void {
272
276
if ( e . toState === 'hidden' && ! this . isVisible ( ) ) {
273
277
this . _onHide . next ( ) ;
0 commit comments