calculator/src/Calculator/Controls/TwoPaneViewCX.h
2020-03-24 11:39:59 -07:00

117 lines
6.3 KiB
C++

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See LICENSE in the project root for license information.
#pragma once
#include "CalcViewModel/Common/Utils.h"
namespace CalculatorApp::Controls
{
ref class TwoPaneViewCX;
public
interface class ITwoPaneViewCX
{
event Windows::Foundation::TypedEventHandler<TwoPaneViewCX ^, Object ^> ^ ModeChanged;
};
// We can't use the TwoPaneView control from the SDK or from Microsoft.UI.Xaml because of a bug with C++ apps.
// (see this issue: https://github.com/microsoft/microsoft-ui-xaml/pull/2045)
// This class is a C++/CX port of the C++/WinRT version of Microsoft.UI.Xaml (commit b3a2e45) which include the patch to fix the crash.
// This fork adds also 4 new properties Pane1MinLength, Pane2MinLength, Pane1MaxLength, Pane2MaxLength
public
ref class TwoPaneViewCX sealed : public Windows::UI::Xaml::Controls::Control, [Windows::Foundation::Metadata::Default] ITwoPaneViewCX
{
enum class ViewMode
{
Pane1Only,
Pane2Only,
LeftRight,
RightLeft,
TopBottom,
BottomTop,
None
};
struct DisplayRegionHelperInfo
{
Microsoft::UI::Xaml::Controls::TwoPaneViewMode Mode = Microsoft::UI::Xaml::Controls::TwoPaneViewMode::SinglePane;
Platform::Array<Windows::Foundation::Rect> ^ Regions;
};
public:
DEPENDENCY_PROPERTY_OWNER(TwoPaneViewCX);
DEPENDENCY_PROPERTY(Windows::UI::Xaml::UIElement ^, Pane1);
DEPENDENCY_PROPERTY(Windows::UI::Xaml::UIElement ^, Pane2);
DEPENDENCY_PROPERTY_WITH_DEFAULT_AND_CALLBACK(
Windows::UI::Xaml::GridLength,
Pane1Length,
Windows::UI::Xaml::GridLengthHelper::FromValueAndType(1, Windows::UI::Xaml::GridUnitType::Auto));
DEPENDENCY_PROPERTY_WITH_DEFAULT_AND_CALLBACK(
Windows::UI::Xaml::GridLength,
Pane2Length,
Windows::UI::Xaml::GridLengthHelper::FromValueAndType(1, Windows::UI::Xaml::GridUnitType::Star));
DEPENDENCY_PROPERTY_WITH_DEFAULT_AND_CALLBACK(double, Pane1MinLength, 0.0);
DEPENDENCY_PROPERTY_WITH_DEFAULT_AND_CALLBACK(double, Pane2MinLength, 0.0);
DEPENDENCY_PROPERTY_WITH_DEFAULT_AND_CALLBACK(double, Pane1MaxLength, std::numeric_limits<double>::max());
DEPENDENCY_PROPERTY_WITH_DEFAULT_AND_CALLBACK(double, Pane2MaxLength, std::numeric_limits<double>::max());
DEPENDENCY_PROPERTY_WITH_DEFAULT_AND_CALLBACK(Microsoft::UI::Xaml::Controls::TwoPaneViewPriority,
PanePriority,
Microsoft::UI::Xaml::Controls::TwoPaneViewPriority::Pane1);
DEPENDENCY_PROPERTY(Microsoft::UI::Xaml::Controls::TwoPaneViewMode, Mode);
DEPENDENCY_PROPERTY_WITH_DEFAULT_AND_CALLBACK(
Microsoft::UI::Xaml::Controls::TwoPaneViewWideModeConfiguration,
WideModeConfiguration,
Microsoft::UI::Xaml::Controls::TwoPaneViewWideModeConfiguration::LeftRight);
DEPENDENCY_PROPERTY_WITH_DEFAULT_AND_CALLBACK(
Microsoft::UI::Xaml::Controls::TwoPaneViewTallModeConfiguration,
TallModeConfiguration,
Microsoft::UI::Xaml::Controls::TwoPaneViewTallModeConfiguration::TopBottom);
DEPENDENCY_PROPERTY_WITH_DEFAULT_AND_CALLBACK(double, MinWideModeWidth, 641);
DEPENDENCY_PROPERTY_WITH_DEFAULT_AND_CALLBACK(double, MinTallModeHeight, 641);
TwoPaneViewCX();
virtual ~TwoPaneViewCX();
void OnApplyTemplate() override;
virtual event Windows::Foundation::TypedEventHandler<TwoPaneViewCX ^, Object ^> ^ ModeChanged;
private:
void UpdateRowsColumns(ViewMode newMode, DisplayRegionHelperInfo info, Windows::Foundation::Rect rcControl);
void UpdateMode();
bool IsInMultipleRegions(DisplayRegionHelperInfo info, Windows::Foundation::Rect rcControl);
void SetScrollViewerProperties(Platform::String ^ scrollViewerName);
Windows::Foundation::Rect GetControlRect();
DisplayRegionHelperInfo GetDisplayRegionHelperInfo();
void OnSizeChanged(Platform::Object ^ sender, Windows::UI::Xaml::SizeChangedEventArgs ^ e);
void OnWindowSizeChanged(Platform::Object ^ sender, Windows::UI::Core::WindowSizeChangedEventArgs ^ e);
void OnPane1LengthPropertyChanged(Windows::UI::Xaml::GridLength oldValue, Windows::UI::Xaml::GridLength newValue);
void OnPane2LengthPropertyChanged(Windows::UI::Xaml::GridLength oldValue, Windows::UI::Xaml::GridLength newValue);
void OnPane1MinLengthPropertyChanged(double oldValue, double newValue);
void OnPane2MinLengthPropertyChanged(double oldValue, double newValue);
void OnPane1MaxLengthPropertyChanged(double oldValue, double newValue);
void OnPane2MaxLengthPropertyChanged(double oldValue, double newValue);
void
OnPanePriorityPropertyChanged(Microsoft::UI::Xaml::Controls::TwoPaneViewPriority oldValue, Microsoft::UI::Xaml::Controls::TwoPaneViewPriority newValue);
void OnMinTallModeHeightPropertyChanged(double oldValue, double newValue);
void OnMinWideModeWidthPropertyChanged(double oldValue, double newValue);
void OnWideModeConfigurationPropertyChanged(
Microsoft::UI::Xaml::Controls::TwoPaneViewWideModeConfiguration oldValue,
Microsoft::UI::Xaml::Controls::TwoPaneViewWideModeConfiguration newValue);
void OnTallModeConfigurationPropertyChanged(
Microsoft::UI::Xaml::Controls::TwoPaneViewTallModeConfiguration oldValue,
Microsoft::UI::Xaml::Controls::TwoPaneViewTallModeConfiguration newValue);
void OnScrollViewerLoaded(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e);
private:
Windows::UI::Xaml::Controls::ColumnDefinition ^ m_columnLeft;
Windows::UI::Xaml::Controls::ColumnDefinition ^ m_columnMiddle;
Windows::UI::Xaml::Controls::ColumnDefinition ^ m_columnRight;
Windows::UI::Xaml::Controls::RowDefinition ^ m_rowTop;
Windows::UI::Xaml::Controls::RowDefinition ^ m_rowMiddle;
Windows::UI::Xaml::Controls::RowDefinition ^ m_rowBottom;
Windows::Foundation::EventRegistrationToken m_windowSizeChangedToken;
ViewMode m_currentMode{ ViewMode::None };
bool m_loaded{ false };
};
}