blob: 02529103b0a5a0d2a4c9187c4d5ce8d0302373e0 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sfx2.hxx"
#include "srchdlg.hxx"
#include "sfx2/sfxresid.hxx"
#include <sfx2/sfxuno.hxx>
#include "srchdlg.hrc"
#include "dialog.hrc"
#include <tools/debug.hxx>
#include <unotools/viewoptions.hxx>
using namespace ::com::sun::star::uno;
// ============================================================================
namespace sfx2 {
#define USERITEM_NAME DEFINE_CONST_OUSTRING("UserItem")
#define MAX_SAVE_COUNT (sal_uInt16)10
// ============================================================================
// SearchDialog
// ============================================================================
SearchDialog::SearchDialog( Window* pWindow, const ::rtl::OUString& rConfigName ) :
ModelessDialog( pWindow, SfxResId( RID_DLG_SEARCH ) ),
m_aSearchLabel ( this, SfxResId( FT_SEARCH ) ),
m_aSearchEdit ( this, SfxResId( ED_SEARCH ) ),
m_aWholeWordsBox ( this, SfxResId( CB_WHOLEWORDS ) ),
m_aMatchCaseBox ( this, SfxResId( CB_MATCHCASE ) ),
m_aWrapAroundBox ( this, SfxResId( CB_WRAPAROUND ) ),
m_aBackwardsBox ( this, SfxResId( CB_BACKWARDS ) ),
m_aFindBtn ( this, SfxResId( PB_FIND ) ),
m_aCancelBtn ( this, SfxResId( PB_CANCELFIND ) ),
m_sToggleText ( SfxResId( STR_TOGGLE ) ),
m_sConfigName ( rConfigName ),
m_bIsConstructed ( false )
{
FreeResource();
// set handler
m_aFindBtn.SetClickHdl( LINK( this, SearchDialog, FindHdl ) );
m_aBackwardsBox.SetClickHdl( LINK( this, SearchDialog, ToggleHdl ) );
// load config: old search strings and the status of the check boxes
LoadConfig();
// we need to change the text of the WrapAround box, depends on the status of the Backwards box
if ( m_aBackwardsBox.IsChecked() )
ToggleHdl( &m_aBackwardsBox );
// the search edit should have the focus
m_aSearchEdit.GrabFocus();
}
SearchDialog::~SearchDialog()
{
SaveConfig();
m_aCloseHdl.Call( NULL );
}
void SearchDialog::LoadConfig()
{
SvtViewOptions aViewOpt( E_DIALOG, m_sConfigName );
if ( aViewOpt.Exists() )
{
m_sWinState = ByteString( aViewOpt.GetWindowState().getStr(), RTL_TEXTENCODING_ASCII_US );
Any aUserItem = aViewOpt.GetUserItem( USERITEM_NAME );
::rtl::OUString aTemp;
if ( aUserItem >>= aTemp )
{
String sUserData( aTemp );
DBG_ASSERT( sUserData.GetTokenCount() == 5, "invalid config data" );
xub_StrLen nIdx = 0;
String sSearchText = sUserData.GetToken( 0, ';', nIdx );
m_aWholeWordsBox.Check( sUserData.GetToken( 0, ';', nIdx ).ToInt32() == 1 );
m_aMatchCaseBox.Check( sUserData.GetToken( 0, ';', nIdx ).ToInt32() == 1 );
m_aWrapAroundBox.Check( sUserData.GetToken( 0, ';', nIdx ).ToInt32() == 1 );
m_aBackwardsBox.Check( sUserData.GetToken( 0, ';', nIdx ).ToInt32() == 1 );
nIdx = 0;
while ( nIdx != STRING_NOTFOUND )
m_aSearchEdit.InsertEntry( sSearchText.GetToken( 0, '\t', nIdx ) );
m_aSearchEdit.SelectEntryPos(0);
}
}
else
m_aWrapAroundBox.Check( sal_True );
}
void SearchDialog::SaveConfig()
{
SvtViewOptions aViewOpt( E_DIALOG, m_sConfigName );
aViewOpt.SetWindowState( rtl::OUString::createFromAscii( m_sWinState.GetBuffer() ) );
String sUserData;
sal_uInt16 i = 0, nCount = Min( m_aSearchEdit.GetEntryCount(), MAX_SAVE_COUNT );
for ( ; i < nCount; ++i )
{
sUserData += m_aSearchEdit.GetEntry(i);
sUserData += '\t';
}
sUserData.EraseTrailingChars( '\t' );
sUserData += ';';
sUserData += String::CreateFromInt32( m_aWholeWordsBox.IsChecked() ? 1 : 0 );
sUserData += ';';
sUserData += String::CreateFromInt32( m_aMatchCaseBox.IsChecked() ? 1 : 0 );
sUserData += ';';
sUserData += String::CreateFromInt32( m_aWrapAroundBox.IsChecked() ? 1 : 0 );
sUserData += ';';
sUserData += String::CreateFromInt32( m_aBackwardsBox.IsChecked() ? 1 : 0 );
Any aUserItem = makeAny( ::rtl::OUString( sUserData ) );
aViewOpt.SetUserItem( USERITEM_NAME, aUserItem );
}
IMPL_LINK( SearchDialog, FindHdl, PushButton*, EMPTYARG )
{
String sSrchTxt = m_aSearchEdit.GetText();
sal_uInt16 nPos = m_aSearchEdit.GetEntryPos( sSrchTxt );
if ( nPos > 0 && nPos != COMBOBOX_ENTRY_NOTFOUND )
m_aSearchEdit.RemoveEntry( nPos );
if ( nPos > 0 )
m_aSearchEdit.InsertEntry( sSrchTxt, 0 );
m_aFindHdl.Call( this );
return 0;
}
IMPL_LINK( SearchDialog, ToggleHdl, CheckBox*, EMPTYARG )
{
String sTemp = m_aWrapAroundBox.GetText();
m_aWrapAroundBox.SetText( m_sToggleText );
m_sToggleText = sTemp;
return 0;
}
void SearchDialog::SetFocusOnEdit()
{
Selection aSelection( 0, m_aSearchEdit.GetText().Len() );
m_aSearchEdit.SetSelection( aSelection );
m_aSearchEdit.GrabFocus();
}
sal_Bool SearchDialog::Close()
{
sal_Bool bRet = ModelessDialog::Close();
m_aCloseHdl.Call( this );
return bRet;
}
void SearchDialog::StateChanged( StateChangedType nStateChange )
{
if ( nStateChange == STATE_CHANGE_INITSHOW )
{
if ( m_sWinState.Len() )
SetWindowState( m_sWinState );
m_bIsConstructed = sal_True;
}
ModelessDialog::StateChanged( nStateChange );
}
void SearchDialog::Move()
{
ModelessDialog::Move();
if ( m_bIsConstructed && IsReallyVisible() )
m_sWinState = GetWindowState( WINDOWSTATE_MASK_POS | WINDOWSTATE_MASK_STATE );
}
// ============================================================================
} // namespace sfx2
// ============================================================================