📄 tree_widget_buddy.cs
字号:
namespace Imps.Client.Pc.BizControls
{
using Imps.Client;
using Imps.Client.Core;
using Imps.Client.Pc;
using Imps.Client.Pc.BizControls.Common;
using Imps.Client.Resource;
using Imps.Client.Utils;
using Imps.Utils;
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
public class tree_widget_buddy : tree_widget.item_type
{
private Imps.Client.Core.Contact m_contact;
private Size m_crbt_to_contact_size = Size.Empty;
private bool m_crbt_to_me_changed = true;
private Size m_crbt_to_me_size = Size.Empty;
private bool m_focused;
private Image m_head_icon;
private bool m_hover;
private int m_inner_space = 2;
private area_type m_last_leftdown_area;
private area_type m_mouse_location_area = area_type.outside;
private bool m_online;
private int? m_relation_status = null;
private bool m_relation_status_changed = true;
private Size m_relation_status_size = Size.Empty;
private rich_string m_rich_name = new rich_string();
private rich_string m_rich_personal_message = new rich_string();
private int m_Singleinner_space = 4;
private string m_status = string.Empty;
private bool m_status_changed = true;
private AmigoImage m_status_img;
private Size m_status_size = Size.Empty;
private static ImageList ms_crbt_to_contact_imgl = ThemeManager.GetImageList(ImpsIcons.CrbtToBuddyIl, 4, 1, false);
private static ImageList ms_crbt_to_me_imgl = ThemeManager.GetImageList(ImpsIcons.CrbtToMeIl, 4, 1, false);
public tree_widget_buddy(Imps.Client.Core.Contact contact)
{
if (contact == null)
{
throw new ArgumentNullException("contact");
}
this.update_contact_info(contact, ContactEventType.InfoChanged, false);
}
internal override void dispose()
{
this.m_contact = null;
this.m_status_img = null;
this.m_head_icon = null;
this.m_status_img = null;
this.m_rich_personal_message.clear();
}
internal override void draw(Graphics g, Rectangle rc, tree_widget.item_state state)
{
if (base.host != null)
{
this.m_focused = (tree_widget.item_state.focused & state) == tree_widget.item_state.focused;
this.m_hover = (tree_widget.item_state.hover & state) == tree_widget.item_state.hover;
int height = rc.Height;
switch (((buddytree_widget) base.host).DisplayMode)
{
case BuddyTreeDisplayMode.SingleLine:
this.draw_single_line_mode(g, rc, state);
return;
case BuddyTreeDisplayMode.DoubleLine:
this.draw_double_lines_mode(g, rc, state);
return;
case BuddyTreeDisplayMode.LargeIcon:
this.draw_icon_mode(g, rc, state, 0x60);
return;
}
this.draw_icon_mode(g, rc, state, 0x30);
}
}
private void draw_double_lines_mode(Graphics g, Rectangle rc, tree_widget.item_state state)
{
Rectangle rect = Rectangle.FromLTRB(rc.Left + this.m_inner_space, rc.Top + this.m_inner_space, (rc.Left + rc.Height) - this.m_inner_space, rc.Bottom - this.m_inner_space);
if ((rect.Left < rect.Right) && (rect.Top < rect.Bottom))
{
using (Pen pen = new Pen(Color.FromArgb(0xff, 180, 0xc6, 0xd6)))
{
if (this.m_head_icon != null)
{
g.DrawImage(this.m_head_icon, rect);
}
g.DrawRectangle(pen, rect);
}
}
Rectangle rectangle2 = Rectangle.FromLTRB(rect.Right + this.m_inner_space, rc.Top + this.m_inner_space, (rect.Right + this.m_inner_space) + 0x10, (rc.Top + this.m_inner_space) + 0x10);
if (rectangle2.Left <= rc.Right)
{
if ((this.m_status_img != null) && (this.m_status_img.Image != null))
{
g.DrawImage(this.m_status_img.Image, rectangle2);
}
using (StringFormat fmt = new StringFormat())
{
fmt.Alignment = StringAlignment.Near;
fmt.LineAlignment = StringAlignment.Center;
fmt.FormatFlags |= StringFormatFlags.NoWrap;
fmt.Trimming = StringTrimming.EllipsisCharacter;
int offset = rectangle2.Right + this.m_inner_space;
int left = offset;
int right = rc.Right - this.m_inner_space;
Rectangle rectangle3 = Rectangle.FromLTRB(rectangle2.Right + this.m_inner_space, rc.Top + this.m_inner_space, right, rc.Bottom - (rc.Height / 2));
this.m_rich_name.Draw(g, base.host.Font, Color.Black, rectangle3, fmt, ref offset);
SizeF ef = this.m_rich_name.MeasureText(g, base.host.Font);
bool flag = true;
if (ef.Width >= rectangle3.Width)
{
flag = false;
}
bool flag2 = this.crbt_to_me.IsValid() || this.crbt_to_contact.IsValid();
if (this.m_contact.RelationStatusIsAgree)
{
if (flag2)
{
Rectangle rectangle4 = Rectangle.FromLTRB(offset + this.m_inner_space, rectangle3.Top, right, rectangle3.Bottom);
this.m_rich_personal_message.Draw(g, base.host.Font, Color.Gray, rectangle4, fmt, ref offset);
}
else
{
Rectangle rectangle5 = Rectangle.FromLTRB(left, rectangle3.Bottom + this.m_inner_space, right, rc.Bottom - this.m_inner_space);
this.m_rich_personal_message.Draw(g, base.host.Font, Color.Gray, rectangle5, fmt, ref left);
}
offset += this.m_inner_space;
if ((offset >= (rc.Right - this.m_inner_space)) || !flag)
{
goto Label_04E8;
}
using (Brush brush = new SolidBrush(Color.Silver))
{
if (this.m_status_changed)
{
SizeF ef2 = g.MeasureString(this.m_status, base.host.Font);
this.m_status_size = new Size(((int) ef2.Width) + 2, ((int) ef2.Height) + 2);
this.m_status_changed = false;
}
Rectangle layoutRectangle = Rectangle.FromLTRB(offset, rc.Top + this.m_inner_space, ((offset + this.m_status_size.Width) > (rc.Right - this.m_inner_space)) ? (rc.Right - this.m_inner_space) : (offset + this.m_status_size.Width), rc.Bottom - (rc.Height / 2));
g.DrawString(this.m_status, base.host.Font, brush, layoutRectangle, fmt);
goto Label_04E8;
}
}
if (offset < right)
{
using (Brush brush2 = new SolidBrush(Color.Silver))
{
string text = string.Empty;
if (0 < this.m_contact.Postfix.Length)
{
text = string.Format("({0})", this.m_contact.Postfix);
}
if (this.m_relation_status_changed)
{
SizeF ef3 = g.MeasureString(text, base.host.Font);
this.m_relation_status_size = new Size(((int) ef3.Width) + 2, ((int) ef3.Height) + 2);
this.m_relation_status_changed = false;
}
if (offset < right)
{
Rectangle rectangle7 = Rectangle.FromLTRB(offset, rectangle3.Top, offset + this.m_relation_status_size.Width, rectangle3.Bottom);
if (rectangle7.Right > right)
{
rectangle7.Width = right - rectangle7.Left;
}
g.DrawString(text, base.host.Font, brush2, rectangle7, fmt);
}
offset += this.m_relation_status_size.Width;
}
}
Label_04E8:
if (left < (rc.Right - this.m_inner_space))
{
if (this.crbt_to_me.IsValid())
{
int num4 = 0;
num4 = ((rc.Right - left) - 0x10) - this.m_inner_space;
left += 0x10;
if (0 >= num4)
{
return;
}
using (Brush brush3 = new SolidBrush(Color.Blue))
{
if (this.m_crbt_to_me_changed)
{
SizeF ef4 = g.MeasureString(this.crbt_to_me.ToneName, base.host.Font);
this.m_crbt_to_me_size = new Size(((int) ef4.Width) + 2, ((int) ef4.Height) + 2);
this.m_crbt_to_me_changed = false;
}
Rectangle rectangle8 = Rectangle.FromLTRB(left, (rc.Top + (rc.Height / 2)) + this.m_inner_space, left + num4, rc.Bottom - this.m_inner_space);
if ((area_type.crbt_to_me == this.mouse_location_area) && this.m_hover)
{
g.DrawImage(ms_crbt_to_me_imgl.Images[1], rectangle8.Left - 0x10, rectangle8.Top, 0x10, 0x10);
using (Font font = new Font(base.host.Font, FontStyle.Underline))
{
g.DrawString(this.crbt_to_me.ToneName, font, brush3, rectangle8, fmt);
goto Label_068E;
}
}
g.DrawImage(ms_crbt_to_me_imgl.Images[0], rectangle8.Left - 0x10, rectangle8.Top, 0x10, 0x10);
g.DrawString(this.crbt_to_me.ToneName, base.host.Font, brush3, rectangle8, fmt);
Label_068E:
left += (this.m_crbt_to_me_size.Width < num4) ? this.m_crbt_to_me_size.Width : num4;
return;
}
}
left += (((rc.Right - (this.m_inner_space * 2)) - left) / 2) + this.m_inner_space;
}
}
}
}
private void draw_icon_mode(Graphics g, Rectangle rc, tree_widget.item_state state, int iconSize)
{
int num;
int depth;
Rectangle rect;
Color color = Color.FromArgb(0xd1, 0xd8, 0xe0);
if (iconSize == 0x60)
{
rect = Rectangle.FromLTRB(rc.Left + 5, rc.Top + 1, rc.Right - 5, rc.Bottom - 8);
depth = 3;
num = 5;
}
else
{
rect = Rectangle.FromLTRB(rc.Left + 2, rc.Top, rc.Right - 2, rc.Bottom - 4);
depth = 2;
num = 4;
}
if ((state & tree_widget.item_state.selected) == tree_widget.item_state.selected)
{
crystal_band_tools.draw_crystal_band(g, rect, base.host.select_band_colors, false);
}
if (this.m_hover && (base.host != null))
{
crystal_band_tools.draw_crystal_band(g, rect, base.host.hover_band_colors, false);
}
if ((state & tree_widget.item_state.focused) == tree_widget.item_state.focused)
{
using (Pen pen = new Pen(Color.FromArgb(160, 160, 160)))
{
pen.DashStyle = DashStyle.Dash;
g.DrawRectangle(pen, rect);
goto Label_014A;
}
}
if ((state & tree_widget.item_state.selected) == tree_widget.item_state.selected)
{
using (Pen pen2 = new Pen(Color.FromArgb(0x98, 210, 0xde)))
{
g.DrawRectangle(pen2, rect);
goto Label_014A;
}
}
using (Pen pen3 = new Pen(color))
{
g.DrawRectangle(pen3, rect);
}
Label_014A:
Imps.Client.Utils.DrawHelper.DrawRectangleShadow(g, rect, depth, color);
Rectangle rectangle2 = new Rectangle(rect.Left + num, rect.Top + num, iconSize, iconSize);
if (this.m_head_icon != null)
{
g.DrawImage(this.m_head_icon, rectangle2);
}
using (Pen pen4 = new Pen(color))
{
rectangle2 = new Rectangle(rectangle2.Left - 1, rectangle2.Top - 1, rectangle2.Width + 1, rectangle2.Height + 1);
g.DrawRectangle(pen4, rectangle2);
}
int right = rectangle2.Right;
if ((this.m_status_img != null) && (this.m_status_img.Image != null))
{
Rectangle rectangle3;
if (iconSize == 0x60)
{
int y = rect.Bottom - 0x10;
rectangle3 = new Rectangle((rect.Right - num) - 0x10, y, 0x10, 0x10);
right = rectangle3.Left - this.m_inner_space;
}
else
{
int num5 = rectangle2.Bottom - 0x10;
rectangle3 = new Rectangle(rectangle2.Right - 0x10, num5, 0x10, 0x10);
}
g.DrawImage(this.m_status_img.Image, rectangle3);
}
using (StringFormat fmt = new StringFormat())
{
fmt.Alignment = StringAlignment.Near;
fmt.LineAlignment = StringAlignment.Center;
fmt.FormatFlags |= StringFormatFlags.NoWrap;
fmt.Trimming = StringTrimming.EllipsisCharacter;
int left = rect.Left + num;
int top = rect.Bottom - 0x10;
int num8 = right;
Rectangle rectangle4 = Rectangle.FromLTRB(left, top, num8, rect.Bottom);
if (iconSize < 0x60)
{
this.m_rich_name.DrawEx(g, base.host.Font, Color.Black, rectangle4, fmt, ref left, true);
}
else
{
this.m_rich_name.Draw(g, base.host.Font, Color.Black, rectangle4, fmt, ref left);
}
}
}
private void draw_single_line_mode(Graphics g, Rectangle rc, tree_widget.item_state state)
{
Rectangle rect = Rectangle.FromLTRB(rc.Left + this.m_inner_space, rc.Top + this.m_inner_space, (rc.Left + this.m_inner_space) + 0x10, (rc.Top + this.m_inner_space) + 0x10);
if ((this.m_status_img != null) && (this.m_status_img.Image != null))
{
g.DrawImage(this.m_status_img.Image, rect);
}
using (StringFormat fmt = new StringFormat())
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -