UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

345 lines (280 loc) 7.98 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2004-2008 1&1 Internet AG, Germany, http://www.1und1.de License: MIT: https://opensource.org/licenses/MIT See the LICENSE file in the project's top-level directory for details. Authors: * Sebastian Werner (wpbasti) * Fabian Jakobs (fjakobs) ************************************************************************ */ /** * A multi-purpose widget, which combines a label with an icon. * * The intended purpose of qx.ui.basic.Atom is to easily align the common icon-text * combination in different ways. * * This is useful for all types of buttons, tooltips, ... * * *Example* * * Here is a little example of how to use the widget. * * <pre class='javascript'> * var atom = new qx.ui.basic.Atom("Icon Right", "icon/32/actions/go-next.png"); * this.getRoot().add(atom); * </pre> * * This example creates an atom with the label "Icon Right" and an icon. * * *External Documentation* * * <a href='http://manual.qooxdoo.org/${qxversion}/pages/widget/atom.html' target='_blank'> * Documentation of this widget in the qooxdoo manual.</a> * * * @childControl label {qx.ui.basic.Label} label part of the atom * @childControl icon {qx.ui.basic.Image} icon part of the atom */ qx.Class.define("qx.ui.basic.Atom", { extend : qx.ui.core.Widget, /* ***************************************************************************** CONSTRUCTOR ***************************************************************************** */ /** * @param label {String} Label to use * @param icon {String?null} Icon to use */ construct : function(label, icon) { if (qx.core.Environment.get("qx.debug")) { this.assertArgumentsCount(arguments, 0, 2); } this.base(arguments); this._setLayout(new qx.ui.layout.Atom()); if (label != null) { this.setLabel(label); } if (icon !== undefined) { this.setIcon(icon); } }, /* ***************************************************************************** PROPERTIES ***************************************************************************** */ properties : { // overridden appearance : { refine : true, init : "atom" }, /** The label/caption/text of the qx.ui.basic.Atom instance */ label : { apply : "_applyLabel", nullable : true, check : "String", event : "changeLabel" }, /** * Switches between rich HTML and text content. The text mode (<code>false</code>) supports * advanced features like ellipsis when the available space is not * enough. HTML mode (<code>true</code>) supports multi-line content and all the * markup features of HTML content. */ rich : { check : "Boolean", init : false, apply : "_applyRich" }, /** Any URI String supported by qx.ui.basic.Image to display an icon */ icon : { check : "String", apply : "_applyIcon", nullable : true, themeable : true, event : "changeIcon" }, /** * The space between the icon and the label */ gap : { check : "Integer", nullable : false, event : "changeGap", apply : "_applyGap", themeable : true, init : 4 }, /** * Configure the visibility of the sub elements/widgets. * Possible values: both, label, icon */ show : { init : "both", check : [ "both", "label", "icon" ], themeable : true, inheritable : true, apply : "_applyShow", event : "changeShow" }, /** * The position of the icon in relation to the text. * Only useful/needed if text and icon is configured and 'show' is configured as 'both' (default) */ iconPosition : { init : "left", check : ["top", "right", "bottom", "left", "top-left", "bottom-left" , "top-right", "bottom-right"], themeable : true, apply : "_applyIconPosition" }, /** * Whether the content should be rendered centrally when to much space * is available. Enabling this property centers in both axis. The behavior * when disabled of the centering depends on the {@link #iconPosition} property. * If the icon position is <code>left</code> or <code>right</code>, the X axis * is not centered, only the Y axis. If the icon position is <code>top</code> * or <code>bottom</code>, the Y axis is not centered. In case of e.g. an * icon position of <code>top-left</code> no axis is centered. */ center : { init : false, check : "Boolean", themeable : true, apply : "_applyCenter" } }, /* ***************************************************************************** MEMBERS ***************************************************************************** */ members : { // overridden _createChildControlImpl : function(id, hash) { var control; switch(id) { case "label": control = new qx.ui.basic.Label(this.getLabel()); control.setAnonymous(true); control.setRich(this.getRich()); control.setSelectable(this.getSelectable()); this._add(control); if (this.getLabel() == null || this.getShow() === "icon") { control.exclude(); } break; case "icon": control = new qx.ui.basic.Image(this.getIcon()); control.setAnonymous(true); this._addAt(control, 0); if (this.getIcon() == null || this.getShow() === "label") { control.exclude(); } break; } return control || this.base(arguments, id); }, // overridden /** * @lint ignoreReferenceField(_forwardStates) */ _forwardStates : { focused : true, hovered : true }, /** * Updates the visibility of the label */ _handleLabel : function() { if (this.getLabel() == null || this.getShow() === "icon") { this._excludeChildControl("label"); } else { this._showChildControl("label"); } }, /** * Updates the visibility of the icon */ _handleIcon : function() { if (this.getIcon() == null || this.getShow() === "label") { this._excludeChildControl("icon"); } else { this._showChildControl("icon"); } }, // property apply _applyLabel : function(value, old) { var label = this.getChildControl("label", true); if (label) { label.setValue(value); } this._handleLabel(); }, // property apply _applyRich : function(value, old) { var label = this.getChildControl("label", true); if (label) { label.setRich(value); } }, // property apply _applyIcon : function(value, old) { var icon = this.getChildControl("icon", true); if (icon) { icon.setSource(value); } this._handleIcon(); }, // property apply _applyGap : function(value, old) { this._getLayout().setGap(value); }, // property apply _applyShow : function(value, old) { this._handleLabel(); this._handleIcon(); }, // property apply _applyIconPosition : function(value, old) { this._getLayout().setIconPosition(value); }, // property apply _applyCenter : function(value, old) { this._getLayout().setCenter(value); }, // overridden _applySelectable : function(value, old) { this.base(arguments, value, old); var label = this.getChildControl("label", true); if (label) { this.getChildControl("label").setSelectable(value); } } } });