diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-15 05:54:39 +0000 |
commit | 267c6f2ac71f92999e969232431ba04678e7437e (patch) | |
tree | 358c9467650e1d0a1d7227a21dac2e3d08b622b2 /sfx2/source/dialog/srchdlg.cxx | |
parent | Initial commit. (diff) | |
download | libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.tar.xz libreoffice-267c6f2ac71f92999e969232431ba04678e7437e.zip |
Adding upstream version 4:24.2.0.upstream/4%24.2.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'sfx2/source/dialog/srchdlg.cxx')
-rw-r--r-- | sfx2/source/dialog/srchdlg.cxx | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/sfx2/source/dialog/srchdlg.cxx b/sfx2/source/dialog/srchdlg.cxx new file mode 100644 index 0000000000..9c7b364ffa --- /dev/null +++ b/sfx2/source/dialog/srchdlg.cxx @@ -0,0 +1,136 @@ +/* -*- 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 . + */ + + +#include <srchdlg.hxx> +#include <comphelper/string.hxx> + +#include <tools/debug.hxx> +#include <unotools/viewoptions.hxx> +#include <o3tl/string_view.hxx> +#include <utility> + +using namespace ::com::sun::star::uno; + + +namespace sfx2 { + +#define MAX_SAVE_COUNT sal_uInt16(10) + + +// SearchDialog + + +SearchDialog::SearchDialog(weld::Window* pWindow, OUString aConfigName) + : GenericDialogController(pWindow, "sfx/ui/searchdialog.ui", "SearchDialog") + , m_sConfigName(std::move(aConfigName)) + , m_xSearchEdit(m_xBuilder->weld_combo_box("searchterm")) + , m_xWholeWordsBox(m_xBuilder->weld_check_button("wholewords")) + , m_xMatchCaseBox(m_xBuilder->weld_check_button("matchcase")) + , m_xWrapAroundBox(m_xBuilder->weld_check_button("wrap")) + , m_xBackwardsBox(m_xBuilder->weld_check_button("backwards")) + , m_xFindBtn(m_xBuilder->weld_button("ok")) +{ + // set handler + m_xFindBtn->connect_clicked(LINK(this, SearchDialog, FindHdl)); + // load config: old search strings and the status of the check boxes + LoadConfig(); + // the search edit should have the focus + m_xSearchEdit->grab_focus(); +} + +SearchDialog::~SearchDialog() +{ + SaveConfig(); +} + +void SearchDialog::LoadConfig() +{ + SvtViewOptions aViewOpt( EViewType::Dialog, m_sConfigName ); + if ( aViewOpt.Exists() ) + { + Any aUserItem = aViewOpt.GetUserItem( "UserItem" ); + OUString sUserData; + if ( aUserItem >>= sUserData ) + { + DBG_ASSERT( comphelper::string::getTokenCount(sUserData, ';') == 5, "invalid config data" ); + sal_Int32 nIdx = 0; + OUString sSearchText = sUserData.getToken( 0, ';', nIdx ); + m_xWholeWordsBox->set_active( o3tl::toInt32(o3tl::getToken(sUserData, 0, ';', nIdx )) == 1 ); + m_xMatchCaseBox->set_active( o3tl::toInt32(o3tl::getToken(sUserData, 0, ';', nIdx )) == 1 ); + m_xWrapAroundBox->set_active( o3tl::toInt32(o3tl::getToken(sUserData, 0, ';', nIdx )) == 1 ); + m_xBackwardsBox->set_active( o3tl::toInt32(o3tl::getToken(sUserData, 0, ';', nIdx )) == 1 ); + + nIdx = 0; + while ( nIdx != -1 ) + m_xSearchEdit->append_text(sSearchText.getToken( 0, '\t', nIdx)); + m_xSearchEdit->set_active(0); + } + } + else + m_xWrapAroundBox->set_active(true); +} + +void SearchDialog::SaveConfig() +{ + SvtViewOptions aViewOpt( EViewType::Dialog, m_sConfigName ); + OUString sUserData; + int i = 0, nCount = std::min(m_xSearchEdit->get_count(), static_cast<int>(MAX_SAVE_COUNT)); + for ( ; i < nCount; ++i ) + { + sUserData += m_xSearchEdit->get_text(i) + "\t"; + } + sUserData = comphelper::string::stripStart(sUserData, '\t') + ";" + + OUString::number( m_xWholeWordsBox->get_active() ? 1 : 0 ) + ";" + + OUString::number( m_xMatchCaseBox->get_active() ? 1 : 0 ) + ";" + + OUString::number( m_xWrapAroundBox->get_active() ? 1 : 0 ) + ";" + + OUString::number( m_xBackwardsBox->get_active() ? 1 : 0 ); + + Any aUserItem( sUserData ); + aViewOpt.SetUserItem( "UserItem", aUserItem ); +} + +IMPL_LINK_NOARG(SearchDialog, FindHdl, weld::Button&, void) +{ + OUString sSrchTxt = m_xSearchEdit->get_active_text(); + auto nPos = m_xSearchEdit->find_text(sSrchTxt); + if (nPos != 0) + { + if (nPos != -1) + m_xSearchEdit->remove(nPos); + m_xSearchEdit->insert_text(0, sSrchTxt); + } + m_aFindHdl.Call( *this ); +} + +void SearchDialog::SetFocusOnEdit() +{ + m_xSearchEdit->select_entry_region(0, -1); + m_xSearchEdit->grab_focus(); +} + +void SearchDialog::runAsync(const std::shared_ptr<SearchDialog>& rController) +{ + weld::DialogController::runAsync(rController, [=](sal_Int32 /*nResult*/){ rController->m_aCloseHdl.Call(nullptr); }); +} + +} // namespace sfx2 + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |