calendarui/views/dayview/src/calendayitem.cpp
author hgs
Mon, 09 Aug 2010 18:30:52 +0530
changeset 57 bb2d3e476f29
parent 55 2c54b51f39c4
child 63 a3cb48f6c889
permissions -rw-r--r--
201031
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:  Event view item, exact size and position of event is set in 
hgs
parents:
diff changeset
    15
*  				CalenDayContainer::setItemModelIndex based on event duration
hgs
parents:
diff changeset
    16
*
hgs
parents:
diff changeset
    17
*/
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
//System includes
hgs
parents:
diff changeset
    20
#include <hbframeitem.h>
hgs
parents:
diff changeset
    21
#include <hbtextitem.h>
hgs
parents:
diff changeset
    22
#include <agendaentry.h>
hgs
parents:
diff changeset
    23
#include <hbstyle.h>
hgs
parents:
diff changeset
    24
#include <hbcolorscheme.h>
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
//User inlcudes
hgs
parents:
diff changeset
    28
#include "calendayitem.h"
hgs
parents:
diff changeset
    29
#include "calendaystatusstrip.h"
hgs
parents:
diff changeset
    30
#include "calendaymodel.h"
55
hgs
parents: 45
diff changeset
    31
#include "calendayutils.h"
57
hgs
parents: 55
diff changeset
    32
#include "calenagendautils.h"
55
hgs
parents: 45
diff changeset
    33
#include "calendaycontainer.h"
45
hgs
parents:
diff changeset
    34
57
hgs
parents: 55
diff changeset
    35
/*!
hgs
parents: 55
diff changeset
    36
   \brief Constructor.
hgs
parents: 55
diff changeset
    37
*/
55
hgs
parents: 45
diff changeset
    38
CalenDayItem::CalenDayItem(const CalenDayContainer *container):
hgs
parents: 45
diff changeset
    39
    mContainer(container), mUpdated(false), mBg(0), mEventDesc(0), mColorStripe(0), 
45
hgs
parents:
diff changeset
    40
    mEventDescMinWidth(0.0), mFrameMinWidth(0.0)
hgs
parents:
diff changeset
    41
{
hgs
parents:
diff changeset
    42
}
hgs
parents:
diff changeset
    43
57
hgs
parents: 55
diff changeset
    44
/*!
hgs
parents: 55
diff changeset
    45
   \brief Constructor.
hgs
parents: 55
diff changeset
    46
*/
45
hgs
parents:
diff changeset
    47
CalenDayItem::CalenDayItem(const CalenDayItem & source) :
55
hgs
parents: 45
diff changeset
    48
    HbAbstractViewItem(source), mContainer(source.container()), mUpdated(false), mBg(0), mEventDesc(0), 
45
hgs
parents:
diff changeset
    49
    mColorStripe(0), mEventDescMinWidth(0.0), mFrameMinWidth(0.0)
57
hgs
parents: 55
diff changeset
    50
{
45
hgs
parents:
diff changeset
    51
    // TODO: "qtg_fr_btn_pressed" need to replaced with qtg_fr_cal_meeting_bg
hgs
parents:
diff changeset
    52
	// when available
hgs
parents:
diff changeset
    53
    mBg = new HbFrameItem("qtg_fr_btn_pressed", HbFrameDrawer::NinePieces, this);
hgs
parents:
diff changeset
    54
    mEventDesc = new HbTextItem(this);
hgs
parents:
diff changeset
    55
    // TODO: probably ElideLeft needed for mirrored layout
hgs
parents:
diff changeset
    56
    mEventDesc->setElideMode(Qt::ElideRight);
hgs
parents:
diff changeset
    57
    mEventDesc->setTextWrapping(Hb::TextWrapAnywhere);
hgs
parents:
diff changeset
    58
    
hgs
parents:
diff changeset
    59
    mColorStripe = new CalenDayStatusStrip(this);
hgs
parents:
diff changeset
    60
    
hgs
parents:
diff changeset
    61
    HbStyle::setItemName(mBg, QLatin1String("backgroundFrame"));
hgs
parents:
diff changeset
    62
    HbStyle::setItemName(mEventDesc, QLatin1String("eventDescription"));
hgs
parents:
diff changeset
    63
    HbStyle::setItemName(static_cast<QGraphicsItem *>(mColorStripe), QLatin1String("colorStripe"));
hgs
parents:
diff changeset
    64
    
hgs
parents:
diff changeset
    65
    HbDeviceProfile deviceProfile;
hgs
parents:
diff changeset
    66
    HbStyle style;
hgs
parents:
diff changeset
    67
    
hgs
parents:
diff changeset
    68
    qreal horizontalSpacing = 0.0;
hgs
parents:
diff changeset
    69
    qreal rightMargin = 0.0;
hgs
parents:
diff changeset
    70
    
hgs
parents:
diff changeset
    71
    style.parameter(QString("hb-param-margin-gene-middle-horizontal"), 
hgs
parents:
diff changeset
    72
        horizontalSpacing, deviceProfile);
hgs
parents:
diff changeset
    73
    style.parameter(QString("hb-param-margin-gene-right"), 
hgs
parents:
diff changeset
    74
        rightMargin, deviceProfile); 
hgs
parents:
diff changeset
    75
    
hgs
parents:
diff changeset
    76
    qreal stripeWidth = 1.5 * deviceProfile.unitValue(); //1.5un according to UI spec
hgs
parents:
diff changeset
    77
    
hgs
parents:
diff changeset
    78
    mFrameMinWidth = 2 * horizontalSpacing + stripeWidth; //smallest width for which background frame is displayed
hgs
parents:
diff changeset
    79
    mEventDescMinWidth = mFrameMinWidth + rightMargin;//smallest width for which text can be displayed
hgs
parents:
diff changeset
    80
    
hgs
parents:
diff changeset
    81
    //Minimum width is assured by widgetml and css
hgs
parents:
diff changeset
    82
    //additionally called here to prevent minimum size hint caching inside effectiveSizeHint
hgs
parents:
diff changeset
    83
    setMinimumWidth(stripeWidth);
55
hgs
parents: 45
diff changeset
    84
45
hgs
parents:
diff changeset
    85
}
hgs
parents:
diff changeset
    86
57
hgs
parents: 55
diff changeset
    87
/*!
hgs
parents: 55
diff changeset
    88
   \brief Destructor.
hgs
parents: 55
diff changeset
    89
*/
45
hgs
parents:
diff changeset
    90
CalenDayItem::~CalenDayItem()
hgs
parents:
diff changeset
    91
{
hgs
parents:
diff changeset
    92
}
hgs
parents:
diff changeset
    93
57
hgs
parents: 55
diff changeset
    94
/*!
hgs
parents: 55
diff changeset
    95
   \brief Creates new instance of day item.
hgs
parents: 55
diff changeset
    96
   
hgs
parents: 55
diff changeset
    97
   \return New instance of day item.
hgs
parents: 55
diff changeset
    98
*/
45
hgs
parents:
diff changeset
    99
HbAbstractViewItem * CalenDayItem::createItem()
hgs
parents:
diff changeset
   100
{
hgs
parents:
diff changeset
   101
    CalenDayItem* newItem = new CalenDayItem(*this);
hgs
parents:
diff changeset
   102
    return newItem;
hgs
parents:
diff changeset
   103
}
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
57
hgs
parents: 55
diff changeset
   106
/*!
hgs
parents: 55
diff changeset
   107
   \brief Sets data to be displayed on item.
hgs
parents: 55
diff changeset
   108
*/
45
hgs
parents:
diff changeset
   109
void CalenDayItem::updateChildItems()
hgs
parents:
diff changeset
   110
{
57
hgs
parents: 55
diff changeset
   111
    // there is no need to update items after creation
hgs
parents: 55
diff changeset
   112
    if (!mUpdated) {
hgs
parents: 55
diff changeset
   113
        AgendaEntry entry;
hgs
parents: 55
diff changeset
   114
        entry = modelIndex().data(CalenDayEntry).value<AgendaEntry>();
hgs
parents: 55
diff changeset
   115
hgs
parents: 55
diff changeset
   116
		bool isAllDayEvent = CalenAgendaUtils::isAlldayEvent(entry); 
hgs
parents: 55
diff changeset
   117
hgs
parents: 55
diff changeset
   118
        setDescription(entry, isAllDayEvent);
hgs
parents: 55
diff changeset
   119
        setStatusStrip(entry, isAllDayEvent);
hgs
parents: 55
diff changeset
   120
hgs
parents: 55
diff changeset
   121
        mUpdated = true;
hgs
parents: 55
diff changeset
   122
    }
hgs
parents: 55
diff changeset
   123
hgs
parents: 55
diff changeset
   124
    //TODO: check if needed
hgs
parents: 55
diff changeset
   125
    //repolish(); 
hgs
parents: 55
diff changeset
   126
    //HbAbstractViewItem::updateChildItems();
45
hgs
parents:
diff changeset
   127
}
hgs
parents:
diff changeset
   128
hgs
parents:
diff changeset
   129
57
hgs
parents: 55
diff changeset
   130
/*!
hgs
parents: 55
diff changeset
   131
   \brief Adds event description for the item.
hgs
parents: 55
diff changeset
   132
   
hgs
parents: 55
diff changeset
   133
   \param entry An for which description needs to be displayed.
hgs
parents: 55
diff changeset
   134
   \param allDayEvent Flag that indicates whether an item is all day event
hgs
parents: 55
diff changeset
   135
*/
45
hgs
parents:
diff changeset
   136
void CalenDayItem::setDescription(const AgendaEntry &entry, bool allDayEvent)
hgs
parents:
diff changeset
   137
{
hgs
parents:
diff changeset
   138
	QString description(entry.summary());
hgs
parents:
diff changeset
   139
	QString location(entry.location());
hgs
parents:
diff changeset
   140
	
hgs
parents:
diff changeset
   141
	
hgs
parents:
diff changeset
   142
	int separtorPos = 0;
hgs
parents:
diff changeset
   143
	
hgs
parents:
diff changeset
   144
	if(!location.isEmpty()) {
hgs
parents:
diff changeset
   145
	    if ( !description.isEmpty() ) {
hgs
parents:
diff changeset
   146
	    	separtorPos = description.count();
hgs
parents:
diff changeset
   147
	    	description.append(", ");
hgs
parents:
diff changeset
   148
			}
hgs
parents:
diff changeset
   149
	    
hgs
parents:
diff changeset
   150
		description.append(location);
hgs
parents:
diff changeset
   151
		}
hgs
parents:
diff changeset
   152
	
hgs
parents:
diff changeset
   153
	if ( description.isEmpty() ) {
hgs
parents:
diff changeset
   154
	    description.append(hbTrId("txt_calendar_dblist_unnamed"));
hgs
parents:
diff changeset
   155
	}
hgs
parents:
diff changeset
   156
	
hgs
parents:
diff changeset
   157
	//Description of all day events has to be displayed vertically
hgs
parents:
diff changeset
   158
	if(allDayEvent){
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
	    QString verticalString;
hgs
parents:
diff changeset
   161
	    for(int i=0; i<description.count(); i++){
hgs
parents:
diff changeset
   162
	    
hgs
parents:
diff changeset
   163
	        verticalString.append(QString(description.at(i)) + "\n");
hgs
parents:
diff changeset
   164
	    }
hgs
parents:
diff changeset
   165
	
hgs
parents:
diff changeset
   166
	    // remove "\n" before comma separator if exist
hgs
parents:
diff changeset
   167
	    if (separtorPos)
hgs
parents:
diff changeset
   168
	    	{
hgs
parents:
diff changeset
   169
	    	verticalString.remove( 2*separtorPos-1, 1);
hgs
parents:
diff changeset
   170
	    	}
hgs
parents:
diff changeset
   171
	    description = verticalString;
hgs
parents:
diff changeset
   172
	}	
hgs
parents:
diff changeset
   173
	
hgs
parents:
diff changeset
   174
	mEventDesc->setText(description);
hgs
parents:
diff changeset
   175
}
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
/*!
hgs
parents:
diff changeset
   178
   \brief It set all needed things for status strip from Agenda Entry.
hgs
parents:
diff changeset
   179
   
hgs
parents:
diff changeset
   180
   \param entry Status Strip is created from Agenda Entry
57
hgs
parents: 55
diff changeset
   181
*/
45
hgs
parents:
diff changeset
   182
void CalenDayItem::setStatusStrip(const AgendaEntry &entry, bool allDayEvent)
hgs
parents:
diff changeset
   183
{
hgs
parents:
diff changeset
   184
    QColor color = HbColorScheme::color("qtc_cal_month_current_day");
hgs
parents:
diff changeset
   185
    mColorStripe->setColor(color);
hgs
parents:
diff changeset
   186
    
hgs
parents:
diff changeset
   187
    if (!allDayEvent) {
55
hgs
parents: 45
diff changeset
   188
hgs
parents: 45
diff changeset
   189
        QDateTime startTime;
hgs
parents: 45
diff changeset
   190
        QDateTime endTime;
hgs
parents: 45
diff changeset
   191
        QDateTime currentDateTime;
hgs
parents: 45
diff changeset
   192
        currentDateTime.setDate(container()->date());
hgs
parents: 45
diff changeset
   193
hgs
parents: 45
diff changeset
   194
        CalenDayUtils::instance()->getEventValidStartEndTime(startTime, endTime, entry,
hgs
parents: 45
diff changeset
   195
            currentDateTime);
hgs
parents: 45
diff changeset
   196
hgs
parents: 45
diff changeset
   197
        mColorStripe->setStartEndTime(startTime.time(), endTime.time());
hgs
parents: 45
diff changeset
   198
    }
hgs
parents: 45
diff changeset
   199
    else {
hgs
parents: 45
diff changeset
   200
        // This is workaround for displaying all-day events.
hgs
parents: 45
diff changeset
   201
        // Now for MS Outlook compability all-day events' start and end time is
hgs
parents: 45
diff changeset
   202
        // 00:00:00 and 00:00:00 next day respectively.
hgs
parents: 45
diff changeset
   203
        // To draw it correctly we need times like those visible for user in
hgs
parents: 45
diff changeset
   204
        // editor: 00:00:00 to 23:59:59 (the same day)
hgs
parents: 45
diff changeset
   205
        mColorStripe->setStartEndTime(entry.startTime().time(), entry.endTime().time().addSecs(-1));
45
hgs
parents:
diff changeset
   206
    }
hgs
parents:
diff changeset
   207
    
hgs
parents:
diff changeset
   208
    switch (entry.status()) {
hgs
parents:
diff changeset
   209
        case AgendaEntry::Confirmed:
hgs
parents:
diff changeset
   210
            mColorStripe->setDrawingStyle(CalenDayStatusStrip::Filled);
hgs
parents:
diff changeset
   211
        break;
hgs
parents:
diff changeset
   212
        case AgendaEntry::Tentative:
hgs
parents:
diff changeset
   213
            mColorStripe->setDrawingStyle(CalenDayStatusStrip::StripWithLines);
hgs
parents:
diff changeset
   214
        break;
hgs
parents:
diff changeset
   215
        case AgendaEntry::Cancelled:
hgs
parents:
diff changeset
   216
            mColorStripe->setDrawingStyle(CalenDayStatusStrip::OnlyFrame);
hgs
parents:
diff changeset
   217
        break;
hgs
parents:
diff changeset
   218
        default:
hgs
parents:
diff changeset
   219
            mColorStripe->setDrawingStyle(CalenDayStatusStrip::Filled);
hgs
parents:
diff changeset
   220
        break;
hgs
parents:
diff changeset
   221
    }
hgs
parents:
diff changeset
   222
}
hgs
parents:
diff changeset
   223
57
hgs
parents: 55
diff changeset
   224
/*!
hgs
parents: 55
diff changeset
   225
   \brief Reimplemented from HbWidget. Handles resize event.
hgs
parents: 55
diff changeset
   226
   
hgs
parents: 55
diff changeset
   227
   \param event Instance of an event to be handled.
hgs
parents: 55
diff changeset
   228
*/
45
hgs
parents:
diff changeset
   229
void CalenDayItem::resizeEvent(QGraphicsSceneResizeEvent *event)
hgs
parents:
diff changeset
   230
{
hgs
parents:
diff changeset
   231
    Q_UNUSED(event)
hgs
parents:
diff changeset
   232
hgs
parents:
diff changeset
   233
    qreal width = rect().width();
hgs
parents:
diff changeset
   234
hgs
parents:
diff changeset
   235
    if(width < mEventDescMinWidth){
hgs
parents:
diff changeset
   236
        mEventDesc->hide();
hgs
parents:
diff changeset
   237
    } else{
hgs
parents:
diff changeset
   238
        mEventDesc->show();
hgs
parents:
diff changeset
   239
    }
hgs
parents:
diff changeset
   240
        
hgs
parents:
diff changeset
   241
    if(width < mFrameMinWidth){
hgs
parents:
diff changeset
   242
        mBg->hide();
hgs
parents:
diff changeset
   243
    } else{
hgs
parents:
diff changeset
   244
        mBg->show();
hgs
parents:
diff changeset
   245
    }
hgs
parents:
diff changeset
   246
hgs
parents:
diff changeset
   247
    //Necessary to switch layout
hgs
parents:
diff changeset
   248
    repolish();
hgs
parents:
diff changeset
   249
}
hgs
parents:
diff changeset
   250
hgs
parents:
diff changeset
   251
// End of File