private void button1_Click(object sender, EventArgs e)
        {
            TextReader r = new StreamReader(@"P:\Stuart\Desktop\fullPatternList.xml");
            XmlSerializer s = new XmlSerializer(typeof(files));
            files lookupList = (files)s.Deserialize(r);
            r.Close();

            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < lookupList.Items.Count; i++)
            {

                Stream mem = File.OpenRead(@"P:\Stuart\Desktop\FullBuild0\config\xml\root\" + lookupList.Items[i].fullCasPartname + ".xml");

                Patterns.patternDetails pDetails = Patterns.parsePatternComplate(mem);

                if (String.IsNullOrEmpty(pDetails.category)) continue;

                patternsFile cPattern = new patternsFile();

                MadScience.Wrappers.ResourceKey rKey = new MadScience.Wrappers.ResourceKey("key:" + lookupList.Items[i].typeid.Remove(0, 2) + ":" + lookupList.Items[i].groupid.Remove(0, 2) + ":" + lookupList.Items[i].instanceid.Remove(0,2));

                cPattern.key = rKey.ToString();

                if (!StreamHelpers.isValidStream(KeyUtils.findKey("key:00B2D882:00000000:" + StringHelpers.HashFNV64(pDetails.name.Substring(pDetails.name.LastIndexOf("\\") + 1)).ToString("X16"))))
                {
                    cPattern.texturename = pDetails.BackgroundImage;
                }
                else
                {
                    cPattern.texturename = "key:00B2D882:00000000:" + StringHelpers.HashFNV64(pDetails.name.Substring(pDetails.name.LastIndexOf("\\") + 1)).ToString("X16");
                }
                cPattern.casPart = pDetails.name.Substring(pDetails.name.LastIndexOf("\\") + 1);

                switch (pDetails.category)
                {
                    case "Old":
                        break;
                    default:
                        //string fullName = pDetails.Substring(patternTexture.LastIndexOf("\\") + 1);
                        string category = pDetails.filename;
                        category = category.Replace(@"($assetRoot)\InGame\Complates\", "");
                        category = category.Replace(@"Materials\", "");
                        category = category.Replace(@".tga", "");
                        category = category.Replace(@".dds", "");

                        if (category.IndexOf("\\") > -1)
                        {
                            category = category.Substring(0, category.IndexOf("\\"));
                        }
                        else
                        {
                            category = pDetails.category;
                        }

                        string subCategory = pDetails.filename;
                        subCategory = subCategory.Replace(@"($assetRoot)\InGame\Complates\", "");
                        subCategory = subCategory.Replace(@"Materials\", "");
                        subCategory = subCategory.Replace(@".tga", "");
                        subCategory = subCategory.Replace(@".dds", "");
                        if (subCategory.IndexOf("\\") > -1)
                        {
                            subCategory = subCategory.Substring(subCategory.IndexOf("\\") + 1);
                        }

                        if (subCategory.Contains("\\"))
                        {
                            subCategory = subCategory.Remove(subCategory.IndexOf("\\"));
                        }
                        else
                        {
                            subCategory = "";
                        }

                        if (subCategory == pDetails.name) subCategory = "";

                        cPattern.category = category;
                        cPattern.subcategory = subCategory;

                        Console.WriteLine(pDetails.name + " " + category + " " + subCategory);

                        sb.AppendLine("<pattern key=\"" + cPattern.key + "\" texturename=\"\" category=\"" + category + "\" subcategory=\"" + subCategory + "\">" + pDetails.name + "</file>");

                        break;
                }

                //xtr.Close();

                mem.Close();
            }

            Clipboard.SetText(sb.ToString());
            Console.WriteLine("Done");
        }
        private void pictureBox_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < panel1.Controls.Count; i++)
            {
                PictureBox temp2 = (PictureBox)panel1.Controls[i];
                temp2.BorderStyle = BorderStyle.None;
            }

            PictureBox temp = (PictureBox)sender;
            toolStripStatusLabel1.Text = temp.Name;
            temp.BorderStyle = BorderStyle.Fixed3D;

            if (comboBox1.Text == "* Custom")
            {

                for (int i = 0; i < this.customPatterns.Items.Count; i++)
                {
                    patternsFile pattern = this.customPatterns.Items[i];
                    if (pattern.casPart == temp.Name)
                    {

                        toolStripStatusLabel2.Text = pattern.category;
                        if (pattern.subcategory != "" && pattern.subcategory != null && pattern.isCustom == false)
                        {
                            toolStripStatusLabel2.Text += "\\" + pattern.subcategory;
                        }

                        toolStripStatusLabel3.Text = pattern.key;
                        //toolStripStatusLabel4.Text = "key:" + pattern.typeid.ToLower() + ":" + pattern.groupid.ToLower() + ":" + pattern.instanceid.ToLower();

                        this._selectedPattern = pattern;
                        button2.Enabled = true;

                        break;
                    }
                }

            }
            else
            {

                for (int i = 0; i < this.patterns.Items.Count; i++)
                {
                    patternsFile pattern = this.patterns.Items[i];
                    if (pattern.casPart == temp.Name)
                    {

                        toolStripStatusLabel2.Text = pattern.category;
                        if (pattern.subcategory != "")
                        {
                            toolStripStatusLabel2.Text += "\\" + pattern.subcategory;
                        }

                        toolStripStatusLabel3.Text = pattern.key;
                        //toolStripStatusLabel4.Text = "key:" + pattern.typeid.ToLower() + ":" + pattern.groupid.ToLower() + ":" + pattern.instanceid.ToLower();

                        this._selectedPattern = pattern;
                        button2.Enabled = true;

                        break;
                    }
                }
            }
        }
        private void btnLoadCustom_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "Sims 3 Package|*.package";
            if (openFileDialog1.ShowDialog() == DialogResult.OK && openFileDialog1.FileName != "")
            {
                Stream cast = File.Open(openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.Read);
                MadScience.Wrappers.Database castdb = new MadScience.Wrappers.Database(cast, true);

                // Open XML file
                //patternsFile cPattern = new patternsFile();
                Patterns.patternDetails pDetails = new Patterns.patternDetails();

                foreach (MadScience.Wrappers.ResourceKey key in castdb._Entries.Keys)
                {
                    if ((key.groupId == 0x00000000) && (key.typeId == 0x0333406C))
                    {
                        pDetails = Patterns.parsePatternComplate(castdb.GetResourceStream(key));
                        patternsFile cPattern = new patternsFile();

                        //MadScience.Wrappers.ResourceKey rKey = new MadScience.Wrappers.ResourceKey(pDetails.key);

                        //cPattern.typeid = rKey.typeId.ToString("X8");
                        //cPattern.groupid = rKey.groupId.ToString("X8");
                        //cPattern.instanceid = rKey.instanceId.ToString("X16");

                        cPattern.key = pDetails.key;

                        if (!StreamHelpers.isValidStream(KeyUtils.findKey("key:00B2D882:00000000:" + StringHelpers.HashFNV64(pDetails.name.Substring(pDetails.name.LastIndexOf("\\") + 1)).ToString("X16"))))
                        {
                            if (String.IsNullOrEmpty(pDetails.BackgroundImage))
                            {
                                cPattern.texturename = pDetails.rgbmask;
                            }
                            else
                            {
                                cPattern.texturename = pDetails.BackgroundImage;
                            }
                        }
                        else
                        {
                            cPattern.texturename = "key:00B2D882:00000000:" + StringHelpers.HashFNV64(pDetails.name.Substring(pDetails.name.LastIndexOf("\\") + 1)).ToString("X16");
                        }
                        cPattern.casPart = pDetails.name.Substring(pDetails.name.LastIndexOf("\\") + 1);

                        cPattern.subcategory = openFileDialog1.FileName;
                        pDetails.customFilename = openFileDialog1.FileName;
                        cPattern.isCustom = true;
                        pDetails.isCustom = true;

                        customPatterns.Items.Add(cPattern);

                            TextWriter r = new StreamWriter(Path.Combine(Application.StartupPath, Path.Combine("xml", "customPatterns.xml")));
                            XmlSerializer s = new XmlSerializer(typeof(patterns));
                            s.Serialize(r, customPatterns);
                            r.Close();

                        break;
                    }
                }

                //Stream patternThumb = KeyUtils.searchForKey("key:00B2D882:00000000:" + StringHelpers.HashFNV64(pDetails.name), openFileDialog1.FileName);
                //if (!Helpers.isValidStream(patternThumb))
                //{
                //    patternThumb = KeyUtils.searchForKey("key:00B2D882:00000000:" + StringHelpers.HashFNV64(pDetails.BackgroundImage), openFileDialog1.FileName);
                //}

                //if (Helpers.isValidStream(patternThumb))
                //{
                    //Stream patternDDS = File.OpenWrite(Path.Combine(Application.StartupPath, Path.Combine("patterncache", pDetails.name + ".dds")));
                    //Helpers.CopyStream(patternThumb, patternDDS, true);
                    //patternDDS.Close();

                    //patternThumb.Seek(0, SeekOrigin.Begin);

                    PictureBox picBox = new PictureBox();
                    picBox.BackColor = System.Drawing.Color.White;
                    //picBox.Location = new System.Drawing.Point(horizontal, vertical);
                    picBox.Name = pDetails.name;

                    string toolTip = pDetails.category + "\\";
                    ToolTip tt = new ToolTip();
                    toolTip += pDetails.name;
                    tt.SetToolTip(picBox, toolTip);

                    picBox.Image = Patterns.makePatternThumb(pDetails, castdb);
                    //picBox.Image =     castdb.GetResourceStream(entry.Key);
                    try
                    {
                        picBox.Image.Save(Path.Combine(Application.StartupPath, Path.Combine("patterncache", pDetails.name + ".png")), System.Drawing.Imaging.ImageFormat.Png);
                    }
                    catch (Exception)
                    {
                    }

                    addToPanel(picBox);

                    cast.Close();
                    //picBox.Dispose();
                //}

                comboBox1.SelectedIndex = 15;
            }
        }
        private void btnLoadCustom_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "Sims 3 Package|*.package";
            if (openFileDialog1.ShowDialog() == DialogResult.OK && openFileDialog1.FileName != "")
            {
                Stream cast = File.Open(openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.Read);
                MadScience.Wrappers.Database castdb = new MadScience.Wrappers.Database(cast, true);

                // Open XML file
                //patternsFile cPattern = new patternsFile();
                Patterns.patternDetails pDetails = new Patterns.patternDetails();

                foreach (MadScience.Wrappers.ResourceKey key in castdb._Entries.Keys)
                {
                    if ((key.groupId == 0x00000000) && (key.typeId == 0x0333406C))
                    {
                        pDetails = Patterns.parsePatternComplate(castdb.GetResourceStream(key));
                        patternsFile cPattern = new patternsFile();

                        //MadScience.Wrappers.ResourceKey rKey = new MadScience.Wrappers.ResourceKey(pDetails.key);

                        //cPattern.typeid = rKey.typeId.ToString("X8");
                        //cPattern.groupid = rKey.groupId.ToString("X8");
                        //cPattern.instanceid = rKey.instanceId.ToString("X16");

                        cPattern.key = pDetails.key;

                        if (!StreamHelpers.isValidStream(KeyUtils.findKey("key:00B2D882:00000000:" + StringHelpers.HashFNV64(pDetails.name.Substring(pDetails.name.LastIndexOf("\\") + 1)).ToString("X16"))))
                        {
                            if (String.IsNullOrEmpty(pDetails.BackgroundImage))
                            {
                                cPattern.texturename = pDetails.rgbmask;
                            }
                            else
                            {
                                cPattern.texturename = pDetails.BackgroundImage;
                            }
                        }
                        else
                        {
                            cPattern.texturename = "key:00B2D882:00000000:" + StringHelpers.HashFNV64(pDetails.name.Substring(pDetails.name.LastIndexOf("\\") + 1)).ToString("X16");
                        }
                        cPattern.casPart = pDetails.name.Substring(pDetails.name.LastIndexOf("\\") + 1);

                        cPattern.subcategory    = openFileDialog1.FileName;
                        pDetails.customFilename = openFileDialog1.FileName;
                        cPattern.isCustom       = true;
                        pDetails.isCustom       = true;

                        customPatterns.Items.Add(cPattern);

                        TextWriter    r = new StreamWriter(Path.Combine(Application.StartupPath, Path.Combine("xml", "customPatterns.xml")));
                        XmlSerializer s = new XmlSerializer(typeof(patterns));
                        s.Serialize(r, customPatterns);
                        r.Close();

                        break;
                    }
                }

                //Stream patternThumb = KeyUtils.searchForKey("key:00B2D882:00000000:" + StringHelpers.HashFNV64(pDetails.name), openFileDialog1.FileName);
                //if (!Helpers.isValidStream(patternThumb))
                //{
                //    patternThumb = KeyUtils.searchForKey("key:00B2D882:00000000:" + StringHelpers.HashFNV64(pDetails.BackgroundImage), openFileDialog1.FileName);
                //}

                //if (Helpers.isValidStream(patternThumb))
                //{
                //Stream patternDDS = File.OpenWrite(Path.Combine(Application.StartupPath, Path.Combine("patterncache", pDetails.name + ".dds")));
                //Helpers.CopyStream(patternThumb, patternDDS, true);
                //patternDDS.Close();

                //patternThumb.Seek(0, SeekOrigin.Begin);

                PictureBox picBox = new PictureBox();
                picBox.BackColor = System.Drawing.Color.White;
                //picBox.Location = new System.Drawing.Point(horizontal, vertical);
                picBox.Name = pDetails.name;


                string  toolTip = pDetails.category + "\\";
                ToolTip tt      = new ToolTip();
                toolTip += pDetails.name;
                tt.SetToolTip(picBox, toolTip);

                picBox.Image = Patterns.makePatternThumb(pDetails, castdb);
                //picBox.Image =     castdb.GetResourceStream(entry.Key);
                try
                {
                    picBox.Image.Save(Path.Combine(Application.StartupPath, Path.Combine("patterncache", pDetails.name + ".png")), System.Drawing.Imaging.ImageFormat.Png);
                }
                catch (Exception)
                {
                }

                addToPanel(picBox);


                cast.Close();
                //picBox.Dispose();
                //}

                comboBox1.SelectedIndex = 15;
            }
        }
        private void pictureBox_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < panel1.Controls.Count; i++)
            {
                PictureBox temp2 = (PictureBox)panel1.Controls[i];
                temp2.BorderStyle = BorderStyle.None;
            }

            PictureBox temp = (PictureBox)sender;

            toolStripStatusLabel1.Text = temp.Name;
            temp.BorderStyle           = BorderStyle.Fixed3D;

            if (comboBox1.Text == "* Custom")
            {
                for (int i = 0; i < this.customPatterns.Items.Count; i++)
                {
                    patternsFile pattern = this.customPatterns.Items[i];
                    if (pattern.casPart == temp.Name)
                    {
                        toolStripStatusLabel2.Text = pattern.category;
                        if (pattern.subcategory != "" && pattern.subcategory != null && pattern.isCustom == false)
                        {
                            toolStripStatusLabel2.Text += "\\" + pattern.subcategory;
                        }

                        toolStripStatusLabel3.Text = pattern.key;
                        //toolStripStatusLabel4.Text = "key:" + pattern.typeid.ToLower() + ":" + pattern.groupid.ToLower() + ":" + pattern.instanceid.ToLower();

                        this._selectedPattern = pattern;
                        button2.Enabled       = true;



                        break;
                    }
                }
            }
            else
            {
                for (int i = 0; i < this.patterns.Items.Count; i++)
                {
                    patternsFile pattern = this.patterns.Items[i];
                    if (pattern.casPart == temp.Name)
                    {
                        toolStripStatusLabel2.Text = pattern.category;
                        if (pattern.subcategory != "")
                        {
                            toolStripStatusLabel2.Text += "\\" + pattern.subcategory;
                        }

                        toolStripStatusLabel3.Text = pattern.key;
                        //toolStripStatusLabel4.Text = "key:" + pattern.typeid.ToLower() + ":" + pattern.groupid.ToLower() + ":" + pattern.instanceid.ToLower();

                        this._selectedPattern = pattern;
                        button2.Enabled       = true;



                        break;
                    }
                }
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            TextReader    r          = new StreamReader(@"P:\Stuart\Desktop\fullPatternList.xml");
            XmlSerializer s          = new XmlSerializer(typeof(files));
            files         lookupList = (files)s.Deserialize(r);

            r.Close();

            StringBuilder sb = new StringBuilder();

            for (int i = 0; i < lookupList.Items.Count; i++)
            {
                Stream mem = File.OpenRead(@"P:\Stuart\Desktop\FullBuild0\config\xml\root\" + lookupList.Items[i].fullCasPartname + ".xml");

                Patterns.patternDetails pDetails = Patterns.parsePatternComplate(mem);

                if (String.IsNullOrEmpty(pDetails.category))
                {
                    continue;
                }

                patternsFile cPattern = new patternsFile();

                MadScience.Wrappers.ResourceKey rKey = new MadScience.Wrappers.ResourceKey("key:" + lookupList.Items[i].typeid.Remove(0, 2) + ":" + lookupList.Items[i].groupid.Remove(0, 2) + ":" + lookupList.Items[i].instanceid.Remove(0, 2));

                cPattern.key = rKey.ToString();

                if (!StreamHelpers.isValidStream(KeyUtils.findKey("key:00B2D882:00000000:" + StringHelpers.HashFNV64(pDetails.name.Substring(pDetails.name.LastIndexOf("\\") + 1)).ToString("X16"))))
                {
                    cPattern.texturename = pDetails.BackgroundImage;
                }
                else
                {
                    cPattern.texturename = "key:00B2D882:00000000:" + StringHelpers.HashFNV64(pDetails.name.Substring(pDetails.name.LastIndexOf("\\") + 1)).ToString("X16");
                }
                cPattern.casPart = pDetails.name.Substring(pDetails.name.LastIndexOf("\\") + 1);

                switch (pDetails.category)
                {
                case "Old":
                    break;

                default:
                    //string fullName = pDetails.Substring(patternTexture.LastIndexOf("\\") + 1);
                    string category = pDetails.filename;
                    category = category.Replace(@"($assetRoot)\InGame\Complates\", "");
                    category = category.Replace(@"Materials\", "");
                    category = category.Replace(@".tga", "");
                    category = category.Replace(@".dds", "");

                    if (category.IndexOf("\\") > -1)
                    {
                        category = category.Substring(0, category.IndexOf("\\"));
                    }
                    else
                    {
                        category = pDetails.category;
                    }

                    string subCategory = pDetails.filename;
                    subCategory = subCategory.Replace(@"($assetRoot)\InGame\Complates\", "");
                    subCategory = subCategory.Replace(@"Materials\", "");
                    subCategory = subCategory.Replace(@".tga", "");
                    subCategory = subCategory.Replace(@".dds", "");
                    if (subCategory.IndexOf("\\") > -1)
                    {
                        subCategory = subCategory.Substring(subCategory.IndexOf("\\") + 1);
                    }

                    if (subCategory.Contains("\\"))
                    {
                        subCategory = subCategory.Remove(subCategory.IndexOf("\\"));
                    }
                    else
                    {
                        subCategory = "";
                    }

                    if (subCategory == pDetails.name)
                    {
                        subCategory = "";
                    }

                    cPattern.category    = category;
                    cPattern.subcategory = subCategory;

                    Console.WriteLine(pDetails.name + " " + category + " " + subCategory);

                    sb.AppendLine("<pattern key=\"" + cPattern.key + "\" texturename=\"\" category=\"" + category + "\" subcategory=\"" + subCategory + "\">" + pDetails.name + "</file>");

                    break;
                }

                //xtr.Close();

                mem.Close();
            }

            Clipboard.SetText(sb.ToString());
            Console.WriteLine("Done");
        }
        /*
         * public Stream findPattern(patternsFile pattern)
         * {
         *  if (File.Exists(pattern.subcategory))
         *  {
         *      Stream cast = File.Open(pattern.subcategory, FileMode.Open, FileAccess.Read, FileShare.Read);
         *      MadScience.Wrappers.Database castdb = new MadScience.Wrappers.Database(cast, true);
         *
         *      MadScience.Wrappers.ResourceKey temp = new MadScience.Wrappers.ResourceKey(pattern.texturename);
         *      Stream patternThumb = null;
         *
         *      try
         *      {
         *          patternThumb = castdb.GetResourceStream(temp);
         *      }
         *      catch (System.Collections.Generic.KeyNotFoundException ex)
         *      {
         *      }
         *      catch (Exception ex)
         *      {
         *          Helpers.logMessageToFile(ex.Message);
         *      }
         *      cast.Close();
         *
         *      if (patternThumb != null)
         *      {
         *          return patternThumb;
         *      }
         *  }
         *
         *  return Stream.Null;
         * }
         */
        /*
         * public patternsFile findPattern(string resKey)
         * {
         *  // Get pattern details from XML
         *  keyName patternXML = new keyName(resKey);
         *  patternsFile temp = new patternsFile();
         *
         *  bool hasMatch = false;
         *
         *  for (int i = 0; i < this.customPatterns.Items.Count; i++)
         *  {
         *      patternsFile pattern = this.customPatterns.Items[i];
         *
         *      if (MadScience.StringHelpers.ParseHex32(pattern.typeid) == patternXML.typeId && MadScience.StringHelpers.ParseHex32(pattern.groupid) == patternXML.groupId && MadScience.StringHelpers.ParseHex64(pattern.instanceid) == patternXML.instanceId)
         *      {
         *          hasMatch = true;
         *          temp = pattern;
         *          break;
         *      }
         *  }
         *
         *  if (!hasMatch)
         *  {
         *      for (int i = 0; i < this.patterns.Items.Count; i++)
         *      {
         *          patternsFile pattern = this.patterns.Items[i];
         *
         *          if (MadScience.StringHelpers.ParseHex32(pattern.typeid) == patternXML.typeId && MadScience.StringHelpers.ParseHex32(pattern.groupid) == patternXML.groupId && MadScience.StringHelpers.ParseHex64(pattern.instanceid) == patternXML.instanceId)
         *          {
         *              hasMatch = true;
         *              temp = pattern;
         *              break;
         *          }
         *      }
         *  }
         *
         *  return temp;
         * }
         */
        /*
         * public Image makePatternThumb(string resKey)
         * {
         *  return makePatternThumb(findPattern(resKey), null);
         * }
         */
        /*
         * public patternsFile pDetailsTopFile(patternDetails pDetails)
         * {
         *  patternsFile pFile = new patternsFile();
         *
         *  keyName pKey = new keyName(pDetails.key);
         *  pFile.casPart = pDetails.filename;
         *  pFile.typeid = "0x" + pKey.typeId.ToString("X8");
         *  pFile.groupid = "0x" + pKey.groupId.ToString("X8");
         *  pFile.instanceid = "0x" + pKey.instanceId.ToString("X16");
         *
         *  pFile.category = pDetails.category;
         *  pFile.color0 = pDetails.ColorP[0];
         *  pFile.color1 = pDetails.ColorP[1];
         *  pFile.color2 = pDetails.ColorP[2];
         *  pFile.color3 = pDetails.ColorP[3];
         *  pFile.color4 = pDetails.ColorP[4];
         *
         *  pFile.HBg = pDetails.HBg;
         *  pFile.SBg = pDetails.SBg;
         *  pFile.VBg = pDetails.VBg;
         *
         *  return pFile;
         * }
         */

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            panel1.Controls.Clear();
            panel1.Visible = false;

            label2.Text = "Loading patterns... Please wait...";
            label2.Refresh();

            numFound   = 0;
            horizontal = 0;
            vertical   = 0;

            ToolTip tt = new ToolTip();


            DdsFileTypePlugin.DdsFile ddsP = new DdsFileTypePlugin.DdsFile();

            if (comboBox1.Text == "* Custom")
            {
                for (int i = 0; i < this.customPatterns.Items.Count; i++)
                {
                    patternsFile pattern = this.customPatterns.Items[i];
                    //if (pattern.category == comboBox1.Text)
                    //{

                    numFound++;

                    PictureBox picBox = new PictureBox();
                    picBox.BackColor = System.Drawing.Color.White;
                    picBox.Name      = pattern.casPart;

                    string toolTip = pattern.category + "\\";
                    //if (pattern.subcategory != "")
                    //{
                    //toolTip += pattern.subcategory + "\\";
                    //}
                    toolTip += pattern.casPart;
                    tt.SetToolTip(picBox, toolTip);

                    // Find thumbnail
                    if (File.Exists(Path.Combine(Application.StartupPath, Path.Combine("patterncache", pattern.casPart + ".png"))))
                    {
                        Stream tmpImage = File.OpenRead(Path.Combine(Application.StartupPath, Path.Combine("patterncache", pattern.casPart + ".png")));
                        picBox.Image = Image.FromStream(tmpImage);
                        tmpImage.Close();
                    }
                    else
                    {
                        if (File.Exists(pattern.subcategory))
                        {
                            //if (pattern.typeid.StartsWith("0x")) pattern.typeid = pattern.typeid.Remove(0, 2);
                            //if (pattern.groupid.StartsWith("0x")) pattern.groupid = pattern.groupid.Remove(0, 2);
                            //if (pattern.instanceid.StartsWith("0x")) pattern.instanceid = pattern.instanceid.Remove(0, 2);

                            Stream patternXml = KeyUtils.searchForKey(pattern.key, pattern.subcategory);
                            if (StreamHelpers.isValidStream(patternXml))
                            {
                                Patterns.patternDetails pDetails = Patterns.parsePatternComplate(patternXml);
                                //Stream patternThumb = KeyUtils.searchForKey(pattern.texturename, pattern.subcategory);
                                //if (Helpers.isValidStream(patternThumb))
                                //{
                                //picBox.Image = Patterns.makePatternThumb(patternThumb, pDetails);
                                picBox.Image = Patterns.makePatternThumb(pDetails);
                                try
                                {
                                    picBox.Image.Save(Path.Combine(Application.StartupPath, Path.Combine("patterncache", pattern.casPart + ".png")), System.Drawing.Imaging.ImageFormat.Png);
                                }
                                catch (Exception)
                                {
                                }
                                //}
                            }
                        }
                    }

                    addToPanel(picBox);
                    //}
                }
            }
            else
            {
                string s3root           = MadScience.Helpers.findSims3Root();
                string thumbnailPackage = Helpers.getGameSubPath(@"\GameData\Shared\Packages\FullBuild2.package");

                Console.WriteLine("Starting at: " + DateTime.Now.ToString());

                Stream cast = File.Open(Path.Combine(s3root, thumbnailPackage), FileMode.Open, FileAccess.Read, FileShare.Read);
                MadScience.Wrappers.Database castdb = new MadScience.Wrappers.Database(cast);

                Stream fullBuild0 = File.Open(Path.Combine(s3root, Helpers.getGameSubPath(@"\GameData\Shared\Packages\FullBuild0.package")), FileMode.Open, FileAccess.Read, FileShare.Read);
                MadScience.Wrappers.Database xmldb = new MadScience.Wrappers.Database(fullBuild0);


                for (int i = 0; i < this.patterns.Items.Count; i++)
                {
                    patternsFile pattern = this.patterns.Items[i];
                    if (pattern.category == comboBox1.Text)
                    {
                        numFound++;

                        PictureBox picBox = new PictureBox();
                        picBox.BackColor = System.Drawing.Color.White;
                        picBox.Name      = pattern.casPart;


                        string toolTip = pattern.category + "\\";
                        if (pattern.subcategory != "")
                        {
                            toolTip += pattern.subcategory + "\\";
                        }
                        toolTip += pattern.casPart;
                        tt.SetToolTip(picBox, toolTip);

                        // Find thumbnail
                        if (File.Exists(Path.Combine(Application.StartupPath, Path.Combine("patterncache", pattern.casPart + ".png"))))
                        {
                            Stream tmpImage = File.OpenRead(Path.Combine(Application.StartupPath, Path.Combine("patterncache", pattern.casPart + ".png")));
                            picBox.Image = Image.FromStream(tmpImage);
                            tmpImage.Close();
                        }
                        else
                        {
                            //Console.WriteLine(pattern.casPart);

                            Stream patternXml = KeyUtils.findKey(new MadScience.Wrappers.ResourceKey(pattern.key), 0, xmldb);
                            if (StreamHelpers.isValidStream(patternXml))
                            {
                                Patterns.patternDetails pDetails2 = Patterns.parsePatternComplate(patternXml);
                                //Stream patternThumb = KeyUtils.findKey(new MadScience.Wrappers.ResourceKey("key:00B2D882:00000000:" + StringHelpers.HashFNV64(pDetails2.name).ToString("X16")), 0, castdb);
                                //if (!Helpers.isValidStream(patternThumb))
                                //{
                                //    patternThumb = KeyUtils.findKey(new MadScience.Wrappers.ResourceKey(pDetails2.BackgroundImage), 0, castdb);
                                //}
                                //if (Helpers.isValidStream(patternThumb))
                                //{
                                picBox.Image = Patterns.makePatternThumb(pDetails2, castdb);
                                try
                                {
                                    picBox.Image.Save(Path.Combine(Application.StartupPath, Path.Combine("patterncache", pattern.casPart + ".png")), System.Drawing.Imaging.ImageFormat.Png);
                                }
                                catch (Exception)
                                {
                                }
                                //}
                            }
                        }

                        addToPanel(picBox);
                    }
                }

                Console.WriteLine("Stopping at: " + DateTime.Now.ToString());

                //dbpf = null;
                fullBuild0.Close();
                cast.Close();
                //castdb = null;
            }
            label2.Text      = numFound.ToString() + " patterns";
            panel1.Visible   = true;
            this.curCategory = comboBox1.SelectedIndex;
        }