package no.ntnu.fp.gui;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import no.ntnu.fp.gui.timepicker.DateModel;
import no.ntnu.fp.model.Appointment;
import no.ntnu.fp.model.Calendar;
import no.ntnu.fp.model.CalendarEntry;
import no.ntnu.fp.model.Meeting;
import no.ntnu.fp.model.User;
import no.ntnu.fp.model.Meeting.State;
import no.ntnu.fp.net.network.client.CommunicationController;
import no.ntnu.fp.util.Log;
public class WeekSheetAdapter implements Iterable<CalendarEntryView>, PropertyChangeListener {
private Calendar calendar;
private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
List<Calendar> calendars = new ArrayList<Calendar>();
DateModel dateModel;
public WeekSheetAdapter(DateModel dateModel, Calendar calendar) {
this.dateModel = dateModel;
this.calendar = calendar;
calendar.addPropertyChangeListener(this);
CommunicationController c = CommunicationController.getInstance();
for (User user : c.getSelectedUsers()) {
addCalendar(user.getCalendar());
}
}
public void addCalendar(Calendar calendar) {
calendars.add(calendar);
calendar.addPropertyChangeListener(this);
}
public void removeCalendar(Calendar calendar) {
calendars.remove(calendar);
calendar.removePropertyChangeListener(this);
}
public List<CalendarEntryView> getEntryViews(){
//TODO bgcolor entryviews equal to entryviews from the same calendar
List<CalendarEntryView> entries = new ArrayList<CalendarEntryView>();
for(CalendarEntry calendarEntry: calendar){
Log.out(dateModel.getWeek());
Log.out(calendarEntry.getDayOfWeek());
boolean inYear = (calendarEntry.getYear()+1900) == dateModel.getYear();
boolean isSunday = calendarEntry.getDayOfWeek() == 5;
boolean inWeek = isSunday ? calendarEntry.getWeek() == dateModel.getWeek()+1 : calendarEntry.getWeek() == dateModel.getWeek();
Log.out(dateModel.getWeek(), dateModel.getYear());
Log.out(calendarEntry.getDescription(),calendarEntry.getWeek(),calendarEntry.getYear(), inYear, inWeek);
if(inYear && inWeek){
if (calendarEntry instanceof Meeting) {
Meeting m = (Meeting) calendarEntry;
User user = CommunicationController.getInstance().getUser();
if (m.getOwner().equals(user) || m.getState(user) == State.Accepted) {
CalendarEntryView view = new CalendarEntryView(calendarEntry);
view.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
super.mouseClicked(e);
CalendarEntry ce = ((CalendarEntryView)e.getSource()).getModel();
Meeting m = (Meeting) ce;
if (m.getOwner().equals(CommunicationController.getInstance().getUser())) {
new MeetingFrame(m);
} else {
new MeetingInviteFrame(m);
}
}
});
entries.add(view);
}
}
if (calendarEntry instanceof Appointment) {
CalendarEntryView view = new CalendarEntryView(calendarEntry);
view.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
super.mouseClicked(e);
CalendarEntry ce = ((CalendarEntryView)e.getSource()).getModel();
new AppointmentPanel((Appointment) ce);
}
});
entries.add(view);
}
}
}
for (Calendar calendar : calendars) {
for(CalendarEntry calendarEntry: calendar){
boolean inYear = (calendarEntry.getYear()+1900) == dateModel.getYear();
boolean isSunday = calendarEntry.getDayOfWeek() == 5;
boolean inWeek = isSunday ? calendarEntry.getWeek() == dateModel.getWeek()+1 : calendarEntry.getWeek() == dateModel.getWeek();
if(inYear && inWeek){
if (calendarEntry instanceof Meeting) {
Meeting m = (Meeting) calendarEntry;
User user = CommunicationController.getInstance().getUser();
//if (m.getOwner().equals(user) || m.getState(user) == State.Accepted) {
CalendarEntryView view = new CalendarEntryView(calendarEntry);
view.setBackground(Color.BLUE);
entries.add(view);
//}
}
if (calendarEntry instanceof Appointment) {
CalendarEntryView view = new CalendarEntryView(calendarEntry);
view.setBackground(Color.BLUE);
entries.add(view);
}
}
}
}
return entries;
}
@Override
public Iterator<CalendarEntryView> iterator() {
return new Iterator<CalendarEntryView>() {
List<CalendarEntryView> entries = getEntryViews();
int i = 0;
@Override
public boolean hasNext() {
return i<entries.size();
}
@Override
public CalendarEntryView next() {
return entries.get(i++);
}
@Override
public void remove() {
entries.remove(i);
}
};
}
public void addPropertyChangeListener(PropertyChangeListener l) {
pcs.addPropertyChangeListener(l);
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
pcs.firePropertyChange(evt);
}
}