package org.wiztools.restclient.ui.resbody; import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; import org.wiztools.restclient.IGlobalOptions; import org.wiztools.restclient.ServiceLocator; import org.wiztools.restclient.persistence.XMLException; import org.wiztools.restclient.bean.ContentType; import org.wiztools.restclient.ui.*; import org.wiztools.restclient.util.HTMLIndentUtil; import org.wiztools.restclient.util.HttpUtil; import org.wiztools.restclient.util.JSONUtil; import org.wiztools.restclient.util.XMLIndentUtil; import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.IOException; import org.wiztools.restclient.ui.component.BodyPopupMenu; import org.wiztools.restclient.ui.component.BodyPopupMenuListener; /** * * @author subwiz */ public class ResBodyTextPanel extends AbstractResBody implements FontableEditor { @Inject RESTView view; // Response private final ScriptEditor se_response = ScriptEditorFactory.getXMLScriptEditor(); private BodyPopupMenu bodyPopupMenu; @PostConstruct protected void init() { se_response.setEditable(false); // First the pop-up menu for xml formatting: BodyPopupMenuListener listener = new BodyPopupMenuListener() { @Override public void onSuccess(String msg) { view.setStatusMessage(msg); } @Override public void onFailure(String msg) { view.setStatusMessage(msg); } @Override public void onMessage(String msg) { view.setStatusMessage(msg); } }; final BodyPopupMenu bpm = new BodyPopupMenu(se_response, listener, true); this.bodyPopupMenu = bpm; // Attach popup menu if (se_response.getEditorComponent() instanceof RSyntaxTextArea) { se_response.getEditorComponent().addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { showPopup(e); } @Override public void mouseReleased(MouseEvent e) { showPopup(e); } private void showPopup(final MouseEvent e) { if("".equals(se_response.getText().trim())){ // No response body return; } if (e.isPopupTrigger()) { bpm.show(e.getComponent(), e.getX(), e.getY()); } } }); } // Layout setBorder(BorderFactory.createEmptyBorder()); setLayout(new GridLayout()); add(se_response.getEditorView()); } @Override public void setEditorFont(Font font) { se_response.getEditorComponent().setFont(font); } @Override public Font getEditorFont() { return se_response.getEditorComponent().getFont(); } @Override public void setBody(byte[] body, ContentType type) { // Call super method super.setBody(body, type); bodyPopupMenu.cancelRunningJob(); // JSON or XML? final boolean isXml = HttpUtil.isXmlContentType(type.getContentType()); final boolean isJson = HttpUtil.isJsonContentType(type.getContentType()); final boolean isHTML = HttpUtil.isHTMLContentType(type.getContentType()); // Get the options: IGlobalOptions options = ServiceLocator.getInstance(IGlobalOptions.class); // Set syntax color: if(options.isPropertyTrue("response.body.syntax.color")) { if(isXml) { se_response.setSyntax(TextEditorSyntax.XML); } if(isJson) { se_response.setSyntax(TextEditorSyntax.JSON); } if(HttpUtil.isJsContentType(type.getContentType())) { se_response.setSyntax(TextEditorSyntax.JS); } if(HttpUtil.isCssContentType(type.getContentType())) { se_response.setSyntax(TextEditorSyntax.CSS); } if(isHTML) { se_response.setSyntax(TextEditorSyntax.HTML); } } else { // No syntax! se_response.setSyntax(TextEditorSyntax.NONE); } // Find if you need to indent final String responseBody = new String(getBody(), HttpUtil.getCharsetDefault(type)); if(options.isPropertyTrue("response.body.indent")) { if(isXml){ try{ String indentedResponseBody = XMLIndentUtil.getIndented(responseBody); se_response.setText(indentedResponseBody); } catch(IOException | XMLException ex){ view.setStatusMessage("XML indentation failed."); // LOG.warning(ex.getMessage()); se_response.setText(responseBody); } } else if(isJson){ try{ String indentedResponseBody = JSONUtil.indentJSON(responseBody); se_response.setText(indentedResponseBody); } catch(JSONUtil.JSONParseException ex){ view.setStatusMessage("JSON indentation failed."); se_response.setText(responseBody); } } else if(isHTML){ try{ String indentedResponseBody = HTMLIndentUtil.getIndented(responseBody); se_response.setText(indentedResponseBody); } catch(Exception ex){ view.setStatusMessage("HTML indentation failed."); se_response.setText(responseBody); } } else{ view.setStatusMessage("Response body neither XML,HTML nor JSON. No indentation."); se_response.setText(responseBody); } } else { // No indentation se_response.setText(responseBody); } se_response.setCaretPosition(0); } @Override public void clearUI() { se_response.setText(""); } }