package com.intellij.diagnostic.errordialog; import com.intellij.diagnostic.Developer; import com.intellij.diagnostic.DiagnosticBundle; import com.intellij.diagnostic.IdeErrorsDialog; import com.intellij.ui.ComboboxSpeedSearch; import com.intellij.ui.IdeBorderFactory; import com.intellij.util.containers.ComparatorUtil; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Collection; /** * @author ksafonov */ public class DetailsTabForm { private JTextArea myDetailsPane; private JPanel myContentPane; private LabeledTextComponent myCommentsArea; private JPanel myDetailsHolder; private JButton myAnalyzeStacktraceButton; private JComboBox myAssigneeComboBox; private JPanel myAssigneePanel; private Integer myAssigneeId; private boolean myProcessEvents = true; public DetailsTabForm(@Nullable Action analyzeAction) { myCommentsArea.setTitle(DiagnosticBundle.message("error.dialog.comment.prompt")); myDetailsPane.setBackground(UIUtil.getTextFieldBackground()); myDetailsHolder.setPreferredSize(JBUI.size(IdeErrorsDialog.COMPONENTS_WIDTH, 150)); myDetailsHolder.setBorder(IdeBorderFactory.createBorder()); if (analyzeAction != null) { myAnalyzeStacktraceButton.setAction(analyzeAction); } else { myAnalyzeStacktraceButton.setVisible(false); } myAssigneeComboBox.setRenderer(new DeveloperRenderer(myAssigneeComboBox.getRenderer())); myAssigneeComboBox.setPrototypeDisplayValue(new Developer(0, "Here Goes Some Very Long String")); myAssigneeComboBox.addActionListener(new ActionListenerProxy(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { myAssigneeId = getAssigneeId(); } })); new ComboboxSpeedSearch(myAssigneeComboBox) { @Override protected String getElementText(Object element) { return element == null ? "" : ((Developer) element).getSearchableText(); } }; } public void setCommentsAreaVisible(boolean b) { myCommentsArea.getContentPane().setVisible(b); } public void setDetailsText(String s) { LabeledTextComponent.setText(myDetailsPane, s, false); } public void setCommentsText(String s) { LabeledTextComponent.setText(myCommentsArea.getTextComponent(), s, true); } public JPanel getContentPane() { return myContentPane; } public JComponent getPreferredFocusedComponent() { if (myCommentsArea.getContentPane().isVisible()) { return myCommentsArea.getTextComponent(); } return null; } public void setCommentsTextEnabled(boolean b) { if (myCommentsArea.getContentPane().isVisible()) { myCommentsArea.getTextComponent().setEnabled(b); } } public void addCommentsListener(final LabeledTextComponent.TextListener l) { myCommentsArea.addCommentsListener(l); } public void setAssigneeVisible(boolean visible) { myAssigneePanel.setVisible(visible); } public void setDevelopers(Collection<Developer> developers) { myAssigneeComboBox.setModel(new DefaultComboBoxModel(developers.toArray())); updateSelectedDeveloper(); } public void setAssigneeId(@Nullable Integer assigneeId) { myAssigneeId = assigneeId; if (myAssigneeComboBox.getItemCount() > 0) { updateSelectedDeveloper(); } } private void updateSelectedDeveloper() { myProcessEvents = false; Integer index = null; for (int i = 0; i < myAssigneeComboBox.getItemCount(); i++) { Developer developer = (Developer) myAssigneeComboBox.getItemAt(i); if (ComparatorUtil.equalsNullable(developer.getId(), myAssigneeId)) { index = i; break; } } setSelectedAssigneeIndex(index); myProcessEvents = true; } private void setSelectedAssigneeIndex(Integer index) { if (index == null) { myAssigneeComboBox.setSelectedItem(null); } else { myAssigneeComboBox.setSelectedIndex(index); } } @Nullable public Integer getAssigneeId() { Developer assignee = (Developer) myAssigneeComboBox.getSelectedItem(); return assignee == null ? null : assignee.getId(); } public void addAssigneeListener(ActionListener listener) { myAssigneeComboBox.addActionListener(new ActionListenerProxy(listener)); } private class ActionListenerProxy implements ActionListener { private final ActionListener myDelegate; public ActionListenerProxy(ActionListener delegate) { myDelegate = delegate; } @Override public void actionPerformed(ActionEvent e) { if (myProcessEvents) { myDelegate.actionPerformed(e); } } } }