Added several improvements, changes and bug fixes
This commit is contained in:
parent
dc55cd4878
commit
066aa76ca4
@ -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;
|
||||
|
@ -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<Integer, Color> 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<Integer, Color> 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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user