1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 #ifdef SW_DLLIMPLEMENTATION
27 #undef SW_DLLIMPLEMENTATION
28 #endif
29
30 #include "srtdlg.hxx"
31
32 #ifndef _MSGBOX_HXX //autogen
33 #include <vcl/msgbox.hxx>
34 #endif
35 #include <svl/intitem.hxx>
36 #include <svl/eitem.hxx>
37 #include <sfx2/dispatch.hxx>
38 #include <svx/svxids.hrc>
39 #include <editeng/unolingu.hxx>
40 #include <svx/svxdlg.hxx>
41 #include <svx/dialogs.hrc>
42 #include <unotools/collatorwrapper.hxx>
43 #include <svtools/collatorres.hxx>
44 #include <swwait.hxx>
45 #include <view.hxx>
46 #include <cmdid.h>
47 #include <wrtsh.hxx>
48 #include <misc.hrc>
49 #include <srtdlg.hrc>
50 #include <swtable.hxx>
51 #include <node.hxx>
52 #include <tblsel.hxx>
53 #include <sfx2/request.hxx>
54
55 // sw/inc/tblsel.hxx
56 SV_IMPL_PTRARR( _FndBoxes, _FndBox* )
57 SV_IMPL_PTRARR( _FndLines, _FndLine* )
58
59 static sal_Bool bCheck1 = sal_True;
60 static sal_Bool bCheck2 = sal_False;
61 static sal_Bool bCheck3 = sal_False;
62
63 static sal_uInt16 nCol1 = 1;
64 static sal_uInt16 nCol2 = 1;
65 static sal_uInt16 nCol3 = 1;
66
67 static sal_uInt16 nType1 = 0;
68 static sal_uInt16 nType2 = 0;
69 static sal_uInt16 nType3 = 0;
70
71 static sal_uInt16 nLang = LANGUAGE_NONE;
72
73 static sal_Bool bAsc1 = sal_True;
74 static sal_Bool bAsc2 = sal_True;
75 static sal_Bool bAsc3 = sal_True;
76 static sal_Bool bCol = sal_False;
77 static sal_Bool bCsSens= sal_False;
78
79 static sal_Unicode cDeli = '\t';
80
81 using namespace ::com::sun::star::lang;
82 using namespace ::com::sun::star::uno;
83 using ::rtl::OUString;
84
85
lcl_ClearLstBoxAndDelUserData(ListBox & rLstBox)86 void lcl_ClearLstBoxAndDelUserData( ListBox& rLstBox )
87 {
88 void* pDel;
89 for( sal_uInt16 n = 0, nEnd = rLstBox.GetEntryCount(); n < nEnd; ++n )
90 if( 0 != ( pDel = rLstBox.GetEntryData( n )) )
91 delete (String*)pDel;
92 rLstBox.Clear();
93 }
94
95 /*--------------------------------------------------------------------
96 Beschreibung: Fuer Tabellenselektion sel. Zeilen und Spalten
97 feststellen
98 --------------------------------------------------------------------*/
99
100
lcl_GetSelTbl(SwWrtShell & rSh,sal_uInt16 & rX,sal_uInt16 & rY)101 sal_Bool lcl_GetSelTbl( SwWrtShell &rSh, sal_uInt16& rX, sal_uInt16& rY )
102 {
103 const SwTableNode* pTblNd = rSh.IsCrsrInTbl();
104 if( !pTblNd )
105 return sal_False;
106
107 _FndBox aFndBox( 0, 0 );
108
109 // suche alle Boxen / Lines
110 {
111 SwSelBoxes aSelBoxes;
112 ::GetTblSel( rSh, aSelBoxes );
113 _FndPara aPara( aSelBoxes, &aFndBox );
114 const SwTable& rTbl = pTblNd->GetTable();
115 ((SwTableLines&)rTbl.GetTabLines()).ForEach( &_FndLineCopyCol, &aPara );
116 }
117 rX = aFndBox.GetLines().Count();
118 if( !rX )
119 return sal_False;
120
121 rY = aFndBox.GetLines()[0]->GetBoxes().Count();
122 return sal_True;
123 }
124
125 /*--------------------------------------------------------------------
126 Beschreibung: Init-Liste
127 --------------------------------------------------------------------*/
128
SwSortDlg(Window * pParent,SwWrtShell & rShell)129 SwSortDlg::SwSortDlg(Window* pParent, SwWrtShell &rShell) :
130
131 SvxStandardDialog(pParent, SW_RES(DLG_SORTING)),
132
133 aColLbl(this, SW_RES(FT_COL )),
134 aTypLbl(this, SW_RES(FT_KEYTYP)),
135 aDirLbl(this, SW_RES(FT_DIR )),
136 aSortFL(this, SW_RES(FL_SORT_2 )),
137
138
139 aKeyCB1(this, SW_RES(CB_KEY1 )),
140 aColEdt1(this, SW_RES(ED_KEY1 )),
141 aTypDLB1(this, SW_RES(DLB_KEY1 )),
142 aSortUpRB(this, SW_RES(RB_UP )),
143 aSortDnRB(this, SW_RES(RB_DN )),
144
145 aKeyCB2(this, SW_RES(CB_KEY2 )),
146 aColEdt2(this, SW_RES(ED_KEY2 )),
147 aTypDLB2(this, SW_RES(DLB_KEY2 )),
148 aSortUp2RB(this, SW_RES(RB_UP2 )),
149 aSortDn2RB(this, SW_RES(RB_DN2 )),
150
151 aKeyCB3(this, SW_RES(CB_KEY3 )),
152 aColEdt3(this, SW_RES(ED_KEY3 )),
153 aTypDLB3(this, SW_RES(DLB_KEY3 )),
154 aSortUp3RB(this, SW_RES(RB_UP3 )),
155 aSortDn3RB(this, SW_RES(RB_DN3 )),
156 aDirFL(this, SW_RES(FL_DIR )),
157
158 aColumnRB(this, SW_RES(RB_COL )),
159 aRowRB(this, SW_RES(RB_ROW )),
160
161 aDelimFL(this, SW_RES(FL_DELIM )),
162 aDelimTabRB(this, SW_RES(RB_TAB )),
163 aDelimFreeRB(this, SW_RES(RB_TABCH )),
164 aDelimEdt(this, SW_RES(ED_TABCH )),
165 aDelimPB(this, SW_RES( PB_DELIM)),
166
167 aLangFL(this, SW_RES( FL_LANG )),
168 aLangLB(this, SW_RES( LB_LANG )),
169
170 aSortOptFL(this, SW_RES( FL_SORT )),
171 aCaseCB(this, SW_RES( CB_CASE )),
172
173 aOkBtn(this, SW_RES(BT_OK )),
174 aCancelBtn(this, SW_RES(BT_CANCEL)),
175 aHelpBtn(this, SW_RES(BT_HELP )),
176
177 aColTxt( SW_RES(STR_COL)),
178 aRowTxt( SW_RES(STR_ROW)),
179 aNumericTxt( SW_RES(STR_NUMERIC)),
180 rSh(rShell),
181 pColRes( 0 ),
182 nX( 99 ),
183 nY( 99 )
184 {
185 aColEdt1.SetAccessibleName(aColLbl.GetText());
186 aColEdt2.SetAccessibleName(aColLbl.GetText());
187 aColEdt3.SetAccessibleName(aColLbl.GetText());
188 aTypDLB1.SetAccessibleName(aTypLbl.GetText());
189 aTypDLB2.SetAccessibleName(aTypLbl.GetText());
190 aTypDLB3.SetAccessibleName(aTypLbl.GetText());
191 aSortUpRB.SetAccessibleRelationMemberOf( &aKeyCB1 );
192 aSortDnRB.SetAccessibleRelationMemberOf( &aKeyCB1 );
193 aSortUp2RB.SetAccessibleRelationMemberOf( &aKeyCB2 );
194 aSortDn2RB.SetAccessibleRelationMemberOf( &aKeyCB2 );
195 aSortUp3RB.SetAccessibleRelationMemberOf( &aKeyCB3 );
196 aSortDn3RB.SetAccessibleRelationMemberOf( &aKeyCB3 );
197
198 aDelimEdt.SetMaxTextLen( 1 );
199 if(rSh.GetSelectionType() &
200 (nsSelectionType::SEL_TBL|nsSelectionType::SEL_TBL_CELLS) )
201 {
202 aColumnRB.Check(bCol);
203 aColLbl.SetText(bCol ? aRowTxt : aColTxt);
204 aRowRB.Check(!bCol);
205 aDelimTabRB.Enable(sal_False);
206 aDelimFreeRB.Enable(sal_False);
207 aDelimEdt.Enable(sal_False);
208 }
209 else
210 {
211 aColumnRB.Enable(sal_False);
212 aRowRB.Check(sal_True);
213 aColLbl.SetText(aColTxt);
214 }
215
216 // Initialisieren
217 Link aLk = LINK(this,SwSortDlg, CheckHdl);
218 aKeyCB1.SetClickHdl( aLk );
219 aKeyCB2.SetClickHdl( aLk );
220 aKeyCB3.SetClickHdl( aLk );
221 aColumnRB.SetClickHdl( aLk );
222 aRowRB.SetClickHdl( aLk );
223
224 aLk = LINK(this,SwSortDlg, DelimHdl);
225 aDelimFreeRB.SetClickHdl(aLk);
226 aDelimTabRB.SetClickHdl(aLk);
227
228 aDelimPB.SetClickHdl( LINK( this, SwSortDlg, DelimCharHdl ));
229
230 aKeyCB1.Check(bCheck1);
231 aKeyCB2.Check(bCheck2);
232 aKeyCB3.Check(bCheck3);
233
234 aColEdt1.SetValue(nCol1);
235 aColEdt2.SetValue(nCol2);
236 aColEdt3.SetValue(nCol3);
237
238 // first initialise the language, then select the
239 if( LANGUAGE_NONE == nLang || LANGUAGE_DONTKNOW == nLang )
240 nLang = (sal_uInt16)GetAppLanguage();
241
242 aLangLB.SetLanguageList( LANG_LIST_ALL | LANG_LIST_ONLY_KNOWN, sal_True, sal_False);
243 aLangLB.SelectLanguage( nLang );
244
245 LanguageHdl( 0 );
246 aLangLB.SetSelectHdl( LINK( this, SwSortDlg, LanguageHdl ));
247
248 aSortUpRB.Check(bAsc1);
249 aSortDnRB.Check(!bAsc1);
250 aSortUp2RB.Check(bAsc2);
251 aSortDn2RB.Check(!bAsc2);
252 aSortUp3RB.Check(bAsc3);
253 aSortDn3RB.Check(!bAsc3);
254
255 aCaseCB.Check( bCsSens );
256
257 aDelimTabRB.Check(cDeli == '\t');
258 if(!aDelimTabRB.IsChecked())
259 {
260 aDelimEdt.SetText(cDeli);
261 aDelimFreeRB.Check(sal_True);
262 DelimHdl(&aDelimFreeRB);
263 }
264 else
265 DelimHdl(&aDelimTabRB);
266
267 FreeResource();
268 if( ::lcl_GetSelTbl( rSh, nX, nY) )
269 {
270 sal_uInt16 nMax = aRowRB.IsChecked()? nY : nX;
271 aColEdt1.SetMax(nMax);
272 aColEdt2.SetMax(nMax);
273 aColEdt3.SetMax(nMax);
274 }
275
276 aDelimEdt.SetAccessibleRelationLabeledBy(&aDelimFreeRB);
277 aDelimPB.SetAccessibleRelationLabeledBy(&aDelimFreeRB);
278 aDelimPB.SetAccessibleRelationMemberOf(&aDelimFL);
279
280 aColEdt1.SetAccessibleRelationMemberOf(&aKeyCB1);
281 aColEdt1.SetAccessibleRelationLabeledBy(&aColLbl);
282 aTypDLB1.SetAccessibleRelationMemberOf(&aKeyCB1);
283 aTypDLB1.SetAccessibleRelationLabeledBy(&aTypLbl);
284
285 aColEdt2.SetAccessibleRelationMemberOf(&aKeyCB2);
286 aColEdt2.SetAccessibleRelationLabeledBy(&aColLbl);
287 aTypDLB2.SetAccessibleRelationMemberOf(&aKeyCB2);
288 aTypDLB2.SetAccessibleRelationLabeledBy(&aTypLbl);
289
290 aColEdt3.SetAccessibleRelationMemberOf(&aKeyCB3);
291 aColEdt3.SetAccessibleRelationLabeledBy(&aColLbl);
292 aTypDLB3.SetAccessibleRelationMemberOf(&aKeyCB3);
293 aTypDLB3.SetAccessibleRelationLabeledBy(&aTypLbl);
294 }
295
~SwSortDlg()296 SwSortDlg::~SwSortDlg()
297 {
298 ::lcl_ClearLstBoxAndDelUserData( aTypDLB1 );
299 ::lcl_ClearLstBoxAndDelUserData( aTypDLB2 );
300 ::lcl_ClearLstBoxAndDelUserData( aTypDLB3 );
301 delete pColRes;
302 }
303
GetDelimChar() const304 sal_Unicode SwSortDlg::GetDelimChar() const
305 {
306 sal_Unicode cRet = '\t';
307 if( !aDelimTabRB.IsChecked() )
308 {
309 String aTmp( aDelimEdt.GetText() );
310 if( aTmp.Len() )
311 cRet = aTmp.GetChar( 0 );
312 }
313 return cRet;
314 }
315
316 /*--------------------------------------------------------------------
317 Beschreibung: An die Core weiterreichen
318 --------------------------------------------------------------------*/
Apply()319 void SwSortDlg::Apply()
320 {
321 // Alte Einstellung speichern
322 //
323 bCheck1 = aKeyCB1.IsChecked();
324 bCheck2 = aKeyCB2.IsChecked();
325 bCheck3 = aKeyCB3.IsChecked();
326
327 nCol1 = (sal_uInt16)aColEdt1.GetValue();
328 nCol2 = (sal_uInt16)aColEdt2.GetValue();
329 nCol3 = (sal_uInt16)aColEdt3.GetValue();
330
331 nType1 = aTypDLB1.GetSelectEntryPos();
332 nType2 = aTypDLB2.GetSelectEntryPos();
333 nType3 = aTypDLB3.GetSelectEntryPos();
334
335 bAsc1 = aSortUpRB.IsChecked();
336 bAsc2 = aSortUp2RB.IsChecked();
337 bAsc3 = aSortUp3RB.IsChecked();
338 bCol = aColumnRB.IsChecked();
339 nLang = aLangLB.GetSelectLanguage();
340 cDeli = GetDelimChar();
341 bCsSens = aCaseCB.IsChecked();
342
343 void* pUserData;
344 SwSortOptions aOptions;
345 if( bCheck1 )
346 {
347 String sEntry( aTypDLB1.GetSelectEntry() );
348 if( sEntry == aNumericTxt )
349 sEntry.Erase();
350 else if( 0 != (pUserData = aTypDLB1.GetEntryData(
351 aTypDLB1.GetSelectEntryPos())) )
352 sEntry = *(String*)pUserData;
353
354 SwSortKey *pKey = new SwSortKey( nCol1, sEntry,
355 bAsc1 ? SRT_ASCENDING : SRT_DESCENDING );
356 aOptions.aKeys.C40_INSERT(SwSortKey, pKey, aOptions.aKeys.Count());
357 }
358
359 if( bCheck2 )
360 {
361 String sEntry( aTypDLB2.GetSelectEntry() );
362 if( sEntry == aNumericTxt )
363 sEntry.Erase();
364 else if( 0 != (pUserData = aTypDLB2.GetEntryData(
365 aTypDLB2.GetSelectEntryPos())) )
366 sEntry = *(String*)pUserData;
367
368 SwSortKey *pKey = new SwSortKey( nCol2, sEntry,
369 bAsc2 ? SRT_ASCENDING : SRT_DESCENDING );
370 aOptions.aKeys.C40_INSERT( SwSortKey, pKey, aOptions.aKeys.Count() );
371 }
372
373 if( bCheck3 )
374 {
375 String sEntry( aTypDLB3.GetSelectEntry() );
376 if( sEntry == aNumericTxt )
377 sEntry.Erase();
378 else if( 0 != (pUserData = aTypDLB3.GetEntryData(
379 aTypDLB3.GetSelectEntryPos())) )
380 sEntry = *(String*)pUserData;
381
382 SwSortKey *pKey = new SwSortKey( nCol3, sEntry,
383 bAsc3 ? SRT_ASCENDING : SRT_DESCENDING );
384 aOptions.aKeys.C40_INSERT( SwSortKey, pKey, aOptions.aKeys.Count() );
385 }
386
387 aOptions.eDirection = bCol ? SRT_COLUMNS : SRT_ROWS;
388 aOptions.cDeli = cDeli;
389 aOptions.nLanguage = nLang;
390 aOptions.bTable = rSh.IsTableMode();
391 aOptions.bIgnoreCase = !bCsSens;
392
393 sal_Bool bRet;
394 {
395 SwWait aWait( *rSh.GetView().GetDocShell(), true );
396 rSh.StartAllAction();
397 if( 0 != (bRet = rSh.Sort( aOptions )))
398 rSh.SetModified();
399 rSh.EndAllAction();
400 }
401
402 if( !bRet )
403 InfoBox( this->GetParent(), SW_RES(MSG_SRTERR)).Execute();
404 }
405
406 /* -----------------30.09.98 10:03-------------------
407 *
408 * --------------------------------------------------*/
IMPL_LINK(SwSortDlg,DelimHdl,RadioButton *,pButton)409 IMPL_LINK( SwSortDlg, DelimHdl, RadioButton*, pButton )
410 {
411 sal_Bool bEnable = pButton == &aDelimFreeRB && aDelimFreeRB.IsEnabled();
412 aDelimEdt.Enable( bEnable );
413 aDelimPB.Enable( bEnable );
414 return 0;
415 }
416
IMPL_LINK(SwSortDlg,DelimCharHdl,PushButton *,EMPTYARG)417 IMPL_LINK( SwSortDlg, DelimCharHdl, PushButton*, EMPTYARG )
418 {
419 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
420 if(pFact)
421 {
422 SfxAllItemSet aSet( rSh.GetAttrPool() );
423 aSet.Put( SfxInt32Item( SID_ATTR_CHAR, GetDelimChar() ) );
424 SfxAbstractDialog* pMap = pFact->CreateSfxDialog( &aDelimPB, aSet,
425 rSh.GetView().GetViewFrame()->GetFrame().GetFrameInterface(), RID_SVXDLG_CHARMAP );
426 if( RET_OK == pMap->Execute() )
427 {
428 SFX_ITEMSET_ARG( pMap->GetOutputItemSet(), pItem, SfxInt32Item, SID_ATTR_CHAR, sal_False );
429 if ( pItem )
430 aDelimEdt.SetText( sal_Unicode ( pItem->GetValue() ) );
431 }
432
433 delete pMap;
434 }
435 return 0;
436 }
437
438
IMPL_LINK(SwSortDlg,CheckHdl,CheckBox *,pCheck)439 IMPL_LINK( SwSortDlg, CheckHdl, CheckBox *, pCheck )
440 {
441 if( pCheck == ( CheckBox* ) &aRowRB)
442 {
443 aColLbl.SetText(aColTxt);
444 aColEdt1.SetMax(nY);
445 aColEdt2.SetMax(nY);
446 aColEdt3.SetMax(nY);
447
448 aColEdt1.SetAccessibleName(aColTxt);
449 aColEdt2.SetAccessibleName(aColTxt);
450 aColEdt3.SetAccessibleName(aColTxt);
451 }
452 else if( pCheck == ( CheckBox* ) &aColumnRB)
453 {
454 aColLbl.SetText(aRowTxt);
455 aColEdt1.SetMax(nX);
456 aColEdt2.SetMax(nX);
457 aColEdt3.SetMax(nX);
458
459 aColEdt1.SetAccessibleName(aRowTxt);
460 aColEdt2.SetAccessibleName(aRowTxt);
461 aColEdt3.SetAccessibleName(aRowTxt);
462 }
463 else if(!aKeyCB1.IsChecked() &&
464 !aKeyCB2.IsChecked() &&
465 !aKeyCB3.IsChecked())
466 pCheck->Check(sal_True);
467 return 0;
468 }
469
IMPL_LINK(SwSortDlg,LanguageHdl,ListBox *,pLBox)470 IMPL_LINK( SwSortDlg, LanguageHdl, ListBox*, pLBox )
471 {
472 Locale aLcl( SvxCreateLocale( aLangLB.GetSelectLanguage() ) );
473 Sequence < OUString > aSeq(
474 GetAppCollator().listCollatorAlgorithms( aLcl ));
475
476 if( !pColRes )
477 pColRes = new CollatorRessource();
478
479 const sal_uInt16 nLstBoxCnt = 3;
480 ListBox* aLstArr[ nLstBoxCnt ] = { &aTypDLB1, &aTypDLB2, &aTypDLB3 };
481 sal_uInt16* aTypeArr[ nLstBoxCnt ] = { &nType1, &nType2, &nType3 };
482 String aOldStrArr[ nLstBoxCnt ];
483 sal_uInt16 n;
484
485 void* pUserData;
486 for( n = 0; n < nLstBoxCnt; ++n )
487 {
488 ListBox* pL = aLstArr[ n ];
489 if( 0 != (pUserData = pL->GetEntryData( pL->GetSelectEntryPos())) )
490 aOldStrArr[ n ] = *(String*)pUserData;
491 ::lcl_ClearLstBoxAndDelUserData( *pL );
492 }
493
494 sal_uInt16 nInsPos;
495 String sAlg, sUINm;
496 for( long nCnt = 0, nEnd = aSeq.getLength(); nCnt <= nEnd; ++nCnt )
497 {
498 if( nCnt < nEnd )
499 sUINm = pColRes->GetTranslation( sAlg = aSeq[ nCnt ] );
500 else
501 sUINm = sAlg = aNumericTxt;
502
503 for( n = 0; n < nLstBoxCnt; ++n )
504 {
505 ListBox* pL = aLstArr[ n ];
506 nInsPos = pL->InsertEntry( sUINm );
507 pL->SetEntryData( nInsPos, new String( sAlg ));
508 if( pLBox && sAlg == aOldStrArr[ n ] )
509 pL->SelectEntryPos( nInsPos );
510 }
511 }
512
513 for( n = 0; n < nLstBoxCnt; ++n )
514 {
515 ListBox* pL = aLstArr[ n ];
516 if( !pLBox )
517 pL->SelectEntryPos( *aTypeArr[n] );
518 else if( LISTBOX_ENTRY_NOTFOUND == pL->GetSelectEntryPos() )
519 pL->SelectEntryPos( 0 );
520 }
521 return 0;
522 }
523
524
525
526
527
528
529