/*!
* UI development toolkit for HTML5 (OpenUI5)
* (c) Copyright 2009-2018 SAP SE or an SAP affiliate company.
* Licensed under the Apache License, Version 2.0 - see LICENSE.txt.
*/
// Provides control sap.m.PagingButton.
sap.ui.define([
'./Button',
'sap/ui/core/Control',
'sap/ui/core/IconPool',
'./PagingButtonRenderer',
"sap/base/Log"
],
function(Button, Control, IconPool, PagingButtonRenderer, Log) {
"use strict";
/**
* Constructor for a new PagingButton.
*
* @param {string} [sId] ID for the new control, generated automatically if no ID is given
* @param {object} [mSettings] Initial settings for the new control
*
* @class
* Enables users to navigate between items/entities.
* @extends sap.ui.core.Control
*
* @author SAP SE
* @version 1.60.23
*
* @constructor
* @public
* @since 1.30
* @alias sap.m.PagingButton
* @ui5-metamodel This control/element also will be described in the UI5 (legacy) designtime metamodel
*/
var PagingButton = Control.extend("sap.m.PagingButton", {
metadata: {
library: "sap.m",
properties: {
/**
* Determines the total count of items/entities that the control navigates through.
* The minimum number of items/entities is 1.
*/
count: {type: "int", group: "Data", defaultValue: 1},
/**
* Determines the current position in the items/entities that the control navigates through.
* Starting (minimum) number is 1.
*/
position: {type: "int", group: "Data", defaultValue: 1},
/**
* Determines the tooltip of the next button.
* @since 1.36
*/
nextButtonTooltip: {type: "string", group: "Appearance", defaultValue: ""},
/**
* Determines the tooltip of the previous button.
* @since 1.36
*/
previousButtonTooltip: {type: "string", group: "Appearance", defaultValue: ""}
},
aggregations: {
previousButton: {type: "sap.m.Button", multiple: false, visibility: "hidden"},
nextButton: {type: "sap.m.Button", multiple: false, visibility: "hidden"}
},
events: {
/**
* Fired when the current position is changed.
*/
positionChange: {
parameters: {
/**
* The number of the new position.
*/
newPosition: {type: "int"},
/**
* The number of the old position.
*/
oldPosition: {type: "int"}
}
}
}
}
});
var resourceBundle = sap.ui.getCore().getLibraryResourceBundle("sap.m");
PagingButton.prototype.init = function () {
this._attachPressEvents();
};
PagingButton.prototype.onBeforeRendering = function () {
this._enforceValidPosition(this.getPosition());
this._updateButtonState();
};
/**
* Lazily retrieves the nextButton
.
* @private
* @returns {sap.m.Button}
*/
PagingButton.prototype._getNextButton = function () {
if (!this.getAggregation("nextButton")) {
this.setAggregation("nextButton", new Button({
tooltip: this.getNextButtonTooltip() || resourceBundle.getText("PAGINGBUTTON_NEXT"),
icon: IconPool.getIconURI("slim-arrow-down"),
enabled: false,
id: this.getId() + "-nextButton"
}));
}
return this.getAggregation("nextButton");
};
/**
* Lazily retrieves the previousButton
.
* @private
* @returns {sap.m.Button}
*/
PagingButton.prototype._getPreviousButton = function () {
if (!this.getAggregation("previousButton")) {
this.setAggregation("previousButton", new Button({
tooltip: this.getPreviousButtonTooltip() || resourceBundle.getText("PAGINGBUTTON_PREVIOUS"),
icon: IconPool.getIconURI("slim-arrow-up"),
enabled: false,
id: this.getId() + "-previousButton"
}));
}
return this.getAggregation("previousButton");
};
/**
* Attaches the press handlers for both buttons.
* @private
*/
PagingButton.prototype._attachPressEvents = function () {
this._getPreviousButton().attachPress(this._handlePositionChange.bind(this, false));
this._getNextButton().attachPress(this._handlePositionChange.bind(this, true));
};
/**
* Handles the position change.
* @param {boolean} bIncrease Indicates the direction of the change of position
* @returns {sap.m.PagingButton} Reference to the control instance for chaining
*/
PagingButton.prototype._handlePositionChange = function (bIncrease) {
var iOldPosition = this.getPosition(),
iNewPosition = bIncrease ? iOldPosition + 1 : iOldPosition - 1;
this.setPosition(iNewPosition);
this.firePositionChange({newPosition: iNewPosition, oldPosition: iOldPosition});
this._updateButtonState();
return this;
};
/**
* Sets the appropriate state (enabled/disabled) for the buttons based on the total count / position.
* @returns {sap.m.PagingButton} Reference to the control instance for chaining
*/
PagingButton.prototype._updateButtonState = function () {
var iTotalCount = this.getCount(),
iCurrentPosition = this.getPosition();
this._getPreviousButton().setEnabled(iCurrentPosition > 1);
this._getNextButton().setEnabled(iCurrentPosition < iTotalCount);
return this;
};
PagingButton.prototype.setPosition = function (iPosition) {
return this._validateProperty("position", iPosition);
};
PagingButton.prototype.setCount = function (iCount) {
return this._validateProperty("count", iCount);
};
PagingButton.prototype.setPreviousButtonTooltip = function (sTooltip) {
this._getPreviousButton().setTooltip(sTooltip);
return this.setProperty("previousButtonTooltip", sTooltip, true);
};
PagingButton.prototype.setNextButtonTooltip = function (sTooltip) {
this._getNextButton().setTooltip(sTooltip);
return this.setProperty("nextButtonTooltip", sTooltip, true);
};
/**
* Validates both the count
and position
* properties and ensures they are correct.
* @param {string} sProperty The property to be checked
* @param {number} iValue The value to be checked
* @returns {sap.m.PagingButton} Reference to the control instance for chaining
*/
PagingButton.prototype._validateProperty = function (sProperty, iValue) {
if (iValue < 1) {
Log.warning("Property '" + sProperty + "' must be greater or equal to 1", this);
return this;
}
return this.setProperty(sProperty, iValue);
};
/**
* Validates the position property to ensure that it's not set higher than the total count.
* @private
* @param {number} iPosition
* @returns {sap.m.PagingButton} Reference to the control instance for chaining
*/
PagingButton.prototype._enforceValidPosition = function (iPosition) {
var iCount = this.getCount();
if (iPosition > iCount) {
Log.warning("Property position must be less or equal to the total count");
this.setPosition(iCount);
}
return this;
};
return PagingButton;
});