|
12 | 12 |
|
13 | 13 | import javax.swing.JMenu; |
14 | 14 | import javax.swing.JPanel; |
| 15 | +import javax.swing.SwingConstants; |
15 | 16 | import javax.swing.SwingUtilities; |
16 | 17 |
|
17 | 18 | import com.google.common.collect.ImmutableList; |
@@ -94,50 +95,87 @@ private void host() { |
94 | 95 | }); |
95 | 96 | } |
96 | 97 |
|
97 | | - private void showServerAddressesDialog() { |
98 | | - final int port = FModel.getNetPreferences().getPrefInt(ForgeNetPreferences.FNetPref.NET_PORT); |
| 98 | + static void showServerAddressesDialog() { |
| 99 | + final ForgeNetPreferences netPrefs = FModel.getNetPreferences(); |
| 100 | + final int port = netPrefs.getPrefInt(ForgeNetPreferences.FNetPref.NET_PORT); |
99 | 101 | final LinkedHashMap<String, String> addresses = FServerManager.getAllLocalAddresses(); |
100 | 102 | final String externalAddress = FServerManager.getExternalAddress(); |
101 | 103 | final Localizer localizer = Localizer.getInstance(); |
102 | 104 |
|
103 | | - final JPanel panel = new JPanel(new MigLayout("insets 0, gap 4 6, wrap 3", "[grow][grow][pref]")); |
| 105 | + // Collect rows in display order; we auto-copy and star whichever row matches |
| 106 | + // the last-copied URL, falling back to the first row. |
| 107 | + final List<String> orderedLabels = new ArrayList<>(); |
| 108 | + final List<String> orderedUrls = new ArrayList<>(); |
| 109 | + if (externalAddress != null) { |
| 110 | + orderedLabels.add("External (WAN)"); |
| 111 | + orderedUrls.add(externalAddress + ":" + port); |
| 112 | + } |
| 113 | + for (final Map.Entry<String, String> entry : addresses.entrySet()) { |
| 114 | + orderedLabels.add(entry.getKey()); |
| 115 | + orderedUrls.add(entry.getValue() + ":" + port); |
| 116 | + } |
| 117 | + |
| 118 | + // If the remembered URL is present in the current list, auto-copy and star it. |
| 119 | + // Otherwise fall back to the first entry (external if present, else first local |
| 120 | + // interface) — matches the old copyHostedServerUrl default. Do NOT overwrite |
| 121 | + // the remembered value on fallback, so a later reconnect to the original |
| 122 | + // network restores the preference. |
| 123 | + final String rememberedUrl = netPrefs.getPref(ForgeNetPreferences.FNetPref.NET_LAST_COPIED_URL); |
| 124 | + int starIndex = orderedUrls.indexOf(rememberedUrl); |
| 125 | + if (starIndex < 0) { |
| 126 | + starIndex = orderedUrls.isEmpty() ? -1 : 0; |
| 127 | + } |
| 128 | + if (starIndex >= 0) { |
| 129 | + copyToClipboard(orderedUrls.get(starIndex)); |
| 130 | + } |
| 131 | + |
| 132 | + final JPanel panel = new JPanel(new MigLayout("insets 0, gap 4 6, wrap 3", "[pref]30[pref]30[pref]")); |
104 | 133 | panel.setOpaque(false); |
105 | 134 |
|
106 | | - panel.add(new FLabel.Builder().text(localizer.getMessage("lblInterface")).fontStyle(Font.BOLD).fontSize(12).build(), "growx"); |
107 | | - panel.add(new FLabel.Builder().text(localizer.getMessage("lblAddress")).fontStyle(Font.BOLD).fontSize(12).build(), "growx"); |
| 135 | + panel.add(new FLabel.Builder() |
| 136 | + .text(localizer.getMessage("lblChooseAddressToCopy")) |
| 137 | + .fontSize(12).fontAlign(SwingConstants.LEFT).build(), |
| 138 | + "span 3, growx, gapbottom 10"); |
| 139 | + |
| 140 | + panel.add(new FLabel.Builder().text(localizer.getMessage("lblInterface")).fontStyle(Font.BOLD).fontSize(12).fontAlign(SwingConstants.LEFT).build(), "growx"); |
| 141 | + panel.add(new FLabel.Builder().text(localizer.getMessage("lblAddress")).fontStyle(Font.BOLD).fontSize(12).fontAlign(SwingConstants.LEFT).build(), "growx"); |
108 | 142 | panel.add(new FLabel.Builder().text("").build()); |
109 | 143 |
|
110 | | - if (externalAddress != null) { |
111 | | - final String externalUrl = externalAddress + ":" + port; |
112 | | - panel.add(new FLabel.Builder().text("External (WAN)").fontSize(12).build(), "growx"); |
113 | | - panel.add(new FLabel.Builder().text(externalUrl).fontSize(12).build(), "growx"); |
| 144 | + final FOptionPane[] holder = new FOptionPane[1]; |
| 145 | + for (int i = 0; i < orderedUrls.size(); i++) { |
| 146 | + final String url = orderedUrls.get(i); |
| 147 | + final String label = (i == starIndex) ? orderedLabels.get(i) + " \u2605" : orderedLabels.get(i); |
| 148 | + panel.add(new FLabel.Builder().text(label).fontSize(12).fontAlign(SwingConstants.LEFT).build(), "growx"); |
| 149 | + panel.add(new FLabel.Builder().text(url).fontSize(12).fontAlign(SwingConstants.LEFT).build(), "growx"); |
114 | 150 | final FButton btnCopy = new FButton(localizer.getMessage("lblCopy")); |
115 | 151 | btnCopy.setFont(FSkin.getFont(11)); |
116 | | - btnCopy.addActionListener(e -> copyToClipboard(externalUrl)); |
| 152 | + btnCopy.addActionListener(e -> { |
| 153 | + copyToClipboard(url); |
| 154 | + netPrefs.setPref(ForgeNetPreferences.FNetPref.NET_LAST_COPIED_URL, url); |
| 155 | + netPrefs.save(); |
| 156 | + holder[0].setVisible(false); |
| 157 | + }); |
117 | 158 | panel.add(btnCopy, "w 70!, h 24!"); |
118 | 159 | } |
119 | 160 |
|
120 | | - boolean first = true; |
121 | | - for (final Map.Entry<String, String> entry : addresses.entrySet()) { |
122 | | - final String url = entry.getValue() + ":" + port; |
123 | | - final String label = first ? entry.getKey() + " \u2605" : entry.getKey(); |
124 | | - first = false; |
125 | | - |
126 | | - panel.add(new FLabel.Builder().text(label).fontSize(12).build(), "growx"); |
127 | | - panel.add(new FLabel.Builder().text(url).fontSize(12).build(), "growx"); |
128 | | - final FButton btnCopy = new FButton(localizer.getMessage("lblCopy")); |
129 | | - btnCopy.setFont(FSkin.getFont(11)); |
130 | | - btnCopy.addActionListener(e -> copyToClipboard(url)); |
131 | | - panel.add(btnCopy, "w 70!, h 24!"); |
| 161 | + if (starIndex >= 0) { |
| 162 | + panel.add(new FLabel.Builder() |
| 163 | + .text(localizer.getMessage("lblServerUrlCopiedToClipboard", orderedUrls.get(starIndex))) |
| 164 | + .fontSize(11).fontStyle(Font.ITALIC).fontAlign(SwingConstants.LEFT).build(), |
| 165 | + "span 3, growx, gaptop 10"); |
132 | 166 | } |
133 | 167 |
|
134 | | - FOptionPane.showOptionDialog( |
135 | | - localizer.getMessage("lblChooseAddressToCopy"), |
| 168 | + // Pass null as the prompt message so dialog width is driven by the panel's |
| 169 | + // actual content width rather than the much-wider localised instruction line. |
| 170 | + holder[0] = new FOptionPane( |
| 171 | + null, |
136 | 172 | localizer.getMessage("lblServerURL"), |
137 | 173 | FOptionPane.INFORMATION_ICON, |
138 | 174 | panel, |
139 | 175 | ImmutableList.of(localizer.getMessage("lblOK")), |
140 | 176 | 0); |
| 177 | + holder[0].setVisible(true); |
| 178 | + holder[0].dispose(); |
141 | 179 | } |
142 | 180 |
|
143 | 181 | private static void copyToClipboard(final String text) { |
|
0 commit comments