void TaskItemDelegate::paintTask(QPainter* painter, const QStyleOptionViewItem &option, const QModelIndex& index) const
{
  QRect rect = option.rect;
  QFontMetrics fm = QApplication::fontMetrics();
  
  // Painting Order:
  //    Background wash
  //    Mouseover highlight
  //    Priority Tab on left
  //    Bounding Box
  //    Task name
  //    If not small, other task information
  
  painter->save();
  if (smallTasks) { // Paint the background for a small task
    painter->save();
    painter->setOpacity(0.7);
    painter->setBrush(itemPriorityColor(index));
    painter->setPen(Qt::NoPen);
    painter->drawRect(rect.adjusted(leftMargin, MARGIN, -MARGIN, -MARGIN));
    painter->restore();
  }
  else { // Paint the background for a two row task
    painter->save();
    painter->setOpacity(0.7);
    painter->setBrush(Plasma::Theme::defaultTheme()->color(Plasma::Theme::BackgroundColor));
    painter->drawRect(option.rect.adjusted(leftMargin, MARGIN, -MARGIN, -MARGIN));
    
    painter->restore();
    painter->drawRect(QRectF(option.rect.topLeft()+QPointF(leftMargin, MARGIN), option.rect.bottomLeft()+QPointF(COLORTAB, -MARGIN))); 
  }
  
  if (option.state & QStyle::State_MouseOver) {
    painter->save();
    painter->setBrush(Plasma::Theme::defaultTheme()->color(Plasma::Theme::HighlightColor));
    painter->setPen(Qt::NoPen);
    if (smallTasks)
      painter->drawRect(rect.adjusted(leftMargin, MARGIN, -MARGIN, -MARGIN));
    else
      painter->drawRect(rect.adjusted(leftMargin, MARGIN, -MARGIN, -MARGIN));
    painter->restore();
  }
  
  // Draw Task information
  painter->setPen(Plasma::Theme::defaultTheme()->color(Plasma::Theme::TextColor));
  
  QString task = index.data(Qt::RTMNameRole).toString();
  QString due = index.data(Qt::RTMDueRole).toDate().toString("MMM d");
  QString tags = index.data(Qt::RTMTagsRole).toStringList().join(", ");
  if (!tags.isEmpty())
    tags.prepend(tagsPrefix);
  
  QFont font = painter->font();
  font.setPointSize(font.pointSize());
  QFontMetrics largerFM(font);
  
  QDate date = index.data(Qt::RTMDueRole).toDate();
  
  if (smallTasks && date.isValid() && date < QDate::currentDate()) {
    // Elide (text with dots like th...) if wider than view and draw
    font.setBold(true);
    QFontMetrics boldLargerFM(font);
    due = due.append(" "); // So that we have a space after the date before the task name
    task = largerFM.elidedText(task, Qt::ElideRight, option.rect.width()-COLORTAB-3*MARGIN - boldLargerFM.width(due));
    painter->setFont(font);
    painter->drawText(option.rect.topLeft()+QPoint(COLORTAB+MARGIN,largerFM.height()),due);
    
    font.setBold(false);
    painter->setFont(font);
    painter->drawText(option.rect.topLeft()+QPoint(COLORTAB+3*MARGIN + boldLargerFM.width(due),boldLargerFM.height()),task);
  }
  else {
    // Elide (text with dots like th...) if wider than view and draw
    task = largerFM.elidedText(task, Qt::ElideRight, option.rect.width()-COLORTAB-3*MARGIN);
    painter->setFont(font);
    painter->drawText(option.rect.topLeft()+QPoint(COLORTAB+MARGIN,largerFM.height()),task);
  }
  
  if (smallTasks) {
    painter->restore();
    return;
  }
  
  // Set our smaller attributes and blue hue for additional text
  font.setPointSize(font.pointSize()-1);
  font.setItalic(true);
  painter->setFont(font);
  fm = QFontMetrics(font);
  QColor moreText(Plasma::Theme::defaultTheme()->color(Plasma::Theme::TextColor));
  
  qreal red = moreText.redF();
  qreal green = moreText.greenF();
  qreal blue = moreText.blueF();
  qreal colorChangeMult = 0.85;
  if (blue < colorChangeMult)
    blue /= colorChangeMult;
  else {
    red *= colorChangeMult;
    green *= colorChangeMult;
  }
  moreText.setRgbF(red, green, blue);
  painter->setPen(moreText);
  
  // Elide the due from the front because "Due on" isn't necessary
  due = fm.elidedText(due, Qt::ElideLeft, option.rect.width() - COLORTAB+3*MARGIN - fm.width(tags));
  painter->drawText(option.rect.bottomLeft()+QPoint(COLORTAB+MARGIN, -MARGINH), tags);
  painter->drawText(option.rect.bottomRight()+QPoint(-COLORTAB+MARGIN-fm.width(due), -MARGINH), due);

  painter->restore();
}
  void
expandOperand(operandKindType addressMode, char *buffer)
{
	switch (addressMode) {
	case IMMEDIATE_OPND:		moreText("#"); break;
	case INDIRECT_OPND:		moreText("@"); break;
	case POST_INDEXED_Y_OPND:	moreText("y[@"); break;
	case PRE_INDEXED_X_OPND:	moreText("@x["); break;
	case X_INDEXED_OPND:		moreText("x["); break;
	case Y_INDEXED_OPND:		moreText("y["); break;
	case A_REGISTER_OPND:		moreText("a"); break;
	case X_REGISTER_OPND:		moreText("x"); break;
	case Y_REGISTER_OPND:		moreText("y"); break;
	case X_SELECTED_OPND:		moreText("x"); break;
	case Y_SELECTED_OPND:		moreText("y"); break;
	case PRE_SELECTED_X_OPND:	moreText("@x"); break;
	default:			break;
	}
	expandExpression(NULL, NULL);
	if (addressMode == POST_INDEXED_Y_OPND ||
	    addressMode == PRE_INDEXED_X_OPND ||
	    addressMode == X_INDEXED_OPND ||
	    addressMode == Y_INDEXED_OPND)
		moreText("]");
}