"
+ label.setText("
"
+ (payload.getComponentType() == null ? LangUtil.translate(payload.forDisplay())
: payload.forDisplay())
- + shortCutHtml + variantsHtml + "
");
+ + shortCutHtml + "
");
}
+ // consecutive rows are often stamped at the same size, which CellRendererPane takes as
+ // still valid; without this the label would keep the width it had next to the previous
+ // row's button
+ invalidate();
return this;
}
}
@@ -651,4 +849,75 @@ public class TreePanel extends JPanel {
plugInPort.deleteBlock(blockName);
}
}
+
+ /**
+ * Pill-shaped "+N" drop-down button painted at the end of a component row. It is only ever
+ * painted through the cell renderer, so the clicks it appears to take are hit-tested and
+ * handled by the tree in {@link TreePanel#processVariantsButtonEvent(MouseEvent)}.
+ */
+ private static class VariantsButton extends JComponent {
+
+ private static final long serialVersionUID = 1L;
+
+ private static final Color FILL_COLOR = new Color(0xD7FFC6);
+ private static final Color HOVER_FILL_COLOR = new Color(0xB8F0A0);
+ private static final Color BORDER_COLOR = new Color(0x7DBA63);
+ private static final Color TEXT_COLOR = new Color(0x3F6B2C);
+
+ private static final int LEFT_MARGIN = 4;
+ private static final int RIGHT_MARGIN = 6;
+ private static final int PADDING = 5;
+ private static final int ARROW_GAP = 4;
+ private static final int ARROW_WIDTH = 7;
+ private static final int BUTTON_HEIGHT = 16;
+
+ private String text = "";
+ private boolean hovered;
+
+ public void setCount(int count) {
+ this.text = "+" + count;
+ }
+
+ public void setHovered(boolean hovered) {
+ this.hovered = hovered;
+ }
+
+ @Override
+ public Dimension getPreferredSize() {
+ int textWidth = getFontMetrics(getFont()).stringWidth(text);
+ return new Dimension(LEFT_MARGIN + PADDING + textWidth + ARROW_GAP + ARROW_WIDTH + PADDING
+ + RIGHT_MARGIN, BUTTON_HEIGHT);
+ }
+
+ public Rectangle getButtonBounds() {
+ return new Rectangle(LEFT_MARGIN, (getHeight() - BUTTON_HEIGHT) / 2,
+ getWidth() - LEFT_MARGIN - RIGHT_MARGIN, BUTTON_HEIGHT);
+ }
+
+ @Override
+ protected void paintComponent(Graphics g) {
+ Graphics2D g2d = (Graphics2D) g.create();
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+ g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
+ RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+ Rectangle b = getButtonBounds();
+ g2d.setColor(hovered ? HOVER_FILL_COLOR : FILL_COLOR);
+ g2d.fillRoundRect(b.x, b.y, b.width - 1, b.height - 1, b.height, b.height);
+ g2d.setColor(BORDER_COLOR);
+ g2d.drawRoundRect(b.x, b.y, b.width - 1, b.height - 1, b.height, b.height);
+
+ g2d.setFont(getFont());
+ FontMetrics fm = g2d.getFontMetrics();
+ int textX = b.x + PADDING;
+ int textY = b.y + (b.height - fm.getHeight()) / 2 + fm.getAscent();
+ g2d.setColor(TEXT_COLOR);
+ g2d.drawString(text, textX, textY);
+
+ int arrowX = textX + fm.stringWidth(text) + ARROW_GAP;
+ int arrowY = b.y + b.height / 2 - 1;
+ g2d.fillPolygon(new int[] {arrowX, arrowX + ARROW_WIDTH, arrowX + ARROW_WIDTH / 2},
+ new int[] {arrowY - 1, arrowY - 1, arrowY + 3}, 3);
+ g2d.dispose();
+ }
+ }
}
diff --git a/diylc/diylc-swing/src/main/resources/lang/Deutsch.txt b/diylc/diylc-swing/src/main/resources/lang/Deutsch.txt
index 06fadf93..bae4f523 100644
--- a/diylc/diylc-swing/src/main/resources/lang/Deutsch.txt
+++ b/diylc/diylc-swing/src/main/resources/lang/Deutsch.txt
@@ -720,3 +720,4 @@ Hardware|Hardware
Sides|Seiten
All|Alle
Front and Back|Vorne und hinten
+Click to choose from %s variants|Klicken, um aus %s Varianten zu wählen
diff --git a/diylc/diylc-swing/src/main/resources/lang/English.txt b/diylc/diylc-swing/src/main/resources/lang/English.txt
index de8581ac..46f8b249 100644
--- a/diylc/diylc-swing/src/main/resources/lang/English.txt
+++ b/diylc/diylc-swing/src/main/resources/lang/English.txt
@@ -713,3 +713,4 @@ Hardware
Sides
All
Front and Back
+Click to choose from %s variants
diff --git a/diylc/diylc-swing/src/main/resources/lang/Español.txt b/diylc/diylc-swing/src/main/resources/lang/Español.txt
index 1e493300..466bc564 100644
--- a/diylc/diylc-swing/src/main/resources/lang/Español.txt
+++ b/diylc/diylc-swing/src/main/resources/lang/Español.txt
@@ -716,3 +716,4 @@ Hardware|Herrajes
Sides|Lados
All|Todos
Front and Back|Frente y parte trasera
+Click to choose from %s variants|Haga clic para elegir entre %s variantes
diff --git a/diylc/diylc-swing/src/main/resources/lang/Français.txt b/diylc/diylc-swing/src/main/resources/lang/Français.txt
index 84e3ab93..38b74942 100644
--- a/diylc/diylc-swing/src/main/resources/lang/Français.txt
+++ b/diylc/diylc-swing/src/main/resources/lang/Français.txt
@@ -715,3 +715,4 @@ Hardware|Quincaillerie
Sides|Côtés
All|Tous
Front and Back|Avant et arrière
+Click to choose from %s variants|Cliquez pour choisir parmi %s variantes
diff --git a/diylc/diylc-swing/src/main/resources/lang/Italiano.txt b/diylc/diylc-swing/src/main/resources/lang/Italiano.txt
index 1796cafe..6db818d9 100644
--- a/diylc/diylc-swing/src/main/resources/lang/Italiano.txt
+++ b/diylc/diylc-swing/src/main/resources/lang/Italiano.txt
@@ -717,3 +717,4 @@ Hardware|Minuteria
Sides|Lati
All|Tutti
Front and Back|Fronte e retro
+Click to choose from %s variants|Fai clic per scegliere tra %s varianti
diff --git a/diylc/diylc-swing/src/main/resources/lang/Nederlands.txt b/diylc/diylc-swing/src/main/resources/lang/Nederlands.txt
index 0b84e7aa..a34a6a8b 100644
--- a/diylc/diylc-swing/src/main/resources/lang/Nederlands.txt
+++ b/diylc/diylc-swing/src/main/resources/lang/Nederlands.txt
@@ -721,3 +721,4 @@ Hardware|Hardware
Sides|Zijden
All|Alle
Front and Back|Voor- en achterkant
+Click to choose from %s variants|Klik om te kiezen uit %s varianten
diff --git a/diylc/diylc-swing/src/main/resources/lang/Português.txt b/diylc/diylc-swing/src/main/resources/lang/Português.txt
index e08fd70f..ee3f2ba9 100644
--- a/diylc/diylc-swing/src/main/resources/lang/Português.txt
+++ b/diylc/diylc-swing/src/main/resources/lang/Português.txt
@@ -716,3 +716,4 @@ Hardware|Ferragens
Sides|Lados
All|Todos
Front and Back|Frente e traseira
+Click to choose from %s variants|Clique para escolher entre %s variantes
diff --git a/diylc/diylc-swing/src/main/resources/lang/Srpski.txt b/diylc/diylc-swing/src/main/resources/lang/Srpski.txt
index 2d655e65..eab6d459 100644
--- a/diylc/diylc-swing/src/main/resources/lang/Srpski.txt
+++ b/diylc/diylc-swing/src/main/resources/lang/Srpski.txt
@@ -712,3 +712,4 @@ Hardware|Mehanički delovi
Sides|Strane
All|Sve
Front and Back|Prednja i zadnja
+Click to choose from %s variants|Kliknite da izaberete jednu od %s varijanti
diff --git a/diylc/diylc-swing/src/main/resources/lang/हिंदी.txt b/diylc/diylc-swing/src/main/resources/lang/हिंदी.txt
index eb9778fb..eaa5028f 100644
--- a/diylc/diylc-swing/src/main/resources/lang/हिंदी.txt
+++ b/diylc/diylc-swing/src/main/resources/lang/हिंदी.txt
@@ -714,3 +714,4 @@ Hardware|हार्डवेयर
Sides|भुजाएं
All|सभी
Front and Back|आगे और पीछे
+Click to choose from %s variants|%s वेरिएंट में से चुनने के लिए क्लिक करें
diff --git a/diylc/diylc-swing/src/main/resources/lang/简体中文.txt b/diylc/diylc-swing/src/main/resources/lang/简体中文.txt
index 5dbca769..c1ed16e8 100644
--- a/diylc/diylc-swing/src/main/resources/lang/简体中文.txt
+++ b/diylc/diylc-swing/src/main/resources/lang/简体中文.txt
@@ -714,3 +714,4 @@ Hardware|五金件
Sides|侧面
All|全部
Front and Back|前后
+Click to choose from %s variants|点击从 %s 个变体中选择