/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements. See the NOTICE file distributed
 *   with this work for additional information regarding copyright
 *   ownership. The ASF licenses this file to you under the Apache
 *   License, Version 2.0 (the "License"); you may not use this file
 *   except in compliance with the License. You may obtain a copy of
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */
#ifndef INCLUDED_SW_SOURCE_UIBASE_INC_OPTLOAD_HXX
#define INCLUDED_SW_SOURCE_UIBASE_INC_OPTLOAD_HXX

#include <sfx2/tabdlg.hxx>

#include <vcl/group.hxx>
#include <vcl/fixed.hxx>
#include <vcl/layout.hxx>
#include <vcl/lstbox.hxx>
#include <vcl/field.hxx>
#include <svx/strarray.hxx>
#include <sfx2/basedlgs.hxx>
#include <svx/checklbx.hxx>
#include "caption.hxx"

class SwFieldMgr;
class SvTreeListEntry;
class SwWrtShell;

class SwFieldUnitTable
{
public:
    static OUString GetString(sal_uInt32 i);
    static sal_uInt32 Count();
    static FieldUnit GetValue(sal_uInt32 i);
};

class TextFilterAutoConvert : public TextFilter
{
private:
    OUString m_sLastGoodText;
    OUString m_sNone;
public:
    TextFilterAutoConvert(const OUString &rNone)
        : m_sNone(rNone)
    {
    }
    virtual OUString filter(const OUString &rText) override;
};

class SwLoadOptPage : public SfxTabPage
{
private:
    VclPtr<RadioButton>     m_pAlwaysRB;
    VclPtr<RadioButton>     m_pRequestRB;
    VclPtr<RadioButton>     m_pNeverRB;

    VclPtr<CheckBox>        m_pAutoUpdateFields;
    VclPtr<CheckBox>        m_pAutoUpdateCharts;

    VclPtr<ListBox>         m_pMetricLB;
    VclPtr<FixedText>       m_pTabFT;
    VclPtr<MetricField>     m_pTabMF;
    VclPtr<CheckBox>        m_pUseSquaredPageMode;
    VclPtr<CheckBox>        m_pUseCharUnit;
    VclPtr<Edit>            m_pWordCountED;
    VclPtr<CheckBox>        m_pShowStandardizedPageCount;
    VclPtr<NumericField>    m_pStandardizedPageSizeNF;

    SwWrtShell*      m_pWrtShell;
    sal_uInt16       m_nLastTab;
    sal_Int32        m_nOldLinkMode;

    DECL_LINK(MetricHdl, ListBox&, void);
    DECL_LINK(StandardizedPageCountCheckHdl, Button*, void);

public:
    SwLoadOptPage(vcl::Window* pParent, const SfxItemSet& rSet);
    virtual ~SwLoadOptPage() override;
    virtual void dispose() override;

    static VclPtr<SfxTabPage> Create( TabPageParent pParent,
                                      const SfxItemSet* rAttrSet);

    virtual bool        FillItemSet( SfxItemSet* rSet ) override;
    virtual void        Reset( const SfxItemSet* rSet ) override;
};

class SwCaptionOptDlg : public SfxSingleTabDialog
{
public:
    SwCaptionOptDlg(vcl::Window* pParent, const SfxItemSet& rSet);
};

class CaptionComboBox : public ComboBox
{
    std::vector<OUString> m_EntryList;
    std::vector<OUString> m_DelEntryList;
    OUString              aDefault;

    void InsertSorted(OUString const& rEntry);

protected:
    virtual void KeyInput( const KeyEvent& ) override;

public:
    CaptionComboBox(vcl::Window* pParent, WinBits nStyle);
    virtual ~CaptionComboBox() override;

    void                    InsertSwEntry(const OUString&);
    virtual sal_Int32       InsertEntry(const OUString& rStr, sal_Int32 = COMBOBOX_APPEND) override;

    virtual void            RemoveEntryAt(sal_Int32 nPos) override;

    const OUString&         GetSwEntry(sal_Int32) const;
};

class SwCaptionPreview : public vcl::Window
{
private:
    OUString maText;
    bool mbFontInitialized;
    vcl::Font maFont;
    Point maDrawPos;
public:
    SwCaptionPreview(vcl::Window* pParent, WinBits nStyle);
    virtual void ApplySettings(vcl::RenderContext& rRenderContext) override;
    void SetPreviewText( const OUString& rText );
    virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect ) override;
    virtual Size GetOptimalSize() const override;
};

class SwCaptionOptPage : public SfxTabPage
{
private:
    VclPtr<SvxCheckListBox>  m_pCheckLB;
    VclPtr<ListBox>          m_pLbCaptionOrder;
    VclPtr<SwCaptionPreview> m_pPreview;

    VclPtr<VclContainer>     m_pSettingsGroup;
    VclPtr<CaptionComboBox>  m_pCategoryBox;
    VclPtr<FixedText>        m_pFormatText;
    VclPtr<ListBox>          m_pFormatBox;
    //#i61007# order of captions
    VclPtr<FixedText>        m_pNumberingSeparatorFT;
    VclPtr<Edit>             m_pNumberingSeparatorED;
    VclPtr<FixedText>        m_pTextText;
    VclPtr<Edit>             m_pTextEdit;
    VclPtr<ListBox>          m_pPosBox;

    VclPtr<VclContainer>     m_pNumCapt;
    VclPtr<ListBox>          m_pLbLevel;
    VclPtr<Edit>             m_pEdDelim;

    VclPtr<VclContainer>     m_pCategory;
    VclPtr<ListBox>          m_pCharStyleLB;
    VclPtr<CheckBox>         m_pApplyBorderCB;

    OUString m_sSWTable;
    OUString m_sSWFrame;
    OUString m_sSWGraphic;
    OUString m_sOLE;

    OUString m_sIllustration;
    OUString m_sFigure;
    OUString m_sTable;
    OUString m_sText;
    OUString m_sDrawing;

    OUString m_sBegin;
    OUString m_sEnd;
    OUString m_sAbove;
    OUString m_sBelow;

    OUString m_sNone;

    SwFieldMgr* pMgr;
    bool bHTMLMode;

    TextFilterAutoConvert m_aTextFilter;

    DECL_LINK(SelectHdl, ComboBox&, void);
    DECL_LINK(SelectListBoxHdl, ListBox&, void);
    DECL_LINK(ModifyHdl, Edit&, void);
    DECL_LINK( OrderHdl, ListBox&, void );
    DECL_LINK(ShowEntryHdl, SvTreeListBox*, void);
    DECL_LINK(SaveEntryHdl, SvTreeListBox*, void);

    void DelUserData();
    void SetOptions(const sal_uLong nPos, const SwCapObjType eType, const SvGlobalName *pOleId = nullptr);
    void SaveEntry(SvTreeListEntry const * pEntry);
    void InvalidatePreview();

public:
                        SwCaptionOptPage( vcl::Window* pParent,
                                         const SfxItemSet& rSet );
                        virtual ~SwCaptionOptPage() override;
    virtual void        dispose() override;

    static VclPtr<SfxTabPage> Create( TabPageParent pParent,
                                      const SfxItemSet* rAttrSet);

    virtual bool        FillItemSet( SfxItemSet* rSet ) override;
    virtual void        Reset( const SfxItemSet* rSet ) override;
};

#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
