ButtonExpandText.java

/*******************************************************************************
 * Copyhacked (H) 2012-2025.
 * This program and the accompanying materials
 * are made available under no term at all, use it like
 * you want, but share and discuss it
 * every time possible with every body.
 *
 * Contributors:
 *      ron190 at ymail dot com - initial implementation
 *******************************************************************************/
package com.jsql.view.swing.panel.util;

import com.jsql.view.swing.text.JPopupTextArea;
import com.jsql.view.swing.text.JTextAreaPlaceholder;
import com.jsql.view.swing.util.UiUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/**
 * A button displayed in address.
 */
public class ButtonExpandText extends JButton {

    /**
     * Create a button in address bar.
     */
    public ButtonExpandText(JTextField sourceTextField) {
        this.setPreferredSize(new Dimension(16, 16));
        this.setContentAreaFilled(false);

        this.setIcon(UiUtil.EXPAND.getIcon());
        this.setRolloverIcon(UiUtil.EXPAND_HOVER.getIcon());
        this.setPressedIcon(UiUtil.EXPAND_PRESSED.getIcon());

        JTextArea textAreaInDialog = new JPopupTextArea(new JTextAreaPlaceholder("Multiline text")).getProxy();
        textAreaInDialog.getCaret().setBlinkRate(500);

        final JDialog dialogWithTextarea = new JDialog();
        dialogWithTextarea.setUndecorated(true);
        dialogWithTextarea.getContentPane().add(new JScrollPane(textAreaInDialog));
        dialogWithTextarea.pack();
        dialogWithTextarea.addWindowFocusListener(new WindowAdapter() {
            @Override
            public void windowLostFocus(WindowEvent e) {
                sourceTextField.setText(textAreaInDialog.getText().replace("\n", "\\n").replace("\r", "\\r"));
                dialogWithTextarea.dispose();
            }
        });
        dialogWithTextarea.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                sourceTextField.setText(textAreaInDialog.getText().replace("\n", "\\n").replace("\r", "\\r"));
                super.windowClosing(e);
            }
        });

        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                textAreaInDialog.setText(sourceTextField.getText().replace("\\n", "\n").replace("\\r", "\r"));
                dialogWithTextarea.setVisible(!dialogWithTextarea.isVisible());
                dialogWithTextarea.setSize(sourceTextField.getWidth(), 300);
                dialogWithTextarea.setLocation(sourceTextField.getLocationOnScreen());
            }
        });

        dialogWithTextarea.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
            .put(
                KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
                "Cancel"
            );
        dialogWithTextarea.getRootPane().getActionMap()
            .put("Cancel", new AbstractAction() {
                public void actionPerformed(ActionEvent e) {
                    dialogWithTextarea.dispose();
                }
            });
    }
}