blob: f45a8aed1780be8894e35149ed9bbd5aac54c022 [file] [log] [blame]
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#ifndef _FDE_TXTEDTBLOCK_H
#define _FDE_TXTEDTBLOCK_H
#ifdef FDE_USEFORMATBLOCK
class CFDE_TxtEdtEngine;
class CFDE_TxtEdtBlock;
class CFDE_TxtEdtFieldFormatParser;
class CFDE_TxtEdtField;
class CFDE_TxtEdtField_Integer;
class CFDE_TxtEdtField_Float;
class CFDE_TxtEdtField_Password;
class CFDE_TxtEdtField_String;
class CFDE_TxtEdtField_Fixed;
#define FDE_FORMAT_EDIT_FIELD_HADERSIZE 3
#define FDE_FORMAT_EDIT_FIELD_TAILSIZE 1
enum FDE_FORMAT_FIELD_INSERT_RET {
FDE_FORMAT_FIELD_INSERT_RET_S_NORMAL = 0,
FDE_FORMAT_FIELD_INSERT_RET_S_FULL,
FDE_FORMAT_FIELD_INSERT_RET_F_FULL,
FDE_FORMAT_FIELD_INSERT_RET_F_INVALIDATE,
};
enum FDE_FORMAT_FIELD_DELETE_RET {
FDE_FORMAT_FIELD_DELETE_RET_S = 0,
FDE_FORMAT_FIELD_DELETE_RET_F_INVALIDATE,
FDE_FORMAT_FIELD_DELETE_RET_F_BOUNDARY,
};
enum FDE_FORMAT_FIELD_VALIDATE_RET {
FDE_FORMAT_FIELD_VALIDATE_S = 0,
FDE_FORMAT_FIELD_VALIDATE_F_FULL,
FDE_FORMAT_FIELD_VALIDATE_F_INVALIDATE,
};
enum FDE_FORMAT_CARET_DIRECTION {
FDE_FORMAT_CARET_FORWARD,
FDE_FORMAT_CARET_MIDDLE,
FDE_FORMAT_CARET_BACKWARD
};
class CFDE_TxtEdtBlock {
public:
CFDE_TxtEdtBlock(CFDE_TxtEdtEngine* pEngine,
const CFX_WideString& wsBlock,
int32_t nPosition);
~CFDE_TxtEdtBlock();
void GetDisplayText(CFX_WideString& wsDisplay);
int32_t GetLength() const;
void GetBlockText(CFX_WideString& wsBlock);
int32_t CountField() const;
void GetFieldText(int32_t nIndex, CFX_WideString& wsField);
int32_t GetFieldTextLength() const;
int32_t GetPos() const;
void GetRealText(CFX_WideString& wsText) const;
void Backup();
void Restore();
void SetIndex(int32_t nIndex) { m_nIndex = nIndex; }
int32_t GetIndex() const { return m_nIndex; }
private:
CFDE_TxtEdtEngine* m_pEngine;
int32_t m_nDisplayLength;
int32_t m_nIndex;
int32_t m_nPosition;
CFX_ArrayTemplate<CFDE_TxtEdtField*> m_FieldArr;
CFX_ArrayTemplate<CFDE_TxtEdtField*> m_EditFieldArr;
};
class CFDE_TxtEdtFieldFormatParser {
public:
CFDE_TxtEdtFieldFormatParser();
~CFDE_TxtEdtFieldFormatParser();
FX_BOOL Parse(const CFX_WideString& wsFormat);
int32_t CountItems() const;
void GetItem(int32_t nIndex,
CFX_WideString& wsKey,
CFX_WideString& wsValue) const;
private:
typedef struct {
int32_t nKeyStart;
int32_t nKeyCount;
int32_t nValStart;
int32_t nValCount;
} FDE_TXTEDTFORMATITEM, *FDE_LPTXTEDTFORMATITEM;
CFX_WideString m_wsFormat;
CFX_ArrayTemplate<FDE_LPTXTEDTFORMATITEM> m_ItemArr;
};
class CFDE_TxtEdtField {
public:
static CFDE_TxtEdtField* Create(const CFX_WideString& wsField,
int32_t nIndex,
CFDE_TxtEdtBlock* pBlock);
virtual void Release();
virtual int32_t Insert(int32_t nIndex,
const CFX_WideString& wsIns,
int32_t& nCaret,
FX_BOOL& bBefore);
virtual int32_t Delete(int32_t nIndex,
int32_t nCount,
CFX_WideString& wsDel,
int32_t& nCaret,
FX_BOOL& bBefore);
virtual int32_t Replace(int32_t nIndex,
int32_t nCount,
const CFX_WideString& wsIns,
CFX_WideString& wsDel,
int32_t& nCaret,
FX_BOOL& bBefore);
virtual void GetDisplayText(CFX_WideString& wsDisplay);
virtual int32_t GetDisplayLength();
virtual void GetFieldText(CFX_WideString& wsField);
virtual int32_t GetFieldTextLength() const;
virtual int32_t GetRealIndex(int32_t nIndex) const;
virtual int32_t NormalizeCaretPos(
int32_t nIndex,
FDE_FORMAT_CARET_DIRECTION eDirection = FDE_FORMAT_CARET_MIDDLE) const;
virtual FX_BOOL GetEditableRange(int32_t& nBgn, int32_t& nEnd) const;
virtual void Backup();
virtual void Restore();
virtual FX_BOOL IsFix() const { return FALSE; }
void SetIndex(int32_t nIndex) { m_nIndex = nIndex; }
int32_t GetIndex() const { return m_nIndex; }
int32_t GetBlockIndex() const { return m_pBlock->GetIndex(); }
protected:
CFDE_TxtEdtField(int32_t nIndex, CFDE_TxtEdtBlock* pBlock);
virtual ~CFDE_TxtEdtField() {}
virtual int32_t Validate(const CFX_WideString& wsText) const;
virtual void GetNormalizedFieldText(CFX_WideString& wsField) const;
int32_t m_nLength;
CFX_WideString m_wsField;
CFX_WideString m_wsBackup;
FX_WCHAR m_wcFill;
FX_BOOL m_bReserveSpace;
FX_BOOL m_bLeftAlignment;
int32_t m_nIndex;
CFDE_TxtEdtBlock* m_pBlock;
};
class CFDE_TxtEdtField_Integer : public CFDE_TxtEdtField {
public:
CFDE_TxtEdtField_Integer(const CFX_WideString& wsField,
int32_t nIndex,
CFDE_TxtEdtBlock* pBlock);
protected:
virtual ~CFDE_TxtEdtField_Integer() {}
virtual int32_t Validate(const CFX_WideString& wsText) const;
private:
FX_BOOL m_bSign;
};
class CFDE_TxtEdtField_Float : public CFDE_TxtEdtField {
public:
CFDE_TxtEdtField_Float(const CFX_WideString& wsField,
int32_t nIndex,
CFDE_TxtEdtBlock* pBlock);
protected:
virtual ~CFDE_TxtEdtField_Float() {}
virtual int32_t Validate(const CFX_WideString& wsText) const;
private:
FX_BOOL m_bSigned;
int32_t m_nIntPartlength;
int32_t m_nDecPartLength;
};
class CFDE_TxtEdtField_Password : public CFDE_TxtEdtField {
public:
CFDE_TxtEdtField_Password(const CFX_WideString& wsField,
int32_t nIndex,
CFDE_TxtEdtBlock* pBlock);
protected:
virtual ~CFDE_TxtEdtField_Password() {}
virtual void GetNormalizedFieldText(CFX_WideString& wsField) const;
private:
FX_WCHAR m_wcAlias;
};
class CFDE_TxtEdtField_String : public CFDE_TxtEdtField {
public:
CFDE_TxtEdtField_String(const CFX_WideString& wsField,
int32_t nIndex,
CFDE_TxtEdtBlock* pBlock);
protected:
virtual ~CFDE_TxtEdtField_String() {}
};
class CFDE_TxtEdtField_Fixed : public CFDE_TxtEdtField {
public:
CFDE_TxtEdtField_Fixed(const CFX_WideString& wsField,
int32_t nIndex,
CFDE_TxtEdtBlock* pBlock);
virtual int32_t Insert(int32_t nIndex,
const CFX_WideString& wsIns,
int32_t& nCaret,
FX_BOOL& bBefore) {
return FALSE;
}
virtual int32_t Delete(int32_t nIndex,
int32_t nCount,
CFX_WideString& wsDel,
int32_t& nCaret,
FX_BOOL& bBefore) {
return FALSE;
}
virtual int32_t Replace(int32_t nIndex,
int32_t nCount,
const CFX_WideString& wsIns,
CFX_WideString& wsDel,
int32_t& nCaret,
FX_BOOL& bBefore) {
return FALSE;
}
virtual void GetDisplayText(CFX_WideString& wsDisplay);
virtual int32_t NormalizeCaretPos(
int32_t nIndex,
FDE_FORMAT_CARET_DIRECTION eDirection) const;
virtual FX_BOOL GetEditableRange(int32_t& nBgn, int32_t& nEnd) const {
return FALSE;
}
virtual void Backup() {}
virtual void Restore() {}
virtual FX_BOOL IsFix() const { return TRUE; }
protected:
virtual ~CFDE_TxtEdtField_Fixed() {}
};
#endif
#endif