/************************************************************** * * 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_sw.hxx" #ifdef SW_DLLIMPLEMENTATION #undef SW_DLLIMPLEMENTATION #endif #include "srtdlg.hxx" #ifndef _MSGBOX_HXX //autogen #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // sw/inc/tblsel.hxx SV_IMPL_PTRARR( _FndBoxes, _FndBox* ) SV_IMPL_PTRARR( _FndLines, _FndLine* ) static sal_Bool bCheck1 = sal_True; static sal_Bool bCheck2 = sal_False; static sal_Bool bCheck3 = sal_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 sal_uInt16 nLang = LANGUAGE_NONE; static sal_Bool bAsc1 = sal_True; static sal_Bool bAsc2 = sal_True; static sal_Bool bAsc3 = sal_True; static sal_Bool bCol = sal_False; static sal_Bool bCsSens= sal_False; static sal_Unicode cDeli = '\t'; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::uno; using ::rtl::OUString; void lcl_ClearLstBoxAndDelUserData( ListBox& rLstBox ) { void* pDel; for( sal_uInt16 n = 0, nEnd = rLstBox.GetEntryCount(); n < nEnd; ++n ) if( 0 != ( pDel = rLstBox.GetEntryData( n )) ) delete (String*)pDel; rLstBox.Clear(); } /*-------------------------------------------------------------------- Beschreibung: Fuer Tabellenselektion sel. Zeilen und Spalten feststellen --------------------------------------------------------------------*/ sal_Bool lcl_GetSelTbl( SwWrtShell &rSh, sal_uInt16& rX, sal_uInt16& rY ) { const SwTableNode* pTblNd = rSh.IsCrsrInTbl(); if( !pTblNd ) return sal_False; _FndBox aFndBox( 0, 0 ); // suche alle Boxen / Lines { SwSelBoxes aSelBoxes; ::GetTblSel( rSh, aSelBoxes ); _FndPara aPara( aSelBoxes, &aFndBox ); const SwTable& rTbl = pTblNd->GetTable(); ((SwTableLines&)rTbl.GetTabLines()).ForEach( &_FndLineCopyCol, &aPara ); } rX = aFndBox.GetLines().Count(); if( !rX ) return sal_False; rY = aFndBox.GetLines()[0]->GetBoxes().Count(); return sal_True; } /*-------------------------------------------------------------------- Beschreibung: Init-Liste --------------------------------------------------------------------*/ SwSortDlg::SwSortDlg(Window* pParent, SwWrtShell &rShell) : SvxStandardDialog(pParent, SW_RES(DLG_SORTING)), aColLbl(this, SW_RES(FT_COL )), aTypLbl(this, SW_RES(FT_KEYTYP)), aDirLbl(this, SW_RES(FT_DIR )), aSortFL(this, SW_RES(FL_SORT_2 )), aKeyCB1(this, SW_RES(CB_KEY1 )), aColEdt1(this, SW_RES(ED_KEY1 )), aTypDLB1(this, SW_RES(DLB_KEY1 )), aSortUpRB(this, SW_RES(RB_UP )), aSortDnRB(this, SW_RES(RB_DN )), aKeyCB2(this, SW_RES(CB_KEY2 )), aColEdt2(this, SW_RES(ED_KEY2 )), aTypDLB2(this, SW_RES(DLB_KEY2 )), aSortUp2RB(this, SW_RES(RB_UP2 )), aSortDn2RB(this, SW_RES(RB_DN2 )), aKeyCB3(this, SW_RES(CB_KEY3 )), aColEdt3(this, SW_RES(ED_KEY3 )), aTypDLB3(this, SW_RES(DLB_KEY3 )), aSortUp3RB(this, SW_RES(RB_UP3 )), aSortDn3RB(this, SW_RES(RB_DN3 )), aDirFL(this, SW_RES(FL_DIR )), aColumnRB(this, SW_RES(RB_COL )), aRowRB(this, SW_RES(RB_ROW )), aDelimFL(this, SW_RES(FL_DELIM )), aDelimTabRB(this, SW_RES(RB_TAB )), aDelimFreeRB(this, SW_RES(RB_TABCH )), aDelimEdt(this, SW_RES(ED_TABCH )), aDelimPB(this, SW_RES( PB_DELIM)), aLangFL(this, SW_RES( FL_LANG )), aLangLB(this, SW_RES( LB_LANG )), aSortOptFL(this, SW_RES( FL_SORT )), aCaseCB(this, SW_RES( CB_CASE )), aOkBtn(this, SW_RES(BT_OK )), aCancelBtn(this, SW_RES(BT_CANCEL)), aHelpBtn(this, SW_RES(BT_HELP )), aColTxt( SW_RES(STR_COL)), aRowTxt( SW_RES(STR_ROW)), aNumericTxt( SW_RES(STR_NUMERIC)), rSh(rShell), pColRes( 0 ), nX( 99 ), nY( 99 ) { aColEdt1.SetAccessibleName(aColLbl.GetText()); aColEdt2.SetAccessibleName(aColLbl.GetText()); aColEdt3.SetAccessibleName(aColLbl.GetText()); aTypDLB1.SetAccessibleName(aTypLbl.GetText()); aTypDLB2.SetAccessibleName(aTypLbl.GetText()); aTypDLB3.SetAccessibleName(aTypLbl.GetText()); aSortUpRB.SetAccessibleRelationMemberOf( &aKeyCB1 ); aSortDnRB.SetAccessibleRelationMemberOf( &aKeyCB1 ); aSortUp2RB.SetAccessibleRelationMemberOf( &aKeyCB2 ); aSortDn2RB.SetAccessibleRelationMemberOf( &aKeyCB2 ); aSortUp3RB.SetAccessibleRelationMemberOf( &aKeyCB3 ); aSortDn3RB.SetAccessibleRelationMemberOf( &aKeyCB3 ); aDelimEdt.SetMaxTextLen( 1 ); if(rSh.GetSelectionType() & (nsSelectionType::SEL_TBL|nsSelectionType::SEL_TBL_CELLS) ) { aColumnRB.Check(bCol); aColLbl.SetText(bCol ? aRowTxt : aColTxt); aRowRB.Check(!bCol); aDelimTabRB.Enable(sal_False); aDelimFreeRB.Enable(sal_False); aDelimEdt.Enable(sal_False); } else { aColumnRB.Enable(sal_False); aRowRB.Check(sal_True); aColLbl.SetText(aColTxt); } // Initialisieren Link aLk = LINK(this,SwSortDlg, CheckHdl); aKeyCB1.SetClickHdl( aLk ); aKeyCB2.SetClickHdl( aLk ); aKeyCB3.SetClickHdl( aLk ); aColumnRB.SetClickHdl( aLk ); aRowRB.SetClickHdl( aLk ); aLk = LINK(this,SwSortDlg, DelimHdl); aDelimFreeRB.SetClickHdl(aLk); aDelimTabRB.SetClickHdl(aLk); aDelimPB.SetClickHdl( LINK( this, SwSortDlg, DelimCharHdl )); aKeyCB1.Check(bCheck1); aKeyCB2.Check(bCheck2); aKeyCB3.Check(bCheck3); aColEdt1.SetValue(nCol1); aColEdt2.SetValue(nCol2); aColEdt3.SetValue(nCol3); // first initialise the language, then select the if( LANGUAGE_NONE == nLang || LANGUAGE_DONTKNOW == nLang ) nLang = (sal_uInt16)GetAppLanguage(); aLangLB.SetLanguageList( LANG_LIST_ALL | LANG_LIST_ONLY_KNOWN, sal_True, sal_False); aLangLB.SelectLanguage( nLang ); LanguageHdl( 0 ); aLangLB.SetSelectHdl( LINK( this, SwSortDlg, LanguageHdl )); aSortUpRB.Check(bAsc1); aSortDnRB.Check(!bAsc1); aSortUp2RB.Check(bAsc2); aSortDn2RB.Check(!bAsc2); aSortUp3RB.Check(bAsc3); aSortDn3RB.Check(!bAsc3); aCaseCB.Check( bCsSens ); aDelimTabRB.Check(cDeli == '\t'); if(!aDelimTabRB.IsChecked()) { aDelimEdt.SetText(cDeli); aDelimFreeRB.Check(sal_True); DelimHdl(&aDelimFreeRB); } else DelimHdl(&aDelimTabRB); FreeResource(); if( ::lcl_GetSelTbl( rSh, nX, nY) ) { sal_uInt16 nMax = aRowRB.IsChecked()? nY : nX; aColEdt1.SetMax(nMax); aColEdt2.SetMax(nMax); aColEdt3.SetMax(nMax); } aDelimEdt.SetAccessibleRelationLabeledBy(&aDelimFreeRB); aDelimPB.SetAccessibleRelationLabeledBy(&aDelimFreeRB); aDelimPB.SetAccessibleRelationMemberOf(&aDelimFL); aColEdt1.SetAccessibleRelationMemberOf(&aKeyCB1); aColEdt1.SetAccessibleRelationLabeledBy(&aColLbl); aTypDLB1.SetAccessibleRelationMemberOf(&aKeyCB1); aTypDLB1.SetAccessibleRelationLabeledBy(&aTypLbl); aColEdt2.SetAccessibleRelationMemberOf(&aKeyCB2); aColEdt2.SetAccessibleRelationLabeledBy(&aColLbl); aTypDLB2.SetAccessibleRelationMemberOf(&aKeyCB2); aTypDLB2.SetAccessibleRelationLabeledBy(&aTypLbl); aColEdt3.SetAccessibleRelationMemberOf(&aKeyCB3); aColEdt3.SetAccessibleRelationLabeledBy(&aColLbl); aTypDLB3.SetAccessibleRelationMemberOf(&aKeyCB3); aTypDLB3.SetAccessibleRelationLabeledBy(&aTypLbl); } SwSortDlg::~SwSortDlg() { ::lcl_ClearLstBoxAndDelUserData( aTypDLB1 ); ::lcl_ClearLstBoxAndDelUserData( aTypDLB2 ); ::lcl_ClearLstBoxAndDelUserData( aTypDLB3 ); delete pColRes; } sal_Unicode SwSortDlg::GetDelimChar() const { sal_Unicode cRet = '\t'; if( !aDelimTabRB.IsChecked() ) { String aTmp( aDelimEdt.GetText() ); if( aTmp.Len() ) cRet = aTmp.GetChar( 0 ); } return cRet; } /*-------------------------------------------------------------------- Beschreibung: An die Core weiterreichen --------------------------------------------------------------------*/ void SwSortDlg::Apply() { // Alte Einstellung speichern // bCheck1 = aKeyCB1.IsChecked(); bCheck2 = aKeyCB2.IsChecked(); bCheck3 = aKeyCB3.IsChecked(); nCol1 = (sal_uInt16)aColEdt1.GetValue(); nCol2 = (sal_uInt16)aColEdt2.GetValue(); nCol3 = (sal_uInt16)aColEdt3.GetValue(); nType1 = aTypDLB1.GetSelectEntryPos(); nType2 = aTypDLB2.GetSelectEntryPos(); nType3 = aTypDLB3.GetSelectEntryPos(); bAsc1 = aSortUpRB.IsChecked(); bAsc2 = aSortUp2RB.IsChecked(); bAsc3 = aSortUp3RB.IsChecked(); bCol = aColumnRB.IsChecked(); nLang = aLangLB.GetSelectLanguage(); cDeli = GetDelimChar(); bCsSens = aCaseCB.IsChecked(); void* pUserData; SwSortOptions aOptions; if( bCheck1 ) { String sEntry( aTypDLB1.GetSelectEntry() ); if( sEntry == aNumericTxt ) sEntry.Erase(); else if( 0 != (pUserData = aTypDLB1.GetEntryData( aTypDLB1.GetSelectEntryPos())) ) sEntry = *(String*)pUserData; SwSortKey *pKey = new SwSortKey( nCol1, sEntry, bAsc1 ? SRT_ASCENDING : SRT_DESCENDING ); aOptions.aKeys.C40_INSERT(SwSortKey, pKey, aOptions.aKeys.Count()); } if( bCheck2 ) { String sEntry( aTypDLB2.GetSelectEntry() ); if( sEntry == aNumericTxt ) sEntry.Erase(); else if( 0 != (pUserData = aTypDLB2.GetEntryData( aTypDLB2.GetSelectEntryPos())) ) sEntry = *(String*)pUserData; SwSortKey *pKey = new SwSortKey( nCol2, sEntry, bAsc2 ? SRT_ASCENDING : SRT_DESCENDING ); aOptions.aKeys.C40_INSERT( SwSortKey, pKey, aOptions.aKeys.Count() ); } if( bCheck3 ) { String sEntry( aTypDLB3.GetSelectEntry() ); if( sEntry == aNumericTxt ) sEntry.Erase(); else if( 0 != (pUserData = aTypDLB3.GetEntryData( aTypDLB3.GetSelectEntryPos())) ) sEntry = *(String*)pUserData; SwSortKey *pKey = new SwSortKey( nCol3, sEntry, bAsc3 ? SRT_ASCENDING : SRT_DESCENDING ); aOptions.aKeys.C40_INSERT( SwSortKey, pKey, aOptions.aKeys.Count() ); } aOptions.eDirection = bCol ? SRT_COLUMNS : SRT_ROWS; aOptions.cDeli = cDeli; aOptions.nLanguage = nLang; aOptions.bTable = rSh.IsTableMode(); aOptions.bIgnoreCase = !bCsSens; sal_Bool bRet; { SwWait aWait( *rSh.GetView().GetDocShell(), true ); rSh.StartAllAction(); if( 0 != (bRet = rSh.Sort( aOptions ))) rSh.SetModified(); rSh.EndAllAction(); } if( !bRet ) InfoBox( this->GetParent(), SW_RES(MSG_SRTERR)).Execute(); } /* -----------------30.09.98 10:03------------------- * * --------------------------------------------------*/ IMPL_LINK( SwSortDlg, DelimHdl, RadioButton*, pButton ) { sal_Bool bEnable = pButton == &aDelimFreeRB && aDelimFreeRB.IsEnabled(); aDelimEdt.Enable( bEnable ); aDelimPB.Enable( bEnable ); return 0; } IMPL_LINK( SwSortDlg, DelimCharHdl, PushButton*, EMPTYARG ) { SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create(); if(pFact) { SfxAllItemSet aSet( rSh.GetAttrPool() ); aSet.Put( SfxInt32Item( SID_ATTR_CHAR, GetDelimChar() ) ); SfxAbstractDialog* pMap = pFact->CreateSfxDialog( &aDelimPB, aSet, rSh.GetView().GetViewFrame()->GetFrame().GetFrameInterface(), RID_SVXDLG_CHARMAP ); if( RET_OK == pMap->Execute() ) { SFX_ITEMSET_ARG( pMap->GetOutputItemSet(), pItem, SfxInt32Item, SID_ATTR_CHAR, sal_False ); if ( pItem ) aDelimEdt.SetText( sal_Unicode ( pItem->GetValue() ) ); } delete pMap; } return 0; } IMPL_LINK( SwSortDlg, CheckHdl, CheckBox *, pCheck ) { if( pCheck == ( CheckBox* ) &aRowRB) { aColLbl.SetText(aColTxt); aColEdt1.SetMax(nY); aColEdt2.SetMax(nY); aColEdt3.SetMax(nY); aColEdt1.SetAccessibleName(aColTxt); aColEdt2.SetAccessibleName(aColTxt); aColEdt3.SetAccessibleName(aColTxt); } else if( pCheck == ( CheckBox* ) &aColumnRB) { aColLbl.SetText(aRowTxt); aColEdt1.SetMax(nX); aColEdt2.SetMax(nX); aColEdt3.SetMax(nX); aColEdt1.SetAccessibleName(aRowTxt); aColEdt2.SetAccessibleName(aRowTxt); aColEdt3.SetAccessibleName(aRowTxt); } else if(!aKeyCB1.IsChecked() && !aKeyCB2.IsChecked() && !aKeyCB3.IsChecked()) pCheck->Check(sal_True); return 0; } IMPL_LINK( SwSortDlg, LanguageHdl, ListBox*, pLBox ) { Locale aLcl( SvxCreateLocale( aLangLB.GetSelectLanguage() ) ); Sequence < OUString > aSeq( GetAppCollator().listCollatorAlgorithms( aLcl )); if( !pColRes ) pColRes = new CollatorRessource(); const sal_uInt16 nLstBoxCnt = 3; ListBox* aLstArr[ nLstBoxCnt ] = { &aTypDLB1, &aTypDLB2, &aTypDLB3 }; sal_uInt16* aTypeArr[ nLstBoxCnt ] = { &nType1, &nType2, &nType3 }; String aOldStrArr[ nLstBoxCnt ]; sal_uInt16 n; void* pUserData; for( n = 0; n < nLstBoxCnt; ++n ) { ListBox* pL = aLstArr[ n ]; if( 0 != (pUserData = pL->GetEntryData( pL->GetSelectEntryPos())) ) aOldStrArr[ n ] = *(String*)pUserData; ::lcl_ClearLstBoxAndDelUserData( *pL ); } sal_uInt16 nInsPos; String sAlg, sUINm; for( long nCnt = 0, nEnd = aSeq.getLength(); nCnt <= nEnd; ++nCnt ) { if( nCnt < nEnd ) sUINm = pColRes->GetTranslation( sAlg = aSeq[ nCnt ] ); else sUINm = sAlg = aNumericTxt; for( n = 0; n < nLstBoxCnt; ++n ) { ListBox* pL = aLstArr[ n ]; nInsPos = pL->InsertEntry( sUINm ); pL->SetEntryData( nInsPos, new String( sAlg )); if( pLBox && sAlg == aOldStrArr[ n ] ) pL->SelectEntryPos( nInsPos ); } } for( n = 0; n < nLstBoxCnt; ++n ) { ListBox* pL = aLstArr[ n ]; if( !pLBox ) pL->SelectEntryPos( *aTypeArr[n] ); else if( LISTBOX_ENTRY_NOTFOUND == pL->GetSelectEntryPos() ) pL->SelectEntryPos( 0 ); } return 0; }