27
|
1 /*
|
|
2 * View-related pasteboard stuff.
|
|
3 */
|
|
4 package name.blackcap.clipman
|
|
5
|
|
6 import java.awt.Color
|
|
7 import java.awt.Dimension
|
|
8 import javax.swing.*
|
|
9 import javax.swing.border.*
|
|
10 import javax.swing.text.html.StyleSheet
|
|
11 import javax.swing.text.html.HTMLEditorKit
|
|
12
|
|
13 /* border widths */
|
|
14 val OUTER_BORDER_TOP = 3
|
|
15 val OUTER_BORDER = 9
|
|
16 val INNER_BORDER = 1
|
|
17 val MARGIN_BORDER = 3
|
|
18
|
|
19 /**
|
|
20 * What we use to display the text that is or was in the clipboard.
|
|
21 */
|
|
22 class ClipText: JTextPane() {
|
|
23 private val normalBorder = CompoundBorder(LineBorder(Color.GRAY, INNER_BORDER),
|
|
24 EmptyBorder(MARGIN_BORDER, MARGIN_BORDER, MARGIN_BORDER, MARGIN_BORDER))
|
|
25 private val selectedBorder = CompoundBorder(LineBorder(Color.BLACK, INNER_BORDER+1),
|
|
26 EmptyBorder(MARGIN_BORDER-1, MARGIN_BORDER-1, MARGIN_BORDER-1, MARGIN_BORDER-1))
|
|
27 init {
|
|
28 border = normalBorder
|
|
29 setEditable(false)
|
|
30 alignmentX = JTextPane.LEFT_ALIGNMENT
|
|
31 resize()
|
|
32 }
|
|
33
|
|
34 /**
|
|
35 * We allow the text to be considered "selected;" such text is used
|
|
36 * as the target for any subsequent editing operation.
|
|
37 */
|
|
38 var selected: Boolean
|
|
39 get() {
|
|
40 return border === selectedBorder
|
|
41 }
|
|
42 set(value) {
|
|
43 border = if (value) { selectedBorder } else { normalBorder }
|
|
44 }
|
|
45
|
|
46 /**
|
|
47 * Refuse to fill the window in the vertical dimension, because doing
|
|
48 * so leads to a misleading display of the clipboard contents, falsely
|
|
49 * implying the existence of a bunch of trailing whitespace.
|
|
50 */
|
|
51 override fun getMaximumSize(): Dimension {
|
|
52 return Dimension(Int.MAX_VALUE, preferredSize.height)
|
|
53 }
|
|
54
|
|
55 /**
|
|
56 * Dynamically size or resize this view.
|
|
57 */
|
|
58 fun resize() {
|
|
59 autoSize(queue.v.parent.size.width -
|
|
60 2 * (PANEL_BORDER + OUTER_BORDER + INNER_BORDER + MARGIN_BORDER))
|
|
61 }
|
|
62 }
|
|
63
|
|
64
|
|
65 /**
|
|
66 * The stock HTMLEditorKit shares all style sheet data between all its
|
|
67 * instances. How unbelievably braindamaged. Correct that.
|
|
68 */
|
|
69 class MyEditorKit: HTMLEditorKit() {
|
|
70 private var _styleSheet = defaultStyleSheet
|
|
71 override fun getStyleSheet() = _styleSheet
|
|
72 override fun setStyleSheet(value: StyleSheet) {
|
|
73 _styleSheet = value
|
|
74 }
|
|
75
|
|
76 /**
|
|
77 * Return the default style sheet that all HTMLEditorKit's come with.
|
|
78 */
|
|
79 val defaultStyleSheet: StyleSheet
|
|
80 get() {
|
|
81 return super.getStyleSheet()
|
|
82 }
|
|
83 }
|
|
84
|
|
85 /**
|
|
86 * Views are based on a JLabel and a ClipText (which we use for searching),
|
|
87 * wrapped in a JPanel that we use to display both.
|
|
88 */
|
|
89 class PasteboardItemView(label: String, val searchable: ClipText) {
|
|
90 private val outerBorder =
|
|
91 MatteBorder(OUTER_BORDER_TOP, OUTER_BORDER, OUTER_BORDER, OUTER_BORDER,
|
|
92 queue.v.parent.background)
|
|
93
|
|
94 val contents = JPanel().apply {
|
|
95 layout = BoxLayout(this, BoxLayout.Y_AXIS)
|
|
96 background = queue.v.parent.background
|
|
97 border = outerBorder
|
|
98 add(JLabel(label).apply {
|
|
99 horizontalAlignment = JLabel.LEFT
|
|
100 alignmentX = JLabel.LEFT_ALIGNMENT
|
|
101 })
|
|
102 add(searchable)
|
|
103 }
|
|
104 }
|