author | zautrix <zautrix> | 2004-06-26 19:01:18 (UTC) |
---|---|---|
committer | zautrix <zautrix> | 2004-06-26 19:01:18 (UTC) |
commit | b9aad1f15dc600e4dbe4c62d3fcced6363188ba3 (patch) (side-by-side diff) | |
tree | 2c3d4004fb21c72cba65793859f9bcd8ffd3a49c /korganizer/komonthview.cpp | |
download | kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.zip kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.tar.gz kdepimpi-b9aad1f15dc600e4dbe4c62d3fcced6363188ba3.tar.bz2 |
Initial revision
-rw-r--r-- | korganizer/komonthview.cpp | 1057 |
1 files changed, 1057 insertions, 0 deletions
diff --git a/korganizer/komonthview.cpp b/korganizer/komonthview.cpp new file mode 100644 index 0000000..c4bc51b --- a/dev/null +++ b/korganizer/komonthview.cpp @@ -0,0 +1,1057 @@ +/* + This file is part of KOrganizer. + Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#include <qpopupmenu.h> +#include <qfont.h> +#include <qfontmetrics.h> +#include <qkeycode.h> +#include <qhbox.h> +#include <qvbox.h> +#include <qpushbutton.h> +#include <qtooltip.h> +#include <qpainter.h> +#include <qwhatsthis.h> +#ifndef DESKTOP_VERSION +#include <qpe/qpeapplication.h> +#else +#include <qapplication.h> +#endif + +#include <kdebug.h> +#include <klocale.h> +#include <kglobal.h> +#include <kconfig.h> +#include <kiconloader.h> + +#include <kcalendarsystem.h> + +#ifndef KORG_NOPRINTER +#include "calprinter.h" +#endif +#include "koprefs.h" +#ifndef KORG_NOPLUGINS +#include "kocore.h" +#endif +#include "koglobals.h" +#include <libkdepim/kincidenceformatter.h> + +#include "komonthview.h" +#include "komonthview.moc" + +#define PIXMAP_SIZE 5 + +class KNOWhatsThis :public QWhatsThis +{ +public: + KNOWhatsThis( KNoScrollListBox* sbox ) : QWhatsThis( sbox ), _wid( sbox) { }; + +protected: + virtual QString text( const QPoint& p) + { + return _wid->getWhatsThisText(p) ; + }; +private: + KNoScrollListBox* _wid; + +}; + + +KNoScrollListBox::KNoScrollListBox(QWidget *parent,const char *name) + : QListBox(parent, name) +{ +#ifndef DESKTOP_VERSION + QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold ); +#endif + new KNOWhatsThis(this); +} + +QString KNoScrollListBox::getWhatsThisText(QPoint p) +{ + QListBoxItem* item = itemAt ( p ); + if ( ! item ) { + return i18n("Click in the cell or\non the date label\nto add an event!"); + } + return KIncidenceFormatter::instance()->getFormattedText(((MonthViewItem*) item)->incidence()); +} +void KNoScrollListBox::keyPressEvent(QKeyEvent *e) +{ + + switch(e->key()) { + case Key_Right: + // if ( e->state() == Qt::ControlButton ) + { + e->ignore(); + return; + } + scrollBy(4,0); + break; + case Key_Left: + // if ( e->state() == Qt::ControlButton ) + { + e->ignore(); + return; + } + scrollBy(-4,0); + break; + case Key_Up: + if(!count()) break; + setCurrentItem((currentItem()+count()-1)%count()); + if(!itemVisible(currentItem())) { + if((unsigned int) currentItem() == (count()-1)) { + setTopItem(currentItem()-numItemsVisible()+1); + } else { + setTopItem(topItem()-1); + } + } + break; + case Key_Down: + if(!count()) break; + setCurrentItem((currentItem()+1)%count()); + if(!itemVisible(currentItem())) { + if(currentItem() == 0) { + setTopItem(0); + } else { + setTopItem(topItem()+1); + } + } + break; + case Key_Shift: + emit shiftDown(); + break; + default: + e->ignore(); + break; + } +} + +void KNoScrollListBox::keyReleaseEvent(QKeyEvent *e) +{ + switch(e->key()) { + case Key_Shift: + emit shiftUp(); + break; + default: + break; + } +} + +void KNoScrollListBox::mousePressEvent(QMouseEvent *e) +{ + QListBox::mousePressEvent(e); + + if(e->button() == RightButton) { + emit rightClick(); + } +} + +MonthViewItem::MonthViewItem( Incidence *incidence, QDate qd, const QString & s) + : QListBoxItem() +{ + setText( s ); + + mIncidence = incidence; + mDate = qd; + // QWhatsThis::add(this,KIncidenceFormatter::instance()->getFormattedText( mIncidence )); + mRecur = false; + mAlarm = false; + mReply = false; + mInfo = false; +} + +void MonthViewItem::paint(QPainter *p) +{ +#if QT_VERSION >= 0x030000 + bool sel = isSelected(); +#else + bool sel = selected(); +#endif + + + if (KOPrefs::instance()->mMonthViewUsesCategoryColor) + { + p->setBackgroundColor( palette().color( QPalette::Normal, \ + sel ? QColorGroup::Highlight : QColorGroup::Background ) ); + p->eraseRect( 0, 0, listBox()->maxItemWidth(), height( listBox() ) ); + } + int x = 1; + int y = 3;//(height() - mRecurPixmap.height()) /2; + int size = PIXMAP_SIZE; + if ( QApplication::desktop()->width() < 300 ) + size = 3; + if ( KOPrefs::instance()->mMonthShowIcons ) { + if ( mInfo ) { + p->fillRect ( x, y,size,size, Qt::darkGreen ); + x += size + 1; + } + if ( mRecur ) { + p->fillRect ( x, y,size,size, Qt::blue ); + x += size + 1; + } + if ( mAlarm ) { + p->fillRect ( x, y,size,size, Qt::red ); + x += size + 1; + } + if ( mReply ) { + p->fillRect ( x, y,size,size, Qt::yellow ); + x += size + 1; + } + } + QFontMetrics fm = p->fontMetrics(); + int yPos; + int pmheight = size; + if( pmheight < fm.height() ) + yPos = fm.ascent() + fm.leading()/2; + else + yPos = pmheight/2 - fm.height()/2 + fm.ascent(); + p->setPen( palette().color( QPalette::Normal, sel ? \ + QColorGroup::HighlightedText : QColorGroup::Foreground ) ); + p->drawText( x, yPos, text() ); + if ( mIncidence->cancelled() ) { + int wid = fm.width( text() ); + p->drawLine( x, yPos- fm.height()/2+2,x+wid, yPos- fm.height()/2 +2); + } + +} + +int MonthViewItem::height(const QListBox *lb) const +{ + return lb->fontMetrics().lineSpacing()+1; +} + +int MonthViewItem::width(const QListBox *lb) const +{ + int size = PIXMAP_SIZE; + if ( QApplication::desktop()->width() < 300 ) + size = 3; + int x = 1; + if ( mInfo ) { + x += size + 1; + } + if( mRecur ) { + x += size+1; + } + if( mAlarm ) { + x += size+1; + } + if( mReply ) { + x += size+1; + } + + return( x + lb->fontMetrics().width( text() ) + 1 ); +} + + +MonthViewCell::MonthViewCell( KOMonthView *parent) + : QWidget( parent ), + mMonthView( parent ) +{ + + QVBoxLayout *topLayout = new QVBoxLayout( this ); + + // mLabel = new QLabel( this );QPushButton + mLabel = new QPushButton( this ); + //mLabel->setFrameStyle( QFrame::Panel | QFrame::Plain ); + //mLabel->setLineWidth( 1 ); + //mLabel->setAlignment( AlignCenter ); + mLabel->setFlat( true ); + mItemList = new KNoScrollListBox( this ); + mItemList->setMinimumSize( 10, 10 ); + mItemList->setFrameStyle( QFrame::Panel | QFrame::Plain ); + mItemList->setLineWidth( 1 ); + topLayout->addWidget( mItemList ); + mLabel->raise(); + // QColor( 0,0,255 ) QColor( 160,1600,255 ) + mStandardPalette = palette(); + mStandardPalette.setColor(QColorGroup::Base, mStandardPalette.color( QPalette::Normal, QColorGroup::Background ) ); + + enableScrollBars( false ); + updateConfig(); + connect( mLabel, SIGNAL( clicked( )), + SLOT( newEvent() )); + connect( mItemList, SIGNAL( doubleClicked( QListBoxItem *) ), + SLOT( defaultAction( QListBoxItem * ) ) ); + connect( mItemList, SIGNAL( rightButtonPressed( QListBoxItem *, + const QPoint &) ), + SLOT( contextMenu( QListBoxItem * ) ) ); + connect( mItemList, SIGNAL( highlighted( QListBoxItem *) ), + SLOT( selection( QListBoxItem * ) ) ); + connect( mItemList, SIGNAL( clicked( QListBoxItem * ) ), + SLOT( cellClicked( QListBoxItem * ) ) ); + connect( mItemList, SIGNAL( clicked( QListBoxItem * ) ), + SLOT( selection( QListBoxItem * ) ) ); +} + +void MonthViewCell::setDate( const QDate &date ) +{ +// kdDebug() << "MonthViewCell::setDate(): " << date.toString() << endl; + + mDate = date; + + QString text; + bool smallDisplay = QApplication::desktop()->width() < 320 && KOPrefs::instance()->mMonthViewSatSunTog; + if ( KOGlobals::self()->calendarSystem()->day( date ) == 1 || (date.dayOfWeek() == 7 && !smallDisplay ) || KOPrefs::instance()->mMonthShowShort) { + text = KOGlobals::self()->calendarSystem()->monthName( date, true ) + " "; + mLabel->resize( mLabelBigSize ); + text += QString::number( KOGlobals::self()->calendarSystem()->day(mDate) ); + } else { + mLabel->resize( mLabelSize ); + text += QString::number( KOGlobals::self()->calendarSystem()->day(mDate) ); + } + mLabel->setText( text ); + + //resizeEvent( 0 ); +} + +QDate MonthViewCell::date() const +{ + return mDate; +} + +void MonthViewCell::setPrimary( bool primary ) +{ + mPrimary = primary; + //setMyPalette(); +} +void MonthViewCell::setMyPalette() +{ + + if ( mHoliday) { + setPalette( mHolidayPalette ); + } else { + if ( mPrimary ) { + setPalette( mPrimaryPalette ); + } else { + setPalette( mNonPrimaryPalette ); + } + } + QPalette pal = palette(); + + mLabel->setPalette( QPalette ( pal.color( QPalette::Normal,QColorGroup::Base),pal.color(QPalette::Normal,QColorGroup::Base ) )); +} +QPalette MonthViewCell::getPalette () +{ + if ( !KOPrefs::instance()->mMonthViewUsesDayColors ) + return mStandardPalette; + if ( mHoliday) { + return mHolidayPalette ; + } else { + if ( mPrimary ) { + return mPrimaryPalette ; + } + } + return mNonPrimaryPalette; +} +bool MonthViewCell::isPrimary() const +{ + return mPrimary; +} + +void MonthViewCell::setHoliday( bool holiday ) +{ + mHoliday = holiday; + //setMyPalette(); +} + +void MonthViewCell::setHoliday( const QString &holiday ) +{ + mHolidayString = holiday; + + if ( !holiday.isEmpty() ) { + setHoliday( true ); + } +} +void MonthViewCell::keyPressEvent ( QKeyEvent * e ) +{ + + e->ignore(); + +} +void MonthViewCell::updateCell() +{ + + setPrimary( mDate.month()%2 ); + setHoliday( KOGlobals::self()->calendarSystem()->dayOfWeek(mDate) == KOGlobals::self()->calendarSystem()->weekDayOfPray() ); + if ( mDate == QDate::currentDate() ) { + mItemList->setLineWidth( 3 ); + } else { + mItemList->setLineWidth( 1 ); + } + mItemList->clear(); + //qApp->processEvents(); + if ( !mHolidayString.isEmpty() ) { + MonthViewItem *item = new MonthViewItem( 0, mDate, mHolidayString ); + item->setPalette( mHolidayPalette ); + mItemList->insertItem( item ); + } + //mLabel->setMaximumWidth( width() - mItemList->lineWidth()*2); + QPtrList<Event> events = mMonthView->calendar()->events( mDate, true ); + Event *event; + for( event = events.first(); event; event = events.next() ) { + if ( event->categories().contains("Holiday") || + event->categories().contains(i18n("Holiday"))) { + setHoliday( true ); + if ( mDate.dayOfWeek() == 7 ) + mItemList->setLineWidth( 3 ); + } + QString text; + if (event->isMultiDay()) { + QString prefix = "<->"; + if ( event->doesRecur() ) { + if ( event->recursOn( mDate) ) + prefix ="->" ; + else { + int days = event->dtStart().date().daysTo ( event->dtEnd().date() ); + if ( event->recursOn( mDate.addDays( -days)) ) + prefix ="<-" ; + } + + } else { + if (mDate == event->dtStart().date()) { + prefix ="->" ; + } else if (mDate == event->dtEnd().date()) { + prefix ="<-" ; + } + } + text = prefix + event->summary(); + } else { + if (event->doesFloat()) + text = event->summary(); + else { + text = KGlobal::locale()->formatTime(event->dtStart().time()); + text += " " + event->summary(); + } + } + + MonthViewItem *item = new MonthViewItem( event, mDate, text ); + QPalette pal; + if (KOPrefs::instance()->mMonthViewUsesCategoryColor) { + QStringList categories = event->categories(); + QString cat = categories.first(); + if ( KOPrefs::instance()->mMonthViewUsesForegroundColor ) { + pal = getPalette(); + if (cat.isEmpty()) { + pal.setColor(QColorGroup::Foreground,KOPrefs::instance()->mEventColor); + } else { + pal.setColor(QColorGroup::Foreground, *(KOPrefs::instance()->categoryColor(cat))); + } + + } else { + if (cat.isEmpty()) { + pal = QPalette(KOPrefs::instance()->mEventColor, KOPrefs::instance()->mEventColor); + } else { + pal = QPalette(*(KOPrefs::instance()->categoryColor(cat)), *(KOPrefs::instance()->categoryColor(cat))); + } + } + + } else { + pal = mStandardPalette ; + } + item->setPalette( pal ); + item->setRecur( event->recurrence()->doesRecur() ); + item->setAlarm( event->isAlarmEnabled() ); + item->setMoreInfo( event->description().length() > 0 ); + Attendee *me = event->attendeeByMails(KOPrefs::instance()->mAdditionalMails, + KOPrefs::instance()->email()); + if ( me != 0 ) { + if ( me->status() == Attendee::NeedsAction && me->RSVP()) + item->setReply(true); + else + item->setReply(false); + } else + item->setReply(false); + bool insert = true; + if ( !(event->doesRecur() == Recurrence::rNone) ) { + if ( !KOPrefs::instance()->mMonthDailyRecur && event->doesRecur() == Recurrence::rDaily ) + insert = false; + else + if ( !KOPrefs::instance()->mMonthWeeklyRecur && event->doesRecur() == Recurrence::rWeekly ) + insert = false; + + } + if ( insert ) + mItemList->insertItem( item ); + } + + // insert due todos + QPtrList<Todo> todos = mMonthView->calendar()->todos( mDate ); + Todo *todo; + for(todo = todos.first(); todo; todo = todos.next()) { + QString text; + if (todo->hasDueDate()) { + if (!todo->doesFloat()) { + text += KGlobal::locale()->formatTime(todo->dtDue().time()); + text += " "; + } + } + text += i18n("To-Do: %1").arg(todo->summary()); + + MonthViewItem *item = new MonthViewItem( todo, mDate, text ); + //item->setPalette( mStandardPalette ); + QPalette pal; + if (KOPrefs::instance()->mMonthViewUsesCategoryColor) { + QStringList categories = todo->categories(); + QString cat = categories.first(); + if ( KOPrefs::instance()->mMonthViewUsesForegroundColor ) { + pal = getPalette(); + if (cat.isEmpty()) { + pal.setColor(QColorGroup::Foreground,KOPrefs::instance()->mEventColor); + } else { + pal.setColor(QColorGroup::Foreground, *(KOPrefs::instance()->categoryColor(cat))); + } + + } else { + if (cat.isEmpty()) { + pal = QPalette(KOPrefs::instance()->mEventColor, KOPrefs::instance()->mEventColor); + } else { + pal = QPalette(*(KOPrefs::instance()->categoryColor(cat)), *(KOPrefs::instance()->categoryColor(cat))); + } + } + + } else { + pal = mStandardPalette ; + } + item->setPalette( pal ); + mItemList->insertItem( item ); + } + //setMyPalette(); + setMyPalette(); + resizeEvent( 0 ); + // if ( isVisible()) + // qApp->processEvents(); +} + +void MonthViewCell::updateConfig() +{ + + setFont( KOPrefs::instance()->mMonthViewFont ); + + QFontMetrics fm( font() ); + mLabelSize = fm.size( 0, "30" ) + QSize( 4, 2 ); + mLabelBigSize = fm.size( 0, "Mag 30" ) + QSize( 2, 2 ); + mHolidayPalette = mStandardPalette; + mPrimaryPalette = mStandardPalette; + mNonPrimaryPalette = mStandardPalette; + if ( KOPrefs::instance()->mMonthViewUsesDayColors ) { + mHolidayPalette.setColor(QColorGroup::Base, KOPrefs::instance()->mMonthViewHolidayColor ); + mHolidayPalette.setColor(QColorGroup::Background, KOPrefs::instance()->mMonthViewHolidayColor ); + mHolidayPalette.setColor(QColorGroup::Foreground, KOPrefs::instance()->mMonthViewHolidayColor.dark()); + mPrimaryPalette.setColor(QColorGroup::Foreground,KOPrefs::instance()->mMonthViewOddColor.dark()); + mPrimaryPalette.setColor(QColorGroup::Base,KOPrefs::instance()->mMonthViewOddColor); + mPrimaryPalette.setColor(QColorGroup::Background,KOPrefs::instance()->mMonthViewOddColor); + mNonPrimaryPalette.setColor(QColorGroup::Foreground,KOPrefs::instance()->mMonthViewEvenColor.dark()); + mNonPrimaryPalette.setColor(QColorGroup::Base,KOPrefs::instance()->mMonthViewEvenColor); + mNonPrimaryPalette.setColor(QColorGroup::Background,KOPrefs::instance()->mMonthViewEvenColor); + } + updateCell(); +} + +void MonthViewCell::enableScrollBars( bool enabled ) +{ + if ( enabled ) { + mItemList->setVScrollBarMode(QScrollView::Auto); + mItemList->setHScrollBarMode(QScrollView::Auto); + } else { + mItemList->setVScrollBarMode(QScrollView::AlwaysOff); + mItemList->setHScrollBarMode(QScrollView::AlwaysOff); + } +} + +Incidence *MonthViewCell::selectedIncidence() +{ + int index = mItemList->currentItem(); + if ( index < 0 ) return 0; + + MonthViewItem *item = + static_cast<MonthViewItem *>( mItemList->item( index ) ); + + if ( !item ) return 0; + + return item->incidence(); +} + +QDate MonthViewCell::selectedIncidenceDate() +{ + QDate qd; + int index = mItemList->currentItem(); + if ( index < 0 ) return qd; + + MonthViewItem *item = + static_cast<MonthViewItem *>( mItemList->item( index ) ); + + if ( !item ) return qd; + + return item->incidenceDate(); +} + +void MonthViewCell::deselect() +{ + mItemList->clearSelection(); + enableScrollBars( false ); + // updateCell(); +} +void MonthViewCell::select() +{ + ;// updateCell(); +} + +void MonthViewCell::resizeEvent ( QResizeEvent * ) +{ + int size = height() - mLabel->height(); + if ( size > 0 ) + mItemList->verticalScrollBar()->setMaximumHeight( size ); + size = width() - mLabel->width(); + if ( size > 0 ) + mItemList->horizontalScrollBar()->setMaximumWidth( size ); + mLabel->move( width()-mItemList->lineWidth() - mLabel->width(), height()-mItemList->lineWidth() - mLabel->height() ); + //mLabel->setMaximumWidth( width() - mItemList->lineWidth()*2); +} + +void MonthViewCell::defaultAction( QListBoxItem *item ) +{ + if ( !item ) return; + + MonthViewItem *eventItem = static_cast<MonthViewItem *>( item ); + Incidence *incidence = eventItem->incidence(); + if ( incidence ) mMonthView->defaultAction( incidence ); +} +void MonthViewCell::newEvent() +{ + QDateTime dt( date(), QTime( KOPrefs::instance()->mStartTime, 0 ) ); + emit newEventSignal( dt ); +} +void MonthViewCell::cellClicked( QListBoxItem *item ) +{ + static QListBoxItem * lastClicked = 0; + if ( item == 0 ) { + QDateTime dt( date(), QTime( KOPrefs::instance()->mStartTime, 0 ) ); + emit newEventSignal( dt ); + return; + } + /* + if ( lastClicked ) + if ( ! item ) { + if ( lastClicked->listBox() != item->listBox() ) + lastClicked->listBox()->clearSelection(); + } + */ + + mMonthView->setSelectedCell( this ); + if( KOPrefs::instance()->mEnableMonthScroll ) enableScrollBars( true ); + select(); +} + +void MonthViewCell::contextMenu( QListBoxItem *item ) +{ + if ( !item ) return; + + MonthViewItem *eventItem = static_cast<MonthViewItem *>( item ); + Incidence *incidence = eventItem->incidence(); + if ( incidence ) mMonthView->showContextMenu( incidence ); +} + +void MonthViewCell::selection( QListBoxItem *item ) +{ + if ( !item ) return; + + mMonthView->setSelectedCell( this ); +} + + +// ******************************************************************************* +// ******************************************************************************* +// ******************************************************************************* + + +KOMonthView::KOMonthView(Calendar *calendar, QWidget *parent, const char *name) + : KOEventView( calendar, parent, name ), + mDaysPerWeek( 7 ), mNumWeeks( 6 ), mNumCells( mDaysPerWeek * mNumWeeks ), + mShortDayLabels( false ), mWidthLongDayLabel( 0 ), mSelectedCell( 0 ) +{ + mCells.setAutoDelete( true ); + mShowSatSunComp = KOPrefs::instance()->mMonthViewSatSunTog ; + // mDayLayout = new QGridLayout( this ); + // create the day of the week labels (Sun, Mon, etc) and add them to + // the layout. + mDayLabels.resize( mDaysPerWeek ); + QFont bfont = font(); + if ( QApplication::desktop()->width() < 650 ) { + bfont.setPointSize( bfont.pointSize() - 2 ); + } + bfont.setBold( true ); + int i; + + for( i = 0; i < mDaysPerWeek; i++ ) { + QLabel *label = new QLabel( this ); + label->setFont(bfont); + label->setFrameStyle(QFrame::Panel|QFrame::Raised); + label->setLineWidth(1); + label->setAlignment(AlignCenter); + mDayLabels.insert( i, label ); + } + + bfont.setBold( false ); + mWeekLabels.resize( mNumWeeks+1 ); + for( i = 0; i < mNumWeeks+1; i++ ) { + KOWeekButton *label = new KOWeekButton( this ); + label->setFont(bfont); + connect( label, SIGNAL( selectWeekNum ( int )),this, SIGNAL( selectWeekNum ( int )) ); + label->setFlat(true); + QWhatsThis::add(label,i18n("Click on the week number to\nshow week in agenda view")); + //label->setFrameStyle(QFrame::Panel|QFrame::Raised); + //label->setLineWidth(1); + //label->setAlignment(AlignCenter); + mWeekLabels.insert( i, label ); + } + mWeekLabels[mNumWeeks]->setText( i18n("W")); + int row, col; + mCells.resize( mNumCells ); + for( row = 0; row < mNumWeeks; ++row ) { + for( col = 0; col < mDaysPerWeek; ++col ) { + MonthViewCell *cell = new MonthViewCell( this ); + mCells.insert( row * mDaysPerWeek + col, cell ); + + connect( cell, SIGNAL( defaultAction( Incidence * ) ), + SLOT( defaultAction( Incidence * ) ) ); + connect( cell, SIGNAL( newEventSignal( QDateTime ) ), + SIGNAL( newEventSignal( QDateTime ) ) ); + } + } + + mContextMenu = eventPopup(); + // updateConfig(); //useless here + + emit incidenceSelected( 0 ); +} + +KOMonthView::~KOMonthView() +{ + delete mContextMenu; +} + +int KOMonthView::maxDatesHint() +{ + return mNumCells; +} + +int KOMonthView::currentDateCount() +{ + return mNumCells; +} + +QPtrList<Incidence> KOMonthView::selectedIncidences() +{ + QPtrList<Incidence> selected; + + if ( mSelectedCell ) { + Incidence *incidence = mSelectedCell->selectedIncidence(); + if ( incidence ) selected.append( incidence ); + } + + return selected; +} + +DateList KOMonthView::selectedDates() +{ + DateList selected; + + if ( mSelectedCell ) { + QDate qd = mSelectedCell->selectedIncidenceDate(); + if ( qd.isValid() ) selected.append( qd ); + } + + return selected; +} + +void KOMonthView::printPreview(CalPrinter *calPrinter, const QDate &fd, + const QDate &td) +{ +#ifndef KORG_NOPRINTER + calPrinter->preview(CalPrinter::Month, fd, td); +#endif +} + +void KOMonthView::updateConfig() +{ + + mWeekStartsMonday = KGlobal::locale()->weekStartsMonday(); + + QFontMetrics fontmetric(mDayLabels[0]->font()); + mWidthLongDayLabel = 0; + + for (int i = 0; i < 7; i++) { + int width = fontmetric.width(KOGlobals::self()->calendarSystem()->weekDayName(i+1)); + if ( width > mWidthLongDayLabel ) mWidthLongDayLabel = width; + } + bool temp = mShowSatSunComp ; + mShowSatSunComp = KOPrefs::instance()->mMonthViewSatSunTog ; + if ( temp != KOPrefs::instance()->mMonthViewSatSunTog ) + computeLayout(); + updateDayLabels(); + //qDebug("KOMonthView::updateConfig() %d %d %d ",height(), mDayLabels[0]->sizeHint().height() ,mNumWeeks); + int cellHeight = (height() - mDayLabels[0]->sizeHint().height()) /mNumWeeks; + //resizeEvent( 0 ); + for (uint i = 0; i < mCells.count(); ++i) { + mCells[i]->updateConfig(); + } +} + +void KOMonthView::updateDayLabels() +{ + + for (int i = 0; i < 7; i++) { + if (mWeekStartsMonday) { + bool show = mShortDayLabels; + if ( i > 4 && mShowSatSunComp && mWidthLongDayLabel > mDayLabels[i]->width() ) + show = true; + mDayLabels[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i+1,show)); + } else { + if (i==0) mDayLabels[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(7,mShortDayLabels)); + else mDayLabels[i]->setText(KOGlobals::self()->calendarSystem()->weekDayName(i,mShortDayLabels)); + + } + } +} + +void KOMonthView::showDates(const QDate &start, const QDate &) +{ +// kdDebug() << "KOMonthView::showDates(): " << start.toString() << endl; + + + mStartDate = start; + + int startWeekDay = mWeekStartsMonday ? 1 : 7; + + while( KOGlobals::self()->calendarSystem()->dayOfWeek(mStartDate) != startWeekDay ) { + mStartDate = mStartDate.addDays( -1 ); + } + + bool primary = false; + uint i; + for( i = 0; i < mCells.size(); ++i ) { + QDate date = mStartDate.addDays( i ); + mCells[i]->setDate( date ); + +#ifndef KORG_NOPLUGINS + // add holiday, if present + QString hstring(KOCore::self()->holiday(date)); + mCells[i]->setHoliday( hstring ); +#endif + + } + QDate date = mStartDate.addDays( mWeekStartsMonday ? 3 : 4 ); + for( i = 0; i < 6; ++i ) { + int wno; + // remember, according to ISO 8601, the first week of the year is the + // first week that contains a thursday. Thus we must subtract off 4, + // not just 1. + int dayOfYear = date.dayOfYear(); + if (dayOfYear % 7 != 0) + wno = dayOfYear / 7 + 1; + else + wno =dayOfYear / 7; + mWeekLabels[i]->setWeekNum( wno ); + date = date.addDays( 7 ); + } + updateView(); +} + +void KOMonthView::showEvents(QPtrList<Event>) +{ + qDebug("KOMonthView::selectEvents is not implemented yet. "); +} + +void KOMonthView::changeEventDisplay(Event *, int) +{ + // this should be re-written to be much more efficient, but this + // quick-and-dirty-hack gets the job done for right now. + updateView(); +} + +void KOMonthView::updateView() +{ + + uint i; + for( i = 0; i < mCells.count(); ++i ) { + mCells[i]->updateCell(); + } + //qDebug("KOMonthView::updateView() "); + processSelectionChange(); +} + +void KOMonthView::resizeEvent(QResizeEvent * e) +{ + computeLayout(); +} +void KOMonthView::computeLayout() +{ + // select the appropriate heading string size. E.g. "Wednesday" or "Wed". + // note this only changes the text if the requested size crosses the + // threshold between big enough to support the full name and not big + // enough. + + int daysToShow = 7; + bool combinedSatSun = false; + if (mShowSatSunComp = KOPrefs::instance()->mMonthViewSatSunTog ) { + daysToShow = 6; + combinedSatSun = true; + } + int tWid = topLevelWidget()->size().width(); + int tHei = topLevelWidget()->size().height(); + + int wid = size().width();//e + int hei = size().height()-1; + + if ( ((wid *3)/2) < tWid && (( hei *3) /2) < tHei ) + return; + + QFontMetrics fm ( mWeekLabels[0]->font() ); + int weeklabelwid = fm.width( "888" ); + wid -= weeklabelwid; + + int colWid = wid / daysToShow; + int lastCol = wid - ( colWid*6 ); + int dayLabelHei = mDayLabels[0]->sizeHint().height(); + int cellHei = (hei - dayLabelHei) /6; + int colModulo = wid % daysToShow; + int rowModulo = (hei- dayLabelHei) % 6; + //qDebug("rowmod %d ", rowModulo); + int i; + int x,y,w,h; + x= 0; + y= 0; + w = colWid; + h = dayLabelHei ; + for ( i = 0; i < 7; i++) { + if ( i == daysToShow-colModulo ) + ++w; + if ( combinedSatSun ) { + if ( i >= daysToShow-1 ) { + mDayLabels[i]->setGeometry( x+weeklabelwid,y,w/2,h); + x -= w/2 ; + } + else + mDayLabels[i]->setGeometry( x+weeklabelwid,y,w,h); + } else + mDayLabels[i]->setGeometry( x+weeklabelwid,y,w,h); + x += w; + } + x= 0; + y= dayLabelHei; + w = colWid; + h = cellHei ; + for ( i = 0; i < mCells.count(); ++i) { + + w = colWid; + if ( ((i) % 7) >= 7-colModulo ) { + ++w; + } + if ( i == (6-rowModulo)*7) + ++h; + if ( combinedSatSun ) { + if ( (i)%7 >= daysToShow-1 ) { + if ( (i)%7 == daysToShow-1 ) { + mCells[i]->setGeometry ( x+weeklabelwid,y,w,h/2 ); + x -= w ;y += h/2; + } else { + mCells[i]->setGeometry ( x+weeklabelwid,y,w,h-h/2 ); + y -= h/2; + } + } else + mCells[i]->setGeometry ( x+weeklabelwid,y,w,h ); + + } + else + mCells[i]->setGeometry ( x+weeklabelwid,y,w,h ); + x += w; + if ( x + w/2 > wid ) { + x = 0; + y += h; + } + } + y= dayLabelHei; + h = cellHei ; + for ( i = 0; i < 6; i++) { + if ( i == (6-rowModulo)) + ++h; + mWeekLabels[i]->setGeometry( 0,y,weeklabelwid,h); + y += h; + } + mWeekLabels[6]->setGeometry( 0,0,weeklabelwid,dayLabelHei); + // qDebug("RRRRRRRRRRRRR %d %d old %d %d", e->size().width(),e->size().height() , e->oldSize().width(),e->oldSize().height()); + //qDebug("parent %d %d ", topLevelWidget()->size().width(), topLevelWidget()->size().height()); + mShortDayLabels = mDayLabels[0]->width() < mWidthLongDayLabel ; + updateDayLabels(); +} + +void KOMonthView::showContextMenu( Incidence *incidence ) +{ + mContextMenu->showIncidencePopup(incidence); + /* + if( incidence && incidence->type() == "Event" ) { + Event *event = static_cast<Event *>(incidence); + mContextMenu->showEventPopup(event); + } else { + kdDebug() << "MonthView::showContextMenu(): cast failed." << endl; + } + */ +} +MonthViewCell * KOMonthView::selectedCell( ) +{ + return mSelectedCell; +} +void KOMonthView::setSelectedCell( MonthViewCell *cell ) +{ + // qDebug("KOMonthView::setSelectedCell "); + if ( mSelectedCell && mSelectedCell != cell ) { + MonthViewCell * mvc = mSelectedCell; + mSelectedCell = cell; + mvc->deselect(); + } else + mSelectedCell = cell; + // if ( mSelectedCell ) +// mSelectedCell->select(); + if ( !mSelectedCell ) + emit incidenceSelected( 0 ); + else + emit incidenceSelected( mSelectedCell->selectedIncidence() ); +} + +void KOMonthView::processSelectionChange() +{ + QPtrList<Incidence> incidences = selectedIncidences(); + if (incidences.count() > 0) { + emit incidenceSelected( incidences.first() ); + } else { + emit incidenceSelected( 0 ); + } +} + +void KOMonthView::clearSelection() +{ + if ( mSelectedCell ) { + mSelectedCell->deselect(); + mSelectedCell = 0; + } +} +void KOMonthView::keyPressEvent ( QKeyEvent * e ) +{ + + e->ignore(); + +} |