/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.support.xml; import com.eviware.soapui.support.UISupport; import com.eviware.soapui.support.xml.actions.EnableLineNumbersAction; import com.eviware.soapui.support.xml.actions.FormatXmlAction; import com.eviware.soapui.support.xml.actions.GoToLineAction; import com.eviware.soapui.support.xml.actions.InsertBase64FileTextAreaAction; import com.eviware.soapui.support.xml.actions.LoadXmlTextAreaAction; import com.eviware.soapui.support.xml.actions.SaveXmlTextAreaAction; import com.eviware.soapui.ui.support.FindAndReplaceDialogView; import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; import org.fife.ui.rsyntaxtextarea.SyntaxConstants; import org.fife.ui.rsyntaxtextarea.TokenMakerFactory; import org.fife.ui.rtextarea.RTextScrollPane; import javax.mail.internet.ContentType; import javax.mail.internet.ParseException; import javax.swing.BorderFactory; import javax.swing.JPopupMenu; import javax.swing.JSeparator; import javax.swing.KeyStroke; import java.awt.Color; public class SyntaxEditorUtil { public static RSyntaxTextArea createDefaultXmlSyntaxTextArea() { return createDefaultSyntaxTextArea(SyntaxConstants.SYNTAX_STYLE_XML); } public static RSyntaxTextArea createDefaultJsonSyntaxTextArea() { return createDefaultSyntaxTextArea(SyntaxConstants.SYNTAX_STYLE_XML); } public static RSyntaxTextArea createDefaultJavaScriptSyntaxTextArea() { return createDefaultSyntaxTextArea(SyntaxConstants.SYNTAX_STYLE_JAVASCRIPT); } public static RSyntaxTextArea createDefaultSQLSyntaxTextArea() { RSyntaxTextArea textArea = new RSyntaxTextArea() { protected void configurePopupMenu(javax.swing.JPopupMenu popupMenu) { // Suppress superclass behavior } }; textArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_SQL); return decorateSyntaxArea(textArea); } private static RSyntaxTextArea decorateSyntaxArea(RSyntaxTextArea textArea) { textArea.setFont(UISupport.getEditorFont()); textArea.setCodeFoldingEnabled(true); textArea.setAntiAliasingEnabled(true); textArea.setCaretPosition(0); textArea.setBorder(BorderFactory.createMatteBorder(0, 2, 0, 0, Color.WHITE)); return textArea; } private static RSyntaxTextArea createDefaultSyntaxTextArea(String type) { RSyntaxTextArea textArea = new RSyntaxTextArea(); textArea.setSyntaxEditingStyle(type); return decorateSyntaxArea(textArea); } public static RSyntaxTextArea addDefaultActions(RSyntaxTextArea editor, RTextScrollPane scrollPane, boolean readOnly) { JPopupMenu popupMenu = editor.getPopupMenu(); SaveXmlTextAreaAction saveXmlTextAreaAction = new SaveXmlTextAreaAction(editor, "Save"); EnableLineNumbersAction enableLineNumbersAction = new EnableLineNumbersAction(scrollPane, "Toggle Line Numbers"); GoToLineAction goToLineAction = new GoToLineAction(editor, "Go To Line"); int cnt = popupMenu.getComponentCount(); for (int i = cnt - 1; i >= 0; i--) { if (popupMenu.getComponent(i) instanceof JSeparator) { popupMenu.remove(popupMenu.getComponent(i)); } } FormatXmlAction formatXmlAction = null; if (!readOnly) { formatXmlAction = new FormatXmlAction(editor); FindAndReplaceDialogView findAndReplaceDialog = new FindAndReplaceDialogView(editor); popupMenu.insert(formatXmlAction, 1); popupMenu.addSeparator(); popupMenu.add(findAndReplaceDialog); if (UISupport.isMac()) { editor.getInputMap().put(KeyStroke.getKeyStroke("meta F"), findAndReplaceDialog); } else { editor.getInputMap().put(KeyStroke.getKeyStroke("ctrl F"), findAndReplaceDialog); } } popupMenu.addSeparator(); popupMenu.add(goToLineAction); popupMenu.add(enableLineNumbersAction); popupMenu.addSeparator(); popupMenu.add(saveXmlTextAreaAction); LoadXmlTextAreaAction loadXmlTextAreaAction = null; if (!readOnly) { loadXmlTextAreaAction = new LoadXmlTextAreaAction(editor, "Load"); popupMenu.add(loadXmlTextAreaAction); popupMenu.add(new InsertBase64FileTextAreaAction(editor, "Insert File as Base64")); } if (UISupport.isMac()) { editor.getInputMap().put(KeyStroke.getKeyStroke("meta S"), saveXmlTextAreaAction); editor.getInputMap().put(KeyStroke.getKeyStroke("control L"), enableLineNumbersAction); editor.getInputMap().put(KeyStroke.getKeyStroke("control G"), goToLineAction); if (!readOnly) { editor.getInputMap().put(KeyStroke.getKeyStroke("shift meta F"), formatXmlAction); editor.getInputMap().put(KeyStroke.getKeyStroke("meta L"), loadXmlTextAreaAction); } } else { editor.getInputMap().put(KeyStroke.getKeyStroke("ctrl S"), saveXmlTextAreaAction); editor.getInputMap().put(KeyStroke.getKeyStroke("alt L"), enableLineNumbersAction); editor.getInputMap().put(KeyStroke.getKeyStroke("control G"), goToLineAction); if (!readOnly) { editor.getInputMap().put(KeyStroke.getKeyStroke("alt F"), formatXmlAction); editor.getInputMap().put(KeyStroke.getKeyStroke("ctrl L"), loadXmlTextAreaAction); } } return editor; } public static void setMediaType(RSyntaxTextArea inputArea, String mediaType) { if (mediaType.contains("json")) { inputArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVASCRIPT); } else if (mediaType.contains("xml")) { inputArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_XML); } else { try { ContentType contentType = new ContentType(mediaType); String subType = contentType.getSubType(); String textContentType = "text/" + subType.replaceAll(".*\\+", ""); if (TokenMakerFactory.getDefaultInstance().keySet().contains(textContentType)) { inputArea.setSyntaxEditingStyle(textContentType); } else { inputArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_NONE); } } catch (ParseException e) { inputArea.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_NONE); } } // Force rendering with new style inputArea.setText(inputArea.getText()); } }