/**
*
*/
package net.combase.desktopcrm.swing;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.table.AbstractTableModel;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;
import ch.swingfx.twinkle.event.NotificationEvent;
import ch.swingfx.twinkle.event.NotificationEventAdapter;
import ch.swingfx.twinkle.window.Positions;
import net.combase.desktopcrm.data.AsteriskManager;
import net.combase.desktopcrm.data.CrmManager;
import net.combase.desktopcrm.data.DataStoreManager;
import net.combase.desktopcrm.domain.Case;
import net.combase.desktopcrm.domain.Contact;
import net.combase.desktopcrm.domain.HasEmail;
import net.combase.desktopcrm.domain.Lead;
import net.combase.desktopcrm.domain.Task;
/**
* @author "Till Freier"
*/
public class TaskTableModel extends AbstractTableModel
{
private enum RescheduleOption
{
LATER("Later"),
TOMORROW_AM("Tomorrow AM"),
TOMORROW_PM("Tomorrow PM"),
DAYS_2("In 2 days"),
NEXT_WEEK("Next Week");
private final String label;
/**
* @param label
*/
private RescheduleOption(String label)
{
this.label = label;
}
/* (non-Javadoc)
* @see java.lang.Enum#toString()
*/
@Override
public String toString()
{
return label;
}
}
/**
*
*/
private static final long serialVersionUID = -3890791456083674319L;
private static final String[] COLUMN_NAMES = new String[] { "Task", "Due", "", "", "", "", "", "", "" };
private static final Class<?>[] COLUMN_TYPES = new Class<?>[] { String.class, String.class, JButton.class, JButton.class, JButton.class, JButton.class, JButton.class, JButton.class, JButton.class };
private final List<Task> data;
private static final int ALPHA = 10;
private final Runnable taskReminder = new Runnable() {
@Override
public void run()
{
System.out.println("check task reminder...");
if (DataStoreManager.getSettings().isTaskReminder())
for (Task t : data)
{
if (t.getDue() == null)
continue;
if (t.getDue().isAfterNow() && t.getDue().isBefore(new DateTime().plusMinutes(15)))
{
System.out.println("remind user about task: " + t.getTitle());
DesktopUtil.createNotificationBuilder().withTitle("Task is due").withMessage(t.getTitle()).withPosition(Positions.CENTER).withIcon(CrmIcons.RECHEDULE).withListener(new NotificationEventAdapter() {
@Override
public void clicked(NotificationEvent event)
{
}
}).showNotification();
}
}
// wait 5 minutes
try
{
Thread.sleep(300000);
}
catch (InterruptedException e1)
{
e1.printStackTrace();
}
taskReminder.run();
}
};
public TaskTableModel(List<Task> data)
{
super();
this.data = data;
new Thread(taskReminder).start();
}
public void update(List<Task> tasks)
{
data.clear();
data.addAll(tasks);
fireTableDataChanged();
}
@Override
public String getColumnName(int columnIndex)
{
return COLUMN_NAMES[columnIndex];
}
@Override
public Class<?> getColumnClass(int columnIndex)
{
return COLUMN_TYPES[columnIndex];
}
@Override
public Object getValueAt(final int rowIndex, final int columnIndex)
{
/* Adding components */
Task task = data.get(rowIndex);
switch (columnIndex)
{
case 0:
return task.getTitle() + " [" + task.getExtendedTitle()+"]";
case 1:
if (task.getDue() == null)
return "";
return task.getDue().toDateTime(DateTimeZone.getDefault()).toString("E MM/dd/yy HH:mm");
case 2:
return createViewRelationButton(task);
case 3:
return createMessageButton(task);
case 4:
return createCallButton(task);
case 5:
return createViewButton(task);
case 6:
return createEditButton(task);
case 7:
return createRescheduleButton(task);
case 8:
return createDoneButton(task);
default:
return "Error";
}
}
/**
* @return
*/
private JButton createDoneButton(final Task task)
{
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0)
{
CrmManager.completeTask(task);
data.remove(task);
fireTableDataChanged();
}
});
button.setIcon(CrmIcons.DONE);
boolean completed = "completed".equals(task.getStatus().toLowerCase());
if (task.getDue() != null && task.getDue().isBeforeNow() && !completed)
button.setBackground(new Color(255, 0, 0, ALPHA));
else if (task.getDue() != null && task.getDue().toLocalDate().isEqual(new LocalDate()) && !completed)
button.setBackground(new Color(255, 150, 0, ALPHA));
else
button.setBackground(new Color(100, 255, 100, ALPHA));
if (completed)
{
button.setToolTipText("Task is already completed");
button.setEnabled(false);
}
else
button.setToolTipText("Mark as done...");
return button;
}
private JButton createRescheduleButton(final Task task)
{
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0)
{
RescheduleOption[] values = RescheduleOption.values();
int result = JOptionPane.showOptionDialog(JOptionPane.getFrameForComponent(button), "Please select a reschedule option.", "Reschedule", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, CrmIcons.RECHEDULE, values, RescheduleOption.TOMORROW_AM);
if (result < 0)
return;
RescheduleOption value = values[result];
DateTime due = task.getDue();
if (due == null || due.isBeforeNow())
due = new DateTime();
switch (value)
{
case LATER:
due = due.plusHours(3);
break;
case NEXT_WEEK:
due = due.plusWeeks(1);
break;
case TOMORROW_AM:
due = new DateTime().plusDays(1).toLocalDate().toDateTime(new LocalTime(9, 0, 0));
break;
case TOMORROW_PM:
due = new DateTime().plusDays(1).toLocalDate().toDateTime(new LocalTime(14, 0, 0));
break;
case DAYS_2:
due = due.plusDays(2);
break;
default:
break;
}
task.setDue(due);
CrmManager.rescheduleTask(task, task.getDue());
fireTableDataChanged();
}
});
button.setBackground(new Color(250, 245, 0, ALPHA));
button.setIcon(CrmIcons.RECHEDULE);
button.setToolTipText("Reschedule task...");
return button;
}
private JButton createViewButton(final Task task)
{
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0)
{
DesktopUtil.openBrowser(task.getViewUrl());
}
});
button.setBackground(new Color(90, 115, 255, ALPHA));
button.setIcon(CrmIcons.VIEW);
button.setToolTipText("View task...");
return button;
}
private JButton createEditButton(final Task task)
{
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0)
{
DesktopUtil.openBrowser(task.getEditUrl());
}
});
button.setBackground(new Color(10, 255, 255, ALPHA));
button.setIcon(CrmIcons.SETTINGS);
button.setToolTipText("Edit task...");
return button;
}
private JButton createViewRelationButton(final Task task)
{
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0)
{
String url = CrmManager.createObjectUrl(task.getParentType(), task.getParentId());
DesktopUtil.openBrowser(url);
}
});
button.setBackground(new Color(120, 165, 255, ALPHA));
switch (task.getParentType())
{
case "Cases":
button.setIcon(CrmIcons.WARN);
break;
case "Leads":
case "Contacts":
case "Accounts":
case "Prospects":
button.setIcon(CrmIcons.USER);
break;
case "Opportunities":
button.setIcon(CrmIcons.DOLLAR);
break;
default:
button.setVisible(false);
button.setEnabled(false);
break;
}
if (task.getParentId() == null || task.getParentId().trim().isEmpty())
{
button.setVisible(false);
button.setEnabled(false);
}
button.setToolTipText("View " + task.getExtendedTitle());
return button;
}
private JButton createCallButton(final Task task)
{
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0)
{
String name = "";
String no = null;
switch (task.getParentType())
{
case "Leads":
Lead lead = CrmManager.getLead(task.getParentId());
if (lead == null)
break;
name = lead.getTitle();
no = lead.getPhone();
case "Contacts":
Contact c = CrmManager.getContact(task.getParentId());
if (c == null)
break;
name = c.getTitle();
no = c.getPhone();
case "Opportunities":
Collection<Contact> contacts = CrmManager.getContactListByOpportunity(task.getParentId());
if (contacts != null && !contacts.isEmpty())
{
Contact next = contacts.iterator().next();
name = next.getTitle();
no = next.getPhone();
}
default:
break;
}
if (no == null || no.trim().isEmpty())
JOptionPane.showMessageDialog(null, "No number found for " + name);
AsteriskManager.dial(no);
}
});
button.setBackground(new Color(90, 90, 90, ALPHA));
button.setIcon(CrmIcons.CALL);
if (task.getParentId() == null || task.getParentId().trim().isEmpty())
{
button.setVisible(false);
button.setEnabled(false);
}
button.setToolTipText("Call "+task.getExtendedTitle());
return button;
}
private JButton createMessageButton(final Task task)
{
final JButton button = new JButton();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0)
{
Collection<HasEmail> email = new HashSet<>();
String subject = "";
switch (task.getParentType())
{
case "Cases":
Case c = CrmManager.getCase(task.getParentId());
final Collection<Contact> contacts = CrmManager.getContactListByCase(c.getId());
StringBuilder subjectSB = new StringBuilder();
subjectSB.append("[CASE:").append(c.getNumber()).append("] ");
subjectSB.append(c.getTitle());
email.addAll(contacts);
subject = subjectSB.toString();
break;
case "Leads":
Lead lead = CrmManager.getLead(task.getParentId());
email.add(lead);
break;
case "Contacts":
Contact contact = CrmManager.getContact(task.getParentId());
email.add(contact);
break;
case "Accounts":
break;
case "Opportunities":
email.addAll(CrmManager.getContactListByOpportunity(task.getParentId()));
break;
default:
break;
}
SendEmailDialog.sendEmail(null, subject, email);
}
});
button.setBackground(new Color(255, 255, 255, ALPHA));
button.setIcon(CrmIcons.MAIL);
button.setToolTipText("Create email...");
return button;
}
@Override
public int getRowCount()
{
return data.size();
}
@Override
public int getColumnCount()
{
return COLUMN_NAMES.length;
}
public Task getTask(int row)
{
return data.get(row);
}
}