예제 #1
0
        /// <summary>
        /// Изменяет текущую заметку, т.е. помещает на верх стека новые заголовок и текст
        /// </summary>
        /// <param name="newTitle"></param>
        /// <param name="newText"></param>
        public void ChangeNote(string newTitle, string newText)
        {
            BaseNote newNote = new BaseNote(newTitle, newText);

            // заметка хранит до 10 последних изменений, включая текущее видимое значение
            if (this.noteStack.Count == 10)
            {
                // удаляем самый глубокий элемент
                // К сожалению, нет метода, удаляющего самый первый элемент стека,
                // хотя реализовать его проще простого - просто отсекаешь последний эл-т массива,
                // через который реализован стек.

                BaseNote[] tempArr = noteStack.ToArray();                       // Поэтому просто копируем стек в массив,
                noteStack.Clear();                                              // очищаем стек
                for (int i = tempArr.Length - 2; i >= 0; i--)                   // а потом запихиваем назад в стек
                {
                    noteStack.Push(tempArr[i]);                                 // все эл-ты, кроме первого (посл. в массиве)
                }
            }

            this.noteStack.Push(newNote);

            SimpleDateTime newChangeDT = new SimpleDateTime(DateTime.Now);

            this.ChangeDT = newChangeDT;
        }
예제 #2
0
 public KeyStruct(SimpleDateTime dt, uint id)
 {
     this.Year  = (short)dt.Year;
     this.Month = (sbyte)dt.Month;
     this.Day   = (sbyte)dt.Day;
     this.Hour  = (sbyte)dt.Hour;
     this.Min   = (sbyte)dt.Min;
     this.ID    = id;
 }
예제 #3
0
        /// <summary>
        /// Редактирует текущую запись - меняет заголовок и текст
        /// </summary>
        /// <param name="keyDT">Ключ записи. Включает в себя дату и время записи</param>
        /// <param name="newTitle">Новый заголовок</param>
        /// <param name="newText">Новый текст</param>
        public void EditNoteContent(KeyStruct keyDT, string newTitle, string newText)
        {
            BaseNote noteToEdit =
                Organizer[keyDT.Year][keyDT.Month][keyDT.Day].Day[keyDT].noteStack.Peek();

            noteToEdit.Title = newTitle;
            noteToEdit.Text  = newText;
            Organizer[keyDT.Year][keyDT.Month][keyDT.Day].Day[keyDT].noteStack.Push(noteToEdit);

            SimpleDateTime changeDT = new SimpleDateTime(DateTime.Now);

            Organizer[keyDT.Year][keyDT.Month][keyDT.Day].Day[keyDT].ChangeDT = changeDT;
        }
예제 #4
0
        /// <summary>
        /// Добавляет в ежедневник запись в конкретную дату и время, с заданными типом, заголовком и текстом.
        /// При добавлении генерирует уникальный ID записи.
        /// </summary>
        /// <param name="displayDT">Дата и время, в которое показана запись</param>
        /// <param name="title">Заголовок записи</param>
        /// <param name="text">Текст записи</param>
        /// <param name="typeOfNote">Тип записи - заметка, событие или дело</param>
        public void AddNote(SimpleDateTime displayDT, string title, string text,
                            TypeOfNote typeOfNote,
                            bool wDayOrDone,                                            // флаг весь день - событие, сделано - дело
                            bool star)                                                  // флаг приоритета для дела
        {
            short     currYear = displayDT.Year;
            sbyte     currMon  = displayDT.Month;
            sbyte     currDay  = displayDT.Day;
            DayClass  dayToAdd;
            KeyStruct keyDT;
            Note      newNote;

            // Проверка, выделена ли память для этой даты
            // Инициализирован ли год?
            if (!Organizer.ContainsKey(currYear))
            {
                YearClass yearToAdd = new YearClass(currYear);
                Organizer.Add(currYear, yearToAdd);
            }

            // Инициализирован ли месяц для этой даты?
            if (Organizer[currYear][currMon] == null)
            {
                Organizer[currYear].CreateMonth(currMon);
            }

            // Инициализирован ли день?
            if (Organizer[currYear][currMon][currDay] == null)
            {
                Organizer[currYear].CreateDay(currMon, currDay);                    // создаём новый день
                dayToAdd = Organizer[currYear][currMon][currDay];                   // присваиваем ради сокращения записи

                Count++;
                keyDT = new KeyStruct(displayDT, ++IDcounter);
                switch (typeOfNote)
                {
                case TypeOfNote.Note:
                    newNote = new Note(keyDT, title, text);
                    dayToAdd.AddNote(keyDT, newNote);
                    return;

                case TypeOfNote.Event:
                    newNote = new Note(keyDT, title, text, wDayOrDone);
                    dayToAdd.AddNote(keyDT, newNote);
                    return;

                case TypeOfNote.ToDo:
                    newNote = new Note(keyDT, title, text, wDayOrDone, star);
                    dayToAdd.AddNote(keyDT, newNote);
                    return;

                default:
                    Console.WriteLine("Unknown type of a record!!!");
                    break;
                }
            }

            // Если пришли сюда, значит в этом дне уже есть запись(и)
            dayToAdd = Organizer[currYear][currMon][currDay];

            // Существует ли уже запись с такими же временем, типом, заголовком, текстом?
            //
            // Если существует и полностью всё совпадает - то значит, мы просто ничего не добавляем
            // Если совпадает дата, но время отличается - добавляем
            // Если совпадает дата и время, но тип отличается - добавляем
            // Если совпадает дата и время, и тип, но заголовок и/или текст заметки оличается - добавляем
            // Если совпадает дата и время, и тип, и заголовок с текстом, - не добавляем.

            foreach (var e in dayToAdd.Day)
            {
                if (e.Value.DisplayDT.Hour == displayDT.Hour)              // Запись с таким временем
                {
                    if (e.Value.DisplayDT.Min == displayDT.Min)            // уже существует?
                    {
                        if (e.Value.TypeOfNote == typeOfNote)              // Тип совпадает?
                        {
                            if (e.Value.noteStack.Peek().Title == title)   // Заголовок и текст записи
                            {
                                if (e.Value.noteStack.Peek().Text == text) // совпадает?
                                {
                                    return;                                // ничего не добавляем!!! Такая заметка уже есть!!!
                                }
                            }
                        }
                    }
                }
            }
            // Специально сделал несколько  if-ов, а не составное выражение выр1 & выр2 & выр3
            // Потому что в логическом выражении вычисляются обе части выражения,
            // а сравнение текста - это оч. долго

            Count++;
            keyDT = new KeyStruct(displayDT, ++IDcounter);
            switch (typeOfNote)
            {
            case TypeOfNote.Note:
                newNote = new Note(keyDT, title, text);
                dayToAdd.AddNote(keyDT, newNote);
                return;

            case TypeOfNote.Event:
                newNote = new Note(keyDT, title, text, wDayOrDone);
                dayToAdd.AddNote(keyDT, newNote);
                return;

            case TypeOfNote.ToDo:
                newNote = new Note(keyDT, title, text, wDayOrDone, star);
                dayToAdd.AddNote(keyDT, newNote);
                return;
            }
        }
예제 #5
0
        static void Main(string[] args)
        {
            Random         r = new Random();
            short          rYear;
            sbyte          rMonth;   // 1 - 12
            sbyte          rDay;     // 1 - 31
            sbyte          rHour;
            sbyte          rMin;
            sbyte          rSec;
            TypeOfNote     rTypeOfNote;   // 0, 1, 2
            string         rTitle = "Title_";
            string         rText  = "Text";
            bool           rFlag;   // Флажок для типов записи событие (1) или дело (2)
            bool           rStar;
            SimpleDateTime rDT;
            OrganizerClass myOrganizer = new OrganizerClass();

            for (int i = 0; i < 365; i++)
            {
                rYear  = (short)r.Next(1998, 2003);
                rMonth = (sbyte)r.Next(1, 13);
                if (rYear == 2000 & rMonth == 2)
                {
                    rDay = (sbyte)r.Next(1, 30);                              // високосный февраль
                }
                else
                {
                    rDay = (sbyte)r.Next(1, YearClass.monthsLength[rMonth] + 1);
                }
                rHour       = (sbyte)r.Next(1, 24);
                rMin        = (sbyte)r.Next(1, 60);
                rSec        = (sbyte)r.Next(1, 60);
                rTypeOfNote = (TypeOfNote)r.Next(0, 3);
                rTitle      = $"Title_{rYear}{rMonth}{rDay}_{rHour}:{rMin}:{rSec}";
                rText       = $"This is the day {rDay} of month {rMonth} of the year {rYear}." +
                              $" Time now is {rHour} hours {rMin} minutes {rSec} seconds. Aju!";
                rFlag = r.Next(0, 2) == 1 ? true : false;
                rStar = r.Next(0, 2) == 1 ? true : false;

                rDT = new SimpleDateTime(rYear, rMonth, rDay, rHour, rMin);
                myOrganizer.AddNote(rDT, rTitle, rText, rTypeOfNote, rFlag, rStar);
            }

            foreach (var yyyy in myOrganizer.Organizer)         // Берём по порядку все годы из ежедневника
            // myOrganizer.Organizer это SortedList<short,YearClass>
            // yyyy это KeyValuePair < short, YearClass > - значит из yyyy надо взять год
            // год - это yyyy.Value
            // а из года все месяцы
            {
                foreach (DayClass[] mm in yyyy.Value.year)      // Берём по порядку все месяцы из года
                // yyyy.Value.year - это DayClass[][]
                // mm - это месяц, т.е. yyyy.Value.year[]
                {
                    if (mm == null)
                    {
                        continue;               // т.к. мы нумеруем месяцы с 1, то 0-й элемент равен null
                    }
                    // или если месяц не инициализирован, т.е. в нём нет ни одной записи
                    // надо его пропустить

                    foreach (DayClass dd in mm)                 // Берём по порядку все дни
                    // dd - это день!
                    {
                        if (dd == null)
                        {
                            continue;                   // т.к. мы нумеруем дни с 1, то 0-й элемент равен null
                        }
                        // или если день не инициализирован, т.е. в нём нет ни одной записи
                        // надо его пропустить
                        foreach (var record in dd.Day)
                        {
                            string printDT = record.Value.DisplayDT.ToStringWithID();
                            Console.WriteLine($"Date: {printDT}");
                            Console.WriteLine($"{record.Value.noteStack.Peek().Title}");
                            Console.WriteLine($"{record.Value.noteStack.Peek().Text}");
                            Console.WriteLine();
                        }
                    }
                }
            }
            Console.WriteLine($"Total records in the organizer: {myOrganizer.Count}");
            Console.WriteLine($"Last ID generated: {myOrganizer.IDcounter}");
        }