using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Windows.Forms; using S16.Drawing; using XMLLoader; using System.Xml; using INILoader; namespace ItemDictionary { public partial class ItemDictionary : Form { String main_path; String cur_pack; List item_data_list; List icon_pack_list; List item_custom_list; private xmlLoader m_xmlLoader; public ItemDictionary() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.SetStyle( ControlStyles.OptimizedDoubleBuffer, true ); icon_pack_list = new List(); INILoader.INILoader loader = new INILoader.INILoader("./ItemDictionary.ini", false); loader.SetTitle("path"); main_path = loader.LoadString( "path", "" ); m_xmlLoader = new xmlLoader(String.Format("{0}/XML/uiimageset.xml", main_path ) ); LoadData(); imagetreeView.SuspendLayout(); XmlElement element = m_xmlLoader.GetElement(); foreach (XmlNode ImageSetNode in element.ChildNodes) { if (ImageSetNode.Name == "#comment") continue; ImageTreeNode node = new ImageTreeNode( "Imageset", "", ImageSetNode.Attributes["Name"].Value, ImageSetNode.Attributes["File"].Value, 0, 0, 0, 0, 0, 0 ); imagetreeView.Nodes.Add( node ); String set_name = ImageSetNode.Attributes["Name"].Value.ToString(); foreach( XmlNode ImageNode in ImageSetNode.ChildNodes ) { if (ImageNode.Name == "#comment") continue; int offsetX = 0; int offsetY = 0; foreach ( XmlAttribute att in ImageNode.Attributes ) { if( att.Name == "OffsetX" ) offsetX = Int32.Parse( att.Value ); else if( att.Name == "OffsetY" ) offsetY = Int32.Parse( att.Value ); } String pack_name = String.Format( "{0}#{1}", set_name, ImageNode.Attributes["Name"].Value ); ImageTreeNode child_node = new ImageTreeNode( "Image", pack_name, ImageNode.Attributes["Name"].Value, ImageSetNode.Attributes["File"].Value, Int32.Parse( ImageNode.Attributes["X"].Value ), Int32.Parse( ImageNode.Attributes["Y"].Value ), Int32.Parse( ImageNode.Attributes["Width"].Value ), Int32.Parse( ImageNode.Attributes["Height"].Value ), offsetX, offsetY ); node.Nodes.Add( child_node ); PackData data; data.file = ImageSetNode.Attributes["File"].Value.ToString(); data.pack = pack_name; data.x = Int32.Parse( ImageNode.Attributes["X"].Value ); data.y = Int32.Parse( ImageNode.Attributes["Y"].Value ); data.width = Int32.Parse( ImageNode.Attributes["Width"].Value ); data.height = Int32.Parse( ImageNode.Attributes["Height"].Value ); data.offset_x = offsetX; data.offset_y = offsetY; icon_pack_list.Add(data); } } imagetreeView.Sort(); imagetreeView.ResumeLayout(false); } private void RefreshTextureBox( String _path ) { if( Path.GetExtension(_path) != ".dds" ) return; String path = String.Format( "{0}/resource/texture/{1}", main_path, _path ); if (File.Exists(path) == false) { TextureBox.Image = null; return; } TextureBox.Image = null; DDSImage image = new DDSImage(File.ReadAllBytes(path)); if( image.BitmapImage.Width > 512 || image.BitmapImage.Height > 512 ) { TextureBox.SizeMode = PictureBoxSizeMode.Zoom; TextureBox.Image = image.BitmapImage; } else { TextureBox.SizeMode = PictureBoxSizeMode.Normal; TextureBox.Image = image.BitmapImage; } } private void TextureBox_Click(object sender, EventArgs e) { if( String.IsNullOrEmpty(cur_pack) ) return; MouseEventArgs me = e as MouseEventArgs; Point pos = me.Location; foreach ( PackData data in icon_pack_list ) { if( data.file != cur_pack ) continue; Rectangle rec = new Rectangle( data.x, data.y, data.width, data.height ); if( rec.Contains(pos) ) { RefreshTextureBox(cur_pack); Graphics g = Graphics.FromImage(TextureBox.Image); Pen pen = new Pen(Color.Red, 2); g.DrawRectangle(pen, data.x, data.y, data.width, data.height); //MessageBox.Show( data.pack ); String[] token = data.pack.Split('#'); FocusTreeViewNode( token[0], token[1] ); return; } } } private void ImageTree_AfterSelect(object sender, TreeViewEventArgs e) { TreeView tree = (TreeView)sender; if (tree.SelectedNode.Parent == null) { ImageTreeNode node = tree.SelectedNode as ImageTreeNode; RefreshTextureBox( node.file ); SetDesc(""); cur_pack = node.file; } else { ImageTreeNode parent_node = tree.SelectedNode.Parent as ImageTreeNode; ImageTreeNode node = tree.SelectedNode as ImageTreeNode; SetDesc(node.pack_name); PackData data = icon_pack_list.Find( p => p.pack == node.pack_name ); RefreshTextureBox( data.file ); Graphics g = Graphics.FromImage(TextureBox.Image); Pen pen = new Pen(Color.Red, 2); g.DrawRectangle(pen, data.x, data.y, data.width, data.height); cur_pack = parent_node.file; } } private void LoadData() { if( item_data_list == null ) item_data_list = new List(); else item_data_list.Clear(); LoadItemData(); LoadExtraItemData(); LoadSkillData(); LoadMedalData(); LoadQuestData(); LoadEtcItemData(); LoadCostumeData(); LoadAccessoryData(); LoadDecoManData(); LoadDecoWomanData(); LoadCustomDesc(); /*StreamWriter sw = new StreamWriter("test.txt"); foreach( ItemData data in item_data_list ) { String line = String.Format( "{0},{1},{2},{3}", data.pack_name, data.name, data.desc, "" ); sw.WriteLine(line); } sw.Close();*/ item_grideView.SuspendLayout(); item_grideView.RowHeadersVisible = false; item_grideView.Rows.Clear(); item_grideView.Columns.Add("pack", "팩"); item_grideView.Columns.Add("type", "타입"); item_grideView.Columns.Add("name", "이름"); item_grideView.Columns.Add("desc", "설명"); item_grideView.ResumeLayout(false); } private void SetGridView( List list ) { item_grideView.SuspendLayout(); item_grideView.Rows.Clear(); foreach (ItemData data in list) { DataGridViewRow r = item_grideView.Rows[item_grideView.Rows.Add(new DataGridViewRow())]; r.Cells["pack"].Value = data.pack_name; r.Cells["type"].Value = data.type; r.Cells["name"].Value = data.name; r.Cells["desc"].Value = data.desc; } item_grideView.AutoResizeColumns(); item_grideView.ResumeLayout(false); } private void FocusTreeViewNode( String value1, String value2 ) { if( String.IsNullOrEmpty(value2) ) { TreeNode[] node = imagetreeView.Nodes.Find(value1, false); if (node.Length > 0) { imagetreeView.SelectedNode = node[0]; } } else { TreeNode[] parent_node = imagetreeView.Nodes.Find(value1, false); if (parent_node.Length > 0) { TreeNode[] node = parent_node[0].Nodes.Find(value2, false); if (node.Length > 0) { imagetreeView.SelectedNode = node[0]; } } } } private void item_CellMouseClick(object sender, DataGridViewCellEventArgs e) { if( e.RowIndex < 0 ) return; DataGridViewCell cell = (DataGridViewCell)item_grideView.Rows[e.RowIndex].Cells["pack"]; PackData data = icon_pack_list.Find( p => p.pack == cell.Value.ToString() ); if( String.IsNullOrEmpty(data.pack) ) { MessageBox.Show("!?"); return; } RefreshTextureBox( data.file ); if( !String.IsNullOrEmpty(data.pack) ) { Graphics g = Graphics.FromImage(TextureBox.Image); Pen pen = new Pen(Color.Red, 2); g.DrawRectangle(pen, data.x, data.y, data.width, data.height); SetDesc(data.pack); String[] token = data.pack.Split('#'); if( token.Length == 1 ) { FocusTreeViewNode( token[0], "" ); } else if( token.Length == 2 ) { FocusTreeViewNode( token[0], token[1] ); } cur_pack = data.file; } } private void search_TextBox_KeyDown(object sender, KeyEventArgs e) { if( e.KeyCode != Keys.Return ) return; if (String.IsNullOrEmpty(search_TextBox.Text)) return; List list = new List(); foreach (ItemData data in item_data_list) { if (data.name.Contains(search_TextBox.Text)) { list.Add(data); } else if (data.desc.Contains(search_TextBox.Text)) { list.Add(data); } else if (data.type.Contains(search_TextBox.Text)) { list.Add(data); } else if( Regex.IsMatch(data.pack_name, search_TextBox.Text, RegexOptions.IgnoreCase) ) { list.Add(data); } } String search_pack_name = String.Empty; foreach (ItemCustomData data in item_custom_list) { if (data.desc.Contains(search_TextBox.Text)) { search_pack_name = data.pack_name; } if (!String.IsNullOrEmpty(search_pack_name)) { ItemData item_data = list.Find(p => p.pack_name == search_pack_name); if (String.IsNullOrEmpty(item_data.pack_name)) { ItemData temp = new ItemData(); temp.pack_name = search_pack_name; list.Add(temp); } } } foreach (PackData data in icon_pack_list) { if (Regex.IsMatch(data.pack, search_TextBox.Text, RegexOptions.IgnoreCase)) { ItemData item_data = list.Find(p => p.pack_name == data.pack); if (String.IsNullOrEmpty(item_data.pack_name)) { ItemData temp = new ItemData(); temp.pack_name = data.pack; list.Add(temp); } } } if (list.Count > 0) { SetGridView(list); } else { MessageBox.Show( "검색결과가 없습니다.", "검색실패", MessageBoxButtons.OK, MessageBoxIcon.Information ); } } private void refresh_custom_desc(object sender, KeyEventArgs e) { if (e.KeyCode != Keys.Return) return; if (String.IsNullOrEmpty(pack_textBox.Text)) return; bool is_refresh = false; for( int i=0; i p.pack == pack_name ); pack_textBox.Clear(); desc_textBox.Clear(); if( !String.IsNullOrEmpty(data.pack) ) { pack_textBox.Text = data.pack; String info = String.Format("[이미지정보]{0}",Environment.NewLine); info += String.Format("위치 : {0}, {1}{2}", data.x, data.y, Environment.NewLine); info += String.Format("크기 : {0}*{1}{2}", data.width, data.height, Environment.NewLine); info += String.Format("옵셋 : {0}, {1}", data.offset_x, data.offset_y); desc_textBox.Text = info; int add_count = 0; List item_datas = item_data_list.FindAll( p => p.pack_name == pack_name ); foreach( ItemData item_data in item_datas ) { String desc = String.Format( "{0} / {1} 아이콘{2}{3}{4}", item_data.name, item_data.type, Environment.NewLine, Environment.NewLine, item_data.desc ); desc_textBox.Text += Environment.NewLine; desc_textBox.Text += Environment.NewLine; desc_textBox.Text += "------------------------------------------------"; desc_textBox.Text += Environment.NewLine; desc_textBox.Text += desc; add_count++; if( add_count >= 10 ) { desc_textBox.Text += Environment.NewLine; desc_textBox.Text += Environment.NewLine; desc_textBox.Text += "------------------------------------------------"; desc_textBox.Text += Environment.NewLine; desc_textBox.Text += String.Format( "사용하는 위치가 너무 많아 검색을 종료합니다." ); desc_textBox.Text += Environment.NewLine; desc_textBox.Text += String.Format( "총 사용량 {0}건.", item_datas.Count ); break; } } } ItemCustomData custom_data = item_custom_list.Find( p => p.pack_name == pack_name ); if( !String.IsNullOrEmpty(custom_data.pack_name) ) { custom_desc_textBox.Text = custom_data.desc; } else { custom_desc_textBox.Text = ""; } } } }