// Copyright 2008 The Closure Library Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS-IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /** * @fileoverview A plugin that fills the field with lorem ipsum text when it's * empty and does not have the focus. Applies to both editable and uneditable * fields. * */ goog.provide('goog.editor.plugins.LoremIpsum'); goog.require('goog.asserts'); goog.require('goog.dom'); goog.require('goog.editor.Command'); goog.require('goog.editor.Plugin'); goog.require('goog.editor.node'); goog.require('goog.functions'); /** * A plugin that manages lorem ipsum state of editable fields. * @param {string} message The lorem ipsum message. * @constructor * @extends {goog.editor.Plugin} */ goog.editor.plugins.LoremIpsum = function(message) { goog.editor.Plugin.call(this); /** * The lorem ipsum message. * @type {string} * @private */ this.message_ = message; }; goog.inherits(goog.editor.plugins.LoremIpsum, goog.editor.Plugin); /** @override */ goog.editor.plugins.LoremIpsum.prototype.getTrogClassId = goog.functions.constant('LoremIpsum'); /** @override */ goog.editor.plugins.LoremIpsum.prototype.activeOnUneditableFields = goog.functions.TRUE; /** * Whether the field is currently filled with lorem ipsum text. * @type {boolean} * @private */ goog.editor.plugins.LoremIpsum.prototype.usingLorem_ = false; /** * Handles queryCommandValue. * @param {string} command The command to query. * @return {boolean} The result. * @override */ goog.editor.plugins.LoremIpsum.prototype.queryCommandValue = function(command) { return command == goog.editor.Command.USING_LOREM && this.usingLorem_; }; /** * Handles execCommand. * @param {string} command The command to execute. * Should be CLEAR_LOREM or UPDATE_LOREM. * @param {*=} opt_placeCursor Whether to place the cursor in the field * after clearing lorem. Should be a boolean. * @override */ goog.editor.plugins.LoremIpsum.prototype.execCommand = function(command, opt_placeCursor) { if (command == goog.editor.Command.CLEAR_LOREM) { this.clearLorem_(!!opt_placeCursor); } else if (command == goog.editor.Command.UPDATE_LOREM) { this.updateLorem_(); } }; /** @override */ goog.editor.plugins.LoremIpsum.prototype.isSupportedCommand = function(command) { return command == goog.editor.Command.CLEAR_LOREM || command == goog.editor.Command.UPDATE_LOREM || command == goog.editor.Command.USING_LOREM; }; /** * Set the lorem ipsum text in a goog.editor.Field if needed. * @private */ goog.editor.plugins.LoremIpsum.prototype.updateLorem_ = function() { // Try to apply lorem ipsum if: // 1) We have lorem ipsum text // 2) There's not a dialog open, as that screws // with the dialog's ability to properly restore the selection // on dialog close (since the DOM nodes would get clobbered in FF) // 3) We're not using lorem already // 4) The field is not currently active (doesn't have focus). var fieldObj = this.getFieldObject(); if (!this.usingLorem_ && !fieldObj.inModalMode() && goog.editor.Field.getActiveFieldId() != fieldObj.id) { var field = fieldObj.getElement(); if (!field) { // Fallback on the original element. This is needed by // fields managed by click-to-edit. field = fieldObj.getOriginalElement(); } goog.asserts.assert(field); if (goog.editor.node.isEmpty(field)) { this.usingLorem_ = true; // Save the old font style so it can be restored when we // clear the lorem ipsum style. this.oldFontStyle_ = field.style.fontStyle; field.style.fontStyle = 'italic'; fieldObj.setHtml(true, this.message_, true); } } }; /** * Clear an EditableField's lorem ipsum and put in initial text if needed. * * If using click-to-edit mode (where Trogedit manages whether the field * is editable), this works for both editable and uneditable fields. * * TODO(user): Is this really necessary? See TODO below. * @param {boolean=} opt_placeCursor Whether to place the cursor in the field * after clearing lorem. * @private */ goog.editor.plugins.LoremIpsum.prototype.clearLorem_ = function( opt_placeCursor) { // Don't mess with lorem state when a dialog is open as that screws // with the dialog's ability to properly restore the selection // on dialog close (since the DOM nodes would get clobbered) var fieldObj = this.getFieldObject(); if (this.usingLorem_ && !fieldObj.inModalMode()) { var field = fieldObj.getElement(); if (!field) { // Fallback on the original element. This is needed by // fields managed by click-to-edit. field = fieldObj.getOriginalElement(); } goog.asserts.assert(field); this.usingLorem_ = false; field.style.fontStyle = this.oldFontStyle_; fieldObj.setHtml(true, null, true); // TODO(nicksantos): I'm pretty sure that this is a hack, but talk to // Julie about why this is necessary and what to do with it. Really, // we need to figure out where it's necessary and remove it where it's // not. Safari never places the cursor on its own willpower. if (opt_placeCursor && fieldObj.isLoaded()) { if (goog.userAgent.WEBKIT) { goog.dom.getOwnerDocument(fieldObj.getElement()).body.focus(); fieldObj.focusAndPlaceCursorAtStart(); } else if (goog.userAgent.OPERA) { fieldObj.placeCursorAtStart(); } } } };