/*
 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Oracle designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *
 * This code 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
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

package jdk.nashorn.tools.jjs;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.function.Consumer;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

A minimal Swing editor as a fallback when the user does not specify an external editor.
/** * A minimal Swing editor as a fallback when the user does not specify an * external editor. */
final class EditPad extends JFrame implements Runnable { private static final long serialVersionUID = 1; private final Consumer<String> errorHandler; private final String initialText; private final boolean[] closeLock; private final Consumer<String> saveHandler; EditPad(final Consumer<String> errorHandler, final String initialText, final boolean[] closeLock, final Consumer<String> saveHandler) { super("Edit Pad (Experimental)"); this.errorHandler = errorHandler; this.initialText = initialText; this.closeLock = closeLock; this.saveHandler = saveHandler; } @Override public void run() { addWindowListener(new WindowAdapter() { @Override public void windowClosing(final WindowEvent e) { EditPad.this.dispose(); notifyClose(); } }); setLocationRelativeTo(null); setLayout(new BorderLayout()); JTextArea textArea = new JTextArea(initialText); add(new JScrollPane(textArea), BorderLayout.CENTER); add(buttons(textArea), BorderLayout.SOUTH); setSize(800, 600); setVisible(true); } private JPanel buttons(final JTextArea textArea) { FlowLayout flow = new FlowLayout(); flow.setHgap(35); JPanel buttons = new JPanel(flow); JButton cancel = new JButton("Cancel"); cancel.setMnemonic(KeyEvent.VK_C); JButton accept = new JButton("Accept"); accept.setMnemonic(KeyEvent.VK_A); JButton exit = new JButton("Exit"); exit.setMnemonic(KeyEvent.VK_X); buttons.add(cancel); buttons.add(accept); buttons.add(exit); cancel.addActionListener(e -> { close(); }); accept.addActionListener(e -> { saveHandler.accept(textArea.getText()); }); exit.addActionListener(e -> { saveHandler.accept(textArea.getText()); close(); }); return buttons; } private void close() { setVisible(false); dispose(); notifyClose(); } private void notifyClose() { synchronized (closeLock) { closeLock[0] = true; closeLock.notify(); } } static void edit(final Consumer<String> errorHandler, final String initialText, final Consumer<String> saveHandler) { boolean[] closeLock = new boolean[1]; SwingUtilities.invokeLater( new EditPad(errorHandler, initialText, closeLock, saveHandler)); synchronized (closeLock) { while (!closeLock[0]) { try { closeLock.wait(); } catch (final InterruptedException ex) { // ignore and loop } } } } }