diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/WorkingDayForStats.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/WorkingDayForStats.java index 392169e..a27729d 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/WorkingDayForStats.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/entity/WorkingDayForStats.java @@ -162,20 +162,23 @@ public class WorkingDayForStats extends WorkingDay { list.remove(0); list.remove(0); list.remove(0); + while(list.get(list.size() - 1).isThisDayTimeOff()) { + list.remove(list.size() - 1); + } String[] days = new String[list.size()]; - double[] arrival = new double[list.size()]; double[] ma7 = new double[list.size()]; double[] ma14 = new double[list.size()]; double[] ma28 = new double[list.size()]; double[] ma56 = new double[list.size()]; + double[] arrival = new double[list.size()]; ArrivalChartData acd = new ArrivalChartData(); acd.setDays(days); acd.setArrival(arrival); + acd.setTarget(target); acd.setMa7(ma7); acd.setMa14(ma14); acd.setMa28(ma28); acd.setMa56(ma56); - acd.setTarget(0); if(startDate != null && !startDate.isEmpty()) { acd.setStartDate(startDate); } @@ -186,7 +189,7 @@ public class WorkingDayForStats extends WorkingDay { WorkingDayForStats wdfs = list.get(i); days[i] = wdfs.getId(); - arrival[i] = wdfs.isThisDayTimeOff() ? wdfs.getArrivalTimeMovingAverage7Days() - target : wdfs.getArrivalAsDouble() - target; + arrival[i] = (wdfs.isThisDayTimeOff() ? wdfs.getArrivalTimeMovingAverage7Days() : wdfs.getArrivalAsDouble()) - target; ma7[i] = wdfs.getArrivalTimeMovingAverage7Days() - target; ma14[i] = wdfs.getArrivalTimeMovingAverage14Days() - target; ma28[i] = wdfs.getArrivalTimeMovingAverage28Days() - target; 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 6411748..60b3615 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,28 +3,42 @@ 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.renderer.category.LineAndShapeRenderer; import org.jfree.chart.title.TextTitle; import org.jfree.data.category.CategoryDataset; import org.jfree.data.category.DefaultCategoryDataset; +import org.nanoboot.utils.timecalc.utils.common.NumberFormats; import javax.swing.BorderFactory; import javax.swing.JPanel; +import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; +import java.awt.Rectangle; +import java.util.function.BiConsumer; /** * @author Robert Vokac * @since 20.02.2024 */ 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); + public static final Rectangle EMPTY_RECTANGLE = new Rectangle(); public ArrivalChart(ArrivalChartData data) { - this(data.getDays(), data.getArrival(), data.getMa7(), data.getMa14(), data.getMa28(), data.getMa56(), data.getTarget(), + this(data.getDays(), data.getArrival(), data.getTarget(), data.getMa7(), data.getMa14(), data.getMa28(), data.getMa56(), data.getStartDate(), data.getEndDate()); } - public ArrivalChart(String[] days, double[] arrival, double[] ma7, - double[] ma14, double[] ma28, double[] ma56, double target, String startDate, String endDate) { + public ArrivalChart(String[] days, double[] arrival, double target, double[] ma7, + double[] ma14, double[] ma28, double[] ma56, String startDate, String endDate) { this.setLayout(null); this.setVisible(true); @@ -32,7 +46,7 @@ public class ArrivalChart extends JPanel { String title = "Arrivals"; CategoryDataset dataset = - createDataset(days, arrival, ma7, ma14, ma28, ma56, target, title, startDate, endDate); + createDataset(days, arrival, target, ma7, ma14, ma28, ma56, title, startDate, endDate); JFreeChart chart = createChart(dataset, title); ChartPanel chartPanel = new ChartPanel(chart); chartPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); @@ -40,7 +54,7 @@ public class ArrivalChart extends JPanel { chartPanel.setDomainZoomable(true); chartPanel.setMouseZoomable(true); this.add(chartPanel); - chartPanel.setBounds(10, 10, 800, 400); + chartPanel.setBounds(10, 10, 1200, 400); } @@ -57,33 +71,40 @@ public class ArrivalChart extends JPanel { true, false ); -// Plot plot = chart.getPlot(); -// -// XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(); -// chart.setBorderVisible(false); -// BiConsumer setSeries = (i, c) -> { -// renderer.setSeriesPaint(i, c); -// renderer.setSeriesStroke(i, new BasicStroke(1.0f)); -// renderer.setSeriesShape(i, new Rectangle()); -// }; -// setSeries.accept(0, Color.GRAY); -// setSeries.accept(1, Color.BLACK); -// setSeries.accept(2, Color.RED); -// setSeries.accept(3, Color.GREEN); -// setSeries.accept(4, Color.BLUE); -// setSeries.accept(5, Color.ORANGE); -// -// plot.setRenderer(renderer); -// plot.setBackgroundPaint(Color.white); -// + + CategoryPlot plot = chart.getCategoryPlot(); + LineAndShapeRenderer renderer = new LineAndShapeRenderer(); + renderer.setDrawOutlines(false); + chart.setBorderVisible(false); + BiConsumer setSeries = (i, c) -> { + renderer.setSeriesPaint(i, c); + renderer.setSeriesStroke(i, new BasicStroke(dataset.getRowCount() > 180 ? 1.0f : (i == 1 || i == 2 ? 1.5f : 1.25f))); + renderer.setSeriesShape(i, EMPTY_RECTANGLE); + }; + setSeries.accept(0, Color.GRAY); + setSeries.accept(1, ORANGE); + setSeries.accept(2, BLUE); + setSeries.accept(3, Color.GREEN); + setSeries.accept(4, BROWN); + setSeries.accept(5, PURPLE); + + plot.setRenderer(renderer); + plot.setBackgroundPaint(Color.white); + // plot.setRangeGridlinesVisible(true); // plot.setRangeGridlinePaint(Color.BLACK); // // plot.setDomainGridlinesVisible(true); // plot.setDomainGridlinePaint(Color.BLACK); -// chart.getLegend().setFrame(BlockBorder.NONE); + 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); chart.setTitle(new TextTitle(title, new Font("Serif", Font.BOLD, 18) ) @@ -92,9 +113,9 @@ public class ArrivalChart extends JPanel { return chart; } - private CategoryDataset createDataset(String[] days, double[] arrival, + private CategoryDataset createDataset(String[] days, double[] arrival, double target, double[] ma7, double[] ma14, double[] ma28, - double[] ma56, double target, String title, String startDate, String endDate) { + double[] ma56, String title, String startDate, String endDate) { if (startDate == null) { startDate = "0-0-0"; } @@ -103,11 +124,11 @@ public class ArrivalChart extends JPanel { } DefaultCategoryDataset dataset = new DefaultCategoryDataset(); String seriesArrival = "Arrival"; + String seriesTarget = "Target (" + NumberFormats.FORMATTER_TWO_DECIMAL_PLACES.format(target) + " h)"; String seriesMa7 = "MA7"; String seriesMa14 = "MA14"; String seriesMa28 = "MA28"; String seriesMa56 = "MA56"; - String seriesTarget = "Target"; String[] dayArray0 = startDate.split("-"); int year1 = Integer.valueOf(dayArray0[0]); @@ -141,11 +162,12 @@ public class ArrivalChart extends JPanel { } } dataset.addValue(arrival[i], seriesArrival, date); + dataset.addValue(0, seriesTarget, date); dataset.addValue(ma7[i], seriesMa7, date); dataset.addValue(ma14[i], seriesMa14, date); dataset.addValue(ma28[i], seriesMa28, date); dataset.addValue(ma56[i], seriesMa56, date); - dataset.addValue(target, seriesTarget, date); + } return dataset; 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 1e7dddf..3bcab41 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 @@ -16,11 +16,11 @@ import lombok.Setter; public class ArrivalChartData { private String[] days; private double[] arrival; + private double target; private double[] ma7; private double[] ma14; private double[] ma28; private double[] ma56; - private double target; private String startDate; private String endDate; } diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/DayPanel.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/DayPanel.java index 890201f..2be45ea 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/DayPanel.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/DayPanel.java @@ -2,6 +2,8 @@ package org.nanoboot.utils.timecalc.swing.common; import java.util.HashMap; import java.util.Map; +import javax.swing.BoxLayout; +import javax.swing.JButton; import javax.swing.JPanel; /** @@ -23,6 +25,17 @@ public class DayPanel extends JPanel { this.month = monthIn; this.day = dayIn; setSize(1050, 600); + + this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); + JButton addButton = new JButton("Add"); + JButton addButton2 = new JButton("Add"); + JButton addButton3 = new JButton("Add"); + JButton addButton4 = new JButton("Add"); + add(addButton); + add(addButton2); + add(addButton3); + add(addButton4); + } } diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/MainWindow.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/MainWindow.java index 4386634..7aa0283 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/MainWindow.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/MainWindow.java @@ -87,7 +87,7 @@ public class MainWindow extends TWindow { this.overtimeTextField = new TTextField("", 40); this.workingTimeTextField = new TTextField("8:00", 40); this.pauseTimeTextField = new TTextField("0:30", 40); - this.noteTextField = new TTextField("", 120); + this.noteTextField = new TTextField("", 100); this.departureTextField = new TTextField(); this.elapsedTextField = new TTextField("", 100); this.remainingTextField = new TTextField("", 100); @@ -300,8 +300,8 @@ public class MainWindow extends TWindow { pauseDecreaseButton.setBounds(pauseTimeTextField.getX() + pauseTimeTextField.getWidth(), pauseTimeTextField.getY() + 15, 15, 15); // - TLabel noteTextFieldLabel = new TLabel("Note:", 40); - noteTextFieldLabel.setBoundsFromLeft(pauseTimeTextField); + TLabel noteTextFieldLabel = new TLabel("Note:", 30); + noteTextFieldLabel.setBoundsFromLeft(pauseTimeTextField, 10); noteTextField.setBoundsFromLeft(noteTextFieldLabel); timeOffCheckBox.setBoundsFromLeft(noteTextField); diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/SwingUtils.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/SwingUtils.java index ac1a194..4c3edb9 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/SwingUtils.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/swing/common/SwingUtils.java @@ -11,7 +11,7 @@ public class SwingUtils { public static final int MARGIN = 10; public static final Font SMALL_FONT = new Font("sans", Font.BOLD, 10); - public static final Font VERY_SMALL_FONT = new Font("sans", Font.PLAIN, 8); + public static final Font VERY_SMALL_FONT = new Font("sans", Font.PLAIN, 9); public static final Font MEDIUM_MONOSPACE_FONT = new Font(Font.MONOSPACED, Font.PLAIN, 12); 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 1b3c47e..4cb4e44 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 @@ -87,7 +87,7 @@ public class WorkingDaysWindow extends TWindow { TLabel deleteLabel = new TLabel("Delete:"); add(deleteLabel); - deleteLabel.setBounds(exitButton.getX() + exitButton.getWidth() + SwingUtils.MARGIN, exitButton.getY(), 100, 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); @@ -106,7 +106,7 @@ public class WorkingDaysWindow extends TWindow { TLabel startLabel = new TLabel("Start:"); add(startLabel); - startLabel.setBounds(deleteTextField.getX() + deleteTextField.getWidth() + 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); @@ -125,12 +125,11 @@ public class WorkingDaysWindow extends TWindow { reloadButton.doClick(); }); - // - ArrivalChartData acd = new ArrivalChartData(new String[]{}, new double[]{}, new double[]{}, new double[]{}, new double[]{}, new double[]{},7d, null, null); + ArrivalChartData acd = new ArrivalChartData(new String[]{}, new double[]{}, 7d, new double[]{}, new double[]{}, new double[]{}, new double[]{}, null, null); this.arrivalChart = new ArrivalChart(acd); arrivalChart.setBounds(SwingUtils.MARGIN, years.getY() + years.getHeight()+ SwingUtils.MARGIN, - 800, + 1200, 400); add(arrivalChart); // @@ -138,7 +137,7 @@ public class WorkingDaysWindow extends TWindow { = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); scrollPane.setBounds(SwingUtils.MARGIN, arrivalChart.getY() + arrivalChart.getHeight()+ SwingUtils.MARGIN, - 1000, + 1200, 300); add(scrollPane); scrollPane.setViewportView(table); diff --git a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/NumberFormats.java b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/NumberFormats.java index 465ce3b..da49c56 100644 --- a/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/NumberFormats.java +++ b/modules/time-calc-app/src/main/java/org/nanoboot/utils/timecalc/utils/common/NumberFormats.java @@ -12,7 +12,7 @@ public class NumberFormats { public static final NumberFormat FORMATTER_ZERO_DECIMAL_PLACES = new DecimalFormat("#00"); public static final NumberFormat FORMATTER_TWO_DECIMAL_PLACES - = new DecimalFormat("#00.00"); + = new DecimalFormat("#0.00"); public static final NumberFormat FORMATTER_FIVE_DECIMAL_PLACES = new DecimalFormat("#0.00000"); public static final NumberFormat FORMATTER_THREE_DECIMAL_PLACES