tinymce-rails 4.4.0 → 4.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/source/tinymce/tinymce.js +71 -22
  3. data/lib/tinymce/rails/version.rb +2 -2
  4. data/vendor/assets/javascripts/tinymce/plugins/advlist/plugin.js +1 -1
  5. data/vendor/assets/javascripts/tinymce/plugins/fullscreen/plugin.js +1 -1
  6. data/vendor/assets/javascripts/tinymce/plugins/lists/plugin.js +1 -1
  7. data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.js +1 -1
  8. data/vendor/assets/javascripts/tinymce/themes/inlite/scratch/compile/theme.js +204 -199
  9. data/vendor/assets/javascripts/tinymce/themes/inlite/scratch/inline/theme.js +204 -199
  10. data/vendor/assets/javascripts/tinymce/themes/inlite/scratch/inline/theme.raw.js +204 -199
  11. data/vendor/assets/javascripts/tinymce/themes/inlite/src/demo/html/demo.html +51 -24
  12. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/Theme.js +24 -17
  13. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/Measure.js +14 -23
  14. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/core/UrlType.js +6 -1
  15. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/ui/Buttons.js +3 -3
  16. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/ui/Forms.js +1 -1
  17. data/vendor/assets/javascripts/tinymce/themes/inlite/src/main/js/tinymce/inlite/ui/Panel.js +162 -160
  18. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/atomic/core/UrlTypeTest.js +8 -0
  19. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/alien/BookmarkTest.js +4 -4
  20. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/MeasureTest.js +4 -4
  21. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/core/SelectionMatcherTest.js +3 -3
  22. data/vendor/assets/javascripts/tinymce/themes/inlite/src/test/js/browser/file/ConversionsTest.js +1 -1
  23. data/vendor/assets/javascripts/tinymce/themes/inlite/theme.js +1 -1
  24. data/vendor/assets/javascripts/tinymce/themes/modern/theme.js +1 -1
  25. data/vendor/assets/javascripts/tinymce/tinymce.js +13 -13
  26. metadata +2 -2
@@ -13,30 +13,57 @@ ephox.bolt.module.api.main('tinymce/inlite/Demo');
13
13
  <body>
14
14
  <h2>inlite-theme Demo Page</h2>
15
15
  <div id="ephox-ui">
16
- <div class="tinymce" style="width: 900px; min-height: 100px">
17
- <p>
18
- <img src="https://www.tinymce.com/images/glyph-tinymce@2x.png" style="width: 100px; float: right">
19
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ultricies posuere felis sed interdum. Quisque nec diam
20
- nec purus gravida dapibus
21
- </p>
22
- <p>
23
- eget non <a href="http://www.tinymce.com">nulla</a>. Ut eu vestibulum libero. Vestibulum pretium est vitae metus auctor, quis fermentum mi
24
- luctus. Fusce aliquet tincidunt massa vitae scelerisque. Vivamus in tellus risus. Mauris auctor metus ut gravida feugiat.
25
- Nunc consequat urna eu augue commodo, eget malesuada odio fringilla. Morbi vitae turpis in elit laoreet malesuada a nec massa.
26
- </p>
27
- <table>
28
- <tbody>
29
- <tr>
30
- <td>Lorem ipsum dolor sit amet</td>
31
- <td>Lorem ipsum dolor sit amet</td>
32
- </tr>
33
- <tr>
34
- <td>Vivamus in tellus risus</td>
35
- <td>Vivamus in tellus risus</td>
36
- </tr>
37
- </tbody>
38
- </table>
39
- </div>
16
+ <div class="tinymce" style="width: 900px; min-height: 100px">
17
+ <p>
18
+ <img src="https://www.tinymce.com/images/glyph-tinymce@2x.png" style="width: 100px; float: right">
19
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ultricies posuere felis sed interdum. Quisque nec diam
20
+ nec purus gravida dapibus
21
+ </p>
22
+ <p>
23
+ eget non <a href="http://www.tinymce.com">nulla</a>. Ut eu vestibulum libero. Vestibulum pretium est vitae metus auctor, quis fermentum mi
24
+ luctus. Fusce aliquet tincidunt massa vitae scelerisque. Vivamus in tellus risus. Mauris auctor metus ut gravida feugiat.
25
+ Nunc consequat urna eu augue commodo, eget malesuada odio fringilla. Morbi vitae turpis in elit laoreet malesuada a nec massa.
26
+ </p>
27
+ <table>
28
+ <tbody>
29
+ <tr>
30
+ <td>Lorem ipsum dolor sit amet</td>
31
+ <td>Lorem ipsum dolor sit amet</td>
32
+ </tr>
33
+ <tr>
34
+ <td>Vivamus in tellus risus</td>
35
+ <td>Vivamus in tellus risus</td>
36
+ </tr>
37
+ </tbody>
38
+ </table>
39
+ </div>
40
+
41
+ <div style="height: 3000px"></div>
42
+
43
+ <div class="tinymce" style="width: 900px; min-height: 100px; margin: 20px; border: 20px solid black; padding: 20px">
44
+ <p>
45
+ <img src="https://www.tinymce.com/images/glyph-tinymce@2x.png" style="width: 100px; float: right">
46
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi ultricies posuere felis sed interdum. Quisque nec diam
47
+ nec purus gravida dapibus
48
+ </p>
49
+ <p>
50
+ eget non <a href="http://www.tinymce.com">nulla</a>. Ut eu vestibulum libero. Vestibulum pretium est vitae metus auctor, quis fermentum mi
51
+ luctus. Fusce aliquet tincidunt massa vitae scelerisque. Vivamus in tellus risus. Mauris auctor metus ut gravida feugiat.
52
+ Nunc consequat urna eu augue commodo, eget malesuada odio fringilla. Morbi vitae turpis in elit laoreet malesuada a nec massa.
53
+ </p>
54
+ <table>
55
+ <tbody>
56
+ <tr>
57
+ <td>Lorem ipsum dolor sit amet</td>
58
+ <td>Lorem ipsum dolor sit amet</td>
59
+ </tr>
60
+ <tr>
61
+ <td>Vivamus in tellus risus</td>
62
+ <td>Vivamus in tellus risus</td>
63
+ </tr>
64
+ </tbody>
65
+ </table>
66
+ </div>
40
67
  </div>
41
68
  </body>
42
69
  </html>
@@ -63,11 +63,16 @@ define('tinymce/inlite/Theme', [
63
63
  return result && result.rect ? result : null;
64
64
  };
65
65
 
66
- var togglePanel = function (editor) {
66
+ var togglePanel = function (editor, panel) {
67
67
  var toggle = function () {
68
68
  var toolbars = getToolbars(editor);
69
69
  var result = findMatchResult(editor, toolbars);
70
- result ? Panel.show(editor, result.id, result.rect, toolbars) : Panel.hide();
70
+
71
+ if (result) {
72
+ panel.show(editor, result.id, result.rect, toolbars);
73
+ } else {
74
+ panel.hide();
75
+ }
71
76
  };
72
77
 
73
78
  return function () {
@@ -77,28 +82,28 @@ define('tinymce/inlite/Theme', [
77
82
  };
78
83
  };
79
84
 
80
- var ignoreWhenFormIsVisible = function (f) {
85
+ var ignoreWhenFormIsVisible = function (panel, f) {
81
86
  return function () {
82
- if (!Panel.inForm()) {
87
+ if (!panel.inForm()) {
83
88
  f();
84
89
  }
85
90
  };
86
91
  };
87
92
 
88
- var bindContextualToolbarsEvents = function (editor) {
89
- var throttledTogglePanel = Delay.throttle(togglePanel(editor), 0);
90
- var throttledTogglePanelWhenNotInForm = Delay.throttle(ignoreWhenFormIsVisible(togglePanel(editor)), 0);
93
+ var bindContextualToolbarsEvents = function (editor, panel) {
94
+ var throttledTogglePanel = Delay.throttle(togglePanel(editor, panel), 0);
95
+ var throttledTogglePanelWhenNotInForm = Delay.throttle(ignoreWhenFormIsVisible(panel, togglePanel(editor, panel)), 0);
91
96
 
92
- editor.on('blur hide ObjectResizeStart', Panel.hide);
97
+ editor.on('blur hide ObjectResizeStart', panel.hide);
93
98
  editor.on('click', throttledTogglePanel);
94
99
  editor.on('nodeChange mouseup', throttledTogglePanelWhenNotInForm);
95
100
  editor.on('ResizeEditor ResizeWindow keyup', throttledTogglePanel);
96
- editor.on('remove', Panel.remove);
101
+ editor.on('remove', panel.remove);
97
102
 
98
- editor.shortcuts.add('Alt+F10', '', Panel.focus);
103
+ editor.shortcuts.add('Alt+F10', '', panel.focus);
99
104
  };
100
105
 
101
- var overrideLinkShortcut = function (editor) {
106
+ var overrideLinkShortcut = function (editor, panel) {
102
107
  editor.shortcuts.remove('meta+k');
103
108
  editor.shortcuts.add('meta+k', '', function () {
104
109
  var toolbars = getToolbars(editor);
@@ -107,17 +112,17 @@ define('tinymce/inlite/Theme', [
107
112
  ]);
108
113
 
109
114
  if (result) {
110
- Panel.show(editor, result.id, result.rect, toolbars);
115
+ panel.show(editor, result.id, result.rect, toolbars);
111
116
  }
112
117
  });
113
118
  };
114
119
 
115
- var renderInlineUI = function (editor) {
120
+ var renderInlineUI = function (editor, panel) {
116
121
  var skinName = editor.settings.skin || 'lightgray';
117
122
 
118
123
  SkinLoader.load(editor, skinName, function () {
119
- bindContextualToolbarsEvents(editor);
120
- overrideLinkShortcut(editor);
124
+ bindContextualToolbarsEvents(editor, panel);
125
+ overrideLinkShortcut(editor, panel);
121
126
  });
122
127
 
123
128
  return {};
@@ -128,10 +133,12 @@ define('tinymce/inlite/Theme', [
128
133
  };
129
134
 
130
135
  ThemeManager.add('inlite', function (editor) {
131
- Buttons.addToEditor(editor);
136
+ var panel = new Panel();
137
+
138
+ Buttons.addToEditor(editor, panel);
132
139
 
133
140
  var renderUI = function () {
134
- return editor.inline ? renderInlineUI(editor) : fail('inlite theme only supports inline mode.');
141
+ return editor.inline ? renderInlineUI(editor, panel) : fail('inlite theme only supports inline mode.');
135
142
  };
136
143
 
137
144
  return {
@@ -24,36 +24,27 @@ define('tinymce/inlite/core/Measure', [
24
24
  };
25
25
  };
26
26
 
27
- var getElementRect = function (editor, elm) {
28
- var pos, targetRect, root;
29
-
30
- pos = DOM.getPos(editor.getContentAreaContainer());
31
- targetRect = editor.dom.getRect(elm);
32
- root = editor.dom.getRoot();
33
-
34
- // Adjust targetPos for scrolling in the editor
35
- if (root.nodeName == 'BODY') {
36
- targetRect.x -= root.ownerDocument.documentElement.scrollLeft || root.scrollLeft;
37
- targetRect.y -= root.ownerDocument.documentElement.scrollTop || root.scrollTop;
38
- }
39
-
40
- targetRect.x += pos.x;
41
- targetRect.y += pos.y;
42
-
43
- // We need to use these instead of the rect values since the style
44
- // size properites might not be the same as the real size for a table
45
- targetRect.w = elm.clientWidth > 0 ? elm.clientWidth : elm.offsetWidth;
46
- targetRect.h = elm.clientHeight > 0 ? elm.clientHeight : elm.offsetHeight;
27
+ var measureElement = function (elm) {
28
+ var clientRect = elm.getBoundingClientRect();
29
+
30
+ return toAbsolute({
31
+ x: clientRect.left,
32
+ y: clientRect.top,
33
+ w: Math.max(elm.clientWidth, elm.offsetWidth),
34
+ h: Math.max(elm.clientHeight, elm.offsetHeight)
35
+ });
36
+ };
47
37
 
48
- return targetRect;
38
+ var getElementRect = function (editor, elm) {
39
+ return measureElement(elm);
49
40
  };
50
41
 
51
42
  var getPageAreaRect = function (editor) {
52
- return DOM.getRect(editor.getElement().ownerDocument.body);
43
+ return measureElement(editor.getElement().ownerDocument.body);
53
44
  };
54
45
 
55
46
  var getContentAreaRect = function (editor) {
56
- return toAbsolute(DOM.getRect(editor.getContentAreaContainer() || editor.getBody()));
47
+ return measureElement(editor.getContentAreaContainer() || editor.getBody());
57
48
  };
58
49
 
59
50
  var getSelectionRect = function (editor) {
@@ -14,8 +14,13 @@ define('tinymce/inlite/core/UrlType', [
14
14
  return /^www\.|\.(com|org|edu|gov|uk|net|ca|de|jp|fr|au|us|ru|ch|it|nl|se|no|es|mil)$/i.test(href.trim());
15
15
  };
16
16
 
17
+ var isAbsolute = function (href) {
18
+ return /^https?:\/\//.test(href.trim());
19
+ };
20
+
17
21
  return {
18
- isDomainLike: isDomainLike
22
+ isDomainLike: isDomainLike,
23
+ isAbsolute: isAbsolute
19
24
  };
20
25
  });
21
26
 
@@ -38,13 +38,13 @@ define('tinymce/inlite/ui/Buttons', [
38
38
  }
39
39
  };
40
40
 
41
- var addToEditor = function (editor) {
41
+ var addToEditor = function (editor, panel) {
42
42
  editor.addButton('quicklink', {
43
43
  icon: 'link',
44
44
  tooltip: 'Insert/Edit link',
45
45
  stateSelector: 'a[href]',
46
46
  onclick: function () {
47
- Panel.showForm(editor, 'quicklink');
47
+ panel.showForm(editor, 'quicklink');
48
48
  }
49
49
  });
50
50
 
@@ -66,7 +66,7 @@ define('tinymce/inlite/ui/Buttons', [
66
66
  icon: 'table',
67
67
  tooltip: 'Insert table',
68
68
  onclick: function () {
69
- Panel.hide();
69
+ panel.hide();
70
70
  Actions.insertTable(editor, 2, 2);
71
71
  }
72
72
  });
@@ -57,7 +57,7 @@ define('tinymce/inlite/ui/Forms', [
57
57
  };
58
58
 
59
59
  var convertLinkToAbsolute = function (editor, href) {
60
- return UrlType.isDomainLike(href) ? askAboutPrefix(editor, href) : Promise.resolve(href);
60
+ return !UrlType.isAbsolute(href) && UrlType.isDomainLike(href) ? askAboutPrefix(editor, href) : Promise.resolve(href);
61
61
  };
62
62
 
63
63
  var createQuickLinkForm = function (editor, hide) {
@@ -17,138 +17,103 @@ define('tinymce/inlite/ui/Panel', [
17
17
  'tinymce/inlite/core/Measure',
18
18
  'tinymce/inlite/core/Layout'
19
19
  ], function (Tools, Factory, DOM, Toolbar, Forms, Measure, Layout) {
20
- var DEFAULT_TEXT_SELECTION_ITEMS = 'bold italic | quicklink h2 h3 blockquote';
21
- var DEFAULT_INSERT_TOOLBAR_ITEMS = 'quickimage quicktable';
22
- var panel, currentRect;
23
-
24
- var createToolbars = function (editor, toolbars) {
25
- return Tools.map(toolbars, function (toolbar) {
26
- return Toolbar.create(editor, toolbar.id, toolbar.items);
27
- });
28
- };
29
-
30
- var getTextSelectionToolbarItems = function (settings) {
31
- var value = settings.selection_toolbar;
32
- return value ? value : DEFAULT_TEXT_SELECTION_ITEMS;
33
- };
34
-
35
- var getInsertToolbarItems = function (settings) {
36
- var value = settings.insert_toolbar;
37
- return value ? value : DEFAULT_INSERT_TOOLBAR_ITEMS;
38
- };
20
+ return function () {
21
+ var DEFAULT_TEXT_SELECTION_ITEMS = 'bold italic | quicklink h2 h3 blockquote';
22
+ var DEFAULT_INSERT_TOOLBAR_ITEMS = 'quickimage quicktable';
23
+ var panel, currentRect;
24
+
25
+ var createToolbars = function (editor, toolbars) {
26
+ return Tools.map(toolbars, function (toolbar) {
27
+ return Toolbar.create(editor, toolbar.id, toolbar.items);
28
+ });
29
+ };
30
+
31
+ var getTextSelectionToolbarItems = function (settings) {
32
+ var value = settings.selection_toolbar;
33
+ return value ? value : DEFAULT_TEXT_SELECTION_ITEMS;
34
+ };
35
+
36
+ var getInsertToolbarItems = function (settings) {
37
+ var value = settings.insert_toolbar;
38
+ return value ? value : DEFAULT_INSERT_TOOLBAR_ITEMS;
39
+ };
40
+
41
+ var create = function (editor, toolbars) {
42
+ var items, settings = editor.settings;
43
+
44
+ items = createToolbars(editor, toolbars);
45
+ items = items.concat([
46
+ Toolbar.create(editor, 'text', getTextSelectionToolbarItems(settings)),
47
+ Toolbar.create(editor, 'insert', getInsertToolbarItems(settings)),
48
+ Forms.createQuickLinkForm(editor, hide)
49
+ ]);
50
+
51
+ return Factory.create({
52
+ type: 'floatpanel',
53
+ role: 'dialog',
54
+ classes: 'tinymce tinymce-inline arrow',
55
+ ariaLabel: 'Inline toolbar',
56
+ layout: 'flex',
57
+ direction: 'column',
58
+ align: 'stretch',
59
+ autohide: false,
60
+ autofix: true,
61
+ fixed: true,
62
+ border: 1,
63
+ items: items,
64
+ oncancel: function() {
65
+ editor.focus();
66
+ }
67
+ });
68
+ };
39
69
 
40
- var create = function (editor, toolbars) {
41
- var items, settings = editor.settings;
42
-
43
- items = createToolbars(editor, toolbars);
44
- items = items.concat([
45
- Toolbar.create(editor, 'text', getTextSelectionToolbarItems(settings)),
46
- Toolbar.create(editor, 'insert', getInsertToolbarItems(settings)),
47
- Forms.createQuickLinkForm(editor, hide)
48
- ]);
49
-
50
- return Factory.create({
51
- type: 'floatpanel',
52
- role: 'dialog',
53
- classes: 'tinymce tinymce-inline arrow',
54
- ariaLabel: 'Inline toolbar',
55
- layout: 'flex',
56
- direction: 'column',
57
- align: 'stretch',
58
- autohide: false,
59
- autofix: true,
60
- fixed: true,
61
- border: 1,
62
- items: items,
63
- oncancel: function() {
64
- editor.focus();
70
+ var showPanel = function (panel) {
71
+ if (panel) {
72
+ panel.show();
65
73
  }
66
- });
67
- };
74
+ };
68
75
 
69
- var showPanel = function (panel) {
70
- if (panel) {
71
- panel.show();
72
- }
73
- };
76
+ var movePanelTo = function (panel, pos) {
77
+ panel.moveTo(pos.x, pos.y);
78
+ };
74
79
 
75
- var movePanelTo = function (panel, pos) {
76
- panel.moveTo(pos.x, pos.y);
77
- };
80
+ var togglePositionClass = function (panel, relPos) {
81
+ relPos = relPos ? relPos.substr(0, 2) : '';
78
82
 
79
- var togglePositionClass = function (panel, relPos) {
80
- relPos = relPos ? relPos.substr(0, 2) : '';
81
-
82
- Tools.each({
83
- t: 'down',
84
- b: 'up',
85
- c: 'center'
86
- }, function(cls, pos) {
87
- panel.classes.toggle('arrow-' + cls, pos === relPos.substr(0, 1));
88
- });
89
-
90
- if (relPos === 'cr') {
91
- panel.classes.toggle('arrow-left', true);
92
- panel.classes.toggle('arrow-right', false);
93
- } else if (relPos === 'cl') {
94
- panel.classes.toggle('arrow-left', true);
95
- panel.classes.toggle('arrow-right', true);
96
- } else {
97
83
  Tools.each({
98
- l: 'left',
99
- r: 'right'
84
+ t: 'down',
85
+ b: 'up',
86
+ c: 'center'
100
87
  }, function(cls, pos) {
101
- panel.classes.toggle('arrow-' + cls, pos === relPos.substr(1, 1));
88
+ panel.classes.toggle('arrow-' + cls, pos === relPos.substr(0, 1));
102
89
  });
103
- }
104
- };
105
90
 
106
- var showToolbar = function (panel, id) {
107
- var toolbars = panel.items().filter('#' + id);
108
-
109
- if (toolbars.length > 0) {
110
- toolbars[0].show();
111
- panel.reflow();
112
- }
113
- };
114
-
115
- var showPanelAt = function (panel, id, editor, targetRect) {
116
- var contentAreaRect, panelRect, result, userConstainHandler;
117
-
118
- showPanel(panel);
119
- panel.items().hide();
120
- showToolbar(panel, id);
121
-
122
- userConstainHandler = editor.settings.inline_toolbar_position_handler;
123
- contentAreaRect = Measure.getContentAreaRect(editor);
124
- panelRect = DOM.getRect(panel.getEl());
125
-
126
- if (id === 'insert') {
127
- result = Layout.calcInsert(targetRect, contentAreaRect, panelRect);
128
- } else {
129
- result = Layout.calc(targetRect, contentAreaRect, panelRect);
130
- }
131
-
132
- if (result) {
133
- panelRect = result.rect;
134
- currentRect = targetRect;
135
- movePanelTo(panel, Layout.userConstrain(userConstainHandler, targetRect, contentAreaRect, panelRect));
136
-
137
- togglePositionClass(panel, result.position);
138
- } else {
139
- hide(panel);
140
- }
141
- };
91
+ if (relPos === 'cr') {
92
+ panel.classes.toggle('arrow-left', true);
93
+ panel.classes.toggle('arrow-right', false);
94
+ } else if (relPos === 'cl') {
95
+ panel.classes.toggle('arrow-left', true);
96
+ panel.classes.toggle('arrow-right', true);
97
+ } else {
98
+ Tools.each({
99
+ l: 'left',
100
+ r: 'right'
101
+ }, function(cls, pos) {
102
+ panel.classes.toggle('arrow-' + cls, pos === relPos.substr(1, 1));
103
+ });
104
+ }
105
+ };
142
106
 
143
- var hasFormVisible = function () {
144
- return panel.items().filter('form:visible').length > 0;
145
- };
107
+ var showToolbar = function (panel, id) {
108
+ var toolbars = panel.items().filter('#' + id);
146
109
 
147
- var showForm = function (editor, id) {
148
- if (panel) {
149
- panel.items().hide();
150
- showToolbar(panel, id);
110
+ if (toolbars.length > 0) {
111
+ toolbars[0].show();
112
+ panel.reflow();
113
+ }
114
+ };
151
115
 
116
+ var showPanelAt = function (panel, id, editor, targetRect) {
152
117
  var contentAreaRect, panelRect, result, userConstainHandler;
153
118
 
154
119
  showPanel(panel);
@@ -159,58 +124,95 @@ define('tinymce/inlite/ui/Panel', [
159
124
  contentAreaRect = Measure.getContentAreaRect(editor);
160
125
  panelRect = DOM.getRect(panel.getEl());
161
126
 
162
- result = Layout.calc(currentRect, contentAreaRect, panelRect);
127
+ if (id === 'insert') {
128
+ result = Layout.calcInsert(targetRect, contentAreaRect, panelRect);
129
+ } else {
130
+ result = Layout.calc(targetRect, contentAreaRect, panelRect);
131
+ }
163
132
 
164
133
  if (result) {
165
134
  panelRect = result.rect;
166
- movePanelTo(panel, Layout.userConstrain(userConstainHandler, currentRect, contentAreaRect, panelRect));
135
+ currentRect = targetRect;
136
+ movePanelTo(panel, Layout.userConstrain(userConstainHandler, targetRect, contentAreaRect, panelRect));
167
137
 
168
138
  togglePositionClass(panel, result.position);
139
+ } else {
140
+ hide(panel);
169
141
  }
170
- }
171
- };
142
+ };
172
143
 
173
- var show = function (editor, id, targetRect, toolbars) {
174
- if (!panel) {
175
- panel = create(editor, toolbars);
176
- panel.renderTo(document.body).reflow().moveTo(targetRect.x, targetRect.y);
177
- editor.nodeChanged();
178
- }
144
+ var hasFormVisible = function () {
145
+ return panel.items().filter('form:visible').length > 0;
146
+ };
179
147
 
180
- showPanelAt(panel, id, editor, targetRect);
181
- };
148
+ var showForm = function (editor, id) {
149
+ if (panel) {
150
+ panel.items().hide();
151
+ showToolbar(panel, id);
182
152
 
183
- var hide = function () {
184
- if (panel) {
185
- panel.hide();
186
- }
187
- };
153
+ var contentAreaRect, panelRect, result, userConstainHandler;
188
154
 
189
- var focus = function () {
190
- if (panel) {
191
- panel.find('toolbar:visible').eq(0).each(function (item) {
192
- item.focus(true);
193
- });
194
- }
195
- };
155
+ showPanel(panel);
156
+ panel.items().hide();
157
+ showToolbar(panel, id);
196
158
 
197
- var remove = function () {
198
- if (panel) {
199
- panel.remove();
200
- panel = null;
201
- }
202
- };
159
+ userConstainHandler = editor.settings.inline_toolbar_position_handler;
160
+ contentAreaRect = Measure.getContentAreaRect(editor);
161
+ panelRect = DOM.getRect(panel.getEl());
203
162
 
204
- var inForm = function () {
205
- return panel && panel.visible() && hasFormVisible();
206
- };
163
+ result = Layout.calc(currentRect, contentAreaRect, panelRect);
207
164
 
208
- return {
209
- show: show,
210
- showForm: showForm,
211
- inForm: inForm,
212
- hide: hide,
213
- focus: focus,
214
- remove: remove
165
+ if (result) {
166
+ panelRect = result.rect;
167
+ movePanelTo(panel, Layout.userConstrain(userConstainHandler, currentRect, contentAreaRect, panelRect));
168
+
169
+ togglePositionClass(panel, result.position);
170
+ }
171
+ }
172
+ };
173
+
174
+ var show = function (editor, id, targetRect, toolbars) {
175
+ if (!panel) {
176
+ panel = create(editor, toolbars);
177
+ panel.renderTo(document.body).reflow().moveTo(targetRect.x, targetRect.y);
178
+ editor.nodeChanged();
179
+ }
180
+
181
+ showPanelAt(panel, id, editor, targetRect);
182
+ };
183
+
184
+ var hide = function () {
185
+ if (panel) {
186
+ panel.hide();
187
+ }
188
+ };
189
+
190
+ var focus = function () {
191
+ if (panel) {
192
+ panel.find('toolbar:visible').eq(0).each(function (item) {
193
+ item.focus(true);
194
+ });
195
+ }
196
+ };
197
+
198
+ var remove = function () {
199
+ if (panel) {
200
+ panel.remove();
201
+ panel = null;
202
+ }
203
+ };
204
+
205
+ var inForm = function () {
206
+ return panel && panel.visible() && hasFormVisible();
207
+ };
208
+
209
+ return {
210
+ show: show,
211
+ showForm: showForm,
212
+ inForm: inForm,
213
+ hide: hide,
214
+ focus: focus,
215
+ remove: remove
216
+ };
215
217
  };
216
218
  });