@@ -7,18 +7,22 @@ import exceptions.NodeNotFoundException
7
7
import guiClasses.components.Frame
8
8
import guiClasses.components.KeyTextField
9
9
import guiClasses.components.MenuClass
10
- import guiClasses.components.nodePanels.AVLPanel
11
- import guiClasses.components.nodePanels.BTPanel
12
- import guiClasses.components.nodePanels.RBTPanel
10
+ import guiClasses.components.TreePanel
11
+ import guiControl.painters.AVLPainter
12
+ import guiControl.painters.BTPainter
13
+ import guiControl.painters.RBTPainter
13
14
import trees.AVLTree
14
15
import trees.BinaryTree
15
16
import trees.RBTree
17
+ import java.awt.event.ComponentAdapter
18
+ import java.awt.event.ComponentEvent
16
19
import java.io.File
17
20
import javax.swing.GroupLayout
18
21
import javax.swing.JButton
19
22
import javax.swing.JFrame
20
23
import javax.swing.JOptionPane
21
24
25
+
22
26
/* *
23
27
* Объект, хранящий отдельно каждое из деревьев
24
28
* (позволяет параллельно работать сразу со всеми)
@@ -39,9 +43,20 @@ enum class TreeTypes {
39
43
None
40
44
}
41
45
46
+ /* *
47
+ * Константы с сообщениями ошибок, именами файлов бд
48
+ */
42
49
object Constants {
43
50
const val BinaryBaseName = " Binary Tree Data.db"
44
51
const val RBTBaseName = " Red-Black Tree Data.yml"
52
+
53
+ const val NotFoundErrorMessage = " Tree node with such key not found"
54
+ const val NotChosenErrorMessage = " You must select a tree to perform this action"
55
+ const val AlreadyExistsErrorMessage = " Tree node with the same key already exists"
56
+ const val InputErrorMessage = " Entered value is not a number or is too large"
57
+ const val DataReadError = " Unable to read data from file"
58
+ const val TreeAlreadyClearErrorMessage = " There are no more nodes in tree"
59
+
45
60
}
46
61
47
62
/* *
@@ -50,10 +65,19 @@ object Constants {
50
65
private var currentTree: TreeTypes = TreeTypes .None
51
66
52
67
private lateinit var treeFrame: JFrame
68
+ private lateinit var treePanel: TreePanel
69
+
53
70
private lateinit var menuFrame: JFrame
54
71
fun main () {
72
+ treeFrameInit()
55
73
menuFrameInit()
74
+ loadDatabase()
75
+ }
56
76
77
+ /* *
78
+ * Вытаскивает деревья из баз данных
79
+ */
80
+ private fun loadDatabase () {
57
81
if (File (Constants .RBTBaseName ).exists()) {
58
82
try {
59
83
val base = RBTBase (Constants .RBTBaseName ,
@@ -68,7 +92,7 @@ fun main() {
68
92
69
93
Trees .RBTree = base.loadTree()
70
94
} catch (ex: Exception ) {
71
- showError( " Не удалось прочитать данных из файла ${ Constants .RBTBaseName } " , menuFrame )
95
+ showMessage( Constants .DataReadError )
72
96
}
73
97
}
74
98
if (File (Constants .BinaryBaseName ).exists()) {
@@ -85,37 +109,90 @@ fun main() {
85
109
86
110
Trees .binTree = base.loadTree()
87
111
} catch (ex: Exception ) {
88
- showError( " Не удалось прочитать данных из файла ${ Constants .BinaryBaseName } " , menuFrame )
112
+ showMessage( Constants .DataReadError )
89
113
}
90
114
}
91
115
}
92
116
93
- private fun treeInit (newTree : TreeTypes ) {
94
- if (::treeFrame.isInitialized)
95
- treeFrame.dispose()
117
+ private fun treeFrameInit () {
96
118
treeFrame = Frame (" Treeple" , 1000 , 700 , 360 , 50 )
97
- when (newTree) {
98
- TreeTypes .RB -> treeFrame.add(RBTPanel (Trees .RBTree ))
99
- TreeTypes .AVL -> treeFrame.add(AVLPanel (Trees .AVLTree ))
100
- TreeTypes .BINARY -> treeFrame.add(BTPanel (Trees .binTree))
101
- else -> return
119
+ treePanel = TreePanel ()
120
+ treeFrame.add(treePanel)
121
+
122
+ treeFrame.addComponentListener(object : ComponentAdapter () {
123
+ override fun componentResized (componentEvent : ComponentEvent ) {
124
+ treeRepaint()
125
+ }
126
+ })
127
+
128
+ Trees .binTree.run {
129
+ add(100 )
130
+ add(120 )
131
+ add(- 10 )
132
+ }
133
+
134
+ Trees .RBTree .run {
135
+ add(100 )
136
+ add(120 )
137
+ add(- 10 )
138
+ }
139
+
140
+ Trees .AVLTree .run {
141
+ add(100 )
142
+ add(120 )
143
+ add(- 10 )
102
144
}
103
- println (newTree)
104
- currentTree = newTree
105
145
106
146
}
107
147
148
+ /* *
149
+ * Выводит сообщение об ошибке на экран
150
+ */
151
+ private fun showMessage (text : String , frame : JFrame = menuFrame, messageType : Int = JOptionPane .ERROR_MESSAGE ) {
152
+ JOptionPane .showMessageDialog(frame, text, " An error has occurred" , messageType)
153
+ }
154
+
155
+ private fun treeRepaint () {
156
+ when (currentTree) {
157
+ TreeTypes .BINARY -> {
158
+ if (Trees .binTree.root == null ) {
159
+ treePanel.clearTree()
160
+ return
161
+ }
162
+ val painter = BTPainter (Trees .binTree, width = treeFrame.width)
163
+ treePanel.changeTree(painter.lines, painter.nodes)
164
+ }
165
+
166
+ TreeTypes .AVL -> {
167
+ if (Trees .AVLTree .root == null ) {
168
+ treePanel.clearTree()
169
+ return
170
+ }
171
+ val painter = AVLPainter (Trees .AVLTree , width = treeFrame.width)
172
+ treePanel.changeTree(painter.lines, painter.nodes)
173
+ }
108
174
175
+ TreeTypes .RB -> {
176
+ if (Trees .RBTree .root == null ) {
177
+ treePanel.clearTree()
178
+ return
179
+ }
180
+ val painter = RBTPainter (Trees .RBTree , width = treeFrame.width)
181
+ treePanel.changeTree(painter.lines, painter.nodes)
182
+ }
109
183
110
- private fun showError ( text : String , frame : JFrame ) {
111
- JOptionPane .showMessageDialog(frame, text, " Произошла ошибка " , JOptionPane . ERROR_MESSAGE )
184
+ else -> {}
185
+ }
112
186
}
113
187
188
+ /* *
189
+ * Заполняет menuFrame компонентами
190
+ */
114
191
private fun menuFrameInit () {
115
192
menuFrame = Frame (" Treeple Menu" , 300 , 400 , 50 , 50 )
116
193
117
194
val addButton = JButton (" Add" )
118
- val addTextField = KeyTextField ()
195
+ val addTextField = KeyTextField (addButton )
119
196
120
197
addButton.addActionListener {
121
198
if (addTextField.text.toIntOrNull() != null ) {
@@ -126,18 +203,21 @@ private fun menuFrameInit() {
126
203
TreeTypes .BINARY -> Trees .binTree.add(key)
127
204
TreeTypes .AVL -> Trees .AVLTree .add(key)
128
205
129
- else -> showError( " Сначала выберите дерево " , menuFrame )
206
+ else -> showMessage( Constants . NotChosenErrorMessage )
130
207
}
131
208
132
209
} catch (ex: NodeAlreadyExistsException ) {
133
- showError( " Узел с таким значением уже существует " , menuFrame )
210
+ showMessage( Constants . AlreadyExistsErrorMessage )
134
211
}
135
212
} else
136
- showError(" Добавлять можно только узлы с числовыми значениями" , menuFrame)
213
+ showMessage(Constants .InputErrorMessage )
214
+
215
+ addTextField.text = " "
216
+ treeRepaint()
137
217
}
138
218
139
219
val removeButton = JButton (" Remove" )
140
- val removeTextField = KeyTextField ()
220
+ val removeTextField = KeyTextField (removeButton )
141
221
142
222
removeButton.addActionListener {
143
223
if (removeTextField.text.toIntOrNull() != null ) {
@@ -148,21 +228,48 @@ private fun menuFrameInit() {
148
228
TreeTypes .BINARY -> Trees .binTree.remove(key)
149
229
TreeTypes .AVL -> Trees .AVLTree .remove(key)
150
230
151
- else -> showError( " Сначала выберите дерево " , menuFrame )
231
+ else -> showMessage( Constants . NotChosenErrorMessage )
152
232
}
153
233
154
234
} catch (ex: NodeNotFoundException ) {
155
- showError( " Узла с таким значением не существует " , menuFrame )
235
+ showMessage( Constants . NotFoundErrorMessage )
156
236
}
157
237
} else
158
- showError(" Добавлять можно только узлы с числовыми значениями" , menuFrame)
238
+ showMessage(Constants .InputErrorMessage )
239
+
240
+ removeTextField.text = " "
241
+ treeRepaint()
159
242
}
160
243
161
244
val saveButton = JButton (" Save" )
162
- val refreshButton = JButton (" Refresh " )
245
+ val clearButton = JButton (" Clear " )
163
246
164
- refreshButton.addActionListener {
165
- treeInit(currentTree)
247
+ clearButton.addActionListener {
248
+ when (currentTree) {
249
+ TreeTypes .RB -> {
250
+ if (Trees .RBTree .root == null )
251
+ showMessage(Constants .TreeAlreadyClearErrorMessage )
252
+ else
253
+ Trees .RBTree = RBTree ()
254
+ }
255
+
256
+ TreeTypes .BINARY -> {
257
+ if (Trees .binTree.root == null )
258
+ showMessage(Constants .TreeAlreadyClearErrorMessage )
259
+ else
260
+ Trees .binTree = BinaryTree ()
261
+ }
262
+
263
+ TreeTypes .AVL -> {
264
+ if (Trees .AVLTree .root == null )
265
+ showMessage(Constants .TreeAlreadyClearErrorMessage )
266
+ else
267
+ Trees .AVLTree = AVLTree ()
268
+ }
269
+
270
+ else -> showMessage(Constants .NotChosenErrorMessage )
271
+ }
272
+ treeRepaint()
166
273
}
167
274
168
275
saveButton.addActionListener {
@@ -195,14 +302,27 @@ private fun menuFrameInit() {
195
302
}
196
303
197
304
TreeTypes .AVL -> {
198
- showError( " Сохранение AVL дерева не реализовано " , menuFrame )
305
+ showMessage( " AVL tree saving is not implemented ;( " )
199
306
}
200
307
201
- else -> showError( " Сначала выберите дерево " , menuFrame )
308
+ else -> showMessage( Constants . NotChosenErrorMessage )
202
309
}
203
310
}
204
311
205
- menuFrame.jMenuBar = MenuClass (::treeInit)
312
+ menuFrame.jMenuBar = MenuClass (
313
+ onBinSelected = {
314
+ currentTree = TreeTypes .BINARY
315
+ treeRepaint()
316
+ },
317
+ onAVLSelected = {
318
+ currentTree = TreeTypes .AVL
319
+ treeRepaint()
320
+ },
321
+ onRBTSelected = {
322
+ currentTree = TreeTypes .RB
323
+ treeRepaint()
324
+ }
325
+ )
206
326
207
327
// contentPane - контейнер для компонентов
208
328
val layout = GroupLayout (menuFrame.contentPane)
@@ -228,7 +348,7 @@ private fun menuFrameInit() {
228
348
)
229
349
)
230
350
.addComponent(saveButton)
231
- .addComponent(refreshButton )
351
+ .addComponent(clearButton )
232
352
)
233
353
234
354
layout.setVerticalGroup(
@@ -249,9 +369,9 @@ private fun menuFrameInit() {
249
369
.addGroup(
250
370
layout.createSequentialGroup()
251
371
.addComponent(saveButton)
252
- .addComponent(refreshButton )
372
+ .addComponent(clearButton )
253
373
)
254
374
255
375
)
256
376
257
- }
377
+ }
0 commit comments