X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=mardrone%2Fimports%2Fcom%2Fnokia%2Fandroid.1.1%2FButtonGroup.js;fp=mardrone%2Fimports%2Fcom%2Fnokia%2Fandroid.1.1%2FButtonGroup.js;h=3843719f25f619ec3c8d86bce55ef32a450473b6;hb=423f5226eddc5c327ef47559c03b0e2775add19e;hp=0000000000000000000000000000000000000000;hpb=c6326414c8585a359a4278f028042dfb4c0a749e;p=mardrone diff --git a/mardrone/imports/com/nokia/android.1.1/ButtonGroup.js b/mardrone/imports/com/nokia/android.1.1/ButtonGroup.js new file mode 100644 index 0000000..3843719 --- /dev/null +++ b/mardrone/imports/com/nokia/android.1.1/ButtonGroup.js @@ -0,0 +1,174 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Components project. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor +** the names of its contributors may be used to endorse or promote +** products derived from this software without specific prior written +** permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** $QT_END_LICENSE$ +** +****************************************************************************/ + +var self +var clickHandlers = [] +var visibleButtons = [] +var resizing = false +var checkingOverallExclusivity = false +var checkedBtn + +function create(that) { + destroy() + self = that + + // If the item is not visible at this stage, we store the value of the property + // checkedButton to ensure a proper initialization. The value is restored in + // initCheckedButton(). + if (!self.visible) + checkedBtn = self.checkedButton + + buildItems() + self.childrenChanged.connect(buildItems) + self.widthChanged.connect(resizeButtons) + self.exclusiveChanged.connect(checkOverallExclusivity) + self.checkedButtonChanged.connect(checkOverallExclusivity) + self.visibleChanged.connect(initCheckedButton) +} + +function destroy() { + if (self !== undefined) { + self.childrenChanged.disconnect(buildItems) + self.widthChanged.disconnect(resizeButtons) + self.exclusiveChanged.disconnect(checkOverallExclusivity) + self.checkedButtonChanged.disconnect(checkOverallExclusivity) + self.visibleChanged.disconnect(initCheckedButton) + releaseItemConnections() + self = undefined + } +} + +function initCheckedButton() { + // When the item becomes visible, restore the value of checkedButton property + // that was stored in the create function. + if (self.visible && checkedBtn !== null) { + self.checkedButton = checkedBtn + checkedBtn = null + } +} + +function buildItems() { + releaseItemConnections() + visibleButtons = [] + for (var i = 0; i < self.children.length; i++) { + var item = self.children[i] + + // set up item connections + clickHandlers[i] = checkExclusive(item) + item.clicked.connect(clickHandlers[i]) + item.visibleChanged.connect(buildItems) + + // update visibleButtons array + if (item.visible) + visibleButtons.push(item) + } + checkOverallExclusivity() + resizeButtons() +} + +function releaseItemConnections() { + for (var i = 0; i < self.children.length; i++) { + self.children[i].clicked.disconnect(clickHandlers[i]) + self.children[i].visibleChanged.disconnect(buildItems) + } + clickHandlers = [] +} + +function checkOverallExclusivity() { + if (!checkingOverallExclusivity && self.exclusive) { + // prevent re-entrant calls + checkingOverallExclusivity = true + if (visibleButtons.length > 0) { + if ((self.checkedButton === null || !self.checkedButton.visible)) + self.checkedButton = visibleButtons[0] + self.checkedButton.checked = true + } + else { + self.checkedButton = null + } + + for (var i = 0; i < self.children.length; i++) { + var item = self.children[i] + // e.g CheckBox can be added to ButtonGroup but doesn't have "checkable" property + if (self.exclusive && item.hasOwnProperty("checkable")) + item.checkable = true + if (item !== self.checkedButton) + item.checked = false + } + checkingOverallExclusivity = false + } +} + +function checkExclusive(item) { + var button = item + return function() { + if (self.exclusive) { + for (var i = 0, ref; (ref = visibleButtons[i]); i++) + ref.checked = button === ref + } + self.checkedButton = button + } +} + +function resizeButtons() { + if (!resizing && visibleButtons.length && self.privateDirection == Qt.Horizontal) { + // if ButtonRow has implicit size, a loop may occur where resizing individual + // Button affects ButtonRow size, which triggers again resizing... + // therefore we prevent re-entrant resizing attempts + resizing = true + var buttonWidth = self.width / visibleButtons.length + for (var i = 0; i < self.children.length; i++) { + self.children[i].width = self.children[i].visible ? buttonWidth : 0 + } + resizing = false + } +} + +// Binding would not work properly if visibleButtons would just be returned, +// it would miss visibility changes. In the long run ButtonGroup.js could be +// refactored. +function visibleItems(item) { + var visibleChildren = [] + for (var i = 0; i < item.children.length; i++) { + if (item.children[i].visible) + visibleChildren.push(item.children[i]) + } + return visibleChildren +}