Related: fdo#47427 disallow pasting spaces into category box

Change-Id: I4caf4b2ac028629c6ecbd42084346623192df09e
diff --git a/extras/source/glade/libreoffice-catalog.xml.in b/extras/source/glade/libreoffice-catalog.xml.in
index fc0cd80..7d17202 100644
--- a/extras/source/glade/libreoffice-catalog.xml.in
+++ b/extras/source/glade/libreoffice-catalog.xml.in
@@ -460,9 +460,6 @@
    <glade-widget-class title="Numbering Type ListBox" name="swlo-SwNumberingTypeListBox"
                        generic-name="NumberingTypeListBox" parent="GtkComboBox"
                        icon-name="widget-gtk-combobox"/>
    <glade-widget-class title="Category ComboBox" name="swuilo-CategoryBox"
                        generic-name="CategoryComboBox" parent="GtkComboBox"
                        icon-name="widget-gtk-combobox"/>
    <glade-widget-class title="Bookmark Combo" name="swuilo-BookmarkCombo"
                        generic-name="BookmarkComboBox" parent="GtkComboBox"
                        icon-name="widget-gtk-combobox"/>
diff --git a/sw/source/ui/frmdlg/cption.cxx b/sw/source/ui/frmdlg/cption.cxx
index 1526eb1..ec81b01 100644
--- a/sw/source/ui/frmdlg/cption.cxx
+++ b/sw/source/ui/frmdlg/cption.cxx
@@ -82,6 +82,15 @@ public:

OUString SwCaptionDialog::our_aSepTextSave(": "); // Caption separator text

//Resolves: fdo#47427 disallow typing *or* pasting content into the category box
OUString TextFilterAutoConvert::filter(const OUString &rText)
{
    if (!SwCalc::IsValidVarName(rText))
        return m_sLastGoodText;
    m_sLastGoodText = rText;
    return rText;
}

SwCaptionDialog::SwCaptionDialog( Window *pParent, SwView &rV ) :
    SvxStandardDialog( pParent, "InsertCaptionDialog", "modules/swriter/ui/insertcaption.ui" ),
    m_sNone( SW_RESSTR(SW_STR_NONE) ),
@@ -92,6 +101,7 @@ SwCaptionDialog::SwCaptionDialog( Window *pParent, SwView &rV ) :
{
    get(m_pTextEdit, "caption_edit");
    get(m_pCategoryBox, "category");
    m_pCategoryBox->SetTextFilter(&m_aTextFilter);
    get(m_pFormatText, "numbering_label");
    get(m_pFormatBox, "numbering");
    get(m_pNumberingSeparatorFT, "num_separator");
@@ -489,43 +499,6 @@ void    SwSequenceOptionDialog::SetCharacterStyle(const OUString& rStyle)
    m_pLbCharStyle->SelectEntry(rStyle);
}

bool CategoryBox::PreNotify( NotifyEvent& rNEvt )
{
    bool nHandled = false;
    if( rNEvt.GetType() == EVENT_KEYINPUT &&
        rNEvt.GetKeyEvent()->GetCharCode() )
    {
        const KeyEvent* pEvent = rNEvt.GetKeyEvent();
        const KeyCode&  rKeyCode = pEvent->GetKeyCode();
        const sal_uInt16 nTmpCode = rKeyCode.GetFullCode() & ~KEY_ALLMODTYPE;

        if(nTmpCode != KEY_BACKSPACE && nTmpCode != KEY_RETURN
                && nTmpCode != KEY_TAB && nTmpCode != KEY_ESCAPE)
        {
            const OUString sText( GetText() );
            Selection aSel( GetSelection() );
            aSel.Justify();

            const OUString sName = sText.copy(0, aSel.Min())
                + OUString( pEvent->GetCharCode() )
                + sText.copy(aSel.Max());

            if( !SwCalc::IsValidVarName( sName ))
                nHandled = true;
        }
    }
    if(!nHandled)
        nHandled = ComboBox::PreNotify( rNEvt );
    return nHandled;
}

extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeCategoryBox(Window* pParent, VclBuilder::stringmap &)
{
    CategoryBox* pCategoryBox = new CategoryBox(pParent, WB_LEFT | WB_DROPDOWN | WB_VCENTER | WB_3DLOOK | WB_SORT);
    pCategoryBox->EnableAutoSize(true);
    return pCategoryBox;
}

// #i61007# order of captions
void SwCaptionDialog::ApplyCaptionOrder()
{
diff --git a/sw/source/uibase/inc/cption.hxx b/sw/source/uibase/inc/cption.hxx
index 98781e1..0c1787f 100644
--- a/sw/source/uibase/inc/cption.hxx
+++ b/sw/source/uibase/inc/cption.hxx
@@ -48,20 +48,19 @@ class SwView;
#include "optload.hxx"
#include "swlbox.hxx"

class CategoryBox : public ComboBox
class TextFilterAutoConvert : public TextFilter
{
private:
    OUString m_sLastGoodText;
public:
    CategoryBox( Window* pParent, WinBits nStyle = 0 )
        : ComboBox( pParent, nStyle )
    {}

    virtual bool PreNotify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
    virtual OUString filter(const OUString &rText) SAL_OVERRIDE;
};

class SwCaptionDialog : public SvxStandardDialog
{
    Edit*        m_pTextEdit;
    CategoryBox* m_pCategoryBox;
    ComboBox*    m_pCategoryBox;
    TextFilterAutoConvert m_aTextFilter;
    FixedText*   m_pFormatText;
    ListBox*     m_pFormatBox;
    //#i61007# order of captions
diff --git a/sw/uiconfig/swriter/ui/insertcaption.ui b/sw/uiconfig/swriter/ui/insertcaption.ui
index 30478e9..c7f19de 100644
--- a/sw/uiconfig/swriter/ui/insertcaption.ui
+++ b/sw/uiconfig/swriter/ui/insertcaption.ui
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.0 -->
<!-- Generated with glade 3.16.1 -->
<interface>
  <requires lib="gtk+" version="3.0"/>
  <!-- interface-requires LibreOffice 1.0 -->
  <object class="GtkDialog" id="InsertCaptionDialog">
    <property name="can_focus">False</property>
    <property name="border_width">6</property>
@@ -217,11 +218,15 @@
                          </packing>
                        </child>
                        <child>
                          <object class="swuilo-CategoryBox" id="category">
                          <object class="GtkComboBoxText" id="category">
                            <property name="visible">True</property>
                            <property name="can_focus">False</property>
                            <property name="entry_text_column">0</property>
                            <property name="id_column">1</property>
                            <property name="has_entry">True</property>
                            <child internal-child="entry">
                              <object class="GtkEntry" id="comboboxtext-entry">
                                <property name="can_focus">False</property>
                              </object>
                            </child>
                          </object>
                          <packing>
                            <property name="left_attach">1</property>