1 package edu.jiangxin.apktoolbox.convert.relationship;
2
3 import edu.jiangxin.apktoolbox.swing.extend.EasyPanel;
4 import org.apache.commons.lang3.StringUtils;
5
6 import javax.swing.*;
7 import java.awt.*;
8 import java.awt.event.ActionEvent;
9 import java.awt.event.ActionListener;
10 import java.io.Serial;
11 import java.util.HashMap;
12 import java.util.Map;
13 import java.util.Stack;
14
15 public class RelationShipConvertPanel extends EasyPanel {
16 @Serial
17 private static final long serialVersionUID = 1L;
18
19 private static final Map<String, Map<String, String>> dataMap = new HashMap<>();
20
21 private String now = "你";
22
23 private JTextField inputTextField;
24 private JTextField outputTextField;
25
26 private final Stack<String> stack = new Stack<>();
27
28 static {
29 dataMap.put("不存在", Map.of("父", "不存在", "母", "不存在", "兄", "不存在", "弟", "不存在", "姐", "不存在", "妹", "不存在", "夫", "不存在", "妻", "不存在", "儿", "不存在", "女", "不存在"));
30 dataMap.put("你", Map.of("父", "爸爸", "母", "妈妈", "兄", "哥哥", "弟", "弟弟", "姐", "姐姐", "妹", "妹妹", "夫", "老公", "妻", "老婆", "儿", "儿子", "女", "女儿"));
31 dataMap.put("爸爸", Map.of("父", "爷爷", "母", "奶奶", "兄", "伯伯", "弟", "叔叔", "姐", "姑姑", "妹", "姑姑", "夫", "不存在", "妻", "妈妈", "儿", "<哥哥><弟弟>", "女", "<姐姐><妹妹>"));
32 dataMap.put("妈妈", Map.of("父", "姥爷", "母", "姥姥", "兄", "舅舅", "弟", "舅舅", "姐", "大姨", "妹", "小姨", "夫", "爸爸", "妻", "不存在", "儿", "<哥哥><弟弟>", "女", "<姐姐><妹妹>"));
33 dataMap.put("哥哥", Map.of("父", "爸爸", "母", "妈妈", "兄", "哥哥", "弟", "<哥哥><弟弟>", "姐", "姐姐", "妹", "<姐姐><妹妹>", "夫", "不存在", "妻", "嫂子", "儿", "侄子", "女", "侄女"));
34 dataMap.put("弟弟", Map.of("父", "爸爸", "母", "妈妈", "兄", "<哥哥><弟弟>", "弟", "弟弟", "姐", "<姐姐><妹妹>", "妹", "妹妹", "夫", "不存在", "妻", "弟媳", "儿", "侄子", "女", "侄女"));
35 dataMap.put("姐姐", Map.of("父", "爸爸", "母", "妈妈", "兄", "哥哥", "弟", "<哥哥><弟弟>", "姐", "姐姐", "妹", "<姐姐><妹妹>", "夫", "姐夫", "妻", "不存在", "儿", "外甥", "女", "外甥女"));
36 dataMap.put("妹妹", Map.of("父", "爸爸", "母", "妈妈", "兄", "<哥哥><弟弟>", "弟", "弟弟", "姐", "<姐姐><妹妹>", "妹", "妹妹", "夫", "妹夫", "妻", "不存在", "儿", "外甥", "女", "外甥女"));
37 dataMap.put("老婆", Map.of("父", "岳父", "母", "岳母", "兄", "大舅", "弟", "小舅", "姐", "大姨", "妹", "小姨", "夫", "你", "妻", "不存在", "儿", "儿子", "女", "女儿"));
38 dataMap.put("儿子", Map.of("父", "你", "母", "老婆", "兄", "儿子", "弟", "儿子", "姐", "女儿", "妹", "女儿", "夫", "不存在", "妻", "儿媳", "儿", "孙子", "女", "孙女"));
39 dataMap.put("女儿", Map.of("父", "你", "母", "老婆", "兄", "儿子", "弟", "儿子", "姐", "女儿", "妹", "女儿", "夫", "女婿", "妻", "不存在", "儿", "外孙", "女", "外孙女"));
40 dataMap.put("伯伯", Map.of("父", "爷爷", "母", "奶奶", "兄", "伯伯", "弟", "<伯伯><叔叔>", "姐", "姑姑", "妹", "姑姑", "夫", "不存在", "妻", "婶婶", "儿", "<哥哥><弟弟>", "女", "<姐姐><妹妹>"));
41 dataMap.put("叔叔", Map.of("父", "爷爷", "母", "奶奶", "兄", "<伯伯><叔叔>", "弟", "叔叔", "姐", "姑姑", "妹", "姑姑", "夫", "不存在", "妻", "婶婶", "儿", "<哥哥><弟弟>", "女", "<姐姐><妹妹>"));
42 dataMap.put("姑姑", Map.of("父", "爷爷", "母", "奶奶", "兄", "<伯伯><叔叔>", "弟", "<伯伯><叔叔>", "姐", "姑姑", "妹", "姑姑", "夫", "姑父", "妻", "不存在", "儿", "<哥哥><弟弟>", "女", "<姐姐><妹妹>"));
43 dataMap.put("岳父", Map.of("父", "爷爷", "母", "奶奶", "兄", "伯伯", "弟", "叔叔", "姐", "姑姑", "妹", "姑姑", "夫", "不存在", "妻", "岳母", "儿", "<哥哥><弟弟>", "女", "<姐姐><妹妹>"));
44 dataMap.put("岳母", Map.of("父", "姥爷", "母", "姥姥", "兄", "舅舅", "弟", "舅舅", "姐", "大姨", "妹", "小姨", "夫", "岳父", "妻", "不存在", "儿", "<哥哥><弟弟>", "女", "<姐姐><妹妹>"));
45 }
46
47 @Override
48 public void initUI() {
49 setLayout(new GridBagLayout());
50 GridBagConstraints gbc = new GridBagConstraints();
51
52 inputTextField = new MyTextField();
53
54 gbc.insets = new Insets(5, 5, 5, 5);
55 gbc.gridx = 0;
56 gbc.gridy = 0;
57 gbc.gridwidth = 4;
58 gbc.fill = GridBagConstraints.HORIZONTAL;
59 add(inputTextField, gbc);
60
61 outputTextField = new MyTextField();
62 outputTextField.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
63
64 gbc.gridy = 1;
65 add(outputTextField, gbc);
66
67 ButtonListener btnListener = new ButtonListener();
68
69 JButton fatherButton = new MyButton("父");
70 fatherButton.addActionListener(btnListener);
71
72 gbc.gridx = 0;
73 gbc.gridy = 2;
74 gbc.gridwidth = 1;
75 add(fatherButton, gbc);
76
77 JButton motherButton = new MyButton("母");
78 motherButton.addActionListener(btnListener);
79
80 gbc.gridx = 1;
81 add(motherButton, gbc);
82
83 JButton backButton = new MyButton("←");
84 backButton.addActionListener(btnListener);
85
86 gbc.gridx = 2;
87 add(backButton, gbc);
88
89 JButton acButton = new MyButton("AC");
90 acButton.addActionListener(btnListener);
91
92 gbc.gridx = 3;
93 add(acButton, gbc);
94
95 JButton brotherButton = new MyButton("兄");
96 brotherButton.addActionListener(btnListener);
97
98 gbc.gridx = 0;
99 gbc.gridy = 3;
100 add(brotherButton, gbc);
101
102 JButton littleBrotherButton = new MyButton("弟");
103 littleBrotherButton.addActionListener(btnListener);
104
105 gbc.gridx = 1;
106 add(littleBrotherButton, gbc);
107
108 JButton husbandButton = new MyButton("夫");
109 husbandButton.addActionListener(btnListener);
110
111 gbc.gridx = 2;
112 add(husbandButton, gbc);
113
114 JButton obligateButton = new MyButton(" ");
115 obligateButton.setEnabled(false);
116
117 gbc.gridx = 3;
118 add(obligateButton, gbc);
119
120 JButton sisterButton = new MyButton("姐");
121 sisterButton.addActionListener(btnListener);
122
123 gbc.gridx = 0;
124 gbc.gridy = 4;
125 add(sisterButton, gbc);
126
127 JButton littleSisterButton = new MyButton("妹");
128 littleSisterButton.addActionListener(btnListener);
129
130 gbc.gridx = 1;
131 add(littleSisterButton, gbc);
132
133 JButton wifeButton = new MyButton("妻");
134 wifeButton.addActionListener(btnListener);
135
136 gbc.gridx = 2;
137 add(wifeButton, gbc);
138
139 JButton deButton = new MyButton("的");
140 deButton.addActionListener(btnListener);
141
142 gbc.gridx = 3;
143 add(deButton, gbc);
144
145 JButton sonButton = new MyButton("儿");
146 sonButton.addActionListener(btnListener);
147
148 gbc.gridx = 0;
149 gbc.gridy = 5;
150 add(sonButton, gbc);
151
152 JButton daughterbButton = new MyButton("女");
153 daughterbButton.addActionListener(btnListener);
154
155 gbc.gridx = 1;
156 add(daughterbButton, gbc);
157
158 JButton resultButton = new MyButton("=");
159 resultButton.addActionListener(btnListener);
160
161 gbc.gridx = 2;
162 gbc.gridwidth = 2;
163 add(resultButton, gbc);
164 }
165
166 static class MyTextField extends JTextField {
167 @Serial
168 private static final long serialVersionUID = 1L;
169
170 public MyTextField() {
171 super();
172 Font font = new Font("宋体", Font.BOLD, 15);
173 setFont(font);
174 setEditable(false);
175 }
176 }
177
178 static class MyButton extends JButton {
179 @Serial
180 private static final long serialVersionUID = 1L;
181
182 public MyButton(String text) {
183 super(text);
184 Font font = new Font("宋体", Font.BOLD, 30);
185 setFont(font);
186 }
187 }
188
189 class ButtonListener implements ActionListener {
190 public void actionPerformed(ActionEvent e) {
191 String which = ((JButton) e.getSource()).getText();
192 switch (which) {
193 case "AC" -> {
194 now = "你";
195 inputTextField.setText("");
196 outputTextField.setText("");
197 }
198 case "=" -> outputTextField.setText(now);
199 case "←" -> {
200 String inputText = inputTextField.getText();
201 String removedText = null;
202 if (inputText != null && inputText.length() >= 1) {
203 inputTextField.setText(inputText.substring(0, inputText.length() - 1));
204 removedText = inputText.substring(inputText.length() - 1);
205 }
206 if (!stack.isEmpty() && isRelationString(removedText)) {
207 now = stack.pop();
208 outputTextField.setText(now);
209 }
210 }
211 case "的" -> inputTextField.setText(inputTextField.getText() + which);
212 default -> {
213 inputTextField.setText(inputTextField.getText() + which);
214 stack.push(now);
215 String result = getRelation(now, which);
216 if (isPossibleRelation(result)) {
217 result = getExactRelation(result);
218 }
219 if (result != null) {
220 now = result;
221 outputTextField.setText(now);
222 } else {
223 outputTextField.setText("超出计算范围");
224 }
225 }
226 }
227 }
228 }
229
230 private static boolean isRelationString(String relationString) {
231 return relationString != null && "父母兄弟姐妹夫妻儿女".contains(relationString);
232 }
233
234 private static String getRelation(String now, String what) {
235 Map<String, String> relationsMap = dataMap.get(now);
236 if (relationsMap == null) {
237 return null;
238 }
239 return relationsMap.get(what);
240 }
241
242 private static boolean isPossibleRelation(String possibleRelation) {
243 return possibleRelation != null && possibleRelation.charAt(0) == '<';
244 }
245
246 private static String getExactRelation(String possibleRelation) {
247 String[] tmp = StringUtils.substringsBetween(possibleRelation, "<", ">");
248 if (tmp != null && tmp.length == 2) {
249 String message = "是否比";
250 if ("伯伯".equals(tmp[0])) {
251 message += "爸爸";
252 } else if ("姐姐".equals(tmp[0]) || "哥哥".equals(tmp[0])) {
253 message += "你";
254 }
255 message += "大?";
256 int userChoose = JOptionPane.showConfirmDialog(null, message, "提示", JOptionPane.YES_NO_OPTION);
257 boolean isOlder = userChoose == JOptionPane.YES_OPTION;
258 return isOlder ? tmp[0] : tmp[1];
259 } else {
260 return null;
261 }
262 }
263 }