29#include <tqbuttongroup.h>
30#include <tqhbuttongroup.h>
31#include <tqcheckbox.h>
32#include <tqcombobox.h>
33#include <tqgroupbox.h>
36#include <tqlineedit.h>
37#include <tqpushbutton.h>
38#include <tqradiobutton.h>
40#include <tqtabwidget.h>
47#include <tdemessagebox.h>
49#include "kspread_dlg_sort.h"
50#include "kspread_doc.h"
51#include "kspread_map.h"
52#include "kspread_sheet.h"
53#include "kspread_view.h"
54#include "kspread_util.h"
59SortDialog::SortDialog(
View * parent,
const char * name,
61 : KDialogBase( parent, name, modal,
"Sort",Ok|Cancel ),
65 setName(
"SortDialog" );
68 setCaption( i18n(
"Sorting" ) );
71 TQVBox *page = makeVBoxMainWidget();
73 m_tabWidget =
new TQTabWidget( page,
"m_tabWidget" );
75 m_page1 =
new TQWidget( m_tabWidget,
"m_page1" );
76 TQGridLayout * page1Layout
77 =
new TQGridLayout( m_page1, 1, 1, 11, 6,
"page1Layout");
82 TQGroupBox* layoutGroup =
new TQGroupBox(2 , TQt::Vertical, m_page1,
"layoutGroup");
83 layoutGroup->setTitle( i18n(
"Layout") );
85 TQHButtonGroup * orientationGroup =
new TQHButtonGroup( layoutGroup,
"orientationGroup" );
86 orientationGroup->setLineWidth(0);
87 orientationGroup->setMargin(0);
88 orientationGroup->layout()->setMargin(0);
90 m_sortColumn =
new TQRadioButton( orientationGroup,
"m_sortColumn" );
91 m_sortColumn->setText( i18n(
"Sort &Rows" ) );
93 m_sortRow =
new TQRadioButton( orientationGroup,
"m_sortRow" );
94 m_sortRow->setText( i18n(
"Sort &Columns" ) );
97 m_firstRowOrColHeader =
new TQCheckBox( layoutGroup,
"m_copyLayout" );
99 m_firstRowOrColHeader->setChecked(
true);
100 page1Layout->addWidget(layoutGroup,0,0);
104 page1Layout->addRowSpacing(2,10);
107 TQGroupBox * sort1Box =
new TQGroupBox( m_page1,
"sort1Box" );
108 sort1Box->setTitle( i18n(
"Sort By" ) );
109 sort1Box->setFlat(
true);
110 sort1Box->setColumnLayout(0, TQt::Vertical );
111 sort1Box->layout()->setSpacing( KDialog::spacingHint() );
112 sort1Box->layout()->setMargin( KDialog::marginHint() );
113 TQHBoxLayout * sort1BoxLayout =
new TQHBoxLayout( sort1Box->layout() );
114 sort1BoxLayout->setAlignment( TQt::AlignTop );
116 m_sortKey1 =
new TQComboBox(
false, sort1Box,
"m_sortKey1" );
117 sort1BoxLayout->addWidget( m_sortKey1 );
119 m_sortOrder1 =
new TQComboBox(
false, sort1Box,
"m_sortOrder1" );
120 m_sortOrder1->insertItem( i18n(
"Ascending" ) );
121 m_sortOrder1->insertItem( i18n(
"Descending" ) );
122 sort1BoxLayout->addWidget( m_sortOrder1 );
124 page1Layout->addWidget( sort1Box, 3, 0 );
126 TQGroupBox * sort2Box =
new TQGroupBox( m_page1,
"sort2Box" );
127 sort2Box->setTitle( i18n(
"Then By" ) );
128 sort2Box->setFlat(
true);
129 sort2Box->setColumnLayout(0, TQt::Vertical );
130 sort2Box->layout()->setSpacing( KDialog::spacingHint() );
131 sort2Box->layout()->setMargin( KDialog::marginHint() );
132 TQHBoxLayout * sort2BoxLayout =
new TQHBoxLayout( sort2Box->layout() );
133 sort2BoxLayout->setAlignment( TQt::AlignTop );
135 m_sortKey2 =
new TQComboBox(
false, sort2Box,
"m_sortKey2" );
136 m_sortKey2->insertItem( i18n(
"None" ) );
137 sort2BoxLayout->addWidget( m_sortKey2 );
139 m_sortOrder2 =
new TQComboBox(
false, sort2Box,
"m_sortOrder2" );
140 m_sortOrder2->insertItem( i18n(
"Ascending" ) );
141 m_sortOrder2->insertItem( i18n(
"Descending" ) );
142 sort2BoxLayout->addWidget( m_sortOrder2 );
144 page1Layout->addWidget( sort2Box, 4, 0 );
146 TQGroupBox * sort3Box =
new TQGroupBox( m_page1,
"sort3Box" );
147 sort3Box->setTitle( i18n(
"Then By" ) );
148 sort3Box->setFlat(
true);
149 sort3Box->setColumnLayout(0, TQt::Vertical );
150 sort3Box->layout()->setSpacing( KDialog::spacingHint() );
151 sort3Box->layout()->setMargin( KDialog::marginHint() );
152 TQHBoxLayout * sort3BoxLayout =
new TQHBoxLayout( sort3Box->layout() );
153 sort3BoxLayout->setAlignment( TQt::AlignTop );
155 m_sortKey3 =
new TQComboBox(
false, sort3Box,
"m_sortKey3" );
156 m_sortKey3->insertItem( i18n(
"None" ) );
157 m_sortKey3->setEnabled(
false );
158 sort3BoxLayout->addWidget( m_sortKey3 );
160 m_sortOrder3 =
new TQComboBox(
false, sort3Box,
"m_sortOrder3" );
161 m_sortOrder3->insertItem( i18n(
"Ascending" ) );
162 m_sortOrder3->insertItem( i18n(
"Descending" ) );
163 m_sortOrder3->setEnabled(
false );
164 sort3BoxLayout->addWidget( m_sortOrder3 );
166 page1Layout->addWidget( sort3Box, 5, 0 );
167 m_tabWidget->insertTab( m_page1, i18n(
"Sort Criteria" ) );
172 m_page2 =
new TQWidget( m_tabWidget,
"m_page2" );
173 TQGridLayout * page2Layout =
new TQGridLayout( m_page2, 1, 1, 11, 6,
"page2Layout");
174 page2Layout->setAlignment(TQt::AlignTop);
176 TQGroupBox * firstKeyBox =
new TQGroupBox( m_page2,
"firstKeyBox" );
177 firstKeyBox->setTitle( i18n(
"First Key" ) );
178 firstKeyBox->setColumnLayout(0, TQt::Vertical );
179 firstKeyBox->layout()->setSpacing( KDialog::spacingHint() );
180 firstKeyBox->layout()->setMargin( KDialog::marginHint() );
181 TQVBoxLayout * firstKeyBoxLayout =
new TQVBoxLayout( firstKeyBox->layout() );
182 firstKeyBoxLayout->setAlignment( TQt::AlignTop );
184 m_useCustomLists =
new TQCheckBox( firstKeyBox,
"m_useCustomLists_2" );
185 m_useCustomLists->setText( i18n(
"&Use custom list" ) );
186 firstKeyBoxLayout->addWidget( m_useCustomLists );
188 m_customList =
new TQComboBox(
false, firstKeyBox,
"m_customList" );
189 m_customList->setEnabled(
false );
190 m_customList->setMaximumSize( 230, 30 );
191 firstKeyBoxLayout->addWidget( m_customList );
193 page2Layout->addWidget( firstKeyBox, 0, 0 );
231 m_tabWidget->insertTab( m_page2, i18n(
"Options" ) );
233 TQHBoxLayout * Layout1 =
new TQHBoxLayout( 0, 0, 6,
"Layout1");
234 TQSpacerItem * spacer_2 =
new TQSpacerItem( 20, 20, TQSizePolicy::Expanding,
235 TQSizePolicy::Minimum );
236 Layout1->addItem( spacer_2 );
239 m_copyLayout =
new TQCheckBox( m_page2,
"m_copyLayout" );
240 m_copyLayout->setText( i18n(
"Copy cell &formatting (Borders, Colours, Text Style)" ) );
242 page2Layout->addWidget( m_copyLayout, 1, 0 );
244 m_respectCase =
new TQCheckBox( m_page2,
"m_copyLayout" );
245 m_respectCase->setText( i18n(
"Case sensitive sort" ) );
246 m_respectCase->setChecked(
true );
248 page2Layout->addWidget( m_respectCase, 2,0 );
250 connect( m_sortKey2, TQ_SIGNAL( activated(
int ) ),
this,
251 TQ_SLOT( sortKey2textChanged(
int ) ) );
252 connect( m_useCustomLists, TQ_SIGNAL( stateChanged(
int) ),
this,
253 TQ_SLOT( useCustomListsStateChanged(
int) ) );
254 connect( m_firstRowOrColHeader, TQ_SIGNAL( stateChanged(
int) ),
this,
255 TQ_SLOT( firstRowHeaderChanged(
int) ) );
256 connect( orientationGroup, TQ_SIGNAL( pressed(
int) ),
this,
257 TQ_SLOT( slotOrientationChanged(
int) ) );
262TQRect SortDialog::sourceArea()
264 return m_pView->selectionInfo()->selection();
267SortDialog::Orientation SortDialog::guessDataOrientation()
269 const TQRect selection=sourceArea();
271 if (selection.width() >= selection.height())
277SortDialog::~SortDialog()
282void SortDialog::init()
285 lst<<i18n(
"January");
286 lst<<i18n(
"February");
293 lst<<i18n(
"September");
294 lst<<i18n(
"October");
295 lst<<i18n(
"November");
296 lst<<i18n(
"December");
299 lst<<i18n(
"Tuesday");
300 lst<<i18n(
"Wednesday");
301 lst<<i18n(
"Thursday");
303 lst<<i18n(
"Saturday");
306 TDEConfig * config = Factory::global()->config();
307 config->setGroup(
"Parameters" );
308 TQStringList other = config->readListEntry(
"Other list");
310 for ( TQStringList::Iterator it = other.begin(); it != other.end(); ++it )
314 else if( it != other.begin())
316 tmp = tmp.left(tmp.length() - 2);
321 m_customList->insertStringList(lst);
333 TQRect r = sourceArea();
342 bool selectionMayHaveHeader =
true;
345 if ( util_isColumnSelected(r) )
347 m_sortRow->setEnabled(
false);
348 m_sortColumn->setChecked(
true);
350 int right = r.right();
351 for (
int i = r.left(); i <= right; ++i)
353 TQString guessName=m_pView->activeSheet()->guessColumnTitle(r,i);
356 if (!guessName.isEmpty())
358 m_listColumn += guessName + colName;
365 selectionMayHaveHeader=
false;
371 else if ( util_isRowSelected(r) )
373 m_sortColumn->setEnabled(
false);
374 m_sortRow->setChecked(
true);
376 int bottom = r.bottom();
377 for (
int i = r.top(); i <= bottom; ++i)
379 TQString guessName=m_pView->activeSheet()->guessRowTitle(r,i);
380 TQString rowName=i18n(
" (Row %1)").arg(i);
382 if (!guessName.isEmpty())
384 m_listRow += guessName + rowName;
388 m_listRow += i18n(
"Row %1").arg(i);
391 selectionMayHaveHeader=
false;
398 if ( r.top() == r.bottom() )
400 m_sortColumn->setEnabled(
false);
401 m_sortRow->setChecked(
true);
404 else if (r.left() == r.right())
406 m_sortRow->setEnabled(
false);
407 m_sortColumn->setChecked(
true);
411 if (guessDataOrientation() == SortColumns)
412 m_sortRow->setChecked(
true);
414 m_sortColumn->setChecked(
true);
417 int right = r.right();
418 int bottom = r.bottom();
419 for (
int i = r.left(); i <= right; ++i)
421 TQString guessName=m_pView->activeSheet()->guessColumnTitle(r,i);
424 if (!guessName.isEmpty())
425 m_listColumn += guessName + colName;
431 selectionMayHaveHeader=
false;
435 for (
int i = r.top(); i <= bottom; ++i)
437 TQString guessName=m_pView->activeSheet()->guessRowTitle(r,i);
438 TQString rowName=i18n(
" (Row %1)").arg(i);
440 if (!guessName.isEmpty())
441 m_listRow += guessName + rowName;
444 m_listRow += i18n(
"Row %1").arg(i);
447 selectionMayHaveHeader=
false;
452 if ( selectionMayHaveHeader )
453 m_firstRowOrColHeader->setChecked(
true );
455 m_firstRowOrColHeader->setChecked(
false );
458 if ( m_sortRow->isChecked() )
460 slotOrientationChanged( SortRows );
464 slotOrientationChanged( SortColumns );
468void SortDialog::slotOrientationChanged(
int id)
476 m_sortKey1->insertStringList(m_listColumn);
477 m_sortKey2->insertItem( i18n(
"None") );
478 m_sortKey2->insertStringList(m_listColumn);
479 m_sortKey3->insertItem( i18n(
"None") );
480 m_sortKey3->insertStringList(m_listColumn);
481 m_firstRowOrColHeader->setText( i18n(
"&First row contains headers" ) );
488 m_sortKey1->insertStringList(m_listRow);
489 m_sortKey2->insertItem( i18n(
"None") );
490 m_sortKey2->insertStringList(m_listRow);
491 m_sortKey3->insertItem( i18n(
"None") );
492 m_sortKey3->insertStringList(m_listRow);
493 m_firstRowOrColHeader->setText( i18n(
"&First column contains headers" ) );
516 kdDebug(36001) <<
"Error in signal : pressed(int id)" << endl;
521void SortDialog::slotOk()
523 m_pView->doc()->emitBeginOperation(
false );
525 Orientation sortOrientation;
526 if (m_sortRow->isChecked())
527 sortOrientation=SortColumns;
529 sortOrientation=SortRows;
531 Sheet * sheet = m_pView->activeSheet();
552 TQRect sortArea = sourceArea();
554 outputPoint.
setPos(sortArea.topLeft());
556 bool hasHeader=m_firstRowOrColHeader->isChecked();
560 if (sortOrientation == SortColumns)
562 sortArea.setLeft( sortArea.left()+1 );
563 outputPoint.setColumn( outputPoint.column()+1 );
567 sortArea.setTop( sortArea.top()+1 );
568 outputPoint.setRow( outputPoint.row()+1 );
592 TQStringList * firstKey = 0L;
593 Sheet::SortingOrder order1;
594 Sheet::SortingOrder order2;
595 Sheet::SortingOrder order3;
597 order1 = ( m_sortOrder1->currentItem() == 0 ? Sheet::Increase
599 order2 = ( m_sortOrder2->currentItem() == 0 ? Sheet::Increase
601 order3 = ( m_sortOrder3->currentItem() == 0 ? Sheet::Increase
604 if ( m_sortRow->isChecked() )
606 key1 = m_sortKey1->currentItem() + sortArea.top();
607 if (m_sortKey2->currentItem() > 0)
608 key2 = m_sortKey2->currentItem() + sortArea.top() - 1;
609 if (m_sortKey3->currentItem() > 0)
610 key3 = m_sortKey3->currentItem() + sortArea.top() - 1;
614 key1 = m_sortKey1->currentItem() + sortArea.left();
615 if (m_sortKey2->currentItem() > 0)
616 key2 = m_sortKey2->currentItem() + sortArea.left() - 1;
617 if (m_sortKey3->currentItem() > 0)
618 key3 = m_sortKey3->currentItem() + sortArea.left() - 1;
632 if ( m_useCustomLists->isChecked() )
634 firstKey =
new TQStringList();
635 TQString list = m_customList->currentText();
637 int l = list.length();
638 for (
int i = 0; i < l; ++i )
640 if ( list[i] ==
',' )
642 firstKey->append( tmp.stripWhiteSpace() );
658 if (key2 == 0 && key3 > 0)
666 if ( m_sortRow->isChecked() )
668 m_pView->activeSheet()->sortByRow( sortArea, key1, key2, key3,
669 order1, order2, order3,
670 firstKey, m_copyLayout->isChecked(),
672 outputPoint, m_respectCase->isChecked() );
674 else if (m_sortColumn->isChecked())
676 m_pView->activeSheet()->sortByColumn( sortArea , key1, key2, key3,
677 order1, order2, order3,
678 firstKey, m_copyLayout->isChecked(),
680 outputPoint, m_respectCase->isChecked() );
684 kdDebug(36001) <<
"Err in radiobutton" << endl;
690 m_pView->slotUpdateView( m_pView->activeSheet() );
694void SortDialog::sortKey2textChanged(
int i )
696 m_sortKey3->setEnabled( ( i!=0 ) );
697 m_sortOrder3->setEnabled( ( i!=0 ) );
700void SortDialog::useCustomListsStateChanged(
int state )
703 m_customList->setEnabled(
false);
705 m_customList->setEnabled(
true);
708void SortDialog::firstRowHeaderChanged(
int )
748#include "kspread_dlg_sort.moc"
TQString columnName() const
Returns the column name of the cell.
Represents the position of a single cell in a workbook.
void setSheet(Sheet *sheet)
Sets the sheet which this point lies on.
void setPos(TQPoint pos)
Sets the position of this point (in rows and columns)
The View class displays a KSpread document.