/** * $RCSfile: ,v $ * $Revision: $ * $Date: $ * * Copyright (C) 2004-2011 Jive Software. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.sparkimpl.plugin.scratchpad; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.TimerTask; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JTextPane; import javax.swing.JToggleButton; import javax.swing.KeyStroke; import org.jdesktop.swingx.calendar.DateUtils; import org.jivesoftware.resource.Res; import org.jivesoftware.resource.SparkRes; import org.jivesoftware.spark.SparkManager; import org.jivesoftware.spark.component.RolloverButton; import org.jivesoftware.spark.component.VerticalFlowLayout; import org.jivesoftware.spark.plugin.Plugin; import org.jivesoftware.spark.ui.ContactList; import org.jivesoftware.spark.util.GraphicUtils; import org.jivesoftware.spark.util.ModelUtil; import org.jivesoftware.spark.util.ResourceUtils; import org.jivesoftware.spark.util.SwingWorker; import org.jivesoftware.spark.util.TaskEngine; /** * */ public class ScratchPadPlugin implements Plugin { public static boolean SHOW_ALL_TASKS = true; private static final String dateShortFormat = ((SimpleDateFormat)SimpleDateFormat.getDateInstance(SimpleDateFormat.SHORT)).toPattern(); private SimpleDateFormat formatter = new SimpleDateFormat(dateShortFormat); private static List<TaskUI> taskList = new ArrayList<TaskUI>(); private static JPanel panel_events; private static JPanel mainPanel; private static JFrame frame; public void initialize() { TimerTask startTask = new TimerTask() { @Override public void run() { panel_events = new JPanel(); mainPanel = new JPanel(); } }; TaskEngine.getInstance().schedule(startTask, 500); ContactList contactList = SparkManager.getWorkspace().getContactList(); contactList.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("control F6"), "viewNotes"); contactList.getActionMap().put("viewNotes", new AbstractAction("viewNotes") { private static final long serialVersionUID = -3258500919859584696L; public void actionPerformed(ActionEvent evt) { // Retrieve notes and dispaly in editor. retrieveNotes(); } }); contactList.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("control F5"), "viewTasks"); contactList.getActionMap().put("viewTasks", new AbstractAction("viewTasks") { private static final long serialVersionUID = 8589614513097901484L; public void actionPerformed(ActionEvent evt) { // Retrieve notes and dispaly in editor. showTaskList(); } }); //TODO REMOVE @SuppressWarnings("unused") int index = -1; JPanel commandPanel = SparkManager.getWorkspace().getCommandPanel(); for (int i = 0; i < commandPanel.getComponentCount(); i++) { if (commandPanel.getComponent(i) instanceof JLabel) { index = i; break; } } JMenuItem taskMenu = new JMenuItem(Res.getString("button.view.tasklist"), SparkRes.getImageIcon(SparkRes.DESKTOP_IMAGE)); JMenuItem notesMenu = new JMenuItem(Res.getString("button.view.notes"), SparkRes.getImageIcon(SparkRes.DOCUMENT_16x16)); taskMenu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showTaskList(); } }); notesMenu.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { retrieveNotes(); } }); // Add To toolbar final JMenu actionsMenu = SparkManager.getMainWindow().getMenuByName(Res.getString("menuitem.actions")); actionsMenu.addSeparator(); actionsMenu.add(taskMenu); actionsMenu.add(notesMenu); // Start notifications. new TaskNotification(); } private void showTaskList() { frame = new JFrame(Res.getString("title.tasks")); frame.setIconImage(SparkManager.getMainWindow().getIconImage()); panel_events.removeAll(); mainPanel.removeAll(); //final List<TaskUI> taskList = new ArrayList<TaskUI>(); //final JPanel mainPanel = new JPanel(); mainPanel.setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP, 0, 0, true, false)); mainPanel.setBackground(Color.white); final JPanel topPanel = new JPanel(new GridBagLayout()); final JTextField taskField = new JTextField(); final JTextField dueDateField = new JTextField(); final JButton addButton = new JButton(Res.getString("add")); final JLabel addTaskLabel = new JLabel(Res.getString("label.add.task")); topPanel.setOpaque(false); topPanel.add(addTaskLabel, new GridBagConstraints(0, 0, 1, 1, .9, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0)); topPanel.add(taskField, new GridBagConstraints(0, 1, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(2, 2, 0, 2), 0, 0)); topPanel.add(dueDateField, new GridBagConstraints(1, 1, 1, 1, 0.1, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(2, 2, 0, 2), 50, 0)); topPanel.add(addButton, new GridBagConstraints(3, 1, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 2, 0, 2), 0, 0)); topPanel.add(new JLabel(Res.getString("label.timeformat", formatter.toPattern())), new GridBagConstraints(1, 2, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0)); mainPanel.add(topPanel); // Add Selection final JPanel middlePanel = new JPanel(new GridBagLayout()); final JLabel showLabel = new JLabel(Res.getString("label.show")); final JToggleButton allButton = new JToggleButton(Res.getString("button.tasks.all")); final JToggleButton activeButton = new JToggleButton(Res.getString("button.tasks.active")); final ButtonGroup buttonGroup = new ButtonGroup(); buttonGroup.add(allButton); buttonGroup.add(activeButton); middlePanel.setOpaque(false); middlePanel.add(showLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0)); middlePanel.add(allButton, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0)); middlePanel.add(activeButton, new GridBagConstraints(2, 0, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(2, 2, 2, 2), 0, 0)); mainPanel.add(middlePanel); mainPanel.setBackground(Color.white); final JPanel titlePanel = new JPanel(new BorderLayout()) { private static final long serialVersionUID = -8812868562658925280L; public void paintComponent(Graphics g) { Color startColor = Color.white; Color endColor = new Color(198, 211, 247); Graphics2D g2 = (Graphics2D)g; int w = getWidth(); int h = getHeight(); GradientPaint gradient = new GradientPaint(0, 0, startColor, w, h, endColor, true); g2.setPaint(gradient); g2.fillRect(0, 0, w, h); } }; final JLabel taskLabel = new JLabel(Res.getString("label.due") + " "); taskLabel.setFont(taskLabel.getFont().deriveFont(Font.BOLD)); titlePanel.add(taskLabel, BorderLayout.EAST); mainPanel.add(titlePanel); Action showAllAction = new AbstractAction() { private static final long serialVersionUID = -7031122285194582204L; public void actionPerformed(ActionEvent e) { for (TaskUI ui : taskList) { ui.setVisible(true); } SHOW_ALL_TASKS = true; } }; Action showActiveAction = new AbstractAction() { private static final long serialVersionUID = -7551153291479117311L; public void actionPerformed(ActionEvent e) { for (TaskUI ui : taskList) { if (ui.isSelected()) { ui.setVisible(false); } } SHOW_ALL_TASKS = false; } }; final Action addAction = new AbstractAction() { private static final long serialVersionUID = -5937301529216080813L; public void actionPerformed(ActionEvent e) { String taskTitle = taskField.getText(); if (!ModelUtil.hasLength(taskTitle)) { return; } Task task = new Task(); task.setTitle(taskTitle); // Set creation time. final Date creationDate = new Date(); task.setCreatedDate(creationDate.getTime()); // Set due date. String dueDate = dueDateField.getText(); if (ModelUtil.hasLength(dueDate)) { try { Date date = formatter.parse(dueDate); task.setDueDate(date.getTime()); } catch (ParseException e1) { // Nothing to do } } taskField.setText(""); final TaskUI taskUI = new TaskUI(task); //mainPanel.add(taskUI); panel_events.add(taskUI); taskList.add(taskUI); panel_events.invalidate(); panel_events.validate(); panel_events.repaint(); mainPanel.invalidate(); mainPanel.validate(); mainPanel.repaint(); frame.invalidate(); frame.validate(); frame.repaint(); } }; mainPanel.add(panel_events); panel_events.setLayout(new VerticalFlowLayout(VerticalFlowLayout.TOP, 0, 0, true, false)); panel_events.setBackground(Color.white); allButton.addActionListener(showAllAction); activeButton.addActionListener(showActiveAction); GraphicUtils.makeSameSize(allButton, activeButton); addButton.addActionListener(addAction); Tasks tasks = Tasks.getTaskList(SparkManager.getConnection()); updateTaskUI(tasks); if (SHOW_ALL_TASKS) { allButton.setSelected(true); } else { activeButton.setSelected(true); showActiveAction.actionPerformed(null); } long tomorrow = DateUtils.addDays(new Date().getTime(), 1); SimpleDateFormat formatter = new SimpleDateFormat(dateShortFormat); dueDateField.setText(formatter.format(new Date(tomorrow))); final JScrollPane pane = new JScrollPane(mainPanel); frame.getContentPane().setLayout(new BorderLayout()); frame.getContentPane().add(pane, BorderLayout.CENTER); frame.pack(); frame.setSize(400, 400); final Action saveAction = new AbstractAction() { private static final long serialVersionUID = -4287799161421970177L; public void actionPerformed(ActionEvent actionEvent) { // Save it. Tasks tasks = new Tasks(); for (TaskUI ui : taskList) { Task task = ui.getTask(); tasks.addTask(task); } Tasks.saveTasks(tasks, SparkManager.getConnection()); } }; addButton.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent e) { if (e.getKeyChar() == KeyEvent.VK_ESCAPE) { frame.dispose(); saveAction.actionPerformed(null); } } }); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent windowEvent) { saveAction.actionPerformed(null); } }); taskField.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if (e.getKeyChar() == KeyEvent.VK_ENTER) { addAction.actionPerformed(null); } } }); GraphicUtils.centerWindowOnComponent(frame, SparkManager.getMainWindow()); frame.setVisible(true); } /** * Updates the GUI of Tasks * * @param tasks Tasks */ public static void updateTaskUI(Tasks tasks) { panel_events.removeAll(); taskList.clear(); for (Object o : tasks.getTasks()) { Task task = (Task) o; final TaskUI taskUI = new TaskUI(task); if ( SHOW_ALL_TASKS == false ) { if ( taskUI.isSelected() ) { taskUI.setVisible(false); }else { taskUI.setVisible(true); } } panel_events.add(taskUI); taskList.add(taskUI); } panel_events.invalidate(); panel_events.validate(); panel_events.repaint(); mainPanel.invalidate(); mainPanel.validate(); mainPanel.repaint(); frame.invalidate(); frame.validate(); frame.repaint(); } /** * Retrieve private notes from server. */ private void retrieveNotes() { // Retrieve private notes from server. final SwingWorker notesWorker = new SwingWorker() { public Object construct() { return PrivateNotes.getPrivateNotes(); } public void finished() { final PrivateNotes privateNotes = (PrivateNotes)get(); showPrivateNotes(privateNotes); } }; notesWorker.start(); } private void showPrivateNotes(final PrivateNotes privateNotes) { String text = privateNotes.getNotes(); final JLabel titleLabel = new JLabel("Notepad"); titleLabel.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.LIGHT_GRAY)); titleLabel.setFont(new Font("Dialog", Font.BOLD, 13)); titleLabel.setHorizontalAlignment(JLabel.CENTER); final JTextPane pane = new JTextPane(); pane.setFont(new Font("Dialog", Font.PLAIN, 12)); pane.setOpaque(false); final JScrollPane scrollPane = new JScrollPane(pane, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); scrollPane.setOpaque(false); scrollPane.getViewport().setOpaque(false); pane.setText(text); final RolloverButton button = new RolloverButton(Res.getString("save"), null); final RolloverButton cancelButton = new RolloverButton(Res.getString("cancel"), null); ResourceUtils.resButton(button, Res.getString("button.save")); ResourceUtils.resButton(cancelButton, Res.getString("button.cancel")); final JFrame frame = new JFrame(Res.getString("title.notes")); final JPanel mainPanel = new JPanel(); pane.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent e) { if (e.getKeyChar() == KeyEvent.VK_ESCAPE) { frame.dispose(); // Save it. String text = pane.getText(); privateNotes.setNotes(text); PrivateNotes.savePrivateNotes(privateNotes); } } }); mainPanel.setBackground(Color.white); mainPanel.setLayout(new GridBagLayout()); frame.setIconImage(SparkManager.getMainWindow().getIconImage()); frame.getContentPane().add(mainPanel); // mainPanel.add(titleLabel, new GridBagConstraints(0, 0, 3, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0)); mainPanel.add(scrollPane, new GridBagConstraints(0, 1, 3, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0)); mainPanel.add(button, new GridBagConstraints(1, 2, 1, 1, 1.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); mainPanel.add(cancelButton, new GridBagConstraints(2, 2, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0)); frame.pack(); frame.setSize(400, 400); GraphicUtils.centerWindowOnComponent(frame, SparkManager.getMainWindow()); frame.setVisible(true); pane.setCaretPosition(0); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { frame.dispose(); // Save it. String text = pane.getText(); privateNotes.setNotes(text); PrivateNotes.savePrivateNotes(privateNotes); } }); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { frame.dispose(); } }); } public void shutdown() { } public boolean canShutDown() { return true; } public void uninstall() { } public static List<TaskUI> getTaskList() { return taskList; } // private class DragWindowAdapter extends MouseAdapter // implements MouseMotionListener { // private JFrame m_msgWnd; // private int m_mousePrevX, // m_mousePrevY; // private int m_frameX, // m_frameY; // // public DragWindowAdapter(JFrame mw) { // m_msgWnd = mw; // } // // public void mousePressed(MouseEvent e) { // super.mousePressed(e); // m_mousePrevX = e.getX(); // m_mousePrevY = e.getY(); // m_frameX = 0; // m_frameY = 0; // } // // public void mouseDragged(MouseEvent e) { // int X = e.getX(); // int Y = e.getY(); // int MsgX = m_msgWnd.getX(); // int MsgY = m_msgWnd.getY(); // // int moveX = X - m_mousePrevX; // Negative if move left // int moveY = Y - m_mousePrevY; // Negative if move down // if (moveX == 0 && moveY == 0) return; // m_mousePrevX = X - moveX; // m_mousePrevY = Y - moveY; // // //System.out.println("mouseDragged x,y = (" + X + "," + Y + // // ") diff (" + moveX + "," + moveY + // // ") MsgX/MsgY = " + MsgX + "," + MsgY); // // // mouseDragged caused by setLocation() on frame. // if (m_frameX == MsgX && m_frameY == MsgY) { // m_frameX = 0; // m_frameY = 0; // return; // } // // // '-' would cause wrong direction for movement. // int newFrameX = MsgX + moveX; // // '-' would cause wrong // int newFrameY = MsgY + moveY; // // m_frameX = newFrameX; // m_frameY = newFrameY; // m_msgWnd.setLocation(newFrameX, newFrameY); // } // // public void mouseMoved(MouseEvent e) { // } // } }