mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
129 lines
3.1 KiB
JavaScript
129 lines
3.1 KiB
JavaScript
|
/**
|
|||
|
* $Id: Button.js 520 2008-01-07 16:30:32Z spocke $
|
|||
|
*
|
|||
|
* @author Moxiecode
|
|||
|
* @copyright Copyright <EFBFBD> 2004-2008, Moxiecode Systems AB, All rights reserved.
|
|||
|
*/
|
|||
|
|
|||
|
(function(tinymce) {
|
|||
|
var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each;
|
|||
|
|
|||
|
/**#@+
|
|||
|
* @class This class is used to create a UI button. A button is basically a link
|
|||
|
* that is styled to look like a button or icon.
|
|||
|
* @member tinymce.ui.Button
|
|||
|
* @base tinymce.ui.Control
|
|||
|
*/
|
|||
|
tinymce.create('tinymce.ui.MenuButton:tinymce.ui.Button', {
|
|||
|
/**
|
|||
|
* Constructs a new split button control instance.
|
|||
|
*
|
|||
|
* @param {String} id Control id for the split button.
|
|||
|
* @param {Object} s Optional name/value settings object.
|
|||
|
*/
|
|||
|
MenuButton : function(id, s) {
|
|||
|
this.parent(id, s);
|
|||
|
this.onRenderMenu = new tinymce.util.Dispatcher(this);
|
|||
|
s.menu_container = s.menu_container || DOM.doc.body;
|
|||
|
},
|
|||
|
|
|||
|
/**#@+
|
|||
|
* @method
|
|||
|
*/
|
|||
|
|
|||
|
/**
|
|||
|
* Shows the menu.
|
|||
|
*/
|
|||
|
showMenu : function() {
|
|||
|
var t = this, p1, p2, e = DOM.get(t.id), m;
|
|||
|
|
|||
|
if (t.isDisabled())
|
|||
|
return;
|
|||
|
|
|||
|
if (!t.isMenuRendered) {
|
|||
|
t.renderMenu();
|
|||
|
t.isMenuRendered = true;
|
|||
|
}
|
|||
|
|
|||
|
if (t.isMenuVisible)
|
|||
|
return t.hideMenu();
|
|||
|
|
|||
|
p1 = DOM.getPos(t.settings.menu_container);
|
|||
|
p2 = DOM.getPos(e);
|
|||
|
|
|||
|
m = t.menu;
|
|||
|
m.settings.offset_x = p2.x;
|
|||
|
m.settings.offset_y = p2.y;
|
|||
|
m.settings.vp_offset_x = p2.x;
|
|||
|
m.settings.vp_offset_y = p2.y;
|
|||
|
m.settings.keyboard_focus = t._focused;
|
|||
|
m.showMenu(0, e.clientHeight);
|
|||
|
|
|||
|
Event.add(DOM.doc, 'mousedown', t.hideMenu, t);
|
|||
|
t.setState('Selected', 1);
|
|||
|
|
|||
|
t.isMenuVisible = 1;
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* Renders the menu to the DOM.
|
|||
|
*/
|
|||
|
renderMenu : function() {
|
|||
|
var t = this, m;
|
|||
|
|
|||
|
m = t.settings.control_manager.createDropMenu(t.id + '_menu', {
|
|||
|
menu_line : 1,
|
|||
|
'class' : this.classPrefix + 'Menu',
|
|||
|
icons : t.settings.icons
|
|||
|
});
|
|||
|
|
|||
|
m.onHideMenu.add(t.hideMenu, t);
|
|||
|
|
|||
|
t.onRenderMenu.dispatch(t, m);
|
|||
|
t.menu = m;
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* Hides the menu. The optional event parameter is used to check where the event occured so it
|
|||
|
* doesn't close them menu if it was a event inside the menu.
|
|||
|
*
|
|||
|
* @param {Event} e Optional event object.
|
|||
|
*/
|
|||
|
hideMenu : function(e) {
|
|||
|
var t = this;
|
|||
|
|
|||
|
// Prevent double toogles by canceling the mouse click event to the button
|
|||
|
if (e && e.type == "mousedown" && DOM.getParent(e.target, function(e) {return e.id === t.id || e.id === t.id + '_open';}))
|
|||
|
return;
|
|||
|
|
|||
|
if (!e || !DOM.getParent(e.target, '.mceMenu')) {
|
|||
|
t.setState('Selected', 0);
|
|||
|
Event.remove(DOM.doc, 'mousedown', t.hideMenu, t);
|
|||
|
if (t.menu)
|
|||
|
t.menu.hideMenu();
|
|||
|
}
|
|||
|
|
|||
|
t.isMenuVisible = 0;
|
|||
|
},
|
|||
|
|
|||
|
/**
|
|||
|
* Post render handler. This function will be called after the UI has been
|
|||
|
* rendered so that events can be added.
|
|||
|
*/
|
|||
|
postRender : function() {
|
|||
|
var t = this, s = t.settings;
|
|||
|
|
|||
|
Event.add(t.id, 'click', function() {
|
|||
|
if (!t.isDisabled()) {
|
|||
|
if (s.onclick)
|
|||
|
s.onclick(t.value);
|
|||
|
|
|||
|
t.showMenu();
|
|||
|
}
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
/**#@-*/
|
|||
|
});
|
|||
|
})(tinymce);
|