add Wildcards to Find&Replace dialog

Enabled only for Calc. Writer needs to be adapted to support wildcards.

The global escape character is '\' set in SvxSearchItem ctor.

Change-Id: I1af78f296deff81e023ee9f0e936f5f506f80c83
diff --git a/include/svl/srchdefs.hxx b/include/svl/srchdefs.hxx
index 8fb303c..8c84b03 100644
--- a/include/svl/srchdefs.hxx
+++ b/include/svl/srchdefs.hxx
@@ -39,11 +39,12 @@ enum class SearchOptionFlags
    MORE          = 0x0800,
    SIMILARITY    = 0x1000,
    CONTENT       = 0x2000,
    ALL           = 0x3fff
    WILDCARD      = 0x4000,
    ALL           = 0x7fff
};
namespace o3tl
{
    template<> struct typed_flags<SearchOptionFlags> : is_typed_flags<SearchOptionFlags, 0x3fff> {};
    template<> struct typed_flags<SearchOptionFlags> : is_typed_flags<SearchOptionFlags, 0x7fff> {};
}

#endif
diff --git a/include/svx/srchdlg.hxx b/include/svx/srchdlg.hxx
index cc4beda..cd08fc8c5 100644
--- a/include/svx/srchdlg.hxx
+++ b/include/svx/srchdlg.hxx
@@ -180,6 +180,7 @@ private:
    VclPtr<CheckBox>       m_pSelectionBtn;
    VclPtr<CheckBox>       m_pBackwardsBtn;
    VclPtr<CheckBox>       m_pRegExpBtn;
    VclPtr<CheckBox>       m_pWildcardBtn;
    VclPtr<CheckBox>       m_pSimilarityBox;
    VclPtr<PushButton>     m_pSimilarityBtn;
    VclPtr<CheckBox>       m_pLayoutBtn;
diff --git a/svx/source/dialog/srchdlg.cxx b/svx/source/dialog/srchdlg.cxx
index d0424bc..d54cce8 100644
--- a/svx/source/dialog/srchdlg.cxx
+++ b/svx/source/dialog/srchdlg.cxx
@@ -97,6 +97,7 @@ using namespace comphelper;
#define MODIFY_COLUMNS      0x00002000
#define MODIFY_ALLTABLES    0x00004000
#define MODIFY_NOTES        0x00008000
#define MODIFY_WILDCARD     0x00010000

namespace
{
@@ -304,6 +305,7 @@ SvxSearchDialog::SvxSearchDialog( vcl::Window* pParent, SfxChildWindow* pChildWi
    get(m_pSelectionBtn, "selection");
    get(m_pBackwardsBtn, "backwards");
    get(m_pRegExpBtn, "regexp");
    get(m_pWildcardBtn, "wildcard");
    get(m_pSimilarityBox, "similarity");
    get(m_pSimilarityBtn, "similaritybtn");
    get(m_pLayoutBtn, "layout");
@@ -384,6 +386,7 @@ void SvxSearchDialog::dispose()
    m_pSelectionBtn.clear();
    m_pBackwardsBtn.clear();
    m_pRegExpBtn.clear();
    m_pWildcardBtn.clear();
    m_pSimilarityBox.clear();
    m_pSimilarityBtn.clear();
    m_pLayoutBtn.clear();
@@ -552,6 +555,7 @@ bool SvxSearchDialog::Close()
    aOpt.SetWholeWordsOnly          ( m_pWordBtn->IsChecked() );
    aOpt.SetBackwards               ( m_pBackwardsBtn->IsChecked() );
    aOpt.SetUseRegularExpression    ( m_pRegExpBtn->IsChecked() );
    aOpt.SetUseWildcard             ( m_pWildcardBtn->IsChecked() );
    aOpt.SetSearchForStyles         ( m_pLayoutBtn->IsChecked() );
    aOpt.SetSimilaritySearch        ( m_pSimilarityBox->IsChecked() );
    aOpt.SetUseAsianOptions         ( m_pJapOptionsCB->IsChecked() );
@@ -651,6 +655,7 @@ void SvxSearchDialog::InitControls_Impl()
    m_pSelectionBtn->SetClickHdl( aLink2 );
    m_pMatchCaseCB->SetClickHdl( aLink2 );
    m_pRegExpBtn->SetClickHdl( aLink2 );
    m_pWildcardBtn->SetClickHdl( aLink2 );
    m_pBackwardsBtn->SetClickHdl( aLink2 );
    m_pNotesBtn->SetClickHdl( aLink2 );
    m_pSimilarityBox->SetClickHdl( aLink2 );
@@ -706,6 +711,7 @@ void SvxSearchDialog::ShowOptionalControls_Impl()
    m_pNotesBtn->Show(bWriterApp);
    m_pBackwardsBtn->Show();
    m_pRegExpBtn->Show(!bDrawApp);
    m_pWildcardBtn->Show(bCalcApp); /* TODO:WILDCARD enable for other apps if hey handle it */
    m_pSimilarityBox->Show();
    m_pSimilarityBtn->Show();
    m_pSelectionBtn->Show();
@@ -780,6 +786,8 @@ void SvxSearchDialog::Init_Impl( bool bSearchPattern )
        m_pSelectionBtn->Check( pSearchItem->GetSelection() );
    if ( ( nModifyFlag & MODIFY_REGEXP ) == 0 )
        m_pRegExpBtn->Check( pSearchItem->GetRegExp() );
    if ( ( nModifyFlag & MODIFY_WILDCARD ) == 0 )
        m_pWildcardBtn->Check( pSearchItem->GetWildcard() );
    if ( ( nModifyFlag & MODIFY_LAYOUT ) == 0 )
        m_pLayoutBtn->Check( pSearchItem->GetPattern() );
    if (m_pNotesBtn->IsChecked())
@@ -854,6 +862,7 @@ void SvxSearchDialog::Init_Impl( bool bSearchPattern )
            m_pSearchAllBtn->Hide();

            m_pRegExpBtn->Hide();
            m_pWildcardBtn->Hide();
            m_pLayoutBtn->Hide();

            // only look for formatting in Writer
@@ -863,6 +872,8 @@ void SvxSearchDialog::Init_Impl( bool bSearchPattern )
        }
        else
        {
            m_pWildcardBtn->Hide(); /* TODO:WILDCARD do not hide for other apps if they handle it */

            if ( !pSearchList )
            {
                // Get attribute sets, if it not has been done already
@@ -942,6 +953,7 @@ void SvxSearchDialog::Init_Impl( bool bSearchPattern )

        m_pWordBtn->Disable();
        m_pRegExpBtn->Disable();
        m_pWildcardBtn->Disable();
        m_pMatchCaseCB->Disable();

        bDisableSearch = !m_pSearchTmplLB->GetEntryCount();
@@ -980,6 +992,7 @@ void SvxSearchDialog::Init_Impl( bool bSearchPattern )
        m_pReplaceTmplLB->Hide();

        EnableControl_Impl(m_pRegExpBtn);
        EnableControl_Impl(m_pWildcardBtn);
        EnableControl_Impl(m_pMatchCaseCB);

        if ( m_pRegExpBtn->IsChecked() )
@@ -1121,6 +1134,8 @@ void SvxSearchDialog::ClickHdl_Impl(void* pCtrl)
            m_pSimilarityBtn->Enable();
            m_pRegExpBtn->Check( false );
            m_pRegExpBtn->Disable();
            m_pWildcardBtn->Check( false );
            m_pWildcardBtn->Disable();
            EnableControl_Impl(m_pWordBtn);

            if ( m_pLayoutBtn->IsChecked() )
@@ -1129,6 +1144,7 @@ void SvxSearchDialog::ClickHdl_Impl(void* pCtrl)
                m_pLayoutBtn->Check( false );
            }
            m_pRegExpBtn->Disable();
            m_pWildcardBtn->Disable();
            m_pLayoutBtn->Disable();
            m_pFormatBtn->Disable();
            m_pNoFormatBtn->Disable();
@@ -1137,6 +1153,7 @@ void SvxSearchDialog::ClickHdl_Impl(void* pCtrl)
        else
        {
            EnableControl_Impl(m_pRegExpBtn);
            EnableControl_Impl(m_pWildcardBtn);
            if (!m_pNotesBtn->IsChecked())
                EnableControl_Impl(m_pLayoutBtn);
            EnableControl_Impl(m_pFormatBtn);
@@ -1167,6 +1184,8 @@ void SvxSearchDialog::ClickHdl_Impl(void* pCtrl)
            m_pWordBtn->Disable();
            m_pRegExpBtn->Check( false );
            m_pRegExpBtn->Disable();
            m_pWildcardBtn->Check( false );
            m_pWildcardBtn->Disable();
            m_pMatchCaseCB->Check( false );
            m_pMatchCaseCB->Disable();
            m_pNotesBtn->Disable();
@@ -1182,6 +1201,7 @@ void SvxSearchDialog::ClickHdl_Impl(void* pCtrl)
        else
        {
            EnableControl_Impl(m_pRegExpBtn);
            EnableControl_Impl(m_pWildcardBtn);
            EnableControl_Impl(m_pMatchCaseCB);
            EnableControl_Impl(m_pNotesBtn);

@@ -1189,6 +1209,17 @@ void SvxSearchDialog::ClickHdl_Impl(void* pCtrl)
            {
                m_pWordBtn->Check( false );
                m_pWordBtn->Disable();
                m_pWildcardBtn->Check( false );
                m_pWildcardBtn->Disable();
                m_pSimilarityBox->Check( false );
                m_pSimilarityBox->Disable();
                m_pSimilarityBtn->Disable();
            }
            else if ( m_pWildcardBtn->IsChecked() )
            {
                m_pRegExpBtn->Check( false );
                m_pRegExpBtn->Disable();
                m_pSimilarityBox->Check( false );
                m_pSimilarityBox->Disable();
                m_pSimilarityBtn->Disable();
            }
@@ -1254,9 +1285,12 @@ IMPL_LINK_TYPED( SvxSearchDialog, CommandHdl_Impl, Button *, pBtn, void )
        }

        pSearchItem->SetRegExp( false );
        pSearchItem->SetWildcard( false );
        pSearchItem->SetLevenshtein( false );
        if (GetCheckBoxValue(m_pRegExpBtn))
            pSearchItem->SetRegExp( true );
        else if (GetCheckBoxValue(m_pWildcardBtn))
            pSearchItem->SetWildcard( true );
        else if (GetCheckBoxValue(m_pSimilarityBox))
            pSearchItem->SetLevenshtein( true );

@@ -1652,6 +1686,10 @@ void SvxSearchDialog::EnableControls_Impl( const SearchOptionFlags nFlags )
        m_pRegExpBtn->Enable();
    else
        m_pRegExpBtn->Disable();
    if ( ( SearchOptionFlags::WILDCARD & nOptions ) )
        m_pWildcardBtn->Enable();
    else
        m_pWildcardBtn->Disable();
    if ( ( SearchOptionFlags::EXACT & nOptions ) )
        m_pMatchCaseCB->Enable();
    else
@@ -1735,11 +1773,17 @@ void SvxSearchDialog::EnableControl_Impl( Control* pCtrl )
        return;
    }
    if ( m_pRegExpBtn == pCtrl && ( SearchOptionFlags::REG_EXP & nOptions )
        && !m_pSimilarityBox->IsChecked())
        && !m_pSimilarityBox->IsChecked() && !m_pWildcardBtn->IsChecked())
    {
        m_pRegExpBtn->Enable();
        return;
    }
    if ( m_pWildcardBtn == pCtrl && ( SearchOptionFlags::WILDCARD & nOptions )
        && !m_pSimilarityBox->IsChecked() && !m_pRegExpBtn->IsChecked())
    {
        m_pWildcardBtn->Enable();
        return;
    }
    if ( m_pMatchCaseCB == pCtrl && ( SearchOptionFlags::EXACT & nOptions ) )
    {
        if (!m_pJapOptionsCB->IsChecked())
@@ -1772,8 +1816,8 @@ void SvxSearchDialog::EnableControl_Impl( Control* pCtrl )
        m_pNoFormatBtn->Enable();
        return;
    }
    if ( m_pSimilarityBox == pCtrl &&
         ( SearchOptionFlags::SIMILARITY & nOptions ) )
    if ( m_pSimilarityBox == pCtrl && ( SearchOptionFlags::SIMILARITY & nOptions )
        && !m_pRegExpBtn->IsChecked() && !m_pWildcardBtn->IsChecked())
    {
        m_pSimilarityBox->Enable();

@@ -2132,6 +2176,8 @@ void SvxSearchDialog::SetModifyFlag_Impl( const Control* pCtrl )
        nModifyFlag |= MODIFY_SELECTION;
    else if ( m_pRegExpBtn == pCtrl )
        nModifyFlag |= MODIFY_REGEXP;
    else if ( m_pWildcardBtn == pCtrl )
        nModifyFlag |= MODIFY_WILDCARD;
    else if ( m_pLayoutBtn == pCtrl )
        nModifyFlag |= MODIFY_LAYOUT;
    else if ( m_pSimilarityBox == pCtrl )
@@ -2169,9 +2215,12 @@ void SvxSearchDialog::SaveToModule_Impl()
    }

    pSearchItem->SetRegExp( false );
    pSearchItem->SetWildcard( false );
    pSearchItem->SetLevenshtein( false );
    if (GetCheckBoxValue(m_pRegExpBtn))
        pSearchItem->SetRegExp( true );
    else if (GetCheckBoxValue(m_pWildcardBtn))
        pSearchItem->SetWildcard( true );
    else if (GetCheckBoxValue(m_pSimilarityBox))
        pSearchItem->SetLevenshtein( true );

diff --git a/svx/uiconfig/ui/findreplacedialog.ui b/svx/uiconfig/ui/findreplacedialog.ui
index aa25614..bf2989c 100644
--- a/svx/uiconfig/ui/findreplacedialog.ui
+++ b/svx/uiconfig/ui/findreplacedialog.ui
@@ -510,6 +510,21 @@
                                  </packing>
                                </child>
                                <child>
                                  <object class="GtkCheckButton" id="wildcard">
                                    <property name="label" translatable="yes">Wil_dcards</property>
                                    <property name="can_focus">True</property>
                                    <property name="receives_default">False</property>
                                    <property name="no_show_all">True</property>
                                    <property name="use_underline">True</property>
                                    <property name="xalign">0</property>
                                    <property name="draw_indicator">True</property>
                                  </object>
                                  <packing>
                                    <property name="left_attach">0</property>
                                    <property name="top_attach">2</property>
                                  </packing>
                                </child>
                                <child>
                                  <object class="GtkButtonBox" id="buttonbox1">
                                    <property name="visible">True</property>
                                    <property name="can_focus">False</property>
@@ -561,7 +576,7 @@
                                  </object>
                                  <packing>
                                    <property name="left_attach">0</property>
                                    <property name="top_attach">5</property>
                                    <property name="top_attach">6</property>
                                    <property name="width">2</property>
                                  </packing>
                                </child>
@@ -607,7 +622,7 @@
                                  </object>
                                  <packing>
                                    <property name="left_attach">0</property>
                                    <property name="top_attach">4</property>
                                    <property name="top_attach">5</property>
                                  </packing>
                                </child>
                                <child>
@@ -652,7 +667,7 @@
                                  </object>
                                  <packing>
                                    <property name="left_attach">0</property>
                                    <property name="top_attach">2</property>
                                    <property name="top_attach">3</property>
                                  </packing>
                                </child>
                                <child>
@@ -742,7 +757,7 @@
                                  </object>
                                  <packing>
                                    <property name="left_attach">0</property>
                                    <property name="top_attach">3</property>
                                    <property name="top_attach">4</property>
                                  </packing>
                                </child>
                                <child>
@@ -757,7 +772,7 @@
                                  </object>
                                  <packing>
                                    <property name="left_attach">1</property>
                                    <property name="top_attach">3</property>
                                    <property name="top_attach">4</property>
                                  </packing>
                                </child>
                                <child>
@@ -772,7 +787,7 @@
                                  </object>
                                  <packing>
                                    <property name="left_attach">1</property>
                                    <property name="top_attach">4</property>
                                    <property name="top_attach">5</property>
                                  </packing>
                                </child>
                              </object>
@@ -823,7 +838,7 @@
                                    <property name="can_focus">False</property>
                                    <property name="no_show_all">True</property>
                                    <property name="xalign">0</property>
                                    <property name="label" translatable="yes">Search _direction:</property>
                                    <property name="label" translatable="yes">Search direction:</property>
                                    <property name="use_underline">True</property>
                                    <property name="mnemonic_widget">calcsearchin</property>
                                  </object>