Added several improvements, changes and bug fixes

This commit is contained in:
Robert Vokac 2024-03-10 18:00:58 +00:00
parent 46130d1855
commit abc622290c
No known key found for this signature in database
GPG Key ID: 693D30BEE3329055
4 changed files with 347 additions and 158 deletions

View File

@ -3,23 +3,14 @@ package org.nanoboot.utils.timecalc.swing.common;
import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel; import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart; 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.block.BlockBorder;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot; 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.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.title.TextTitle; 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.Day;
import org.jfree.data.time.Second;
import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection; import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.nanoboot.utils.timecalc.utils.common.NumberFormats; import org.nanoboot.utils.timecalc.utils.common.NumberFormats;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
@ -42,13 +33,23 @@ public class ArrivalChart extends JPanel {
private static final Color BROWN = new Color(128, 0, 64); private static final Color BROWN = new Color(128, 0, 64);
private static final Color PURPLE = new Color(128, 0, 255); private static final Color PURPLE = new Color(128, 0, 255);
public static final Rectangle EMPTY_RECTANGLE = new Rectangle(); 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) { public ArrivalChart(ArrivalChartData data, int width) {
this(data.getDays(), data.getArrival(), data.getTarget(), data.getMa7(), data.getMa14(), data.getMa28(), data.getMa56(), this(data.getDays(), data.getArrival(), data.getTarget(), data.getMa7(),
data.getStartDate(), data.getEndDate(), width); 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.setLayout(null);
this.setVisible(true); this.setVisible(true);
@ -56,7 +57,8 @@ public class ArrivalChart extends JPanel {
String title = "Arrivals"; String title = "Arrivals";
List<TimeSeries> timeSeries = List<TimeSeries> timeSeries =
createSeries(days, arrival, target, ma7, ma14, ma28, ma56, title, startDate, endDate); createSeries(days, arrival, target, ma7, ma14, ma28, ma56,
title, startDate, endDate);
JFreeChart chart = createChart(timeSeries, title); JFreeChart chart = createChart(timeSeries, title);
ChartPanel chartPanel = new ChartPanel(chart); ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); chartPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
@ -65,10 +67,12 @@ public class ArrivalChart extends JPanel {
chartPanel.setMouseZoomable(true); chartPanel.setMouseZoomable(true);
this.add(chartPanel); this.add(chartPanel);
chartPanel.setBounds(10, 10, width, 400); chartPanel.setBounds(10, 10, width, 400);
this.ma14Enabled = ma14Enabled;
this.ma28Enabled = ma28Enabled;
this.ma56Enabled = ma56Enabled;
} }
public static JFreeChart createChart(List<TimeSeries> timeSeries, private JFreeChart createChart(List<TimeSeries> timeSeries,
String title) { String title) {
JFreeChart chart = ChartFactory.createTimeSeriesChart( JFreeChart chart = ChartFactory.createTimeSeriesChart(
@ -80,9 +84,18 @@ public class ArrivalChart extends JPanel {
XYPlot plot = (XYPlot) chart.getPlot(); XYPlot plot = (XYPlot) chart.getPlot();
for (int i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
plot.setDataset(i, new TimeSeriesCollection(timeSeries.get(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); chart.setBorderVisible(false);
BiConsumer<Integer, Color> setSeries = (i, c) -> { BiConsumer<Integer, Color> setSeries = (i, c) -> {
@ -91,8 +104,12 @@ public class ArrivalChart extends JPanel {
// renderer.setDefaultPaint(c); // renderer.setDefaultPaint(c);
// renderer.setDefaultStroke(new BasicStroke(timeSeries.get(0).getItemCount() > 180 ? 1.0f : (i == 1 || i == 2 ? 1.5f : 1.25f))); // renderer.setDefaultStroke(new BasicStroke(timeSeries.get(0).getItemCount() > 180 ? 1.0f : (i == 1 || i == 2 ? 1.5f : 1.25f)));
// renderer.setDefaultShape(EMPTY_RECTANGLE); // renderer.setDefaultShape(EMPTY_RECTANGLE);
renderer.setSeriesPaint(0, c); 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); renderer.setSeriesShape(0, EMPTY_RECTANGLE);
plot.setRenderer(i, renderer); plot.setRenderer(i, renderer);
}; };
@ -127,7 +144,8 @@ public class ArrivalChart extends JPanel {
return chart; return chart;
} }
private List<TimeSeries> createSeries(String[] days, double[] arrival, double target, private List<TimeSeries> createSeries(String[] days, double[] arrival,
double target,
double[] ma7, double[] ma14, double[] ma28, double[] ma7, double[] ma14, double[] ma28,
double[] ma56, String title, String startDate, String endDate) { double[] ma56, String title, String startDate, String endDate) {
if (startDate == null) { if (startDate == null) {
@ -139,7 +157,9 @@ public class ArrivalChart extends JPanel {
List<TimeSeries> result = new ArrayList<>(); List<TimeSeries> result = new ArrayList<>();
final TimeSeries seriesArrival = new TimeSeries("Arrival"); final TimeSeries seriesArrival = new TimeSeries("Arrival");
final TimeSeries seriesTarget = new TimeSeries( "Target (" + NumberFormats.FORMATTER_TWO_DECIMAL_PLACES.format(target) + " h)"); final TimeSeries seriesTarget = new TimeSeries(
"Target (" + NumberFormats.FORMATTER_TWO_DECIMAL_PLACES
.format(target) + " h)");
final TimeSeries seriesMa7 = new TimeSeries("MA7"); final TimeSeries seriesMa7 = new TimeSeries("MA7");
final TimeSeries seriesMa14 = new TimeSeries("MA14"); final TimeSeries seriesMa14 = new TimeSeries("MA14");
final TimeSeries seriesMa28 = new TimeSeries("MA28"); final TimeSeries seriesMa28 = new TimeSeries("MA28");

View File

@ -23,4 +23,5 @@ public class ArrivalChartData {
private double[] ma56; private double[] ma56;
private String startDate; private String startDate;
private String endDate; private String endDate;
private boolean ma14Enabled = true, ma28Enabled = true, ma56Enabled = true;
} }

View File

@ -1,24 +1,28 @@
package org.nanoboot.utils.timecalc.swing.common; package org.nanoboot.utils.timecalc.swing.common;
import java.awt.Color; import org.nanoboot.utils.timecalc.entity.WorkingDay;
import java.awt.Dimension; import org.nanoboot.utils.timecalc.entity.WorkingDayForStats;
import java.awt.Rectangle; import org.nanoboot.utils.timecalc.persistence.api.WorkingDayRepositoryApi;
import java.awt.Toolkit; import org.nanoboot.utils.timecalc.swing.progress.Time;
import java.util.ArrayList; import org.nanoboot.utils.timecalc.utils.common.DateFormats;
import java.util.Calendar; import org.nanoboot.utils.timecalc.utils.common.NumberFormats;
import java.util.List; import org.nanoboot.utils.timecalc.utils.common.TTime;
import org.nanoboot.utils.timecalc.utils.common.Utils;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JComboBox; import javax.swing.JComboBox;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
import javax.swing.JTable; import javax.swing.JTable;
import javax.swing.table.DefaultTableModel; import javax.swing.table.DefaultTableModel;
import org.nanoboot.utils.timecalc.entity.WorkingDay; import java.awt.Color;
import org.nanoboot.utils.timecalc.entity.WorkingDayForStats; import java.awt.Dimension;
import org.nanoboot.utils.timecalc.persistence.api.WorkingDayRepositoryApi; import java.awt.Rectangle;
import org.nanoboot.utils.timecalc.swing.progress.Time; import java.awt.Toolkit;
import org.nanoboot.utils.timecalc.utils.common.NumberFormats; import java.awt.event.KeyEvent;
import org.nanoboot.utils.timecalc.utils.common.TTime; import java.awt.event.KeyListener;
import org.nanoboot.utils.timecalc.utils.common.Utils; import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
/** /**
* @author Robert Vokac * @author Robert Vokac
@ -39,12 +43,16 @@ public class WorkingDaysWindow extends TWindow {
private final TTextField startTextField; private final TTextField startTextField;
private final TTextField endTextField; private final TTextField endTextField;
private final int chartWidth; private final int chartWidth;
private final JButton decreaseStart;
private final JButton decreaseEnd;
private ArrivalChart arrivalChart; private ArrivalChart arrivalChart;
private JTable table = null; private JTable table = null;
private final JScrollPane scrollPane; 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"); setTitle("Work Days");
this.workingDayRepository = workingDayRepository; this.workingDayRepository = workingDayRepository;
@ -66,7 +74,9 @@ public class WorkingDaysWindow extends TWindow {
years.setSelectedItem(String.valueOf(year)); years.setSelectedItem(String.valueOf(year));
years.addActionListener(e -> { years.addActionListener(e -> {
workingDaysWindow.loadYear(Integer.valueOf((String) years.getSelectedItem()), time); workingDaysWindow
.loadYear(Integer.valueOf((String) years.getSelectedItem()),
time);
}); });
add(years); add(years);
@ -74,65 +84,168 @@ public class WorkingDaysWindow extends TWindow {
this.reloadButton = new JButton("Reload"); this.reloadButton = new JButton("Reload");
reloadButton.addActionListener(e -> { reloadButton.addActionListener(e -> {
workingDaysWindow.loadYear(Integer.valueOf((String) years.getSelectedItem()), time); workingDaysWindow
.loadYear(Integer.valueOf((String) years.getSelectedItem()),
time);
}); });
add(reloadButton); 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"); JButton exitButton = new JButton("Exit");
exitButton.addActionListener(e -> { exitButton.addActionListener(e -> {
this.setVisible(false); this.setVisible(false);
}); });
add(exitButton); 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:"); TLabel deleteLabel = new TLabel("Delete:");
add(deleteLabel); 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(); TTextField deleteTextField = new TTextField();
add(deleteTextField); 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 -> { deleteTextField.addActionListener(e -> {
if (deleteTextField.getText().isEmpty()) { if (deleteTextField.getText().isEmpty()) {
//nothing to do //nothing to do
return; 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; return;
} }
workingDayRepository.delete(deleteTextField.getText()); workingDayRepository.delete(deleteTextField.getText());
reloadButton.doClick(); reloadButton.doClick();
}); });
TLabel startLabel = new TLabel("Start:"); TLabel startLabel = new TLabel("Start:");
add(startLabel); 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(); this.startTextField = new TTextField();
add(startTextField); 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 -> { startTextField.addActionListener(e -> {
reloadButton.doClick(); reloadButton.doClick();
}); });
TLabel endLabel = new TLabel("End:"); TLabel endLabel = new TLabel("End:");
add(endLabel); 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(); this.endTextField = new TTextField();
add(endTextField); 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 -> { endTextField.addActionListener(e -> {
reloadButton.doClick(); 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); this.arrivalChart = new ArrivalChart(acd, 1000);
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
this.chartWidth = (int) screen.getWidth() - 60; 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), (int) (screen.getWidth() - 50),
400); 400);
add(arrivalChart); add(arrivalChart);
@ -140,7 +253,9 @@ public class WorkingDaysWindow extends TWindow {
this.scrollPane this.scrollPane
= new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, = new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setBounds(SwingUtils.MARGIN, arrivalChart.getY() + arrivalChart.getHeight()+ SwingUtils.MARGIN, scrollPane.setBounds(SwingUtils.MARGIN,
arrivalChart.getY() + arrivalChart.getHeight()
+ SwingUtils.MARGIN,
(int) (screen.getWidth() - 50), (int) (screen.getWidth() - 50),
300); 300);
add(scrollPane); add(scrollPane);
@ -148,14 +263,21 @@ public class WorkingDaysWindow extends TWindow {
loadYear(year, time); 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() { public void doReloadButtonClick() {
this.reloadButton.doClick(); 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<WorkingDay> workingDaysList = new ArrayList<>(); List<WorkingDay> workingDaysList = new ArrayList<>();
Calendar now = time.asCalendar(); Calendar now = time.asCalendar();
final int currentYear = now.get(Calendar.YEAR); final int currentYear = now.get(Calendar.YEAR);
@ -174,14 +296,17 @@ public class WorkingDaysWindow extends TWindow {
WorkingDay wd = workingDayRepository.read(year, month, day); WorkingDay wd = workingDayRepository.read(year, month, day);
if (wd == null) { 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); workingDaysList.add(wd);
// System.out.println("year=" + year); // System.out.println("year=" + year);
// System.out.println("month=" + month); // System.out.println("month=" + month);
// System.out.println("day=" + day); // System.out.println("day=" + day);
if (currentYear == year && currentMonth == month && currentDay == day) { if (currentYear == year && currentMonth == month
&& currentDay == day) {
endBeforeYearEnd = true; endBeforeYearEnd = true;
break; break;
} }
@ -192,7 +317,8 @@ public class WorkingDaysWindow extends TWindow {
} }
} }
List<WorkingDayForStats> wdfsList = WorkingDayForStats.createList(workingDaysList); List<WorkingDayForStats> wdfsList =
WorkingDayForStats.createList(workingDaysList);
WorkingDayForStats.fillStatisticsColumns(wdfsList); WorkingDayForStats.fillStatisticsColumns(wdfsList);
List<List<String>> listForArray = new ArrayList<>(); List<List<String>> listForArray = new ArrayList<>();
@ -201,7 +327,8 @@ public class WorkingDaysWindow extends TWindow {
listForArray.add(list2); listForArray.add(list2);
if (wdfs.isThisDayTimeOff()) { if (wdfs.isThisDayTimeOff()) {
list2.add(wdfs.getDayOfWeekAsString()); 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(wdfs.getId());
list2.add(THREE_DASHES); list2.add(THREE_DASHES);
list2.add(THREE_DASHES); list2.add(THREE_DASHES);
@ -211,27 +338,53 @@ public class WorkingDaysWindow extends TWindow {
list2.add(wdfs.getNote()); list2.add(wdfs.getNote());
list2.add(wdfs.isTimeOff() ? YES : NO); list2.add(wdfs.isTimeOff() ? YES : NO);
list2.add(QUESTION_MARK); list2.add(QUESTION_MARK);
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage7Days() - target)); list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage14Days() - target)); .format(wdfs.getArrivalTimeMovingAverage7Days()
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage28Days() - target)); - target));
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage56Days() - 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 { } else {
list2.add(wdfs.getDayOfWeekAsString()); list2.add(wdfs.getDayOfWeekAsString());
TTime overtime = new TTime(wdfs.getOvertimeHour(), wdfs.getOvertimeMinute()); TTime overtime = new TTime(wdfs.getOvertimeHour(),
list2.add(wdfs.getDayOfWeek() == 6 || wdfs.getDayOfWeek() == 7 ? YES : NO); wdfs.getOvertimeMinute());
list2.add(wdfs.getDayOfWeek() == 6 || wdfs.getDayOfWeek() == 7 ?
YES : NO);
list2.add(wdfs.getId()); 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.getArrivalHour(),
list2.add(new TTime(wdfs.getDepartureHour(), wdfs.getDepartureMinute()).toString().substring(0, 5)); wdfs.getArrivalMinute()).toString().substring(0, 5)
list2.add(overtime.toString().substring(0, overtime.isNegative() ? 6 : 5)); + " (" + NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES
list2.add(TTime.ofMinutes(wdfs.getWorkingTimeInMinutes()).toString().substring(0, 5)); .format(wdfs.getArrivalAsDouble()) + ")");
list2.add(TTime.ofMinutes(wdfs.getPauseTimeInMinutes()).toString().substring(0, 5)); 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.getNote());
list2.add(wdfs.isTimeOff() ? YES : NO); list2.add(wdfs.isTimeOff() ? YES : NO);
list2.add(QUESTION_MARK); list2.add(QUESTION_MARK);
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage7Days() - target)); list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage14Days() - target)); .format(wdfs.getArrivalTimeMovingAverage7Days()
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage28Days() - target)); - target));
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage56Days() - 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,7 +398,11 @@ public class WorkingDaysWindow extends TWindow {
data[index] = data2; data[index] = data2;
index++; 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"}; 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) { if (table != null) {
scrollPane.remove(table); scrollPane.remove(table);
@ -254,7 +411,9 @@ public class WorkingDaysWindow extends TWindow {
DefaultTableModel model = new DefaultTableModel(data, columns) { DefaultTableModel model = new DefaultTableModel(data, columns) {
public Class getColumnClass(int column) { public Class getColumnClass(int column) {
return getValueAt(0, column).getClass(); return getValueAt(0, column).getClass();
}; }
;
}; };
// class ColorRenderer extends JLabel // class ColorRenderer extends JLabel
// implements TableCellRenderer { // implements TableCellRenderer {
@ -302,7 +461,13 @@ public class WorkingDaysWindow extends TWindow {
scrollPane.setViewportView(table); scrollPane.setViewportView(table);
table.setBounds(30, 30, 750, 600); table.setBounds(30, 30, 750, 600);
//table.setDefaultRenderer(Object.class, new ColorRenderer()); //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) { public void reloadChart(ArrivalChartData newArrivalChartData) {

View File

@ -15,6 +15,9 @@ public class DateFormats {
= DateTimeFormatter.ofPattern("HH:mm:ss:SSS"); = DateTimeFormatter.ofPattern("HH:mm:ss:SSS");
public static DateFormat DATE_TIME_FORMATTER_LONG public static DateFormat DATE_TIME_FORMATTER_LONG
= new SimpleDateFormat("EEEE : yyyy-MM-dd", Locale.ENGLISH); = 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 public static DateFormat DATE_TIME_FORMATTER_TIME
= new SimpleDateFormat("HH:mm:ss:SSS", Locale.ENGLISH); = new SimpleDateFormat("HH:mm:ss:SSS", Locale.ENGLISH);