/* * Copyright (C) 2015 CS SI * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 3 of the License, or (at your option) * any later version. * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, see http://www.gnu.org/licenses/ */ package org.esa.snap.smart.configurator.ui; import org.esa.snap.ui.ModalDialog; import javax.swing.JScrollPane; import java.awt.Window; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * * Dialog to edit a line with multiple separators in a text area showing one line per peace of string. * It manages double quotes, meaning for the string "A B \"C D\"" with space as separator it shows in the dialog: * A * B * C D * * @author Nicolas Ducoin */ public class LineSplitTextEditDialog extends ModalDialog { private javax.swing.JTextArea textArea; private String separator; private String textWithSeparators; /** * Creates new form LineSplitTextEditDialog * * @param parent the parent window * @param textWithSeparators the text to be edited or displayed * @param separator the separator for this text, the text will get split using this * @param title the title of the dialog */ public LineSplitTextEditDialog( Window parent, String textWithSeparators, String separator, String title) { this(parent, textWithSeparators, separator, title, true); } /** * Creates new form LineSplitTextEditDialog * * @param parent the parent window * @param textWithSeparators the text to be edited or displayed * @param separator the separator for this text, the text will get split using this * @param title the title of the dialog * @param canEdit if false, the text won't be editable */ public LineSplitTextEditDialog( Window parent, String textWithSeparators, String separator, String title, boolean canEdit) { super(parent, title, ID_OK_CANCEL, null); this.textWithSeparators = textWithSeparators; this.separator = separator; initComponents(); String multiLineText = toMultiLine(textWithSeparators, separator); textArea.setText(multiLineText); if(!canEdit) { textArea.setEditable(false); } } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") private void initComponents() { JScrollPane textAreaScrollPane = new javax.swing.JScrollPane(); textArea = new javax.swing.JTextArea(); textArea.setColumns(20); textArea.setRows(10); textAreaScrollPane.setViewportView(textArea); setContent(textAreaScrollPane); } @Override protected void onOK() { String multiLineString = textArea.getText(); textWithSeparators = toMonoLine(multiLineString); super.onOK(); } /** * * @return the text with separator, it can be the text passed in the contructor (if cancel was pressed) * or a modified text, comming from the multi-line editing window */ public String getTextWithSeparators() { return textWithSeparators; } static String toMultiLine(String monoLineString, String separator) { StringBuilder stringBuilder = new StringBuilder(); Pattern regex = Pattern.compile("[^" + separator + "\"']+|\"[^\"]*\"|'[^']*'"); Matcher regexMatcher = regex.matcher(monoLineString); while (regexMatcher.find()) { stringBuilder.append(regexMatcher.group()); stringBuilder.append(System.lineSeparator()); } return stringBuilder.toString(); } String toMonoLine(String multiLineString) { StringBuilder builder = new StringBuilder(); String[] linesOfText = multiLineString.split(System.lineSeparator()); if(linesOfText.length > 0) { builder.append(linesOfText[0]); for (int i=1 ; i<linesOfText.length ; i++) { builder.append(separator); builder.append(linesOfText[i]); } } return builder.toString(); } }