Skip to content
Code-Schnipsel Gruppen Projekte
Editor.js 15,3 KiB
Newer Older
Henning Leutz's avatar
Henning Leutz committed
/**
 * ckeditor4 for QUIQQER
 *
 * @author www.pcsg.de (Henning Leutz)
 *
 * @module package/ckeditor4/bin/Editor
 * @package package/ckeditor4/bin/Editor
 */

define('package/quiqqer/ckeditor4/bin/Editor', [

    'require',
Henning Leutz's avatar
Henning Leutz committed
    'controls/editors/Editor',
    'Locale',

    'css!package/quiqqer/ckeditor4/bin/Editor.css'
Henning Leutz's avatar
Henning Leutz committed

Henning Leutz's avatar
Henning Leutz committed
], function(require, Editor, Locale)
Henning Leutz's avatar
Henning Leutz committed
{
    "use strict";

    return new Class({

        Extends : Editor,
        Type    : 'package/quiqqer/ckeditor4/bin/Editor',

        Binds : [
Henning Leutz's avatar
Henning Leutz committed
             '$onDestroy',
             '$onDraw',
             '$onSetContent',
             '$onGetContent',
             '$onDrop'
Henning Leutz's avatar
Henning Leutz committed
        ],

        initialize : function(Manager, options)
        {
            this.parent( Manager, options );

            this.addEvents({
                onDestroy    : this.$onDestroy,
                onDraw       : this.$onDraw,
                onSetContent : this.$onSetContent,
                onGetContent : this.$onGetContent,
Henning Leutz's avatar
Henning Leutz committed
                onDrop       : this.$onDrop
Henning Leutz's avatar
Henning Leutz committed
            });
        },

        /**
         * Load the CKEditor Instance into an Textarea or DOMNode Element
         *
         * @param {DOMNode} Container
Henning Leutz's avatar
Henning Leutz committed
         * @param {controls/editor/Editor} Editor
Henning Leutz's avatar
Henning Leutz committed
         */
        loadInstance : function(Container, Editor)
        {
Henning Leutz's avatar
Henning Leutz committed
            if ( typeof window.CKEDITOR === 'undefined' ) {
Henning Leutz's avatar
Henning Leutz committed
                return;
            }

            var self     = this,
                Instance = Container;
Henning Leutz's avatar
Henning Leutz committed

Henning Leutz's avatar
Henning Leutz committed
            if ( !Container.getElement( 'textarea' ) )
            {
                var size = Container.getSize(),

                    Instance = new Element('textarea', {
                        id : this.getId(),
                        styles : {
                            height : size.y,
                            width : size.x - 20
                        }
                    }).inject( Container );
            }

Henning Leutz's avatar
Henning Leutz committed
            if ( Instance.nodeName != 'TEXTAREA' ) {
                Instance = Instance.getElement( 'textarea' );
            }

            var instance = Instance.get( 'id' );

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
            }

            Editor.setAttribute( 'instancename', instance );

            // http://docs.ckeditor.com/#!/guide/dev_howtos_dialog_windows
            window.CKEDITOR.on( 'dialogDefinition', function( ev )
            {
Henning Leutz's avatar
Henning Leutz committed
                ev = self.$imageDialog( ev );
                ev = self.$linkDialog( ev );
Henning Leutz's avatar
Henning Leutz committed
            Editor.getManager().getToolbar(function(buttons)
            {
                // parse the buttons for the ckeditor
                var b, g, i, len, blen, glen, group, items,
                    buttonEntry, lineEntry, groupEntry;

Henning Leutz's avatar
Henning Leutz committed
                var lines   = buttons.lines || [],
Henning Leutz's avatar
Henning Leutz committed
                    toolbar = [];

                for ( i = 0, len = lines.length; i < len; i++ )
                {
                    items     = [];
                    lineEntry = lines[ i ];

                    // groups
                    for ( g = 0, glen = lineEntry.length; g < glen; g++ )
                    {
                        group      = [];
                        groupEntry = lineEntry[ g ];

                        // buttons
                        for ( b = 0, blen = groupEntry.length; b < blen; b++ )
                        {
                            buttonEntry = groupEntry[ b ];

                            if ( buttonEntry.type == 'seperator' )
                            {
                                group.push( '-' );
                                continue;
                            }

                            group.push( buttonEntry.button );
                        }
Henning Leutz's avatar
Henning Leutz committed
                        toolbar.push( group );
                    }

                    toolbar.push( '/' );
                }

                window.CKEDITOR.replace(instance, {
Henning Leutz's avatar
Henning Leutz committed
                    language     : Locale.getCurrent(),
                    baseHref     : URL_DIR,
                    basePath     : URL_DIR,
                    height       : Instance.getSize().y - 140,
                    width        : Instance.getSize().x + 20,
                    toolbar      : toolbar,
                    extraAllowedContent : 'div(*), iframe[*]',
Henning Leutz's avatar
Henning Leutz committed
                    // contentsCss  : CKEDITOR_NEXGAM_CSS,
                    // bodyClass    : CKEDITOR_NEXGAM_BODY_CLASS,
Henning Leutz's avatar
Henning Leutz committed
                    // plugins      : CKEDITOR_NEXGAM_PLUGINS,
                    // templates_files : [URL_OPT_DIR +'base/bin/pcsgEditorPlugins/templates.php'],
                    baseFloatZIndex : 100
                });
Henning Leutz's avatar
Henning Leutz committed
            });
        },

        /**
         * Editor onDestroy Event
         *
         * @param {QUI.classes.Editor} Editor
         */
        $onDestroy : function(Editor)
        {
            var Instance = Editor.getInstance();

Henning Leutz's avatar
Henning Leutz committed
            if ( window.CKEDITOR.instances[ Instance.name ] ) {
                window.CKEDITOR.instances[ Instance.name ].destroy( true );
Henning Leutz's avatar
Henning Leutz committed
            }
        },

        /**
         * Editor onDraw Event
         * if the editor is to be drawn
         *
         * @param {DOMNode} Container
Henning Leutz's avatar
Henning Leutz committed
         * @param {controls/editors/Editor} Editor
Henning Leutz's avatar
Henning Leutz committed
         */
        $onDraw : function(Container, Editor)
        {
Henning Leutz's avatar
Henning Leutz committed
            var self = this;

Henning Leutz's avatar
Henning Leutz committed
            // load CKEDITOR
Henning Leutz's avatar
Henning Leutz committed
            require([URL_OPT_DIR +'bin/package-ckeditor4/ckeditor.js'], function()
            {
Henning Leutz's avatar
Henning Leutz committed
                /*
                CKEDITOR.editorConfig = function( config ) {
                    config.language = 'fr';
                    config.uiColor = '#AADC6E';
                };
                */


                // CKEditor aufbauen
                // CKEDITOR_BASEPATH = URL_DIR;
                /*
                CKEDITOR_NEXGAM_TOOLBAR = [
                    { name: 'clipboard', items : [ 'Source', ,'Maximize', '-','pcsg_short', 'Templates','-', 'Paste','PasteText','PasteFromWord','-','Undo','Redo' ] },
                    { name: 'basicstyles', items : [ 'Bold','Italic', 'Underline', 'Strike','-','Subscript','Superscript','-','RemoveFormat' ] },
                    { name: 'paragraph', items : [ 'JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock','-','NumberedList','BulletedList' ] },
                    { name: 'pcsg', items : [ 'pcsg_image','-', 'pcsg_link', 'pcsg_unlink' ] },
                    { name: 'blocks', items : [ 'Format', 'pcsg_youtube' ] }
                ];

                CKEDITOR_NEXGAM_PLUGINS = '' +
                    'basicstyles,blockquote,button,clipboard,contextmenu,div,elementspath,enterkey,entities,find,' +
                    'font,format,indent,justify,keystrokes,list,liststyle,maximize,pastefromword,' +
                    'pastetext,removeformat,showblocks,showborders,sourcearea,stylescombo,' +
                    'table,tabletools,specialchar,tab,templates,toolbar,undo,wysiwygarea,wsc,pcsg_image,pcsg_link,pcsg_short,pcsg_youtube';

                CKEDITOR_NEXGAM_CSS = [
                    URL_USR_DIR +"bin/nexgam3/css/reset.css",
                    URL_USR_DIR +"bin/nexgam3/css/style.css",
                    URL_USR_DIR +"bin/nexgam3/css/wysiwyg.css",
                    URL_USR_DIR +"bin/nexgam3/css/images.css",
                    URL_USR_DIR +"bin/nexgam3/css/review.css"
                ];

                CKEDITOR_NEXGAM_BODY_CLASS = 'content left content-inner-container wysiwyg';
                */

Henning Leutz's avatar
Henning Leutz committed
                window.CKEDITOR.on('instanceReady', function(instance)
Henning Leutz's avatar
Henning Leutz committed
                {
                    if ( typeof instance.editor === 'undefined' ||
                         typeof instance.editor.name  === 'undefined' ||
Henning Leutz's avatar
Henning Leutz committed
                         instance.editor.name !== Editor.getAttribute( 'instancename' ) )
Henning Leutz's avatar
Henning Leutz committed
                    {
                        return;
                    }

Henning Leutz's avatar
Henning Leutz committed
                    Editor.setInstance( instance.editor );
                    Editor.fireEvent( 'loaded', [ Editor, instance.editor ] );
Henning Leutz's avatar
Henning Leutz committed

                    instance.editor.focus();

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

                Editor.loadInstance( Container, Editor );
Henning Leutz's avatar
Henning Leutz committed
            });
Henning Leutz's avatar
Henning Leutz committed
        },

        /**
         * Editor onSetContent Event
         *
         * @param {String} content
Henning Leutz's avatar
Henning Leutz committed
         * @param {controls/editors/Editor} Editor
Henning Leutz's avatar
Henning Leutz committed
         */
        $onSetContent : function(content, Editor)
        {
            if ( Editor.getInstance() ) {
                Editor.getInstance().setData( content );
            }
        },

        /**
         * Editor onGetContent Event
         *
         * @param {String} content
Henning Leutz's avatar
Henning Leutz committed
         * @param {controls/editors/Editor} Editor
Henning Leutz's avatar
Henning Leutz committed
         */
        $onGetContent : function(Editor)
        {
            if ( Editor.getInstance() ) {
                Editor.setAttribute( 'content', Editor.getInstance().getData() );
            }
        },

        /**
         *
         * @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
         *
         * @param {CKEvent} ev
         * @return {CKEvent} ev
         */
        $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
                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"]' );

                if ( !UrlGroup.getElement( '.qui-button' ) )
                {
                    var 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;
                                        }
                                    }
                                });
                            }
                        }
                    }).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"]' );

                var 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
                });
            }

            return ev;
        },

        /**
         * edit the link dialog
         *
         * @param {CKEvent} ev
         * @return {CKEvent} ev
         */
        $linkDialog : function(ev)
        {
            // Take the dialog name and its definition from the event data.
            var self             = this,
                dialogName       = ev.data.name,
                dialogDefinition = ev.data.definition;

            /**
             * 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;

            var Url       = dialogDefinition.getContents( 'info' ).get( 'url' ),
                orgCommit = Url.commit;

            Url.commit = function( data )
            {
                orgCommit.call( this, data );

                data.url = {
Henning Leutz's avatar
Henning Leutz committed
                    protocol : Protokoll.value,
                    url      : this.getValue()
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
                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()
                                .$
                                .getElement('select')
Henning Leutz's avatar
Henning Leutz committed

                UrlInput.setStyles({
                    'float' : 'left',
                    width   : UrlInput.getSize().x - 50
                });

                var Button = new Element('button', {
                    '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' );
            }


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