www.pudn.com > calculator.rar > conversion.cpp


/****************************************************************************
**
** Copyright (C) 2000-2006 TROLLTECH ASA. All rights reserved.
**
** This file is part of the Phone Edition of the Qtopia Toolkit.
**
** Licensees holding a valid license agreement from Trolltech or any of its
** authorized distributors may use this file in accordance with
** the License Agreement provided with the Licensed Software.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
**   information about Trolltech's Commercial License Agreements.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**
**
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
****************************************************************************/
#ifdef ENABLE_CONVERSION

#include "conversion.h"
#include "../doubleinstruction.h"

#include 
#include 

#include 
#include 
#include 
#include 

double UnitConversionInstruction::from = 0;
double UnitConversionInstruction::to = 0;
char UnitConversionInstruction::tempFrom = 'n';
char UnitConversionInstruction::tempTo = 'n';

FormConversion::FormConversion(QWidget *parent) : DecimalInputWidget(parent), 
currentButton(0)
{
    systemEngine->registerInstruction(new UnitConversionInstruction());

    setObjectName( "ConversionForm" ); //no tr
    
    InputWidgetLayout = new QGridLayout(this);
    InputWidgetLayout->setSpacing( 3 );
    InputWidgetLayout->setMargin( 0 );
    
    init(0, 0);
}

void FormConversion::init(int fromRow, int fromCol) 
{
    QFont big(font());
    big.setWeight(QFont::Bold);

    typeSelector = new QComboBox(this);
    typeSelector->setSizePolicy(sizePolicy());
    InputWidgetLayout->addWidget(typeSelector, fromRow, fromCol, 1, 2 );

    PBC = new QPushButton(this);
    PBC->setText(tr("CE/C"));
    PBC->setFont(big);
    PBC->setSizePolicy(sizePolicy());
    InputWidgetLayout->addWidget(PBC, fromRow, fromCol+2, 1, 2);

    QRect screenRect = QtopiaApplication::desktop()->availableGeometry();
    bool portrait = screenRect.width() < screenRect.height(); 
        
    modeList = new QList();
    conversionMode *nextMode;
    QWidget *w;
    conversionData *nextData;
    conversionStack = new QStackedWidget(this);
    conversionStack->setSizePolicy(sizePolicy());

    // temperature conversions are builtin
    nextMode = new conversionMode;
    nextMode->name = QString( tr("Temperature") );
    nextMode->dataList = new QList();
    typeSelector->addItem(nextMode->name);
    w = new QWidget();
    QBoxLayout *gl2;
    if (portrait) 
        gl2 = new QHBoxLayout(w);
    else
        gl2 = new QVBoxLayout(w);
    gl2->setSpacing( 3 );
    gl2->setMargin( 0 );
    //InputWidgetLayout->addLayout(gl2, fromRow, fromCol, 1, 4);
    conversionStack->addWidget(w);

    nextData = new conversionData;
    nextData->name = QString( tr("fahrenheit") );
    nextData->button = new QPushButton(w);
    nextData->button->setCheckable(true);
    nextData->button->setText(nextData->name);
    nextData->button->setSizePolicy(sizePolicy());
    connect(nextData->button,SIGNAL(clicked()),this,SLOT(fahrenheitButtonClicked()));
    nextMode->dataList->append(nextData);
    gl2->addWidget(nextData->button);

    nextData = new conversionData;
    nextData->name = QString( tr("celcius") );
    nextData->button = new QPushButton(w);
    nextData->button->setCheckable(true);
    nextData->button->setText(nextData->name);
    nextData->button->setSizePolicy(sizePolicy());
    connect(nextData->button,SIGNAL(clicked()),this,SLOT(celciusButtonClicked()));
    nextMode->dataList->append(nextData);
    gl2->addWidget(nextData->button);

    nextData = new conversionData;
    nextData->name = QString( tr("kelvin") );
    nextData->button = new QPushButton(w);
    nextData->button->setCheckable(true);
    nextData->button->setText(nextData->name);
    nextData->button->setSizePolicy(sizePolicy());
    connect(nextData->button,SIGNAL(clicked()),this,SLOT(kelvinButtonClicked()));
    nextMode->dataList->append(nextData);
    gl2->addWidget(nextData->button);

    modeList->append(nextMode);
    // end setting up temperature conversion

    // read conversion data files
    QString path = Qtopia::qtopiaDir() + "etc/calculator/";
    QDir directory;
    directory.setPath( path );
    QStringList fileList = directory.entryList(QStringList("*.conf"));

    if ( !fileList.count() ) 
        qDebug("No conversion data files are available.");
    else {
        QFile myFile;
        QGridLayout *gl;
        //iterate over found conf files
        for (int i = 0; i < fileList.count(); i++) {
            QString fileName = fileList[i];
            QSettings cfg(path+fileName, QSettings::IniFormat);
            QStringList groups = cfg.childGroups();
            nextMode = new conversionMode;
            nextMode->dataList = new QList();
            w = new QWidget();
            gl = new QGridLayout(w);
            //gl = new FlowLayout(w, 5, 3);
            gl->setSizeConstraint( QLayout::SetDefaultConstraint );
            gl->setSpacing( 3 );
            gl->setMargin( 0 );
            conversionStack->addWidget(w); 
            for (int j = 0; j < groups.count(); j++) {
                QString group = groups[j];
                if (group == "Translation")
                    continue;
                cfg.beginGroup(group);
                if (group == "Name") {
                    nextMode->name = cfg.value("Name").toString();
                    typeSelector->addItem(nextMode->name);
                } else {
                    nextData = new conversionData;
                    nextData->name = cfg.value("Name").toString();
                    nextData->factor = cfg.value("Factor").toString().toDouble();
                    if (nextData->factor == 1)
                       nextMode->defaultType = nextData;
                    nextMode->dataList->append(nextData);
                    
                    //create the button for this data conversion
                    QPushButton *pb = new QPushButton(w);
                    pb->setCheckable(true);
                    pb->setText(nextData->name);
                    pb->setSizePolicy(sizePolicy());
                    int cRow = cfg.value("Row").toInt();
                    int cCol = cfg.value("Column").toInt();
                    if (cRow < 0 || cCol < 0) {
                        qWarning(QString("Missing grid position in config file: %1 group: %2").arg(fileName).arg(nextData->name).toLocal8Bit().constData());
                    } else if (portrait)
                        gl->addWidget(pb, cRow, cCol);
                    else
                        gl->addWidget(pb, cCol, cRow);
                    
                    
                    //gl->addWidget(pb);    
                    connect(pb, SIGNAL(clicked()), this, SLOT(conversionButtonClicked()));
                    nextData->button = pb;
                }
            }
            modeList->append(nextMode);
            
        }
    }
  

    connect (PBC, SIGNAL(clicked()), this, SLOT(CClicked()));
    connect (typeSelector, SIGNAL(activated(int)), this, SLOT(selectType(int)));

    // Remember last selection
    QSettings config("Trolltech","calculator"); // No tr
    config.beginGroup("Conversion plugin");
    int lastView = config.value("lastView",0).toInt();
    if (lastView > (int)modeList->count()+1 || lastView < 0)
	lastView = 0;

    typeSelector->setCurrentIndex(lastView);
    conversionStack->setCurrentIndex(lastView);

    if (portrait) {
        InputWidgetLayout->addWidget(conversionStack, fromRow+1, fromCol, 2, 4);
        DecimalInputWidget::init(fromRow+3, fromCol);
    } else {
        InputWidgetLayout->addWidget(conversionStack, fromRow+1, fromCol, 5, 2);
        DecimalInputWidget::init(fromRow+1, fromCol+2);
    }

}
FormConversion::~FormConversion() {
    QSettings config("Trolltech","calculator"); // No tr
    config.beginGroup("Conversion plugin"); // No tr
    config.setValue("lastView", conversionStack->currentIndex());
}

void FormConversion::showEvent ( QShowEvent *e ) {
    systemEngine->setAccType("Double"); // No tr
    
    QWidget::showEvent(e);
}

void FormConversion::selectType(int i) {
    UnitConversionInstruction::tempFrom = UnitConversionInstruction::tempTo = 'n';

    int currentMode = conversionStack->currentIndex();
    QList dataList = *(modeList->at(currentMode))->dataList;

    for (int c = 0;c < dataList.count(); c++) {
	QPushButton *b = (*(dataList.at(c))).button;
	if (b->isChecked())
	    b->toggle();
    }
    currentButton = 0;
    conversionStack->setCurrentIndex(i);
}

void FormConversion::conversionButtonClicked() {
    doConversion();
}

void FormConversion::doConversion() {
    int currentMode = conversionStack->currentIndex();
    QList dataList = *(modeList->at(currentMode))->dataList;

    bool newButtonFound = false;
    for (int c = 0;c < dataList.count(); c++) {
	QPushButton *b = (*(dataList.at(c))).button;
	if (b->isChecked()) {
	    if (b == currentButton) {
		b->toggle();
	    } else {
		newButton = b;
		newFactor = (*(dataList.at(c))).factor;
		newButtonFound = true;
	    }
	}
    }
    if (newButtonFound) {
	if (currentButton) { // temp convert ignores these anyway
	    UnitConversionInstruction::from = currentFactor;
	    UnitConversionInstruction::to = newFactor;
	    systemEngine->pushInstruction("UnitConversion");
	}
	currentButton = newButton;
	currentFactor = newFactor;
    } else { // current button toggled off
	currentButton = 0;
    }
}

void FormConversion::kelvinButtonClicked() {
    UnitConversionInstruction::tempFrom = UnitConversionInstruction::tempTo;
    UnitConversionInstruction::tempTo = 'k';
    doConversion();
}
void FormConversion::celciusButtonClicked() {
    UnitConversionInstruction::tempFrom = UnitConversionInstruction::tempTo;
    UnitConversionInstruction::tempTo = 'c';
    doConversion();
}
void FormConversion::fahrenheitButtonClicked() {
    UnitConversionInstruction::tempFrom = UnitConversionInstruction::tempTo;
    UnitConversionInstruction::tempTo = 'f';
    doConversion();
}

void FormConversion::CClicked() {
    systemEngine->hardReset();
}

#endif //ENABLE_CONVERSION