package fr.adrienbrault.idea.symfony2plugin.profiler;
import com.intellij.openapi.project.Project;
import com.intellij.ui.SimpleColoredComponent;
import com.jetbrains.php.PhpIcons;
import fr.adrienbrault.idea.symfony2plugin.Symfony2Icons;
import fr.adrienbrault.idea.symfony2plugin.profiler.collector.DefaultDataCollectorInterface;
import fr.adrienbrault.idea.symfony2plugin.profiler.collector.MailCollectorInterface;
import fr.adrienbrault.idea.symfony2plugin.profiler.dict.LocalProfilerRequest;
import fr.adrienbrault.idea.symfony2plugin.profiler.dict.MailMessage;
import fr.adrienbrault.idea.symfony2plugin.profiler.dict.ProfilerRequestInterface;
import fr.adrienbrault.idea.symfony2plugin.profiler.factory.ProfilerFactoryUtil;
import icons.TwigIcons;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Collection;
/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class Symfony2WebProfilerForm {
private JPanel panel1;
private JTabbedPane tabbedPane1;
private JEditorPane editorPane1;
private JList list1;
private JButton button1;
private JButton button2;
private JList<ProfilerRequestInterface> listRequest;
private JList<RequestDetails> listRequestDetails;
private ProfilerIndexInterface profilerIndex;
Symfony2WebProfilerForm(@NotNull Project project) {
DefaultListModel listenModel = new DefaultListModel();
this.list1.setModel(listenModel);
this.list1.setCellRenderer(new MyLookupCellRenderer());
DefaultListModel<ProfilerRequestInterface> modelRequests = new DefaultListModel<>();
this.listRequest.setModel(modelRequests);
this.listRequest.setCellRenderer(new RequestCellRender());
DefaultListModel<RequestDetails> modelRequestsDetails = new DefaultListModel<>();
this.listRequestDetails.setModel(modelRequestsDetails);
this.listRequestDetails.setCellRenderer(new RequestDetailsCellRender());
this.profilerIndex = ProfilerFactoryUtil.createIndex(project);
if(this.profilerIndex == null) {
return;
}
button1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
Symfony2WebProfilerForm.this.start();
}
});
list1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
JList list = (JList) e.getSource();
if (e.getClickCount() == 2) {
if (list.getSelectedValue() instanceof LocalProfilerRequest) {
Symfony2WebProfilerForm.this.selected((LocalProfilerRequest) list.getSelectedValue());
}
if (list.getSelectedValue() instanceof MailMessage) {
Symfony2WebProfilerForm.this.selected((MailMessage) list.getSelectedValue());
}
}
}
});
button2.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
Symfony2WebProfilerForm.this.renderRequests();
}
});
listRequest.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
super.mouseClicked(e);
if (e.getClickCount() == 1) {
JList list = (JList) e.getSource();
if (list.getSelectedValue() instanceof LocalProfilerRequest) {
Symfony2WebProfilerForm.this.renderRequestDetails((LocalProfilerRequest) list.getSelectedValue());
}
}
}
});
}
private void renderRequests() {
DefaultListModel<ProfilerRequestInterface> listModel = (DefaultListModel<ProfilerRequestInterface>) listRequest.getModel();
listModel.removeAllElements();
this.profilerIndex.getRequests().forEach(listModel::addElement);
}
private void renderRequestDetails(@NotNull ProfilerRequestInterface profilerRequest) {
DefaultListModel<RequestDetails> listModel = (DefaultListModel<RequestDetails>) listRequestDetails.getModel();
listModel.removeAllElements();
DefaultDataCollectorInterface defaultDataCollector = profilerRequest.getCollector(DefaultDataCollectorInterface.class);
if(defaultDataCollector != null) {
if(defaultDataCollector.getRoute() != null) {
listModel.addElement(new RequestDetails(defaultDataCollector.getRoute(), Symfony2Icons.ROUTE));
}
if(defaultDataCollector.getController() != null) {
listModel.addElement(new RequestDetails(defaultDataCollector.getController(), PhpIcons.METHOD_ICON));
}
if(defaultDataCollector.getTemplate() != null) {
listModel.addElement(new RequestDetails(defaultDataCollector.getTemplate(), TwigIcons.TwigFileIcon));
}
}
}
JComponent createComponent() {
return panel1;
}
public void selected(@NotNull ProfilerRequestInterface profilerRequest) {
MailCollectorInterface collector = profilerRequest.getCollector(MailCollectorInterface.class);
if(collector != null) {
Collection<MailMessage> messages = collector.getMessages();
if(messages.size() > 0) {
this.editorPane1.setText(messages.iterator().next().getMessage());
}
}
}
public void selected(MailMessage mailMessage) {
this.editorPane1.setText(mailMessage.getMessage());
}
private void start() {
DefaultListModel<MailMessage> listModel = (DefaultListModel) list1.getModel();
listModel.removeAllElements();
for(ProfilerRequestInterface profilerRequest: this.profilerIndex.getRequests()) {
MailCollectorInterface collector = profilerRequest.getCollector(MailCollectorInterface.class);
if(collector == null) {
continue;
}
Collection<MailMessage> messages = collector.getMessages();
if(messages.size() > 0) {
for(MailMessage message : messages) {
listModel.addElement(message);
}
}
}
}
private class MyLookupCellRenderer extends SimpleColoredComponent implements ListCellRenderer {
DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if(value instanceof LocalProfilerRequest) {
renderer.setText(((LocalProfilerRequest) value).getUrl());
}
if(value instanceof MailMessage) {
renderer.setText(((MailMessage) value).getTitle());
}
return renderer;
}
}
private class RequestCellRender extends SimpleColoredComponent implements ListCellRenderer {
DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if(value instanceof LocalProfilerRequest) {
renderer.setText(((LocalProfilerRequest) value).getUrl());
}
return renderer;
}
}
private class RequestDetailsCellRender extends SimpleColoredComponent implements ListCellRenderer {
DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if(value instanceof RequestDetails) {
renderer.setText(((RequestDetails) value).getText());
renderer.setIcon(((RequestDetails) value).getIcon());
}
return renderer;
}
}
private static class RequestDetails {
@NotNull
private String text;
@NotNull
private Icon icon;
RequestDetails(@NotNull String text, @NotNull Icon icon) {
this.text = text;
this.icon = icon;
}
@NotNull
private String getText() {
return text;
}
@NotNull
private Icon getIcon() {
return icon;
}
}
}