summaryrefslogtreecommitdiffstats
path: root/sw/source/ui/misc/srtdlg.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/ui/misc/srtdlg.cxx')
-rw-r--r--sw/source/ui/misc/srtdlg.cxx428
1 files changed, 428 insertions, 0 deletions
diff --git a/sw/source/ui/misc/srtdlg.cxx b/sw/source/ui/misc/srtdlg.cxx
new file mode 100644
index 000000000..3e46ea05a
--- /dev/null
+++ b/sw/source/ui/misc/srtdlg.cxx
@@ -0,0 +1,428 @@
+/* -*- 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 <srtdlg.hxx>
+
+#include <editeng/editids.hrc>
+#include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
+#include <svl/intitem.hxx>
+#include <svx/svxdlg.hxx>
+#include <unotools/collatorwrapper.hxx>
+#include <svtools/collatorres.hxx>
+#include <swwait.hxx>
+#include <view.hxx>
+#include <wrtsh.hxx>
+#include <strings.hrc>
+#include <swtable.hxx>
+#include <sortopt.hxx>
+#include <node.hxx>
+#include <tblsel.hxx>
+#include <memory>
+
+static bool bCheck1 = true;
+static bool bCheck2 = false;
+static bool bCheck3 = false;
+
+static sal_uInt16 nCol1 = 1;
+static sal_uInt16 nCol2 = 1;
+static sal_uInt16 nCol3 = 1;
+
+static sal_uInt16 nType1 = 0;
+static sal_uInt16 nType2 = 0;
+static sal_uInt16 nType3 = 0;
+
+static LanguageType nLang = LANGUAGE_NONE;
+
+static bool bAsc1 = true;
+static bool bAsc2 = true;
+static bool bAsc3 = true;
+static bool bCol = false;
+static bool bCsSens= false;
+
+static sal_Unicode cDeli = '\t';
+
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::uno;
+using namespace ::com::sun::star;
+
+// determine lines and columns for table selection
+static bool lcl_GetSelTable( SwWrtShell const &rSh, sal_uInt16& rX, sal_uInt16& rY )
+{
+ const SwTableNode* pTableNd = rSh.IsCursorInTable();
+ if( !pTableNd )
+ return false;
+
+ FndBox_ aFndBox( nullptr, nullptr );
+
+ // look for all boxes / lines
+ {
+ SwSelBoxes aSelBoxes;
+ ::GetTableSel( rSh, aSelBoxes );
+ FndPara aPara( aSelBoxes, &aFndBox );
+ const SwTable& rTable = pTableNd->GetTable();
+ ForEach_FndLineCopyCol( const_cast<SwTableLines&>(rTable.GetTabLines()), &aPara );
+ }
+ rX = aFndBox.GetLines().size();
+ if( !rX )
+ return false;
+
+ rY = aFndBox.GetLines().front()->GetBoxes().size();
+ return true;
+}
+
+// init list
+SwSortDlg::SwSortDlg(weld::Window* pParent, SwWrtShell &rShell)
+ : GenericDialogController(pParent, "modules/swriter/ui/sortdialog.ui", "SortDialog")
+ , m_pParent(pParent)
+ , m_xColLbl(m_xBuilder->weld_label("column"))
+ , m_xKeyCB1(m_xBuilder->weld_check_button("key1"))
+ , m_xColEdt1(m_xBuilder->weld_spin_button("colsb1"))
+ , m_xTypDLB1(m_xBuilder->weld_combo_box("typelb1"))
+ , m_xSortUp1RB(m_xBuilder->weld_radio_button("up1"))
+ , m_xSortDn1RB(m_xBuilder->weld_radio_button("down1"))
+ , m_xKeyCB2(m_xBuilder->weld_check_button("key2"))
+ , m_xColEdt2(m_xBuilder->weld_spin_button("colsb2"))
+ , m_xTypDLB2(m_xBuilder->weld_combo_box("typelb2"))
+ , m_xSortUp2RB(m_xBuilder->weld_radio_button("up2"))
+ , m_xSortDn2RB(m_xBuilder->weld_radio_button("down2"))
+ , m_xKeyCB3(m_xBuilder->weld_check_button("key3"))
+ , m_xColEdt3(m_xBuilder->weld_spin_button("colsb3"))
+ , m_xTypDLB3(m_xBuilder->weld_combo_box("typelb3"))
+ , m_xSortUp3RB(m_xBuilder->weld_radio_button("up3"))
+ , m_xSortDn3RB(m_xBuilder->weld_radio_button("down3"))
+ , m_xColumnRB(m_xBuilder->weld_radio_button("columns"))
+ , m_xRowRB(m_xBuilder->weld_radio_button("rows"))
+ , m_xDelimTabRB(m_xBuilder->weld_radio_button("tabs"))
+ , m_xDelimFreeRB(m_xBuilder->weld_radio_button("character"))
+ , m_xDelimEdt(m_xBuilder->weld_entry("separator"))
+ , m_xDelimPB(m_xBuilder->weld_button("delimpb"))
+ , m_xLangLB(new SvxLanguageBox(m_xBuilder->weld_combo_box("langlb")))
+ , m_xCaseCB(m_xBuilder->weld_check_button("matchcase"))
+ , aColText(SwResId(STR_COL))
+ , aRowText(SwResId(STR_ROW))
+ , aNumericText(SwResId(STR_NUMERIC))
+ , rSh(rShell)
+ , nX(99)
+ , nY(99)
+{
+ if(rSh.GetSelectionType() &
+ (SelectionType::Table|SelectionType::TableCell) )
+ {
+ m_xColumnRB->set_active(bCol);
+ m_xColLbl->set_label(bCol ? aRowText : aColText);
+ m_xRowRB->set_active(!bCol);
+ m_xDelimTabRB->set_sensitive(false);
+ m_xDelimFreeRB->set_sensitive(false);
+ m_xDelimEdt->set_sensitive(false);
+ }
+ else
+ {
+ m_xColumnRB->set_sensitive(false);
+ m_xRowRB->set_active(true);
+ m_xColLbl->set_label(aColText);
+ }
+
+ // Set accessible names here because text of m_xColLbl may be changed
+ // by the if-else block above
+ m_xColEdt1->set_accessible_name(m_xColLbl->get_label());
+ m_xColEdt2->set_accessible_name(m_xColLbl->get_label());
+ m_xColEdt3->set_accessible_name(m_xColLbl->get_label());
+
+ // initialise
+ Link<weld::ToggleButton&,void> aLk = LINK(this, SwSortDlg, CheckHdl);
+ m_xKeyCB1->connect_toggled( aLk );
+ m_xKeyCB2->connect_toggled( aLk );
+ m_xKeyCB3->connect_toggled( aLk );
+ m_xColumnRB->connect_toggled( aLk );
+ m_xRowRB->connect_toggled( aLk );
+
+ aLk = LINK(this, SwSortDlg, DelimHdl);
+ m_xDelimFreeRB->connect_toggled(aLk);
+ m_xDelimTabRB->connect_toggled(aLk);
+
+ m_xDelimPB->connect_clicked( LINK( this, SwSortDlg, DelimCharHdl ));
+
+ m_xKeyCB1->set_active(bCheck1);
+ m_xKeyCB2->set_active(bCheck2);
+ m_xKeyCB3->set_active(bCheck3);
+
+ m_xColEdt1->set_value(nCol1);
+ m_xColEdt2->set_value(nCol2);
+ m_xColEdt3->set_value(nCol3);
+
+ // first initialise the language, then select the
+ if( LANGUAGE_NONE == nLang || LANGUAGE_DONTKNOW == nLang )
+ nLang = GetAppLanguage();
+
+ m_xLangLB->SetLanguageList( SvxLanguageListFlags::ALL | SvxLanguageListFlags::ONLY_KNOWN, true );
+ m_xLangLB->set_active_id(nLang);
+
+ LanguageHdl( nullptr );
+ m_xLangLB->connect_changed( LINK( this, SwSortDlg, LanguageListBoxHdl ));
+
+ m_xSortUp1RB->set_active(bAsc1);
+ m_xSortDn1RB->set_active(!bAsc1);
+ m_xSortUp2RB->set_active(bAsc2);
+ m_xSortDn2RB->set_active(!bAsc2);
+ m_xSortUp3RB->set_active(bAsc3);
+ m_xSortDn3RB->set_active(!bAsc3);
+
+ m_xCaseCB->set_active( bCsSens );
+
+ m_xDelimTabRB->set_active(cDeli == '\t');
+ if(!m_xDelimTabRB->get_active())
+ {
+ m_xDelimEdt->set_text(OUString(cDeli));
+ m_xDelimFreeRB->set_active(true);
+ DelimHdl(*m_xDelimFreeRB);
+ }
+ else
+ DelimHdl(*m_xDelimTabRB);
+
+ if( ::lcl_GetSelTable( rSh, nX, nY) )
+ {
+ sal_uInt16 nMax = m_xRowRB->get_active()? nY : nX;
+ m_xColEdt1->set_max(nMax);
+ m_xColEdt2->set_max(nMax);
+ m_xColEdt3->set_max(nMax);
+ }
+}
+
+sal_Unicode SwSortDlg::GetDelimChar() const
+{
+ sal_Unicode cRet = '\t';
+ if( !m_xDelimTabRB->get_active() )
+ {
+ OUString aTmp(m_xDelimEdt->get_text());
+ if( !aTmp.isEmpty() )
+ cRet = aTmp[0];
+ }
+ return cRet;
+}
+
+short SwSortDlg::run()
+{
+ short nRet = GenericDialogController::run();
+ if (nRet == RET_OK)
+ Apply();
+ return nRet;
+}
+
+// pass on to the Core
+void SwSortDlg::Apply()
+{
+ // save all settings
+ bCheck1 = m_xKeyCB1->get_active();
+ bCheck2 = m_xKeyCB2->get_active();
+ bCheck3 = m_xKeyCB3->get_active();
+
+ nCol1 = m_xColEdt1->get_value();
+ nCol2 = m_xColEdt2->get_value();
+ nCol3 = m_xColEdt3->get_value();
+
+ nType1 = m_xTypDLB1->get_active();
+ nType2 = m_xTypDLB2->get_active();
+ nType3 = m_xTypDLB3->get_active();
+
+ bAsc1 = m_xSortUp1RB->get_active();
+ bAsc2 = m_xSortUp2RB->get_active();
+ bAsc3 = m_xSortUp3RB->get_active();
+ bCol = m_xColumnRB->get_active();
+ nLang = m_xLangLB->get_active_id();
+ cDeli = GetDelimChar();
+ bCsSens = m_xCaseCB->get_active();
+
+ SwSortOptions aOptions;
+ if( bCheck1 )
+ {
+ OUString sEntry( m_xTypDLB1->get_active_text() );
+ if( sEntry == aNumericText )
+ sEntry.clear();
+ else if (!m_xTypDLB1->get_active_id().isEmpty())
+ sEntry = m_xTypDLB1->get_active_id();
+
+ aOptions.aKeys.push_back(
+ std::make_unique<SwSortKey>( nCol1, sEntry,
+ bAsc1 ? SwSortOrder::Ascending : SwSortOrder::Descending ));
+ }
+
+ if( bCheck2 )
+ {
+ OUString sEntry( m_xTypDLB2->get_active_text() );
+ if( sEntry == aNumericText )
+ sEntry.clear();
+ else if (!m_xTypDLB2->get_active_id().isEmpty())
+ sEntry = m_xTypDLB2->get_active_id();
+
+ aOptions.aKeys.push_back(
+ std::make_unique<SwSortKey>( nCol2, sEntry,
+ bAsc2 ? SwSortOrder::Ascending : SwSortOrder::Descending ));
+ }
+
+ if( bCheck3 )
+ {
+ OUString sEntry( m_xTypDLB3->get_active_text() );
+ if( sEntry == aNumericText )
+ sEntry.clear();
+ else if (!m_xTypDLB3->get_active_id().isEmpty())
+ sEntry = m_xTypDLB3->get_active_id();
+
+ aOptions.aKeys.push_back(
+ std::make_unique<SwSortKey>( nCol3, sEntry,
+ bAsc3 ? SwSortOrder::Ascending : SwSortOrder::Descending ));
+ }
+
+ aOptions.eDirection = bCol ? SwSortDirection::Columns : SwSortDirection::Rows;
+ aOptions.cDeli = cDeli;
+ aOptions.nLanguage = nLang;
+ aOptions.bTable = rSh.IsTableMode();
+ aOptions.bIgnoreCase = !bCsSens;
+
+ bool bRet;
+ {
+ SwWait aWait( *rSh.GetView().GetDocShell(), true );
+ rSh.StartAllAction();
+ bRet = rSh.Sort( aOptions );
+ if( bRet )
+ rSh.SetModified();
+ rSh.EndAllAction();
+ }
+
+ if (!bRet)
+ {
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(m_pParent,
+ VclMessageType::Info, VclButtonsType::Ok,
+ SwResId(STR_SRTERR)));
+ xInfoBox->run();
+ }
+}
+
+IMPL_LINK( SwSortDlg, DelimHdl, weld::ToggleButton&, rButton, void )
+{
+ bool bEnable = &rButton == m_xDelimFreeRB.get() && m_xDelimFreeRB->get_sensitive();
+ m_xDelimEdt->set_sensitive( bEnable );
+ m_xDelimPB->set_sensitive( bEnable );
+}
+
+IMPL_LINK_NOARG(SwSortDlg, DelimCharHdl, weld::Button&, void)
+{
+ SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
+ SfxAllItemSet aSet( rSh.GetAttrPool() );
+ aSet.Put( SfxInt32Item( SID_ATTR_CHAR, GetDelimChar() ) );
+ ScopedVclPtr<SfxAbstractDialog> pMap(pFact->CreateCharMapDialog(m_xDialog.get(), aSet, nullptr));
+ if( RET_OK == pMap->Execute() )
+ {
+ const SfxInt32Item* pItem = SfxItemSet::GetItem<SfxInt32Item>(pMap->GetOutputItemSet(), SID_ATTR_CHAR, false);
+ if ( pItem )
+ m_xDelimEdt->set_text(OUString(sal_Unicode(pItem->GetValue())));
+ }
+}
+
+IMPL_LINK( SwSortDlg, CheckHdl, weld::ToggleButton&, rControl, void )
+{
+ if (&rControl == m_xRowRB.get())
+ {
+ m_xColLbl->set_label(aColText);
+ m_xColEdt1->set_max(nY);
+ m_xColEdt2->set_max(nY);
+ m_xColEdt3->set_max(nY);
+
+ m_xColEdt1->set_accessible_name(aColText);
+ m_xColEdt2->set_accessible_name(aColText);
+ m_xColEdt3->set_accessible_name(aColText);
+ }
+ else if (&rControl == m_xColumnRB.get())
+ {
+ m_xColLbl->set_label(aRowText);
+ m_xColEdt1->set_max(nX);
+ m_xColEdt2->set_max(nX);
+ m_xColEdt3->set_max(nX);
+
+ m_xColEdt1->set_accessible_name(aRowText);
+ m_xColEdt2->set_accessible_name(aRowText);
+ m_xColEdt3->set_accessible_name(aRowText);
+ }
+ else if(!m_xKeyCB1->get_active() &&
+ !m_xKeyCB2->get_active() &&
+ !m_xKeyCB3->get_active())
+ {
+ rControl.set_active(true);
+ }
+}
+
+IMPL_LINK( SwSortDlg, LanguageListBoxHdl, weld::ComboBox&, rLBox, void )
+{
+ LanguageHdl(&rLBox);
+}
+
+void SwSortDlg::LanguageHdl(weld::ComboBox const* pLBox)
+{
+ Sequence < OUString > aSeq( GetAppCollator().listCollatorAlgorithms(
+ LanguageTag( m_xLangLB->get_active_id()).getLocale() ));
+
+ if (!m_xColRes)
+ m_xColRes.reset(new CollatorResource);
+
+ const int nLstBoxCnt = 3;
+ weld::ComboBox* aLstArr[ nLstBoxCnt ] = { m_xTypDLB1.get(), m_xTypDLB2.get(), m_xTypDLB3.get() };
+ sal_uInt16* const aTypeArr[ nLstBoxCnt ] = { &nType1, &nType2, &nType3 };
+ OUString aOldStrArr[ nLstBoxCnt ];
+
+ for( int n = 0; n < nLstBoxCnt; ++n )
+ {
+ weld::ComboBox* pL = aLstArr[ n ];
+ OUString sUserData = pL->get_active_id();
+ if (!sUserData.isEmpty())
+ aOldStrArr[ n ] = sUserData;
+ pL->clear();
+ }
+
+ OUString sAlg, sUINm;
+ const sal_Int32 nEnd = aSeq.getLength();
+ for( sal_Int32 nCnt = 0; nCnt <= nEnd; ++nCnt )
+ {
+ if( nCnt < nEnd )
+ {
+ sAlg = aSeq[ nCnt ];
+ sUINm = m_xColRes->GetTranslation( sAlg );
+ }
+ else
+ sUINm = sAlg = aNumericText;
+
+ for( int n = 0; n < nLstBoxCnt; ++n )
+ {
+ weld::ComboBox* pL = aLstArr[ n ];
+ pL->append(sAlg, sUINm);
+ if (pLBox && sAlg == aOldStrArr[n])
+ pL->set_active_id(sAlg);
+ }
+ }
+
+ for( int n = 0; n < nLstBoxCnt; ++n )
+ {
+ weld::ComboBox* pL = aLstArr[ n ];
+ if( !pLBox )
+ pL->set_active(*aTypeArr[n]);
+ else if (pL->get_active() == -1)
+ pL->set_active(0);
+ }
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */