// Timer tick private void timer_Tick(object sender, EventArgs e) { seconds++; if (seconds == 60) { minutes++; if (minutes == 60) { minutes = 0; hours++; } seconds = 0; } currentTime_lb.Text = (hours < 10 ? "0" : "") + hours + ":" + (minutes < 10 ? "0" : "") + minutes + ":" + (seconds < 10 ? "0" : "") + seconds; if (current_entry.hourly_rate > 0) { entryEarnings_lb.Text = Convert.ToString(current_entry.CalculateEarnings()) + current_entry.currency; } else { entryEarnings_lb.Text = "No hourly rate set"; } }
/// <summary> /// Adds one entry to FlowLayoutPanel. /// </summary> /// <param name="entry">Entry to be added</param> private void AddEntry(Entry entry) { // Make card to hold the entry Panel card = new Panel(); card.Location = new Point(entriesWrap_panel.Padding.Left, card.Location.Y); card.Size = new Size(entriesWrap_panel.Width - 24, 130); card.Padding = new Padding(10); card.BorderStyle = BorderStyle.FixedSingle; card.Margin = new Padding(3, 5, 3, 5); card.BackColor = Color.WhiteSmoke; // Start time Label lb1 = new Label(); lb1.Text = "Start time: "; lb1.Location = new Point(card.Padding.Left, card.Padding.Top); card.Controls.Add(lb1); DateTimePicker start_time = new DateTimePicker(); start_time.Value = entry.start_time; start_time.Location = CalculateUnderLabelPos(lb1); start_time.Format = DateTimePickerFormat.Custom; start_time.CustomFormat = "hh:mm:ss, dd/MMM/yyyy"; card.Controls.Add(start_time); // End time Label lb2 = new Label(); lb2.Text = "End time: "; lb2.Location = new Point(start_time.Location.X + start_time.Width + 15, lb1.Location.Y); card.Controls.Add(lb2); DateTimePicker end_time = new DateTimePicker(); end_time.Value = (DateTime)entry.end_time; end_time.Location = CalculateUnderLabelPos(lb2); end_time.Format = DateTimePickerFormat.Custom; end_time.CustomFormat = "hh:mm:ss, dd/MMM/yyyy"; card.Controls.Add(end_time); // Duration in hours Label lb3 = new Label(); lb3.Text = "Duration in hours:"; lb3.Location = new Point(end_time.Location.X + end_time.Width + 15, lb2.Location.Y); card.Controls.Add(lb3); Label duration_lb = new Label(); duration_lb.AutoSize = true; duration_lb.Text = Math.Round(((DateTime)entry.end_time).Subtract(entry.start_time).TotalHours, 2).ToString("F2"); duration_lb.Location = CalculateUnderLabelPos(lb3); card.Controls.Add(duration_lb); // Description Label lb4 = new Label(); lb4.Text = "Description:"; lb4.Location = new Point(lb3.Location.X + lb3.Width + 15, lb3.Location.Y); card.Controls.Add(lb4); TextBox descUpdate_tb = new TextBox(); descUpdate_tb.MaxLength = 50; descUpdate_tb.Width = 170; if (entry.description.Trim() != "") { descUpdate_tb.Text = entry.description; } descUpdate_tb.Location = CalculateUnderLabelPos(lb4); card.Controls.Add(descUpdate_tb); // Project combobox / hourly rate / currency info (below start time datetimepicker control) // -- Current entry project Project entryProject = entry.Project(); // -- Project update combobox Label pucb_lb = new Label(); pucb_lb.Text = "Project:"; pucb_lb.Location = new Point(start_time.Location.X, start_time.Location.Y + start_time.Height + 15); card.Controls.Add(pucb_lb); ComboBox projectUpdate_cb = new ComboBox(); projectUpdate_cb.Width = 200; List <Project> all_projects = (new ProjectsController()).GetAllProjects(); projectUpdate_cb.Items.Add(""); for (int i = 0; i < all_projects.Count; i++) { projectUpdate_cb.Items.Add(all_projects[i].project_name); if (entryProject != null && all_projects[i].project_name == entryProject.project_name) { projectUpdate_cb.SelectedIndex = i + 1; } } projectUpdate_cb.Location = CalculateUnderLabelPos(pucb_lb); card.Controls.Add(projectUpdate_cb); // -- Hourly rate numeric up and down Label hru_lb = new Label(); hru_lb.Text = "Hourly rate:"; hru_lb.Location = new Point(projectUpdate_cb.Location.X + projectUpdate_cb.Width + 15, pucb_lb.Location.Y); card.Controls.Add(hru_lb); NumericUpDown hourlyRateUpdate_nud = new NumericUpDown(); hourlyRateUpdate_nud.Maximum = 100000; hourlyRateUpdate_nud.Location = CalculateUnderLabelPos(hru_lb); hourlyRateUpdate_nud.Value = entry.hourly_rate; card.Controls.Add(hourlyRateUpdate_nud); // -- Currency textbox Label curr_lb = new Label(); curr_lb.Text = "Currency:"; curr_lb.Location = new Point(hourlyRateUpdate_nud.Location.X + hourlyRateUpdate_nud.Width + 15, hru_lb.Location.Y); card.Controls.Add(curr_lb); TextBox currencyUpdate_tb = new TextBox(); if (entry.currency != null) { currencyUpdate_tb.Text = entry.currency; } currencyUpdate_tb.Location = CalculateUnderLabelPos(curr_lb); card.Controls.Add(currencyUpdate_tb); // -- Earnings Label elb = new Label(); elb.Location = new Point(currencyUpdate_tb.Location.X + currencyUpdate_tb.Width + 15, curr_lb.Location.Y); elb.Text = "Earnings:"; card.Controls.Add(elb); Label earnings_lb = new Label(); earnings_lb.Location = CalculateUnderLabelPos(elb); if (entry.hourly_rate > 0) { earnings_lb.Text = entry.CalculateEarnings().ToString() + entry.currency; } else { earnings_lb.Text = "No hourly rate set"; } card.Controls.Add(earnings_lb); // Delete entry button Button deleteEntry_btn = new Button(); deleteEntry_btn.Text = "Delete"; deleteEntry_btn.Location = new Point(card.Width - deleteEntry_btn.Width - 15, projectUpdate_cb.Location.Y); deleteEntry_btn.Click += new EventHandler(delegate(Object o, EventArgs a) { DialogResult diag = MessageBox.Show("This will delete the selected entry.", "Are you sure?", MessageBoxButtons.YesNo); if (diag == DialogResult.Yes) { card.Dispose(); entry.Delete(); } }); card.Controls.Add(deleteEntry_btn); // Update entry button Button updateEntry_btn = new Button(); updateEntry_btn.Text = "Update"; updateEntry_btn.Location = new Point(deleteEntry_btn.Location.X - updateEntry_btn.Width - 10, deleteEntry_btn.Location.Y); updateEntry_btn.Click += new EventHandler(delegate(Object o, EventArgs a) { // Update entry object bool originalRateRemoved = false; entry.start_time = start_time.Value; entry.end_time = end_time.Value; entry.description = Helper.TrimToLen(descUpdate_tb.Text, 50); int hr_rate = Convert.ToInt32(hourlyRateUpdate_nud.Value); if (hr_rate > 0 && currencyUpdate_tb.Text.Trim() != "") { entry.hourly_rate = hr_rate; entry.currency = Helper.TrimToLen(currencyUpdate_tb.Text, 50); } else if (hr_rate == 0) { entry.hourly_rate = hr_rate; entry.currency = null; originalRateRemoved = true; } else if (hr_rate > 0 && currencyUpdate_tb.Text.Trim() == "") { MessageBox.Show("Please select currency too"); } // Find project by name bool projectRateApplied = false; string project_name = projectUpdate_cb.SelectedItem != null && projectUpdate_cb.SelectedItem.ToString().Trim() != "" ? projectUpdate_cb.SelectedItem.ToString() : ""; Project found = (new ProjectsController()).FindProjectByName(project_name); if (found != null) { if ((entry.project_id > 0 && entry.project_id != found.id) || entry.project_id == 0) { // Apply new project to entry entry.project_id = found.id; // Apply projects' hourly rate and currency to entry if user agrees DialogResult dg = MessageBox.Show("Do you want to apply project's hourly rate and currency to this entry?", "Confirm", MessageBoxButtons.YesNo); if (dg == DialogResult.Yes) { if (found.hourly_rate > 0) { projectRateApplied = true; entry.hourly_rate = found.hourly_rate; if (found.currency != null && found.currency != "") { entry.currency = Helper.TrimToLen(found.currency, 50); } else { entry.currency = (new SettingsController()).GetSetting("currency").value; } } } } } else { entry.project_id = 0; } // If rate is removed from entry if (!projectRateApplied && originalRateRemoved) { DialogResult dg = MessageBox.Show("This entry will be left without an horly rate and currency, so it will not be charged. Do you want to apply hourly rate/currency from global settings?", "Warning", MessageBoxButtons.YesNo); if (dg == DialogResult.Yes) { SettingsController settings = new SettingsController(); entry.hourly_rate = Convert.ToInt32(settings.GetSetting("hourly_rate").value); entry.currency = settings.GetSetting("currency").value; } } // Update entry entry.Save(); // Update UI back hourlyRateUpdate_nud.Value = entry.hourly_rate; currencyUpdate_tb.Text = entry.currency != null ? entry.currency : ""; if (entry.hourly_rate > 0) { earnings_lb.Text = entry.CalculateEarnings().ToString() + entry.currency; } else { earnings_lb.Text = "No hourly rate set"; } duration_lb.Text = Math.Round(((DateTime)entry.end_time).Subtract(entry.start_time).TotalHours, 2).ToString("F2"); // Notify user about the update MessageBox.Show("Entry updated"); }); card.Controls.Add(updateEntry_btn); // Add card to flowlayourpanel entriesWrap_panel.Controls.Add(card); entriesWrap_panel.Controls.SetChildIndex(card, 0); // Add new card to top }