1
2
3
4
5
6
7
8
9
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
23
24 public class ButtonExpandText extends JButton {
25
26
27
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 }