Passed
Push — master ( 63399a...705b0f )
by Yoshihiro
02:57
created

NovelEditor.FP.FindProcessingClass.search_next()   B

Complexity

Conditions 6

Size

Total Lines 54
Code Lines 37

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 29
CRAP Score 6

Importance

Changes 0
Metric Value
cc 6
eloc 37
nop 4
dl 0
loc 54
ccs 29
cts 29
cp 1
crap 6
rs 8.0586
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
#!/usr/bin/env python3
2 1
import tkinter as tk
3 1
import tkinter.ttk as ttk
4 1
import tkinter.messagebox as messagebox
5
6
7 1
class FindProcessingClass():
8
    """検索置換のクラス.
9
10
    ・検索置換するためのプログラム群
11
12
    Args:
13
        app (instance): MainProcessingClass のインスタンス
14
15
    Attributes:
16
        replacement_check (bool): 検索ダイアログが表示されているTrue
17
        next_pos (str): 次の検索位置 例.(1.0)
18
        find_text (str): 検索文字列
19
    """
20 1
    def __init__(self, app):
21 1
        self.replacement_check = 0
22 1
        self.next_pos = ""
23 1
        self.find_text = ""
24 1
        self.APP = app
25
26 1
    def push_keys(self, event=None):
27
        """キーが押されたときの処理.
28
29
        ・何かキーが押されたときに検索処理を中断する。
30
31
        Args:
32
            event (instance): tkinter.Event のインスタンス
33
        """
34
        # 検索処理を中断する
35 1
        self.replacement_check = 0
36
37 1
    def find_dialog(self, event=None):
38
        """検索ダイアログを作成.
39
40
        ・検索ダイアログを作成する。
41
42
        Args:
43
            event (instance): tkinter.Event のインスタンス
44
        """
45 1
        search_win = tk.Toplevel(self.APP)
46 1
        self.text_var = ttk.Entry(search_win, width=40)
47 1
        self.text_var.grid(
48
            row=0,
49
            column=0,
50
            columnspan=2,
51
            padx=5,
52
            pady=5,
53
            sticky=tk.W+tk.E,
54
            ipady=3
55
        )
56 1
        button = ttk.Button(
57
            search_win,
58
            text=u'検索',
59
            width=str(u'検索'),
60
            padding=(10, 5),
61
            command=self.search
62
        )
63 1
        button.grid(row=1, column=0)
64 1
        button2 = ttk.Button(
65
            search_win,
66
            text=u'昇順検索',
67
            width=str(u'昇順検索'),
68
            padding=(10, 5),
69
            command=self.search_forward
70
        )
71 1
        button2.grid(row=1, column=1)
72
        # 最前面に表示し続ける
73 1
        search_win.attributes("-topmost", True)
74 1
        search_win.title(u'検索')
75 1
        self.text_var.focus()
76
77 1
    def replacement_dialog(self, event=None):
78
        """置換ダイアログを作成.
79
80
        ・置換ダイアログを作成する。
81
82
        Args:
83
            event (instance): tkinter.Event のインスタンス
84
        """
85 1
        self.replacement_win = tk.Toplevel(self.APP)
86 1
        self.text_var = ttk.Entry(self.replacement_win, width=40)
87 1
        self.text_var.grid(
88
            row=0,
89
            column=0,
90
            columnspan=2,
91
            padx=5,
92
            pady=5,
93
            sticky=tk.W+tk.E,
94
            ipady=3
95
        )
96 1
        self.replacement_var = ttk.Entry(self.replacement_win, width=40)
97 1
        self.replacement_var.grid(
98
            row=1,
99
            column=0,
100
            columnspan=2,
101
            padx=5,
102
            pady=5,
103
            sticky=tk.W+tk.E,
104
            ipady=3
105
        )
106 1
        button = ttk.Button(
107
            self.replacement_win,
108
            text=u'検索',
109
            width=str(u'検索'),
110
            padding=(10, 5),
111
            command=self.search
112
        )
113 1
        button.grid(row=2, column=0)
114 1
        button2 = ttk.Button(
115
            self.replacement_win,
116
            text=u'置換',
117
            width=str(u'置換'),
118
            padding=(10, 5),
119
            command=self.replacement
120
        )
121 1
        button2.grid(row=2, column=1)
122
        # 最前面に表示し続ける
123 1
        self.replacement_win.attributes("-topmost", True)
124 1
        self.replacement_win.title(u'置換')
125 1
        self.text_var.focus()
126
        # ウインドウが閉じられたときの処理
127 1
        self.replacement_win.protocol(
128
            "WM_DELETE_WINDOW",
129
            self.replacement_dialog_on_closing
130
            )
131
132 1
    def replacement_dialog_on_closing(self):
133
        """検索ウインドウが閉じられたときの処理.
134
135
        ・検索ダイアログが閉じられたことがわかるようにする。
136
        """
137 1
        self.replacement_check = 0
138 1
        self.replacement_win.destroy()
139
140 1
    def search(self, event=None):
141
        """検索処理.
142
143
        ・検索処理をする。空欄なら処理しない、違うなら最初から、
144
        同じなら次のを検索する。
145
146
        Args:
147
            event (instance): tkinter.Event のインスタンス
148
        """
149
        # 現在選択中の部分を解除
150 1
        self.APP.text.tag_remove('sel', '1.0', 'end')
151
152
        # 現在検索ボックスに入力されてる文字
153 1
        now_text = self.text_var.get()
154 1
        if not now_text:
155
            # 空欄だったら処理しない
156
            pass
157 1
        elif now_text != self.find_text:
158
            # 前回の入力と違う文字なら、検索を最初から行う
159 1
            index = '0.0'
160 1
            self.search_next(now_text, index, 0)
161
        else:
162
            # 前回の入力と同じなら、検索の続きを行う
163 1
            self.search_next(now_text, self.next_pos, 1)
164
165
        # 今回の入力を、「前回入力文字」にする
166 1
        self.find_text = now_text
167
168 1
    def replacement(self, event=None):
169
        """置換処理.
170
171
        ・置換処理をする。空欄なら処理しない、違うなら初めから、
172
        同じなら次を検索する。
173
174
        Args:
175
            event (instance): tkinter.Event のインスタンス
176
        """
177
        # 現在選択中の部分を解除
178 1
        self.APP.text.tag_remove('sel', '1.0', 'end')
179
180
        # 現在検索ボックスに入力されてる文字
181 1
        now_text = self.text_var.get()
182 1
        replacement_text = self.replacement_var.get()
183 1
        if not now_text or not replacement_text:
184
            # 空欄だったら処理しない
185
            pass
186 1
        elif now_text != self.find_text:
187
            # 前回の入力と違う文字なら、検索を最初から行う
188 1
            self.replacement_check = 1
189 1
            index = '0.0'
190 1
            self.search_next(now_text, index, 0)
191
        else:
192
            # 前回の入力と同じなら、検索の続きを行う
193 1
            self.replacement_check = 1
194
            # 検索文字の置換を行なう
195 1
            start = self.next_pos
196 1
            end = '{0} + {1}c'.format(self.next_pos, len(now_text))
197 1
            self.APP.text.delete(start, end)
198 1
            self.APP.text.insert(start, replacement_text)
199 1
            self.search_next(now_text, self.next_pos, 1)
200
201
        # 今回の入力を、「前回入力文字」にする
202 1
        self.find_text = now_text
203
204 1
    def search_forward(self, event=None):
205
        """昇順検索処理.
206
207
        ・昇順検索をする。空欄なら処理しない、違うなら初めから、
208
        同じなら次を検索する。
209
210
        Args:
211
            event (instance): tkinter.Event のインスタンス
212
        """
213
        # 現在選択中の部分を解除
214 1
        self.APP.text.tag_remove('sel', '1.0', 'end')
215
216
        # 現在検索ボックスに入力されてる文字
217 1
        text = self.text_var.get()
218 1
        if not text:
219
            # 空欄だったら処理しない
220
            pass
221 1
        elif text != self.find_text:
222
            # 前回の入力と違う文字なら、検索を最初から行う
223 1
            index = 'end'
224 1
            self.search_next(text, index, 2)
225
        else:
226
            # 前回の入力と同じなら、検索の続きを行う
227 1
            self.search_next(text, self.next_pos, 2)
228
229
        # 今回の入力を、「前回入力文字」にする
230 1
        self.find_text = text
231
232 1
    def search_next(self, search, index, case):
233
        """検索のメイン処理.
234
235
        ・検索できれば選択をする。できなければ、ダイアログを出して終了。
236
237
        Args:
238
            search (str): 検索文字列
239
            index (str): 検索位置 ex. (1.0)
240
            case (int): 0.初めから検索 1.次に検索 2.昇順検索
241
        """
242 1
        if case == 2:
243 1
            backwards = True
244 1
            stopindex = '0.0'
245 1
            index = '{0}'.format(index)
246 1
        elif case == 0:
247 1
            backwards = False
248 1
            stopindex = 'end'
249 1
            index = '{0}'.format(index)
250
        else:
251 1
            backwards = False
252 1
            stopindex = 'end'
253 1
            index = '{0} + 1c'.format(index)
254
255 1
        pos = self.APP.text.search(
256
            search, index,
257
            stopindex=stopindex,
258
            backwards=backwards
259
        )
260 1
        if not pos:
261 1
            if case == 2:
262 1
                index = "end"
263
            else:
264 1
                index = "0.0"
265
266 1
            pos = self.APP.text.search(
267
                search, index,
268
                stopindex=stopindex,
269
                backwards=backwards
270
            )
271 1
            if not pos:
272 1
                messagebox.showinfo(
273
                    "検索",
274
                    "最後まで検索しましたが検索文字はありませんでした。"
275
                )
276 1
                self.replacement_check = 0
277 1
                return
278
279 1
        self.next_pos = pos
280 1
        start = pos
281 1
        end = '{0} + {1}c'.format(pos, len(search))
282 1
        self.APP.text.tag_add('sel', start, end)
283 1
        self.APP.text.mark_set('insert', start)
284 1
        self.APP.text.see('insert')
285
        self.APP.text.focus()
286