/*
*
* Copyright 2014 http://Bither.net
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* /
*/
package net.bither.viewsystem.froms;
import net.bither.Bither;
import net.bither.BitherUI;
import net.bither.bitherj.AbstractApp;
import net.bither.bitherj.api.http.Http400Exception;
import net.bither.bitherj.core.AddressManager;
import net.bither.bitherj.core.HDMAddress;
import net.bither.bitherj.core.HDMBId;
import net.bither.bitherj.core.HDMKeychain;
import net.bither.bitherj.crypto.SecureCharSequence;
import net.bither.bitherj.delegate.IPasswordGetterDelegate;
import net.bither.fonts.AwesomeIcon;
import net.bither.languages.MessageKey;
import net.bither.utils.ExceptionUtil;
import net.bither.utils.LocaliserUtils;
import net.bither.utils.PeerUtil;
import net.bither.viewsystem.base.Labels;
import net.bither.viewsystem.base.Panels;
import net.bither.viewsystem.dialogs.MessageDialog;
import net.bither.viewsystem.themes.Themes;
import net.miginfocom.swing.MigLayout;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.List;
public class HDMAddAddressPanel extends WizardPanel implements IPasswordGetterDelegate {
private JSpinner spinnerCount;
private PasswordPanel.PasswordGetter passwordGetter;
private HDMKeychain keychain;
private JLabel labRefresh;
public HDMAddAddressPanel() {
super(MessageKey.activity_name_add_hdm_address, AwesomeIcon.PLUS);
setOkAction(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
performAdd();
}
});
keychain = AddressManager.getInstance().getHdmKeychain();
passwordGetter = new PasswordPanel.PasswordGetter(HDMAddAddressPanel.this);
}
@Override
public void beforePasswordDialogShow() {
}
@Override
public void afterPasswordDialogDismiss() {
}
private int getMaxCount() {
int max = AbstractApp.bitherjSetting.hdmAddressPerSeedPrepareCount() - AddressManager.getInstance
().getHdmKeychain().getAllCompletedAddresses().size();
return max;
}
@Override
public void initialiseContent(JPanel panel) {
panel.setLayout(new MigLayout(
Panels.migXYLayout(),
"[]", // Column constraints
"[][][][]80[]20[]" // Row constraints
));
labRefresh = Labels.newSpinner(Themes.currentTheme.fadedText(), BitherUI.NORMAL_PLUS_ICON_SIZE);
panel.add(labRefresh, "align center,span,wrap");
labRefresh.setVisible(false);
spinnerCount = new JSpinner();
panel.add(spinnerCount, "align center,cell 0 2 ,wrap");
if (AddressManager.isPrivateLimit()) {
spinnerCount.setEnabled(false);
setOkEnabled(false);
} else {
Integer value = new Integer(1);
Integer min = new Integer(1);
Integer max = new Integer(getMaxCount());
Integer step = new Integer(1);
SpinnerNumberModel model = new SpinnerNumberModel(value, min, max, step);
spinnerCount.setModel(model);
}
}
private void performAdd() {
final int count = Integer.valueOf(spinnerCount.getValue().toString());
labRefresh.setVisible(true);
new Thread() {
@Override
public void run() {
final SecureCharSequence password = passwordGetter.getPassword();
if (password == null) {
labRefresh.setVisible(false);
return;
}
PeerUtil.stopPeer();
final List<HDMAddress> as = keychain.completeAddresses(count, password,
new HDMKeychain.HDMFetchRemotePublicKeys() {
@Override
public void completeRemotePublicKeys(CharSequence password,
List<HDMAddress.Pubs>
partialPubs) {
try {
HDMBId hdmBid = HDMBId.getHDMBidFromDb();
HDMKeychain.getRemotePublicKeys(hdmBid, password, partialPubs);
} catch (Exception e) {
e.printStackTrace();
String msg = LocaliserUtils.getString("network_or_connection_error");
if (e instanceof Http400Exception) {
msg = ExceptionUtil.getHDMHttpExceptionMessage((
(Http400Exception) e).getErrorCode());
}
final String m = msg;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MessageDialog(m).showMsg();
}
});
}
}
});
PeerUtil.startPeer();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
labRefresh.setVisible(false);
if (as.size() == 0) {
return;
}
ArrayList<String> s = new ArrayList<String>();
for (HDMAddress a : as) {
s.add(a.getAddress());
}
closePanel();
Panels.hideLightBoxIfPresent();
Bither.refreshFrame();
}
});
}
}.start();
}
}