// 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

#include "../../include/formfiller/FormFiller.h"
#include "../../include/formfiller/FFL_FormFiller.h"
#include "../../include/formfiller/FFL_IFormFiller.h"
#include "../../include/formfiller/FFL_CBA_Fontmap.h"
#include "../../include/formfiller/FFL_ComboBox.h"


/* ------------------------------- CFFL_ComboBox ------------------------------- */

CFFL_ComboBox::CFFL_ComboBox(CPDFDoc_Environment* pApp, CPDFSDK_Annot* pAnnot) :
    CFFL_FormFiller(pApp, pAnnot), m_pFontMap( NULL )
{
        m_State.nIndex = 0;
        m_State.nStart = 0;
        m_State.nEnd   = 0;
}

CFFL_ComboBox::~CFFL_ComboBox()
{
    delete m_pFontMap;
}

PWL_CREATEPARAM CFFL_ComboBox::GetCreateParam()
{
    PWL_CREATEPARAM cp = CFFL_FormFiller::GetCreateParam();

    ASSERT(m_pWidget != NULL);

    int nFlags = m_pWidget->GetFieldFlags();

    if (nFlags & FIELDFLAG_EDIT)
    {
        cp.dwFlags |= PCBS_ALLOWCUSTOMTEXT;
    }

    if (!m_pFontMap)
    {
        m_pFontMap = new CBA_FontMap(m_pWidget, GetSystemHandler());
        m_pFontMap->Initial();
    }

    cp.pFontMap = m_pFontMap;
    cp.pFocusHandler = this;

    return cp;
}

CPWL_Wnd* CFFL_ComboBox::NewPDFWindow(const PWL_CREATEPARAM& cp, CPDFSDK_PageView* pPageView)
{
    CPWL_ComboBox * pWnd = new CPWL_ComboBox();
    pWnd->AttachFFLData(this);
    pWnd->Create(cp);

    CFFL_IFormFiller* pFormFiller = m_pApp->GetIFormFiller();
    pWnd->SetFillerNotify(pFormFiller);

    int32_t nCurSel = m_pWidget->GetSelectedIndex(0);
    CFX_WideString swText;
    if (nCurSel < 0)
        swText = m_pWidget->GetValue();
    else
        swText = m_pWidget->GetOptionLabel(nCurSel);

    for (int32_t i=0,sz=m_pWidget->CountOptions(); i<sz; i++)
    {
        pWnd->AddString(m_pWidget->GetOptionLabel(i).c_str());
    }

    pWnd->SetSelect(nCurSel);
    pWnd->SetText(swText.c_str());
    return pWnd;
}


bool CFFL_ComboBox::OnChar(CPDFSDK_Annot* pAnnot, FX_UINT nChar, FX_UINT nFlags)
{
    return CFFL_FormFiller::OnChar(pAnnot, nChar, nFlags);
}

bool CFFL_ComboBox::IsDataChanged(CPDFSDK_PageView* pPageView)
{
    CPWL_ComboBox* pWnd = (CPWL_ComboBox*)GetPDFWindow(pPageView, false);
    if (!pWnd)
        return false;

    int32_t nCurSel = pWnd->GetSelect();
    if (!(m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT))
        return nCurSel != m_pWidget->GetSelectedIndex(0);

    if (nCurSel >= 0)
        return nCurSel != m_pWidget->GetSelectedIndex(0);

    return pWnd->GetText() != m_pWidget->GetValue();
}

void CFFL_ComboBox::SaveData(CPDFSDK_PageView* pPageView)
{
    ASSERT(m_pWidget != NULL);

    if (CPWL_ComboBox* pWnd = (CPWL_ComboBox*)GetPDFWindow(pPageView, false))
    {
        CFX_WideString swText = pWnd->GetText();
        int32_t nCurSel = pWnd->GetSelect();

        //mantis:0004157
        bool bSetValue = true;

        if (m_pWidget->GetFieldFlags() & FIELDFLAG_EDIT)
        {
            if (nCurSel >= 0)
            {
                if (swText != m_pWidget->GetOptionLabel(nCurSel))
                    bSetValue = true;
                else
                    bSetValue = false;
            }
            else
                bSetValue = true;
        }
        else
            bSetValue = false;

        CFX_WideString sOldValue;


        if (bSetValue)
        {
            sOldValue = m_pWidget->GetValue();
            m_pWidget->SetValue(swText, false);
        }
        else
        {
            m_pWidget->GetSelectedIndex(0);
            m_pWidget->SetOptionSelection(nCurSel, true, false);
        }

        m_pWidget->ResetFieldAppearance(true);
        m_pWidget->UpdateField();
        SetChangeMark();

        m_pWidget->GetPDFPage();


    }
}

 void CFFL_ComboBox::GetActionData( CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type, PDFSDK_FieldAction& fa)
{
    switch (type)
    {
    case CPDF_AAction::KeyStroke:
        if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, false))
        {
            if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
            {
                fa.bFieldFull = pEdit->IsTextFull();
                int nSelStart = 0;
                int nSelEnd = 0;
                pEdit->GetSel(nSelStart, nSelEnd);
                fa.nSelEnd = nSelEnd;
                fa.nSelStart = nSelStart;
                fa.sValue = pEdit->GetText();
                fa.sChangeEx = GetSelectExportText();

                if (fa.bFieldFull)
                {
                    fa.sChange = L"";
                    fa.sChangeEx = L"";
                }
            }
        }
        break;
    case CPDF_AAction::Validate:
        if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, false))
        {
            if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
            {
                fa.sValue = pEdit->GetText();
            }
        }
        break;
    case CPDF_AAction::LoseFocus:
    case CPDF_AAction::GetFocus:
        ASSERT(m_pWidget != NULL);
        fa.sValue = m_pWidget->GetValue();
        break;
    default:
        break;
    }
}



void CFFL_ComboBox::SetActionData(CPDFSDK_PageView* pPageView, CPDF_AAction::AActionType type,
                                    const PDFSDK_FieldAction& fa)
{
    switch (type)
    {
    case CPDF_AAction::KeyStroke:
        if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, false))
        {
            if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
            {
                pEdit->SetSel(fa.nSelStart, fa.nSelEnd);
                pEdit->ReplaceSel(fa.sChange.c_str());
            }
        }
        break;
    default:
        break;
    }
}

bool CFFL_ComboBox::IsActionDataChanged(CPDF_AAction::AActionType type, const PDFSDK_FieldAction& faOld,
                                    const PDFSDK_FieldAction& faNew)
{
    switch (type)
    {
    case CPDF_AAction::KeyStroke:
        return (!faOld.bFieldFull && faOld.nSelEnd != faNew.nSelEnd) || faOld.nSelStart != faNew.nSelStart ||
            faOld.sChange != faNew.sChange;
    default:
        break;
    }

    return false;
}

void CFFL_ComboBox::SaveState(CPDFSDK_PageView* pPageView)
{
    ASSERT(pPageView != NULL);

    if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, false))
    {
        m_State.nIndex = pComboBox->GetSelect();

        if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
        {
            pEdit->GetSel(m_State.nStart, m_State.nEnd);
            m_State.sValue = pEdit->GetText();
        }
    }
}

void CFFL_ComboBox::RestoreState(CPDFSDK_PageView* pPageView)
{
    ASSERT(pPageView != NULL);

    if (CPWL_ComboBox* pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, true))
    {
        if (m_State.nIndex >= 0)
            pComboBox->SetSelect(m_State.nIndex);
        else
        {
            if (CPWL_Edit* pEdit = (CPWL_Edit*)*pComboBox)
            {
                pEdit->SetText(m_State.sValue.c_str());
                pEdit->SetSel(m_State.nStart, m_State.nEnd);
            }
        }
    }
}

CPWL_Wnd* CFFL_ComboBox::ResetPDFWindow(CPDFSDK_PageView* pPageView, bool bRestoreValue)
{
    if (bRestoreValue)
        SaveState(pPageView);

    DestroyPDFWindow(pPageView);

    CPWL_Wnd* pRet = NULL;

    if (bRestoreValue)
    {
        RestoreState(pPageView);
        pRet = GetPDFWindow(pPageView, false);
    }
    else
        pRet = GetPDFWindow(pPageView, true);

    m_pWidget->UpdateField();

    return pRet;
}

void CFFL_ComboBox::OnKeyStroke(bool bKeyDown, FX_UINT nFlag)
{
    ASSERT(m_pWidget != NULL);

    int nFlags = m_pWidget->GetFieldFlags();

    if (nFlags & FIELDFLAG_COMMITONSELCHANGE)
    {
        if (m_bValid)
        {
            CPDFSDK_PageView* pPageView = GetCurPageView();
            ASSERT(pPageView != NULL);

            if (CommitData(pPageView, nFlag))
            {
                DestroyPDFWindow(pPageView);
                m_bValid = false;
            }
        }
    }
}

void CFFL_ComboBox::OnSetFocus(CPWL_Wnd* pWnd)
{
    ASSERT(m_pApp != NULL);

    ASSERT(pWnd != NULL);

    if (pWnd->GetClassName() == PWL_CLASSNAME_EDIT)
    {
        CPWL_Edit* pEdit = (CPWL_Edit*)pWnd;
        pEdit->SetCharSet(134);
        pEdit->SetCodePage(936);

        pEdit->SetReadyToInput();
        CFX_WideString wsText = pEdit->GetText();
        int nCharacters = wsText.GetLength();
        CFX_ByteString bsUTFText = wsText.UTF16LE_Encode();
        unsigned short* pBuffer = (unsigned short*)bsUTFText.c_str();
        m_pApp->FFI_OnSetFieldInputFocus(m_pWidget->GetFormField(), pBuffer, nCharacters, true);

        pEdit->SetEditNotify(this);
    }
}

void CFFL_ComboBox::OnKillFocus(CPWL_Wnd* pWnd)
{
    ASSERT(m_pApp != NULL);
}

bool CFFL_ComboBox::CanCopy(CPDFSDK_Document* pDocument)
{
    ASSERT(pDocument != NULL);

    return false;
}

bool CFFL_ComboBox::CanCut(CPDFSDK_Document* pDocument)
{
    ASSERT(pDocument != NULL);

    return false;
}

bool CFFL_ComboBox::CanPaste(CPDFSDK_Document* pDocument)
{
    ASSERT(pDocument != NULL);

    return false;
}

void CFFL_ComboBox::OnAddUndo(CPWL_Edit* pEdit)
{
    ASSERT(pEdit != NULL);
}

CFX_WideString CFFL_ComboBox::GetSelectExportText()
{
    CFX_WideString swRet;

    int nExport = -1;
    CPDFSDK_PageView *pPageView = GetCurPageView();
    if (CPWL_ComboBox * pComboBox = (CPWL_ComboBox*)GetPDFWindow(pPageView, false))
    {
        nExport = pComboBox->GetSelect();
    }

    if (nExport >= 0)
    {
        if (CPDF_FormField * pFormField = m_pWidget->GetFormField())
        {
            swRet = pFormField->GetOptionValue(nExport);
            if (swRet.IsEmpty())
                swRet = pFormField->GetOptionLabel(nExport);
        }
    }

    return swRet;
}
