Skip to content
Code-Schnipsel Gruppen Projekte
Editor.js 20,8 KiB
Newer Older
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
 */

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, 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;

            // load CKEDITOR
            require([ URL_OPT_DIR +'bin/package-ckeditor4/ckeditor.js' ], function()
            {
                window.CKEDITOR.on('instanceReady', self.$onInstanceReadyListener );

                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

            // http://docs.ckeditor.com/#!/guide/dev_howtos_dialog_windows
            window.CKEDITOR.on( 'dialogDefinition', function( ev )
            {
Henning Leutz's avatar
Henning Leutz committed
                self.$imageDialog( ev );
                self.$linkDialog( ev );
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
            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
                });
Henning Leutz's avatar
Henning Leutz committed
            }

            window.CKEDITOR.replace(instance, {
                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,
                bodyClass    : data.bodyClass,
                // plugins      : CKEDITOR_NEXGAM_PLUGINS,
                // templates_files : [URL_OPT_DIR +'base/bin/pcsgEditorPlugins/templates.php'],
                baseFloatZIndex : zIndex
                //extraPlugins : 'panel,button,menu,floatpanel,menubutton,htmlbuttons'
Henning Leutz's avatar
Henning Leutz committed
            });
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
                );
Henning Leutz's avatar
Henning Leutz committed
            }
        },

        /**
         * 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 +" />" );
            }
Henning Leutz's avatar
Henning Leutz committed
        },

        /**
         * edit the image dialog
         *
Henning Leutz's avatar
Henning Leutz committed
         * @param {DOMEvent} ev - CKEvent
         * @return {DOMEvent} ev (CKEvent)
Henning Leutz's avatar
Henning Leutz committed
         */
        $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;
Henning Leutz's avatar
Henning Leutz committed

            /**
             * Image dialog
             */
            if ( dialogName != 'image' ) {
                return ev;
            }

Henning Leutz's avatar
Henning Leutz committed
            var oldOnShow = dialogDefinition.onShow;

Henning Leutz's avatar
Henning Leutz committed
            // 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 )();

Henning Leutz's avatar
Henning Leutz committed
                // 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"]' );


Henning Leutz's avatar
Henning Leutz committed
                if ( !UrlGroup.getElement( '.qui-button' ) )
                {
Henning Leutz's avatar
Henning Leutz committed
                    Button = new Element('button', {
Henning Leutz's avatar
Henning Leutz committed
                        '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
                                            });
Henning Leutz's avatar
Henning Leutz committed
                                        }
                                    }
                                });
                            }
                        }
                    }).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', {
Henning Leutz's avatar
Henning Leutz committed
                    '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
            };
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
Henning Leutz's avatar
Henning Leutz committed
         */
        $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
Henning Leutz's avatar
Henning Leutz committed
             */
            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;
Henning Leutz's avatar
Henning Leutz committed
            // Get a reference to the "Link Info" tab.
            dialogDefinition.onShow = function()
            {
Henning Leutz's avatar
Henning Leutz committed
                oldOnShow.bind( this )();

Henning Leutz's avatar
Henning Leutz committed
                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');
Henning Leutz's avatar
Henning Leutz committed

                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', {
Henning Leutz's avatar
Henning Leutz committed
                    'class' : 'qui-button',
Henning Leutz's avatar
Henning Leutz committed
                    html    : '<span class="icon-home"></span>',
                    events  :
Henning Leutz's avatar
Henning Leutz committed
                    {
                        click : function()
                        {
                            self.openProject({
                                events :
                                {
Henning Leutz's avatar
Henning Leutz committed
                                    onSubmit : function(Win, data)
                                    {
                                        UrlInput.value  = data.urls[ 0 ];
                                        Protokoll.value = '';
Henning Leutz's avatar
Henning Leutz committed
                                    }
                                }
                            });
                        }
                    }
                }).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' );
            };
Henning Leutz's avatar
Henning Leutz committed

            return ev;
Henning Leutz's avatar
Henning Leutz committed
        }
    });