package org.wiztools.restclient.ui; import java.awt.AWTEvent; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.dnd.DropTarget; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.swing.*; import org.wiztools.commons.Charsets; import org.wiztools.commons.FileUtil; import org.wiztools.restclient.MessageI18N; import org.wiztools.restclient.ui.dnd.DndAction; import org.wiztools.restclient.ui.dnd.FileDropTargetListener; import org.wiztools.restclient.util.Util; /** * * @author Subhash */ class KeyValMultiEntryDialog extends EscapableDialog { private final JButton jb_file = new JButton(UIUtil.getIconFromClasspath(RCFileView.iconBasePath + "load_from_file.png")); private final JButton jb_help = new JButton(UIUtil.getIconFromClasspath(RCFileView.iconBasePath + "question.png")); private final JButton jb_add = new JButton("Add"); private final JButton jb_cancel = new JButton("Cancel"); private JScrollPane jsp_in; private final JTextArea jta_in = new JTextArea(18, 35); private final JDialog me; private final RESTUserInterface ui; private final MultiEntryAdd callback; public KeyValMultiEntryDialog(RESTUserInterface ui, MultiEntryAdd callback) { super(ui.getFrame(), true); this.ui = ui; me = this; setTitle("Multi-entry"); this.callback = callback; init(); dnd(); } private void dnd() { FileDropTargetListener l = new FileDropTargetListener(); l.addDndAction(new DndAction() { @Override public void onDrop(List<File> files) { loadFromFile(files.get(0)); } }); new DropTarget(jta_in, l); } private void init() { JPanel jp = new JPanel(); jp.setLayout(new BorderLayout()); JPanel jp_north = new JPanel(); jp_north.setLayout(new FlowLayout(FlowLayout.LEFT)); jb_file.setToolTipText("Load from file"); jb_file.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { loadFromFile(); } }); jp_north.add(jb_file); jb_help.setToolTipText("Help"); jb_help.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(me, MessageI18N.getMessage("help.keyval.multi"), "Help", JOptionPane.INFORMATION_MESSAGE); } }); jp_north.add(jb_help); jp.add(jp_north, BorderLayout.NORTH); jsp_in = new JScrollPane(jta_in); jp.add(jsp_in, BorderLayout.CENTER); JPanel jp_south = new JPanel(); jp_south.setLayout(new FlowLayout()); jb_add.setMnemonic('a'); getRootPane().setDefaultButton(jb_add); jb_add.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent event) { add(); } }); jp_south.add(jb_add); jb_cancel.setMnemonic('c'); jb_cancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent event) { me.setVisible(false); } }); jp_south.add(jb_cancel); jp.add(jp_south, BorderLayout.SOUTH); jp.setBorder(BorderFactory.createEmptyBorder(RESTViewImpl.BORDER_WIDTH, RESTViewImpl.BORDER_WIDTH, RESTViewImpl.BORDER_WIDTH, RESTViewImpl.BORDER_WIDTH)); setContentPane(jp); pack(); // By default have the focus on the text area: jta_in.requestFocus(); } private void loadFromFile() { File f = ui.getOpenFile(FileChooserType.OPEN_TEST_SCRIPT, me); loadFromFile(f); } private void loadFromFile(File f) { if(f != null){ try{ String content = FileUtil.getContentAsString(f, Charsets.UTF_8); Dimension d = jsp_in.getPreferredSize(); jta_in.setText(content); jta_in.setCaretPosition(0); jsp_in.setPreferredSize(d); } catch(IOException ex){ ui.getView().showError(Util.getStackTrace(ex)); } } } private void add() { String str = jta_in.getText(); if ("".equals(str.trim())) { JOptionPane.showMessageDialog(me, "Please enter input text!", "No Input", JOptionPane.ERROR_MESSAGE); return; } String[] line_arr = str.split("\\n"); List<String> linesNotMatching = new ArrayList<>(); Map<String, String> keyValMap = new LinkedHashMap<>(); for (String line : line_arr) { int index = line.indexOf(':'); if ((index > -1) && (index != 0) && (index != (line.length() - 1))) { String key = line.substring(0, index); String value = line.substring(index + 1); key = key.trim(); value = value.trim(); if ("".equals(key) || "".equals(value)) { linesNotMatching.add(line); } else { keyValMap.put(key, value); } } else { if (!"".equals(line.trim())) { // Add only non-blank line linesNotMatching.add(line); } } } me.setVisible(false); callback.add(keyValMap, linesNotMatching); } @Override public void setVisible(boolean boo){ super.setVisible(boo); if(boo == true){ jta_in.requestFocus(); } } @Override public void doEscape(AWTEvent event) { me.setVisible(false); } }