Before this change, the pchs for CalcViewModel and Calculator project referenced project headers. If those project headers (or any of their dependencies) were to change, then the pch would be recompiled, slowing local build times. By removing references to project headers, the pch will be compiled once and is resilient to changes in the project. Now that project headers are explicit about their dependencies, when there is a change to a project header only the translation units referencing the modified header will need to be rebuilt. - Manually tested by ensuring Calculator project builds locally. @Microsoft/calculator-team
227 lines
8.8 KiB
C++
227 lines
8.8 KiB
C++
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// Licensed under the MIT License.
|
|
|
|
//
|
|
// DateCalculator.xaml.cpp
|
|
// Implementation of the DateCalculator class
|
|
//
|
|
|
|
#include "pch.h"
|
|
#include "DateCalculator.xaml.h"
|
|
#include "CalcViewModel/Common/TraceLogger.h"
|
|
#include "CalcViewModel/Common/CopyPasteManager.h"
|
|
#include "CalcViewModel/Common/LocalizationSettings.h"
|
|
#include "CalcViewModel/DateCalculatorViewModel.h"
|
|
|
|
using namespace CalculatorApp;
|
|
using namespace CalculatorApp::Common;
|
|
using namespace CalculatorApp::ViewModel;
|
|
|
|
using namespace Platform;
|
|
using namespace Platform::Collections;
|
|
using namespace Windows::Foundation;
|
|
using namespace Windows::Foundation::Collections;
|
|
using namespace Windows::Globalization;
|
|
using namespace Windows::Globalization::DateTimeFormatting;
|
|
using namespace Windows::System::UserProfile;
|
|
using namespace Windows::UI::Core;
|
|
using namespace Windows::UI::ViewManagement;
|
|
using namespace Windows::UI::Xaml;
|
|
using namespace Windows::UI::Xaml::Automation;
|
|
using namespace Windows::UI::Xaml::Automation::Peers;
|
|
using namespace Windows::UI::Xaml::Controls;
|
|
using namespace Windows::UI::Xaml::Controls::Primitives;
|
|
using namespace Windows::UI::Xaml::Data;
|
|
using namespace Windows::UI::Xaml::Input;
|
|
using namespace Windows::UI::Xaml::Media;
|
|
using namespace Windows::UI::Xaml::Navigation;
|
|
|
|
// The User Control item template is documented at http://go.microsoft.com/fwlink/?LinkId=234236
|
|
|
|
DateCalculator::DateCalculator()
|
|
{
|
|
InitializeComponent();
|
|
|
|
const auto& localizationSettings = LocalizationSettings::GetInstance();
|
|
|
|
// Set Calendar Identifier
|
|
DateDiff_FromDate->CalendarIdentifier = localizationSettings.GetCalendarIdentifier();
|
|
DateDiff_ToDate->CalendarIdentifier = localizationSettings.GetCalendarIdentifier();;
|
|
|
|
// Setting the FirstDayofWeek
|
|
DateDiff_FromDate->FirstDayOfWeek = localizationSettings.GetFirstDayOfWeek();
|
|
DateDiff_ToDate->FirstDayOfWeek = localizationSettings.GetFirstDayOfWeek();
|
|
|
|
// Setting the Language explicitly is not required,
|
|
// this is a workaround for the bug in the control due to which
|
|
// the displayed date is incorrect for non Gregorian Calendar Systems
|
|
// The displayed date doesn't honor the shortdate format, on setting the Language the format is refreshed
|
|
DateDiff_FromDate->Language = localizationSettings.GetLocaleName();
|
|
DateDiff_ToDate->Language = localizationSettings.GetLocaleName();
|
|
|
|
// Set Min and Max Dates according to the Gregorian Calendar(1601 & 9999)
|
|
auto calendar = ref new Calendar();
|
|
auto today = calendar->GetDateTime();
|
|
|
|
calendar->ChangeCalendarSystem(CalendarIdentifiers::Gregorian);
|
|
calendar->Day = 1;
|
|
calendar->Month = 1;
|
|
calendar->Year = c_minYear;
|
|
auto minYear = calendar->GetDateTime(); // 1st January, 1601
|
|
DateDiff_FromDate->MinDate = minYear;
|
|
DateDiff_ToDate->MinDate = minYear;
|
|
|
|
calendar->Day = 31;
|
|
calendar->Month = 12;
|
|
calendar->Year = c_maxYear;
|
|
auto maxYear = calendar->GetDateTime(); // 31st December, 9878
|
|
DateDiff_FromDate->MaxDate = maxYear;
|
|
DateDiff_ToDate->MaxDate = maxYear;
|
|
|
|
// Set the PlaceHolderText for CalendarDatePicker
|
|
DateTimeFormatter^ dateTimeFormatter = LocalizationService::GetRegionalSettingsAwareDateTimeFormatter(
|
|
L"day month year",
|
|
localizationSettings.GetCalendarIdentifier(),
|
|
ClockIdentifiers::TwentyFourHour); // Clock Identifier is not used
|
|
|
|
DateDiff_FromDate->DateFormat = L"day month year";
|
|
DateDiff_ToDate->DateFormat = L"day month year";
|
|
|
|
auto placeholderText = dateTimeFormatter->Format(today);
|
|
|
|
DateDiff_FromDate->PlaceholderText = placeholderText;
|
|
DateDiff_ToDate->PlaceholderText = placeholderText;
|
|
|
|
CopyMenuItem->Text = AppResourceProvider::GetInstance().GetResourceString(L"copyMenuItem");
|
|
m_dateCalcOptionChangedEventToken = DateCalculationOption->SelectionChanged += ref new SelectionChangedEventHandler(this, &DateCalculator::DateCalcOption_Changed);
|
|
}
|
|
|
|
void DateCalculator::FromDate_DateChanged(_In_ CalendarDatePicker^ sender, _In_ CalendarDatePickerDateChangedEventArgs^ e)
|
|
{
|
|
if (e->NewDate != nullptr)
|
|
{
|
|
auto dateCalcViewModel = safe_cast<DateCalculatorViewModel^>(this->DataContext);
|
|
dateCalcViewModel->FromDate = e->NewDate->Value;
|
|
TraceLogger::GetInstance().LogDateDifferenceModeUsed(ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread()));
|
|
}
|
|
else
|
|
{
|
|
ReselectCalendarDate(sender, e->OldDate->Value);
|
|
}
|
|
}
|
|
|
|
void DateCalculator::ToDate_DateChanged(_In_ CalendarDatePicker^ sender, _In_ CalendarDatePickerDateChangedEventArgs^ e)
|
|
{
|
|
if (e->NewDate != nullptr)
|
|
{
|
|
auto dateCalcViewModel = safe_cast<DateCalculatorViewModel^>(this->DataContext);
|
|
dateCalcViewModel->ToDate = e->NewDate->Value;
|
|
TraceLogger::GetInstance().LogDateDifferenceModeUsed(ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread()));
|
|
}
|
|
else
|
|
{
|
|
ReselectCalendarDate(sender, e->OldDate->Value);
|
|
}
|
|
}
|
|
|
|
void DateCalculator::AddSubtract_DateChanged(_In_ CalendarDatePicker^ sender, _In_ CalendarDatePickerDateChangedEventArgs^ e)
|
|
{
|
|
if (e->NewDate != nullptr)
|
|
{
|
|
auto dateCalcViewModel = safe_cast<DateCalculatorViewModel^>(this->DataContext);
|
|
dateCalcViewModel->StartDate = e->NewDate->Value;
|
|
TraceLogger::GetInstance().LogDateAddSubtractModeUsed(ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread()), dateCalcViewModel->IsAddMode);
|
|
}
|
|
else
|
|
{
|
|
ReselectCalendarDate(sender, e->OldDate->Value);
|
|
}
|
|
}
|
|
|
|
void CalculatorApp::DateCalculator::OffsetValue_Changed(_In_ Platform::Object^ sender, _In_ SelectionChangedEventArgs^ e)
|
|
{
|
|
auto dateCalcViewModel = safe_cast<DateCalculatorViewModel^>(this->DataContext);
|
|
TraceLogger::GetInstance().LogDateAddSubtractModeUsed(ApplicationView::GetApplicationViewIdForWindow(CoreWindow::GetForCurrentThread()), dateCalcViewModel->IsAddMode);
|
|
}
|
|
|
|
void DateCalculator::OnCopyMenuItemClicked(_In_ Object^ sender, _In_ RoutedEventArgs^ e)
|
|
{
|
|
auto calcResult = safe_cast<TextBlock^>(ResultsContextMenu->Target);
|
|
|
|
CopyPasteManager::CopyToClipboard(calcResult->Text);
|
|
}
|
|
|
|
void CalculatorApp::DateCalculator::OnLoaded(_In_ Platform::Object ^ sender, _In_ Windows::UI::Xaml::RoutedEventArgs ^ e)
|
|
{
|
|
}
|
|
|
|
void DateCalculator::CloseCalendarFlyout()
|
|
{
|
|
if (DateDiff_FromDate->IsCalendarOpen)
|
|
{
|
|
DateDiff_FromDate->IsCalendarOpen = false;
|
|
}
|
|
|
|
if (DateDiff_ToDate->IsCalendarOpen)
|
|
{
|
|
DateDiff_ToDate->IsCalendarOpen = false;
|
|
}
|
|
|
|
if ((AddSubtract_FromDate != nullptr) && (AddSubtract_FromDate->IsCalendarOpen))
|
|
{
|
|
AddSubtract_FromDate->IsCalendarOpen = false;
|
|
}
|
|
}
|
|
|
|
void DateCalculator::SetDefaultFocus()
|
|
{
|
|
DateCalculationOption->Focus(::FocusState::Programmatic);
|
|
}
|
|
|
|
void DateCalculator::DateCalcOption_Changed(_In_ Platform::Object^ sender, _In_ Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e)
|
|
{
|
|
FindName("AddSubtractDateGrid");
|
|
DateCalculationOption->SelectionChanged -= m_dateCalcOptionChangedEventToken;
|
|
}
|
|
|
|
void CalculatorApp::DateCalculator::AddSubtractDateGrid_Loaded(_In_ Platform::Object^ sender, _In_ Windows::UI::Xaml::RoutedEventArgs^ e)
|
|
{
|
|
const auto& localizationSettings = LocalizationSettings::GetInstance();
|
|
|
|
AddSubtract_FromDate->PlaceholderText = DateDiff_FromDate->PlaceholderText;
|
|
AddSubtract_FromDate->CalendarIdentifier = localizationSettings.GetCalendarIdentifier();
|
|
AddSubtract_FromDate->FirstDayOfWeek = localizationSettings.GetFirstDayOfWeek();
|
|
AddSubtract_FromDate->Language = localizationSettings.GetLocaleName();
|
|
|
|
AddSubtract_FromDate->MinDate = DateDiff_FromDate->MinDate;
|
|
AddSubtract_FromDate->MaxDate = DateDiff_FromDate->MaxDate;
|
|
AddSubtract_FromDate->DateFormat = L"day month year";
|
|
}
|
|
|
|
void DateCalculator::ReselectCalendarDate(_In_ Windows::UI::Xaml::Controls::CalendarDatePicker^ calendarDatePicker, Windows::Foundation::DateTime dateTime)
|
|
{
|
|
// Reselect the unselected Date
|
|
calendarDatePicker->Date = ref new Box<DateTime>(dateTime);
|
|
|
|
// Dismiss the Calendar flyout
|
|
calendarDatePicker->IsCalendarOpen = false;
|
|
}
|
|
|
|
void DateCalculator::OffsetDropDownClosed(_In_ Object^ sender, _In_ Object^ e)
|
|
{
|
|
RaiseLiveRegionChangedAutomationEvent(false);
|
|
}
|
|
|
|
void DateCalculator::CalendarFlyoutClosed(_In_ Object^ sender, _In_ Object^ e)
|
|
{
|
|
auto dateCalcViewModel = safe_cast<DateCalculatorViewModel^>(this->DataContext);
|
|
RaiseLiveRegionChangedAutomationEvent(dateCalcViewModel->IsDateDiffMode);
|
|
}
|
|
|
|
void DateCalculator::RaiseLiveRegionChangedAutomationEvent(_In_ bool isDateDiffMode)
|
|
{
|
|
TextBlock^ resultTextBlock = (isDateDiffMode ? DateDiffAllUnitsResultLabel : DateResultLabel);
|
|
String^ automationName = AutomationProperties::GetName(resultTextBlock);
|
|
TextBlockAutomationPeer::FromElement(resultTextBlock)->RaiseAutomationEvent(AutomationEvents::LiveRegionChanged);
|
|
}
|