/** * */ package net.combase.desktopcrm.swing; import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.SwingUtilities; import org.joda.time.DateTime; import com.google.common.collect.Lists; import ch.swingfx.twinkle.NotificationBuilder; import ch.swingfx.twinkle.window.Positions; import javafx.application.Platform; import javafx.collections.ObservableList; import javafx.embed.swing.JFXPanel; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import javafx.stage.Stage; import net.combase.desktopcrm.data.CrmManager; import net.combase.desktopcrm.domain.AbstractCrmObject; import net.combase.desktopcrm.domain.Call; import net.combase.desktopcrm.domain.CallType; import net.combase.desktopcrm.domain.Contact; import net.combase.desktopcrm.domain.Opportunity; import net.combase.desktopcrm.domain.Task; import net.combase.desktopcrm.swing.DataSelectionEventManager.DataSelectionListener; /** * TODO: create task from call use URL * crm/index.php?module=Tasks&action=EditView&record=4fc558fb-1303-f533-cdda-57913ac416e9 * * @author "Till Freier" */ public class CallWindow extends JFrame { /** * */ private static final long serialVersionUID = -601570990578198225L; private AbstractCrmObject contact; private DateTime start = new DateTime(); private JTextArea text; private final CallType type; private TaskTablePanel taskPanel; private JPanel activitySummary; private WebView browser; private JLabel label; public CallWindow(String number, CallType type) { super(); this.type = type; init(number); } private void init(String number) { setIconImage(CrmIcons.CALL.getImage()); JPanel main = new JPanel(); main.setLayout(new BorderLayout()); text = new JTextArea(); text.setText("\n\nCalled via " + number); text.setLineWrap(true); text.setWrapStyleWord(true); main.add(new JScrollPane(text), BorderLayout.CENTER); JPanel top = new JPanel(); top.setLayout(new FlowLayout()); label = new JLabel(number); top.add(label); final JButton select = new JButton(""); select.setIcon(CrmIcons.SETTINGS); select.setToolTipText("Change Contact"); select.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { select.setEnabled(false); DataSelectionEventManager.initiateDataSelection(new DataSelectionListener() { @Override public void dataSelected(AbstractCrmObject data) { contact = data; label.setText(data.getClass().getSimpleName() + ": " + data.getTitle()); select.setEnabled(true); setState(Frame.NORMAL); setAlwaysOnTop(true); toFront(); requestFocus(); setAlwaysOnTop(false); } }); } }); top.add(select); final JButton view = new JButton(""); view.setIcon(CrmIcons.VIEW); view.setToolTipText("Open Contact"); view.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (contact == null) { NotificationBuilder nb = DesktopUtil.createNotificationBuilder(); nb.withTitle("No contact found"); nb.withMessage("Please assign a contact first."); nb.withIcon(CrmIcons.WARN); nb.withDisplayTime(3000); nb.withPosition(Positions.CENTER); nb.showNotification(); } else DesktopUtil.openBrowser(contact.getViewUrl()); } }); top.add(view); main.add(top, BorderLayout.NORTH); JPanel bottom = new JPanel(); bottom.setLayout(new FlowLayout()); JButton support = new JButton("Support"); support.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { saveAction("Support"); } }); bottom.add(support); JButton sales = new JButton("Sales"); sales.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { saveAction("Sales"); } }); bottom.add(sales); JButton other = new JButton("Other"); other.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { saveAction("Other"); } }); bottom.add(other); main.add(bottom, BorderLayout.SOUTH); addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent we) { String ObjButtons[] = { "Yes", "No" }; int PromptResult = JOptionPane.showOptionDialog(CallWindow.this, "Are you sure this call is not worth getting logged?", "CRM Call Logging", JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, CrmIcons.WARN, ObjButtons, ObjButtons[1]); if (PromptResult == 0) { setVisible(false); } else { EventQueue.invokeLater(new Runnable() { @Override public void run() { setVisible(true); CallWindow.this.requestFocus(); } }); } } }); taskPanel = new TaskTablePanel(new ArrayList<Task>(0)); final JPanel mainTask = new JPanel(); mainTask.setLayout(new BorderLayout()); mainTask.add(taskPanel, BorderLayout.CENTER); activitySummary = new JPanel(); activitySummary.setLayout(new BorderLayout()); new JFXPanel(); Platform.runLater(new Runnable() { @Override public void run() { initBrowser(); } }); final JTabbedPane tabbedPane = new JTabbedPane(); tabbedPane.addTab("Call Info", CrmIcons.CALL, main); tabbedPane.addTab("Related Tasks", CrmIcons.DONE, mainTask); tabbedPane.addTab("Activities", CrmIcons.TALK, activitySummary); getContentPane().add(tabbedPane); setSize(640, 480); setVisible(true); setState(Frame.NORMAL); setAlwaysOnTop(true); toFront(); requestFocus(); setAlwaysOnTop(false); text.requestFocus(); text.requestFocusInWindow(); text.setCaretPosition(0); setContact(number); } void initBrowser() { Stage stage = new Stage(); stage.setTitle("Hello Java FX"); stage.setResizable(true); Group root = new Group(); Scene scene = new Scene(root, 1, 1); stage.setScene(scene); // Set up the embedded browser: browser = new WebView(); browser.setPrefSize(630, 435); ObservableList<Node> children = root.getChildren(); children.add(browser); JFXPanel jfxPanel = new JFXPanel(); jfxPanel.setScene(scene); activitySummary.add(jfxPanel, BorderLayout.CENTER); activitySummary.revalidate(); } protected void saveAction(String type) { Call c = new Call(); c.setStart(start); if (contact != null) { c.setRelatedObjectId(contact.getId()); c.setRelatedObjectType(contact.getCrmEntityType()); } String desc = text.getText(); String title = ": "; if (desc != null && desc.length() > 3) title += desc.substring(0, Math.min(desc.length(), 30)); c.setTitle(type + title); c.setDescription(desc); c.setType(this.type); setVisible(false); CrmManager.createCall(c); } /** * @param number */ private void setContact(String number) { contact = CrmManager.getContactByNumber(number); if (contact != null) { setIconImage(CrmIcons.USER.getImage()); final String accountId = ((Contact) contact).getAccountId(); if (accountId != null && !accountId.isEmpty()) { Collection<Opportunity> list = CrmManager.getOpportunityListByAccount(accountId); for (Opportunity opportunity : list) { contact = opportunity; setIconImage(CrmIcons.BELL.getImage()); } } } else { contact = CrmManager.getLeadByNumber(number); setIconImage(CrmIcons.USER.getImage()); } if (contact != null) setTitle("Call with " + contact.getTitle()); else setTitle("Call with " + number); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { if (contact == null) return; final List<Task> tasks = CrmManager.getTaskListByParent(contact.getId()); taskPanel.updateTaskList(Lists.reverse(tasks)); label.setText(contact.getTitle()); Platform.runLater(new Runnable() { @Override public void run() { WebEngine engine = browser.getEngine(); engine.load(contact.getActivitiesUrl()); } }); text.requestFocus(); } }); } }