OSDN Git Service

revise amulet search to consider of seed1 value,
[amulettoolsmh4/main.git] / amulettool.py
index 3f8d6a5..295c75d 100644 (file)
@@ -1,3 +1,4 @@
+#!/usr/bin/python
 # -*- coding: utf-8 -*-
 
 # お守りスキルのSeed特定ツールのコントロールクラス
@@ -14,9 +15,11 @@ import wx
 
 import view
 import model
+import convertcoding
 
 SETTING_FILE = u"settings"
 SETTING_THRESHOLD1 = u"threshold1"
+SETTING_THRESHOLD2 = u"threshold2"
 SETTING_SKILLS = u"skills"
 
 def _get_base_dir():
@@ -26,14 +29,16 @@ def _get_base_dir():
         basedir = sys._MEIPASS
     else:
         # we are running in a normal Python environment
-        basedir = os.path.dirname(__file__)
-    return basedir
+        #1basedir = os.path.dirname(__file__)
+        basedir = os.path.dirname(os.path.abspath(__file__))
+    return convertcoding.convert_unicode(basedir)
+
 
 class AmuletToolController(wx.App):
     u""" アプリケーションの制御クラス """
     def OnInit(self):
         self._read_settings()
-        self.frame_view = view.MainFrameView(os.path.join(_get_base_dir(), "view", view.XRC_MAIN_FRAME))
+        self.frame_view = view.MainFrameView(os.path.join(_get_base_dir(), u"view", view.XRC_MAIN_FRAME))
 
         self._init_events()
 
@@ -42,7 +47,11 @@ class AmuletToolController(wx.App):
         self.frame_view.DisableNoteBook()
 
         self._init_database()
-        self._set_views()
+        self._init_notebook_seed1()
+        self._init_notebook_seed2()
+        self._init_notebook_skill2()
+        self._init_notebook_setting()
+        self._init_notebook_amulet()
 
         self.frame_view.EnableNoteBook()
         return True
@@ -57,25 +66,6 @@ class AmuletToolController(wx.App):
         frame.Bind(wx.EVT_CLOSE, self.CloseHandler)
 
         # button event
-        frame.Bind(wx.EVT_BUTTON, self.OnClickSeedSearch, id=self.frame_view.ID_BUTTON_SEED_SEARCH)
-        frame.Bind(wx.EVT_BUTTON, self.OnClickSeedClear, id=self.frame_view.ID_BUTTON_SEED_CLEAR)
-        frame.Bind(wx.EVT_BUTTON, self.OnClickSkillSearchFromSeed, id=self.frame_view.ID_BUTTON_SKILL_FROM_SEED_SEARCH)
-        frame.Bind(wx.EVT_BUTTON, self.OnClickSkillSearch, id=self.frame_view.ID_BUTTON_SKILL_SEARCH)
-        frame.Bind(wx.EVT_BUTTON, self.OnClickSkillClear, id=self.frame_view.ID_BUTTON_SKILL_CLEAR)
-        frame.Bind(wx.EVT_BUTTON, self.OnClickAmuletSearch, id=self.frame_view.ID_BUTTON_AMULET_SEARCH_SEARCH)
-        frame.Bind(wx.EVT_BUTTON, self.OnClickAmuletClear, id=self.frame_view.ID_BUTTON_AMULET_SEARCH_CLEAR)
-        frame.Bind(wx.EVT_BUTTON, self.OnClickSkillSearchFromAmulet, id=self.frame_view.ID_BUTTON_AMULET_SEARCH_SKILL)
-        frame.Bind(wx.EVT_BUTTON, self.OnClickSettingOK, id=self.frame_view.ID_BUTTON_SETTING_OK)
-        frame.Bind(wx.EVT_BUTTON, self.OnClickSettingClear, id=self.frame_view.ID_BUTTON_SETTING_CLEAR)
-
-        # radio button event
-        frame.Bind(wx.EVT_RADIOBUTTON, self.OnClickAmuletRadio, id=self.frame_view.ID_RADIO_BUTTON_AMULET1)
-        frame.Bind(wx.EVT_RADIOBUTTON, self.OnClickAmuletRadio, id=self.frame_view.ID_RADIO_BUTTON_AMULET2)
-        frame.Bind(wx.EVT_RADIOBUTTON, self.OnClickAmuletRadio, id=self.frame_view.ID_RADIO_BUTTON_AMULET3)
-
-        # combo box event
-        frame.Bind(wx.EVT_COMBOBOX, self.OnClickAmuletCombo, id=self.frame_view.ID_COMBO_BOX_AMULET_SEARCH_SKILL1)
-        frame.Bind(wx.EVT_COMBOBOX, self.OnClickAmuletCombo, id=self.frame_view.ID_COMBO_BOX_AMULET_SEARCH_SKILL2)
 
     def _init_database(self):
         u""" DBの初期設定 """
@@ -87,7 +77,7 @@ class AmuletToolController(wx.App):
                 generator = model.DataBaseGenerator(model.DB_FILE_NAME)
                 #generator = model.DataBaseGenerator()
 
-                dlg_view = view.GaugeDialogView(os.path.join(_get_base_dir(), "view", view.XRC_GAUGE_DIALOG))
+                dlg_view = view.GaugeDialogView(os.path.join(_get_base_dir(), u"view", view.XRC_GAUGE_DIALOG))
                 def _loop():
                     while t1.is_alive():
                         dlg_view.gauge.Pulse()
@@ -120,68 +110,71 @@ class AmuletToolController(wx.App):
             self._amulet_id2skill1_id_dict,
             self._amulet_id2skill2_id_dict) = self.db_accessor.get_dicts()
 
-
-    def _set_views(self):
-        u""" GUIにDBの各種値をセットする """
-        self._set_combo_views()
-        self._set_spin_views()
-        self._set_check_list_views()
-
-    def _set_combo_views(self):
-        u""" ComboBoxの値をセットする """
-        combo_dict = self.frame_view.combo_box_skill_dict
+    def _init_notebook_seed1(self):
+        u""" Seed1特定タブのviewの初期化 """
+        self.notebook_seed1_view = self.frame_view.notebook_seed1_view
+        self.notebook_seed1_view.bind_button_search(self.OnClickSeed1Search)
+        self.notebook_seed1_view.bind_button_clear(self.OnClickSeed1Clear)
+
+        u" 各種お守りの第1スキル選択のセット "
+        amu_names, name2skill1s = [], {}
+        for amu_id in sorted(self._amulet_id2name_dict.keys()):
+            name = self._amulet_id2name_dict[amu_id]
+            amu_names.append(name)
+            name2skill1s[name] = [self._skill_id2name_dict[skill_id]
+                    for skill_id in self._amulet_id2skill1_id_dict[amu_id]]
+        self.notebook_seed1_view.set_amuletname_skillnames_dict(amu_names, name2skill1s)
+
+    def _init_notebook_seed2(self):
+        u""" Seed2特定タブのviewの初期化 """
+        self.notebook_seed2_view = self.frame_view.notebook_seed2_view
+        self.notebook_seed2_view.bind_button_search(self.OnClickSeed2Search)
+        self.notebook_seed2_view.bind_button_clear(self.OnClickSeed2Clear)
+        self.notebook_seed2_view.bind_button_skill2(self.OnClickSkill2SearchFromSeed2)
 
         u" 各種お守りの第2スキル選択 "
         for amu_key, amu_name in zip([view.KEY_AMULET1, view.KEY_AMULET2, view.KEY_AMULET3], 
                 [view.NAME_AMULET1, view.NAME_AMULET2, view.NAME_AMULET3]):
             amu_id = self._amulet_name2id_dict[amu_name]
             skill_ids = self._amulet_id2skill2_id_dict[amu_id]
-            skill_names = [self._skill_id2name_dict[x] for x in skill_ids]
-            for combo in combo_dict[amu_key]:
-                combo.Clear()
-                combo.Append(view.VAL_NO_SKILL)
-                for name in skill_names:
-                    combo.Append(name)
-                combo.SetSelection(0)
-
-        # amulet search
-        amu_id = self._amulet_name2id_dict[view.NAME_AMULET1]
-        self._set_skill_list_from_amulet(amu_id)
-        self.frame_view.amulet2radio_button_dict[view.NAME_AMULET1].SetValue(True)
-
-    def _set_skill_list_from_amulet(self, amulet_id):
-        u""" お守り種類の選択が変わった時の動作 """
-        for i, (combo, skill_dict) in enumerate(zip(
-                [self.frame_view.combo_box_amulet_search_skill1, 
-                    self.frame_view.combo_box_amulet_search_skill2], 
-                [self._amulet_id2skill1_id_dict, self._amulet_id2skill2_id_dict]
-                )):
-            skill_ids = skill_dict[amulet_id]
-            combo.Clear()
-            if i == 1:
-                combo.Append(view.VAL_NO_SKILL)
-            else:
-                skill1_selected = skill_ids[0]
-            for skill_id in skill_ids:
-                combo.Append(self._skill_id2name_dict[skill_id])
-            combo.SetSelection(0)   # combo1 = skill1, combo2 = No Skill
-        self._set_spin_range(amulet_id, skill1_selected, None)
-
-    def _set_spin_views(self):
-        u""" Spin Ctrlの最大最小をセット"""
-        min1, max1, min2, max2 = self.db_accessor.get_skill_minmax()
-        self.frame_view.spin_ctrl_amulet_search_slot_num.SetRange(view.SLOT_MIN, view.SLOT_MAX)
-        self.frame_view.spin_ctrl_highlight.SetRange(view.THRESHOLD1_MIN, view.THRESHOLD1_MAX)
-        self.frame_view.spin_ctrl_highlight.SetValue(self._highlight_threshold1)
-
-    def _set_check_list_views(self):
-        u""" CheckListBoxの値のセット """
-        checklist = self.frame_view.check_list_box_highlight_skill
-        checklist.SetItems(self._skill_name2id_dict.keys())
-        checklist.SetCheckedStrings([self._skill_id2name_dict[x] for x in self._highlight_skills])
-
-    def _set_spin_range(self, amulet_id, skill1_id, skill2_id):
-        u""" スキルに応じてSpinCtrlの最大最小をセットする """
+            skill_names = [view.VAL_NO_SKILL] + [self._skill_id2name_dict[x] for x in skill_ids]
+            self.notebook_seed2_view.set_skill_names(amu_key, skill_names)
+        self.notebook_seed2_view.set_skill_selected_idx(0)
+
+    def _init_notebook_skill2(self):
+        u""" Seed2によるSkill2一覧タブのviewの初期化 """
+        self.notebook_skill2_view = self.frame_view.notebook_skill2_view
+        self.notebook_skill2_view.bind_button_search(self.OnClickSkillSearch)
+        self.notebook_skill2_view.bind_button_clear(self.OnClickSkillClear)
+
+    def _update_notebook_amulet(self, amulet_id=None):
+        u""" お守り検索タブのviewの更新
+        amulet_id が Noneでない場合、お守りの種類に応じてComboboxを再設定する
+        また、選択中のスキルに応じて最大最小を設定する"""
+        #min1, max1, min2, max2 = self.db_accessor.get_skill_minmax()
+        #self.notebook_amulet_view.set_skill_minmax(min1, max1, min2, max2)
+
+        if amulet_id is not None:
+            for i, skill_dict in enumerate([self._amulet_id2skill1_id_dict, self._amulet_id2skill2_id_dict]):
+                skill_ids = skill_dict[amulet_id]
+                skill_names = [self._skill_id2name_dict[_id] for _id in skill_ids]
+                if i == 0:
+                    self.notebook_amulet_view.set_items_skill1_combobox(skill_names)
+                    skill1_selected = skill_ids[0]
+                    self.notebook_amulet_view.set_selection_skill1_combobox(0)
+                elif i == 1:
+                    self.notebook_amulet_view.set_items_skill2_combobox([view.VAL_NO_SKILL] + skill_names)
+                    self.notebook_amulet_view.set_selection_skill2_combobox(0)  # select No Skill
+        else:
+            amulet_name = self.notebook_amulet_view.get_selected_amulet()
+            amulet_id = self._amulet_name2id_dict[amulet_name]
+
+        # settting min max
+        skill1_str = self.notebook_amulet_view.get_string_selection_skill1_combobox()
+        skill2_str = self.notebook_amulet_view.get_string_selection_skill2_combobox()
+        skill1_id = self._skill_name2id_dict[skill1_str] if skill1_str in self._skill_name2id_dict else None
+        skill2_id = self._skill_name2id_dict[skill2_str] if skill2_str in self._skill_name2id_dict else None
+
         if skill2_id is None:
             minmax_dict = self.db_accessor.select_minmax_from_skill_ids(amulet_id, [skill1_id])
             min1, max1 = minmax_dict[skill1_id][0], minmax_dict[skill1_id][1]
@@ -190,134 +183,241 @@ class AmuletToolController(wx.App):
             minmax_dict = self.db_accessor.select_minmax_from_skill_ids(amulet_id, [skill1_id, skill2_id])
             min1, max1 = minmax_dict[skill1_id][0], minmax_dict[skill1_id][1]
             min2, max2 = minmax_dict[skill2_id][2], minmax_dict[skill2_id][3]
-        self.frame_view.spin_ctrl_amulet_search_skill1_val.SetRange(min1, max1)
-        self.frame_view.spin_ctrl_amulet_search_skill2_val.SetRange(min2, max2)
+        self.notebook_amulet_view.set_skill_minmax(min1, max1, min2, max2)
+
+    def _update_notebook_amulet_seed2s(self):
+        u"""お守り検索タブのSeed2リストを更新する"""
+        threshold_type = self.notebook_amulet_view.get_selected_threshold_type()
+        if threshold_type == view.THRESHOLD_TYPE_ALL:
+            include_th1, include_th2, include_ini = True, True, True
+        elif threshold_type == view.THRESHOLD_TYPE_THRESHOLD1:
+            include_th1, include_th2, include_ini = True, False, False
+        elif threshold_type == view.THRESHOLD_TYPE_THRESHOLD2:
+            include_th1, include_th2, include_ini = False, True, False
+        elif threshold_type == view.THRESHOLD_TYPE_INISHIE:
+            include_th1, include_th2, include_ini = False, False, True
+
+        set_items_dict = {}
+        seed2_set = self.threshold1_seed2_set | self.threshold2_seed2_set | self.threshold_inishie_set
+        for seed2 in seed2_set:
+            type_set, include = [], False
+            if seed2 in self.threshold1_seed2_set:
+                type_set.append(u"判定値1")
+                if include_th1:
+                    include = True
+            if seed2 in self.threshold2_seed2_set:
+                type_set.append(u"判定値2")
+                if include_th2:
+                    include = True
+            if seed2 in self.threshold_inishie_set: # seed in inishie_set
+                type_set.append(u"いにしえ")
+                if include_ini:
+                    include = True
+            if include:
+                if seed2 in self.seed2_tenun_num_dict:
+                    tenun555_num, tenun888_num = self.seed2_tenun_num_dict[seed2]
+                else:
+                    tenun555_num, tenun888_num = 0, 0
+                set_items_dict[seed2] = (u",".join(type_set), tenun555_num, tenun888_num)
 
-    def OnClickSeedSearch(self, evt):
-        u""" search seeds from selected skills """
+        self.notebook_amulet_view.set_grid_seed2s_items(set_items_dict)
+        if len(set_items_dict) > 0:
+            self.notebook_amulet_view.set_grid_seed2s_selected_idx(0)
+            self.notebook_amulet_view.set_skill_button_enable(True)
+        else:
+            self.notebook_amulet_view.set_skill_button_enable(False)
+
+    def _init_notebook_amulet(self):
+        u""" お守り検索タブの初期設定 """
+        self.notebook_amulet_view = self.frame_view.notebook_amulet_view
+        self.notebook_amulet_view.bind_radiobox_amulet(self.OnClickAmuletRadioAmulet)
+        self.notebook_amulet_view.bind_radiobox_threshold_type(self.OnClickAmuletRadioThresholdType)
+        self.notebook_amulet_view.bind_combobox(self.OnClickAmuletCombo)
+        self.notebook_amulet_view.bind_button_search(self.OnClickAmuletSearch)
+        self.notebook_amulet_view.bind_button_clear(self.OnClickAmuletClear)
+        self.notebook_amulet_view.bind_button_skill(self.OnClickSkillSearchFromAmulet)
+
+        amu_id = self._amulet_name2id_dict[view.NAME_AMULET1]
+        self.notebook_amulet_view.set_radio_value(True, view.NAME_AMULET1)
+        self._update_notebook_amulet(amu_id)
+
+        self.threshold1_seed2_set, self.threshold2_seed2_set, self.threshold_inishie_set = set(), set(), set()
+        self.seed2_tenun_num_dict = {}
+        self._amulet_values = None
+
+    def _init_notebook_setting(self):
+        u""" 設定タブの初期設定 """
+        self.notebook_setting_view = self.frame_view.notebook_setting_view
+        self.notebook_setting_view.bind_button_ok(self.OnClickSettingOK)
+        self.notebook_setting_view.bind_button_clear(self.OnClickSettingClear)
+        self.notebook_setting_view.set_skill_strings(self._skill_name2id_dict.keys())
+        self._update_notebook_setting()
+
+    def _update_notebook_setting(self):
+        u"""設定タブの値更新"""
+        self.notebook_setting_view.set_threshold(self._highlight_threshold1, 
+                self._highlight_threshold2)
+        self.notebook_setting_view.set_checked_strings([self._skill_id2name_dict[x] for x in self._highlight_skills])
+
+    def _update_highlight(self):
+        u""" update highlight cells """
+        skill_names = [self._skill_id2name_dict[x] for x in self._highlight_skills]
+        self.notebook_skill2_view.set_skill2_highlight(
+                skill_names, self._highlight_threshold1, self._highlight_threshold2)
+        self.notebook_seed1_view.update_highlight(skill_names)
+
+    u""" Seed1 view's event"""
+    def OnClickSeed1Search(self, evt):
+        u""" search seed1s from selected skill1s """
+        tenun_key = self.notebook_seed1_view.get_tenun_radio_key()
+        amu_skill_name_list = self.notebook_seed1_view.get_selected_amulets_and_names()
+        if tenun_key == view.KEY_TENUN555:
+            tenun_key = model.KEY_TENUN555
+        elif tenun_key == view.KEY_TENUN888:
+            tenun_key = model.KEY_TENUN888
+        else:
+            raise KeyError(u"key '{0}' not found in TENUN KEYS".format(tenun_key))
+        amu_skill_id_list = [(self._amulet_name2id_dict[x], self._skill_name2id_dict[y]) for x, y in amu_skill_name_list]
+        seed1s = self.db_accessor.select_seed1s_tenun(amu_skill_id_list, tenun_key)
+        if len(seed1s) == 0:
+            self.notebook_seed1_view.set_text_result(u"条件に一致するSeed1は見つかりません")
+            self.notebook_seed1_view.clear_seed1_grid()
+        elif len(seed1s) == 1:
+            seed1 = [x for x in seed1s][0]
+            table_no, no = self.db_accessor.select_table_nos_from_seed1(seed1s, tenun_key)[seed1]
+            self.notebook_seed1_view.set_text_result(
+                    u"Seed1: {0}, テーブルNo: {1}, 通し番号: {2}".format(seed1, table_no, no))
+            # list of (no, seed1)
+            near_num = view.NEAR_SEED1_NUMBERS
+            no_seed1_list = self.db_accessor.select_near_seed1s_from_seed1(
+                    seed1, near_num, near_num, tenun_key)
+            seed1_list = [x[1] for x in no_seed1_list]
+
+            # seed1 -> (no, table_no, result_num, amu_ids, skill_id2)
+            result_dict = self.db_accessor.select_all_from_seed1s(seed1_list, tenun_key)
+            for key, val in result_dict.items():
+                _no, _table_no, _result_num, _amu_ids, _skill_ids = val
+                _amu_names = [self._amulet_id2name_dict[x] 
+                        if x in self._amulet_id2name_dict else None for x in _amu_ids]
+                _skill_names = [self._skill_id2name_dict[x] 
+                        if x in self._skill_id2name_dict else None for x in _skill_ids]
+                result_dict[key] = (_no, _table_no, _result_num, _amu_names, _skill_names)
+            self.notebook_seed1_view.set_seed1_dict(result_dict, seed1)
+            skill_names = [self._skill_id2name_dict[x] for x in self._highlight_skills]
+            self.notebook_seed1_view.update_highlight(skill_names)
+        else:
+            self.notebook_seed1_view.set_text_result(
+                    u"Seed1は{0}件あります。条件を絞ってください".format(len(seed1s)))
+            self.notebook_seed1_view.clear_seed1_grid()
+
+    def OnClickSeed1Clear(self, evt):
+        u""" clear seed1s from selected skill1s """
+        self.notebook_seed1_view.clear_combobox()
+        self.notebook_seed1_view.clear_seed1_grid()
+        self.notebook_seed1_view.clear_text_result()
+
+    u""" Seed2 view's event """
+    def OnClickSeed2Search(self, evt):
+        u""" search seed2s from selected skill2s """
         amu_id2skill_id_list_dict = {}
         for amu_key, amu_name in zip([view.KEY_AMULET1, view.KEY_AMULET2, view.KEY_AMULET3], 
                 [view.NAME_AMULET1, view.NAME_AMULET2, view.NAME_AMULET3]):
             amu_id = self._amulet_name2id_dict[amu_name]
-            ls = []
-            for combo in self.frame_view.combo_box_skill_dict[amu_key]:
-                name = combo.GetStringSelection()
-                if name not in self._skill_name2id_dict:
-                    ls.append(None)
-                else:
-                    ls.append(self._skill_name2id_dict[name])
+            names = self.notebook_seed2_view.get_selected_skill_names(amu_key)
+            ls = [self._skill_name2id_dict[name] if name in self._skill_name2id_dict else None 
+                    for name in names]
             amu_id2skill_id_list_dict[amu_id] = ls
-        seed_sets = self.db_accessor.select_seeds(amu_id2skill_id_list_dict)
-        self.frame_view.text_ctrl_seed_result.SetValue(u"""Seedの候補は{0}個です。""".format(len(seed_sets)))
+        seed_sets = self.db_accessor.select_seed2s(amu_id2skill_id_list_dict)
+        self.notebook_seed2_view.set_result_text(u"""Seedの候補は{0}個です。""".format(len(seed_sets)))
 
-        self.frame_view.list_box_seed.Clear()
         if len(seed_sets) > 0:
-            for seed in seed_sets:
-                self.frame_view.list_box_seed.Append(u"{0}".format(seed))
-            self.frame_view.list_box_seed.SetSelection(0)
-            self.frame_view.button_skill_from_seed_search.Enable()
-
-    def OnClickSeedClear(self, evt):
-        u""" reset seed search settings of combo box"""
-        combo_dict = self.frame_view.combo_box_skill_dict
-        for amu_key in [view.KEY_AMULET1, view.KEY_AMULET2, view.KEY_AMULET3]:
-            for combo in combo_dict[amu_key]:
-                combo.SetSelection(0)
-        self.frame_view.button_skill_from_seed_search.Disable()
-        self.frame_view.list_box_seed.Clear()
-
-    def OnClickSkillSearchFromSeed(self, evt):
-        u""" change page to skill search from seed"""
-        seed = self.frame_view.list_box_seed.GetStringSelection()
-        if seed.isdigit():
-            self.frame_view.text_ctrl_seed_select.SetValue(seed)
+            self.notebook_seed2_view.set_seed_lists([u"{0:06d}".format(seed) for seed in seed_sets])
+            self.notebook_seed2_view.set_skill2_button_enable(True)
+        else:
+            self.notebook_seed2_view.clear_seed_list()
+            self.notebook_seed2_view.set_skill2_button_enable(False)
+
+    def OnClickSeed2Clear(self, evt):
+        u""" reset seed2 search settings of combo box"""
+        self.notebook_seed2_view.set_skill_selected_idx(0)
+        self.notebook_seed2_view.clear_seed_list()
+        self.notebook_seed2_view.set_result_text(u"")
+        self.notebook_seed2_view.set_skill2_button_enable(False)
+
+    def OnClickSkill2SearchFromSeed2(self, evt):
+        u""" change page to skill2 search from seed2"""
+        seed2 = self.notebook_seed2_view.get_selected_seed2()
+        if seed2 is not None:
+            self.notebook_skill2_view.set_seed2_value(seed2)
             self.frame_view.note_book.SetSelection(view.SKILL_SEARCH_PAGE)
             self.OnClickSkillSearch(evt)
 
+    u""" Skill2 search from Seed2's event """
     def OnClickSkillSearch(self, evt):
-        u""" skill search from seed"""
-        seed = self.frame_view.text_ctrl_seed_select.GetValue()
-        if seed.isdigit():
-            seed = int(seed)
-            skill_dict, threshold1_dict = self.db_accessor.select_skills_from_seeds([seed])
-
+        u""" skill search from seed2"""
+        seed2 = self.notebook_skill2_view.get_seed2_value()
+        if seed2 is not None:
+            skill_dict, threshold1_dict, threshold2_dict = self.db_accessor.select_skill2s_from_seed2s([seed2])
             try:
-                text_ctrl_dict = self.frame_view.text_ctrl_seed_skill_dict
                 for amu_key, amu_name in zip([view.KEY_AMULET1, view.KEY_AMULET2, view.KEY_AMULET3], 
-                    [view.NAME_AMULET1, view.NAME_AMULET2, view.NAME_AMULET3]):
+                        [view.NAME_AMULET1, view.NAME_AMULET2, view.NAME_AMULET3]):
                     amu_id = self._amulet_name2id_dict[amu_name]
-                    for txt_ctr, skill_id in zip(text_ctrl_dict[amu_key], skill_dict[amu_id][seed]):
-                        txt_ctr.SetValue(self._skill_id2name_dict[skill_id])
-                for txt_ctr, threshold1 in zip(text_ctrl_dict[view.KEY_THRESHOLD1], threshold1_dict[seed]):
-                    txt_ctr.SetValue(u"{0}".format(threshold1))
-                self._update_highlight()
-
+                    skill_names = [self._skill_id2name_dict[x] for x in skill_dict[amu_id][seed2]]
+                    self.notebook_skill2_view.set_skill2_by_col_key(amu_key, skill_names)
+                th_vals = [u"{0}".format(x) for x in threshold1_dict[seed2]]
+                self.notebook_skill2_view.set_skill2_by_col_key(view.KEY_THRESHOLD1, th_vals)
+                th_vals = [u"{0}".format(x) for x in threshold2_dict[seed2]]
+                self.notebook_skill2_view.set_skill2_by_col_key(view.KEY_THRESHOLD2, th_vals)
+                #inishie
+                skill_id, th1, th2 = self.db_accessor.select_inishie_skill2_from_seed2([seed2])[seed2]
+                self.notebook_skill2_view.set_inishie(self._skill_id2name_dict[skill_id], th1, th2)
+                # explanation
+                table_no, no = self.db_accessor.select_table_nos_from_seed2([seed2])[seed2]
+                self.notebook_skill2_view.set_result_text(
+                        u"SEED2:{2}は通し番号{1}、テーブルNo{0}です".format(table_no, no, seed2))
             except KeyError, e:
                 self._show_message_dialog(message=u"指定されたSeed値は存在しません")
+            finally:
+                self._update_highlight()
+
         else:
             self._show_message_dialog(message=u"Seed値には数字を入力してください")
 
     def OnClickSkillClear(self, evt):
         u""" clear skills from seed """
-        text_ctrl_dict = self.frame_view.text_ctrl_seed_skill_dict
-        for amu_key, amu_name in zip([view.KEY_AMULET1, view.KEY_AMULET2, view.KEY_AMULET3], 
-            [view.NAME_AMULET1, view.NAME_AMULET2, view.NAME_AMULET3]):
-            amu_id = self._amulet_name2id_dict[amu_name]
-            for txt_ctr in text_ctrl_dict[amu_key]:
-                txt_ctr.Clear()
-        for txt_ctr in text_ctrl_dict[view.KEY_THRESHOLD1]:
-            txt_ctr.Clear()
-        self.frame_view.list_box_seed_skill_amulet_prospect.Clear() 
-
-    def OnClickAmuletRadio(self, evt):
+        self.notebook_skill2_view.clear_skill2_grid()
+        self.notebook_skill2_view.clear_skill2_highlight()
+        self.notebook_skill2_view.clear_items_amulet_prospects()
+        self.notebook_skill2_view.clear_result_text()
+        self.notebook_skill2_view.clear_inishie()
+
+    u""" amulet search event """
+    def OnClickAmuletRadioAmulet(self, evt):
         u""" switch skill lists by amulet id """
-        btn_id = evt.GetId()
-        if btn_id == self.frame_view.ID_RADIO_BUTTON_AMULET1:
-            amu_id = self._amulet_name2id_dict[view.NAME_AMULET1]
-        elif btn_id == self.frame_view.ID_RADIO_BUTTON_AMULET2:
-            amu_id = self._amulet_name2id_dict[view.NAME_AMULET2]
-        elif btn_id == self.frame_view.ID_RADIO_BUTTON_AMULET3:
-            amu_id = self._amulet_name2id_dict[view.NAME_AMULET3]
-        else:
-            return
-        self._set_skill_list_from_amulet(amu_id)
+        #btn_id = evt.GetId()
+        amulet_name = self.notebook_amulet_view.get_selected_amulet()
+        amu_id = self._amulet_name2id_dict[amulet_name]
+        self._update_notebook_amulet(amu_id)
+        self.notebook_amulet_view.set_result_text_ctrl_value(u"")
+        self.notebook_amulet_view.set_skill_button_enable(False)
+        self.notebook_amulet_view.clear_grid()
+
+    def OnClickAmuletRadioThresholdType(self, evt):
+        u""" switch seed lists by threshold_type """
+        self._update_notebook_amulet_seed2s()
 
     def OnClickAmuletCombo(self, evt):
         u""" switch skill minmax by amulet id and skill_id"""
-        skill1_name = self.frame_view.combo_box_amulet_search_skill1.GetStringSelection()
-        skill2_name = self.frame_view.combo_box_amulet_search_skill2.GetStringSelection()
-        skill1_id = self._skill_name2id_dict[skill1_name]
-        if skill2_name in self._skill_name2id_dict:
-            skill2_id = self._skill_name2id_dict[skill2_name]
-        else:
-            skill2_id = None
-        if self.frame_view.amulet2radio_button_dict[view.NAME_AMULET1].GetValue():
-            amu_id = self._amulet_name2id_dict[view.NAME_AMULET1]
-        elif self.frame_view.amulet2radio_button_dict[view.NAME_AMULET2].GetValue():
-            amu_id = self._amulet_name2id_dict[view.NAME_AMULET2]
-        elif self.frame_view.amulet2radio_button_dict[view.NAME_AMULET3].GetValue():
-            amu_id = self._amulet_name2id_dict[view.NAME_AMULET3]
-        else:
-            raise IndexError(u"amulet id is unknown")
-        self._set_spin_range(amu_id, skill1_id, skill2_id)
+        self._update_notebook_amulet()
 
     def OnClickAmuletSearch(self, evt):
         u""" search seeds from amulet condition """
-        skill1_name = self.frame_view.combo_box_amulet_search_skill1.GetStringSelection()
-        skill2_name = self.frame_view.combo_box_amulet_search_skill2.GetStringSelection()
-        skill1_val = self.frame_view.spin_ctrl_amulet_search_skill1_val.GetValue()
-        skill2_val = self.frame_view.spin_ctrl_amulet_search_skill2_val.GetValue()
-        slot_val = self.frame_view.spin_ctrl_amulet_search_slot_num.GetValue()
-        if self.frame_view.amulet2radio_button_dict[view.NAME_AMULET1].GetValue():
-            amu_id = self._amulet_name2id_dict[view.NAME_AMULET1]
-        elif self.frame_view.amulet2radio_button_dict[view.NAME_AMULET2].GetValue():
-            amu_id = self._amulet_name2id_dict[view.NAME_AMULET2]
-        elif self.frame_view.amulet2radio_button_dict[view.NAME_AMULET3].GetValue():
-            amu_id = self._amulet_name2id_dict[view.NAME_AMULET3]
-        else:
-            raise IndexError(u"amulet id is unknown")
+        skill1_name, skill2_name = self.notebook_amulet_view.get_string_selection_skill_names()
+        skill1_val, skill2_val = self.notebook_amulet_view.get_skill_values()
+        slot_val = self.notebook_amulet_view.get_slot_value()
+        amulet_name = self.notebook_amulet_view.get_selected_amulet()
+        amu_id = self._amulet_name2id_dict[amulet_name]
 
-        list_box = self.frame_view.list_box_amulet_search_seeds
         if skill1_name == skill2_name:
             self._show_message_dialog(message=u"異なるスキルを選択してください")
         elif skill1_val == 0:
@@ -333,78 +433,88 @@ class AmuletToolController(wx.App):
                 amu_id, skill1_id, skill2_id, skill1_val, skill2_val)
             if tup is not None:
                 suff_val = tup[0]
-                seeds_set = self.db_accessor.select_seeds_from_sufficient_val(amu_id, suff_val, slot_val, skill2_id)
-                if len(seeds_set) > 0:
-                    self.frame_view.text_ctrl_amulet_search_result.SetValue(
-                        u"{0}個のSeedで出現するお守りです".format(len(seeds_set)))
-                    list_box.Clear()
-                    for seed in seeds_set:
-                        list_box.Append(u"{0}".format(seed))
-                    list_box.SetSelection(0)
-                    self.frame_view.button_amulet_search_skill.Enable()
+                (threshold, self.threshold1_seed2_set, self.threshold2_seed2_set, 
+                    self.threshold_inishie_set) = self.db_accessor.select_seed2s_from_sufficient_val(
+                        amu_id, suff_val, slot_val, skill2_id)
+                seed2_set = self.threshold1_seed2_set | self.threshold2_seed2_set
+
+                # filter seed2s by skill1_id
+                filtered_seed2_dict = {} # seeds -> (num555, num888)
+                for seed2 in seed2_set:
+                    places = self.db_accessor.select_skill2_place(amu_id, seed2, skill2_id)
+                    num_555, num_888 = self.db_accessor.count_seed1s_from_skill_place(skill1_id, places, amu_id)
+                    if num_555 > 0 or num_888 > 0:
+                        filtered_seed2_dict[seed2] = (num_555, num_888)
+                seed2_set = set(filtered_seed2_dict.keys())
+                self.seed2_tenun_num_dict = filtered_seed2_dict
+                self.threshold1_seed2_set = seed2_set & self.threshold1_seed2_set
+                self.threshold2_seed2_set = seed2_set & self.threshold2_seed2_set
+                u""" self.threshold_inishie_set についてはSeed1との対応が不明なのでそのまま使用する"""
+
+                self._amulet_values = (skill1_id, skill2_id, skill1_val, skill2_val)
+                self._update_notebook_amulet_seed2s()
+                if len(seed2_set) > 0:
+                    self.notebook_amulet_view.set_result_text_ctrl_value(
+u"""指定されたお守りの充足値:\t{0}
+必要な判定値:\t{1}\n判定値1:\t{2}個のSeed2で出現\n判定値2:\t{3}個のSeed2で出現\nいにしえ:\t{4}個のSeed2で出現
+判定値1,2:\t{5}個のSeed2で出現""".format(
+                            suff_val, threshold, len(self.threshold1_seed2_set), len(self.threshold2_seed2_set), len(self.threshold_inishie_set), len(seed2_set)))
                 else:
-                    self.frame_view.text_ctrl_amulet_search_result.SetValue(
-                        u"指定されたお守りは見つかりませんでした")
-                    self.frame_view.button_amulet_search_skill.Disable()
-                    list_box.Clear()
+                    self.threshold1_seed2_set, self.threshold2_seed2_set, self.threshold_inishie_set = set(), set(), set()
+                    self.notebook_amulet_view.set_result_text_ctrl_value(
+u"""指定されたお守りの充足値:\t{0}\n必要な判定値:\t{1}
+指定されたお守りは見つかりませんでした""".format(suff_val, threshold))
+                    self.notebook_amulet_view.set_skill_button_enable(False)
+                    self.notebook_amulet_view.clear_grid()
+                    self._amulet_values = None
+                    self.seed2_tenun_num_dict = {}
             else:
-                self.frame_view.text_ctrl_amulet_search_result.SetValue(
-                    u"指定されたお守りは見つかりませんでした")
-                self.frame_view.button_amulet_search_skill.Disable()
-                list_box.Clear()
+                self.threshold1_seed2_set, self.threshold2_seed2_set, self.threshold_inishie_set = set(), set(), set()
+                self.notebook_amulet_view.set_result_text_ctrl_value(
+                    u"エラー。充足値が計算できません")
+                self.notebook_amulet_view.set_skill_button_enable(False)
+                self.notebook_amulet_view.clear_grid()
+                self._amulet_values = None
+                self.seed2_tenun_num_dict = {}
 
     def OnClickAmuletClear(self, evt):
         u""" clear amulet conditions """
+        self.threshold1_seed2_set, self.threshold2_seed2_set, self.threshold_inishie_set = set(), set(), set()
+        self._amulet_values = None
+        self.seed2_tenun_num_dict = {}
+        self.notebook_amulet_view.set_radio_value(True, view.NAME_AMULET1)
         amu_id = self._amulet_name2id_dict[view.NAME_AMULET1]
-        self._set_skill_list_from_amulet(amu_id)
-        self.frame_view.amulet2radio_button_dict[view.NAME_AMULET1].SetValue(True)
-        self.frame_view.button_amulet_search_skill.Disable()
-        self.frame_view.text_ctrl_amulet_search_result.SetValue(u"")
-        self.frame_view.list_box_amulet_search_seeds.Clear()
+        self._update_notebook_amulet(amu_id)
+        self.notebook_amulet_view.set_skill_button_enable(False)
+        self.notebook_amulet_view.set_result_text_ctrl_value(u"")
+        self.notebook_amulet_view.clear_grid()
 
     def OnClickSkillSearchFromAmulet(self, evt):
         u""" change page to skill search from amulet"""
-        seed = self.frame_view.list_box_amulet_search_seeds.GetStringSelection()
-        if seed.isdigit():
-            self.frame_view.text_ctrl_seed_select.SetValue(seed)
+        seed = self.notebook_amulet_view.get_grid_selected_seed2()
+        if seed is not None:
+            self.notebook_skill2_view.set_seed2_value(seed)
             self.frame_view.note_book.SetSelection(view.SKILL_SEARCH_PAGE)
             self.OnClickSkillSearch(evt)
 
+    u""" settings' event """
     def OnClickSettingOK(self, evt):
         u""" get settings of setting tab """
-        self._highlight_threshold1 = self.frame_view.spin_ctrl_highlight.GetValue()
+        (self._highlight_threshold1, 
+                self._highlight_threshold2) = self.frame_view.notebook_setting_view.get_threshold()
         self._highlight_skills = set([self._skill_name2id_dict[x] for x in 
-                self.frame_view.check_list_box_highlight_skill.GetCheckedStrings()
+                self.frame_view.notebook_setting_view.get_checked_strings()
                 if x in self._skill_name2id_dict])
         self._update_highlight()
 
     def OnClickSettingClear(self, evt):
         u""" reset settings of setting tab """
         self._highlight_threshold1 = view.HIGHLIGHT_THRESHOLD1
-        self.frame_view.spin_ctrl_highlight.SetValue(view.HIGHLIGHT_THRESHOLD1)
+        self._highlight_threshold2 = view.HIGHLIGHT_THRESHOLD2
         self._highlight_skills = set()
-        for idx in self.frame_view.check_list_box_highlight_skill.GetChecked():
-            self.frame_view.check_list_box_highlight_skill.Check(idx, False)
+        self._update_notebook_setting()
         self._update_highlight()
 
-    def _update_highlight(self):
-        u""" update highlight cells """
-        text_dict = self.frame_view.text_ctrl_seed_skill_dict
-        for key in [view.KEY_AMULET1, view.KEY_AMULET2, view.KEY_AMULET3]:
-            for text_ctrl in text_dict[key]:
-                val = text_ctrl.GetValue()
-                if (val in self._skill_name2id_dict and
-                        self._skill_name2id_dict[val] in self._highlight_skills):
-                    text_ctrl.SetBackgroundColour("Yellow")
-                else:
-                    text_ctrl.SetBackgroundColour(wx.NullColor)
-        for text_ctrl in text_dict[view.KEY_THRESHOLD1]:
-            val = text_ctrl.GetValue()
-            if val.isdigit() and int(val) >= self._highlight_threshold1:
-                text_ctrl.SetBackgroundColour("Yellow")
-            else:
-                text_ctrl.SetBackgroundColour(wx.NullColor)
-
 
     def _show_error_dialog(self, message=u"予期せぬエラーが発生しました", caption=u"エラー"):
         u""" エラーダイアログを表示し、
@@ -447,6 +557,7 @@ class AmuletToolController(wx.App):
     def _write_settings(self):
         with open(SETTING_FILE, mode="w") as f:
             data = {SETTING_THRESHOLD1:self._highlight_threshold1, 
+                    SETTING_THRESHOLD2:self._highlight_threshold2, 
                     SETTING_SKILLS:self._highlight_skills}
             pickle.dump(data, f)
 
@@ -456,12 +567,15 @@ class AmuletToolController(wx.App):
                 try:
                     data = pickle.load(f)
                     self._highlight_threshold1 = data[SETTING_THRESHOLD1] 
+                    self._highlight_threshold2 = data[SETTING_THRESHOLD2] 
                     self._highlight_skills = data[SETTING_SKILLS]
                 except EOFError, e:
                     self._highlight_threshold1 = view.HIGHLIGHT_THRESHOLD1
+                    self._highlight_threshold2 = view.HIGHLIGHT_THRESHOLD2
                     self._highlight_skills = set()
         else:
             self._highlight_threshold1 = view.HIGHLIGHT_THRESHOLD1
+            self._highlight_threshold2 = view.HIGHLIGHT_THRESHOLD2
             self._highlight_skills = set()
 
 if __name__ == "__main__":