package com.dgex.offspring.ui.controls;
import nxt.Alias;
import nxt.NxtException.ValidationException;
import org.eclipse.e4.ui.di.UISynchronize;
import org.eclipse.e4.ui.services.IStylingEngine;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import com.dgex.offspring.config.IContactsService;
import com.dgex.offspring.nxtCore.core.AliasHelper;
import com.dgex.offspring.nxtCore.service.IAlias;
import com.dgex.offspring.nxtCore.service.INxtService;
import com.dgex.offspring.nxtCore.service.TransactionException;
import com.dgex.offspring.swt.table.PaginationContainer;
import com.dgex.offspring.ui.PromptFeeDeadline;
import com.dgex.offspring.user.service.IUser;
import com.dgex.offspring.user.service.IUserService;
public class AliasControl extends Composite {
private static Image errorImage = FieldDecorationRegistry.getDefault()
.getFieldDecoration(FieldDecorationRegistry.DEC_ERROR).getImage();
private Text aliasNameText;
private ControlDecoration decoAliasNameText;
private Text aliasURIText;
private Button aliasRegisterButton;
private final AliasViewer aliasesViewer;
private final Long accountId;
private final INxtService nxt;
private final IUser user;
private final UISynchronize sync;
private final IContactsService contactsService;
private final PaginationContainer paginationContainer;
public AliasControl(Composite parent, int style, Long accountId,
INxtService nxt, IStylingEngine engine, IUserService userService,
UISynchronize sync, IContactsService contactsService) {
super(parent, style);
this.accountId = accountId;
this.nxt = nxt;
this.user = userService.findUser(accountId);
this.sync = sync;
this.contactsService = contactsService;
GridLayoutFactory.fillDefaults().spacing(10, 5).numColumns(3).applyTo(this);
/* top bar (name, uri, register) */
if (user != null && !user.getAccount().isReadOnly()) {
aliasNameText = new Text(this, SWT.BORDER);
GridDataFactory.swtDefaults().align(SWT.FILL, SWT.CENTER)
.hint(100, SWT.DEFAULT).applyTo(aliasNameText);
aliasNameText.setMessage("name");
decoAliasNameText = new ControlDecoration(aliasNameText, SWT.TOP
| SWT.RIGHT);
decoAliasNameText.setImage(errorImage);
decoAliasNameText.setDescriptionText("Alias is registered");
decoAliasNameText.hide();
aliasURIText = new Text(this, SWT.BORDER);
GridDataFactory.swtDefaults().align(SWT.FILL, SWT.CENTER)
.grab(true, false).applyTo(aliasURIText);
aliasURIText.setMessage("uri");
aliasRegisterButton = new Button(this, SWT.PUSH);
GridDataFactory.swtDefaults().align(SWT.FILL, SWT.CENTER)
.applyTo(aliasRegisterButton);
aliasRegisterButton.setText("Register");
aliasRegisterButton.setEnabled(false);
hookupAliasControls();
}
/* bottom bar table viewer */
paginationContainer = new PaginationContainer(this, SWT.NONE);
GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).grab(true, true)
.span(3, 1).applyTo(paginationContainer);
aliasesViewer = new AliasViewer(paginationContainer.getViewerParent(),
accountId, nxt, engine, userService, sync, contactsService);
paginationContainer.setTableViewer(aliasesViewer, 100);
aliasesViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {}
});
}
public void refresh() {
aliasesViewer.refresh();
}
private void hookupAliasControls() {
aliasNameText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
String name = aliasNameText.getText().trim();
Alias alias = Alias.getAlias(name);
if (alias == null) {
decoAliasNameText.hide();
aliasRegisterButton.setEnabled(true);
aliasRegisterButton.setText("Register");
aliasURIText.setText("");
}
else if (alias.getAccount().equals(user.getAccount().getNative())) {
decoAliasNameText.hide();
aliasRegisterButton.setEnabled(true);
aliasRegisterButton.setText("Update");
}
else {
decoAliasNameText.show();
aliasRegisterButton.setEnabled(false);
String value = alias.getURI();
aliasURIText.setText(value.trim().isEmpty() ? ".. registered .."
: value);
}
}
});
aliasRegisterButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
registerAlias();
}
});
}
private void registerAlias() {
PromptFeeDeadline dialog = new PromptFeeDeadline(getShell());
if (dialog.open() != Window.OK) {
return;
}
final int fee = dialog.getFee();
final short deadline = dialog.getDeadline();
final String name = aliasNameText.getText().trim();
final String uri = aliasURIText.getText().trim();
BusyIndicator.showWhile(getDisplay(), new Runnable() {
@Override
public void run() {
try {
nxt.createAssignAliasTransaction(user.getAccount(), name, uri,
deadline, fee, 0l);
aliasRegisterButton.setEnabled(true);
decoAliasNameText.show();
IAlias alias = new AliasHelper(name, uri, user.getAccount()
.getNative());
nxt.getPendingAliases().add(alias);
aliasesViewer.refresh();
}
catch (ValidationException e) {
MessageDialog.openError(getShell(), "Validation Exception",
e.toString());
}
catch (TransactionException e) {
MessageDialog.openError(getShell(), "Transaction Exception",
e.toString());
}
}
});
}
}