123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- /**
- * Copyright (C) 2012-2013 KO GmbH <copyright@kogmbh.com>
- *
- * @licstart
- * This file is part of WebODF.
- *
- * WebODF is free software: you can redistribute it and/or modify it
- * under the terms of the GNU Affero General Public License (GNU AGPL)
- * as published by the Free Software Foundation, either version 3 of
- * the License, or (at your option) any later version.
- *
- * WebODF is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with WebODF. If not, see <http://www.gnu.org/licenses/>.
- * @licend
- *
- * @source: http://www.webodf.org/
- * @source: https://github.com/kogmbh/WebODF/
- */
- /*global define, require, document, Image, FileReader, window, runtime, ops, gui */
- define("webodf/editor/widgets/imageInserter", [
- "dijit/form/Button",
- "webodf/editor/EditorSession"],
- function (Button, EditorSession) {
- "use strict";
- var ImageInserter = function (callback) {
- var self = this,
- widget = {},
- insertImageButton,
- editorSession,
- fileLoader,
- textController,
- imageController;
- /**
- *
- * @param {!string} mimetype
- * @param {!string} content base64 encoded string
- * @param {!number} width
- * @param {!number} height
- */
- function insertImage(mimetype, content, width, height) {
- textController.removeCurrentSelection();
- imageController.insertImage(mimetype, content, width, height);
- }
- /**
- * @param {!string} content as datauri
- * @param {!string} mimetype
- * @return {undefined}
- */
- function insertImageOnceLoaded(mimetype, content) {
- var hiddenImage = new Image();
- hiddenImage.style.position = "absolute";
- hiddenImage.style.left = "-99999px";
- document.body.appendChild(hiddenImage);
- hiddenImage.onload = function () {
- // remove the data:image/jpg;base64, bit
- content = content.substring(content.indexOf(",") + 1);
- insertImage(mimetype, content, hiddenImage.width, hiddenImage.height);
- // clean up
- document.body.removeChild(hiddenImage);
- self.onToolDone();
- };
- hiddenImage.src = content;
- }
- function fileSelectHandler(evt) {
- var file, files, reader;
- files = (evt.target && evt.target.files) || (evt.dataTransfer && evt.dataTransfer.files);
- if (files && files.length === 1) {
- file = files[0];
- reader = new FileReader();
- reader.onloadend = function () {
- if (reader.readyState === 2) {
- insertImageOnceLoaded(file.type, reader.result);
- } else {
- runtime.log("Image could not be loaded");
- self.onToolDone();
- }
- };
- reader.readAsDataURL(file);
- }
- }
- function createFileLoader() {
- var form = document.createElement("form"),
- input = document.createElement("input");
- form.appendChild(input);
- form.id = "imageForm";
- form.style.display = "none";
- input.id = "imageLoader";
- input.setAttribute("type", "file");
- input.setAttribute("accept", "image/*");
- input.addEventListener("change", fileSelectHandler, false);
- document.body.appendChild(form);
- return {input: input, form: form};
- }
- insertImageButton = new Button({
- label: runtime.tr("Insert Image"),
- disabled: true,
- showLabel: false,
- iconClass: "dijitEditorIcon dijitEditorIconInsertImage",
- onClick: function () {
- if (!fileLoader) {
- fileLoader = createFileLoader();
- }
- fileLoader.form.reset();
- fileLoader.input.click();
- }
- });
- widget.children = [insertImageButton];
- widget.startup = function () {
- widget.children.forEach(function (element) {
- element.startup();
- });
- };
- widget.placeAt = function (container) {
- widget.children.forEach(function (element) {
- element.placeAt(container);
- });
- return widget;
- };
- function enableButtons(isEnabled) {
- widget.children.forEach(function (element) {
- element.setAttribute('disabled', !isEnabled);
- });
- }
- function handleCursorMoved(cursor) {
- if (imageController.isEnabled()) {
- var disabled = cursor.getSelectionType() === ops.OdtCursor.RegionSelection;
- // LO/AOO pops up the picture/frame option dialog if image is selected when pressing the button
- // Since we only support inline images, disable the button for now.
- insertImageButton.setAttribute('disabled', disabled);
- }
- }
- this.setEditorSession = function (session) {
- if (editorSession) {
- editorSession.unsubscribe(EditorSession.signalCursorMoved, handleCursorMoved);
- imageController.unsubscribe(gui.ImageController.enabledChanged, enableButtons);
- }
- editorSession = session;
- if (editorSession) {
- textController = editorSession.sessionController.getTextController();
- imageController = editorSession.sessionController.getImageController();
- editorSession.subscribe(EditorSession.signalCursorMoved, handleCursorMoved);
- imageController.subscribe(gui.ImageController.enabledChanged, enableButtons);
- enableButtons(imageController.isEnabled());
- } else {
- enableButtons(false);
- }
- };
- /*jslint emptyblock: true*/
- this.onToolDone = function () {};
- /*jslint emptyblock: false*/
- callback(widget);
- };
- return ImageInserter;
- });
|