Updated
This commit is contained in:
+280
@@ -0,0 +1,280 @@
|
||||
// Copyright 2010 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 button that can access the native clipboard. Calls
|
||||
* out to silverlight when it's possible to do so.
|
||||
*
|
||||
* If the current browser does not support native clipboard access,
|
||||
* throw an error.
|
||||
*
|
||||
* @author nicksantos@google.com (Nick Santos)
|
||||
*/
|
||||
|
||||
goog.provide('goog.silverlight.ClipboardButton');
|
||||
goog.provide('goog.silverlight.ClipboardButtonType');
|
||||
goog.provide('goog.silverlight.ClipboardEvent');
|
||||
goog.provide('goog.silverlight.CopyButton');
|
||||
goog.provide('goog.silverlight.PasteButton');
|
||||
goog.provide('goog.silverlight.PasteButtonEvent');
|
||||
|
||||
goog.require('goog.asserts');
|
||||
goog.require('goog.events.Event');
|
||||
goog.require('goog.math.Size');
|
||||
goog.require('goog.silverlight');
|
||||
goog.require('goog.ui.Component');
|
||||
|
||||
|
||||
/**
|
||||
* A button that can access the native clipboard, via Silverlight.
|
||||
*
|
||||
* If this is not a browser that supports native clipboard access,
|
||||
* throw an error.
|
||||
*
|
||||
* Clients should not instantiate this directly. Instead, use CopyButton
|
||||
* or PasteButton.
|
||||
*
|
||||
* @param {goog.silverlight.ClipboardButtonType} type Copy or Paste.
|
||||
* @param {Function} callback The callback function for copy or paste.
|
||||
* @param {goog.Uri} slResource The URI of ClosureClipboardButton.xap (The
|
||||
* silverlight resource included in this package.)
|
||||
* @param {string} caption Text caption to display as the button's caption.
|
||||
* @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for
|
||||
* document interaction.
|
||||
* @constructor
|
||||
* @extends {goog.ui.Component}
|
||||
*/
|
||||
goog.silverlight.ClipboardButton =
|
||||
function(type, callback, slResource, caption, opt_domHelper) {
|
||||
// In an ideal world, we'd use some sort of transparent overlay over
|
||||
// an HTML-based button. Silverlight doesn't appear to allow this.
|
||||
// Silverlight only allows copy and paste in response to a
|
||||
// silverlight-managed click on a silverlight-rendered button,
|
||||
// and this button cannot be transparent.
|
||||
goog.asserts.assert(
|
||||
goog.silverlight.ClipboardButton.hasClipboardAccess(),
|
||||
'no clipboard access');
|
||||
|
||||
goog.base(this, opt_domHelper);
|
||||
|
||||
/**
|
||||
* The ID of the handler to pass to silverlight.
|
||||
* @type {string}
|
||||
* @private
|
||||
*/
|
||||
this.callbackId_ = goog.asserts.assertString(
|
||||
goog.silverlight.getHandlerName(callback));
|
||||
|
||||
/**
|
||||
* The button caption.
|
||||
* @type {string}
|
||||
* @private
|
||||
*/
|
||||
this.caption_ = caption;
|
||||
|
||||
/**
|
||||
* The compiled silverlight bundle.
|
||||
* @type {goog.Uri}
|
||||
* @private
|
||||
*/
|
||||
this.slResource_ = slResource;
|
||||
|
||||
/**
|
||||
* @type {goog.silverlight.ClipboardButtonType}
|
||||
* @private
|
||||
*/
|
||||
this.type_ = type;
|
||||
|
||||
/**
|
||||
* @type {goog.math.Size}
|
||||
* @private
|
||||
*/
|
||||
this.size_ = goog.silverlight.ClipboardButton.DEFAULT_SIZE_;
|
||||
};
|
||||
goog.inherits(goog.silverlight.ClipboardButton, goog.ui.Component);
|
||||
|
||||
|
||||
/**
|
||||
* The default size of the button.
|
||||
* @type {goog.math.Size}
|
||||
* @private
|
||||
*/
|
||||
goog.silverlight.ClipboardButton.DEFAULT_SIZE_ = new goog.math.Size(100, 30);
|
||||
|
||||
|
||||
/**
|
||||
* Silverlight components need absolute sizing. Should be set before the
|
||||
* component is rendered.
|
||||
* @param {goog.math.Size} size The size of the component.
|
||||
*/
|
||||
goog.silverlight.ClipboardButton.prototype.setSize = function(size) {
|
||||
this.size_ = size;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Creates the button's DOM.
|
||||
* @override
|
||||
*/
|
||||
goog.silverlight.ClipboardButton.prototype.createDom = function() {
|
||||
var dom = this.getDomHelper();
|
||||
var element = dom.createDom('div', goog.getCssName('goog-inline-block'));
|
||||
this.setElementInternal(element);
|
||||
|
||||
var source = this.slResource_.toString();
|
||||
goog.silverlight.createObject(
|
||||
source, element, null,
|
||||
{version: '4.0',
|
||||
width: this.size_.width, height: this.size_.height}, null,
|
||||
['buttonType=' + this.type_,
|
||||
'callbackName=' + this.callbackId_,
|
||||
'Content=' + this.caption_].join(','));
|
||||
};
|
||||
|
||||
|
||||
/** @return {boolean} If clipboard access is supported. */
|
||||
goog.silverlight.ClipboardButton.hasClipboardAccess = function() {
|
||||
// TODO(nicksantos): Use IE execCommand if available.
|
||||
return goog.silverlight.isInstalled('4.0');
|
||||
};
|
||||
|
||||
|
||||
/** @inheritDoc */
|
||||
goog.silverlight.ClipboardButton.prototype.disposeInternal = function() {
|
||||
goog.silverlight.disposeHandlerName(this.callbackId_);
|
||||
goog.base(this, 'disposeInternal');
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Whether the button should trigger a copy or a paste.
|
||||
* @enum
|
||||
* @private
|
||||
*/
|
||||
goog.silverlight.ClipboardButtonType = {
|
||||
COPY: 1,
|
||||
PASTE: 2
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* A clipboard button event. By design, replicates IE's clipboard API.
|
||||
* @param {string} type The event type.
|
||||
* @param {string=} opt_data The data pasted, if this is a paste event.
|
||||
* @constructor
|
||||
* @extends {goog.events.Event}
|
||||
*/
|
||||
goog.silverlight.ClipboardEvent = function(type, opt_data) {
|
||||
goog.base(this, type);
|
||||
|
||||
/**
|
||||
* @type {?string}
|
||||
* @private
|
||||
*/
|
||||
this.data_ = opt_data || null;
|
||||
};
|
||||
goog.inherits(goog.silverlight.ClipboardEvent, goog.events.Event);
|
||||
|
||||
|
||||
/** @return {?string} Data pasted from the clipboard. */
|
||||
goog.silverlight.ClipboardEvent.prototype.getData = function() {
|
||||
return this.data_;
|
||||
};
|
||||
|
||||
|
||||
/** @param {string} data Data to put on the clipboard. */
|
||||
goog.silverlight.ClipboardEvent.prototype.setData = function(data) {
|
||||
this.data_ = data;
|
||||
};
|
||||
|
||||
|
||||
/** @enum {string} */
|
||||
goog.silverlight.ClipboardEventType = {
|
||||
COPY: 'copy',
|
||||
PASTE: 'paste'
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* A button that can retrieve contents from the native clipboard.
|
||||
*
|
||||
* @param {goog.Uri} slResource The URI of ClosureClipboardButton.xap (the
|
||||
* silverlight resource included in this package.
|
||||
* @param {string=} opt_caption Text caption to display as the button's caption.
|
||||
* Defaults to 'Paste'.
|
||||
* @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for
|
||||
* document interaction.
|
||||
* @constructor
|
||||
* @extends {goog.silverlight.ClipboardButton}
|
||||
*/
|
||||
goog.silverlight.PasteButton =
|
||||
function(slResource, opt_caption, opt_domHelper) {
|
||||
/** @desc Label for the paste button */
|
||||
var MSG_DEFAULT_PASTE_BUTTON_CAPTION = goog.getMsg('Paste');
|
||||
var caption = opt_caption || MSG_DEFAULT_PASTE_BUTTON_CAPTION;
|
||||
|
||||
goog.base(this,
|
||||
goog.silverlight.ClipboardButtonType.PASTE,
|
||||
goog.bind(this.handlePaste_, this),
|
||||
slResource,
|
||||
caption,
|
||||
opt_domHelper);
|
||||
};
|
||||
goog.inherits(goog.silverlight.PasteButton, goog.silverlight.ClipboardButton);
|
||||
|
||||
|
||||
/** @param {string} content The native content that was pasted. */
|
||||
goog.silverlight.PasteButton.prototype.handlePaste_ = function(content) {
|
||||
this.dispatchEvent(
|
||||
new goog.silverlight.ClipboardEvent(
|
||||
goog.silverlight.ClipboardEventType.PASTE,
|
||||
content));
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* A button that can copy contents.
|
||||
*
|
||||
* @param {goog.Uri} slResource The URI of ClosureClipboardButton.xap (the
|
||||
* silverlight resource included in this package.
|
||||
* @param {string=} opt_caption Text caption to display as the button's caption.
|
||||
* Defaults to 'Copy'.
|
||||
* @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for
|
||||
* document interaction.
|
||||
* @constructor
|
||||
* @extends {goog.silverlight.ClipboardButton}
|
||||
*/
|
||||
goog.silverlight.CopyButton =
|
||||
function(slResource, opt_caption, opt_domHelper) {
|
||||
/** @desc Label for the copy button */
|
||||
var MSG_DEFAULT_COPY_BUTTON_CAPTION = goog.getMsg('Copy');
|
||||
var caption = opt_caption || MSG_DEFAULT_COPY_BUTTON_CAPTION;
|
||||
|
||||
goog.base(this,
|
||||
goog.silverlight.ClipboardButtonType.COPY,
|
||||
goog.bind(this.handleCopy_, this),
|
||||
slResource,
|
||||
caption,
|
||||
opt_domHelper);
|
||||
};
|
||||
goog.inherits(goog.silverlight.CopyButton, goog.silverlight.ClipboardButton);
|
||||
|
||||
|
||||
/** @return {string} The content to be copied to the clipboard. */
|
||||
goog.silverlight.CopyButton.prototype.handleCopy_ = function() {
|
||||
var event = new goog.silverlight.ClipboardEvent(
|
||||
goog.silverlight.ClipboardEventType.COPY);
|
||||
this.dispatchEvent(event);
|
||||
return event.getData() || '';
|
||||
};
|
||||
Reference in New Issue
Block a user