package au.com.vaadinutils.jasper.scheduler;
import java.util.LinkedList;
import java.util.List;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import au.com.vaadinutils.dao.JpaBaseDao;
import au.com.vaadinutils.jasper.scheduler.entities.ReportEmailRecipient;
import au.com.vaadinutils.jasper.scheduler.entities.ReportEmailRecipientVisibility;
import au.com.vaadinutils.validator.EmailValidator;
import com.vaadin.data.Item;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.AbstractSelect.NewItemHandler;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.themes.Reindeer;
public class EmailTargetLayout extends VerticalLayout
{
private static final long serialVersionUID = -6108970593368681878L;
Logger logger = LogManager.getLogger();
List<EmailTargetLine> lines = new LinkedList<EmailTargetLine>();
private final static int lineHeight = 30;
EmailTargetLayout()
{
setSizeFull();
setHeight("" + lineHeight);
setSpacing(true);
}
private EmailTargetLine insertTargetLine(final int row, ReportEmailRecipient recip)
{
final HorizontalLayout recipientHolder = new HorizontalLayout();
recipientHolder.setSizeFull();
recipientHolder.setSpacing(true);
recipientHolder.setHeight("30");
final List<ReportEmailRecipientVisibility> targetTypes = new LinkedList<ReportEmailRecipientVisibility>();
for (ReportEmailRecipientVisibility rerv : ReportEmailRecipientVisibility.values())
{
targetTypes.add(rerv);
}
final EmailTargetLine line = new EmailTargetLine();
line.row = row;
line.targetTypeCombo = new ComboBox(null, targetTypes);
line.targetTypeCombo.setWidth("80");
line.targetTypeCombo.select(targetTypes.get(0));
line.targetAddress = new ComboBox(null);
line.targetAddress.setImmediate(true);
line.targetAddress.setTextInputAllowed(true);
line.targetAddress.setInputPrompt("Enter Contact Name or email address");
line.targetAddress.setWidth("100%");
line.targetAddress.addValidator(new EmailValidator("Please enter a valid email address."));
getValidEmailContacts(line.targetAddress);
line.targetAddress.setItemCaptionPropertyId("namedemail");
line.targetAddress.setNewItemsAllowed(true);
if (recip != null && recip.getEmail() != null)
{
line.targetAddress.setValue(recip.getEmail());
line.targetTypeCombo.setValue(recip.getVisibility());
}
line.targetAddress.setNewItemHandler(new NewItemHandler()
{
private static final long serialVersionUID = 1L;
@Override
public void addNewItem(final String newItemCaption)
{
final IndexedContainer container = (IndexedContainer) line.targetAddress.getContainerDataSource();
final Item item = addItem(container, "", newItemCaption);
if (item != null)
{
line.targetAddress.addItem(item.getItemProperty("id").getValue());
line.targetAddress.setValue(item.getItemProperty("id").getValue());
}
setHeight(calculateHeight());
}
});
if (recip != null)
{
}
if (row == 0)
{
line.actionButton = new Button("+");
line.actionButton.setDescription("Click to add another email address line.");
line.actionButton.setStyleName(Reindeer.BUTTON_SMALL);
line.actionButton.addClickListener(new ClickListener()
{
private static final long serialVersionUID = 6505218353927273720L;
@Override
public void buttonClick(ClickEvent event)
{
lines.add(insertTargetLine(lines.size(), null));
setHeight(calculateHeight());
}
});
}
else
{
line.actionButton = new Button("-");
line.actionButton.setDescription("Click to remove this email address line.");
line.actionButton.setStyleName(Reindeer.BUTTON_SMALL);
line.actionButton.addClickListener(new ClickListener()
{
private static final long serialVersionUID = 3104323607502279386L;
@Override
public void buttonClick(ClickEvent event)
{
removeComponent(recipientHolder);
lines.remove(line);
setHeight(calculateHeight());
}
});
}
recipientHolder.addComponent(line.targetTypeCombo);
recipientHolder.addComponent(line.targetAddress);
recipientHolder.addComponent(line.actionButton);
recipientHolder.setExpandRatio(line.targetAddress, 1);
addComponent(recipientHolder);
return line;
}
@SuppressWarnings("unchecked")
private void getValidEmailContacts(ComboBox targetAddress)
{
JpaBaseDao<ReportEmailRecipient, Long> reportEmailRecipient = JpaBaseDao.getGenericDao(ReportEmailRecipient.class);
targetAddress.addContainerProperty("id", String.class, null);
targetAddress.addContainerProperty("email", String.class, null);
targetAddress.addContainerProperty("namedemail", String.class, null);
for (final ReportEmailRecipient contact : reportEmailRecipient.findAll())
{
if (contact.getEmail() != null)
{
Item item = targetAddress.addItem(contact.getEmail());
if (item != null)
{
item.getItemProperty("email").setValue(contact.getEmail());
item.getItemProperty("id").setValue(contact.getEmail());
item.getItemProperty("namedemail").setValue(contact.getEmail());
}
}
}
}
@SuppressWarnings("unchecked")
private Item addItem(final IndexedContainer container, final String named, String email)
{
// When we are editing an email (as second time) we can end up with
// double brackets so we strip them off here.
if (email.startsWith("<"))
{
email = email.substring(1);
}
if (email.endsWith(">"))
{
email = email.substring(0, email.length() - 1);
}
Item item = container.getItem(email);
if (item == null)
{
item = container.addItem(email);
}
if (item != null)
{
item.getItemProperty("id").setValue(email);
item.getItemProperty("email").setValue(email);
String namedEmail;
if (named != null && named.trim().length() > 0)
{
namedEmail = named + " <" + email + ">";
}
else
{
namedEmail = "<" + email + ">";
}
item.getItemProperty("namedemail").setValue(namedEmail);
}
else
{
logger.error("Failed to find or create the recipient");
}
return item;
}
public List<EmailTargetLine> getTargets()
{
return lines;
}
public void add(ReportEmailRecipient target)
{
lines.add(insertTargetLine(lines.size(), target));
setHeight(calculateHeight());
}
private String calculateHeight()
{
return "" + ((lineHeight * lines.size()));
}
public void clear()
{
lines.clear();
removeAllComponents();
}
}