From abc622290c7f41cd214ab1c0a23f50d077cae2c7 Mon Sep 17 00:00:00 2001 From: Robert Vokac Date: Sun, 10 Mar 2024 18:00:58 +0000 Subject: [PATCH] Added several improvements, changes and bug fixes --- .../timecalc/swing/common/ArrivalChart.java | 118 +++--- .../swing/common/ArrivalChartData.java | 1 + .../swing/common/WorkingDaysWindow.java | 383 +++++++++++++----- .../timecalc/utils/common/DateFormats.java | 3 + 4 files changed, 347 insertions(+), 158 deletions(-) diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/ArrivalChart.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/ArrivalChart.java index d7b34ff..da2d9a6 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/ArrivalChart.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/ArrivalChart.java @@ -3,23 +3,14 @@ package org.nanoboot.utils.timecalc.swing.common; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; -import org.jfree.chart.axis.CategoryAxis; -import org.jfree.chart.axis.CategoryLabelPositions; import org.jfree.chart.block.BlockBorder; -import org.jfree.chart.plot.CategoryPlot; -import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.XYPlot; -import org.jfree.chart.renderer.category.LineAndShapeRenderer; import org.jfree.chart.renderer.xy.XYItemRenderer; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.chart.title.TextTitle; -import org.jfree.data.category.CategoryDataset; -import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.data.time.Day; -import org.jfree.data.time.Second; import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesCollection; -import org.jfree.data.xy.XYDataset; import org.nanoboot.utils.timecalc.utils.common.NumberFormats; import javax.swing.BorderFactory; @@ -39,24 +30,35 @@ import java.util.function.BiConsumer; public class ArrivalChart extends JPanel { private static final Color ORANGE = new Color(237, 125, 49); private static final Color BLUE = new Color(68, 114, 196); - private static final Color BROWN = new Color(128,0, 64); - private static final Color PURPLE = new Color(128,0, 255); + private static final Color BROWN = new Color(128, 0, 64); + private static final Color PURPLE = new Color(128, 0, 255); public static final Rectangle EMPTY_RECTANGLE = new Rectangle(); + private final boolean ma14Enabled; + private final boolean ma28Enabled; + private final boolean ma56Enabled; public ArrivalChart(ArrivalChartData data, int width) { - this(data.getDays(), data.getArrival(), data.getTarget(), data.getMa7(), data.getMa14(), data.getMa28(), data.getMa56(), - data.getStartDate(), data.getEndDate(), width); + this(data.getDays(), data.getArrival(), data.getTarget(), data.getMa7(), + data.getMa14(), data.getMa28(), data.getMa56(), + data.getStartDate(), data.getEndDate(), width, + data.isMa14Enabled(), data.isMa28Enabled(), + data.isMa56Enabled()); } - public ArrivalChart(String[] days, double[] arrival, double target, double[] ma7, - double[] ma14, double[] ma28, double[] ma56, String startDate, String endDate, int width) { + + public ArrivalChart(String[] days, double[] arrival, double target, + double[] ma7, + double[] ma14, double[] ma28, double[] ma56, String startDate, + String endDate, int width, boolean ma14Enabled, boolean ma28Enabled, + boolean ma56Enabled) { this.setLayout(null); this.setVisible(true); // String title = "Arrivals"; - List timeSeries= - createSeries(days, arrival, target, ma7, ma14, ma28, ma56, title, startDate, endDate); + List timeSeries = + createSeries(days, arrival, target, ma7, ma14, ma28, ma56, + title, startDate, endDate); JFreeChart chart = createChart(timeSeries, title); ChartPanel chartPanel = new ChartPanel(chart); chartPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); @@ -65,10 +67,12 @@ public class ArrivalChart extends JPanel { chartPanel.setMouseZoomable(true); this.add(chartPanel); chartPanel.setBounds(10, 10, width, 400); - + this.ma14Enabled = ma14Enabled; + this.ma28Enabled = ma28Enabled; + this.ma56Enabled = ma56Enabled; } - public static JFreeChart createChart(List timeSeries, + private JFreeChart createChart(List timeSeries, String title) { JFreeChart chart = ChartFactory.createTimeSeriesChart( @@ -79,20 +83,33 @@ public class ArrivalChart extends JPanel { ); XYPlot plot = (XYPlot) chart.getPlot(); - for(int i = 0; i < 6; i++) { + for (int i = 0; i < 6; i++) { + if (i == 3 && this.ma14Enabled) { + continue; + } + if (i == 4 && !this.ma28Enabled) { + continue; + } + if (i == 5 && !this.ma56Enabled) { + continue; + } plot.setDataset(i, new TimeSeriesCollection(timeSeries.get(i))); - } + } chart.setBorderVisible(false); BiConsumer setSeries = (i, c) -> { XYItemRenderer renderer = new XYLineAndShapeRenderer(); -// renderer.setDefaultPaint(c); -// renderer.setDefaultStroke(new BasicStroke(timeSeries.get(0).getItemCount() > 180 ? 1.0f : (i == 1 || i == 2 ? 1.5f : 1.25f))); -// renderer.setDefaultShape(EMPTY_RECTANGLE); + // renderer.setDefaultPaint(c); + // renderer.setDefaultStroke(new BasicStroke(timeSeries.get(0).getItemCount() > 180 ? 1.0f : (i == 1 || i == 2 ? 1.5f : 1.25f))); + // renderer.setDefaultShape(EMPTY_RECTANGLE); + renderer.setSeriesPaint(0, c); - renderer.setSeriesStroke(0, new BasicStroke(i == 1 || i == 2 ? 2.5f : 1.5f)); + float strength = i == 1 || i == 2 ? 3f : 1.5f; + BasicStroke stroke = new BasicStroke(strength); + + renderer.setSeriesStroke(0, stroke); renderer.setSeriesShape(0, EMPTY_RECTANGLE); plot.setRenderer(i, renderer); }; @@ -105,20 +122,20 @@ public class ArrivalChart extends JPanel { plot.setBackgroundPaint(Color.white); -// plot.setRangeGridlinesVisible(true); -// plot.setRangeGridlinePaint(Color.BLACK); -// -// plot.setDomainGridlinesVisible(true); -// plot.setDomainGridlinePaint(Color.BLACK); + // plot.setRangeGridlinesVisible(true); + // plot.setRangeGridlinePaint(Color.BLACK); + // + // plot.setDomainGridlinesVisible(true); + // plot.setDomainGridlinePaint(Color.BLACK); chart.getLegend().setFrame(BlockBorder.NONE); -// CategoryAxis domainAxis = plot.getDomainAxis(); -// domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90); -// domainAxis.setLabelFont(SwingUtils.VERY_SMALL_FONT); -// domainAxis.setTickLabelFont(SwingUtils.VERY_SMALL_FONT); -// domainAxis.setCategoryLabelPositionOffset(10); -// domainAxis.setTickLabelsVisible(true); + // CategoryAxis domainAxis = plot.getDomainAxis(); + // domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90); + // domainAxis.setLabelFont(SwingUtils.VERY_SMALL_FONT); + // domainAxis.setTickLabelFont(SwingUtils.VERY_SMALL_FONT); + // domainAxis.setCategoryLabelPositionOffset(10); + // domainAxis.setTickLabelsVisible(true); chart.setTitle(new TextTitle(title, new Font("Serif", Font.BOLD, 18) ) @@ -127,7 +144,8 @@ public class ArrivalChart extends JPanel { return chart; } - private List createSeries(String[] days, double[] arrival, double target, + private List createSeries(String[] days, double[] arrival, + double target, double[] ma7, double[] ma14, double[] ma28, double[] ma56, String title, String startDate, String endDate) { if (startDate == null) { @@ -138,12 +156,14 @@ public class ArrivalChart extends JPanel { } List result = new ArrayList<>(); - final TimeSeries seriesArrival = new TimeSeries( "Arrival" ); - final TimeSeries seriesTarget = new TimeSeries( "Target (" + NumberFormats.FORMATTER_TWO_DECIMAL_PLACES.format(target) + " h)"); - final TimeSeries seriesMa7 = new TimeSeries( "MA7" ); - final TimeSeries seriesMa14 = new TimeSeries( "MA14" ); - final TimeSeries seriesMa28 = new TimeSeries( "MA28" ); - final TimeSeries seriesMa56 = new TimeSeries( "MA56" ); + final TimeSeries seriesArrival = new TimeSeries("Arrival"); + final TimeSeries seriesTarget = new TimeSeries( + "Target (" + NumberFormats.FORMATTER_TWO_DECIMAL_PLACES + .format(target) + " h)"); + final TimeSeries seriesMa7 = new TimeSeries("MA7"); + final TimeSeries seriesMa14 = new TimeSeries("MA14"); + final TimeSeries seriesMa28 = new TimeSeries("MA28"); + final TimeSeries seriesMa56 = new TimeSeries("MA56"); result.add(seriesArrival); result.add(seriesTarget); result.add(seriesMa7); @@ -164,20 +184,20 @@ public class ArrivalChart extends JPanel { int year = Integer.valueOf(dayArray[0]); int month = Integer.valueOf(dayArray[1]); int day = Integer.valueOf(dayArray[2]); - if(year1 != 0) { - if(month < month1) { + if (year1 != 0) { + if (month < month1) { continue; } - if(month == month1 && day < day1) { + if (month == month1 && day < day1) { continue; } } - if(year2 != 0) { - if(month > month2) { + if (year2 != 0) { + if (month > month2) { continue; } - if(month == month2 && day > day2) { + if (month == month2 && day > day2) { continue; } } diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/ArrivalChartData.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/ArrivalChartData.java index 3bcab41..f0d21e2 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/ArrivalChartData.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/ArrivalChartData.java @@ -23,4 +23,5 @@ public class ArrivalChartData { private double[] ma56; private String startDate; private String endDate; + private boolean ma14Enabled = true, ma28Enabled = true, ma56Enabled = true; } diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/WorkingDaysWindow.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/WorkingDaysWindow.java index 723d75c..5225320 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/WorkingDaysWindow.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/WorkingDaysWindow.java @@ -1,24 +1,28 @@ package org.nanoboot.utils.timecalc.swing.common; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Rectangle; -import java.awt.Toolkit; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; +import org.nanoboot.utils.timecalc.entity.WorkingDay; +import org.nanoboot.utils.timecalc.entity.WorkingDayForStats; +import org.nanoboot.utils.timecalc.persistence.api.WorkingDayRepositoryApi; +import org.nanoboot.utils.timecalc.swing.progress.Time; +import org.nanoboot.utils.timecalc.utils.common.DateFormats; +import org.nanoboot.utils.timecalc.utils.common.NumberFormats; +import org.nanoboot.utils.timecalc.utils.common.TTime; +import org.nanoboot.utils.timecalc.utils.common.Utils; + import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; -import org.nanoboot.utils.timecalc.entity.WorkingDay; -import org.nanoboot.utils.timecalc.entity.WorkingDayForStats; -import org.nanoboot.utils.timecalc.persistence.api.WorkingDayRepositoryApi; -import org.nanoboot.utils.timecalc.swing.progress.Time; -import org.nanoboot.utils.timecalc.utils.common.NumberFormats; -import org.nanoboot.utils.timecalc.utils.common.TTime; -import org.nanoboot.utils.timecalc.utils.common.Utils; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Rectangle; +import java.awt.Toolkit; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; /** * @author Robert Vokac @@ -29,7 +33,7 @@ public class WorkingDaysWindow extends TWindow { private static final String YES = "YES"; private static final String THREE_DASHES = "---"; // - private static final Color RED = new Color(255,153,153); + private static final Color RED = new Color(255, 153, 153); public static final String QUESTION_MARK = "?"; private final WorkingDayRepositoryApi workingDayRepository; @@ -39,12 +43,16 @@ public class WorkingDaysWindow extends TWindow { private final TTextField startTextField; private final TTextField endTextField; private final int chartWidth; + private final JButton decreaseStart; + private final JButton decreaseEnd; private ArrivalChart arrivalChart; private JTable table = null; private final JScrollPane scrollPane; + private int loadedYear; - public WorkingDaysWindow(WorkingDayRepositoryApi workingDayRepository, Time time, double target) { + public WorkingDaysWindow(WorkingDayRepositoryApi workingDayRepository, + Time time, double target) { setTitle("Work Days"); this.workingDayRepository = workingDayRepository; @@ -58,7 +66,7 @@ public class WorkingDaysWindow extends TWindow { List yearsList = workingDayRepository.getYears(); String[] yearsArray = new String[yearsList.size()]; - for(int i = 0; i< yearsList.size(); i++){ + for (int i = 0; i < yearsList.size(); i++) { yearsArray[i] = yearsList.get(i); } JComboBox years = new JComboBox(yearsArray); @@ -66,81 +74,188 @@ public class WorkingDaysWindow extends TWindow { years.setSelectedItem(String.valueOf(year)); years.addActionListener(e -> { - workingDaysWindow.loadYear(Integer.valueOf((String) years.getSelectedItem()), time); + workingDaysWindow + .loadYear(Integer.valueOf((String) years.getSelectedItem()), + time); }); add(years); - years.setBounds(SwingUtils.MARGIN,SwingUtils.MARGIN, 100, 30); + years.setBounds(SwingUtils.MARGIN, SwingUtils.MARGIN, 100, 30); this.reloadButton = new JButton("Reload"); reloadButton.addActionListener(e -> { - workingDaysWindow.loadYear(Integer.valueOf((String) years.getSelectedItem()), time); + workingDaysWindow + .loadYear(Integer.valueOf((String) years.getSelectedItem()), + time); }); add(reloadButton); - reloadButton.setBounds(years.getX() + years.getWidth() + SwingUtils.MARGIN, years.getY(), 100, 30); - + reloadButton + .setBounds(years.getX() + years.getWidth() + SwingUtils.MARGIN, + years.getY(), 100, 30); JButton exitButton = new JButton("Exit"); exitButton.addActionListener(e -> { this.setVisible(false); }); add(exitButton); - exitButton.setBounds(reloadButton.getX() + reloadButton.getWidth() + SwingUtils.MARGIN, reloadButton.getY(), 100, 30); + exitButton.setBounds(reloadButton.getX() + reloadButton.getWidth() + + SwingUtils.MARGIN, reloadButton.getY(), 100, 30); TLabel deleteLabel = new TLabel("Delete:"); add(deleteLabel); - deleteLabel.setBounds(exitButton.getX() + exitButton.getWidth() + SwingUtils.MARGIN, exitButton.getY(), 50, 30); + deleteLabel.setBounds( + exitButton.getX() + exitButton.getWidth() + SwingUtils.MARGIN, + exitButton.getY(), 50, 30); TTextField deleteTextField = new TTextField(); add(deleteTextField); - deleteTextField.setBounds(deleteLabel.getX() + deleteLabel.getWidth() + SwingUtils.MARGIN, deleteLabel.getY(), 100, 30); + deleteTextField.setBounds( + deleteLabel.getX() + deleteLabel.getWidth() + SwingUtils.MARGIN, + deleteLabel.getY(), 100, 30); deleteTextField.addActionListener(e -> { - if(deleteTextField.getText().isEmpty()) { + if (deleteTextField.getText().isEmpty()) { //nothing to do return; } - if(!Utils.askYesNo(this, "Do you really want to delete this day: " + deleteTextField.getText(), "Day deletion")) { + if (!Utils.askYesNo(this, + "Do you really want to delete this day: " + deleteTextField + .getText(), "Day deletion")) { return; } workingDayRepository.delete(deleteTextField.getText()); reloadButton.doClick(); }); - TLabel startLabel = new TLabel("Start:"); add(startLabel); - startLabel.setBounds(deleteTextField.getX() + deleteTextField.getWidth() + 6 * SwingUtils.MARGIN, deleteTextField.getY(), 50, 30); + startLabel.setBounds(deleteTextField.getX() + deleteTextField.getWidth() + + 6 * SwingUtils.MARGIN, deleteTextField.getY(), + 50, 30); this.startTextField = new TTextField(); add(startTextField); - startTextField.setBounds(startLabel.getX() + startLabel.getWidth() + SwingUtils.MARGIN, startLabel.getY(), 100, 30); + startTextField.setBounds( + startLabel.getX() + startLabel.getWidth() + SwingUtils.MARGIN, + startLabel.getY(), 100, 30); startTextField.addActionListener(e -> { reloadButton.doClick(); }); - TLabel endLabel = new TLabel("End:"); add(endLabel); - endLabel.setBounds(startTextField.getX() + startTextField.getWidth() + SwingUtils.MARGIN, startTextField.getY(), 50, 30); + endLabel.setBounds(startTextField.getX() + startTextField.getWidth() + + SwingUtils.MARGIN, startTextField.getY(), 50, 30); this.endTextField = new TTextField(); add(endTextField); - endTextField.setBounds(endLabel.getX() + endLabel.getWidth() + SwingUtils.MARGIN, endLabel.getY(), 100, 30); + endTextField.setBounds( + endLabel.getX() + endLabel.getWidth() + SwingUtils.MARGIN, + endLabel.getY(), 100, 30); endTextField.addActionListener(e -> { reloadButton.doClick(); }); + this.decreaseStart = new JButton("Decrease start"); + this.decreaseEnd = new JButton("Decrease end"); + add(decreaseStart); + add(decreaseEnd); + decreaseStart.addActionListener(e -> { + if (loadedYear == 0) { + //nothing to do + return; + } + String date = this.startTextField.getText(); + if (date.isEmpty()) { + this.startTextField.setText(loadedYear + "-02-01"); + reloadButton.doClick(); + return; + } else { + String[] array = date.split("-"); + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.YEAR, loadedYear); + cal.set(Calendar.MONTH, Integer.valueOf(array[1]) - 1); + cal.set(Calendar.DAY_OF_MONTH, Integer.valueOf(array[2])); + cal.add(Calendar.DAY_OF_MONTH, 32); + if (cal.get(Calendar.YEAR) != loadedYear) { + return; + } + this.startTextField.setText( + DateFormats.DATE_TIME_FORMATTER_YYYYMMDD + .format(cal.getTime())); + reloadButton.doClick(); + } + + }); + decreaseEnd.addActionListener(e -> { + if (loadedYear == 0) { + //nothing to do + return; + } + String date = this.endTextField.getText(); + if (date.isEmpty()) { + this.endTextField.setText(loadedYear + "-11-30"); + reloadButton.doClick(); + return; + } else { + String[] array = date.split("-"); + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.YEAR, loadedYear); + cal.set(Calendar.MONTH, Integer.valueOf(array[1]) - 1); + cal.set(Calendar.DAY_OF_MONTH, Integer.valueOf(array[2])); + cal.add(Calendar.DAY_OF_MONTH, -32); + if (cal.get(Calendar.YEAR) != loadedYear) { + return; + } + this.endTextField.setText( + DateFormats.DATE_TIME_FORMATTER_YYYYMMDD + .format(cal.getTime())); + reloadButton.doClick(); + } + + }); + decreaseStart.setBounds(endTextField.getX() + endTextField.getWidth() + + SwingUtils.MARGIN, endTextField.getY(), 120, + 30); + decreaseEnd.setBounds(decreaseStart.getX() + decreaseStart.getWidth() + + SwingUtils.MARGIN, decreaseStart.getY(), 120, + 30); + addKeyListener(new KeyListener() { + @Override + public void keyTyped(KeyEvent e) { + + } + + @Override + public void keyPressed(KeyEvent e) { + switch (e.getKeyCode()) { + case KeyEvent.VK_LEFT: decreaseStart.doClick();break; + case KeyEvent.VK_RIGHT: decreaseEnd.doClick();break; + default: + } + } + + @Override + public void keyReleased(KeyEvent e) { + + } + }); // - ArrivalChartData acd = new ArrivalChartData(new String[]{}, new double[]{}, 7d, new double[]{}, new double[]{}, new double[]{}, new double[]{}, null, null); + ArrivalChartData acd = + new ArrivalChartData(new String[] {}, new double[] {}, 7d, + new double[] {}, new double[] {}, new double[] {}, + new double[] {}, null, null, false, false, false); this.arrivalChart = new ArrivalChart(acd, 1000); Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); this.chartWidth = (int) screen.getWidth() - 60; - arrivalChart.setBounds(SwingUtils.MARGIN, years.getY() + years.getHeight()+ SwingUtils.MARGIN, + arrivalChart.setBounds(SwingUtils.MARGIN, + years.getY() + years.getHeight() + SwingUtils.MARGIN, (int) (screen.getWidth() - 50), 400); add(arrivalChart); // this.scrollPane = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, - JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - scrollPane.setBounds(SwingUtils.MARGIN, arrivalChart.getY() + arrivalChart.getHeight()+ SwingUtils.MARGIN, + JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + scrollPane.setBounds(SwingUtils.MARGIN, + arrivalChart.getY() + arrivalChart.getHeight() + + SwingUtils.MARGIN, (int) (screen.getWidth() - 50), 300); add(scrollPane); @@ -148,22 +263,29 @@ public class WorkingDaysWindow extends TWindow { loadYear(year, time); - setSize(scrollPane.getWidth() + 3 * SwingUtils.MARGIN, scrollPane.getY() + scrollPane.getHeight() + 4 * SwingUtils.MARGIN); + setSize(scrollPane.getWidth() + 3 * SwingUtils.MARGIN, + scrollPane.getY() + scrollPane.getHeight() + + 4 * SwingUtils.MARGIN); } public void doReloadButtonClick() { this.reloadButton.doClick(); } - public void loadYear(int year, Time time) { + public void loadYear(int year, Time time) { + if (this.loadedYear != year) { + this.startTextField.setText(""); + this.endTextField.setText(""); + } + this.loadedYear = year; List workingDaysList = new ArrayList<>(); Calendar now = time.asCalendar(); final int currentYear = now.get(Calendar.YEAR); final int currentMonth = now.get(Calendar.MONTH) + 1; final int currentDay = now.get(Calendar.DAY_OF_MONTH); -// System.out.println("currentYear=" + currentYear); -// System.out.println("currentMonth=" + currentMonth); -// System.out.println("currentDay=" + currentDay); + // System.out.println("currentYear=" + currentYear); + // System.out.println("currentMonth=" + currentMonth); + // System.out.println("currentDay=" + currentDay); boolean endBeforeYearEnd = false; for (int month = 1; month <= 12; month++) { Calendar cal = Calendar.getInstance(); @@ -174,14 +296,17 @@ public class WorkingDaysWindow extends TWindow { WorkingDay wd = workingDayRepository.read(year, month, day); if (wd == null) { - wd = new WorkingDay(WorkingDay.createId(year, month,day), year, month, day, -1, -1, -1, -1, -1, -1, "Fictive day", true); + wd = new WorkingDay(WorkingDay.createId(year, month, day), + year, month, day, -1, -1, -1, -1, -1, -1, + "Fictive day", true); } workingDaysList.add(wd); -// System.out.println("year=" + year); -// System.out.println("month=" + month); -// System.out.println("day=" + day); - if (currentYear == year && currentMonth == month && currentDay == day) { + // System.out.println("year=" + year); + // System.out.println("month=" + month); + // System.out.println("day=" + day); + if (currentYear == year && currentMonth == month + && currentDay == day) { endBeforeYearEnd = true; break; } @@ -192,7 +317,8 @@ public class WorkingDaysWindow extends TWindow { } } - List wdfsList = WorkingDayForStats.createList(workingDaysList); + List wdfsList = + WorkingDayForStats.createList(workingDaysList); WorkingDayForStats.fillStatisticsColumns(wdfsList); List> listForArray = new ArrayList<>(); @@ -201,7 +327,8 @@ public class WorkingDaysWindow extends TWindow { listForArray.add(list2); if (wdfs.isThisDayTimeOff()) { list2.add(wdfs.getDayOfWeekAsString()); - list2.add(wdfs.getDayOfWeek() == 6 || wdfs.getDayOfWeek() == 7 ? YES : NO); + list2.add(wdfs.getDayOfWeek() == 6 || wdfs.getDayOfWeek() == 7 ? + YES : NO); list2.add(wdfs.getId()); list2.add(THREE_DASHES); list2.add(THREE_DASHES); @@ -211,27 +338,53 @@ public class WorkingDaysWindow extends TWindow { list2.add(wdfs.getNote()); list2.add(wdfs.isTimeOff() ? YES : NO); list2.add(QUESTION_MARK); - list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage7Days() - target)); - list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage14Days() - target)); - list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage28Days() - target)); - list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage56Days() - target)); + list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES + .format(wdfs.getArrivalTimeMovingAverage7Days() + - target)); + list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES + .format(wdfs.getArrivalTimeMovingAverage14Days() + - target)); + list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES + .format(wdfs.getArrivalTimeMovingAverage28Days() + - target)); + list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES + .format(wdfs.getArrivalTimeMovingAverage56Days() + - target)); } else { list2.add(wdfs.getDayOfWeekAsString()); - TTime overtime = new TTime(wdfs.getOvertimeHour(), wdfs.getOvertimeMinute()); - list2.add(wdfs.getDayOfWeek() == 6 || wdfs.getDayOfWeek() == 7 ? YES : NO); + TTime overtime = new TTime(wdfs.getOvertimeHour(), + wdfs.getOvertimeMinute()); + list2.add(wdfs.getDayOfWeek() == 6 || wdfs.getDayOfWeek() == 7 ? + YES : NO); list2.add(wdfs.getId()); - list2.add(new TTime(wdfs.getArrivalHour(), wdfs.getArrivalMinute()).toString().substring(0, 5) + " (" + NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalAsDouble())+ ")"); - list2.add(new TTime(wdfs.getDepartureHour(), wdfs.getDepartureMinute()).toString().substring(0, 5)); - list2.add(overtime.toString().substring(0, overtime.isNegative() ? 6 : 5)); - list2.add(TTime.ofMinutes(wdfs.getWorkingTimeInMinutes()).toString().substring(0, 5)); - list2.add(TTime.ofMinutes(wdfs.getPauseTimeInMinutes()).toString().substring(0, 5)); + list2.add(new TTime(wdfs.getArrivalHour(), + wdfs.getArrivalMinute()).toString().substring(0, 5) + + " (" + NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES + .format(wdfs.getArrivalAsDouble()) + ")"); + list2.add(new TTime(wdfs.getDepartureHour(), + wdfs.getDepartureMinute()).toString().substring(0, 5)); + list2.add(overtime.toString() + .substring(0, overtime.isNegative() ? 6 : 5)); + list2.add(TTime.ofMinutes(wdfs.getWorkingTimeInMinutes()) + .toString().substring(0, 5)); + list2.add( + TTime.ofMinutes(wdfs.getPauseTimeInMinutes()).toString() + .substring(0, 5)); list2.add(wdfs.getNote()); list2.add(wdfs.isTimeOff() ? YES : NO); list2.add(QUESTION_MARK); - list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage7Days() - target)); - list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage14Days() - target)); - list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage28Days() - target)); - list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage56Days() - target)); + list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES + .format(wdfs.getArrivalTimeMovingAverage7Days() + - target)); + list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES + .format(wdfs.getArrivalTimeMovingAverage14Days() + - target)); + list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES + .format(wdfs.getArrivalTimeMovingAverage28Days() + - target)); + list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES + .format(wdfs.getArrivalTimeMovingAverage56Days() + - target)); } } @@ -245,64 +398,76 @@ public class WorkingDaysWindow extends TWindow { data[index] = data2; index++; } - String[] columns = new String[] {"Day of Week", "Weekend", "Date","Arrival","Departure","Overtime","Working time","Pause time","Note", "Time off", "Total overtime", "Arrival MA7", "Arrival MA14", "Arrival MA28", "Arrival MA56"}; - - if(table != null) { + String[] columns = + new String[] {"Day of Week", "Weekend", "Date", "Arrival", + "Departure", "Overtime", "Working time", "Pause time", + "Note", "Time off", "Total overtime", "Arrival MA7", + "Arrival MA14", "Arrival MA28", "Arrival MA56"}; + + if (table != null) { scrollPane.remove(table); } DefaultTableModel model = new DefaultTableModel(data, columns) { public Class getColumnClass(int column) { return getValueAt(0, column).getClass(); - }; + } + + ; }; -// class ColorRenderer extends JLabel -// implements TableCellRenderer { -// -// public ColorRenderer() { -// //super.setOpaque(true); -// } -// -// public Component getTableCellRendererComponent( -// JTable table, Object value, -// boolean isSelected, boolean hasFocus, -// int row, int column) { -// -// if (value.equals("SATURDAY")) { -// super.setForeground(Color.red); -// //super.setForeground(Color.black); -// -// -// } else { -// super.setForeground(Color.YELLOW); -// } -// setFont(new Font("Dialog", Font.BOLD, 12)); -// return this; -// -// } -// } - + // class ColorRenderer extends JLabel + // implements TableCellRenderer { + // + // public ColorRenderer() { + // //super.setOpaque(true); + // } + // + // public Component getTableCellRendererComponent( + // JTable table, Object value, + // boolean isSelected, boolean hasFocus, + // int row, int column) { + // + // if (value.equals("SATURDAY")) { + // super.setForeground(Color.red); + // //super.setForeground(Color.black); + // + // + // } else { + // super.setForeground(Color.YELLOW); + // } + // setFont(new Font("Dialog", Font.BOLD, 12)); + // return this; + // + // } + // } + this.table = new JTable(model) { -// -// public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { -// -// Component c = super.prepareRenderer(renderer, row, column); -// -// // Alternate row color -// String value = data[row - 1][0]; -// System.out.println("v=" + value); -//// if (value.equals("SATURDAY")) { -//// c.setBackground(RED); -//// } else c.setBackground(getBackground()); -// c.setBackground(getBackground()); -// return c; -// } + // + // public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { + // + // Component c = super.prepareRenderer(renderer, row, column); + // + // // Alternate row color + // String value = data[row - 1][0]; + // System.out.println("v=" + value); + //// if (value.equals("SATURDAY")) { + //// c.setBackground(RED); + //// } else c.setBackground(getBackground()); + // c.setBackground(getBackground()); + // return c; + // } }; scrollPane.setViewportView(table); table.setBounds(30, 30, 750, 600); //table.setDefaultRenderer(Object.class, new ColorRenderer()); - reloadChart(WorkingDayForStats.toArrivalChartData(wdfsList, 7d, startTextField.getText(), endTextField.getText())); + ArrivalChartData acd = WorkingDayForStats + .toArrivalChartData(wdfsList, 7d, startTextField.getText(), + endTextField.getText()); + acd.setMa14Enabled(acd.isMa14Enabled()); + acd.setMa28Enabled(acd.isMa28Enabled()); + acd.setMa56Enabled(acd.isMa56Enabled()); + reloadChart(acd); } public void reloadChart(ArrivalChartData newArrivalChartData) { diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/DateFormats.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/DateFormats.java index d4c4b55..7f4ef2d 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/DateFormats.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/DateFormats.java @@ -15,6 +15,9 @@ public class DateFormats { = DateTimeFormatter.ofPattern("HH:mm:ss:SSS"); public static DateFormat DATE_TIME_FORMATTER_LONG = new SimpleDateFormat("EEEE : yyyy-MM-dd", Locale.ENGLISH); + + public static DateFormat DATE_TIME_FORMATTER_YYYYMMDD + = new SimpleDateFormat("yyyy-MM-dd"); // public static DateFormat DATE_TIME_FORMATTER_TIME = new SimpleDateFormat("HH:mm:ss:SSS", Locale.ENGLISH);