File indexing completed on 2024-05-12 16:35:24

0001 /* This file is part of the KDE project
0002    Copyright (C) 2012-2013 Jigar Raisinghani <jigarraisinghani@gmail.com>
0003 
0004    This library is free software; you can redistribute it and/or
0005    modify it under the terms of the GNU Library General Public
0006    License as published by the Free Software Foundation; either
0007    version 2 of the License, or (at your option) any later version.
0008 
0009    This library is distributed in the hope that it will be useful,
0010    but WITHOUT ANY WARRANTY; without even the implied warranty of
0011    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0012    Library General Public License for more details.
0013 
0014    You should have received a copy of the GNU Library General Public License
0015    along with this library; see the file COPYING.LIB.  If not, write to
0016    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0017    Boston, MA 02110-1301, USA.
0018 */
0019 
0020 // Local
0021 
0022 #include "pivotmain.h"
0023 #include "pivotoptions.h"
0024 #include "pivotfilters.h"
0025 #include "ui_pivotmain.h"
0026 
0027 #include<QTimer>
0028 #include<QObject>
0029 #include<QColor>
0030 #include<QPen>
0031 #include<QMessageBox>
0032 #include<QListWidgetItem>
0033 #include<QListWidget>
0034 
0035 #include <sheets/Value.h>
0036 #include <sheets/ValueCalc.h>
0037 #include <sheets/ValueConverter.h>
0038 #include <sheets/Map.h>
0039 #include <sheets/DocBase.h>
0040 #include <sheets/Cell.h>
0041 #include <sheets/Style.h>
0042 #include <sheets/Sheet.h>
0043 #include <sheets/ui/Selection.h>
0044 #include <sheets/CellStorage.h>
0045 
0046 
0047 using namespace Calligra::Sheets;
0048 
0049 class PivotMain::Private
0050 {
0051 public:
0052     Selection *selection;
0053     Ui::PivotMain mainWidget;
0054     QString func;
0055     QVector<QString> retVect;
0056     QVector<Value> posVect;
0057     QVector<QString> filterVect;
0058     Sheet* filterSheet;
0059     int filtersize;
0060 };
0061 PivotMain::PivotMain(QWidget* parent, Selection* selection) :
0062     KoDialog(parent),
0063     d(new Private)
0064 {
0065     QWidget* widget = new QWidget(this);
0066     d->mainWidget.setupUi(widget);
0067     setMainWidget(widget);
0068     d->selection=selection;
0069     setCaption(i18n("Pivot Table Configuration Window"));
0070     
0071     //Adding Buttons
0072     setButtons(Ok|Cancel|User2);
0073     setButtonGuiItem(User2, KGuiItem(i18n("Add Filter")));
0074 
0075     enableButton(User2,true);
0076     enableButton(Ok,true);
0077     d->mainWidget.TotalRows->setChecked(true);
0078     d->mainWidget.TotalColumns->setChecked(true);
0079 
0080 
0081     d->mainWidget.Labels->setSelectionMode(QAbstractItemView::ExtendedSelection);
0082     d->mainWidget.Labels->setDragEnabled(true);
0083     d->mainWidget.Labels->setDragDropMode(QAbstractItemView::DragDrop);
0084     d->mainWidget.Labels->viewport()->setAcceptDrops(true);
0085     d->mainWidget.Labels->setDropIndicatorShown(true);
0086 
0087     d->mainWidget.Rows->setSelectionMode(QAbstractItemView::SingleSelection);
0088     d->mainWidget.Rows->setDragEnabled(true);
0089     d->mainWidget.Rows->setDragDropMode(QAbstractItemView::DragDrop);
0090     d->mainWidget.Rows->viewport()->setAcceptDrops(true);
0091     d->mainWidget.Rows->setDropIndicatorShown(true);
0092 
0093     d->mainWidget.Columns->setSelectionMode(QAbstractItemView::SingleSelection);
0094     d->mainWidget.Columns->setDragEnabled(true);
0095     d->mainWidget.Columns->setDragDropMode(QAbstractItemView::DragDrop);
0096     d->mainWidget.Columns->viewport()->setAcceptDrops(true);
0097     d->mainWidget.Columns->setDropIndicatorShown(true);
0098 
0099     d->mainWidget.Values->setSelectionMode(QAbstractItemView::SingleSelection);
0100     d->mainWidget.Values->setDragEnabled(true);
0101     d->mainWidget.Values->setDragDropMode(QAbstractItemView::DragDrop);
0102     d->mainWidget.Values->viewport()->setAcceptDrops(true);
0103     d->mainWidget.Values->setDropIndicatorShown(true);
0104 
0105     d->mainWidget.selectOption->addItem("prod");
0106     d->mainWidget.selectOption->addItem("devsq");
0107 
0108     extractColumnNames();
0109     connect(this,SIGNAL(user2Clicked()),this,SLOT(on_AddFilter_clicked()));
0110     connect(this, SIGNAL(okClicked()), this, SLOT(on_Ok_clicked()));
0111     connect(d->mainWidget.Rows,SIGNAL(itemChanged(QListWidgetItem*)),this,SLOT(rows_itemChanged(QListWidgetItem*)));
0112     connect(d->mainWidget.Labels,SIGNAL(itemChanged(QListWidgetItem*)),this,SLOT(labels_itemChanged(QListWidgetItem*)));
0113     connect(d->mainWidget.Columns,SIGNAL(itemChanged(QListWidgetItem*)),this,SLOT(columns_itemChanged(QListWidgetItem*)));
0114     connect(d->mainWidget.Values,SIGNAL(itemChanged(QListWidgetItem*)),this,SLOT(values_itemChanged(QListWidgetItem*)));
0115   
0116 }
0117 
0118 void PivotMain::rows_itemChanged(QListWidgetItem *item)
0119 {
0120    for(int i=0;i<d->mainWidget.Labels->count();i++){
0121         if(d->mainWidget.Labels->item(i)->text()==item->text()){
0122             d->mainWidget.Labels->takeItem(i);
0123         }
0124       }
0125     for(int i=0;i<d->mainWidget.Columns->count();i++){
0126         if(d->mainWidget.Columns->item(i)->text()==item->text()){
0127             d->mainWidget.Columns->takeItem(i);
0128         }
0129       }
0130     for(int i=0;i<d->mainWidget.Values->count();i++){
0131         if(d->mainWidget.Values->item(i)->text()==item->text()){
0132             d->mainWidget.Values->takeItem(i);
0133         }
0134       }
0135 }
0136 
0137 void PivotMain::labels_itemChanged(QListWidgetItem *item)
0138 {
0139    for(int i=0;i<d->mainWidget.Rows->count();i++){
0140         if(d->mainWidget.Rows->item(i)->text()==item->text()){
0141             d->mainWidget.Rows->takeItem(i);
0142         }
0143       }
0144     for(int i=0;i<d->mainWidget.Columns->count();i++){
0145         if(d->mainWidget.Columns->item(i)->text()==item->text()){
0146             d->mainWidget.Columns->takeItem(i);
0147         }
0148       }
0149     for(int i=0;i<d->mainWidget.Values->count();i++){
0150         if(d->mainWidget.Values->item(i)->text()==item->text()){
0151             d->mainWidget.Values->takeItem(i);
0152         }
0153       }
0154 }
0155 
0156 void PivotMain::columns_itemChanged(QListWidgetItem *item)
0157 {
0158    for(int i=0;i<d->mainWidget.Labels->count();i++){
0159         if(d->mainWidget.Labels->item(i)->text()==item->text()){
0160             d->mainWidget.Labels->takeItem(i);
0161         }
0162       }
0163     for(int i=0;i<d->mainWidget.Rows->count();i++){
0164         if(d->mainWidget.Rows->item(i)->text()==item->text()){
0165             d->mainWidget.Rows->takeItem(i);
0166         }
0167       }
0168     for(int i=0;i<d->mainWidget.Values->count();i++){
0169         if(d->mainWidget.Values->item(i)->text()==item->text()){
0170             d->mainWidget.Values->takeItem(i);
0171         }
0172       }
0173 }
0174 
0175 void PivotMain::values_itemChanged(QListWidgetItem *item)
0176 {
0177    for(int i=0;i<d->mainWidget.Labels->count();i++){
0178         if(d->mainWidget.Labels->item(i)->text()==item->text()){
0179             d->mainWidget.Labels->takeItem(i);
0180         }
0181       }
0182     for(int i=0;i<d->mainWidget.Columns->count();i++){
0183         if(d->mainWidget.Columns->item(i)->text()==item->text()){
0184             d->mainWidget.Columns->takeItem(i);
0185         }
0186       }
0187     for(int i=0;i<d->mainWidget.Rows->count();i++){
0188         if(d->mainWidget.Rows->item(i)->text()==item->text()){
0189             d->mainWidget.Rows->takeItem(i);
0190         }
0191       }
0192 }
0193 
0194 
0195 
0196 
0197 PivotMain::~PivotMain()
0198 {
0199     delete d;
0200 }//PivotMain
0201 
0202 //Function to read the title of every column and add it to Labels.
0203 void PivotMain::extractColumnNames()
0204 {
0205     Sheet *const sheet = d->selection->lastSheet();
0206     const QRect range = d->selection->lastRange();
0207     
0208     int r = range.right();
0209     int row = range.top();
0210 
0211     Cell cell;
0212     QListWidgetItem * item;
0213     QString text;
0214     
0215     for (int i = range.left(); i <= r; ++i) {
0216         cell = Cell(sheet, i, row);
0217         text = cell.displayText();
0218        
0219     if(text.length() >0)
0220     {
0221         item = new QListWidgetItem(text);
0222     item->setFlags(item->flags());
0223         d->mainWidget.Labels->addItem(item);
0224     }  
0225     }  
0226 }
0227 
0228 /*//When the option button is clicked, a dialog for setting options appears
0229 void PivotMain::on_Options_clicked()
0230 {
0231     PivotOptions *pOptions=new PivotOptions(this,d->selection);
0232     pOptions->setModal(true);
0233     pOptions->exec();
0234     d->func=pOptions->returnFunction();
0235 }//on_Options_Clicked
0236 */
0237 
0238 //When add filter button is clicked, the dialog box for filtering data appears
0239 void PivotMain::on_AddFilter_clicked()
0240 {
0241 
0242         PivotFilters *pFilters=new PivotFilters(this,d->selection);
0243         pFilters->setModal(true);
0244         pFilters->exec();
0245     d->filterVect=pFilters->filterData();
0246 }//on_AddFilter_clicked
0247 
0248 //The function receives the data from Add Filter and filters the data. The filtered sheet is then used to further processing
0249 Sheet* PivotMain::filter()
0250 {
0251   
0252   Sheet *const sheet1 = d->selection->lastSheet();
0253   const QRect range2 = d->selection->lastRange();
0254   
0255   Map *mymap=sheet1->map();
0256   Sheet* sheet2=mymap->createSheet("Filtered Sheet");
0257   
0258   
0259   int r= range2.right();
0260   int b=range2.bottom();
0261   int row=range2.top();
0262   QVector<QString> vect;
0263   QVector<int> filtered;
0264   
0265   
0266   if(d->filterVect.count()<3)
0267       return sheet1;
0268   
0269   
0270   for(int k=row+1;k<=b;k++)
0271   {
0272       bool pass=true;
0273 
0274       if(d->filterVect.count()==3)
0275       {
0276       pass=checkCondition(d->filterVect.at(0),d->filterVect.at(1),d->filterVect.at(2),k);
0277       }
0278       else if(d->filterVect.count()==7)
0279       {
0280      
0281       if(d->filterVect.at(3)=="And")
0282         pass= checkCondition(d->filterVect.at(0),d->filterVect.at(1),d->filterVect.at(2),k) && 
0283                 checkCondition(d->filterVect.at(4),d->filterVect.at(5),d->filterVect.at(6),k);
0284       
0285       if(d->filterVect.at(3)=="Or") 
0286           pass=  checkCondition(d->filterVect.at(0),d->filterVect.at(1),d->filterVect.at(2),k) || 
0287                 checkCondition(d->filterVect.at(4),d->filterVect.at(5),d->filterVect.at(6),k);
0288                 
0289       
0290       }
0291       
0292       else if(d->filterVect.count()==11)
0293       {
0294       
0295       if(d->filterVect.at(3)=="And")
0296         pass= checkCondition(d->filterVect.at(0),d->filterVect.at(1),d->filterVect.at(2),k) && 
0297                 checkCondition(d->filterVect.at(4),d->filterVect.at(5),d->filterVect.at(6),k);
0298             
0299       
0300       if(d->filterVect.at(3)=="Or") 
0301         pass=  checkCondition(d->filterVect.at(0),d->filterVect.at(1),d->filterVect.at(2),k) || 
0302                 checkCondition(d->filterVect.at(4),d->filterVect.at(5),d->filterVect.at(6),k);
0303                 
0304 
0305       if(d->filterVect.at(7)=="And")
0306           pass= pass && checkCondition(d->filterVect.at(9),d->filterVect.at(10),d->filterVect.at(11),k);
0307                 
0308       
0309       if(d->filterVect.at(7)=="Or") 
0310         pass=  pass || checkCondition(d->filterVect.at(4),d->filterVect.at(5),d->filterVect.at(6),k);
0311                 
0312       }
0313       
0314       if(pass==true)
0315     filtered.append(k);
0316     }
0317 
0318       for(int j=1;j<=r;j++)
0319     Cell(sheet2,j,1).setValue(Cell(sheet1,j,1).value());
0320       for(int i=0;i<filtered.count();i++)
0321       {
0322     for(int j=1;j<=r;j++)
0323     {
0324       Cell(sheet2,j,i+2).setValue(Cell(sheet1,j,filtered.at(i)).value());
0325     }
0326       }
0327   d->filtersize=filtered.count()+1;
0328   return sheet2;
0329 }
0330 
0331 //This helps the filter function in analyzing the data(condition) received from Add Filter dialog.
0332 bool PivotMain::checkCondition(const QString &field , const QString &condition, const QString &value, int line)
0333 {
0334   Sheet *const sheet1 = d->selection->lastSheet();
0335   const QRect range2 = d->selection->lastRange();
0336   int r= range2.right();
0337   //int b=range2.bottom();
0338   int row=range2.top();
0339   
0340   QVector<QString> vect;
0341   
0342   for(int i=range2.left();i<=r;i++) {
0343     vect.append(Cell(sheet1,i,row).displayText());  
0344   }
0345 
0346     if(condition==">"){
0347       if(Cell(sheet1,vect.indexOf(field)+1,line).displayText() > value){
0348          
0349 
0350           return true;
0351       }
0352       else
0353         return false;
0354     }
0355     
0356     if(condition=="<"){
0357       if(Cell(sheet1,vect.indexOf(field)+1,line).displayText() < value){
0358     return true;}
0359       else
0360           return false;
0361     }
0362           
0363     if(condition== "=="){
0364       if(Cell(sheet1,vect.indexOf(field)+1,line).displayText() == value)
0365           return true;
0366       else
0367           return false;
0368     }
0369       
0370     if(condition=="!="){
0371       if(Cell(sheet1,vect.indexOf(field)+1,line).displayText() != value)
0372           return true;
0373       else
0374           return false;
0375     }
0376     return false;
0377     
0378 }//checkCondition
0379 
0380 
0381 
0382 //The core function which summarizes the data and forms the pivot table.
0383 void PivotMain::Summarize()
0384 {
0385   
0386     
0387     Map* myMap = d->selection->lastSheet()->map();
0388     const QRect range3=d->selection->lastRange();
0389     Sheet* sheet=myMap->createSheet("Filtered Sheet");
0390     
0391     sheet=filter();
0392     if(sheet==d->selection->lastSheet())
0393     {
0394       d->filtersize=range3.bottom();
0395     }
0396     const QRect range(1,1,d->selection->lastRange().right(),d->filtersize);
0397     
0398     QColor color,color2("lightGray");
0399     color.setBlue(50);
0400     QPen pen(color);
0401     
0402 
0403     Style st,st2,st3,str,stl,stb,stt;
0404     st.setFontUnderline(true);
0405     st3.setBackgroundColor("lightGray");
0406     st.setRightBorderPen(pen);
0407     st.setLeftBorderPen(pen);
0408     st.setTopBorderPen(pen);
0409     st.setBottomBorderPen(pen);
0410     str.setRightBorderPen(pen);
0411     stl.setLeftBorderPen(pen);
0412     stt.setTopBorderPen(pen);
0413     stb.setBottomBorderPen(pen);
0414     
0415     
0416     static int z=1;
0417     
0418     Sheet* mySheet=myMap->createSheet("Pivot Sheet"+QString::number(z++));
0419     
0420     int r = range.right();
0421     int row=range.top();
0422     int bottom=range.bottom();
0423     Cell cell;
0424     
0425     ValueConverter *c=0;
0426     
0427     Value res(0);
0428     ValueCalc *calc= new ValueCalc(c);
0429     
0430     QVector<Value> vect;    
0431     for (int i = 1; i <= r; ++i) {
0432     cell= Cell(sheet,i,row);
0433     vect.append(Value(cell.value()));
0434     }
0435 
0436   d->func=d->mainWidget.selectOption->currentText();//check for the function to be performed
0437   
0438   //For Creating QLists for Rows,Columns,Values and PageField
0439   int counter;
0440   QListWidgetItem *item1;
0441   QList<QListWidgetItem *> rowList,columnList,valueList,pageList;
0442   
0443   counter= d->mainWidget.Rows->count();
0444   for(int i=0;i<counter;i++)
0445   {
0446     
0447         item1=d->mainWidget.Rows->item(i);
0448         rowList.append(item1);
0449     
0450   }
0451   counter= d->mainWidget.Columns->count();
0452   for(int i=0;i<counter;i++)
0453   {
0454     
0455         item1=d->mainWidget.Columns->item(i);
0456         columnList.append(item1); 
0457   }
0458   /*counter= d->mainWidget.PageFields->count();
0459   for(int i=0;i<counter;i++)
0460   {
0461         item1=d->mainWidget.PageFields->item(i);
0462         pageList.append(item1);
0463   }*/
0464   counter= d->mainWidget.Values->count();
0465   for(int i=0;i<counter;i++)
0466   {
0467         item1=d->mainWidget.Values->item(i);
0468         valueList.append(item1); 
0469   }
0470   
0471   //Summarization using vectors
0472   int rowpos=-1,colpos=-1,valpos=-1;
0473   QVector<Value> rowVector,columnVector,valueVector;
0474   QVector<QVector<Value> > rowVectorArr(rowList.size()),columnVectorArr(columnList.size());
0475   QVector<int> rowposVect,colposVect,valposVect;
0476   
0477   for(int i=0;i<rowList.size();i++)
0478   {
0479       rowpos=vect.indexOf(Value(rowList.at(i)->text()));
0480       for(int j=row+1;j<=bottom;j++)
0481       {
0482     cell =Cell(sheet,rowpos+1,j);
0483     if(rowVector.contains(Value(cell.value()))==0)
0484     {
0485       rowVector.append(Value(cell.value()));
0486       rowVectorArr[i].append(Value(cell.value()));
0487       
0488     }  
0489       }
0490       rowposVect.append(rowpos);
0491   }
0492     
0493   for(int i=0;i<columnList.size();i++)
0494   {
0495       colpos=vect.indexOf(Value(columnList.at(i)->text()));
0496       for(int j=row+1;j<=bottom;j++)
0497       {
0498     cell =Cell(sheet,colpos+1,j);
0499     if(columnVector.contains(Value(cell.value()))==0)
0500     {
0501     columnVector.append(Value(cell.value()));
0502     columnVectorArr[i].append(Value(cell.value()));
0503     }
0504       }
0505       colposVect.append(colpos);
0506   }
0507   
0508  int count=1,count2=0,prevcount=1;
0509   QVector<QVector<Value> > rowVect(rowposVect.count());
0510   for(int i=0;i<rowposVect.count();i++)
0511   {
0512     for(int j=i+1;j<rowposVect.count();j++)
0513     {
0514       count*=rowVectorArr[j].count();
0515     }
0516     for(int k=0;k<(rowVectorArr[i].count())*prevcount;k++)
0517     {
0518      for(int m=0;m<count;m++)
0519      Cell(mySheet,((k)*count)+1+colposVect.count()+m,i+1).setValue(rowVectorArr[i].at(k%rowVectorArr[i].count()));
0520      
0521      
0522      for(int l=0;l<count;l++)
0523     rowVect[i].append(rowVectorArr[i].at(k%rowVectorArr[i].count()));
0524       
0525       count2++;
0526     }
0527     prevcount=count2;
0528     count=1;
0529     count2=0;
0530   }
0531 
0532   count=1,count2=0,prevcount=1;
0533   QVector<QVector<Value> > colVect(colposVect.count());
0534   for(int i=0;i<colposVect.count();i++)
0535   {
0536     for(int j=i+1;j<colposVect.count();j++)
0537     {
0538       count*=columnVectorArr[j].count();
0539     }
0540     for(int k=0;k<(columnVectorArr[i].count())*prevcount;k++)
0541     {
0542       for(int m=0;m<count;m++) 
0543       Cell(mySheet,i+1,((k)*count)+1+rowposVect.count()+m).setValue(columnVectorArr[i].at(k%columnVectorArr[i].count()));
0544    
0545       for(int l=0;l<count;l++)
0546     colVect[i].append(columnVectorArr[i].at(k%columnVectorArr[i].count()));
0547       
0548       count2++;
0549     }
0550     
0551     
0552     prevcount=count2;
0553     count=1;
0554     count2=0;
0555   }
0556  
0557   for(int i=0;i<valueList.size();i++)
0558   {
0559      valpos=vect.indexOf(Value(valueList.at(i)->text()));
0560      valposVect.append(valpos);    
0561   }
0562   
0563   
0564   const QString title = d->func + QLatin1Char('-') + valueList.at(0)->text();
0565   Cell(mySheet,1,1).setValue(Value(title));
0566   Cell(mySheet,1,1).setStyle(st);
0567   for(int l=0;l<rowVect[0].count();l++)
0568   {
0569     for(int m=0;m<colVect[0].count();m++)
0570       {
0571 
0572           QVector<Value> aggregate;
0573           for(int k=row+1;k<=bottom;k++)
0574           {
0575         int flag=0;
0576         for(int i=0;i<rowposVect.count();i++)
0577         {
0578           for(int j=0;j<colposVect.count();j++)
0579             {
0580  
0581               if(!(Cell(sheet,rowposVect.at(i)+1,k).value()==rowVect[i].at(l) && Cell(sheet,colposVect.at(j)+1,k).value()==colVect[j].at(m)))
0582             flag=1;
0583               
0584             }
0585           }
0586         if(flag==0)
0587         aggregate.append(Cell(sheet,valpos+1,k).value());
0588           }
0589         if(d->func!="average")
0590         calc->arrayWalk(aggregate,res,calc->awFunc(d->func),Value(0));
0591         
0592         else
0593         {
0594           calc->arrayWalk(aggregate,res,calc->awFunc("sum"),Value(0));
0595           if(aggregate.count()!=0)
0596           res=calc->div(res,aggregate.count());
0597           
0598         }
0599         Cell(mySheet,l+colposVect.count()+1,m+rowposVect.count()+1).setValue(res);
0600         if(m%2==0)
0601           //Cell(mySheet,l+colposVect.count()+1,m+rowposVect.count()+1).setStyle(st3);
0602         
0603         aggregate.clear();
0604         res=Value(0);
0605         
0606       }
0607     }
0608   
0609   
0610   //For Adding the functions: Total Rows & Total Columns
0611   int colmult=1,rowmult=1;
0612   
0613   for(int x=0;x<columnList.size();x++)
0614   colmult*=columnVectorArr[x].count();
0615   
0616   for(int x=0;x<rowList.size();x++)
0617   rowmult*=rowVectorArr[x].count();
0618   
0619   
0620   
0621   
0622   //Totalling Columns
0623   
0624   if(d->mainWidget.TotalColumns->isChecked())
0625   {
0626     
0627   Cell(mySheet,1,rowList.size()+colmult+1).setValue(Value("Total Column"));
0628   
0629   for(int z=columnList.size()+1;z<=rowmult+columnList.size();z++)
0630   {
0631     QVector<Value> vector;
0632     for(int y=rowList.size()+1;y<=colmult+rowList.size();y++)
0633     {
0634       vector.append(Cell(mySheet,z,y).value());
0635       
0636     }
0637     if(d->func!="average")
0638       calc->arrayWalk(vector,res,calc->awFunc(d->func),Value(0));
0639     else
0640     {
0641       calc->arrayWalk(vector,res,calc->awFunc("sum"),Value(0));
0642       if(vector.count()!=0)
0643       res=calc->div(res,vector.count());
0644     }
0645     
0646     
0647     Cell(mySheet,z,rowList.size()+colmult+1).setValue(res);
0648     res=Value(0);
0649     
0650   }
0651   }
0652   
0653   
0654   //Totalling Rows
0655   if(d->mainWidget.TotalRows->isChecked())
0656   {
0657     
0658   Cell(mySheet,columnList.size()+rowmult+1,1).setValue(Value("Total Row"));
0659     
0660   for(int z=rowList.size()+1;z<=colmult+rowList.size();z++)
0661   {
0662     QVector<Value> vector;
0663     for(int y=columnList.size()+1;y<=rowmult+columnList.size();y++)
0664     {
0665       vector.append(Cell(mySheet,y,z).value());
0666       
0667     }
0668     
0669     if(d->func!="average")
0670       calc->arrayWalk(vector,res,calc->awFunc(d->func),Value(0));
0671     else
0672     {
0673       calc->arrayWalk(vector,res,calc->awFunc("sum"),Value(0));
0674       if(vector.count()!=0)
0675       res=calc->div(res,vector.count());
0676     }
0677     
0678     Cell(mySheet,columnList.size()+rowmult+1,z).setValue(res);
0679     res=Value(0);
0680      
0681   }
0682   }
0683   
0684   //Clearing Vectors
0685   rowVector.clear();
0686   columnVector.clear();
0687   valueVector.clear();
0688   rowposVect.clear();
0689   colposVect.clear();
0690   valposVect.clear();
0691   
0692   //Adding built sheet to myMap for viewing
0693   clean(mySheet);
0694   styling(mySheet);
0695   myMap->addSheet(mySheet);
0696   
0697 }//Summarize
0698 
0699 QVector<QString> PivotMain::ValueData(const QString &str)
0700 {
0701   
0702       Sheet *const sheet = d->selection->lastSheet();
0703       const QRect range = d->selection->lastRange();
0704       
0705       int row = range.top();
0706       int bottom = range.bottom();
0707       int r=range.right();
0708       
0709       ValueConverter *conv=0;
0710     
0711       for (int i = range.left(); i <= r; ++i) {
0712     d->posVect.append(Value(Cell(sheet,i,row).value()));
0713       }
0714       
0715       int position=d->posVect.indexOf(Value(str));
0716      
0717       for(int j=row+1;j<=bottom;j++)
0718       {
0719     if(!Cell(sheet,position+1,j).value().isString())
0720     {
0721     
0722       if(d->retVect.contains(QString::number(conv->toInteger(Value(Cell(sheet,position+1,j).value()))))==0)
0723        d->retVect.append(QString::number(conv->toInteger(Value(Cell(sheet,position+1,j).value()))));
0724     }
0725     else if(d->retVect.contains(conv->toString(Value(Cell(sheet,position+1,j).value())))==0)
0726        d->retVect.append(conv->toString(Value(Cell(sheet,position+1,j).value())));
0727       }
0728       return d->retVect;
0729 }//ValueData
0730 
0731 void PivotMain::clean(Sheet* sheet)
0732 {
0733   ValueConverter *conv=0;
0734   int lastRow=sheet->cellStorage()->rows();
0735   int lastColumn=sheet->cellStorage()->columns();
0736   for(int i=d->mainWidget.Rows->count()+1;i<=lastRow+1;i++){
0737     int temp=0;
0738     for(int j=d->mainWidget.Columns->count()+1;j<=lastColumn;j++){
0739     if(conv->toInteger(Cell(sheet,j,i).value()) != 0){
0740       temp=1;
0741       break;
0742     }
0743       }
0744     if(temp==0){
0745       sheet->cellStorage()->removeRows(i);
0746       i--;
0747       lastRow--;
0748       }
0749     }
0750     
0751     
0752     
0753   lastRow=sheet->cellStorage()->rows();
0754   lastColumn=sheet->cellStorage()->columns();
0755   for(int i=d->mainWidget.Columns->count()+1;i<=lastColumn;i++){
0756     int temp=0;
0757     for(int j=d->mainWidget.Rows->count()+1;j<=lastRow;j++){
0758     if(conv->toInteger(Cell(sheet,i,j).value()) != 0){
0759       temp=1;
0760       break;
0761     }
0762       }
0763     if(temp==0){
0764       sheet->cellStorage()->removeColumns(i);
0765       i--;
0766       lastColumn--;
0767     }
0768     } 
0769     
0770 }
0771 
0772 void PivotMain::styling(Sheet* mySheet)
0773 {
0774     int lastRow=mySheet->cellStorage()->rows();
0775     int lastColumn=mySheet->cellStorage()->columns();
0776     QColor color,color2("lightGray");
0777     color.setBlue(50);
0778     QPen pen(color);
0779     
0780     Style st,st2,st3,str,stl,stb,stt;
0781     st.setFontUnderline(true);
0782     st3.setBackgroundColor("lightGray");
0783     st.setRightBorderPen(pen);
0784     st.setLeftBorderPen(pen);
0785     st.setTopBorderPen(pen);
0786     st.setBottomBorderPen(pen);
0787     str.setRightBorderPen(pen);
0788     stl.setLeftBorderPen(pen);
0789     stt.setTopBorderPen(pen);
0790     stb.setBottomBorderPen(pen);
0791     
0792     
0793     for( int i=1;i<=lastRow;i++){
0794       Cell(mySheet,d->mainWidget.Columns->count(),i).setStyle(str);
0795       Cell(mySheet,lastColumn,i).setStyle(str);
0796     }
0797     for( int i=d->mainWidget.Rows->count()+1;i<=lastRow;i++){
0798       for(int j=d->mainWidget.Columns->count()+1;j<=lastColumn;j++){
0799     if(i%2==0)
0800       Cell(mySheet,j,i).setStyle(st3);
0801       }
0802     }
0803     for( int i=1;i<=lastColumn;i++){
0804       Cell(mySheet,i,d->mainWidget.Rows->count()).setStyle(stb);
0805       Cell(mySheet,i,lastRow).setStyle(stb);
0806     }
0807    
0808        
0809 }
0810 
0811 
0812 void PivotMain::Reset()
0813 {
0814   d->mainWidget.Rows->clear();
0815   d->mainWidget.Values->clear();
0816   d->mainWidget.Columns->clear();
0817   //d->mainWidget.PageFields->clear();
0818   extractColumnNames();
0819 }//Reset
0820 void PivotMain::on_Ok_clicked()
0821 {
0822   
0823   Summarize();
0824   QMessageBox msgBox;
0825   msgBox.setText("Pivot Tables Built");
0826   msgBox.exec();
0827 }//on_Ok_clicked