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