Skip to content
Code-Schnipsel Gruppen Projekte
Editor.js 21,4 KiB
Newer Older
  • Learn to ignore specific revisions
  • Henning Leutz's avatar
    Henning Leutz committed
    /**
     * ckeditor4 for QUIQQER
     *
    
     * @module package/quiqqer/ckeditor4/bin/Editor
    
    Henning Leutz's avatar
    Henning Leutz committed
     * @author www.pcsg.de (Henning Leutz)
     *
    
    Henning Leutz's avatar
    Henning Leutz committed
     * @require require
     * @require controls/editors/Editor
     * @require Locale
     * @require Ajax
     * @require qui/utils/Math
     * @require css!package/quiqqer/ckeditor4/bin/Editor.css
    
    Henning Leutz's avatar
    Henning Leutz committed
     */
    
    
    define('package/quiqqer/ckeditor4/bin/Editor', [
    
    Henning Leutz's avatar
    Henning Leutz committed
    
        'require',
    
    Henning Leutz's avatar
    Henning Leutz committed
        'controls/editors/Editor',
    
        'Locale',
    
        'qui/utils/Elements',
    
        'css!package/quiqqer/ckeditor4/bin/Editor.css'
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    ], function(require, QUI, Editor, Locale, Ajax, QUIMath, QUIElements)
    
    Henning Leutz's avatar
    Henning Leutz committed
    {
        "use strict";
    
        return new Class({
    
            Extends : Editor,
    
            Type    : 'package/quiqqer/ckeditor4/bin/Editor',
    
    Henning Leutz's avatar
    Henning Leutz committed
    
            Binds : [
    
    Henning Leutz's avatar
    Henning Leutz committed
                '$onLoad',
                '$onDestroy',
                '$onSetContent',
                '$onGetContent',
                '$onDrop',
                '$onResize',
                '$onAddCSS',
                '$onInstanceReadyListener'
    
    Henning Leutz's avatar
    Henning Leutz committed
            ],
    
            initialize : function(Manager, options)
            {
                this.parent( Manager, options );
    
    
                this.$cssFiles = {};
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                this.addEvents({
    
    Henning Leutz's avatar
    Henning Leutz committed
                    onLoad       : this.$onLoad,
                    onResize     : this.$onResize,
    
    Henning Leutz's avatar
    Henning Leutz committed
                    onDestroy    : this.$onDestroy,
                    onSetContent : this.$onSetContent,
                    onGetContent : this.$onGetContent,
    
                    onDrop       : this.$onDrop,
                    onAddCSS     : this.$onAddCSS
    
    Henning Leutz's avatar
    Henning Leutz committed
                });
            },
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * Editor onLoad Event
             * if the editor is to be drawn and inserted
             *
             * @param {Object} data - Editor data
             */
            $onLoad : function(data)
            {
                var self = this;
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                // load CKEDITOR
    
                require([URL_OPT_DIR +'bin/package-ckeditor4/ckeditor.js'], function()
    
    Henning Leutz's avatar
    Henning Leutz committed
                {
    
                    // set global events
                    window.CKEDITOR.on('instanceReady', function(ev)
                    {
                        var Editor = QUI.Controls.getById(ev.editor.name);
    
                        Editor.$onInstanceReadyListener(ev);
                    });
    
                    // http://docs.ckeditor.com/#!/guide/dev_howtos_dialog_windows
                    window.CKEDITOR.on('dialogDefinition', function(ev)
                    {
                        var Editor = QUI.Controls.getById(ev.editor.name);
    
                        Editor.$imageDialog(ev);
                        Editor.$linkDialog(ev);
                    });
    
                    self.$loadInstance(data);
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * Load the CKEditor Instance into an Textarea or DOMNode Element
             *
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Object} data - Editor settings data
    
    Henning Leutz's avatar
    Henning Leutz committed
             */
    
    Henning Leutz's avatar
    Henning Leutz committed
            $loadInstance : function(data)
    
    Henning Leutz's avatar
    Henning Leutz committed
            {
    
    Henning Leutz's avatar
    Henning Leutz committed
                if ( typeof window.CKEDITOR === 'undefined' ) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    return;
                }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                var self      = this,
                    Container = this.getContainer(),
                    Textarea  = false,
                    size      = Container.getSize();
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if ( !Container.getElement( 'textarea' ) )
                {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    Textarea = new Element('textarea', {
    
    Henning Leutz's avatar
    Henning Leutz committed
                        id : this.getId(),
                        styles : {
                            height : size.y,
    
    Henning Leutz's avatar
    Henning Leutz committed
                            width : size.x
    
    Henning Leutz's avatar
    Henning Leutz committed
                        }
                    }).inject( Container );
    
    Henning Leutz's avatar
    Henning Leutz committed
                if ( !Textarea ) {
                    Textarea = Container.getElement( 'textarea' );
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                var instance = Textarea.get( 'id' );
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if ( window.CKEDITOR.instances[ instance ] ) {
                    window.CKEDITOR.instances[ instance ].destroy( true );
    
    Henning Leutz's avatar
    Henning Leutz committed
                }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                self.setAttribute( 'instancename', instance );
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                // parse the buttons for the ckeditor
                var b, g, i, len, blen, glen, group, items,
                    buttonEntry, lineEntry, groupEntry;
    
                var buttons = data.toolbar,
                    lines   = buttons.lines || [],
                    toolbar = [];
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                for ( i = 0, len = lines.length; i < len; i++ )
                {
                    items     = [];
                    lineEntry = lines[ i ];
    
                    // groups
                    for ( g = 0, glen = lineEntry.length; g < glen; g++ )
    
    Henning Leutz's avatar
    Henning Leutz committed
                    {
    
    Henning Leutz's avatar
    Henning Leutz committed
                        group      = [];
                        groupEntry = lineEntry[ g ];
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                        // buttons
                        for ( b = 0, blen = groupEntry.length; b < blen; b++ )
    
    Henning Leutz's avatar
    Henning Leutz committed
                        {
    
    Henning Leutz's avatar
    Henning Leutz committed
                            buttonEntry = groupEntry[ b ];
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                            if ( buttonEntry.type == 'seperator' )
    
    Henning Leutz's avatar
    Henning Leutz committed
                            {
    
    Henning Leutz's avatar
    Henning Leutz committed
                                group.push( '-' );
                                continue;
    
    Henning Leutz's avatar
    Henning Leutz committed
                            }
    
    Henning Leutz's avatar
    Henning Leutz committed
                            group.push( buttonEntry.button );
    
    Henning Leutz's avatar
    Henning Leutz committed
                        }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                        toolbar.push( group );
    
    Henning Leutz's avatar
    Henning Leutz committed
                    }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                    toolbar.push( '/' );
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
                var height = size.y,
                    width  = size.x;
    
    Henning Leutz's avatar
    Henning Leutz committed
                if ( self.getAttribute( 'width' ) ) {
                    width = self.getAttribute( 'width' );
                }
    
                if ( self.getAttribute( 'height' ) ) {
                    height = self.getAttribute( 'height' );
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
                var zIndex = QUIElements.getComputedZIndex( Container );
    
    Henning Leutz's avatar
    Henning Leutz committed
                // parse styles to fckedit styles
                var entry, styles = [];
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if ( !("styles" in data) ) {
                    data.styles = [];
                }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                for ( i = 0, len = data.styles.length; i < len; i++ )
                {
                    entry = data.styles[ i ];
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                    styles.push({
                        name : entry.text,
                        element : entry.element,
                        attributes : entry.attributes
    
    Henning Leutz's avatar
    Henning Leutz committed
                    });
    
                if (!("cssFiles" in data)) {
                    data.cssFiles = [];
                }
    
    
                data.cssFiles.push(
                    URL_OPT_DIR +'quiqqer/ckeditor4/bin/defaultWysiwyg.css'
                );
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                window.CKEDITOR.replace(instance, {
    
                    customConfig : '',
    
    Henning Leutz's avatar
    Henning Leutz committed
                    language : Locale.getCurrent(),
                    baseHref : URL_DIR,
                    basePath : URL_DIR,
                    height   : height,
                    width    : width,
                    toolbar  : toolbar,
                    allowedContent      : true,
                    extraAllowedContent : 'div(*)[*]{*}, iframe(*)[*]{*}',
                    stylesSet    : styles,
    
                    contentsCss  : data.cssFiles || [],
    
    Henning Leutz's avatar
    Henning Leutz committed
                    bodyClass    : data.bodyClass,
                    // templates_files : [URL_OPT_DIR +'base/bin/pcsgEditorPlugins/templates.php'],
    
                    baseFloatZIndex : zIndex,
                    extraPlugins : 'abbr'
    
    Henning Leutz's avatar
    Henning Leutz committed
                });
            },
    
            /**
             * Editor onDestroy Event
             *
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Object} Editor - controls/editors/Editor
    
    Henning Leutz's avatar
    Henning Leutz committed
             */
            $onDestroy : function(Editor)
            {
                var Instance = Editor.getInstance();
    
    
                if ( window.CKEDITOR.instances[ Instance.name ] )
                {
                    try
                    {
                        window.CKEDITOR.instances[ Instance.name ].destroy( true );
    
                    } catch ( e ) {
    
                    }
    
                    window.CKEDITOR.instances[ Instance.name ] = null;
                    delete window.CKEDITOR.instances[ Instance.name ];
    
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                    window.CKEDITOR.removeListener(
                        'instanceReady',
                        this.$onInstanceReadyListener
                    );
    
            /**
             * event : instance ready
             * @param instance
             */
    
            $onInstanceReadyListener : function(instance)
            {
                if ( typeof instance.editor === 'undefined' ||
                     typeof instance.editor.name  === 'undefined' ||
                     instance.editor.name !== this.getAttribute( 'instancename' ) )
                {
                    return;
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                // resize the editor
                var Container = this.getContainer(),
                    containerSize = Container.getSize();
    
                // fckeditor resize, setHeight is sooooooooooo mysterious
                instance.editor.resize( containerSize.x, containerSize.y );
    
    
                this.setInstance( instance.editor );
                this.fireEvent( 'loaded', [ this, instance.editor ] );
    
                instance.editor.focus();
    
    Henning Leutz's avatar
    Henning Leutz committed
            },
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * event : on resize
             */
            $onResize : function()
            {
                var Container = this.getContainer(),
                    Instance = this.getInstance(),
                    containerSize = Container.getSize();
    
                Instance.resize( containerSize.x, containerSize.y );
            },
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * Editor onSetContent Event
             *
             * @param {String} content
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Object} Editor - controls/editors/Editor
    
    Henning Leutz's avatar
    Henning Leutz committed
             */
            $onSetContent : function(content, Editor)
            {
                if ( Editor.getInstance() ) {
                    Editor.getInstance().setData( content );
                }
            },
    
            /**
             * Editor onGetContent Event
             *
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Object} Editor - controls/editors/Editor
    
    Henning Leutz's avatar
    Henning Leutz committed
             */
            $onGetContent : function(Editor)
            {
                if ( Editor.getInstance() ) {
                    Editor.setAttribute( 'content', Editor.getInstance().getData() );
                }
            },
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * Set the focus to the editor
             */
            focus : function()
            {
                if ( this.getInstance() ) {
                    this.getInstance().focus();
                }
            },
    
            /**
             * Switch to source mode
             */
            switchToSource : function()
            {
                if ( this.getInstance() ) {
                    this.getInstance().setMode( 'source' );
                }
            },
    
            /**
             * Switch to wysiwyg editor
             */
            switchToWYSIWYG : function()
            {
                if ( this.getInstance() ) {
                    this.getInstance().setMode( 'wysiwyg' );
                }
            },
    
            /**
             * Hide the toolbar
             */
            hideToolbar : function()
            {
                var Toolbar = this.getElm().getElement( '.cke_top' );
    
                if ( Toolbar ) {
                    Toolbar.setStyle( 'display', 'none' );
                }
            },
    
            /**
             * show the toolbar
             */
            showToolbar : function()
            {
                var Toolbar = this.getElm().getElement( '.cke_top' );
    
                if ( Toolbar ) {
                    Toolbar.setStyle( 'display', null );
                }
            },
    
            /**
             * Set the height of the instance
             *
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Number} height
    
    Henning Leutz's avatar
    Henning Leutz committed
             */
            setHeight : function(height)
            {
                if ( this.getInstance() ) {
                    this.getInstance().resize( false, height );
                }
    
    
                this.setAttribute( 'height', height );
            },
    
            /**
             * Set the height of the instance
             *
             * @param {Number} width
             */
            setWidth : function(width)
            {
                if ( this.getInstance() ) {
                    this.getInstance().resize( width, false );
                }
    
                this.setAttribute( 'width', width );
    
    Henning Leutz's avatar
    Henning Leutz committed
            },
    
    
            /**
             * event : on add css
             *
             * @param {String} file - path to the css file
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Object} Editor - controls/editor/Editor
    
             */
            $onAddCSS : function(file, Editor)
            {
    
    
                this.$cssFiles[ file ] = true;
    
                if ( Instance )
                {
                    var Doc  = Editor.getDocument(),
                        Link = Doc.createElement('link');
    
                    Link.href = file;
                    Link.rel  = "stylesheet";
                    Link.type = "text/css";
    
                    Doc.head.appendChild( Link );
                }
            },
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
    
    Henning Leutz's avatar
    Henning Leutz committed
             * event : on Drop
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {Object} params
             */
            $onDrop : function(params)
            {
                var Instance = this.getInstance();
    
                for ( var i = 0, len = params.length; i < len; i++ ) {
                    Instance.insertHtml( "<img src="+ params[ i ].url +" />" );
                }
    
            },
    
            /**
             * edit the image dialog
             *
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {DOMEvent} ev - CKEvent
             * @return {DOMEvent} ev (CKEvent)
    
             */
            $imageDialog : function(ev)
            {
                // Take the dialog name and its definition from the event data.
    
    Henning Leutz's avatar
    Henning Leutz committed
                var self             = this,
                    dialogName       = ev.data.name,
                    dialogDefinition = ev.data.definition;
    
    
                /**
                 * Image dialog
                 */
                if ( dialogName != 'image' ) {
                    return ev;
                }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                var oldOnShow = dialogDefinition.onShow;
    
    
                // Get a reference to the "Link Info" tab.
                dialogDefinition.onShow = function()
                {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    var Button;
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                    oldOnShow.bind( this )();
    
    
                    // image button
                    var UrlGroup = this.getContentElement('info', 'txtUrl' )
                                       .getElement()
                                       .$;
    
                    var UrlInput = UrlGroup.getElement( 'input[type="text"]' );
    
    
                    var HeightInput = this.getContentElement('info', 'txtHeight' )
                                          .getElement().$
                                          .getElement( 'input[type="text"]' );
    
                    var WidthInput = this.getContentElement('info', 'txtWidth' )
                                         .getElement().$
                                         .getElement( 'input[type="text"]' );
    
    
    
                    if ( !UrlGroup.getElement( '.qui-button' ) )
                    {
    
    Henning Leutz's avatar
    Henning Leutz committed
                        Button = new Element('button', {
    
                            'class' : 'qui-button',
                            html : '<span class="icon-picture"></span>',
                            events :
                            {
                                click : function()
                                {
                                    self.openMedia({
                                        events :
                                        {
                                            onSubmit : function(Win, data)
                                            {
                                                UrlInput.value = data.url;
    
    
                                                Ajax.get('ajax_media_details', function(fileData)
                                                {
    
                                                    if ( fileData.image_height > 500 ||
                                                         fileData.image_width > 500 )
                                                    {
                                                        var result = QUIMath.resizeVar(
                                                            fileData.image_height,
                                                            fileData.image_width,
                                                            500
                                                        );
    
                                                        HeightInput.value = result.var1;
                                                        WidthInput.value  = result.var2;
    
                                                    } else
                                                    {
                                                        HeightInput.value = fileData.image_height;
                                                        WidthInput.value  = fileData.image_width;
                                                    }
    
    
                                                }, {
                                                    project : data.project,
                                                    fileid  : data.id
                                                });
    
                                            }
                                        }
                                    });
                                }
                            }
                        }).inject( UrlGroup );
    
                        Button.getPrevious().setStyles({
                            'float' : 'left'
                        });
                    }
    
    
                    // link button
                    var LinkGroup = this.getContentElement('Link', 'txtUrl' )
                                       .getElement()
                                       .$;
    
    
                    if ( LinkGroup.getElement( '.qui-button' ) ) {
                        return;
                    }
    
                    var LinkInput = LinkGroup.getElement( 'input[type="text"]' );
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                    Button = new Element('button', {
    
                        'class' : 'qui-button',
                        html : '<span class="icon-home"></span>',
                        events :
                        {
                            click : function()
                            {
                                self.openProject({
                                    events :
                                    {
                                        onSubmit : function(Win, data) {
                                            LinkInput.value = data.urls[ 0 ];
                                        }
                                    }
                                });
                            }
                        }
                    }).inject( LinkGroup );
    
                    var Prev = Button.getPrevious();
    
                    Prev.setStyles({
                        'float' : 'left',
                        width : Prev.getSize().x - 100
                    });
    
    Henning Leutz's avatar
    Henning Leutz committed
                };
    
    
                return ev;
            },
    
            /**
             * edit the link dialog
             *
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @param {DOMEvent} ev - CKEvent
             * @return {DOMEvent} ev - CKEvent
    
             */
            $linkDialog : function(ev)
            {
                // Take the dialog name and its definition from the event data.
    
    Henning Leutz's avatar
    Henning Leutz committed
                var dialogName = ev.data.name;
    
                 * Link dialog
    
                 */
                if ( dialogName != 'link' ) {
                    return ev;
                }
    
    
                // remove protokoll dropdown
    
    Henning Leutz's avatar
    Henning Leutz committed
                //dialogDefinition.getContents( 'info' ).remove( 'protocol');
    
    
                // remove protokoll at insertion
    
    Henning Leutz's avatar
    Henning Leutz committed
                var Protokoll;
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                var dialogDefinition = ev.data.definition,
                    Url       = dialogDefinition.getContents( 'info' ).get( 'url' ),
    
                    orgCommit = Url.commit;
    
                Url.commit = function( data )
                {
                    orgCommit.call( this, data );
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                    Protokoll = dialogDefinition.dialog
                                                .getContentElement('info', 'protocol' )
                                                .getElement()
                                                .$
                                                .getElement('select');
    
                    data.url = {
    
    Henning Leutz's avatar
    Henning Leutz committed
                        protocol : Protokoll.value,
                        url      : this.getValue()
    
    Henning Leutz's avatar
    Henning Leutz committed
                var self      = this,
                    oldOnShow = dialogDefinition.onShow;
    
                // Get a reference to the "Link Info" tab.
                dialogDefinition.onShow = function()
                {
    
    Henning Leutz's avatar
    Henning Leutz committed
                    oldOnShow.bind( this )();
    
    
                    var UrlGroup = this.getContentElement('info', 'url' )
                                       .getElement()
                                       .$;
    
                    if ( UrlGroup.getElement( '.qui-button' ) ) {
                        return;
                    }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                    var UrlInput  = UrlGroup.getElement( 'input[type="text"]' );
    
    Henning Leutz's avatar
    Henning Leutz committed
                    Protokoll = this.getContentElement('info', 'protocol' )
                                    .getElement()
                                    .$
    
    Henning Leutz's avatar
    Henning Leutz committed
                                    .getElement('select');
    
    
                    UrlInput.setStyles({
                        'float' : 'left',
    
    Henning Leutz's avatar
    Henning Leutz committed
                        width   : UrlInput.getSize().x - 100
    
    Henning Leutz's avatar
    Henning Leutz committed
                    var Links = new Element('button', {
    
                        'class' : 'qui-button',
    
    Henning Leutz's avatar
    Henning Leutz committed
                        html    : '<span class="icon-home"></span>',
                        events  :
    
                        {
                            click : function()
                            {
                                self.openProject({
                                    events :
                                    {
    
    Henning Leutz's avatar
    Henning Leutz committed
                                        onSubmit : function(Win, data)
                                        {
                                            UrlInput.value  = data.urls[ 0 ];
                                            Protokoll.value = '';
    
                                        }
                                    }
                                });
                            }
                        }
                    }).inject( UrlInput, 'after' );
    
    Henning Leutz's avatar
    Henning Leutz committed
    
                    // image button
                    new Element('button', {
                        'class' : 'qui-button',
                        html    : '<span class="icon-picture"></span>',
                        events  :
                        {
                            click : function()
                            {
                                self.openMedia({
                                    events :
                                    {
                                        onSubmit : function(Win, data)
                                        {
                                            UrlInput.value = data.url;
                                            Protokoll.value = '';
                                        }
                                    }
                                });
                            }
                        }
                    }).inject( Links, 'after' );
                };
    
    
                return ev;
    
    Henning Leutz's avatar
    Henning Leutz committed
            }
        });