summaryrefslogtreecommitdiff
path: root/core/settings/citytime/citytime.cpp
Side-by-side diff
Diffstat (limited to 'core/settings/citytime/citytime.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/settings/citytime/citytime.cpp272
1 files changed, 272 insertions, 0 deletions
diff --git a/core/settings/citytime/citytime.cpp b/core/settings/citytime/citytime.cpp
new file mode 100644
index 0000000..b2f9f14
--- a/dev/null
+++ b/core/settings/citytime/citytime.cpp
@@ -0,0 +1,272 @@
+/**********************************************************************
+** Copyright (C) 2000 Trolltech AS. All rights reserved.
+**
+** This file is part of Qtopia Environment.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "zonemap.h"
+#include "citytime.h"
+
+#include <qpe/qpeapplication.h>
+#include <qpe/config.h>
+#include <qpe/timestring.h>
+#include <qpe/tzselect.h>
+#if ( defined Q_WS_QWS || defined(_WS_QWS_) ) && !defined(QT_NO_COP)
+#include <qpe/qcopenvelope_qws.h>
+#endif
+
+
+#include <qdir.h>
+#include <qfile.h>
+#include <qlabel.h>
+#include <qmessagebox.h>
+#include <qregexp.h>
+#include <qtextstream.h>
+#include <qtoolbutton.h>
+
+#include <stdlib.h>
+
+CityTime::CityTime( QWidget *parent, const char* name,
+ WFlags fl )
+ : CityTimeBase( parent, name, fl ),
+ strRealTz(0),
+ bAdded(false)
+{
+ Config config( "qpe" );
+ bWhichClock = config.readBoolEntry( "AMPM", TRUE );
+ frmMap->changeClock( bWhichClock );
+
+ char *pEnv;
+ pEnv = NULL;
+ pEnv = getenv("TZ");
+ if ( pEnv )
+ strRealTz = pEnv;
+ pEnv = NULL;
+ pEnv = getenv("HOME");
+ if ( pEnv )
+ strHome = pEnv;
+ // append the labels to their respective lists...
+ listCities.setAutoDelete( true );
+ listTimes.setAutoDelete( true );
+
+ listCities.append( cmdCity1 );
+ listCities.append( cmdCity2 );
+ listCities.append( cmdCity3 );
+
+ listTimes.append( lblCTime1 );
+ listTimes.append( lblCTime2 );
+ listTimes.append( lblCTime3 );
+
+
+ // kludgy way of getting the screen size so we don't have to depend
+ // on a resize event...
+ QWidget *d = QApplication::desktop();
+ if ( d->width() < d->height() ) {
+ // append for that 4 down look
+
+ listCities.append( cmdCity4 );
+ listCities.append( cmdCity5 );
+ listCities.append( cmdCity6 );
+ listTimes.append( lblCTime4 );
+ listTimes.append( lblCTime5 );
+ listTimes.append( lblCTime6 );
+ lblCTime7->hide();
+ lblCTime8->hide();
+ lblCTime9->hide();
+ cmdCity7->hide();
+ cmdCity8->hide();
+ cmdCity9->hide();
+ } else {
+ listCities.append( cmdCity7 );
+ listCities.append( cmdCity8 );
+ listCities.append( cmdCity9 );
+ listTimes.append( lblCTime7 );
+ listTimes.append( lblCTime8 );
+ listTimes.append( lblCTime9 );
+ lblCTime4->hide();
+ lblCTime5->hide();
+ lblCTime6->hide();
+ cmdCity4->hide();
+ cmdCity5->hide();
+ cmdCity6->hide();
+ }
+ bAdded = true;
+ readInTimes();
+ changed = FALSE;
+ QObject::connect( qApp, SIGNAL( clockChanged(bool) ),
+ this, SLOT( changeClock(bool) ) );
+ // now start the timer so we can update the time quickly every second
+ timerEvent( 0 );
+}
+
+CityTime::~CityTime()
+{
+ if ( changed ) {
+ Config cfg("CityTime");
+ cfg.setGroup("TimeZones");
+ QListIterator<QToolButton> itCity( listCities );
+ int i;
+ bool realTzWritten = FALSE;
+ for ( i = 0, itCity.toFirst(); i < CITIES; i++, ++itCity ) {
+ if ( !strCityTz[i].isNull() ) {
+ cfg.writeEntry("Zone"+QString::number(i), strCityTz[i]);
+ cfg.writeEntry("ZoneName"+QString::number(i), itCity.current()->text());
+ if ( strCityTz[i] == strRealTz )
+ realTzWritten = TRUE;
+ }
+ }
+ if ( realTzWritten ) {
+ cfg.removeEntry("Zone"+QString::number(CITIES));
+ cfg.removeEntry("ZoneName"+QString::number(CITIES));
+ } else {
+ cfg.writeEntry("Zone"+QString::number(CITIES), strRealTz);
+ if ( nameRealTz.isEmpty() ) {
+ int i = strRealTz.find( '/' );
+ nameRealTz = strRealTz.mid( i+1 );
+ }
+ cfg.writeEntry("ZoneName"+QString::number(CITIES), nameRealTz);
+ }
+ QCopEnvelope ( "QPE/System", "timeZoneListChange()" );
+
+ changed = FALSE;
+ }
+ // restore the timezone, just in case we messed with it and
+ // are destroyed at an inoppurtune moment
+ if ( !strRealTz.isNull() ) {
+ // this should be checked, but there is not much that can done at this
+ //point if it fails
+ setenv( "TZ", strRealTz, true );
+ }
+}
+
+void CityTime::timerEvent( QTimerEvent *e )
+{
+ if ( e )
+ killTimer( timerId );
+ // change the time again!!
+ showTime();
+ int ms = 1000 - QTime::currentTime().msec();
+ timerId = startTimer( ms );
+}
+
+void CityTime::mousePressEvent( QMouseEvent * )
+{
+ // DEBUG enable this to get a look at the zone information DEBUG
+// frmMap->showZones();
+}
+
+void CityTime::showTime( void )
+{
+ int i;
+ QListIterator<QLabel> itTime(listTimes);
+
+ // traverse the list...
+ for ( i = 0, itTime.toFirst(); i < CITIES; i++, ++itTime) {
+ if ( !strCityTz[i].isNull() ) {
+ if ( setenv( "TZ", strCityTz[i], true ) == 0 ) {
+ itTime.current()->setText( TimeString::shortTime(bWhichClock) );
+ } else {
+ QMessageBox::critical( this, tr( "Time Changing" ),
+ tr( "There was a problem setting timezone %1" )
+ .arg( QString::number( i + 1 ) ) );
+ }
+ }
+ }
+ // done playing around... put it all back
+ unsetenv( "TZ" );
+ if ( !strRealTz.isNull() ) {
+ if ( setenv( "TZ", strRealTz, true ) != 0 ) {
+ QMessageBox::critical( this, tr( "Restore Time Zone" ),
+ tr( "There was a problem setting your timezone."
+ "Your time may be wrong now..." ) );
+ }
+ }
+}
+
+void CityTime::beginNewTz()
+{
+ frmMap->setFocus();
+}
+
+void CityTime::slotNewTz( const QString & strNewCountry,
+ const QString & strNewCity )
+{
+ // determine what to do based on what putton is pressed...
+ QListIterator<QToolButton> itCity(listCities);
+ int i;
+ // go through the list and make adjustments based on which button is on
+ for ( i = 0, itCity.toFirst(); itCity.current(), i < CITIES; i++, ++itCity ) {
+ QToolButton *cmdTmp = itCity.current();
+ if ( cmdTmp->isOn() ) {
+ strCityTz[i] = strNewCountry + strNewCity;
+ QString s = strNewCity;
+ cmdTmp->setText( s.replace( QRegExp("_"), " " ) );
+ cmdTmp->toggle();
+ // we can actually break, since there is only one button
+ // that is ever pressed!
+ changed = TRUE;
+ break;
+ }
+ }
+ showTime();
+}
+
+void CityTime::readInTimes( void )
+{
+ Config cfg("CityTime");
+ cfg.setGroup("TimeZones");
+ QListIterator<QToolButton> itCity( listCities );
+ int i=0;
+ nameRealTz = QString::null;
+ QString zn;
+ for ( ; i < CITIES ; i++ ) {
+ zn = cfg.readEntry("Zone"+QString::number(i), QString::null);
+ if ( zn.isNull() )
+ break;
+ QString nm = cfg.readEntry("ZoneName"+QString::number(i));
+ strCityTz[i] = zn;
+ itCity.current()->setText(nm);
+ if ( zn == strRealTz )
+ nameRealTz = nm;
+ ++itCity;
+ }
+ if ( i == 0 ) {
+ // write in our own in a shameless self promotion and some humor
+ QStringList list = timezoneDefaults();
+ int i;
+ QStringList::Iterator it = list.begin();
+ for ( i = 0, itCity.toFirst(); i < CITIES && itCity.current();
+ i++, ++itCity ) {
+ strCityTz[i] = *it++;
+ itCity.current()->setText( *it++ );
+ }
+ }
+ if ( nameRealTz.isEmpty() ) {
+ //remember the current time zone even if we don't have room
+ //to show it.
+ zn = cfg.readEntry("Zone"+QString::number(CITIES), QString::null);
+ if ( zn == strRealTz )
+ nameRealTz = cfg.readEntry("ZoneName"+QString::number(CITIES));
+ i++;
+ }
+}
+
+void CityTime::changeClock( bool newClock )
+{
+ bWhichClock = newClock;
+ showTime();
+}