/// <summary> /// Pravljenje termina na Drag and DROP. /// </summary> /// <param name="e"></param> private void AddTerminFromDragAndDrop(DragEventArgs e) { Point point = e.GetPosition(kalendar); DateTime?date = kalendar.GetDateAt(point); Subject subject = (Subject)e.Data.GetData(typeof(Subject)); // TODO: Srediti da se može dodati termin "tik uz drugi" - pogledaj kod ispod ove linije // trenutno preko štapa i kanapa [ ili nije? :) ] DateTime start = date.Value; DateTime end = start.AddMinutes(subject.ClassLength * 45); var allItems = kalendar.Schedule.GetAllItems(start, end.AddSeconds(-1)); bool zauzeto = allItems.Any(); if (date != null) { if (zauzeto) // postoji 1 ili više termina { if (Questions.BrisanjeTermina() == MessageBoxResult.Yes) { // čišćenje polja sa taskovima allItems.ToList().ForEach(x => RemoveFromCalendar(x)); zauzeto = false; // fleg za dodavanje novog } } if (!zauzeto) // ne može samo "else" zbog flag-a iznad { MyTermin termin = new MyTermin(subject.Name, start, end, SelectedScheduleClassroom, subject); /// Radi se ovo u <see cref="GlobalSchedule.CopyItem"/> //termin.Resources.Add(MainWindowParent.GetResourceForClassroom(SelectedScheduleClassroom)); SubjectHandler.Instance.ChangeUnscheduledTermins(subject.Id); TerminHandler.Instance.AddTermin(termin); (Window.GetWindow(this) as MainWindow).GlobalnaShema.CopyItem(termin); //(Application.Current.Windows[0] as MainWindow).GlobalnaShema.CopyItem(termin); UpdateSubjectRow(subject); Console.WriteLine("Dodat termin sa id: " + termin.Id); kalendar.Schedule.Items.Add(termin); } } }
public ScheduleScheme() { PredmetiZaUcionicu = new ObservableCollection <Subject>(); InitializeComponent(); // Bitan redoslijed prve dvije linije? DataContext = this; // da bi binding radio// Može i u XML-u // Da na kalendaru pravimo termine tipa MyTermin, a ne Appointment kalendar.InteractiveItemType = typeof(MyTermin); /** desava se ako se termini prave interaktivno, sto je kod nas onemoguceno * kalendar.ItemCreated += (s, e) => * { * if (e.Item is MyTermin) // ovo prije pisalo: kalendar.ResetDrag(); * { * Console.WriteLine("SemaUcionice##ItemCreated Event: Moj termin!"); * Resource r = MainWindowParent.GetResourceForClassroom(SelectedScheduleClassroom); * e.Item.Resources.Add(r); // dobro ovo?? * (Window.GetWindow(this) as MainWindow).GlobalnaShema.globalCalendar.Schedule.Items.Add(e.Item as MyTermin); * TerminHandler.Instance.AddTermin(e.Item as MyTermin); * } * else Console.WriteLine("ItemCreated Event nesto =/= MyTermin"); * }; * // */ #region Pomijeranje postejećeg termina - na druge termine i van vremena [7-22h] kalendar.ItemModified += (s, e) => { if (e.Item is MyTermin) { Console.WriteLine("modifikovan termin za " + ((MyTermin)e.Item).ForSubject.Name); // TODO: dodati promjenu stringa! e.Item.DescriptionText = ... ima gotovo ... DateTime start = e.Item.StartTime; DateTime end = e.Item.EndTime; string TooEarlyOrTooLate = "Termin je previše "; if (start.TimeOfDay < TimeSpan.FromHours(7)) { // kraj = 7:00 + razlika kraja i početka ~~~ očuvanje trajanja termina end = start.Date.AddHours(7).Add(end.Subtract(start)); start = start.Date.AddHours(7); // počinje u sedam TooEarlyOrTooLate += "rano. Biće pomjeren tako da počinje u 07:00.\n"; } else if (end.TimeOfDay > TimeSpan.FromHours(22)) { // početak = 22:00 - razlika kraja i početka ~~~ očuvanje trajanja termina start = start.Date.AddHours(22).Subtract(end.Subtract(start)); end = start.Date.AddHours(22); TooEarlyOrTooLate += "kasno. Biće pomjeren tako da završava u 22:00.\n"; } // Uzmi sve Item-e osim tek spuštenog var items = kalendar.Schedule.GetAllItems(start, end.AddSeconds(-1)).Except(new List <Item>() { e.Item }); // izbacivanje https://stackoverflow.com/a/407741/2101117 <- prvi komentar: Any efikasnije od Count bool zauzeto = items.Any(); if (zauzeto) { // Da li želite da obrišete postojeće termine? Argument je tekst "termin je prerano/prekasno". if (Questions.BrisanjeTermina(TooEarlyOrTooLate.Length > 22 ? TooEarlyOrTooLate : "") == MessageBoxResult.Yes) { items.ToList().ForEach(x => RemoveFromCalendar(x)); zauzeto = false; } } // ako je slobodno, samo poruka o izlasku iz opsega [7-22] else // prikazuje se ako je uključen prikaz obavještenja if (TooEarlyOrTooLate.Length > 22 && MainWindowParent.Obavjestenja["Prekoračenje radnog vremena"]) { MessageBox.Show(TooEarlyOrTooLate + "\nOvo obavještenje možete isključiti u meniju \"Obavještenja\"."); } if (!zauzeto) { e.Item.StartTime = start; // e.Item.EndTime = end; // } else { e.Item.StartTime = e.OldStartTime; e.Item.EndTime = e.OldEndTime; } MainWindowParent.GlobalnaShema.UpdateTermin(e.Item as MyTermin); } }; #endregion // tokom izmjene - mogućnost prekida događaja kalendar.ItemModifying += (s, e) => { // e.Confirm = false; }; // Serialization support Schedule.RegisterItemClass(typeof(MyTermin), "mytermin", 1); }