blob: 55f93670819163feb207765a47046883069299eb [file] [log] [blame]
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.UIUtil;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
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, boolean internalMode) {
myCommentsArea.setTitle(DiagnosticBundle.message("error.dialog.comment.prompt"));
myDetailsPane.setBackground(UIUtil.getTextFieldBackground());
myDetailsHolder.setPreferredSize(new Dimension(IdeErrorsDialog.COMPONENTS_WIDTH, internalMode ? 500 : 205));
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);
}
}
}
}