Lines 48-72
Link Here
|
48 |
import java.awt.BorderLayout; |
48 |
import java.awt.BorderLayout; |
49 |
import java.awt.Component; |
49 |
import java.awt.Component; |
50 |
import java.awt.Dimension; |
50 |
import java.awt.Dimension; |
|
|
51 |
import java.awt.EventQueue; |
52 |
import java.awt.Font; |
51 |
import java.awt.event.ItemEvent; |
53 |
import java.awt.event.ItemEvent; |
52 |
import java.awt.event.ItemListener; |
54 |
import java.awt.event.ItemListener; |
53 |
import java.beans.PropertyChangeEvent; |
55 |
import java.beans.PropertyChangeEvent; |
54 |
import java.beans.PropertyChangeListener; |
56 |
import java.beans.PropertyChangeListener; |
|
|
57 |
import java.util.logging.Logger; |
55 |
import javax.swing.DefaultComboBoxModel; |
58 |
import javax.swing.DefaultComboBoxModel; |
56 |
import javax.swing.DefaultListCellRenderer; |
59 |
import javax.swing.DefaultListCellRenderer; |
57 |
import javax.swing.JButton; |
60 |
import javax.swing.JButton; |
|
|
61 |
import javax.swing.JLabel; |
58 |
import javax.swing.JList; |
62 |
import javax.swing.JList; |
|
|
63 |
import javax.swing.event.PopupMenuEvent; |
64 |
import javax.swing.event.PopupMenuListener; |
59 |
import org.netbeans.modules.bugtracking.ui.search.QuickSearchComboBar; |
65 |
import org.netbeans.modules.bugtracking.ui.search.QuickSearchComboBar; |
60 |
import org.netbeans.modules.bugtracking.spi.Issue; |
66 |
import org.netbeans.modules.bugtracking.spi.Issue; |
61 |
import org.netbeans.modules.bugtracking.spi.Repository; |
67 |
import org.netbeans.modules.bugtracking.spi.Repository; |
62 |
import org.netbeans.modules.bugtracking.util.BugtrackingUtil; |
68 |
import org.netbeans.modules.bugtracking.util.BugtrackingUtil; |
63 |
import org.netbeans.modules.versioning.util.VerticallyNonResizingPanel; |
69 |
import org.netbeans.modules.versioning.util.VerticallyNonResizingPanel; |
|
|
70 |
import org.openide.util.NbBundle; |
71 |
import static java.util.logging.Level.FINER; |
64 |
|
72 |
|
65 |
/** |
73 |
/** |
66 |
* |
74 |
* |
67 |
* @author Tomas Stupka |
75 |
* @author Tomas Stupka |
|
|
76 |
* @author Marian Petras |
68 |
*/ |
77 |
*/ |
69 |
public class HookPanel extends VerticallyNonResizingPanel implements ItemListener, PropertyChangeListener { |
78 |
public class HookPanel extends VerticallyNonResizingPanel implements ItemListener, PropertyChangeListener { |
|
|
79 |
|
80 |
private static Logger LOG = Logger.getLogger("org.netbeans.modules.bugtracking.vcshooks.HookPanel"); // NOI18N |
81 |
|
82 |
private static final String LOADING_REPOSITORIES = "loading"; //NOI18N |
83 |
|
70 |
private QuickSearchComboBar qs; |
84 |
private QuickSearchComboBar qs; |
71 |
private Repository selectedRepository; |
85 |
private Repository selectedRepository; |
72 |
|
86 |
|
Lines 98-135
Link Here
|
98 |
} |
112 |
} |
99 |
private UpdateFiledsState updateFiledsState = null; |
113 |
private UpdateFiledsState updateFiledsState = null; |
100 |
|
114 |
|
101 |
public HookPanel(Repository[] repos, Repository toSelect) { |
115 |
public HookPanel() { |
102 |
initComponents(); |
116 |
initComponents(); |
103 |
|
117 |
|
104 |
qs = new QuickSearchComboBar(this); |
118 |
qs = new QuickSearchComboBar(this); |
105 |
issuePanel.add(qs, BorderLayout.NORTH); |
119 |
issuePanel.add(qs, BorderLayout.NORTH); |
106 |
issueLabel.setLabelFor(qs.getCommand()); |
120 |
issueLabel.setLabelFor(qs.getCommand()); |
107 |
|
121 |
|
108 |
repositoryComboBox.setModel(new DefaultComboBoxModel(repos != null ? repos : new Repository[0])); |
122 |
repositoryComboBox.setModel(new DefaultComboBoxModel(new Object[] {LOADING_REPOSITORIES})); |
109 |
repositoryComboBox.setRenderer(new DefaultListCellRenderer() { |
123 |
repositoryComboBox.setRenderer(new DefaultListCellRenderer() { |
|
|
124 |
private final String loadingReposText = NbBundle.getMessage( |
125 |
HookPanel.class, |
126 |
"HookPanel.loadingRepositories"); //NOI18N |
110 |
@Override |
127 |
@Override |
111 |
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { |
128 |
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { |
112 |
if(value != null) { |
129 |
String text; |
113 |
Repository r = (Repository) value; |
130 |
if (value == null) { |
114 |
value = r.getDisplayName(); |
131 |
text = null; |
|
|
132 |
} else if (value == LOADING_REPOSITORIES) { |
133 |
text = loadingReposText; |
134 |
} else { |
135 |
text = ((Repository) value).getDisplayName(); |
115 |
} |
136 |
} |
116 |
return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); |
137 |
Component result = super.getListCellRendererComponent(list, |
|
|
138 |
text, |
139 |
index, |
140 |
isSelected, |
141 |
cellHasFocus); |
142 |
if ((value == LOADING_REPOSITORIES) && (result instanceof JLabel)) { |
143 |
JLabel label = (JLabel) result; |
144 |
Font font = label.getFont(); |
145 |
label.setFont(new Font(font.getName(), |
146 |
font.getStyle() | Font.ITALIC, |
147 |
font.getSize())); |
148 |
} |
149 |
return result; |
117 |
} |
150 |
} |
118 |
}); |
151 |
}); |
119 |
|
152 |
|
120 |
repositoryComboBox.addItemListener(this); |
153 |
repositoryComboBox.addItemListener(this); |
121 |
if(toSelect != null) { |
154 |
enableFields(); |
122 |
repositoryComboBox.setSelectedItem(toSelect); |
155 |
} |
123 |
qs.setRepository(toSelect); |
156 |
|
|
|
157 |
void setRepositories(Repository[] repos) { |
158 |
Repository[] comboData; |
159 |
if (repos == null) { |
160 |
comboData = new Repository[1]; |
161 |
comboData[0] = null; |
124 |
} else { |
162 |
} else { |
125 |
if(repositoryComboBox.getItemCount() > 0) { |
163 |
comboData = new Repository[repos.length + 1]; |
126 |
Repository repo = (Repository) repositoryComboBox.getItemAt(0); |
164 |
comboData[0] = null; |
127 |
repositoryComboBox.setSelectedItem(repo); |
165 |
if (repos.length != 0) { |
128 |
qs.setRepository(repo); |
166 |
System.arraycopy(repos, 0, comboData, 1, repos.length); |
129 |
} |
167 |
} |
130 |
} |
168 |
} |
131 |
enableFields(); |
169 |
repositoryComboBox.setModel(new DefaultComboBoxModel(comboData)); |
132 |
|
170 |
} |
|
|
171 |
|
172 |
/** |
173 |
* Selects the given repository in the combo-box if no repository has been |
174 |
* selected yet by the user. |
175 |
* If the user had already selected some repository before this method |
176 |
* was called, this method does nothing. If this method is called at |
177 |
* the moment the popup of the combo-box is opened, the operation of |
178 |
* pre-selecting the repository is deferred until the popup is closed. If |
179 |
* the popup had been displayed at the moment this method was called |
180 |
* and the user selects some repository during the period since the |
181 |
* call of this method until the deferred selection takes place, the |
182 |
* deferred selection operation is cancelled. |
183 |
* |
184 |
* @param repoToPreselect repository to preselect |
185 |
*/ |
186 |
void preselectRepository(final Repository repoToPreselect) { |
187 |
assert EventQueue.isDispatchThread(); |
188 |
|
189 |
if (repoToPreselect == null) { |
190 |
LOG.finer("preselectRepository(null)"); //NOI18N |
191 |
return; |
192 |
} |
193 |
|
194 |
if (LOG.isLoggable(FINER)) { |
195 |
LOG.finer("preselectRepository(" + repoToPreselect.getDisplayName() + ')'); //NOI18N |
196 |
} |
197 |
|
198 |
if (isRepositorySelected()) { |
199 |
LOG.finest(" - cancelled - already selected by the user"); //NOI18N |
200 |
return; |
201 |
} |
202 |
|
203 |
if (repositoryComboBox.isPopupVisible()) { |
204 |
LOG.finest(" - the popup is visible - deferred"); //NOI18N |
205 |
repositoryComboBox.addPopupMenuListener(new PopupMenuListener() { |
206 |
public void popupMenuWillBecomeVisible(PopupMenuEvent e) { } |
207 |
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { |
208 |
LOG.finer("popupMenuWillBecomeInvisible()"); //NOI18N |
209 |
repositoryComboBox.removePopupMenuListener(this); |
210 |
} |
211 |
public void popupMenuCanceled(PopupMenuEvent e) { |
212 |
LOG.finer("popupMenuCanceled()"); //NOI18N |
213 |
repositoryComboBox.removePopupMenuListener(this); |
214 |
LOG.finest(" - processing deferred selection"); //NOI18N |
215 |
preselectRepositoryUnconditionally(repoToPreselect); |
216 |
} |
217 |
}); |
218 |
} else { |
219 |
preselectRepositoryUnconditionally(repoToPreselect); |
220 |
} |
221 |
} |
222 |
|
223 |
private void preselectRepositoryUnconditionally(Repository repoToPreselect) { |
224 |
assert !isRepositorySelected(); |
225 |
|
226 |
if (LOG.isLoggable(FINER)) { |
227 |
LOG.finer("preselectRepositoryUnconditionally(" + repoToPreselect.getDisplayName() + ')'); //NOI18N |
228 |
} |
229 |
|
230 |
repositoryComboBox.setSelectedItem(repoToPreselect); |
231 |
} |
232 |
|
233 |
/** |
234 |
* Determines whether some bug-tracking repository is selected in the |
235 |
* Issue Tracker combo-box. |
236 |
* |
237 |
* @return {@code true} if some repository is selected, |
238 |
* {@code false} otherwise |
239 |
*/ |
240 |
private boolean isRepositorySelected() { |
241 |
Object selectedItem = repositoryComboBox.getSelectedItem(); |
242 |
return (selectedItem != null) && (selectedItem != LOADING_REPOSITORIES); |
133 |
} |
243 |
} |
134 |
|
244 |
|
135 |
Issue getIssue() { |
245 |
Issue getIssue() { |
Lines 141-148
Link Here
|
141 |
} |
251 |
} |
142 |
|
252 |
|
143 |
private void enableFields() { |
253 |
private void enableFields() { |
144 |
boolean repoSelected = repositoryComboBox.getSelectedItem() != null; |
254 |
boolean repoSelected = isRepositorySelected(); |
145 |
boolean enableUpdateFields = getIssue() != null && repoSelected; |
255 |
boolean enableUpdateFields = repoSelected && (getIssue() != null); |
146 |
|
256 |
|
147 |
if(updateFiledsState == null) { |
257 |
if(updateFiledsState == null) { |
148 |
updateFiledsState = new UpdateFiledsState(); |
258 |
updateFiledsState = new UpdateFiledsState(); |
Lines 398-406
Link Here
|
398 |
// End of variables declaration//GEN-END:variables |
508 |
// End of variables declaration//GEN-END:variables |
399 |
|
509 |
|
400 |
public void itemStateChanged(ItemEvent e) { |
510 |
public void itemStateChanged(ItemEvent e) { |
|
|
511 |
if (LOG.isLoggable(FINER)) { |
512 |
LOG.finer("itemStateChanged() - selected item: " + e.getItem()); //NOI18N |
513 |
} |
401 |
enableFields(); |
514 |
enableFields(); |
402 |
if(e.getStateChange() == ItemEvent.SELECTED) { |
515 |
if(e.getStateChange() == ItemEvent.SELECTED) { |
403 |
Repository repo = (Repository) e.getItem(); |
516 |
Object item = e.getItem(); |
|
|
517 |
Repository repo = (item != LOADING_REPOSITORIES) ? (Repository) item |
518 |
: null; |
404 |
selectedRepository = repo; |
519 |
selectedRepository = repo; |
405 |
if(repo != null) { |
520 |
if(repo != null) { |
406 |
qs.setRepository(repo); |
521 |
qs.setRepository(repo); |