подход правильный (диалог внутри onChange
), но вам нужно внести некоторые изменения. Когда SAPUI5 вызывает метод onChange, значение уже записывается внутри вашего элемента управления, поэтому oEvent.stopPropagation();
вообще ничего не делает.
Что вы можете сделать, это использовать метод ComboBox
setSelectedItem(null)
, который должен сбросить текущий выбор (отменяя выбор пользователя).
ОБНОВЛЕНИЕ: Я обновил код, чтобы удовлетворить ваш запрос.
__selectedItem: null,
onChange: function (oEvent) {
var that = this;
var source = oEvent.getSource();
var selectedItem = oEvent.getSource().getSelectedItem();
MessageBox.show("Are you sure you want to do that?", {
icon: MessageBox.Icon.Information,
title: "Info",
actions: [MessageBox.Action.YES, MessageBox.Action.NO],
defaultAction: MessageBox.Action.NO,
onClose: function (sButton) {
if (sButton === MessageBox.Action.YES) {
//execute my logic in here => that works
that.__selectedItem = selectedItem;
} else {
source.setSelectedItem( that.__selectedItem );
}
}
});
}
AddMonths_OracleStyle метода делает то, в чем Вы нуждаетесь.
Возможно, Вы хотели бы заменить IsLeapYear и GetDaysInMonth к некоторым методам библиотекаря.
#include <ctime>
#include <assert.h>
bool IsLeapYear(int year)
{
if (year % 4 != 0) return false;
if (year % 400 == 0) return true;
if (year % 100 == 0) return false;
return true;
}
int daysInMonths[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int GetDaysInMonth(int year, int month)
{
assert(month >= 0);
assert(month < 12);
int days = daysInMonths[month];
if (month == 1 && IsLeapYear(year)) // February of a leap year
days += 1;
return days;
}
tm AddMonths_OracleStyle(const tm &d, int months)
{
bool isLastDayInMonth = d.tm_mday == GetDaysInMonth(d.tm_year, d.tm_mon);
int year = d.tm_year + months / 12;
int month = d.tm_mon + months % 12;
if (month > 11)
{
year += 1;
month -= 12;
}
int day;
if (isLastDayInMonth)
day = GetDaysInMonth(year, month); // Last day of month maps to last day of result month
else
day = std::min(d.tm_mday, GetDaysInMonth(year, month));
tm result = tm();
result.tm_year = year;
result.tm_mon = month;
result.tm_mday = day;
result.tm_hour = d.tm_hour;
result.tm_min = d.tm_min;
result.tm_sec = d.tm_sec;
return result;
}
time_t AddMonths_OracleStyle(const time_t &date, int months)
{
tm d = tm();
localtime_s(&d, &date);
tm result = AddMonths_OracleStyle(d, months);
return mktime(&result);
}
Преобразовать time_t
кому: struct tm
, добавьте X к месяцу, добавьте месяцы> 12 к годам, преобразуйте назад. TM tm_mon является интервалом, добавляя 32000 +, месяцы не должны быть проблемой.
[редактирование] Вы могли бы найти, что соответствие Oracle хитро, после того как Вы добираетесь до более твердых случаев, как добавление 12 месяцев до 29.02.2008. И 03.01.2009 и 28.02.2008 разумны.
Можно использовать Повышение. GregorianDate для этого.
Строго говоря, определите месяц путем добавления корректного date_duration
, и затем используйте end_of_month_day()
из алгоритмов даты