273 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			273 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
// NoesisGUI - http://www.noesisengine.com
 | 
						|
// Copyright (c) 2013 Noesis Technologies S.L. All Rights Reserved.
 | 
						|
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
 | 
						|
#ifndef __GUI_TEXTBOX_H__
 | 
						|
#define __GUI_TEXTBOX_H__
 | 
						|
 | 
						|
 | 
						|
#include <NsCore/Noesis.h>
 | 
						|
#include <NsGui/BaseTextBox.h>
 | 
						|
#include <NsGui/CompositionUnderline.h>
 | 
						|
#include <NsCore/Vector.h>
 | 
						|
 | 
						|
 | 
						|
namespace Noesis
 | 
						|
{
 | 
						|
 | 
						|
class ScrollViewer;
 | 
						|
class TextBoxTextContainer;
 | 
						|
enum TextAlignment: int32_t;
 | 
						|
enum TextWrapping: int32_t;
 | 
						|
struct Typography;
 | 
						|
 | 
						|
NS_WARNING_PUSH
 | 
						|
NS_MSVC_WARNING_DISABLE(4251 4275)
 | 
						|
 | 
						|
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
/// Represents a control that can be used to display or edit unformatted text.
 | 
						|
///
 | 
						|
/// http://msdn.microsoft.com/en-us/library/system.windows.controls.textbox.aspx
 | 
						|
////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
						|
class NS_GUI_CORE_API TextBox: public BaseTextBox
 | 
						|
{
 | 
						|
public:
 | 
						|
    TextBox();
 | 
						|
    ~TextBox();
 | 
						|
 | 
						|
    /// Gets or sets the insertion position index of the caret
 | 
						|
    //@{
 | 
						|
    int32_t GetCaretIndex() const;
 | 
						|
    void SetCaretIndex(int32_t caretIndex);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets the maximum number of characters that can be manually entered into the text box
 | 
						|
    //@{
 | 
						|
    int32_t GetMaxLength() const;
 | 
						|
    void SetMaxLength(int32_t length);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets the maximum number of visible lines
 | 
						|
    //@{
 | 
						|
    int32_t GetMaxLines() const;
 | 
						|
    void SetMaxLines(int32_t lines);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets the minimum number of visible lines
 | 
						|
    //@{
 | 
						|
    int32_t GetMinLines() const;
 | 
						|
    void SetMinLines(int32_t lines);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets the placeholder text
 | 
						|
    //@{
 | 
						|
    const char* GetPlaceholder() const;
 | 
						|
    void SetPlaceholder(const char* text);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets the content of the current selection in the text box
 | 
						|
    /// \remarks Returned string must be copied becuase it will be invalidated next time you
 | 
						|
    /// interact with the text box
 | 
						|
    /// \prop
 | 
						|
    //@{
 | 
						|
    const char* GetSelectedText() const;
 | 
						|
    void SetSelectedText(const char* text);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets a value indicating the number of characters in the current selection in the
 | 
						|
    /// text box
 | 
						|
    /// \prop
 | 
						|
    //@{
 | 
						|
    int32_t GetSelectionLength() const;
 | 
						|
    void SetSelectionLength(int32_t len);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets a character index for the beginning of the current selection
 | 
						|
    /// \prop
 | 
						|
    //@{
 | 
						|
    int32_t GetSelectionStart() const;
 | 
						|
    void SetSelectionStart(int32_t pos);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Selects all text
 | 
						|
    void SelectAll();
 | 
						|
 | 
						|
    /// Select the text in the given position and length
 | 
						|
    void Select(int32_t start, int32_t length);
 | 
						|
 | 
						|
    /// Clear all the content in the TextBox control
 | 
						|
    void Clear();
 | 
						|
 | 
						|
    /// Return the 0-based character index of the given point.  If there is no character
 | 
						|
    /// at that point and snapToText is false, return -1. Point is specified in TextBox coordinates
 | 
						|
    int32_t GetCharacterIndexFromPoint(Point point, bool snapToText) const;
 | 
						|
 | 
						|
    /// Return the 0-based character index of the first character of lineIndex, or -1 if no layout
 | 
						|
    /// information is available
 | 
						|
    int32_t GetCharacterIndexFromLineIndex(int32_t lineIndex) const;
 | 
						|
 | 
						|
    /// Return the 0-based index of the line containing the given character index, or -1 if no
 | 
						|
    /// layout information is available
 | 
						|
    int32_t GetLineIndexFromCharacterIndex(int32_t charIndex) const;
 | 
						|
 | 
						|
    /// Return the number of characters in the given line, or -1 if no
 | 
						|
    /// layout information is available
 | 
						|
    int32_t GetLineLength(int32_t lineIndex) const;
 | 
						|
 | 
						|
    /// Return the index of the first line that is currently visible in the TextBox, or -1 if no
 | 
						|
    /// layout information is available
 | 
						|
    int32_t GetFirstVisibleLineIndex() const;
 | 
						|
 | 
						|
    /// Return the index of the last line that is currently visible in the TextBox, or -1 if no
 | 
						|
    /// layout information is available
 | 
						|
    int32_t GetLastVisibleLineIndex() const;
 | 
						|
 | 
						|
    /// Scroll the minimal amount necessary to bring the given line into full view.
 | 
						|
    void ScrollToLine(int32_t lineIndex);
 | 
						|
 | 
						|
    /// Gets or sets the horizontal alignment of the contents of the text box
 | 
						|
    //@{
 | 
						|
    TextAlignment GetTextAlignment() const;
 | 
						|
    void SetTextAlignment(TextAlignment textAlign);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets the text contents of the text box
 | 
						|
    //@{
 | 
						|
    const char* GetText() const;
 | 
						|
    void SetText(const char* text);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets or sets how the text box should wrap text
 | 
						|
    //@{
 | 
						|
    TextWrapping GetTextWrapping() const;
 | 
						|
    void SetTextWrapping(TextWrapping textWrap);
 | 
						|
    //@}
 | 
						|
 | 
						|
    /// Gets the visual that renders the text of the TextBox
 | 
						|
    Visual* GetTextView() const;
 | 
						|
 | 
						|
    /// Calculates the bounding box of a range of text
 | 
						|
    Rect GetRangeBounds(uint32_t start, uint32_t end) const;
 | 
						|
 | 
						|
    /// Removes the caret until control gets focused again
 | 
						|
    void HideCaret();
 | 
						|
 | 
						|
    /// Returns the number of IME composition underlines
 | 
						|
    uint32_t GetNumCompositionUnderlines() const;
 | 
						|
 | 
						|
    /// Gets the specified IME composition underline
 | 
						|
    const CompositionUnderline& GetCompositionUnderline(uint32_t index) const;
 | 
						|
 | 
						|
    /// Adds a new IME composition underline
 | 
						|
    void AddCompositionUnderline(const CompositionUnderline& compositionUnderline);
 | 
						|
 | 
						|
    /// Removes all IME composition underlines
 | 
						|
    void ClearCompositionUnderlines();
 | 
						|
 | 
						|
    /// Gets the currently effective typography variations for the text contents of this TextBox
 | 
						|
    /// \prop
 | 
						|
    Typography GetTypography() const;
 | 
						|
 | 
						|
public:
 | 
						|
    /// Dependency properties
 | 
						|
    //@{
 | 
						|
    static const DependencyProperty* MaxLengthProperty;
 | 
						|
    static const DependencyProperty* MaxLinesProperty;
 | 
						|
    static const DependencyProperty* MinLinesProperty;
 | 
						|
    static const DependencyProperty* PlaceholderProperty;
 | 
						|
    static const DependencyProperty* TextAlignmentProperty;
 | 
						|
    static const DependencyProperty* TextProperty;
 | 
						|
    static const DependencyProperty* TextWrappingProperty;
 | 
						|
    //@}
 | 
						|
 | 
						|
protected:
 | 
						|
    // From DependencyObject
 | 
						|
    //@{
 | 
						|
    bool OnPropertyChanged(const DependencyPropertyChangedEventArgs& args) override;
 | 
						|
    //@}
 | 
						|
 | 
						|
    // From UIElement
 | 
						|
    //@{
 | 
						|
    void OnKeyDown(const KeyEventArgs& e) override;
 | 
						|
    void OnTextInput(const TextCompositionEventArgs& e) override;
 | 
						|
    void OnGotKeyboardFocus(const KeyboardFocusChangedEventArgs& e) override;
 | 
						|
    void OnLostKeyboardFocus(const KeyboardFocusChangedEventArgs& e) override;
 | 
						|
    void OnMouseLeftButtonDown(const MouseButtonEventArgs& e) override;
 | 
						|
    void OnMouseLeftButtonUp(const MouseButtonEventArgs& e) override;
 | 
						|
    void OnMouseRightButtonDown(const MouseButtonEventArgs& e) override;
 | 
						|
    void OnMouseMove(const MouseEventArgs& e) override;
 | 
						|
    void OnTouchDown(const TouchEventArgs& e) override;
 | 
						|
    void OnTapped(const TappedEventArgs& e) override;
 | 
						|
    void OnDoubleTapped(const DoubleTappedEventArgs& e) override;
 | 
						|
    //@}
 | 
						|
 | 
						|
    // From FrameworkElement
 | 
						|
    //@{
 | 
						|
    Size MeasureOverride(const Size& availableSize) override;
 | 
						|
    //@}
 | 
						|
 | 
						|
    // From Control
 | 
						|
    //@{
 | 
						|
    void OnTemplateChanged(FrameworkTemplate* oldTemplate, FrameworkElement* oldRoot,
 | 
						|
        FrameworkTemplate* newTemplate, FrameworkElement* newRoot) override;
 | 
						|
    void OnFontFamilyChanged(FontFamily* fontFamily) override;
 | 
						|
    void OnFontSizeChanged(float fontSize) override;
 | 
						|
    void OnFontStretchChanged(FontStretch fontStretch) override;
 | 
						|
    void OnFontStyleChanged(FontStyle fontStyle) override;
 | 
						|
    void OnFontWeightChanged(FontWeight fontWeight) override;
 | 
						|
    void OnForegroundChanged(Brush* brush) override;
 | 
						|
    void OnMouseDoubleClick(const MouseButtonEventArgs& e) override;
 | 
						|
    void OnIsFocusEngagedChanged(bool engaged) override;
 | 
						|
    //@}
 | 
						|
 | 
						|
    // From BaseTextBox
 | 
						|
    //@{
 | 
						|
    void OnCaretBrushChanged(Brush* oldBrush, Brush* newBrush) override;
 | 
						|
    void OnSelectionBrushChanged(Brush* oldBrush, Brush* newBrush) override;
 | 
						|
    void OnSelectionOpacityChanged(float oldOpacity, float newOpacity) override;
 | 
						|
    void OnIsReadOnlyChanged(bool oldValue, bool newValue) override;
 | 
						|
    void DoLineUp(ScrollViewer* scrollViewer) override;
 | 
						|
    void DoLineDown(ScrollViewer* scrollViewer) override;
 | 
						|
    ScrollViewer* GetScrollViewer() const override;
 | 
						|
    //@}
 | 
						|
 | 
						|
private:
 | 
						|
    friend class ComboBox;
 | 
						|
 | 
						|
    void UpdateContentHostHeight();
 | 
						|
    void UpdateContentHostHeight(float padding);
 | 
						|
 | 
						|
    void EnableFocus();
 | 
						|
    void DisableFocus();
 | 
						|
 | 
						|
private:
 | 
						|
    Ptr<FrameworkElement> mContentHost;
 | 
						|
    TextBoxTextContainer* mTextContainer;
 | 
						|
 | 
						|
    typedef Vector<CompositionUnderline> CompositionUnderlines;
 | 
						|
    CompositionUnderlines mCompositionUnderlines;
 | 
						|
 | 
						|
    union
 | 
						|
    {
 | 
						|
        mutable struct
 | 
						|
        {
 | 
						|
            bool mouseDown : 1;
 | 
						|
            bool updateContentHostMinMax : 1;
 | 
						|
        } mFlags;
 | 
						|
 | 
						|
        // To quickly set all flags to 0
 | 
						|
        mutable uint8_t mAllFlags;
 | 
						|
    };
 | 
						|
 | 
						|
    NS_DECLARE_REFLECTION(TextBox, BaseTextBox)
 | 
						|
};
 | 
						|
 | 
						|
NS_WARNING_POP
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
#endif
 |