calendarui/views/dayview/src/calendayview.cpp
author hgs
Fri, 15 Oct 2010 12:10:36 +0530
changeset 83 5aadd1120515
parent 81 ce92091cbd61
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
45
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description: CalenDayView class definition.
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 */
hgs
parents:
diff changeset
    17
55
hgs
parents: 45
diff changeset
    18
// System includes
45
hgs
parents:
diff changeset
    19
#include <QDateTime>
hgs
parents:
diff changeset
    20
#include <QGraphicsLinearLayout>
hgs
parents:
diff changeset
    21
#include <xqsettingsmanager.h>
55
hgs
parents: 45
diff changeset
    22
#include <HbWidget>
63
hgs
parents: 57
diff changeset
    23
#include <HbFrameItem>
hgs
parents: 57
diff changeset
    24
#include <HbInstance>
hgs
parents: 57
diff changeset
    25
#include <HbAction>
hgs
parents: 57
diff changeset
    26
#include <HbMenu>
hgs
parents: 57
diff changeset
    27
#include <HbMainWindow>
hgs
parents: 57
diff changeset
    28
#include <HbModelIterator>
hgs
parents: 57
diff changeset
    29
#include <HbStyleLoader>
hgs
parents: 57
diff changeset
    30
#include <HbGroupBox>
hgs
parents: 57
diff changeset
    31
#include <HbExtendedLocale>
75
hgs
parents: 70
diff changeset
    32
#include <HbModelIterator>
45
hgs
parents:
diff changeset
    33
#include <agendautil.h>
55
hgs
parents: 45
diff changeset
    34
hgs
parents: 45
diff changeset
    35
// User includes
45
hgs
parents:
diff changeset
    36
#include "calendayview.h"
55
hgs
parents: 45
diff changeset
    37
#include "calencommon.h"
45
hgs
parents:
diff changeset
    38
#include "calencontext.h"
hgs
parents:
diff changeset
    39
#include "calenservices.h"
hgs
parents:
diff changeset
    40
#include "calendocloader.h"
hgs
parents:
diff changeset
    41
#include "calendateutils.h" //useful date/time utils
hgs
parents:
diff changeset
    42
#include "calendaycontentscrollarea.h"
hgs
parents:
diff changeset
    43
#include "calendaycontentwidget.h"
hgs
parents:
diff changeset
    44
#include "calendayhourscrollarea.h"
75
hgs
parents: 70
diff changeset
    45
#include "calendayitemview.h"
45
hgs
parents:
diff changeset
    46
#include "calendaymodelmanager.h"
hgs
parents:
diff changeset
    47
#include "CalenUid.h"
hgs
parents:
diff changeset
    48
#include "CalendarPrivateCRKeys.h"
hgs
parents:
diff changeset
    49
#include "calenpluginlabel.h"
hgs
parents:
diff changeset
    50
#include "calendaymodel.h"
63
hgs
parents: 57
diff changeset
    51
#include "calendayutils.h"
45
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
//constants
hgs
parents:
diff changeset
    54
57
hgs
parents: 55
diff changeset
    55
hgs
parents: 55
diff changeset
    56
/*!
hgs
parents: 55
diff changeset
    57
 \brief Constructor
hgs
parents: 55
diff changeset
    58
*/
45
hgs
parents:
diff changeset
    59
CalenDayView::CalenDayView(MCalenServices &services) :
hgs
parents:
diff changeset
    60
    CalenNativeView(services), mContentScrollArea(NULL), mContentWidget(NULL),
63
hgs
parents: 57
diff changeset
    61
        mHourScrollArea(NULL), mVLayout(NULL), mMainContainer(NULL),
83
hgs
parents: 81
diff changeset
    62
        mDocLoader(NULL), mIsLaunching(true), mGesturesAbsorber(NULL), 
hgs
parents: 81
diff changeset
    63
		mSettingsManager(NULL), mRegionalInfoKey(XQSettingsKey::TargetCentralRepository,
hgs
parents: 81
diff changeset
    64
        KCRUidCalendar, KCalendarShowRegionalInfo), mServices(services),
hgs
parents: 81
diff changeset
    65
        mRegionalInfoGroupBox(NULL), mGoToTodayMenuAction(NULL), mBg(NULL)
45
hgs
parents:
diff changeset
    66
{
hgs
parents:
diff changeset
    67
    setupMenu();
55
hgs
parents: 45
diff changeset
    68
45
hgs
parents:
diff changeset
    69
    // Create model manager
55
hgs
parents: 45
diff changeset
    70
    mModelManager = new CalenDayModelManager(mServices, true, this);
45
hgs
parents:
diff changeset
    71
    mSettingsManager = new XQSettingsManager(this);
63
hgs
parents: 57
diff changeset
    72
    mSettingsManager->startMonitoring(mRegionalInfoKey);
45
hgs
parents:
diff changeset
    73
75
hgs
parents: 70
diff changeset
    74
    //setup Back functionality, launch the month view only when it is
hgs
parents: 70
diff changeset
    75
	// the first view
hgs
parents: 70
diff changeset
    76
    if (ECalenMonthView == mServices.getFirstView()) {
45
hgs
parents:
diff changeset
    77
        HbAction* action = new HbAction(Hb::BackNaviAction, this);
hgs
parents:
diff changeset
    78
        setNavigationAction(action);
hgs
parents:
diff changeset
    79
        // Connect to the signal triggered by clicking on back button.
hgs
parents:
diff changeset
    80
        connect(action, SIGNAL(triggered()), this, SLOT(onBack()));
hgs
parents:
diff changeset
    81
    }
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
    HbStyleLoader::registerFilePath(":/calendayhourelement.css");
hgs
parents:
diff changeset
    84
    HbStyleLoader::registerFilePath(":/calendayhourelement.widgetml");
hgs
parents:
diff changeset
    85
    HbStyleLoader::registerFilePath(":/calendayitem.css");
hgs
parents:
diff changeset
    86
    HbStyleLoader::registerFilePath(":/calendayitem.widgetml");
55
hgs
parents: 45
diff changeset
    87
    HbStyleLoader::registerFilePath(":/calendayeventspane.css");
57
hgs
parents: 55
diff changeset
    88
    HbStyleLoader::registerFilePath(":/calendayhourscrollarea.css");
45
hgs
parents:
diff changeset
    89
}
hgs
parents:
diff changeset
    90
57
hgs
parents: 55
diff changeset
    91
/*!
hgs
parents: 55
diff changeset
    92
 \brief Destructor
hgs
parents: 55
diff changeset
    93
*/
45
hgs
parents:
diff changeset
    94
CalenDayView::~CalenDayView()
hgs
parents:
diff changeset
    95
{
63
hgs
parents: 57
diff changeset
    96
    mSettingsManager->stopMonitoring(mRegionalInfoKey);
hgs
parents: 57
diff changeset
    97
    
hgs
parents: 57
diff changeset
    98
    if (mRegionalInfoGroupBox) {
hgs
parents: 57
diff changeset
    99
        delete mRegionalInfoGroupBox;
hgs
parents: 57
diff changeset
   100
        mRegionalInfoGroupBox = NULL;
hgs
parents: 57
diff changeset
   101
    }
hgs
parents: 57
diff changeset
   102
    
55
hgs
parents: 45
diff changeset
   103
    if (mDocLoader) {
hgs
parents: 45
diff changeset
   104
        delete mDocLoader;
hgs
parents: 45
diff changeset
   105
        mDocLoader = NULL;
hgs
parents: 45
diff changeset
   106
    }
45
hgs
parents:
diff changeset
   107
}
hgs
parents:
diff changeset
   108
57
hgs
parents: 55
diff changeset
   109
/*!
hgs
parents: 55
diff changeset
   110
 \brief Handles locale change.
hgs
parents: 55
diff changeset
   111
 
hgs
parents: 55
diff changeset
   112
 \param reason the reason of a change
hgs
parents: 55
diff changeset
   113
*/
45
hgs
parents:
diff changeset
   114
void CalenDayView::onLocaleChanged(int reason)
hgs
parents:
diff changeset
   115
{
hgs
parents:
diff changeset
   116
    Q_UNUSED( reason )
81
hgs
parents: 75
diff changeset
   117
    if ((reason & EChangesSystemTime) || (reason & EChangesMidnightCrossover)) {
hgs
parents: 75
diff changeset
   118
        mDate = CalenDateUtils::today();
hgs
parents: 75
diff changeset
   119
    }
hgs
parents: 75
diff changeset
   120
    
hgs
parents: 75
diff changeset
   121
    if ((reason & EChangesLocale)) {
hgs
parents: 75
diff changeset
   122
        mHourScrollArea->localeChanged();
hgs
parents: 75
diff changeset
   123
    }
45
hgs
parents:
diff changeset
   124
}
hgs
parents:
diff changeset
   125
57
hgs
parents: 55
diff changeset
   126
/*!
hgs
parents: 55
diff changeset
   127
 \brief Reimplemented from CalenView. Handles view (re)population
hgs
parents: 55
diff changeset
   128
*/
45
hgs
parents:
diff changeset
   129
void CalenDayView::doPopulation()
hgs
parents:
diff changeset
   130
{
hgs
parents:
diff changeset
   131
    // Triggers fading effect for heading label
hgs
parents:
diff changeset
   132
    getCurrentDate();
hgs
parents:
diff changeset
   133
    HbEffect::start(mHeadingLabel, "fadeOut", this, "setHeadingText");
hgs
parents:
diff changeset
   134
    
hgs
parents:
diff changeset
   135
    mModelManager->refreshAllModels();
hgs
parents:
diff changeset
   136
    //Set date and time for hour scroll area. 
hgs
parents:
diff changeset
   137
    //It's later used by hour element to display timeline
hgs
parents:
diff changeset
   138
    mHourScrollArea->setDateTime(mDate);
hgs
parents:
diff changeset
   139
    
81
hgs
parents: 75
diff changeset
   140
    isDateValid();
hgs
parents: 75
diff changeset
   141
    
45
hgs
parents:
diff changeset
   142
    //set in menu go to today visible
hgs
parents:
diff changeset
   143
    QDateTime currentDateTime = QDateTime::currentDateTime();
hgs
parents:
diff changeset
   144
    if (mGoToTodayMenuAction and currentDateTime.date() == mDate.date()) {
hgs
parents:
diff changeset
   145
        mGoToTodayMenuAction->setVisible(false);
hgs
parents:
diff changeset
   146
    }
hgs
parents:
diff changeset
   147
    else if(mGoToTodayMenuAction) {
hgs
parents:
diff changeset
   148
        mGoToTodayMenuAction->setVisible(true);
hgs
parents:
diff changeset
   149
    }
hgs
parents:
diff changeset
   150
    
55
hgs
parents: 45
diff changeset
   151
    // Call async. if the view is loaded first time (fix to ou1cimx1#482516)
hgs
parents: 45
diff changeset
   152
    if (mIsLaunching) {
hgs
parents: 45
diff changeset
   153
        mIsLaunching = false;
hgs
parents: 45
diff changeset
   154
        QMetaObject::invokeMethod(this, "setupViewport", Qt::QueuedConnection);
hgs
parents: 45
diff changeset
   155
    } else {
hgs
parents: 45
diff changeset
   156
        setupViewport();
hgs
parents: 45
diff changeset
   157
    }
70
hgs
parents: 64
diff changeset
   158
    
hgs
parents: 64
diff changeset
   159
    //Set gestures absorber
hgs
parents: 64
diff changeset
   160
    if (!mGesturesAbsorber) {
hgs
parents: 64
diff changeset
   161
        mGesturesAbsorber = new HbWidget(this);
hgs
parents: 64
diff changeset
   162
        mGesturesAbsorber->setZValue(100);
hgs
parents: 64
diff changeset
   163
        mGesturesAbsorber->grabGesture(Qt::SwipeGesture);
hgs
parents: 64
diff changeset
   164
        mGesturesAbsorber->grabGesture(Qt::PanGesture);
hgs
parents: 64
diff changeset
   165
        mGesturesAbsorber->setGeometry(rect());
hgs
parents: 64
diff changeset
   166
        mGesturesAbsorber->installEventFilter(mContentScrollArea);
hgs
parents: 64
diff changeset
   167
    }
45
hgs
parents:
diff changeset
   168
	
hgs
parents:
diff changeset
   169
    populationComplete();
hgs
parents:
diff changeset
   170
}
hgs
parents:
diff changeset
   171
57
hgs
parents: 55
diff changeset
   172
/*!
hgs
parents: 55
diff changeset
   173
 \brief Reimplemented from CalenView. Informs the organizer that the view's population is complete.
hgs
parents: 55
diff changeset
   174
*/
45
hgs
parents:
diff changeset
   175
void CalenDayView::populationComplete()
hgs
parents:
diff changeset
   176
{
hgs
parents:
diff changeset
   177
    CalenNativeView::populationComplete();
hgs
parents:
diff changeset
   178
}
hgs
parents:
diff changeset
   179
57
hgs
parents: 55
diff changeset
   180
/*!
hgs
parents: 55
diff changeset
   181
 \brief Sets up the view accroding to the 'xml'
hgs
parents: 55
diff changeset
   182
 
hgs
parents: 55
diff changeset
   183
 \param docLoader Pointer to document loader
hgs
parents: 55
diff changeset
   184
*/
45
hgs
parents:
diff changeset
   185
void CalenDayView::setupView(CalenDocLoader* docLoader)
hgs
parents:
diff changeset
   186
{
55
hgs
parents: 45
diff changeset
   187
    // Store document loader for further use
hgs
parents: 45
diff changeset
   188
    mDocLoader = docLoader;
hgs
parents: 45
diff changeset
   189
hgs
parents: 45
diff changeset
   190
    // Get vertical layout from day view
hgs
parents: 45
diff changeset
   191
    mVLayout = static_cast<QGraphicsLinearLayout *> (this->layout());
hgs
parents: 45
diff changeset
   192
hgs
parents: 45
diff changeset
   193
    // Set up day info
hgs
parents: 45
diff changeset
   194
    mHeadingLabel = qobject_cast<HbGroupBox *> (mDocLoader->findWidget(
hgs
parents: 45
diff changeset
   195
        CALEN_DAYVIEW_DAYINFO));
hgs
parents: 45
diff changeset
   196
    HbEffect::add(mHeadingLabel, ":/fade_out.fxml", "fadeOut");
hgs
parents: 45
diff changeset
   197
    HbEffect::add(mHeadingLabel, ":/fade_in.fxml", "fadeIn");
63
hgs
parents: 57
diff changeset
   198
    
hgs
parents: 57
diff changeset
   199
    // Set up main container for hour elements/content area
hgs
parents: 57
diff changeset
   200
    mMainContainer = qobject_cast<HbWidget *> (mDocLoader->findWidget(
hgs
parents: 57
diff changeset
   201
        CALEN_DAYVIEW_CONTENTWIDGET));
hgs
parents: 57
diff changeset
   202
    if (Qt::Vertical == CalenDayUtils::instance()->orientation()) {
hgs
parents: 57
diff changeset
   203
        mBg = new HbFrameItem(KCalenBackgroundColorPortrait,
hgs
parents: 57
diff changeset
   204
            HbFrameDrawer::OnePiece, this);
hgs
parents: 57
diff changeset
   205
    }
hgs
parents: 57
diff changeset
   206
    else {
hgs
parents: 57
diff changeset
   207
        mBg = new HbFrameItem(KCalenBackgroundColorLandscape,
hgs
parents: 57
diff changeset
   208
            HbFrameDrawer::OnePiece, this);
hgs
parents: 57
diff changeset
   209
    }
hgs
parents: 57
diff changeset
   210
    mMainContainer->setBackgroundItem(mBg);
55
hgs
parents: 45
diff changeset
   211
hgs
parents: 45
diff changeset
   212
    // Set up hour scroll area
hgs
parents: 45
diff changeset
   213
    mHourScrollArea
hgs
parents: 45
diff changeset
   214
        = static_cast<CalenDayHourScrollArea *> (mDocLoader->findWidget(
hgs
parents: 45
diff changeset
   215
            CALEN_DAYVIEW_HOURSCROLLAREA));
hgs
parents: 45
diff changeset
   216
hgs
parents: 45
diff changeset
   217
    // Set up content scroll area
hgs
parents: 45
diff changeset
   218
    mContentScrollArea
hgs
parents: 45
diff changeset
   219
        = static_cast<CalenDayContentScrollArea *> (mDocLoader->findWidget(
hgs
parents: 45
diff changeset
   220
            CALEN_DAYVIEW_CONTENTSCROLLAREA));
63
hgs
parents: 57
diff changeset
   221
    // Pass parent object to mContentWidget to install event filters on parent
75
hgs
parents: 70
diff changeset
   222
    mContentWidget = new CalenDayContentWidget(mContentScrollArea);
55
hgs
parents: 45
diff changeset
   223
    mContentScrollArea->setContentWidget(mContentWidget);
75
hgs
parents: 70
diff changeset
   224
    
hgs
parents: 70
diff changeset
   225
    initializeViews();
63
hgs
parents: 57
diff changeset
   226
    setupSlots();
hgs
parents: 57
diff changeset
   227
    
55
hgs
parents: 45
diff changeset
   228
    // Set up regional info if variant is correct
hgs
parents: 45
diff changeset
   229
    showRegionalInformationFadeIn();
45
hgs
parents:
diff changeset
   230
}
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
//private slots
hgs
parents:
diff changeset
   233
57
hgs
parents: 55
diff changeset
   234
/*!
hgs
parents: 55
diff changeset
   235
 \brief Handles 'back' functionality
hgs
parents: 55
diff changeset
   236
*/
45
hgs
parents:
diff changeset
   237
void CalenDayView::onBack()
hgs
parents:
diff changeset
   238
{
hgs
parents:
diff changeset
   239
    TRAP_IGNORE(mServices.IssueCommandL(ECalenMonthView));
hgs
parents:
diff changeset
   240
}
hgs
parents:
diff changeset
   241
57
hgs
parents: 55
diff changeset
   242
/*!
hgs
parents: 55
diff changeset
   243
 \brief Slot that handles first phase of day change
hgs
parents: 55
diff changeset
   244
 
hgs
parents: 55
diff changeset
   245
 \param direction indicates to which day view needs to be scrolled (previous or next day)
hgs
parents: 55
diff changeset
   246
*/
45
hgs
parents:
diff changeset
   247
void CalenDayView::dayChangeStarted(CalenScrollDirection direction)
hgs
parents:
diff changeset
   248
{
81
hgs
parents: 75
diff changeset
   249
    switch (direction) {
hgs
parents: 75
diff changeset
   250
        case ECalenScrollToNext:
hgs
parents: 75
diff changeset
   251
            mDate = mDate.addDays(1);
hgs
parents: 75
diff changeset
   252
            break;
hgs
parents: 75
diff changeset
   253
        case ECalenScrollToPrev:
hgs
parents: 75
diff changeset
   254
            mDate = mDate.addDays(-1);
hgs
parents: 75
diff changeset
   255
            break;
hgs
parents: 75
diff changeset
   256
        default:
hgs
parents: 75
diff changeset
   257
            break;
45
hgs
parents:
diff changeset
   258
    }
hgs
parents:
diff changeset
   259
    
81
hgs
parents: 75
diff changeset
   260
    // Update the visibility of 'Go to today' option in menu
hgs
parents: 75
diff changeset
   261
	QDateTime currentDateTime = QDateTime::currentDateTime();
45
hgs
parents:
diff changeset
   262
    if (mGoToTodayMenuAction and currentDateTime.date() == mDate.date()) {
hgs
parents:
diff changeset
   263
        mGoToTodayMenuAction->setVisible(false);
hgs
parents:
diff changeset
   264
    }
hgs
parents:
diff changeset
   265
    else if(mGoToTodayMenuAction) {
hgs
parents:
diff changeset
   266
        mGoToTodayMenuAction->setVisible(true);
hgs
parents:
diff changeset
   267
    }
hgs
parents:
diff changeset
   268
    
hgs
parents:
diff changeset
   269
    // Triggers fading effect for heading label.
hgs
parents:
diff changeset
   270
    HbEffect::start(mHeadingLabel, "fadeOut", this, "setHeadingText");
63
hgs
parents: 57
diff changeset
   271
    if (mRegionalInfoGroupBox) {
hgs
parents: 57
diff changeset
   272
        HbEffect::start(mRegionalInfoGroupBox, "fadeOut", this,
hgs
parents: 57
diff changeset
   273
            "showRegionalInformation");
hgs
parents: 57
diff changeset
   274
    }
45
hgs
parents:
diff changeset
   275
    
hgs
parents:
diff changeset
   276
    mServices.Context().setFocusDate(mDate);
hgs
parents:
diff changeset
   277
}
hgs
parents:
diff changeset
   278
57
hgs
parents: 55
diff changeset
   279
/*!
hgs
parents: 55
diff changeset
   280
 \brief Slot that is triggered when operation of day change is completed
hgs
parents: 55
diff changeset
   281
 
hgs
parents: 55
diff changeset
   282
 \param direction ndicates to which day view was scrolled (previous or next day)
hgs
parents: 55
diff changeset
   283
*/
45
hgs
parents:
diff changeset
   284
void CalenDayView::dayChanged(CalenScrollDirection direction)
hgs
parents:
diff changeset
   285
{
hgs
parents:
diff changeset
   286
    mModelManager->viewsScrollingFinished(direction);
hgs
parents:
diff changeset
   287
	mHourScrollArea->setDateTime(mDate);
81
hgs
parents: 75
diff changeset
   288
	mHourScrollArea->updateTimeIndicator();
hgs
parents: 75
diff changeset
   289
	isDateValid();
45
hgs
parents:
diff changeset
   290
}
hgs
parents:
diff changeset
   291
57
hgs
parents: 55
diff changeset
   292
/*!
hgs
parents: 55
diff changeset
   293
 \brief Gets current date from context
hgs
parents: 55
diff changeset
   294
*/
45
hgs
parents:
diff changeset
   295
void CalenDayView::getCurrentDate()
hgs
parents:
diff changeset
   296
{
hgs
parents:
diff changeset
   297
    mDate = CalenNativeView::mServices.Context().focusDateAndTime();
hgs
parents:
diff changeset
   298
}
hgs
parents:
diff changeset
   299
57
hgs
parents: 55
diff changeset
   300
/*!
hgs
parents: 55
diff changeset
   301
 \brief Sets the menu for day view
hgs
parents: 55
diff changeset
   302
*/
45
hgs
parents:
diff changeset
   303
void CalenDayView::setupMenu()
hgs
parents:
diff changeset
   304
{
70
hgs
parents: 64
diff changeset
   305
	menu()->addAction(hbTrId("txt_calendar_opt_new_event"), this, SLOT(runNewMeeting()));
hgs
parents: 64
diff changeset
   306
	//get pointer to this position, because need to change visibility
hgs
parents: 64
diff changeset
   307
	mGoToTodayMenuAction = menu()->addAction(hbTrId("txt_calendar_opt_go_to_today"), this, SLOT(runGoToToday()));
hgs
parents: 64
diff changeset
   308
	menu()->addAction(hbTrId("txt_calendar_opt_go_to_date"), this, SLOT(goToDate()));
hgs
parents: 64
diff changeset
   309
	//TODO: Add id for this text
hgs
parents: 64
diff changeset
   310
	//"Switch to Agenda view"
hgs
parents: 64
diff changeset
   311
	menu()->addAction(hbTrId("txt_calendar_opt_switch_to_agenda_view"), this, SLOT(runChangeToAgendaView()));
hgs
parents: 64
diff changeset
   312
	//TODO: Add id for this text (lunar data)
hgs
parents: 64
diff changeset
   313
	//"Show lunar data"
hgs
parents: 64
diff changeset
   314
	if (pluginEnabled())
hgs
parents: 64
diff changeset
   315
	{
45
hgs
parents:
diff changeset
   316
		menu()->addAction(hbTrId("txt_calendar_opt_show_lunar_data"), this, SLOT(runLunarData()));
70
hgs
parents: 64
diff changeset
   317
	}
hgs
parents: 64
diff changeset
   318
	menu()->addAction(hbTrId("txt_calendar_opt_settings"), this, SLOT(launchSettingsView()));
hgs
parents: 64
diff changeset
   319
	
hgs
parents: 64
diff changeset
   320
	// Close the menu once closeDialogs() is received
hgs
parents: 64
diff changeset
   321
	connect(this, SIGNAL(closeDialogs()), menu(), SLOT(close()));
45
hgs
parents:
diff changeset
   322
}
hgs
parents:
diff changeset
   323
hgs
parents:
diff changeset
   324
/*!
57
hgs
parents: 55
diff changeset
   325
   \brief To change Day view to Agenda View
45
hgs
parents:
diff changeset
   326
 */
hgs
parents:
diff changeset
   327
void CalenDayView::runChangeToAgendaView()
hgs
parents:
diff changeset
   328
{
hgs
parents:
diff changeset
   329
    changeView(ECalenAgendaView);
hgs
parents:
diff changeset
   330
}
hgs
parents:
diff changeset
   331
hgs
parents:
diff changeset
   332
/*!
hgs
parents:
diff changeset
   333
   \brief Shows lunar data in popup box
hgs
parents:
diff changeset
   334
 */
hgs
parents:
diff changeset
   335
void CalenDayView::runLunarData()
hgs
parents:
diff changeset
   336
{
hgs
parents:
diff changeset
   337
	TRAP_IGNORE(mServices.IssueCommandL(ECalenRegionalPluginTapEvent));
hgs
parents:
diff changeset
   338
}
hgs
parents:
diff changeset
   339
57
hgs
parents: 55
diff changeset
   340
/*!
hgs
parents: 55
diff changeset
   341
   \brief This is a helper function to established connections between signals and slots
hgs
parents: 55
diff changeset
   342
*/
45
hgs
parents:
diff changeset
   343
void CalenDayView::setupSlots()
hgs
parents:
diff changeset
   344
{
hgs
parents:
diff changeset
   345
    // Connecting other view-related signals/slots
hgs
parents:
diff changeset
   346
    connect(mContentScrollArea,
hgs
parents:
diff changeset
   347
        SIGNAL(scrollAreaMoveStarted(CalenScrollDirection)), this,
hgs
parents:
diff changeset
   348
        SLOT(dayChangeStarted(CalenScrollDirection)));
hgs
parents:
diff changeset
   349
hgs
parents:
diff changeset
   350
    connect(mContentScrollArea,
hgs
parents:
diff changeset
   351
        SIGNAL(scrollAreaMoveFinished(CalenScrollDirection)), mContentWidget,
hgs
parents:
diff changeset
   352
        SLOT(relayoutWidgets(CalenScrollDirection)));
hgs
parents:
diff changeset
   353
hgs
parents:
diff changeset
   354
    connect(mContentWidget, SIGNAL(
hgs
parents:
diff changeset
   355
        widgetsRelayoutFinished(CalenScrollDirection)), mContentScrollArea,
hgs
parents:
diff changeset
   356
        SLOT(scrollToMiddleWidget()));
hgs
parents:
diff changeset
   357
hgs
parents:
diff changeset
   358
    connect(mContentWidget,
hgs
parents:
diff changeset
   359
        SIGNAL(widgetsRelayoutFinished(CalenScrollDirection)), this,
hgs
parents:
diff changeset
   360
        SLOT(dayChanged(CalenScrollDirection)));
hgs
parents:
diff changeset
   361
hgs
parents:
diff changeset
   362
    connect(mContentWidget, SIGNAL(scrollPositionChanged(const QPointF &)),
hgs
parents:
diff changeset
   363
        mHourScrollArea, SLOT(scrollVertically(const QPointF &)));
63
hgs
parents: 57
diff changeset
   364
45
hgs
parents:
diff changeset
   365
    connect(mHourScrollArea, SIGNAL(scrollPositionChanged(const QPointF &)),
hgs
parents:
diff changeset
   366
        mContentWidget, SLOT(widgetScrolled(const QPointF &)));
63
hgs
parents: 57
diff changeset
   367
hgs
parents: 57
diff changeset
   368
    connect(CalenDayUtils::instance()->mainWindow(),
hgs
parents: 57
diff changeset
   369
        SIGNAL(orientationChanged(Qt::Orientation)), this,
hgs
parents: 57
diff changeset
   370
        SLOT(orientationChanged(Qt::Orientation)));
hgs
parents: 57
diff changeset
   371
45
hgs
parents:
diff changeset
   372
    connect(mSettingsManager, SIGNAL(valueChanged(XQSettingsKey, QVariant)),
hgs
parents:
diff changeset
   373
        this, SLOT(showHideRegionalInformationChanged(XQSettingsKey, QVariant)));
hgs
parents:
diff changeset
   374
}
hgs
parents:
diff changeset
   375
57
hgs
parents: 55
diff changeset
   376
/*!
75
hgs
parents: 70
diff changeset
   377
   \brief Initializes internal views.
hgs
parents: 70
diff changeset
   378
   
hgs
parents: 70
diff changeset
   379
   CalenDayView uses 3 child views which represent previous, current and next days.
hgs
parents: 70
diff changeset
   380
   This assures that swiping to prev/next day works smoothly, because population
hgs
parents: 70
diff changeset
   381
   of data is done earlier.
hgs
parents: 70
diff changeset
   382
*/
hgs
parents: 70
diff changeset
   383
void CalenDayView::initializeViews()
hgs
parents: 70
diff changeset
   384
{
hgs
parents: 70
diff changeset
   385
    // Create item views
hgs
parents: 70
diff changeset
   386
    HbModelIterator *iterator(0);
hgs
parents: 70
diff changeset
   387
hgs
parents: 70
diff changeset
   388
    iterator = new HbModelIterator(&mModelManager->getModel(
hgs
parents: 70
diff changeset
   389
        CalenDayModelManager::PreviousDay));
hgs
parents: 70
diff changeset
   390
    CalenDayItemView *prevItemView = new CalenDayItemView(
hgs
parents: 70
diff changeset
   391
        mModelManager->getServices(), iterator, 0);
hgs
parents: 70
diff changeset
   392
hgs
parents: 70
diff changeset
   393
    iterator = new HbModelIterator(&mModelManager->getModel(
hgs
parents: 70
diff changeset
   394
        CalenDayModelManager::CurrentDay));
hgs
parents: 70
diff changeset
   395
    CalenDayItemView *currItemView = new CalenDayItemView(
hgs
parents: 70
diff changeset
   396
        mModelManager->getServices(), iterator, 0);
hgs
parents: 70
diff changeset
   397
hgs
parents: 70
diff changeset
   398
    iterator = new HbModelIterator(&mModelManager->getModel(
hgs
parents: 70
diff changeset
   399
        CalenDayModelManager::NextDay));
hgs
parents: 70
diff changeset
   400
    CalenDayItemView *nextItemView = new CalenDayItemView(
hgs
parents: 70
diff changeset
   401
        mModelManager->getServices(), iterator, 0);
hgs
parents: 70
diff changeset
   402
hgs
parents: 70
diff changeset
   403
    // Connect views with widgetScrolled SLOT to support simultanous vertical scrolling
hgs
parents: 70
diff changeset
   404
    connect(prevItemView, SIGNAL(scrollPositionChanged(const QPointF&)), mContentWidget,
hgs
parents: 70
diff changeset
   405
        SLOT(widgetScrolled(const QPointF&)));
hgs
parents: 70
diff changeset
   406
    connect(currItemView, SIGNAL(scrollPositionChanged(const QPointF&)), mContentWidget,
hgs
parents: 70
diff changeset
   407
        SLOT(widgetScrolled(const QPointF&)));
hgs
parents: 70
diff changeset
   408
    connect(nextItemView, SIGNAL(scrollPositionChanged(const QPointF&)), mContentWidget,
hgs
parents: 70
diff changeset
   409
        SLOT(widgetScrolled(const QPointF&)));
hgs
parents: 70
diff changeset
   410
    
hgs
parents: 70
diff changeset
   411
    // Close menu once closeDialogs() is received
hgs
parents: 70
diff changeset
   412
    connect(this, SIGNAL(closeDialogs()), prevItemView->contextMenu(), SLOT(close()));
hgs
parents: 70
diff changeset
   413
    connect(this, SIGNAL(closeDialogs()), currItemView->contextMenu(), SLOT(close()));
hgs
parents: 70
diff changeset
   414
    connect(this, SIGNAL(closeDialogs()), nextItemView->contextMenu(), SLOT(close()));
hgs
parents: 70
diff changeset
   415
hgs
parents: 70
diff changeset
   416
    // Install event filters to receive events necessary for gesture handling
hgs
parents: 70
diff changeset
   417
    prevItemView->installEventFilter(mContentScrollArea);
hgs
parents: 70
diff changeset
   418
    currItemView->installEventFilter(mContentScrollArea);
hgs
parents: 70
diff changeset
   419
    nextItemView->installEventFilter(mContentScrollArea);
hgs
parents: 70
diff changeset
   420
hgs
parents: 70
diff changeset
   421
    // Add views to layout
hgs
parents: 70
diff changeset
   422
    mContentWidget->add(prevItemView);
hgs
parents: 70
diff changeset
   423
    mContentWidget->add(currItemView);
hgs
parents: 70
diff changeset
   424
    mContentWidget->add(nextItemView);
hgs
parents: 70
diff changeset
   425
}
hgs
parents: 70
diff changeset
   426
hgs
parents: 70
diff changeset
   427
/*!
81
hgs
parents: 75
diff changeset
   428
 \brief Checks current date and if previous/next days are valid.
hgs
parents: 75
diff changeset
   429
 
hgs
parents: 75
diff changeset
   430
 Checks if previous/next day is in range of supported dates: 1900-01-01 - 2100-12-30
hgs
parents: 75
diff changeset
   431
 */
hgs
parents: 75
diff changeset
   432
void CalenDayView::isDateValid()
hgs
parents: 75
diff changeset
   433
{
hgs
parents: 75
diff changeset
   434
    // Fix to ou1cimx1#583805: user shouldnot be able to scroll 
hgs
parents: 75
diff changeset
   435
    // before 01/01/1900 and after 30/12/2100
hgs
parents: 75
diff changeset
   436
    mContentScrollArea->setDisallowedScrollDirection(ECalenScrollNoDayChange);
hgs
parents: 75
diff changeset
   437
    if (!CalenDateUtils::isValidDay(mDate.addDays(-1))) {
hgs
parents: 75
diff changeset
   438
        mContentScrollArea->setDisallowedScrollDirection(ECalenScrollToPrev);
hgs
parents: 75
diff changeset
   439
    }
hgs
parents: 75
diff changeset
   440
    else
hgs
parents: 75
diff changeset
   441
        if (!CalenDateUtils::isValidDay(mDate.addDays(1))) {
hgs
parents: 75
diff changeset
   442
            mContentScrollArea->setDisallowedScrollDirection(ECalenScrollToNext);
hgs
parents: 75
diff changeset
   443
        }
hgs
parents: 75
diff changeset
   444
}
hgs
parents: 75
diff changeset
   445
hgs
parents: 75
diff changeset
   446
/*!
57
hgs
parents: 55
diff changeset
   447
   \brief This slot triggers new meeting creation view
hgs
parents: 55
diff changeset
   448
*/
45
hgs
parents:
diff changeset
   449
void CalenDayView::runNewMeeting()
hgs
parents:
diff changeset
   450
{
hgs
parents:
diff changeset
   451
    QDateTime dateTime(mDate);
hgs
parents:
diff changeset
   452
    TRAP_IGNORE(
hgs
parents:
diff changeset
   453
        dateTime.setTime(mServices.Context().defaultCalTimeForViewsL().time());
hgs
parents:
diff changeset
   454
        mServices.Context().setFocusDateAndTime(dateTime);
hgs
parents:
diff changeset
   455
        mServices.IssueCommandL(ECalenNewMeeting)
55
hgs
parents: 45
diff changeset
   456
    );
45
hgs
parents:
diff changeset
   457
}
hgs
parents:
diff changeset
   458
57
hgs
parents: 55
diff changeset
   459
/*!
hgs
parents: 55
diff changeset
   460
   \brief This slot switches current view to today
hgs
parents: 55
diff changeset
   461
*/
45
hgs
parents:
diff changeset
   462
void CalenDayView::runGoToToday()
hgs
parents:
diff changeset
   463
{
hgs
parents:
diff changeset
   464
    mServices.Context().setFocusDateAndTime(CalenDateUtils::today());
hgs
parents:
diff changeset
   465
    TRAP_IGNORE(mServices.IssueCommandL(ECalenGotoToday));
hgs
parents:
diff changeset
   466
    refreshViewOnGoToDate();
hgs
parents:
diff changeset
   467
}
hgs
parents:
diff changeset
   468
hgs
parents:
diff changeset
   469
57
hgs
parents: 55
diff changeset
   470
/*!
hgs
parents: 55
diff changeset
   471
   \brief This slot switches current view to the given by id
hgs
parents: 55
diff changeset
   472
   
hgs
parents: 55
diff changeset
   473
   \param viewId id of the view that needs to be displayed
hgs
parents: 55
diff changeset
   474
*/
45
hgs
parents:
diff changeset
   475
void CalenDayView::changeView(TCalenCommandId viewId)
hgs
parents:
diff changeset
   476
{
hgs
parents:
diff changeset
   477
    TRAP_IGNORE(mServices.IssueCommandL(viewId));
hgs
parents:
diff changeset
   478
}
hgs
parents:
diff changeset
   479
57
hgs
parents: 55
diff changeset
   480
/*!
hgs
parents: 55
diff changeset
   481
   \brief Sets heading text according to date from model and locale.
hgs
parents: 55
diff changeset
   482
          It's connected to modelReset signal.
hgs
parents: 55
diff changeset
   483
   
hgs
parents: 55
diff changeset
   484
   \param status Parameter required in order to call this slot autmatically
hgs
parents: 55
diff changeset
   485
                 when an effect is complete.
hgs
parents: 55
diff changeset
   486
*/
45
hgs
parents:
diff changeset
   487
void CalenDayView::setHeadingText(const HbEffect::EffectStatus &status)
hgs
parents:
diff changeset
   488
{   
hgs
parents:
diff changeset
   489
    Q_UNUSED(status)
hgs
parents:
diff changeset
   490
hgs
parents:
diff changeset
   491
    // Format the date as per the device locale settings
hgs
parents:
diff changeset
   492
    HbExtendedLocale systemLocale = HbExtendedLocale::system();
hgs
parents:
diff changeset
   493
hgs
parents:
diff changeset
   494
    // Get localised name of the day from locale
hgs
parents:
diff changeset
   495
    QString dayString = systemLocale.dayName(mDate.date().dayOfWeek());
hgs
parents:
diff changeset
   496
    // Append a single space
hgs
parents:
diff changeset
   497
    dayString.append(" ");
hgs
parents:
diff changeset
   498
    // Set the heading
hgs
parents:
diff changeset
   499
hgs
parents:
diff changeset
   500
    // Append the date which is formatted as per the locale   
64
1881ad52dc45 201033_03
hgs
parents: 63
diff changeset
   501
    mHeadingLabel->setHeading(QString("%1 %2").arg(dayString).arg(
45
hgs
parents:
diff changeset
   502
        systemLocale.format(mDate.date(), r_qtn_date_usual_with_zero)));
hgs
parents:
diff changeset
   503
hgs
parents:
diff changeset
   504
    HbEffect::start(mHeadingLabel, "fadeIn");
hgs
parents:
diff changeset
   505
}
hgs
parents:
diff changeset
   506
57
hgs
parents: 55
diff changeset
   507
/*!
hgs
parents: 55
diff changeset
   508
   \brief Displays regional information
hgs
parents: 55
diff changeset
   509
   
hgs
parents: 55
diff changeset
   510
   \param status Parameter required in order to call this slot autmatically
hgs
parents: 55
diff changeset
   511
                 when an effect is complete.
hgs
parents: 55
diff changeset
   512
*/
45
hgs
parents:
diff changeset
   513
void CalenDayView::showRegionalInformation(const HbEffect::EffectStatus &status)
hgs
parents:
diff changeset
   514
{
hgs
parents:
diff changeset
   515
	Q_UNUSED(status);
hgs
parents:
diff changeset
   516
	showRegionalInformationFadeIn();
hgs
parents:
diff changeset
   517
}
hgs
parents:
diff changeset
   518
57
hgs
parents: 55
diff changeset
   519
/*!
hgs
parents: 55
diff changeset
   520
   \brief Runs effect on lunar data label and change text according to date change.
hgs
parents: 55
diff changeset
   521
*/
45
hgs
parents:
diff changeset
   522
void CalenDayView::showRegionalInformationFadeIn()
57
hgs
parents: 55
diff changeset
   523
{
63
hgs
parents: 57
diff changeset
   524
	showHideRegionalInformationChanged(mRegionalInfoKey, 3);
hgs
parents: 57
diff changeset
   525
	if (mRegionalInfoGroupBox) {
hgs
parents: 57
diff changeset
   526
	    HbEffect::start(mRegionalInfoGroupBox, "fadeIn");
hgs
parents: 57
diff changeset
   527
	}
57
hgs
parents: 55
diff changeset
   528
}
45
hgs
parents:
diff changeset
   529
57
hgs
parents: 55
diff changeset
   530
/*!
hgs
parents: 55
diff changeset
   531
   \brief To Show and hide regional plugin label depends upon settings.
hgs
parents: 55
diff changeset
   532
*/
55
hgs
parents: 45
diff changeset
   533
void CalenDayView::showHideRegionalInformationChanged(
hgs
parents: 45
diff changeset
   534
    const XQSettingsKey& key,
hgs
parents: 45
diff changeset
   535
    const QVariant&)
hgs
parents: 45
diff changeset
   536
{
63
hgs
parents: 57
diff changeset
   537
    if ((key.key() == mRegionalInfoKey.key()) && pluginEnabled()) {
55
hgs
parents: 45
diff changeset
   538
        int showRegionalInfo =
63
hgs
parents: 57
diff changeset
   539
            mSettingsManager->readItemValue(mRegionalInfoKey).toUInt();
hgs
parents: 57
diff changeset
   540
        if (showRegionalInfo) {
hgs
parents: 57
diff changeset
   541
            if (!mRegionalInfoGroupBox) {
hgs
parents: 57
diff changeset
   542
                mRegionalInfoGroupBox = new HbGroupBox();
hgs
parents: 57
diff changeset
   543
                CalenPluginLabel *regionalInfo = new CalenPluginLabel(
hgs
parents: 57
diff changeset
   544
                    mServices, this);
hgs
parents: 57
diff changeset
   545
                regionalInfo->setFontSpec(HbFontSpec(HbFontSpec::Primary));
83
hgs
parents: 81
diff changeset
   546
                regionalInfo->setTextWrapping(Hb::TextNoWrap);
hgs
parents: 81
diff changeset
   547
                regionalInfo->setElideMode(Qt::ElideRight);
63
hgs
parents: 57
diff changeset
   548
                mRegionalInfoGroupBox->setContentWidget(regionalInfo);
hgs
parents: 57
diff changeset
   549
                mVLayout->insertItem(1, mRegionalInfoGroupBox);
hgs
parents: 57
diff changeset
   550
            }
55
hgs
parents: 45
diff changeset
   551
            QString *pluginString = pluginText();
63
hgs
parents: 57
diff changeset
   552
            HbLabel *pluginInfoLabel = qobject_cast<HbLabel *> (
hgs
parents: 57
diff changeset
   553
                mRegionalInfoGroupBox->contentWidget());
hgs
parents: 57
diff changeset
   554
            pluginInfoLabel->setPlainText(*pluginString);
55
hgs
parents: 45
diff changeset
   555
        }
hgs
parents: 45
diff changeset
   556
        else {
hgs
parents: 45
diff changeset
   557
            if (mRegionalInfoGroupBox) {
hgs
parents: 45
diff changeset
   558
                mVLayout->removeItem(mRegionalInfoGroupBox);
hgs
parents: 45
diff changeset
   559
                delete mRegionalInfoGroupBox;
hgs
parents: 45
diff changeset
   560
                mRegionalInfoGroupBox = NULL;
hgs
parents: 45
diff changeset
   561
            }
hgs
parents: 45
diff changeset
   562
        }
hgs
parents: 45
diff changeset
   563
    }
hgs
parents: 45
diff changeset
   564
}
45
hgs
parents:
diff changeset
   565
57
hgs
parents: 55
diff changeset
   566
/*!
hgs
parents: 55
diff changeset
   567
   \brief Scrolls view according to current day and events.
hgs
parents: 55
diff changeset
   568
*/
45
hgs
parents:
diff changeset
   569
void CalenDayView::setupViewport()
hgs
parents:
diff changeset
   570
{
hgs
parents:
diff changeset
   571
    QDateTime currentTime = QDateTime::currentDateTime();
55
hgs
parents: 45
diff changeset
   572
45
hgs
parents:
diff changeset
   573
    // If we have event in current day and hour, scroll to this event
55
hgs
parents: 45
diff changeset
   574
    if (mDate.date() == currentTime.date()){
hgs
parents: 45
diff changeset
   575
hgs
parents: 45
diff changeset
   576
        QDateTime midnight = currentTime;
hgs
parents: 45
diff changeset
   577
        midnight.setTime(QTime(23, 59));
hgs
parents: 45
diff changeset
   578
hgs
parents: 45
diff changeset
   579
        //Filter flags (only timed events)
hgs
parents: 45
diff changeset
   580
        AgendaUtil::FilterFlags filter = AgendaUtil::FilterFlags(AgendaUtil::IncludeAppointments);
hgs
parents: 45
diff changeset
   581
        QList<AgendaEntry> list;
hgs
parents: 45
diff changeset
   582
        // Fetch the instance list from the agenda interface
hgs
parents: 45
diff changeset
   583
        list = mServices.agendaInterface()->fetchEntriesInRange(currentTime, midnight, filter);
hgs
parents: 45
diff changeset
   584
hgs
parents: 45
diff changeset
   585
        if(!list.isEmpty()){
hgs
parents: 45
diff changeset
   586
            int hourToScrollTo(list.first().startTime().time().hour());
hgs
parents: 45
diff changeset
   587
            mHourScrollArea->scrollToHour(hourToScrollTo);           
hgs
parents: 45
diff changeset
   588
        }
hgs
parents: 45
diff changeset
   589
        else{
hgs
parents: 45
diff changeset
   590
            mHourScrollArea->scrollToHour(currentTime.time().hour());
hgs
parents: 45
diff changeset
   591
        }
45
hgs
parents:
diff changeset
   592
    }
55
hgs
parents: 45
diff changeset
   593
    else {
45
hgs
parents:
diff changeset
   594
        //Scroll view to 7am
hgs
parents:
diff changeset
   595
        mHourScrollArea->scrollToHour(7);
hgs
parents:
diff changeset
   596
    }
hgs
parents:
diff changeset
   597
}
hgs
parents:
diff changeset
   598
63
hgs
parents: 57
diff changeset
   599
/*!
hgs
parents: 57
diff changeset
   600
 \brief Slot which is called whenever the orientation of the device changes.
hgs
parents: 57
diff changeset
   601
 
hgs
parents: 57
diff changeset
   602
 Changes the backgroung graphic element when orientation chandes.
hgs
parents: 57
diff changeset
   603
 
hgs
parents: 57
diff changeset
   604
 \param orientation Current device orientation
hgs
parents: 57
diff changeset
   605
 */
hgs
parents: 57
diff changeset
   606
void CalenDayView::orientationChanged(Qt::Orientation orientation)
hgs
parents: 57
diff changeset
   607
{
hgs
parents: 57
diff changeset
   608
    if (Qt::Vertical == orientation) {
hgs
parents: 57
diff changeset
   609
        mBg = new HbFrameItem(KCalenBackgroundColorPortrait,
hgs
parents: 57
diff changeset
   610
            HbFrameDrawer::OnePiece, this);
hgs
parents: 57
diff changeset
   611
    }
hgs
parents: 57
diff changeset
   612
    else {
hgs
parents: 57
diff changeset
   613
        mBg = new HbFrameItem(KCalenBackgroundColorLandscape,
hgs
parents: 57
diff changeset
   614
            HbFrameDrawer::OnePiece, this);
hgs
parents: 57
diff changeset
   615
    }
hgs
parents: 57
diff changeset
   616
    mMainContainer->setBackgroundItem(mBg);
hgs
parents: 57
diff changeset
   617
}
hgs
parents: 57
diff changeset
   618
45
hgs
parents:
diff changeset
   619
//End of File