package ru.denull.wire;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableCellRenderer;
import ru.denull.mtproto.DataService;
import ru.denull.wire.Utils;
import ru.denull.wire.model.DialogManager;
import ru.denull.wire.model.MessageListModel;
import ru.denull.wire.model.DialogManager.EncryptedDialog;
import ru.denull.wire.model.FileManager.FileLoadingCallback;
import tl.*;
import tl.Dialog;
import tl.storage.TFileType;
public class DialogCellRenderer implements ListCellRenderer {
private static final long serialVersionUID = 5645361179616977L;
private DataService service;
public DialogCellRenderer(DataService service) {
this.service = service;
}
private int times = 0;
public Component getListCellRendererComponent(JList list, Object item, final int index, boolean selected, boolean focused) {
if (item instanceof String) {
JLabel label = new JLabel((String) item, SwingConstants.CENTER);
label.setOpaque(true);
label.setForeground(Color.decode("0x808080"));
label.setBackground(Color.WHITE);
label.setFont(new Font(Utils.fontName, Font.PLAIN, 16));
label.setBorder(new EmptyBorder(30, 4, 30, 4));
return label;
}
final DialogManager model = (DialogManager) list.getModel();
JPanel panel = new JPanel(new GridBagLayout());
panel.setOpaque(true);
//panel.setBackground(Color.decode("0xf9f9f9"));
panel.setBackground(Color.WHITE);
GridBagConstraints constraints;
final Dialog dialog = (Dialog) item;
TMessage message = service.messageManager.get(dialog.top_message);
//panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
JLabel unreadLabel = new JLabel();
//unreadLabel.setBorder(BorderFactory.createLineBorder(Color.RED));
unreadLabel.setMinimumSize(new Dimension(10, 66));
unreadLabel.setPreferredSize(new Dimension(10, 66));
if (dialog.unread_count > 0 && !message.out) {
unreadLabel.setIcon(new ImageIcon(Utils.getImage("unread.png")));
}
constraints = Utils.GBConstraints(0, 0, 1, 2);
constraints.insets = new Insets(0, 3, 0, 3);
panel.add(unreadLabel, constraints);
ImagePanel iconLabel = new ImagePanel();
//iconLabel.setBorder(BorderFactory.createLineBorder(Color.RED));
iconLabel.setMinimumSize(new Dimension(50, 50));
iconLabel.setPreferredSize(new Dimension(50, 50));
panel.add(iconLabel, Utils.GBConstraints(1, 0, 1, 2));
JLabel dateLabel = new JLabel(Utils.toTimeOrDay(message.date));
dateLabel.setForeground(selected ? Color.WHITE : Color.decode("0x006fc8"));
dateLabel.setFont(new Font("Tahoma", Font.PLAIN, 11));
//dateLabel.setBorder(BorderFactory.createLineBorder(Color.RED));
//dateLabel.setPreferredSize(new Dimension(60, dateLabel.getPreferredSize().height));
//System.out.println(Utils.toTimeOrDay(message.date));
if (message.out) {
if (message.failed) {
dateLabel.setIcon(new ImageIcon(Utils.getImage("msg_warning.png")));
} else if (message.sending) {
dateLabel.setIcon(new ImageIcon(Utils.getImage("msg_clock.png")));
} else if (message.unread) {
dateLabel.setIcon(new ImageIcon(Utils.getImage("msg_check.png")));
} else {
dateLabel.setIcon(new ImageIcon(Utils.getImage("msg_dblcheck.png")));
}
}
constraints = Utils.GBConstraints(3, 0, 2, 1);
constraints.insets = new Insets(6, 0, 0, 8);
panel.add(dateLabel, constraints);
JLabel deleteLabel = new JLabel();
//deleteLabel.setBorder(BorderFactory.createLineBorder(Color.RED));
constraints = Utils.GBConstraints(4, 1, 1, 1);
constraints.anchor = GridBagConstraints.PAGE_START;
panel.add(deleteLabel, constraints);
if (dialog.peer instanceof PeerChat) {
int chat_id = ((PeerChat) dialog.peer).chat_id;
TChat chat = service.chatManager.get(chat_id);
TUser user = service.userManager.get(message.from_id);
if (chat == null) {
//Log.wtf(TAG, "Trying to show non-existent chat #" + chat_id);
return panel;
}
//setupItem(convertView, tchat, user, message, activity, query);
service.chatManager.getImage(chat.id, iconLabel, false, new FileLoadingCallback() {
public void fail() { }
public void complete(TFileType type, Object data) {
//cache.remove(message.id);
Object o = model.getSize() > index ? model.getElementAt(index) : null;
if (o != null && o instanceof Dialog && ((Dialog) o).peer.chat_id == dialog.peer.chat_id) {
model.updateContents(index);
} else {
model.updateContents();
}
}
});
/*if (query == null) {
title.setText(chat.title);
} else {
SpannableString htitle = new SpannableString(chat.title);
int start = 0;
query = query.trim().toLowerCase();
String tmp = chat.title.trim().toLowerCase();
do {
start = tmp.indexOf(query, start);
if (start > -1) {
htitle.setSpan(Utils.getHighlight(), start, start + query.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
start++;
}
} while (start > -1);
title.setText(htitle);
}*/
JLabel titleLabel = new JLabel(chat.title.trim());
titleLabel.setFont(new Font(Utils.fontName, Font.PLAIN, 14));
titleLabel.setForeground(selected ? Color.WHITE : Color.BLACK);
//titleLabel.setBorder(BorderFactory.createLineBorder(Color.RED));
constraints = Utils.GBConstraints(2, 0, 1, 1);
constraints.insets = new Insets(6, 7, 2, 0);
constraints.weightx = 1;
constraints.anchor = GridBagConstraints.LINE_START;
panel.add(titleLabel, constraints);
String typing = service.typingManager.getStatus(-chat.id, false);
String text;
Color color = null;
EmojiLabel messageLabel;
if (typing != null) {
messageLabel = new EmojiLabel(typing);
messageLabel.setForeground(Color.decode(selected ? "0xffffff" : "0x006fc8"));
} else
if (message instanceof MessageService) {
messageLabel = new EmojiLabel(Utils.getServiceMessageDesc(service, message));
messageLabel.setForeground(Color.decode(selected ? "0xffffff" : "0x006fc8"));
} else {
messageLabel = new EmojiLabel(getMessagePreview(message),
(user instanceof UserEmpty) ? null : (user instanceof UserSelf ? "Вы" : (user.first_name + " " + user.last_name)),
Color.decode(selected ? "0xffffff" : (user instanceof UserSelf ? "0x808080" : "0x006fc8")));
messageLabel.setForeground(Color.decode(selected ? "0xffffff" : (message.media instanceof MessageMediaEmpty ? "0x404040" : "0x006fc8")));
}
//messageLabel.setBorder(BorderFactory.createLineBorder(Color.RED));
messageLabel.setMinimumSize(new Dimension(0, 0));
messageLabel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 30));
messageLabel.center = false;
constraints = Utils.GBConstraints(2, 1, 2, 1);
constraints.insets = new Insets(0, 7, 0, 0);
constraints.weightx = 1;
constraints.anchor = GridBagConstraints.FIRST_LINE_START;
panel.add(messageLabel, constraints);
} else {
int user_id = dialog.peer.user_id;
TUser user = service.userManager.get(user_id);
service.userManager.getUserpic(user_id, iconLabel, false, new FileLoadingCallback() {
public void fail() { }
public void complete(TFileType type, Object data) {
//cache.remove(message.id);
Object o = model.getSize() > index ? model.getElementAt(index) : null;
if (o != null && o instanceof Dialog && ((Dialog) o).peer.user_id == dialog.peer.user_id) {
model.updateContents(index);
} else {
model.updateContents();
}
}
});
boolean encrypted = item instanceof EncryptedDialog;
JLabel titleLabel = new JLabel((user instanceof UserEmpty) ? "" : (user.first_name + " " + user.last_name).trim());
titleLabel.setFont(new Font(Utils.fontName, Font.PLAIN, 14));
titleLabel.setForeground(selected ? Color.WHITE : (encrypted ? Color.decode("0x00a80e") : Color.BLACK));
//titleLabel.setBorder(BorderFactory.createLineBorder(Color.RED));
if (encrypted) {
titleLabel.setIcon(new ImageIcon(Utils.getImage(selected ? "ic_lock_white.png" : "ic_lock_green.png")));
}
constraints = Utils.GBConstraints(2, 0, 1, 1);
constraints.insets = new Insets(6, 7, 2, 0);
constraints.weightx = 1;
constraints.anchor = GridBagConstraints.LINE_START;
panel.add(titleLabel, constraints);
String typing = service.typingManager.getStatus(user_id, false);
if (encrypted && !(((EncryptedDialog) item).chat instanceof EncryptedChat)) {
typing = Utils.getEncryptedChatStatus(((EncryptedDialog) item).chat);
}
EmojiLabel messageLabel = new EmojiLabel(typing == null ? getMessagePreview(message) : typing);
messageLabel.setForeground(selected ? Color.WHITE : ((typing == null && !(message.media instanceof MessageMediaEmpty)) ? Color.decode("0x006fc8") : Color.DARK_GRAY));
//messageLabel.setBorder(BorderFactory.createLineBorder(Color.RED));
messageLabel.setMinimumSize(new Dimension(0, 0));
messageLabel.setMaximumSize(new Dimension(Integer.MAX_VALUE, 30));
messageLabel.center = false;
constraints = Utils.GBConstraints(2, 1, 2, 1);
constraints.insets = new Insets(0, 7, 0, 0);
constraints.weightx = 1;
constraints.anchor = GridBagConstraints.FIRST_LINE_START;
panel.add(messageLabel, constraints);
/*subtitle1.setTypeface(Utils.getRobotoLight(activity));
subtitle1.setSingleLine(false);
subtitle1.setMaxLines(2);
subtitle2.setText(""); */
}
/*if (message.out) {
if (message.failed) {
status.setImageResource(R.drawable.msg_warning);
} else if (message.sending) {
status.setImageResource(R.drawable.msg_clock);
} else if (message.unread) {
status.setImageResource(R.drawable.msg_check);
} else {
status.setImageResource(R.drawable.msg_check_comp);
}
} else {
status.setImageResource(android.R.color.transparent);
}*/
//panel.setBackground(Color.WHITE);
if (selected) {
if (System.getProperty("os.name").contains("Mac")) {
panel.setBorder(UIManager.getBorder("List.sourceList" + (focused ? "Focused" : "") + "SelectionBackgroundPainter"));
} else {
panel.setBackground(UIManager.getColor("List.selectionBackground"));
}
} else {
//panel.setBorder(UIManager.getBorder("List.sourceListBackgroundPainter"));
}
return panel;
}
public static String getMessagePreview(TMessage message) {
/*if (message.media instanceof MessageMediaEmpty) {
return Utils.parseEmoji(message.message);
} else if (message.media instanceof MessageMediaPhoto) {
return "Photo";
} else if (message.media instanceof MessageMediaVideo) {
return "Video";
} else if (message.media instanceof MessageMediaGeo) {
return "Place";
} else if (message.media instanceof MessageMediaContact) {
return "Contact";
} else {
return "";
}*/
if (message.media instanceof MessageMediaEmpty) {
return message.message;
} else if (message.media instanceof MessageMediaPhoto) {
return "Фото";
} else if (message.media instanceof MessageMediaVideo) {
return "Видео";
} else if (message.media instanceof MessageMediaGeo) {
return "Место";
} else if (message.media instanceof MessageMediaContact) {
return "Контакт";
} else {
return "";
}
}
}