--- /usr/tmp/korganizer/koagenda.cpp	Sun Sep  9 14:50:35 2001
+++ korganizer/koagenda.cpp	Sun Sep  9 14:12:15 2001
@@ -17,6 +17,74 @@
 #include <qpopupmenu.h>
 #include <qcursor.h>
 
+
+////////////////////////////////////////////////////////////////////////////
+MarcusBains::MarcusBains(KOAgenda *_agenda,const char *name)
+    : QFrame(_agenda->viewport(),name), agenda(_agenda)
+{
+    setLineWidth(0);
+    setMargin(0);
+    setBackgroundColor(Qt::red);
+    minutes = new QTimer(this);
+    connect(minutes, SIGNAL(timeout()), this, SLOT(updateLocation()));
+    minutes->start(0, true);
+
+    mTimeBox = new QLabel(this);
+    mTimeBox->setAlignment(Qt::AlignRight | Qt::AlignBottom);
+    mTimeBox->setAutoMask(true);
+    QPalette pal = mTimeBox->palette();
+    pal.setColor(QColorGroup::Foreground, Qt::red);
+    mTimeBox->setPalette(pal);
+
+    agenda->addChild(mTimeBox);
+}
+
+MarcusBains::~MarcusBains()
+{
+    delete minutes;
+}
+
+#include <iostream>
+void MarcusBains::updateLocation()
+{
+    QTime tim = QTime::currentTime();
+    int mins = tim.hour()*60 + tim.minute();
+    int minutesPerCell = 24 * 60 / agenda->rows();
+    int y = mins*agenda->gridSpacingY()/minutesPerCell;
+    int x = agenda->gridSpacingX()*agenda->todayColumn();
+    bool disabled = !(KOPrefs::instance()->mMarcusBainsEnabled);
+
+    if(disabled || (agenda->todayColumn()<0)) {
+	hide(); mTimeBox->hide();
+	return;
+    } else {
+	show(); mTimeBox->show();
+    }
+
+
+    setFixedSize(agenda->gridSpacingX(),1);
+    agenda->moveChild(this, x, y);
+    raise();
+
+    mTimeBox->setFont(KOPrefs::instance()->mMarcusBainsFont);
+    mTimeBox->setText(KGlobal::locale()->formatTime(tim, KOPrefs::instance()->mMarcusBainsShowSeconds));
+    mTimeBox->adjustSize();
+    // the -2 below is there because there is a bug in this program
+    // somewhere, where the last column of this widget is a few pixels
+    // narrower than the other columns.
+    int offs = (agenda->todayColumn() == agenda->columns()-1) ? -4 : 0;
+    agenda->moveChild(mTimeBox,
+		      x+agenda->gridSpacingX()-mTimeBox->width()+offs,
+		      y-mTimeBox->height());
+    mTimeBox->raise();
+
+    minutes->start(1000,true);
+}
+
+
+////////////////////////////////////////////////////////////////////////////
+
+
 /*
   Create an agenda widget with rows rows and columns columns.
 */
@@ -50,6 +118,7 @@
 
 KOAgenda::~KOAgenda()
 {
+    if(mMarcusBains) delete mMarcusBains;
 }
 
 
@@ -87,6 +156,8 @@
 
   mSelectedItem = 0;
 
+  mTodayColumn = -1;
+
   mItems.setAutoDelete(true);
   
   resizeContents( mGridSpacingX * mColumns + 1 , mGridSpacingY * mRows + 1 );
@@ -107,6 +178,14 @@
 
   connect(verticalScrollBar(),SIGNAL(valueChanged(int)),
           SLOT(checkScrollBoundaries(int)));
+
+  // Create the Marcus Bains line.
+  if(mAllDayMode)
+      mMarcusBains = 0;
+  else {
+      mMarcusBains = new MarcusBains(this);
+      addChild(mMarcusBains);
+  }
 }
 
 
@@ -124,6 +203,12 @@
 }
 
 
+void KOAgenda::marcus_bains()
+{
+    if(mMarcusBains) mMarcusBains->updateLocation();
+}
+
+
 void KOAgenda::changeColumns(int columns)
 {
   if (columns == 0) {
@@ -705,6 +790,8 @@
 
   agendaItem->show();
   
+  marcus_bains();
+
   return agendaItem;
 }
 
@@ -780,6 +867,8 @@
     current->setMultiItem(setFirst,next,setLast);
     current = next;
   }
+
+  marcus_bains();
 }
 
 
@@ -836,6 +925,8 @@
 
   checkScrollBoundaries();
   
+  marcus_bains();
+
   viewport()->update();
   QScrollView::resizeEvent(ev);
 }
@@ -879,6 +970,8 @@
   viewport()->setBackgroundColor(KOPrefs::instance()->mAgendaBgColor);
 
   calculateWorkingHours();
+
+  marcus_bains();
 }
 
 void KOAgenda::checkScrollBoundaries()
@@ -959,6 +1052,21 @@
                          KOPrefs::instance()->mWorkingHoursEnd * 2 - 1;
 }
 
+
+
+int KOAgenda::todayColumn() const
+{
+    return mTodayColumn;
+}
+void KOAgenda::setTodayColumn(int col)
+{
+    if((col>=0) && (col<columns()))
+	mTodayColumn = col;
+    else
+	mTodayColumn = -1;
+    marcus_bains();
+}
+
 void KOAgenda::setHolidayMask(QArray<bool> *mask)
 {
   mHolidayMask = mask;
--- /usr/tmp/korganizer/koagenda.h	Sun Sep  9 14:50:35 2001
+++ korganizer/koagenda.h	Sun Sep  9 12:11:12 2001
@@ -13,9 +13,27 @@
 class QPopupMenu;
 class QTime;
 class KConfig;
+class QFrame;
+class KOAgenda;
 
 using namespace KCal;
 
+class MarcusBains : public QFrame {
+    Q_OBJECT
+  public:
+    MarcusBains(KOAgenda *agenda=0,const char *name=0);
+    virtual ~MarcusBains();
+
+  public slots:
+    void updateLocation();
+
+  private:
+    QTimer *minutes;
+    QLabel *mTimeBox;
+    KOAgenda *agenda;
+};
+
+
 class KOAgenda : public QScrollView
 {
     Q_OBJECT
@@ -64,6 +82,9 @@
 
     void setHolidayMask(QArray<bool> *);
 
+    void setTodayColumn(int col);
+    int todayColumn() const;
+
   public slots:
     void scrollUp();
     void scrollDown();
@@ -124,6 +145,7 @@
     
   private:
     void init();
+    void marcus_bains();
     bool mAllDayMode;
   
     // Width and height of agenda cells
@@ -156,6 +178,9 @@
     int mWorkingHoursYTop;
     int mWorkingHoursYBottom;
     
+    // The column representing today.
+    int mTodayColumn;
+
     // The KOAgendaItem, which has been right-clicked last
     KOAgendaItem *mClickedItem;
 
@@ -165,6 +190,9 @@
     // Currently selected item
     KOAgendaItem *mSelectedItem;
 
+    // The Marcus Bains Line widget.
+    MarcusBains *mMarcusBains;
+
     enum MouseActionType {NOP,MOVE,RESIZETOP,RESIZEBOTTOM,RESIZELEFT,
                           RESIZERIGHT};
 
--- /usr/tmp/korganizer/koagendaview.cpp	Sun Sep  9 14:50:35 2001
+++ korganizer/koagendaview.cpp	Sun Sep  9 12:11:26 2001
@@ -715,10 +715,17 @@
   QList<Event> dayEvents;
   int curCol;  // current column of agenda, i.e. the X coordinate
   QDate currentDate = mStartDate;
+
+
+  mAgenda->setTodayColumn(-1);
   for(curCol=0;curCol<int(mSelectedDates.count());++curCol) {
 //    kdDebug() << "KOAgendaView::fillAgenda(): " << currentDate.toString()
 //              << endl;
 
+    if(currentDate == QDate::currentDate())
+	mAgenda->setTodayColumn(curCol);
+
+
     dayEvents = mCalendar->getEventsForDate(currentDate,false);
 
     // Default values, which can never be reached
--- /usr/tmp/korganizer/koprefs.cpp	Sun Sep  9 14:50:35 2001
+++ korganizer/koprefs.cpp	Sun Sep  9 14:09:35 2001
@@ -82,9 +82,11 @@
   addPrefsItem(new KPrefsItemInt("Working Hours End",&mWorkingHoursEnd,17));
   addPrefsItem(new KPrefsItemBool("Exclude Holidays",&mExcludeHolidays,true));
   addPrefsItem(new KPrefsItemBool("Exclude Saturdays",&mExcludeSaturdays,true));
+  addPrefsItem(new KPrefsItemBool("Marcus Bains shows seconds",&mMarcusBainsShowSeconds,true));
 
   addPrefsItem(new KPrefsItemBool("Full View Month",&mFullViewMonth,false));
   addPrefsItem(new KPrefsItemBool("Full View Todo",&mFullViewTodo,true));
+  addPrefsItem(new KPrefsItemBool("Marcus Bains enabled",&mMarcusBainsEnabled,true));
 }
 
 
@@ -140,6 +142,7 @@
   mTimeBarFont = mDefaultTimeBarFont;
   mMonthViewFont = mDefaultViewFont;
   mAgendaViewFont = mDefaultViewFont;
+  mMarcusBainsFont = mDefaultViewFont;
 
 //  mHolidayColor = mDefaultHolidayColor;
 //  mHighlightColor = mDefaultHighlightColor;
@@ -220,6 +223,9 @@
                                           &mDefaultViewFont);
   mAgendaViewFont = mConfig->readFontEntry("AgendaView Font",
                                           &mDefaultViewFont);
+  mMarcusBainsFont = mConfig->readFontEntry("MarcusBains Font",
+                                          &mDefaultViewFont);
+
 
   mConfig->setGroup("Colors");
 //  mHolidayColor = mConfig->readColorEntry("Holiday Color",
@@ -285,6 +291,7 @@
   mConfig->writeEntry("TimeBar Font",mTimeBarFont);
   mConfig->writeEntry("MonthView Font",mMonthViewFont);
   mConfig->writeEntry("AgendaView Font",mAgendaViewFont);
+  mConfig->writeEntry("MarcusBains Font",mMarcusBainsFont);
 
   mConfig->setGroup("Colors");
 //  mConfig->writeEntry("Holiday Color",mHolidayColor);
--- /usr/tmp/korganizer/koprefs.h	Sun Sep  9 14:50:35 2001
+++ korganizer/koprefs.h	Sun Sep  9 14:09:35 2001
@@ -83,10 +83,12 @@
     int     mWorkingHoursEnd;
     bool    mExcludeHolidays;
     bool    mExcludeSaturdays;
+    bool    mMarcusBainsShowSeconds;;
 
     QFont   mTimeBarFont;
     QFont   mMonthViewFont;
     QFont   mAgendaViewFont;
+    QFont   mMarcusBainsFont;
 
     QColor  mHolidayColor;
     QColor  mHighlightColor;
@@ -102,6 +104,7 @@
     bool    mEnableMonthScroll;
     bool    mFullViewMonth;
     bool    mFullViewTodo;
+    bool    mMarcusBainsEnabled;
 
     QString mPrinter;
     int     mPaperSize;
--- /usr/tmp/korganizer/koprefsdialog.cpp	Sun Sep  9 14:50:35 2001
+++ korganizer/koprefsdialog.cpp	Sun Sep  9 14:08:24 2001
@@ -231,6 +231,7 @@
   mAlarmTimeCombo->insertStringList(alarmList);
   topLayout->addWidget(mAlarmTimeCombo,3,1);
 
+
   QGroupBox *workingHoursGroup = new QGroupBox(1,Horizontal,
                                                i18n("Working Hours"),
                                                topFrame);
@@ -264,7 +265,13 @@
                         workingHoursGroup);
 //  topLayout->addWidget(fullViewMonth->checkBox(),8,0);
 
-  topLayout->setRowStretch(5,1);
+  KPrefsWidBool *marcusBainsShowSeconds =
+      new KPrefsWidBool(i18n("Shows seconds on Marcus Bains Line"),
+			&(KOPrefs::instance()->mMarcusBainsShowSeconds),
+			this, topFrame);
+  topLayout->addWidget(marcusBainsShowSeconds->checkBox(),5,0);
+
+  topLayout->setRowStretch(6,1);
 }
 
 
@@ -325,7 +332,14 @@
                         topFrame);
   topLayout->addWidget(fullViewTodo->checkBox(),9,0);
 
-  topLayout->setRowStretch(10,1);
+  KPrefsWidBool *marcusBainsEnabled =
+      new KPrefsWidBool(i18n("Show Marcus Bains line."),
+                        &(KOPrefs::instance()->mMarcusBainsEnabled),this,
+                        topFrame);
+  topLayout->addWidget(marcusBainsEnabled->checkBox(),10,0);
+
+
+  topLayout->setRowStretch(11,1);
 }
 
 
@@ -364,7 +378,16 @@
   topLayout->addWidget(buttonAgendaView,2,1);
   connect(buttonAgendaView,SIGNAL(clicked()),SLOT(selectAgendaViewFont()));
 
-  topLayout->setRowStretch(3,1);
+
+  mMarcusBainsFont = new QLabel(KGlobal::locale()->formatTime(QTime(12,34,23)),topFrame);
+  mMarcusBainsFont->setFrameStyle(QFrame::Panel|QFrame::Sunken);
+  topLayout->addWidget(mMarcusBainsFont,3,0);
+
+  QPushButton *buttonMarcusBains = new QPushButton(i18n("Marcus Bains Line"),topFrame);
+  topLayout->addWidget(buttonMarcusBains,3,1);
+  connect(buttonMarcusBains,SIGNAL(clicked()),SLOT(selectMarcusBainsFont()));
+
+  topLayout->setRowStretch(4,1);
 }
 
 void KOPrefsDialog::selectTimeBarFont()
@@ -391,6 +414,14 @@
   mAgendaViewFont->setFont(theFont);
 }
 
+void KOPrefsDialog::selectMarcusBainsFont()
+{
+  QFont theFont(mMarcusBainsFont->font());
+  QString theText(mMarcusBainsFont->text());
+  KFontDialog::getFontAndText(theFont,theText);
+  mMarcusBainsFont->setFont(theFont);
+}
+
 
 void KOPrefsDialog::setupColorsTab()
 {
@@ -610,6 +641,7 @@
   mTimeBarFont->setFont(KOPrefs::instance()->mTimeBarFont);
   mMonthViewFont->setFont(KOPrefs::instance()->mMonthViewFont);
   mAgendaViewFont->setFont(KOPrefs::instance()->mAgendaViewFont);
+  mMarcusBainsFont->setFont(KOPrefs::instance()->mMarcusBainsFont);
 
 //  mHolidayColor->setBackgroundColor(KOPrefs::instance()->mHolidayColor);
 //  mHighlightColor->setBackgroundColor(KOPrefs::instance()->mHighlightColor);
@@ -658,6 +690,7 @@
   KOPrefs::instance()->mTimeBarFont = mTimeBarFont->font();
   KOPrefs::instance()->mMonthViewFont = mMonthViewFont->font();
   KOPrefs::instance()->mAgendaViewFont = mAgendaViewFont->font();
+  KOPrefs::instance()->mMarcusBainsFont = mMarcusBainsFont->font();
 
 //  KOPrefs::instance()->mHolidayColor = mHolidayColor->backgroundColor();
 //  KOPrefs::instance()->mHighlightColor = mHighlightColor->backgroundColor();
--- /usr/tmp/korganizer/koprefsdialog.h	Sun Sep  9 14:50:35 2001
+++ korganizer/koprefsdialog.h	Sun Sep  9 13:20:06 2001
@@ -38,6 +38,7 @@
     void selectTimeBarFont();
     void selectMonthViewFont();
     void selectAgendaViewFont();
+    void selectMarcusBainsFont();
 
     void selectCategoryColor();
     void updateCategoryColor();
@@ -106,6 +107,7 @@
     QLabel *mTimeBarFont;
     QLabel *mMonthViewFont;
     QLabel *mAgendaViewFont;
+    QLabel *mMarcusBainsFont;
 
     QFrame        *mCategoryColor;
     QComboBox     *mCategoryCombo;
