Skip to content

Commit fd40603

Browse files
committed
Improve handling of controller wallets in GUI
1 parent 628656e commit fd40603

File tree

7 files changed

+88
-43
lines changed

7 files changed

+88
-43
lines changed

convex-gui/src/main/java/convex/gui/components/ConnectPanel.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package convex.gui.components;
22

33
import java.awt.Color;
4+
import java.awt.Component;
45
import java.net.InetSocketAddress;
56

67
import javax.swing.JComponent;
@@ -16,6 +17,7 @@
1617
import convex.core.crypto.wallet.AWalletEntry;
1718
import convex.core.cvm.Address;
1819
import convex.core.init.Init;
20+
import convex.core.lang.RT;
1921
import convex.gui.components.account.AddressCombo;
2022
import convex.gui.keys.KeyRingPanel;
2123
import convex.gui.keys.UnlockWalletDialog;
@@ -113,4 +115,22 @@ public static Convex tryConnect(JComponent parent,String prompt) {
113115
}
114116
return null;
115117
}
118+
119+
public static void showConnectionInfo(Component parent,Convex convex) {
120+
StringBuilder sb=new StringBuilder();
121+
if (convex instanceof ConvexRemote) {
122+
sb.append("Remote host: " + convex.getHostAddress() + "\n");
123+
}
124+
try {
125+
sb.append("Sequence: " + convex.getSequence() + "\n");
126+
} catch (Exception e1) {
127+
log.info("Failed to get sequence number");
128+
}
129+
sb.append("Account: " + RT.print(convex.getAddress()) + "\n");
130+
sb.append("Public Key: " + RT.toString(convex.getAccountKey()) + "\n");
131+
sb.append("Connected: " + convex.isConnected()+"\n");
132+
133+
String infoString = sb.toString();
134+
JOptionPane.showMessageDialog(parent, infoString);
135+
}
116136
}

convex-gui/src/main/java/convex/gui/components/account/AccountChooserPanel.java

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import convex.core.data.AccountKey;
2222
import convex.core.exceptions.ResultException;
2323
import convex.gui.components.BalanceLabel;
24+
import convex.gui.components.ConnectPanel;
2425
import convex.gui.components.DropdownMenu;
2526
import convex.gui.keys.KeyRingPanel;
2627
import convex.gui.keys.UnlockWalletDialog;
@@ -43,6 +44,9 @@ public class AccountChooserPanel extends JPanel {
4344
private BalanceLabel balanceLabel;
4445

4546
protected Convex convex;
47+
48+
AWalletEntry previousSelection = null;
49+
4650

4751
public AccountChooserPanel(Convex convex) {
4852
this.convex=convex;
@@ -69,13 +73,11 @@ public AccountChooserPanel(Convex convex) {
6973
keyCombo=KeyPairCombo.forConvex(convex);
7074
keyCombo.setToolTipText("Select a key pair from your Keyring. This will be used to sign transactions.");
7175
keyCombo.addItemListener(e->{
76+
AWalletEntry we=(AWalletEntry)e.getItem();
7277
if (e.getStateChange()==ItemEvent.DESELECTED) {
73-
// key pair was deselected and/or set to null
74-
setKeyPair(null);
78+
previousSelection=we;
7579
return;
76-
};
77-
AWalletEntry we=(AWalletEntry)e.getItem();
78-
if (we!=keyCombo.getWalletEntry()) {
80+
} else {
7981
setKeyPair(we);
8082
}
8183
});
@@ -126,7 +128,7 @@ public AccountChooserPanel(Convex convex) {
126128
});
127129
popupMenu.add(setSeqButton);
128130

129-
JMenuItem reconnectButton = new JMenuItem("Reconnect",Toolkit.menuIcon(0xe9d5));
131+
JMenuItem reconnectButton = new JMenuItem("Reconnect",Toolkit.menuIcon(0xe157));
130132
reconnectButton.addActionListener(e -> {
131133
try {
132134
convex.reconnect();
@@ -135,6 +137,16 @@ public AccountChooserPanel(Convex convex) {
135137
}
136138
});
137139
popupMenu.add(reconnectButton);
140+
141+
JMenuItem connInfoButton = new JMenuItem("Connection Info...",Toolkit.menuIcon(0xe157));
142+
connInfoButton.addActionListener(e -> {
143+
try {
144+
ConnectPanel.showConnectionInfo(this, convex);
145+
} catch (Exception ex) {
146+
log.info("Reconnect failed",ex);
147+
}
148+
});
149+
popupMenu.add(connInfoButton);
138150

139151

140152

@@ -186,6 +198,12 @@ public void updateAddress(Address a) {
186198
}
187199

188200
public void setKeyPair(AWalletEntry we) {
201+
// In case we are re-entering
202+
if (we!=keyCombo.getWalletEntry()) {
203+
keyCombo.setSelectedItem(we);
204+
return;
205+
}
206+
189207
System.err.println("Setting wallet entry:" +we);
190208
if (we==null) {
191209
convex.setKeyPair(null);
@@ -194,18 +212,16 @@ public void setKeyPair(AWalletEntry we) {
194212
if (we.isLocked()) {
195213
boolean unlock=UnlockWalletDialog.offerUnlock(this, we);
196214
if (!unlock) {
197-
convex.setKeyPair(null);
198-
keyCombo.setSelectedItem(null);
215+
keyCombo.setSelectedItem(previousSelection);
199216
return;
217+
} else {
218+
kp=we.getKeyPair();
219+
we.lock();
200220
}
201-
202-
kp=we.getKeyPair();
203-
we.lock();
204221
} else {
205222
kp=we.getKeyPair();
206223
}
207224
convex.setKeyPair(kp);
208-
keyCombo.setSelectedItem(kp);
209225
}
210226
}
211227

convex-gui/src/main/java/convex/gui/components/account/KeyPairCombo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ public static void main (String... args) {
146146
}
147147

148148
public AWalletEntry getWalletEntry() {
149-
Object a = getSelectedItem();
149+
Object a = getModel().getSelectedItem();
150150
return (AWalletEntry)a;
151151
}
152152

convex-gui/src/main/java/convex/gui/peer/PeerComponent.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,14 @@
77
import javax.swing.JPanel;
88
import javax.swing.JPopupMenu;
99

10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
12+
1013
import convex.api.Convex;
1114
import convex.api.ConvexLocal;
1215
import convex.api.ConvexRemote;
1316
import convex.core.crypto.AKeyPair;
17+
import convex.core.crypto.wallet.AWalletEntry;
1418
import convex.core.cvm.Address;
1519
import convex.core.cvm.Peer;
1620
import convex.core.cvm.PeerStatus;
@@ -25,6 +29,7 @@
2529
import convex.gui.components.DropdownMenu;
2630
import convex.gui.components.Identicon;
2731
import convex.gui.etch.EtchWindow;
32+
import convex.gui.keys.KeyRingPanel;
2833
import convex.gui.models.StateModel;
2934
import convex.gui.repl.REPLClient;
3035
import convex.gui.server.PeerWindow;
@@ -40,12 +45,31 @@ public class PeerComponent extends BaseListComponent {
4045

4146
public ConvexLocal convex;
4247
CodeLabel description;
48+
49+
private static final Logger log = LoggerFactory.getLogger(PeerComponent.class.getName());
50+
4351

4452
public void launchPeerWindow(ConvexLocal peer) {
45-
PeerWindow pw = new PeerWindow(peer);
53+
Server server=peer.getLocalServer();
54+
ConvexLocal newConvex=connectLocalControllerWallet(server);
55+
PeerWindow pw = new PeerWindow(newConvex);
4656
pw.run();
4757
}
4858

59+
private ConvexLocal connectLocalControllerWallet(Server server) {
60+
AKeyPair kp=null;
61+
Address controller=server.getPeerController();
62+
if (controller!=null) try {
63+
AccountKey key=server.getPeer().getConsensusState().getAccount(controller).getAccountKey();
64+
AWalletEntry we=KeyRingPanel.getKeyRingEntry(key);
65+
kp=we.getKeyPair();
66+
} catch (Exception e) {
67+
log.warn("Error getting controller details",e);
68+
}
69+
ConvexLocal convex=ConvexLocal.connect(server,controller,kp);
70+
return convex;
71+
}
72+
4973
public void launchEtchWindow(ConvexLocal peer) {
5074
EtchWindow ew = new EtchWindow(peer);
5175
ew.run();
@@ -139,7 +163,7 @@ public PeerComponent(ConvexLocal value) {
139163

140164
JMenuItem walletButton = new JMenuItem("Open controller Wallet",Toolkit.menuIcon(0xe850));
141165
walletButton.addActionListener(e -> {
142-
new WalletApp(convex).run();
166+
new WalletApp(connectLocalControllerWallet(server)).run();
143167
});
144168
popupMenu.add(walletButton);
145169

convex-gui/src/main/java/convex/gui/repl/REPLPanel.java

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212

1313
import javax.swing.JButton;
1414
import javax.swing.JCheckBox;
15-
import javax.swing.JOptionPane;
1615
import javax.swing.JPanel;
1716
import javax.swing.JScrollPane;
1817
import javax.swing.JSplitPane;
@@ -27,26 +26,26 @@
2726
import org.slf4j.LoggerFactory;
2827

2928
import convex.api.Convex;
30-
import convex.api.ConvexRemote;
3129
import convex.core.Result;
3230
import convex.core.crypto.AKeyPair;
31+
import convex.core.cvm.Address;
32+
import convex.core.cvm.Symbols;
3333
import convex.core.cvm.transactions.ATransaction;
3434
import convex.core.data.ACell;
3535
import convex.core.data.AList;
3636
import convex.core.data.AString;
3737
import convex.core.data.AVector;
38-
import convex.core.cvm.Address;
3938
import convex.core.data.SignedData;
4039
import convex.core.exceptions.ParseException;
4140
import convex.core.exceptions.ResultException;
4241
import convex.core.lang.RT;
4342
import convex.core.lang.Reader;
44-
import convex.core.cvm.Symbols;
4543
import convex.core.util.Utils;
4644
import convex.gui.components.ActionButton;
4745
import convex.gui.components.ActionPanel;
4846
import convex.gui.components.BaseTextPane;
4947
import convex.gui.components.CodePane;
48+
import convex.gui.components.ConnectPanel;
5049
import convex.gui.components.account.AccountChooserPanel;
5150
import convex.gui.utils.CVXHighlighter;
5251
import convex.gui.utils.Toolkit;
@@ -211,21 +210,7 @@ public REPLPanel(Convex convex) {
211210
actionPanel.add(btnClear);
212211

213212
btnInfo = new ActionButton("Connection Info",0xe88e,e -> {
214-
StringBuilder sb=new StringBuilder();
215-
if (convex instanceof ConvexRemote) {
216-
sb.append("Remote host: " + convex.getHostAddress() + "\n");
217-
}
218-
try {
219-
sb.append("Sequence: " + convex.getSequence() + "\n");
220-
} catch (Exception e1) {
221-
log.info("Failed to get sequence number");
222-
}
223-
sb.append("Account: " + RT.print(convex.getAddress()) + "\n");
224-
sb.append("Public Key: " + RT.toString(convex.getAccountKey()) + "\n");
225-
sb.append("Connected: " + convex.isConnected()+"\n");
226-
227-
String infoString = sb.toString();
228-
JOptionPane.showMessageDialog(this, infoString);
213+
ConnectPanel.showConnectionInfo(REPLPanel.this,convex);
229214
});
230215
actionPanel.setToolTipText("Show diagnostic information for the Convex connection");
231216
actionPanel.add(btnInfo);

convex-gui/src/main/java/convex/gui/server/PeerWindow.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,19 @@ public Convex getPeerView() {
3333

3434
JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
3535

36-
public PeerWindow(ConvexLocal peer) {
37-
super("Peer Control Panel - " + peer.toString());
38-
this.peer = peer;
36+
public PeerWindow(ConvexLocal convex) {
37+
super("Peer Control Panel - " + convex.toString());
38+
this.peer = convex;
3939
this.setPreferredSize(new Dimension(1200,1000));
4040

4141
setLayout(new MigLayout());
4242
add(tabbedPane, "dock center");
4343

44-
Server server=peer.getLocalServer();
44+
Server server=convex.getLocalServer();
4545
if (server!=null) {
4646
try {
4747
// Convex convex = Convex.connect(server.getHostAddress(), server.getPeerController(),server.getKeyPair());
48-
tabbedPane.addTab("REPL", null, new REPLPanel(peer), null);
48+
tabbedPane.addTab("REPL", null, new REPLPanel(convex), null);
4949
} catch (Exception t) {
5050
String msg=("Failed to connect to Peer: "+t);
5151
t.printStackTrace();
@@ -55,10 +55,10 @@ public PeerWindow(ConvexLocal peer) {
5555
}
5656
tabbedPane.addTab("Observation", null, new JScrollPane(new ObserverPanel(server)), null);
5757
}
58-
tabbedPane.addTab("Stress", null, new StressPanel(peer), null);
59-
tabbedPane.addTab("Info", null, new PeerInfoPanel(peer), null);
58+
tabbedPane.addTab("Stress", null, new StressPanel(convex), null);
59+
tabbedPane.addTab("Info", null, new PeerInfoPanel(convex), null);
6060

61-
PeerComponent pcom = new PeerComponent(peer);
61+
PeerComponent pcom = new PeerComponent(convex);
6262
add(pcom, "dock north");
6363
}
6464

convex-peer/src/main/java/convex/peer/Server.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,7 @@ public long getBeliefReceivedCount() {
481481

482482
/**
483483
* Gets the Peer controller Address
484-
* @return Peer controller Address
484+
* @return Peer controller Address, or null if peer is not registered
485485
*/
486486
public Address getPeerController() {
487487
return getPeer().getController();

0 commit comments

Comments
 (0)