/** * */ 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.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 net.combase.desktopcrm.data.AsteriskManager; import net.combase.desktopcrm.data.CrmManager; import net.combase.desktopcrm.domain.Call; import net.combase.desktopcrm.domain.Contact; import net.combase.desktopcrm.domain.Lead; /** * @author "Till Freier" */ public class CallTableModel 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[] { "Call", "Time", "", "", "", ""}; private static final Class<?>[] COLUMN_TYPES = new Class<?>[] { String.class, String.class, JButton.class, JButton.class, JButton.class, JButton.class }; private final List<Call> data; public CallTableModel(List<Call> data) { super(); this.data = data; } public void update(List<Call> 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 */ Call task = data.get(rowIndex); switch (columnIndex) { case 0: return task.getTitle() + " [" + task.getExtendedTitle() + "]"; case 1: if (task.getStart() == null) return ""; return task.getStart().toDateTime(DateTimeZone.getDefault()).toString("E MM/dd/yy HH:mm"); case 2: return createViewButton(task); case 3: return createCallButton(task); case 4: return createRescheduleButton(task); case 5: return createDoneButton(task); default: return "Error"; } } /** * @return */ private JButton createDoneButton(final Call task) { final JButton button = new JButton(); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { CrmManager.heldCall(task); data.remove(task); fireTableDataChanged(); } }); button.setIcon(CrmIcons.DONE); if (task.getStart() != null && task.getStart().isBeforeNow() && task.isPlanned()) button.setBackground(new Color(255, 0, 0, 100)); else if (task.getStart() != null && task.getStart().toLocalDate().isEqual(new LocalDate()) && task.isPlanned()) button.setBackground(new Color(255, 150, 0, 100)); else button.setBackground(new Color(100, 255, 100, 100)); if (task.isPlanned()) button.setToolTipText("Mark as done..."); else button.setToolTipText("Call is completed."); button.setEnabled(task.isPlanned()); return button; } private JButton createRescheduleButton(final Call 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.getStart(); 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.setStart(due); CrmManager.rescheduleCall(task, task.getStart()); fireTableDataChanged(); } }); button.setBackground(new Color(250, 245, 0, 100)); button.setIcon(CrmIcons.RECHEDULE); button.setToolTipText("Reschedule call..."); button.setEnabled(task.isPlanned()); return button; } private JButton createViewButton(final Call 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, 100)); button.setIcon(CrmIcons.VIEW); button.setToolTipText("View call..."); return button; } private JButton createCallButton(final Call 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, 100)); 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; } @Override public int getRowCount() { return data.size(); } @Override public int getColumnCount() { return COLUMN_NAMES.length; } }