JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
vanilla ckeditor-3.6.3
[ckeditor.git] / _source / plugins / floatpanel / plugin.js
index 5569e5e..7e9af39 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.\r
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\r
 For licensing, see LICENSE.html or http://ckeditor.com/license\r
 */\r
 \r
@@ -47,6 +47,9 @@ CKEDITOR.plugins.add( 'floatpanel',
                                element = panel.element,\r
                                iframe = element.getFirst().getFirst();\r
 \r
+                       // Disable native browser menu. (#4825)\r
+                       element.disableContextMenu();\r
+\r
                        this.element = element;\r
 \r
                        this._ =\r
@@ -198,9 +201,6 @@ CKEDITOR.plugins.add( 'floatpanel',
 \r
                                CKEDITOR.tools.setTimeout( function()\r
                                        {\r
-                                               if ( rtl )\r
-                                                       left -= element.$.offsetWidth;\r
-\r
                                                var panelLoad = CKEDITOR.tools.bind( function ()\r
                                                {\r
                                                        var target = element.getFirst();\r
@@ -247,24 +247,72 @@ CKEDITOR.plugins.add( 'floatpanel',
                                                        else\r
                                                                target.removeStyle( 'height' );\r
 \r
+                                                       // Flip panel layout horizontally in RTL with known width.\r
+                                                       if ( rtl )\r
+                                                               left -= element.$.offsetWidth;\r
+\r
+                                                       // Pop the style now for measurement.\r
+                                                       element.setStyle( 'left', left + 'px' );\r
+\r
+                                                       /* panel layout smartly fit the viewport size. */\r
                                                        var panelElement = panel.element,\r
                                                                panelWindow = panelElement.getWindow(),\r
-                                                               windowScroll = panelWindow.getScrollPosition(),\r
-                                                               viewportSize = panelWindow.getViewPaneSize(),\r
-                                                               panelSize =\r
+                                                               rect = element.$.getBoundingClientRect(),\r
+                                                               viewportSize = panelWindow.getViewPaneSize();\r
+\r
+                                                       // Compensation for browsers that dont support "width" and "height".\r
+                                                       var rectWidth = rect.width || rect.right - rect.left,\r
+                                                       rectHeight = rect.height || rect.bottom - rect.top;\r
+\r
+                                                       // Check if default horizontal layout is impossible.\r
+                                                       var spaceAfter = rtl ? rect.right : viewportSize.width - rect.left,\r
+                                                               spaceBefore = rtl ? viewportSize.width - rect.right : rect.left;\r
+\r
+                                                       if ( rtl )\r
+                                                       {\r
+                                                               if ( spaceAfter < rectWidth )\r
                                                                {\r
-                                                                       'height' : panelElement.$.offsetHeight,\r
-                                                                       'width' : panelElement.$.offsetWidth\r
-                                                               };\r
-\r
-                                                       // If the menu is horizontal off, shift it toward\r
-                                                       // the opposite language direction.\r
-                                                       if ( rtl ? left < 0 : left + panelSize.width > viewportSize.width + windowScroll.x )\r
-                                                               left += ( panelSize.width * ( rtl ? 1 : -1 ) );\r
-\r
-                                                       // Vertical off screen is simpler.\r
-                                                       if ( top + panelSize.height > viewportSize.height + windowScroll.y )\r
-                                                               top -= panelSize.height;\r
+                                                                       // Flip to show on right.\r
+                                                                       if ( spaceBefore > rectWidth )\r
+                                                                               left += rectWidth;\r
+                                                                       // Align to window left.\r
+                                                                       else if ( viewportSize.width > rectWidth )\r
+                                                                               left = left - rect.left;\r
+                                                                       // Align to window right, never cutting the panel at right.\r
+                                                                       else\r
+                                                                               left = left - rect.right + viewportSize.width;\r
+                                                               }\r
+                                                       }\r
+                                                       else if ( spaceAfter < rectWidth )\r
+                                                       {\r
+                                                                       // Flip to show on left.\r
+                                                                       if ( spaceBefore > rectWidth )\r
+                                                                               left -= rectWidth;\r
+                                                                       // Align to window right.\r
+                                                                       else if ( viewportSize.width > rectWidth )\r
+                                                                               left = left - rect.right + viewportSize.width;\r
+                                                                       // Align to window left, never cutting the panel at left.\r
+                                                                       else\r
+                                                                               left = left - rect.left;\r
+                                                               }\r
+\r
+\r
+                                                       // Check if the default vertical layout is possible.\r
+                                                       var spaceBelow = viewportSize.height - rect.top,\r
+                                                               spaceAbove = rect.top;\r
+\r
+                                                       if ( spaceBelow < rectHeight )\r
+                                                       {\r
+                                                               // Flip to show above.\r
+                                                               if ( spaceAbove > rectHeight )\r
+                                                                       top -= rectHeight;\r
+                                                               // Align to window bottom.\r
+                                                               else if ( viewportSize.height > rectHeight )\r
+                                                                       top = top - rect.bottom + viewportSize.height;\r
+                                                               // Align to top, never cutting the panel at top.\r
+                                                               else\r
+                                                                       top = top - rect.top;\r
+                                                       }\r
 \r
                                                        // If IE is in RTL, we have troubles with absolute\r
                                                        // position and horizontal scrolls. Here we have a\r