1 | /******************************************************************************* | |
2 | * Copyhacked (H) 2012-2025. | |
3 | * This program and the accompanying materials | |
4 | * are made available under no term at all, use it like | |
5 | * you want, but share and discuss it | |
6 | * every time possible with every body. | |
7 | * | |
8 | * Contributors: | |
9 | * ron190 at ymail dot com - initial implementation | |
10 | ******************************************************************************/ | |
11 | package com.jsql.view.swing.tree; | |
12 | ||
13 | import com.jsql.util.I18nUtil; | |
14 | import com.jsql.view.swing.tree.model.AbstractNodeModel; | |
15 | import com.jsql.view.swing.util.UiStringUtil; | |
16 | import com.jsql.view.swing.util.UiUtil; | |
17 | ||
18 | import javax.swing.*; | |
19 | import javax.swing.tree.DefaultMutableTreeNode; | |
20 | import java.awt.*; | |
21 | import java.awt.event.FocusAdapter; | |
22 | import java.awt.event.FocusEvent; | |
23 | import java.awt.event.KeyAdapter; | |
24 | import java.awt.event.KeyEvent; | |
25 | import java.nio.charset.StandardCharsets; | |
26 | import java.util.stream.Stream; | |
27 | ||
28 | /** | |
29 | * A tree Node composed of an icon, a GIF loader, a progress bar, a label. | |
30 | */ | |
31 | public class PanelNode extends JPanel { | |
32 | | |
33 | /** | |
34 | * Default icon of the node (database or table). | |
35 | */ | |
36 | private final JLabel iconNode = new JLabel(); | |
37 | ||
38 | /** | |
39 | * A GIF loader, displayed if progress track is unknown (like columns). | |
40 | */ | |
41 | private final JLabel loaderWait = new JLabel(); | |
42 | ||
43 | /** | |
44 | * Progress bar displayed during injection, with pause icon displayed if user paused the process. | |
45 | */ | |
46 | private final ProgressBarPausable progressBar = new ProgressBarPausable(); | |
47 | ||
48 | /** | |
49 | * Text of the node. | |
50 | */ | |
51 | private final JLabel nodeLabel = new JLabel(); | |
52 | private final JTextField textFieldEditable = new JTextField(15); | |
53 | | |
54 | /** | |
55 | * Create Panel for tree nodes. | |
56 | * @param tree JTree to populate | |
57 | * @param currentNode Node to draw in the tree | |
58 | */ | |
59 | public PanelNode(final JTree tree, final DefaultMutableTreeNode currentNode) { | |
60 |
1
1. <init> : removed call to javax/swing/JLabel::setIcon → NO_COVERAGE |
this.loaderWait.setIcon(UiUtil.HOURGLASS.getIcon()); |
61 |
1
1. <init> : removed call to javax/swing/JLabel::setBorder → NO_COVERAGE |
this.loaderWait.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); |
62 | ||
63 |
1
1. <init> : removed call to com/jsql/view/swing/tree/ProgressBarPausable::setPreferredSize → NO_COVERAGE |
this.progressBar.setPreferredSize(new Dimension(20, 20)); |
64 |
1
1. <init> : removed call to com/jsql/view/swing/tree/ProgressBarPausable::setBorder → NO_COVERAGE |
this.progressBar.setBorder(BorderFactory.createEmptyBorder(4, 3, 4, 3)); |
65 | ||
66 |
1
1. <init> : removed call to javax/swing/JLabel::setOpaque → NO_COVERAGE |
this.nodeLabel.setOpaque(true); |
67 | ||
68 |
1
1. <init> : removed call to javax/swing/JLabel::setBorder → NO_COVERAGE |
this.iconNode.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); |
69 | | |
70 |
1
1. <init> : removed call to com/jsql/view/swing/tree/PanelNode::setLayout → NO_COVERAGE |
this.setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS)); |
71 | | |
72 | Stream.of( | |
73 | this.iconNode, | |
74 | this.loaderWait, | |
75 | this.progressBar, | |
76 | this.nodeLabel, | |
77 | this.textFieldEditable | |
78 | ) | |
79 |
1
1. <init> : removed call to java/util/stream/Stream::forEach → NO_COVERAGE |
.forEach(component -> { |
80 | this.add(component); | |
81 |
1
1. lambda$new$0 : removed call to javax/swing/JComponent::setVisible → NO_COVERAGE |
component.setVisible(false); |
82 | }); | |
83 | | |
84 |
1
1. <init> : removed call to com/jsql/view/swing/tree/PanelNode::setComponentOrientation → NO_COVERAGE |
this.setComponentOrientation(ComponentOrientation.getOrientation(I18nUtil.getCurrentLocale())); |
85 | | |
86 |
1
1. <init> : removed call to com/jsql/view/swing/tree/PanelNode::initTextFieldEditable → NO_COVERAGE |
this.initTextFieldEditable(tree, currentNode); |
87 | } | |
88 | ||
89 | private void initTextFieldEditable(final JTree tree, final DefaultMutableTreeNode currentNode) { | |
90 |
1
1. initTextFieldEditable : removed call to javax/swing/JTextField::addActionListener → NO_COVERAGE |
this.textFieldEditable.addActionListener(e -> { |
91 | AbstractNodeModel nodeModel = (AbstractNodeModel) currentNode.getUserObject(); | |
92 |
1
1. lambda$initTextFieldEditable$1 : removed call to com/jsql/view/swing/tree/model/AbstractNodeModel::setIsEdited → NO_COVERAGE |
nodeModel.setIsEdited(false); |
93 | | |
94 |
1
1. lambda$initTextFieldEditable$1 : removed call to javax/swing/JLabel::setVisible → NO_COVERAGE |
this.nodeLabel.setVisible(true); |
95 |
1
1. lambda$initTextFieldEditable$1 : removed call to javax/swing/JTextField::setVisible → NO_COVERAGE |
this.textFieldEditable.setVisible(false); |
96 | tree.requestFocusInWindow(); | |
97 | ||
98 |
1
1. lambda$initTextFieldEditable$1 : removed call to com/jsql/model/bean/database/AbstractElementDatabase::setElementValue → NO_COVERAGE |
nodeModel.getElementDatabase().setElementValue(new String( |
99 | this.textFieldEditable.getText().getBytes(StandardCharsets.UTF_8), | |
100 | StandardCharsets.UTF_8 | |
101 | )); | |
102 |
1
1. lambda$initTextFieldEditable$1 : removed call to javax/swing/JLabel::setText → NO_COVERAGE |
this.nodeLabel.setText(UiStringUtil.detectUtf8Html(nodeModel.getElementDatabase().getLabelWithCount())); |
103 | | |
104 |
1
1. lambda$initTextFieldEditable$1 : removed call to javax/swing/JTree::revalidate → NO_COVERAGE |
tree.revalidate(); |
105 |
1
1. lambda$initTextFieldEditable$1 : removed call to javax/swing/JTree::repaint → NO_COVERAGE |
tree.repaint(); |
106 | }); | |
107 | | |
108 |
1
1. initTextFieldEditable : removed call to javax/swing/JTextField::addFocusListener → NO_COVERAGE |
this.textFieldEditable.addFocusListener(new FocusAdapter() { |
109 | @Override | |
110 | public void focusLost(FocusEvent e) { | |
111 | AbstractNodeModel nodeModel = (AbstractNodeModel) currentNode.getUserObject(); | |
112 |
1
1. focusLost : removed call to com/jsql/view/swing/tree/model/AbstractNodeModel::setIsEdited → NO_COVERAGE |
nodeModel.setIsEdited(false); |
113 |
1
1. focusLost : removed call to javax/swing/JTree::revalidate → NO_COVERAGE |
tree.revalidate(); |
114 |
1
1. focusLost : removed call to javax/swing/JTree::repaint → NO_COVERAGE |
tree.repaint(); |
115 | } | |
116 | }); | |
117 | | |
118 | KeyAdapter keyAdapterF2 = new KeyAdapter() { | |
119 | @Override | |
120 | public void keyPressed(KeyEvent e) { | |
121 | AbstractNodeModel nodeModel = (AbstractNodeModel) currentNode.getUserObject(); | |
122 | | |
123 |
2
1. keyPressed : negated conditional → NO_COVERAGE 2. keyPressed : negated conditional → NO_COVERAGE |
if (e.getKeyCode() == KeyEvent.VK_F2 && !nodeModel.isRunning()) { |
124 |
1
1. keyPressed : removed call to com/jsql/view/swing/tree/model/AbstractNodeModel::setIsEdited → NO_COVERAGE |
nodeModel.setIsEdited(true); |
125 | | |
126 |
1
1. keyPressed : removed call to javax/swing/JLabel::setVisible → NO_COVERAGE |
PanelNode.this.nodeLabel.setVisible(false); |
127 |
1
1. keyPressed : removed call to javax/swing/JTextField::setVisible → NO_COVERAGE |
PanelNode.this.textFieldEditable.setVisible(true); |
128 | PanelNode.this.textFieldEditable.requestFocusInWindow(); | |
129 | | |
130 |
1
1. keyPressed : removed call to javax/swing/JTree::revalidate → NO_COVERAGE |
tree.revalidate(); |
131 |
1
1. keyPressed : removed call to javax/swing/JTree::repaint → NO_COVERAGE |
tree.repaint(); |
132 | } | |
133 | } | |
134 | }; | |
135 | | |
136 |
1
1. initTextFieldEditable : removed call to com/jsql/view/swing/tree/PanelNode::addKeyListener → NO_COVERAGE |
this.addKeyListener(keyAdapterF2); |
137 |
1
1. initTextFieldEditable : removed call to javax/swing/JTextField::addKeyListener → NO_COVERAGE |
this.textFieldEditable.addKeyListener(keyAdapterF2); |
138 | } | |
139 | ||
140 | /** | |
141 | * Change the text icon. | |
142 | * @param newIcon An icon to display next to the text. | |
143 | */ | |
144 | public void setIconNode(Icon newIcon) { | |
145 |
1
1. setIconNode : removed call to javax/swing/JLabel::setIcon → NO_COVERAGE |
this.iconNode.setIcon(newIcon); |
146 | } | |
147 | | |
148 | /** | |
149 | * Display text icon to the left. | |
150 | */ | |
151 | public void showIcon() { | |
152 |
1
1. showIcon : removed call to javax/swing/JLabel::setVisible → NO_COVERAGE |
this.iconNode.setVisible(true); |
153 | } | |
154 | | |
155 | /** | |
156 | * Mask the node icon for example when the loader component is displayed. | |
157 | */ | |
158 | public void hideIcon() { | |
159 |
1
1. hideIcon : removed call to javax/swing/JLabel::setVisible → NO_COVERAGE |
this.iconNode.setVisible(false); |
160 | } | |
161 | | |
162 | /** | |
163 | * Change the loader icon. | |
164 | * @param newIcon An icon to display for the loader. | |
165 | */ | |
166 | public void setLoaderIcon(Icon newIcon) { | |
167 |
1
1. setLoaderIcon : removed call to javax/swing/JLabel::setIcon → NO_COVERAGE |
this.loaderWait.setIcon(newIcon); |
168 | } | |
169 | ||
170 | /** | |
171 | * Display the animated gif loader. | |
172 | */ | |
173 | public void showLoader() { | |
174 |
1
1. showLoader : removed call to javax/swing/JLabel::setVisible → NO_COVERAGE |
this.loaderWait.setVisible(true); |
175 | } | |
176 | | |
177 | | |
178 | // Getter and setter | |
179 | ||
180 | public ProgressBarPausable getProgressBar() { | |
181 |
1
1. getProgressBar : replaced return value with null for com/jsql/view/swing/tree/PanelNode::getProgressBar → NO_COVERAGE |
return this.progressBar; |
182 | } | |
183 | ||
184 | public JLabel getNodeLabel() { | |
185 |
1
1. getNodeLabel : replaced return value with null for com/jsql/view/swing/tree/PanelNode::getNodeLabel → NO_COVERAGE |
return this.nodeLabel; |
186 | } | |
187 | ||
188 | public JTextField getTextFieldEditable() { | |
189 |
1
1. getTextFieldEditable : replaced return value with null for com/jsql/view/swing/tree/PanelNode::getTextFieldEditable → NO_COVERAGE |
return this.textFieldEditable; |
190 | } | |
191 | } | |
Mutations | ||
60 |
1.1 |
|
61 |
1.1 |
|
63 |
1.1 |
|
64 |
1.1 |
|
66 |
1.1 |
|
68 |
1.1 |
|
70 |
1.1 |
|
79 |
1.1 |
|
81 |
1.1 |
|
84 |
1.1 |
|
86 |
1.1 |
|
90 |
1.1 |
|
92 |
1.1 |
|
94 |
1.1 |
|
95 |
1.1 |
|
98 |
1.1 |
|
102 |
1.1 |
|
104 |
1.1 |
|
105 |
1.1 |
|
108 |
1.1 |
|
112 |
1.1 |
|
113 |
1.1 |
|
114 |
1.1 |
|
123 |
1.1 2.2 |
|
124 |
1.1 |
|
126 |
1.1 |
|
127 |
1.1 |
|
130 |
1.1 |
|
131 |
1.1 |
|
136 |
1.1 |
|
137 |
1.1 |
|
145 |
1.1 |
|
152 |
1.1 |
|
159 |
1.1 |
|
167 |
1.1 |
|
174 |
1.1 |
|
181 |
1.1 |
|
185 |
1.1 |
|
189 |
1.1 |