View Javadoc
1   /*******************************************************************************
2    * Copyhacked (H) 2012-2025.
3    * This program and the accompanying materials
4    * are made available under no term at all, use it like
5    * you want, but share and discuss it
6    * every time possible with every body.
7    *
8    * Contributors:
9    *      ron190 at ymail dot com - initial implementation
10   *******************************************************************************/
11  package com.jsql.view.swing.panel.util;
12  
13  import com.jsql.view.swing.text.JPopupTextArea;
14  import com.jsql.view.swing.text.JTextAreaPlaceholder;
15  import com.jsql.view.swing.util.UiUtil;
16  
17  import javax.swing.*;
18  import java.awt.*;
19  import java.awt.event.*;
20  
21  /**
22   * A button displayed in address.
23   */
24  public class ButtonExpandText extends JButton {
25  
26      /**
27       * Create a button in address bar.
28       */
29      public ButtonExpandText(JTextField sourceTextField) {
30          this.setPreferredSize(new Dimension(16, 16));
31          this.setContentAreaFilled(false);
32  
33          this.setIcon(UiUtil.EXPAND.getIcon());
34          this.setRolloverIcon(UiUtil.EXPAND_HOVER.getIcon());
35          this.setPressedIcon(UiUtil.EXPAND_PRESSED.getIcon());
36  
37          JTextArea textAreaInDialog = new JPopupTextArea(new JTextAreaPlaceholder("Multiline text")).getProxy();
38          textAreaInDialog.getCaret().setBlinkRate(500);
39  
40          final JDialog dialogWithTextarea = new JDialog();
41          dialogWithTextarea.setUndecorated(true);
42          dialogWithTextarea.getContentPane().add(new JScrollPane(textAreaInDialog));
43          dialogWithTextarea.pack();
44          dialogWithTextarea.addWindowFocusListener(new WindowAdapter() {
45              @Override
46              public void windowLostFocus(WindowEvent e) {
47                  sourceTextField.setText(textAreaInDialog.getText().replace("\n", "\\n").replace("\r", "\\r"));
48                  dialogWithTextarea.dispose();
49              }
50          });
51          dialogWithTextarea.addWindowListener(new WindowAdapter() {
52              @Override
53              public void windowClosing(WindowEvent e) {
54                  sourceTextField.setText(textAreaInDialog.getText().replace("\n", "\\n").replace("\r", "\\r"));
55                  super.windowClosing(e);
56              }
57          });
58  
59          this.addMouseListener(new MouseAdapter() {
60              @Override
61              public void mouseClicked(MouseEvent e) {
62                  textAreaInDialog.setText(sourceTextField.getText().replace("\\n", "\n").replace("\\r", "\r"));
63                  dialogWithTextarea.setVisible(!dialogWithTextarea.isVisible());
64                  dialogWithTextarea.setSize(sourceTextField.getWidth(), 300);
65                  dialogWithTextarea.setLocation(sourceTextField.getLocationOnScreen());
66              }
67          });
68  
69          dialogWithTextarea.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW)
70              .put(
71                  KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0),
72                  "Cancel"
73              );
74          dialogWithTextarea.getRootPane().getActionMap()
75              .put("Cancel", new AbstractAction() {
76                  public void actionPerformed(ActionEvent e) {
77                      dialogWithTextarea.dispose();
78                  }
79              });
80      }
81  }