/*
* This file is part of NeighborNote
* Copyright 2013 Yuki Takahashi
*
* This file may be licensed under the terms of of the
* GNU General Public License Version 2 (the ``GPL'').
*
* Software distributed under the License is distributed
* on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the GPL for the specific language
* governing rights and limitations.
*
* You should have received a copy of the GPL along with this
* program. If not, go to http://www.gnu.org/licenses/gpl.html
* or write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
package cx.fbn.nevernote.gui;
import java.text.SimpleDateFormat;
import com.evernote.edam.type.Note;
import com.trolltech.qt.core.QByteArray;
import com.trolltech.qt.core.QEvent;
import com.trolltech.qt.core.QFile;
import com.trolltech.qt.core.QRectF;
import com.trolltech.qt.core.Qt;
import com.trolltech.qt.gui.QColor;
import com.trolltech.qt.gui.QFont;
import com.trolltech.qt.gui.QImage;
import com.trolltech.qt.gui.QMouseEvent;
import com.trolltech.qt.gui.QPaintEvent;
import com.trolltech.qt.gui.QPainter;
import com.trolltech.qt.gui.QPalette;
import com.trolltech.qt.gui.QPen;
import com.trolltech.qt.gui.QTextOption;
import com.trolltech.qt.gui.QWidget;
import cx.fbn.nevernote.Global;
import cx.fbn.nevernote.sql.DatabaseConnection;
public class RensoNoteListItem extends QWidget{
private final DatabaseConnection conn;
private final String noteGuid;
private final String noteTitle;
private final int relationPoints;
private final String noteCreated;
private final String tagNames;
private final String noteContent;
private final RensoNoteList parent;
private final boolean isStared;
private final int allPointSum;
private final QPalette palette;
private final String iconPath = new String("classpath:cx/fbn/nevernote/icons/");
public RensoNoteListItem(Note note, int relationPoints, boolean isStared, int allPointSum, DatabaseConnection c, RensoNoteList parent){
this.conn = c;
this.parent = parent;
this.isStared = isStared;
this.allPointSum = allPointSum;
this.noteGuid = new String(note.getGuid());
this.noteTitle = new String(note.getTitle());
this.relationPoints = relationPoints;
SimpleDateFormat simple = new SimpleDateFormat("yyyy/MM/dd");
this.noteCreated = new StringBuilder(simple.format(note.getCreated())).toString();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < note.getTagNames().size(); i++) {
sb.append(note.getTagNames().get(i));
if(i + 1 < note.getTagNames().size()){
sb.append(Global.tagDelimeter + " ");
}
}
this.tagNames = new String(sb);
// this.noteContent = new String(note.getContent());
// this.noteContent = Global.extractPlainText(conn.getNoteTable().getNoteContentNoUTFConversion(note.getGuid()));
this.noteContent = conn.getNoteTable().getNoteContentText(note.getGuid());
palette = new QPalette();
palette.setColor(QPalette.ColorRole.Window, new QColor(255, 255, 255));
this.setPalette(palette);
this.setAutoFillBackground(true);
this.setBackgroundRole(QPalette.ColorRole.Window);
}
@Override
protected void paintEvent(QPaintEvent event){
QPainter painter = new QPainter(this);
// 枠線
painter.setPen(QColor.lightGray);
painter.drawLine(0, rect().height() - 1, rect().width() - 1, rect().height() - 1);
// 項目の中身
// フォント設定
QFont relationFont = new QFont();
relationFont.setPixelSize(25);
relationFont.setBold(true);
QFont titleFont = new QFont();
titleFont.setPixelSize(15);
titleFont.setBold(true);
QFont normalFont = new QFont();
normalFont.setPixelSize(12);
// タイトル
painter.setPen(QColor.black);
painter.setFont(titleFont);
painter.drawText(85, 3, size().width() - 85, 20, Qt.AlignmentFlag.AlignLeft.value(), noteTitle);
// ノート作成日時
painter.setFont(normalFont);
painter.setPen(new QColor(60, 65, 255));
painter.drawText(85, 23, 75, 17, Qt.AlignmentFlag.AlignLeft.value(), noteCreated);
// タグ
painter.setPen(QColor.black);
painter.drawText(165, 23, size().width() - 165, 17, Qt.AlignmentFlag.AlignLeft.value(), tagNames);
// ノート内容
QPen tmpPen = painter.pen();
painter.setPen(new QColor(100, 100, 100));
QTextOption option = new QTextOption();
option.setAlignment(Qt.AlignmentFlag.AlignLeft);
option.setUseDesignMetrics(true);
painter.drawText(new QRectF(85, 40, width() - 85, 45), noteContent, option);
painter.setPen(tmpPen);
// 関連度
double ratio = (double)relationPoints / allPointSum;
QColor relationColor;
if (ratio >= 0.5) {
relationColor = new QColor(255, 0, 0);
} else if (ratio >= 0.25) {
relationColor = new QColor(255, 100, 0);
} else {
relationColor = new QColor(255, 200, 0);
}
painter.setFont(relationFont);
tmpPen = painter.pen();
painter.setPen(this.palette().color(QPalette.ColorRole.Window));
painter.drawText(size().width() - 70, size().height() - 33, 67, 33, Qt.AlignmentFlag.AlignRight.value(), String.valueOf((int)(ratio * 100)) + "%");
painter.drawText(size().width() - 70, size().height() - 33, 73, 33, Qt.AlignmentFlag.AlignRight.value(), String.valueOf((int)(ratio * 100)) + "%");
painter.drawText(70, size().height() - 36, size().width() - 70, 36, Qt.AlignmentFlag.AlignRight.value(), String.valueOf((int)(ratio * 100)) + "%");
painter.drawText(70, size().height() - 30, size().width() - 70, 30, Qt.AlignmentFlag.AlignRight.value(), String.valueOf((int)(ratio * 100)) + "%");
painter.setPen(relationColor);
painter.drawText(70, size().height() - 33, size().width() - 70, 33, Qt.AlignmentFlag.AlignRight.value(), String.valueOf((int)(ratio * 100)) + "%");
painter.setPen(tmpPen);
// サムネイル
// 優先順位 1.Evernoteサムネイル(ファイル), 2.Evernoteサムネイル(DB), 3.生成サムネイル(ファイル), 4.生成サムネイル(DB)
QImage img = new QImage();
String enThumbnailName = Global.getFileManager().getResDirPath("enThumbnail-" + noteGuid + ".png");
QFile enThumbnail = new QFile(enThumbnailName);
if (!enThumbnail.exists()) { // Evernoteサムネイルがファイルとして存在しない
QByteArray b =conn.getNoteTable().getENThumbnail(noteGuid);
if (b == null) { // Evernoteサムネイルがデータベースにも存在しない
String thumbnailName = Global.getFileManager().getResDirPath("thumbnail-" + noteGuid + ".png");
QFile thumbnail = new QFile(thumbnailName);
if (!thumbnail.exists()) { // 生成サムネイルがファイルとして存在しない
img = new QImage();
img.loadFromData(conn.getNoteTable().getThumbnail(noteGuid));
}
} else {
img = new QImage();
img.loadFromData(b);
saveImage(img, noteGuid);
}
} else {
img = new QImage(enThumbnailName);
}
painter.drawImage(2, 4, img, 0, 0, 80, rect().height() - 10);
painter.setPen(QColor.lightGray);
painter.drawRect(2, 4, 80, rect().height() - 10);
// スター
if (isStared) {
QImage starImage = new QImage(iconPath+"star.png");
starImage = starImage.scaled(30, 30, Qt.AspectRatioMode.IgnoreAspectRatio, Qt.TransformationMode.SmoothTransformation);
painter.drawImage(0, 0, starImage, 0, 0, starImage.width(), starImage.height());
}
painter.end();
}
@Override
protected void enterEvent(QEvent e){
if (!parent.isContextMenuVisible()) {
palette.setColor(QPalette.ColorRole.Window, new QColor(225, 235, 255));
this.setPalette(palette);
}
}
@Override
protected void leaveEvent(QEvent e){
if (!parent.isContextMenuVisible()) {
setDefaultBackground();
}
}
@Override
protected void mousePressEvent(QMouseEvent e) {
palette.setColor(QPalette.ColorRole.Window, new QColor(165, 175, 255));
this.setPalette(palette);
super.mousePressEvent(e);
}
public void setDefaultBackground() {
palette.setColor(QPalette.ColorRole.Window, new QColor(255, 255, 255));
this.setPalette(palette);
}
// サムネイルをpng形式のファイルとしてresディレクトリに保存
private void saveImage(QImage thumbnail, String guid) {
String thumbnailName = Global.getFileManager().getResDirPath("enThumbnail-" + guid + ".png");
thumbnail.save(thumbnailName, "PNG");
}
}