at.tuwien.sbc.feeder.gui.panels.EventOrganizationPanel.java Source code

Java tutorial

Introduction

Here is the source code for at.tuwien.sbc.feeder.gui.panels.EventOrganizationPanel.java

Source

package at.tuwien.sbc.feeder.gui.panels;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.swing.BorderFactory;
import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ListModel;

import org.apache.log4j.Logger;

import at.tuwien.sbc.feeder.ControllerReference;
import at.tuwien.sbc.feeder.common.Constants;
import at.tuwien.sbc.model.DoodleEvent;
import at.tuwien.sbc.model.DoodleSchedule;
import at.tuwien.sbc.model.Notification;
import at.tuwien.sbc.model.Peer;

import com.gigaspaces.internal.backport.java.util.Arrays;
import com.jgoodies.forms.layout.CellConstraints;

/**
 * This code was edited or generated using CloudGarden's Jigloo
 * SWT/Swing GUI Builder, which is free for non-commercial
 * use. If Jigloo is being used commercially (ie, by a corporation,
 * company or business for any purpose whatever) then you
 * should purchase a license for each developer using Jigloo.
 * Please visit www.cloudgarden.com for details.
 * Use of Jigloo implies acceptance of these licensing terms.
 * A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
 * THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
 * LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
 */
/**
 * TODO add refresh button for participants.
 */
public class EventOrganizationPanel extends javax.swing.JPanel
        implements ActionListener, MouseListener, ComponentListener, ItemListener {

    private static final Logger logger = Logger.getLogger(EventOrganizationPanel.class);

    private JPanel pnlNorth;
    private JScrollPane scrlInvites;
    private JButton rmEvent;
    private JButton commentAddNew;
    private JButton commentDelete;
    private JList commentList;
    private JPanel commentsPanel;
    private JPanel pnlCenter;
    private JButton btnRemoveInvite;
    private JButton btnAddInvite;
    private JPanel jPanel1;
    private SingleSchedulePanel pnlSchedule;
    private JList lstInvites;
    private JLabel lblFixated;
    private JButton btnFixate;
    private JComboBox cmbFix;
    private JList lstParicipants;
    private JScrollPane scrlParticipants;
    private JLabel lblParticipants;
    private JLabel lblInvites;
    private JPanel pnlPeers;
    private JButton btnEdit;
    private JButton btnCreate;
    private JComboBox cmbEvent;

    public EventOrganizationPanel() {
        super();
        initGUI();
    }

    private void initGUI() {
        try {
            BorderLayout thisLayout = new BorderLayout();
            this.setLayout(thisLayout);
            this.setPreferredSize(new java.awt.Dimension(600, 600));
            this.setSize(600, 600);
            {
                commentsPanel = new JPanel();
                this.add(commentsPanel, BorderLayout.SOUTH);
                commentsPanel.setLayout(null);
                commentsPanel.setPreferredSize(new java.awt.Dimension(500, 140));
                commentsPanel.setSize(500, 140);
                commentsPanel.setBorder(BorderFactory.createTitledBorder("Comments"));
                {
                    commentList = new JList();
                    commentsPanel.add(commentList);
                    commentList.setModel(new DefaultComboBoxModel(getCommentsForSelectedEvent().toArray()));
                    commentList.setBounds(17, 20, 451, 103);
                }
                {
                    commentDelete = new JButton();
                    commentsPanel.add(commentDelete);
                    commentDelete.setText("-");
                    commentDelete.setBounds(475, 20, 44, 26);
                    commentDelete.setActionCommand(Constants.CMD_BTN_REMOVE_COMMENT);
                    commentDelete.addActionListener(this);

                }
                {
                    commentAddNew = new JButton();
                    commentsPanel.add(commentAddNew);
                    commentAddNew.setText("new comment");
                    commentAddNew.setBounds(475, 101, 121, 22);
                    commentAddNew.setActionCommand(Constants.CMD_BTN_ADD_COMMENT);
                    commentAddNew.addActionListener(this);
                }
            }
            {
                pnlNorth = new JPanel();
                this.add(pnlNorth, BorderLayout.NORTH);
                pnlNorth.setLayout(null);
                pnlNorth.setPreferredSize(new java.awt.Dimension(513, 33));
                {
                    cmbEvent = new JComboBox();
                    pnlNorth.add(cmbEvent, new CellConstraints("2, 2, 1, 1, default, default"));
                    cmbEvent.setBounds(9, 6, 181, 27);
                    cmbEvent.setModel(this.getEventsModel(ControllerReference.getInstance().getUser()));
                    // cmbEvent.addActionListener(this);
                    cmbEvent.addItemListener(this);
                    cmbEvent.setActionCommand(Constants.CMD_EVENT_COMBO_CHANGED);
                }
                {
                    rmEvent = new JButton();
                    pnlNorth.add(rmEvent);
                    rmEvent.setText("-");
                    rmEvent.setBounds(196, 7, 43, 26);
                    rmEvent.setActionCommand(Constants.CMD_BTN_REMOVE_EVENT);
                    rmEvent.addActionListener(this);
                }
                {
                    lblFixated = new JLabel();
                    pnlNorth.add(lblFixated);
                    lblFixated.setBounds(250, 7, 295, 23);
                }
            }
            {
                pnlCenter = new JPanel();
                GridLayout pnlCenterLayout = new GridLayout(1, 2);
                pnlCenterLayout.setColumns(1);
                pnlCenterLayout.setHgap(5);
                pnlCenterLayout.setVgap(5);
                pnlCenter.setLayout(pnlCenterLayout);
                this.add(pnlCenter, BorderLayout.CENTER);
                pnlCenter.setPreferredSize(new java.awt.Dimension(600, 250));
                pnlCenter.setSize(600, 250);
                {
                    jPanel1 = new JPanel();
                    pnlCenter.add(jPanel1);
                    jPanel1.setLayout(null);
                    jPanel1.setPreferredSize(new java.awt.Dimension(254, 241));
                    jPanel1.setBorder(BorderFactory.createTitledBorder("Dates"));
                    {
                        pnlSchedule = new SingleSchedulePanel();
                        jPanel1.add(pnlSchedule, new CellConstraints("2, 1, 1, 1, default, default"));
                        pnlSchedule.setBounds(9, 20, 232, 61);
                        pnlSchedule.setPreferredSize(new java.awt.Dimension(0, 0));
                    }
                    {
                        btnCreate = new JButton();
                        jPanel1.add(btnCreate);
                        btnCreate.setText("Create");
                        btnCreate.setBounds(9, 87, 110, 23);
                        btnCreate.setActionCommand(Constants.CMD_BTN_CREATE);
                        btnCreate.addActionListener(this);
                    }
                    {
                        btnEdit = new JButton();
                        jPanel1.add(btnEdit);
                        btnEdit.setText("Update");
                        btnEdit.setBounds(131, 87, 110, 23);
                        btnEdit.setActionCommand(Constants.CMD_BTN_UPDATE);
                        btnEdit.addActionListener(this);
                        btnEdit.setEnabled(this.isUpdateAllowed());

                    }
                    {
                        cmbFix = new JComboBox();
                        jPanel1.add(cmbFix);
                        cmbFix.setBounds(9, 120, 110, 22);
                        cmbFix.setEnabled(isFixationPossible((String) cmbEvent.getSelectedItem()));
                        // cmbFix.setModel(this.getFixationModel(cmbFix.isEnabled(),
                        // (String) cmbEvent.getSelectedItem()));
                    }
                    {
                        btnFixate = new JButton();
                        jPanel1.add(btnFixate);
                        btnFixate.setText("Fixate");
                        btnFixate.setBounds(131, 121, 110, 22);
                        btnFixate.setEnabled(cmbFix.isEnabled());
                        btnFixate.addActionListener(this);
                        btnFixate.setActionCommand(Constants.CMD_BTN_FIXATE);
                    }
                }
                {
                    pnlPeers = new JPanel();
                    pnlCenter.add(pnlPeers);
                    pnlPeers.setLayout(null);
                    pnlPeers.setPreferredSize(new java.awt.Dimension(236, 283));
                    pnlPeers.setBorder(BorderFactory.createTitledBorder("Peers"));
                    {
                        lblInvites = new JLabel();
                        pnlPeers.add(lblInvites);
                        lblInvites.setText("Invite Peers:");
                        lblInvites.setIcon(new ImageIcon(ClassLoader.getSystemResource("images/refresh.png")));
                        lblInvites.setBounds(5, 15, 134, 20);
                        lblInvites.addMouseListener(this);
                    }
                    {
                        scrlInvites = new JScrollPane();
                        pnlPeers.add(scrlInvites);
                        scrlInvites.setBounds(5, 36, 134, 77);
                        {
                            ListModel lstInvitesModel = new DefaultComboBoxModel(
                                    ControllerReference.getInstance().getAllPeers());
                            lstInvites = new JList();
                            scrlInvites.setViewportView(lstInvites);
                            lstInvites.setModel(lstInvitesModel);
                            lstInvites.setSize(208, 75);
                            lstInvites.setPreferredSize(new java.awt.Dimension(131, 74));
                        }
                    }
                    {
                        lblParticipants = new JLabel();
                        pnlPeers.add(lblParticipants);
                        lblParticipants.setText("Participants:");
                        lblParticipants.setBounds(5, 117, 94, 18);
                    }
                    {
                        scrlParticipants = new JScrollPane();
                        pnlPeers.add(scrlParticipants);
                        scrlParticipants.setBounds(5, 141, 134, 74);
                        {
                            ListModel lstParticipantsModel = new DefaultComboBoxModel(
                                    getParticipantsForSelectedEvent().toArray());
                            lstParicipants = new JList();
                            scrlParticipants.setViewportView(lstParicipants);
                            lstParicipants.setModel(lstParticipantsModel);
                            lstParicipants.setSize(240, 75);
                            lstParicipants.setPreferredSize(new java.awt.Dimension(131, 71));
                        }
                    }
                    {
                        btnAddInvite = new JButton();
                        pnlPeers.add(btnAddInvite);
                        btnAddInvite.setText("+");
                        btnAddInvite.setBounds(145, 36, 48, 27);
                        btnAddInvite.setActionCommand(Constants.CMD_BTN_ADD_INVITATION);
                        btnAddInvite.addActionListener(this);
                    }
                    {
                        btnRemoveInvite = new JButton();
                        pnlPeers.add(btnRemoveInvite);
                        btnRemoveInvite.setText("-");
                        btnRemoveInvite.setBounds(196, 36, 42, 27);
                        btnRemoveInvite.setActionCommand(Constants.CMD_BTN_REMOVE_INVITATION);
                        btnRemoveInvite.addActionListener(this);
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private boolean isUpdateAllowed() {
        if (cmbEvent.getItemCount() == 0) {
            return false;
        } else {
            String event = (String) cmbEvent.getSelectedItem();
            return this.isEventEditPossible(event);
        }
    }

    private boolean isEventEditPossible(String name) {
        DoodleEvent event = ControllerReference.getInstance().findEventByNameAndOwner(name);

        if (event != null && event.retrieveParticipants().isEmpty()) {
            return true;
        }

        return false;
    }

    private boolean isFixationPossible(String name) {
        DoodleEvent event = ControllerReference.getInstance().findEventByNameAndOwner(name);
        if (event != null && event.getFixSchedule() == null && event.retrieveInvitations().isEmpty()
                && !event.retrieveParticipants().isEmpty()) {
            return true;
        }

        return false;
    }

    private List<String> getParticipantsForSelectedEvent() {
        if (cmbEvent.getSelectedItem() != null) {
            String e = (String) cmbEvent.getSelectedItem();

            DoodleEvent event = ControllerReference.getInstance().findEventByNameAndOwner(e);

            if (event != null) {
                return event.retrieveParticipants();
            }
        }
        return new ArrayList<String>();
    }

    private List<String> getCommentsForSelectedEvent() {
        if (cmbEvent != null && cmbEvent.getSelectedItem() != null) {
            String e = (String) cmbEvent.getSelectedItem();

            DoodleEvent event = ControllerReference.getInstance().findEventByNameAndOwner(e);

            if (event != null) {
                return event.retrieveComments();
            }
        }
        return new ArrayList<String>();
    }

    public void actionPerformed(ActionEvent evt) {
        String cmd = evt.getActionCommand();

        if (cmd.equals(Constants.CMD_BTN_CREATE)) {
            this.createEvent();

        } else if (cmd.equals(Constants.CMD_BTN_UPDATE)) {
            this.updateEvent();

        } else if (cmd.equals(Constants.CMD_BTN_ADD_INVITATION)) {
            this.addInvite();

        } else if (cmd.equals(Constants.CMD_BTN_REMOVE_INVITATION)) {
            this.removeInvite();

        } else if (cmd.equals(Constants.CMD_BTN_REMOVE_EVENT)) {
            this.removeEvent();

        } else if (cmd.equals(Constants.CMD_BTN_FIXATE)) {
            this.fixateEvent();

        } else if (cmd.equals(Constants.CMD_BTN_ADD_COMMENT)) {
            DoodleEvent event = ControllerReference.getInstance()
                    .findEventByNameAndOwner((String) cmbEvent.getSelectedItem());
            if (event != null) {
                String comment = JOptionPane.showInputDialog("Type your comment for Event: " + event.getName(), "");
                if (comment != null && comment.length() > 0) {
                    event.retrieveComments()
                            .add(ControllerReference.getInstance().getUser().getName() + ": " + comment);
                    ControllerReference.getInstance().getGigaSpace().write(event);
                    refresh();
                }
            } else {
                JOptionPane.showMessageDialog(this, "No Event selected");
            }
        } else if (cmd.equals(Constants.CMD_BTN_REMOVE_COMMENT)) {
            String selectedComment = (String) commentList.getSelectedValue();
            DoodleEvent selectedEvent = ControllerReference.getInstance()
                    .findEventByNameAndOwner((String) cmbEvent.getSelectedItem());
            if (selectedComment != null && selectedEvent != null) {
                selectedEvent.removeComment(selectedComment);
                ControllerReference.getInstance().getGigaSpace().write(selectedEvent);
                refresh();
            } else {
                JOptionPane.showMessageDialog(this,
                        "To delete a comment please select one Event and one Comment from the list");
            }
        }
        // else if (cmd.equals(Constants.CMD_EVENT_COMBO_CHANGED)) {
        // refresh();
        // }
    }

    private void fixateEvent() {
        String name = (String) cmbEvent.getSelectedItem();
        if (name != null) {
            DoodleEvent event = ControllerReference.getInstance().findEventByNameAndOwner(name);
            if (event != null) {
                event.setFixSchedule(((DoodleSchedule) cmbFix.getSelectedItem()).toString());
                ControllerReference.getInstance().getGigaSpace().write(event);
                Notification n;
                for (String p : event.getParticipants()) {
                    n = new Notification(p,
                            "The event '" + event.getName() + "' was fixated at " + event.getFixSchedule());
                    ControllerReference.getInstance().getGigaSpace().write(n);
                }
                this.refresh();
            }

        }

    }

    private void removeEvent() {
        String name = (String) cmbEvent.getSelectedItem();
        if (name == null) {
            JOptionPane.showMessageDialog(this, "Please select an event");
        } else {
            int choice = JOptionPane.showConfirmDialog(this,
                    "Are you sure you want to delete this event. All Event Data will be removed!");
            if (choice == JOptionPane.YES_OPTION) {
                DoodleEvent event = ControllerReference.getInstance().findEventByNameAndOwner(name);
                ControllerReference.getInstance().deleteOldSchedules(null, event.getId());
                DoodleEvent template = new DoodleEvent(event.getId());
                event = ControllerReference.getInstance().getGigaSpace().take(template);
                this.notifyEventRemoval(event);
                cmbEvent.setModel(getEventsModel(ControllerReference.getInstance().getUser()));
                this.refresh();
                JOptionPane.showMessageDialog(this, "The event was removed successfully");
            }
        }

    }

    private void notifyEventRemoval(DoodleEvent event) {
        Notification n;
        for (String s : event.retrieveInvitations()) {
            n = new Notification(s, "The event '" + event.getName() + "' was deleted!");
            ControllerReference.getInstance().getGigaSpace().write(n);
        }

        for (String s : event.retrieveParticipants()) {
            n = new Notification(s, "The event '" + event.getName() + "' was deleted!");
            ControllerReference.getInstance().getGigaSpace().write(n);
        }
    }

    private void notifyEventUpdate(DoodleEvent event) {
        Notification n;
        for (String s : event.retrieveInvitations()) {
            n = new Notification(s, "The event '" + event.getName() + "' was updated");
            ControllerReference.getInstance().getGigaSpace().write(n);
        }
    }

    private void removeInvite() {
        String name = (String) cmbEvent.getSelectedItem();
        DoodleEvent event = ControllerReference.getInstance().findEventByNameAndOwner(name);

        if (event != null) {

            Object[] peers = lstInvites.getSelectedValues();
            logger.info(event.retrieveInvitations().size());
            if (peers.length > 0
                    && (event.retrieveInvitations().size() + event.retrieveParticipants().size() > 1)) {
                boolean atLeastOne = false;
                for (Object p : peers) {
                    Peer peer = (Peer) p;
                    boolean removed = event.removeInvitation(peer);
                    if (removed) {
                        atLeastOne = true;
                        // remove all schedules for this one
                        ControllerReference.getInstance().deleteOldSchedules(peer.getId(), event.getId());
                    }
                }

                // how do we remove the notification in the removed clients????
                if (atLeastOne) {
                    JOptionPane.showMessageDialog(this, "Invitation removed successfully");
                    event.setAction("processIt");
                    ControllerReference.getInstance().getGigaSpace().write(event);
                } else {
                    JOptionPane.showMessageDialog(this,
                            "All selected peers were not invited or have already subscribed");
                }

            } else {
                JOptionPane.showMessageDialog(this,
                        "Please select at least one invited peer. \nPlease note that an event cannot be left with no invitations or participants");
            }

        } else {
            JOptionPane.showMessageDialog(this, "Please select an event");
        }

    }

    private void addInvite() {

        String name = (String) cmbEvent.getSelectedItem();
        DoodleEvent event = ControllerReference.getInstance().findEventByNameAndOwner(name);
        if (event != null) {
            Object[] peers = lstInvites.getSelectedValues();

            if (peers.length > 0) {
                boolean atLeastOne = false;
                for (Object p : peers) {
                    Peer peer = (Peer) p;
                    boolean added = event.addInvite(peer);
                    if (added) {
                        atLeastOne = true;
                        // add all schedules for this one..
                        List<DoodleSchedule> schedules = ControllerReference.getInstance()
                                .readSchedulesForCurrentUser(event.getId());
                        DoodleSchedule nSchedule;
                        for (DoodleSchedule schedule : schedules) {
                            nSchedule = new DoodleSchedule(peer.getId(), event.getId());
                            nSchedule.setHour(schedule.getHour());
                            nSchedule.setDay(schedule.getDay());
                            ControllerReference.getInstance().getGigaSpace().write(nSchedule);
                        }
                    }
                }

                if (atLeastOne) {
                    JOptionPane.showMessageDialog(this, "Invitation sent successfully");
                    event.setAction("processIt");
                    ControllerReference.getInstance().getGigaSpace().write(event);
                } else {
                    JOptionPane.showMessageDialog(this, "All selected peers were already invited");
                }
            } else {
                JOptionPane.showMessageDialog(this, "Please select at least one peer");
            }
        } else {
            JOptionPane.showMessageDialog(this, "Please select an event");
        }

    }

    private void updateEvent() {
        String name = (String) this.cmbEvent.getSelectedItem();
        DoodleEvent event = ControllerReference.getInstance().findEventByNameAndOwner(name);
        if (event != null) {
            logger.info("updating event with id: " + event.getId());
            try {
                if (event.retrieveParticipants().isEmpty()) {
                    Date start = this.pnlSchedule.getTxtStart().getDate();
                    Date end = this.pnlSchedule.getTxtEnd().getDate();
                    Calendar endCal = Calendar.getInstance();
                    Calendar startCal = Calendar.getInstance();
                    endCal.setTime(end);
                    startCal.setTime(start);

                    if (start.before(end)
                            && (startCal.get(Calendar.HOUR_OF_DAY) < endCal.get(Calendar.HOUR_OF_DAY))) {

                        name = JOptionPane.showInputDialog("Please type in a name for this event.", name);

                        if (name != null && !name.equals("")) {

                            Peer current = ControllerReference.getInstance().getUser();
                            List<DoodleSchedule> schedules = new ArrayList<DoodleSchedule>();
                            for (int d = startCal.get(Calendar.DAY_OF_YEAR); d <= endCal
                                    .get(Calendar.DAY_OF_YEAR); d++) {
                                for (int h = startCal.get(Calendar.HOUR_OF_DAY); h < endCal
                                        .get(Calendar.HOUR_OF_DAY); h++) {
                                    for (String p : event.retrieveInvitations()) {
                                        DoodleSchedule forPeer = new DoodleSchedule(d + "", h + "", p,
                                                event.getId());
                                        schedules.add(forPeer);
                                    }
                                }
                            }

                            event = (DoodleEvent) ControllerReference.getInstance().refresh(event);
                            if (event.retrieveParticipants().isEmpty()) {
                                List<String> sIds = new ArrayList<String>();
                                // delete all old schedules
                                ControllerReference.getInstance().deleteOldSchedules(null, event.getId());
                                for (DoodleSchedule s : schedules) {
                                    ControllerReference.getInstance().getGigaSpace().write(s);
                                    sIds.add(s.getId());

                                }
                                event.retrieveSchedules().clear();
                                event.retrieveSchedules().addAll(sIds);
                                event.setName(name);
                                ControllerReference.getInstance().getGigaSpace().write(event);
                                this.notifyEventUpdate(event);
                            }

                            this.refreshModel();
                            this.cmbEvent.setSelectedItem(name);
                        } else {
                            logger.warn("event name cannot be empty");
                        }
                    }

                } else {
                    JOptionPane.showMessageDialog(this, "This event has subscribed peers and cannot be changed!");
                }
            } catch (ParseException e) {
                // TODO something
            }
        } else {
            logger.error("NULL");
        }

    }

    private void createEvent() {
        try {
            Date start = this.pnlSchedule.getTxtStart().getDate();
            Date end = this.pnlSchedule.getTxtEnd().getDate();
            Calendar endCal = Calendar.getInstance();
            Calendar startCal = Calendar.getInstance();
            endCal.setTime(end);
            startCal.setTime(start);

            if (start.before(end) && (startCal.get(Calendar.HOUR_OF_DAY) < endCal.get(Calendar.HOUR_OF_DAY))) {

                String name = JOptionPane.showInputDialog("Please type in a name for this event.");

                if (name != null && !name.equals("")) {

                    Peer current = ControllerReference.getInstance().getUser();
                    DoodleEvent event = new DoodleEvent();
                    event.setName(name);
                    event.setAction("new");
                    event.setOwner(current.getName());
                    event.setAction("processIt");

                    Object[] peers = lstInvites.getSelectedValues();
                    if (peers.length == 0) {
                        JOptionPane.showMessageDialog(this, "Please select at least one invite");
                    } else {

                        for (Object p : peers) {
                            Peer peer = (Peer) p;
                            event.addInvite(peer);
                        }

                        for (int d = startCal.get(Calendar.DAY_OF_YEAR); d <= endCal
                                .get(Calendar.DAY_OF_YEAR); d++) {
                            for (int h = startCal.get(Calendar.HOUR_OF_DAY); h < endCal
                                    .get(Calendar.HOUR_OF_DAY); h++) {
                                for (int i = 0; i < lstInvites.getSelectedValues().length; i++) {
                                    Peer p = (Peer) lstInvites.getSelectedValues()[i];
                                    DoodleSchedule forPeer = new DoodleSchedule(d + "", h + "", p.getName(),
                                            event.getId());
                                    ControllerReference.getInstance().getGigaSpace().write(forPeer);
                                    event.retrieveSchedules().add(forPeer.getId());
                                }
                            }
                        }

                        ControllerReference.getInstance().getGigaSpace().write(event);
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                        }
                        cmbEvent.setModel(getEventsModel(ControllerReference.getInstance().getUser()));
                        cmbEvent.setSelectedItem(event.getName());
                        btnEdit.setEnabled(isUpdateAllowed());
                    }

                } else {
                    logger.warn("event name cannot be empty");
                }

            } else {
                JOptionPane.showMessageDialog(this, "Something is wrong with the dates!");
            }

        } catch (ParseException e) {
            // TODO Something
        }

    }

    private DefaultComboBoxModel getEventsModel(Peer user) {
        if (user == null) {
            return new DefaultComboBoxModel();
        } else {
            List<String> names = ControllerReference.getInstance().getEventNamesFromIds(user.retrieveOrganized());
            return new DefaultComboBoxModel(names.toArray());
        }
    }

    public void mouseClicked(MouseEvent e) {
        if (e.getSource() == lblInvites) {
            lstInvites.setModel(new DefaultComboBoxModel(ControllerReference.getInstance().getAllPeers()));
        }

    }

    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    public void refresh() {
        logger.info("in refresh()");

        // Refresh Event - meanwhile couuld one Peer participate to this event
        if (cmbEvent.getItemCount() > 0) {
            DoodleEvent refreshedEvent = ControllerReference.getInstance()
                    .findEventByNameAndOwner(cmbEvent.getSelectedItem().toString());
            // refresh Participant List
            if (refreshedEvent != null) {
                lstParicipants.setModel(new DefaultComboBoxModel(refreshedEvent.retrieveParticipants().toArray()));
                // update CommentList
                commentList.setModel(new DefaultComboBoxModel(getCommentsForSelectedEvent().toArray()));
                this.refreshSchedules(refreshedEvent.getId());
                cmbFix.setEnabled(this.isFixationPossible(refreshedEvent.getName()));
                cmbFix.setModel(this.getFixationModel(cmbFix.isEnabled(), refreshedEvent));
                btnFixate.setEnabled(cmbFix.isEnabled());
                if (refreshedEvent.getFixSchedule() != null) {
                    lblFixated.setText("Fixated at: " + refreshedEvent.getFixSchedule());
                } else {
                    lblFixated.setText("");
                }
            } else {
                commentList.setModel(new DefaultComboBoxModel());
            }
        } else {
            // if no event ist in ComboBox the list of Participants must be
            // empty
            logger.info("clearing Participation Box");
            lstParicipants.setModel(new DefaultComboBoxModel(new Object[] {}));
            cmbEvent.setModel(getEventsModel(ControllerReference.getInstance().getUser()));
            cmbFix.setEnabled(false);
            cmbFix.setModel(new DefaultComboBoxModel(new String[] {}));
            btnFixate.setEnabled(false);
            lblFixated.setText("");
        }

        // update Registered Peers
        lstInvites.setModel(new DefaultComboBoxModel(ControllerReference.getInstance().getAllPeers()));

        btnEdit.setEnabled(this.isUpdateAllowed());

    }

    private ComboBoxModel getFixationModel(boolean enabled, DoodleEvent event) {
        if (enabled) {
            Map<DoodleSchedule, Integer> aggregate = new HashMap<DoodleSchedule, Integer>();
            List<DoodleSchedule> schedules = ControllerReference.getInstance().readSchedulesForEvent(event.getId());
            for (DoodleSchedule s : schedules) {
                logger.info(s.toString() + " - " + s.retrieveSelected());
            }
            // count selected
            DoodleSchedule temp;
            for (DoodleSchedule s : schedules) {
                if (s.retrieveSelected()) {
                    temp = new DoodleSchedule(null, null);
                    temp.setDay(s.getDay());
                    temp.setHour(s.getHour());
                    Integer count = aggregate.get(temp);
                    if (count == null) {
                        count = new Integer(1);
                        aggregate.put(temp, count);
                    } else {
                        aggregate.put(temp, ++count);
                    }
                }
            }

            logger.info("Aggregate: " + aggregate.toString());

            // find max
            int max = -1;
            for (DoodleSchedule s : schedules) {
                temp = new DoodleSchedule(null, null);
                temp.setDay(s.getDay());
                temp.setHour(s.getHour());
                Integer count = aggregate.get(temp);
                if (count != null && count > max) {
                    max = count;
                }
            }
            logger.info("Max: " + max);
            // find best
            List<DoodleSchedule> best = new ArrayList<DoodleSchedule>();
            Set<DoodleSchedule> set = new HashSet<DoodleSchedule>();
            for (DoodleSchedule s : schedules) {
                temp = new DoodleSchedule(null, null);
                temp.setDay(s.getDay());
                temp.setHour(s.getHour());
                Integer count = aggregate.get(temp);
                if (count != null && count == max && !set.contains(temp)) {
                    best.add(s);
                    set.add(temp);
                }
            }

            logger.info(Arrays.deepToString(best.toArray()));
            if (best.isEmpty()) {
                cmbFix.setEnabled(false);
                return new DefaultComboBoxModel(new String[] { Constants.MSG_NO_MATCH });
            } else {
                return new DefaultComboBoxModel(best.toArray());
            }
        }

        return new DefaultComboBoxModel(new String[] {});
    }

    public void refreshModel() {
        cmbEvent.setModel(getEventsModel(ControllerReference.getInstance().getUser()));
    }

    private void refreshSchedules(String id) {
        List<DoodleSchedule> schedules = ControllerReference.getInstance().readSchedulesForCurrentUser(id);

        int minday = Integer.MAX_VALUE;
        int minhour = Integer.MAX_VALUE;
        int maxday = Integer.MIN_VALUE;
        int maxhour = Integer.MIN_VALUE;

        for (DoodleSchedule s : schedules) {
            int day = Integer.parseInt(s.getDay());
            int hour = Integer.parseInt(s.getHour());

            if (day < minday) {
                minday = day;
            }

            if (day > maxday) {
                maxday = day;
            }

            if (hour < minhour) {
                minhour = hour;
            }

            if (hour > maxhour) {
                maxhour = hour;
            }
        }
        this.pnlSchedule.getTxtStart().setText(minhour + "." + minday);
        this.pnlSchedule.getTxtEnd().setText(maxhour + "." + maxday);

    }

    public void componentHidden(ComponentEvent e) {
        // TODO Auto-generated method stub

    }

    public void componentMoved(ComponentEvent e) {
        // TODO Auto-generated method stub

    }

    public void componentResized(ComponentEvent e) {
        // TODO Auto-generated method stub

    }

    public void componentShown(ComponentEvent e) {
        this.refreshModel();
        this.refresh();
    }

    public void itemStateChanged(ItemEvent ie) {
        this.refresh();
    }

}