summaryrefslogtreecommitdiffstats
path: root/xbmc/guilib/GUIEditControl.h
blob: 9f44f8ce2b7d84a4fcdfe88815b0e9ef8b708a3a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
 *  Copyright (C) 2005-2018 Team Kodi
 *  This file is part of Kodi - https://kodi.tv
 *
 *  SPDX-License-Identifier: GPL-2.0-or-later
 *  See LICENSES/README.md for more information.
 */

#pragma once

/*!
\file GUIEditControl.h
\brief
*/

#include "GUIButtonControl.h"
#include "utils/Stopwatch.h"
#include "utils/StringValidation.h"
#include "utils/Variant.h"

/*!
 \ingroup controls
 \brief
 */

class CGUIEditControl : public CGUIButtonControl
{
public:
  enum INPUT_TYPE {
                    INPUT_TYPE_READONLY = -1,
                    INPUT_TYPE_TEXT = 0,
                    INPUT_TYPE_NUMBER,
                    INPUT_TYPE_SECONDS,
                    INPUT_TYPE_TIME,
                    INPUT_TYPE_DATE,
                    INPUT_TYPE_IPADDRESS,
                    INPUT_TYPE_PASSWORD,
                    INPUT_TYPE_PASSWORD_MD5,
                    INPUT_TYPE_SEARCH,
                    INPUT_TYPE_FILTER,
                    INPUT_TYPE_PASSWORD_NUMBER_VERIFY_NEW
                  };

  CGUIEditControl(int parentID, int controlID, float posX, float posY,
                  float width, float height, const CTextureInfo &textureFocus, const CTextureInfo &textureNoFocus,
                  const CLabelInfo& labelInfo, const std::string &text);
  explicit CGUIEditControl(const CGUIButtonControl &button);
  ~CGUIEditControl(void) override;
  CGUIEditControl* Clone() const override { return new CGUIEditControl(*this); }

  bool OnMessage(CGUIMessage &message) override;
  bool OnAction(const CAction &action) override;
  void OnClick() override;

  void SetLabel(const std::string &text) override;
  void SetLabel2(const std::string &text) override;
  void SetHint(const KODI::GUILIB::GUIINFO::CGUIInfoLabel& hint);

  std::string GetLabel2() const override;

  unsigned int GetCursorPosition() const;
  void SetCursorPosition(unsigned int iPosition);

  void SetInputType(INPUT_TYPE type, const CVariant& heading);

  void SetTextChangeActions(const CGUIAction& textChangeActions)
  {
    m_textChangeActions = textChangeActions;
  }

  bool HasTextChangeActions() const { return m_textChangeActions.HasActionsMeetingCondition(); }

  virtual bool HasInvalidInput() const { return m_invalidInput; }
  virtual void SetInputValidation(StringValidation::Validator inputValidator, void *data = NULL);

protected:
  void SetFocus(bool focus) override;
  void ProcessText(unsigned int currentTime) override;
  void RenderText() override;
  CGUILabel::COLOR GetTextColor() const override;
  std::wstring GetDisplayedText() const;
  std::string GetDescriptionByIndex(int index) const override;
  bool SetStyledText(const std::wstring &text);
  void RecalcLabelPosition();
  void ValidateCursor();
  void UpdateText(bool sendUpdate = true);
  void OnPasteClipboard();
  void OnSMSCharacter(unsigned int key);
  void DefaultConstructor();

  virtual bool ValidateInput(const std::wstring &data) const;
  void ValidateInput();

  /*! \brief Clear out the current text input if it's an MD5 password.
   \return true if the password is cleared, false otherwise.
   */
  bool ClearMD5();

  std::wstring m_text2;
  std::string  m_text;
  KODI::GUILIB::GUIINFO::CGUIInfoLabel m_hintInfo;
  float m_textOffset;
  float m_textWidth;
  CRect m_clipRect; ///< clipping rect for the second label

  static const int spaceWidth = 5;

  unsigned int m_cursorPos;
  unsigned int m_cursorBlink;

  std::string m_inputHeading;
  INPUT_TYPE m_inputType;
  bool m_isMD5;

  CGUIAction m_textChangeActions;

  bool m_invalidInput;
  StringValidation::Validator m_inputValidator;
  void *m_inputValidatorData;

  unsigned int m_smsKeyIndex;
  unsigned int m_smsLastKey;
  CStopWatch   m_smsTimer;

  std::wstring m_edit;
  int          m_editOffset;
  int          m_editLength;

  static const char*        smsLetters[10];
  static const unsigned int smsDelay;
};