JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
0a3f5146b7a91aecf0ea4118aa2657e114392392
[ckeditor.git] / _source / core / focusmanager.js
1 /*\r
2 Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.\r
3 For licensing, see LICENSE.html or http://ckeditor.com/license\r
4 */\r
5 \r
6 /**\r
7  * @fileOverview Defines the {@link CKEDITOR.focusManager} class, which is used\r
8  *              to handle the focus on editor instances..\r
9  */\r
10 \r
11 /**\r
12  * Manages the focus activity in an editor instance. This class is to be used\r
13  * mainly by UI elements coders when adding interface elements to CKEditor.\r
14  * @constructor\r
15  * @param {CKEDITOR.editor} editor The editor instance.\r
16  * @example\r
17  */\r
18 CKEDITOR.focusManager = function( editor )\r
19 {\r
20         if ( editor.focusManager )\r
21                 return editor.focusManager;\r
22 \r
23         /**\r
24          * Indicates that the editor instance has focus.\r
25          * @type Boolean\r
26          * @example\r
27          * alert( CKEDITOR.instances.editor1.focusManager.hasFocus );  // e.g "true"\r
28          */\r
29         this.hasFocus = false;\r
30 \r
31         /**\r
32          * Object used to hold private stuff.\r
33          * @private\r
34          */\r
35         this._ =\r
36         {\r
37                 editor : editor\r
38         };\r
39 \r
40         return this;\r
41 };\r
42 \r
43 CKEDITOR.focusManager.prototype =\r
44 {\r
45         /**\r
46          * Indicates that the editor instance has the focus.\r
47          *\r
48          * This function is not used to set the focus in the editor. Use\r
49          * {@link CKEDITOR.editor#focus} for it instead.\r
50          * @example\r
51          * var editor = CKEDITOR.instances.editor1;\r
52          * <b>editor.focusManager.focus()</b>;\r
53          */\r
54         focus : function()\r
55         {\r
56                 if ( this._.timer )\r
57                         clearTimeout( this._.timer );\r
58 \r
59                 if ( !this.hasFocus )\r
60                 {\r
61                         // If another editor has the current focus, we first "blur" it. In\r
62                         // this way the events happen in a more logical sequence, like:\r
63                         //              "focus 1" > "blur 1" > "focus 2"\r
64                         // ... instead of:\r
65                         //              "focus 1" > "focus 2" > "blur 1"\r
66                         if ( CKEDITOR.currentInstance )\r
67                                 CKEDITOR.currentInstance.focusManager.forceBlur();\r
68 \r
69                         var editor = this._.editor;\r
70 \r
71                         editor.container.getFirst().addClass( 'cke_focus' );\r
72 \r
73                         this.hasFocus = true;\r
74                         editor.fire( 'focus' );\r
75                 }\r
76         },\r
77 \r
78         /**\r
79          * Indicates that the editor instance has lost the focus. Note that this\r
80          * functions acts asynchronously with a delay of 100ms to avoid subsequent\r
81          * blur/focus effects. If you want the "blur" to happen immediately, use\r
82          * the {@link #forceBlur} function instead.\r
83          * @example\r
84          * var editor = CKEDITOR.instances.editor1;\r
85          * <b>editor.focusManager.blur()</b>;\r
86          */\r
87         blur : function()\r
88         {\r
89                 var focusManager = this;\r
90 \r
91                 if ( focusManager._.timer )\r
92                         clearTimeout( focusManager._.timer );\r
93 \r
94                 focusManager._.timer = setTimeout(\r
95                         function()\r
96                         {\r
97                                 delete focusManager._.timer;\r
98                                 focusManager.forceBlur();\r
99                         }\r
100                         , 100 );\r
101         },\r
102 \r
103         /**\r
104          * Indicates that the editor instance has lost the focus. Unlike\r
105          * {@link #blur}, this function is synchronous, marking the instance as\r
106          * "blured" immediately.\r
107          * @example\r
108          * var editor = CKEDITOR.instances.editor1;\r
109          * <b>editor.focusManager.forceBlur()</b>;\r
110          */\r
111         forceBlur : function()\r
112         {\r
113                 if ( this.hasFocus )\r
114                 {\r
115                         var editor = this._.editor;\r
116 \r
117                         editor.container.getFirst().removeClass( 'cke_focus' );\r
118 \r
119                         this.hasFocus = false;\r
120                         editor.fire( 'blur' );\r
121                 }\r
122         }\r
123 };\r