Skip to content
Code-Schnipsel Gruppen Projekte
Editor.js 15,3 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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 )
                {
    
                    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,
    
                        allowedContent      : true,
                        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 +" />" );
                }
    
            },
    
            /**
             * 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;
    
    
                /**
                 * 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
                    oldOnShow.bind( this )();
    
    
                    // 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
    
                 */
                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;
    
    
                // 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()
                                    .$
                                    .getElement('select')
    
    
                    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  :
    
                        {
                            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' );
                }
    
    
                return ev;
    
    Henning Leutz's avatar
    Henning Leutz committed
            }
        });
    });