346 lines
11 KiB
C++
346 lines
11 KiB
C++
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// NoesisGUI - http://www.noesisengine.com
|
|
// Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved.
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#ifndef __GUI_TEXTBLOCK_H__
|
|
#define __GUI_TEXTBLOCK_H__
|
|
|
|
|
|
#include <NsCore/Noesis.h>
|
|
#include <NsCore/ReflectionDeclareEnum.h>
|
|
#include <NsCore/Vector.h>
|
|
#include <NsGui/FrameworkElement.h>
|
|
|
|
|
|
namespace Noesis
|
|
{
|
|
|
|
class FormattedText;
|
|
class Brush;
|
|
class FontFamily;
|
|
class Inline;
|
|
class RectangleGeometry;
|
|
enum LineStackingStrategy: int32_t;
|
|
enum FontStretch: int32_t;
|
|
enum FontStyle: int32_t;
|
|
enum FontWeight: int32_t;
|
|
enum TextAlignment: int32_t;
|
|
enum TextTrimming: int32_t;
|
|
enum TextWrapping: int32_t;
|
|
struct Typography;
|
|
struct NotifyCollectionChangedEventArgs;
|
|
struct Uri;
|
|
|
|
template<class T> class UICollection;
|
|
typedef UICollection<Inline> InlineCollection;
|
|
|
|
NS_WARNING_PUSH
|
|
NS_MSVC_WARNING_DISABLE(4251 4275)
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
/// Provides a lightweight control for displaying small amounts of text content.
|
|
///
|
|
/// A TextBlock can contain a string in its *Text* property or *Inline* flow content elements, such
|
|
/// as Bold, Hyperlink, and InlineUIContainer, in its *Inlines* property.
|
|
///
|
|
/// TextBlock is designed to be lightweight, and is geared specifically at integrating small
|
|
/// portions of flow content into a user interface (UI). TextBlock is optimized for single-line
|
|
/// display, and provides good performance for displaying up to a few lines of content.
|
|
///
|
|
/// Horizontally aligning text within a TextBlock is done with the *TextAlignment* property.
|
|
/// Aligning the TextBlock within the layout of the page is done with the *HorizontalAlignment* and
|
|
/// *VerticalAlignment* properties.
|
|
///
|
|
/// .. code-block:: xml
|
|
///
|
|
/// <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
|
/// <StackPanel>
|
|
/// <TextBlock TextWrapping="Wrap">
|
|
/// <Bold>TextBlock</Bold> is designed to be <Italic>lightweight</Italic>,
|
|
/// and is geared specifically at integrating <Italic>small</Italic> portions
|
|
/// of flow content into a UI.
|
|
/// </TextBlock>
|
|
/// <Button Width="100" Margin="10">Click Me</Button>
|
|
/// <TextBlock TextWrapping="Wrap" Background="DarkSalmon" TextAlignment="Center">
|
|
/// By default, a TextBlock provides no UI beyond simply displaying its contents.
|
|
/// </TextBlock>
|
|
/// <Button Width="100" Margin="10">Click Me</Button>
|
|
/// </StackPanel>
|
|
/// </Page>
|
|
///
|
|
/// http://msdn.microsoft.com/en-us/library/system.windows.controls.textblock.aspx
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
class NS_GUI_CORE_API TextBlock: public FrameworkElement
|
|
{
|
|
public:
|
|
/// Default constructor
|
|
TextBlock();
|
|
|
|
/// Constructor
|
|
TextBlock(const char* text);
|
|
|
|
/// Destructor
|
|
~TextBlock();
|
|
|
|
/// Gets or sets the Brush used to fill the background of content area.
|
|
//@{
|
|
Brush* GetBackground() const;
|
|
void SetBackground(Brush* brush);
|
|
//@}
|
|
|
|
/// Gets or sets the uniform spacing between characters, in units of 1/1000 of an em.
|
|
//@{
|
|
int32_t GetCharacterSpacing() const;
|
|
void SetCharacterSpacing(int32_t spacing);
|
|
//@}
|
|
|
|
/// Gets or sets the preferred top-level font family for the TextBlock.
|
|
//@{
|
|
FontFamily* GetFontFamily() const;
|
|
void SetFontFamily(FontFamily* fontFamily);
|
|
//@}
|
|
|
|
/// Gets or sets the top-level font size for the TextBlock.
|
|
//@{
|
|
float GetFontSize() const;
|
|
void SetFontSize(float size);
|
|
//@}
|
|
|
|
/// Gets or sets the top-level font stretch for the TextBlock.
|
|
//@{
|
|
FontStretch GetFontStretch() const;
|
|
void SetFontStretch(FontStretch stretch);
|
|
//@}
|
|
|
|
/// Gets or sets the top-level font style for the TextBlock.
|
|
//@{
|
|
FontStyle GetFontStyle() const;
|
|
void SetFontStyle(FontStyle style);
|
|
//@}
|
|
|
|
/// Gets or sets the top-level font weight for the TextBlock.
|
|
//@{
|
|
FontWeight GetFontWeight() const;
|
|
void SetFontWeight(FontWeight weight);
|
|
//@}
|
|
|
|
/// Gets or sets the Brush to apply to the text contents of the TextBlock.
|
|
//@{
|
|
Brush* GetForeground() const;
|
|
void SetForeground(Brush* foreground);
|
|
//@}
|
|
|
|
/// Gets an InlineCollection containing the top-level Inline elements that comprise the
|
|
/// contents of the TextBlock
|
|
InlineCollection* GetInlines() const;
|
|
|
|
/// Indicates if this TextBlock contains any inlines (avoids creating Inlines if not needed)
|
|
bool HasInlines() const;
|
|
|
|
/// Gets or sets the height of each line of content
|
|
//@{
|
|
float GetLineHeight() const;
|
|
void SetLineHeight(float value);
|
|
//@}
|
|
|
|
/// Gets or sets the mechanism by which a line box is determined for each line of text
|
|
//@{
|
|
LineStackingStrategy GetLineStackingStrategy() const;
|
|
void SetLineStackingStrategy(LineStackingStrategy value);
|
|
//@}
|
|
|
|
/// Gets or sets the padding inside a control
|
|
//@{
|
|
const Thickness& GetPadding() const;
|
|
void SetPadding(const Thickness& padding);
|
|
//@}
|
|
|
|
/// Gets or sets the Brush used to stroke the text
|
|
//@{
|
|
Brush* GetStroke() const;
|
|
void SetStroke(Brush* stroke);
|
|
//@}
|
|
|
|
/// Gets or sets the width (in pixels) of the text stroke
|
|
//@{
|
|
float GetStrokeThickness() const;
|
|
void SetStrokeThickness(float strokeThickness);
|
|
//@}
|
|
|
|
/// Gets or sets text alignment
|
|
//@{
|
|
TextAlignment GetTextAlignment() const;
|
|
void SetTextAlignment(TextAlignment align);
|
|
//@}
|
|
|
|
/// Gets or sets the text decoration to apply to the text
|
|
//@{
|
|
TextDecorations GetTextDecorations() const;
|
|
void SetTextDecorations(TextDecorations decorations);
|
|
//@}
|
|
|
|
/// Gets or sets text string
|
|
//@{
|
|
const char* GetText() const;
|
|
void SetText(const char* text);
|
|
//@}
|
|
|
|
/// Gets or sets the text trimming behavior to employ when content overflows the content area
|
|
//@{
|
|
TextTrimming GetTextTrimming() const;
|
|
void SetTextTrimming(TextTrimming trimming);
|
|
//@}
|
|
|
|
/// Gets or sets text wrapping
|
|
//@{
|
|
TextWrapping GetTextWrapping() const;
|
|
void SetTextWrapping(TextWrapping textWrap);
|
|
//@}
|
|
|
|
/// Indicates if first inline is generated from Text property
|
|
/// \prop
|
|
bool FirstInlineIsFromText() const;
|
|
|
|
/// Gets the currently effective typography variations for the text contents of this TextBlock
|
|
/// \prop
|
|
Typography GetTypography() const;
|
|
|
|
/// Returns the object used to layout and render text for this TextBlock
|
|
FormattedText* GetFormattedText() const;
|
|
|
|
/// From BaseObject
|
|
//@{
|
|
String ToString() const override;
|
|
//@}
|
|
|
|
public:
|
|
/// Dependency properties
|
|
//@{
|
|
static const DependencyProperty* BackgroundProperty;
|
|
static const DependencyProperty* CharacterSpacingProperty;
|
|
static const DependencyProperty* FontFamilyProperty;
|
|
static const DependencyProperty* FontSizeProperty;
|
|
static const DependencyProperty* FontStretchProperty;
|
|
static const DependencyProperty* FontStyleProperty;
|
|
static const DependencyProperty* FontWeightProperty;
|
|
static const DependencyProperty* ForegroundProperty;
|
|
static const DependencyProperty* LineHeightProperty;
|
|
static const DependencyProperty* LineStackingStrategyProperty;
|
|
static const DependencyProperty* PaddingProperty;
|
|
static const DependencyProperty* StrokeProperty;
|
|
static const DependencyProperty* StrokeThicknessProperty;
|
|
static const DependencyProperty* TextAlignmentProperty;
|
|
static const DependencyProperty* TextDecorationsProperty;
|
|
static const DependencyProperty* TextProperty;
|
|
static const DependencyProperty* TextTrimmingProperty;
|
|
static const DependencyProperty* TextWrappingProperty;
|
|
//@}
|
|
|
|
protected:
|
|
/// From DependencyObject
|
|
//@{
|
|
void OnPostInit() override;
|
|
bool OnPropertyChanged(const DependencyPropertyChangedEventArgs& args) override;
|
|
int32_t OnDestroy() override;
|
|
//@}
|
|
|
|
/// From Visual
|
|
//@{
|
|
void OnConnectToViewChildren() override;
|
|
void OnDisconnectFromViewChildren() override;
|
|
uint32_t GetVisualChildrenCount() const override;
|
|
Visual* GetVisualChild(uint32_t index) const override;
|
|
//@}
|
|
|
|
/// From UIElement
|
|
//@{
|
|
void OnRender(DrawingContext* context) override;
|
|
HitTestResult HitTestCore(const Point& point) override;
|
|
//@}
|
|
|
|
/// From FrameworkElement
|
|
//@{
|
|
void CloneOverride(FrameworkElement* clone, FrameworkTemplate* template_) const override;
|
|
uint32_t GetLogicalChildrenCount() const override;
|
|
Ptr<BaseComponent> GetLogicalChild(uint32_t index) const override;
|
|
Size MeasureOverride(const Size& availableSize) override;
|
|
Size ArrangeOverride(const Size& finalSize) override;
|
|
//@}
|
|
|
|
private:
|
|
void UpdateTypography();
|
|
void UpdateTextRuns();
|
|
void UpdateTextLayout(const Size& finalSize);
|
|
|
|
void InvalidateTypography();
|
|
void InvalidateTextMeasure();
|
|
void InvalidateTextRuns();
|
|
void InvalidateTextLayout();
|
|
|
|
void OnTextChanged(const char* newText);
|
|
|
|
void OnInlinesChanged(BaseComponent* sender,
|
|
const NotifyCollectionChangedEventArgs& args);
|
|
void OnInnerInlinesChanged(BaseComponent* sender,
|
|
const NotifyCollectionChangedEventArgs& args);
|
|
|
|
void ConnectInlines();
|
|
void ConnectInlinesToView();
|
|
void DisconnectInlineContainers();
|
|
|
|
void BuildInlinesInfo();
|
|
void BuildInlinesInfo(InlineCollection* inlines, BaseString& text);
|
|
|
|
void RegisterInlines(InlineCollection* inlines);
|
|
void UnregisterInlines(InlineCollection* inlines, bool removeLogical);
|
|
void RegisterInline(Inline* inline_);
|
|
void UnregisterInline(Inline* inline_);
|
|
|
|
void RegisterInnerInlines(InlineCollection* inlines);
|
|
void UnregisterInnerInlines(InlineCollection* inlines);
|
|
|
|
void OnInlineChanged(BaseComponent* sender, const DependencyPropertyChangedEventArgs& e);
|
|
|
|
void EnsureInlines();
|
|
void EnsureFormattedText();
|
|
|
|
struct InlineInfo;
|
|
const InlineInfo* FindInline(uint32_t position) const;
|
|
|
|
static void OnFontChanged(const Uri&, const char*, FontWeight, FontStretch, FontStyle);
|
|
|
|
private:
|
|
friend struct Typography;
|
|
friend class TextContainer;
|
|
friend class InlineUIContainer;
|
|
friend class TextBlockTest;
|
|
|
|
Ptr<InlineCollection> mInlines;
|
|
Ptr<RectangleGeometry> mBackgroundGeometry;
|
|
Ptr<FormattedText> mFormattedText;
|
|
Size mPreviousConstraint;
|
|
uint32_t mTextFlags;
|
|
|
|
struct InlineInfo
|
|
{
|
|
uint32_t start;
|
|
uint32_t end;
|
|
Inline* inl;
|
|
};
|
|
|
|
typedef Vector<InlineInfo> InlineInfoList;
|
|
InlineInfoList mInlineInfo;
|
|
Vector<uint32_t> mInlineContainers;
|
|
|
|
NS_DECLARE_REFLECTION(TextBlock, FrameworkElement)
|
|
};
|
|
|
|
NS_WARNING_POP
|
|
|
|
}
|
|
|
|
|
|
#endif
|