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;
@ -39,24 +30,35 @@ import java.util.function.BiConsumer;
public class ArrivalChart extends JPanel { public class ArrivalChart extends JPanel {
private static final Color ORANGE = new Color(237, 125, 49); private static final Color ORANGE = new Color(237, 125, 49);
private static final Color BLUE = new Color(68, 114, 196); private static final Color BLUE = new Color(68, 114, 196);
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);
// //
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(
@ -79,20 +83,33 @@ 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++) {
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))); 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) -> {
XYItemRenderer renderer = new XYLineAndShapeRenderer(); XYItemRenderer renderer = new XYLineAndShapeRenderer();
// 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);
}; };
@ -105,20 +122,20 @@ public class ArrivalChart extends JPanel {
plot.setBackgroundPaint(Color.white); plot.setBackgroundPaint(Color.white);
// plot.setRangeGridlinesVisible(true); // plot.setRangeGridlinesVisible(true);
// plot.setRangeGridlinePaint(Color.BLACK); // plot.setRangeGridlinePaint(Color.BLACK);
// //
// plot.setDomainGridlinesVisible(true); // plot.setDomainGridlinesVisible(true);
// plot.setDomainGridlinePaint(Color.BLACK); // plot.setDomainGridlinePaint(Color.BLACK);
chart.getLegend().setFrame(BlockBorder.NONE); chart.getLegend().setFrame(BlockBorder.NONE);
// CategoryAxis domainAxis = plot.getDomainAxis(); // CategoryAxis domainAxis = plot.getDomainAxis();
// domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90); // domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);
// domainAxis.setLabelFont(SwingUtils.VERY_SMALL_FONT); // domainAxis.setLabelFont(SwingUtils.VERY_SMALL_FONT);
// domainAxis.setTickLabelFont(SwingUtils.VERY_SMALL_FONT); // domainAxis.setTickLabelFont(SwingUtils.VERY_SMALL_FONT);
// domainAxis.setCategoryLabelPositionOffset(10); // domainAxis.setCategoryLabelPositionOffset(10);
// domainAxis.setTickLabelsVisible(true); // domainAxis.setTickLabelsVisible(true);
chart.setTitle(new TextTitle(title, chart.setTitle(new TextTitle(title,
new Font("Serif", Font.BOLD, 18) new Font("Serif", Font.BOLD, 18)
) )
@ -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) {
@ -138,12 +156,14 @@ 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(
final TimeSeries seriesMa7 = new TimeSeries( "MA7" ); "Target (" + NumberFormats.FORMATTER_TWO_DECIMAL_PLACES
final TimeSeries seriesMa14 = new TimeSeries( "MA14" ); .format(target) + " h)");
final TimeSeries seriesMa28 = new TimeSeries( "MA28" ); final TimeSeries seriesMa7 = new TimeSeries("MA7");
final TimeSeries seriesMa56 = new TimeSeries( "MA56" ); final TimeSeries seriesMa14 = new TimeSeries("MA14");
final TimeSeries seriesMa28 = new TimeSeries("MA28");
final TimeSeries seriesMa56 = new TimeSeries("MA56");
result.add(seriesArrival); result.add(seriesArrival);
result.add(seriesTarget); result.add(seriesTarget);
result.add(seriesMa7); result.add(seriesMa7);
@ -164,20 +184,20 @@ public class ArrivalChart extends JPanel {
int year = Integer.valueOf(dayArray[0]); int year = Integer.valueOf(dayArray[0]);
int month = Integer.valueOf(dayArray[1]); int month = Integer.valueOf(dayArray[1]);
int day = Integer.valueOf(dayArray[2]); int day = Integer.valueOf(dayArray[2]);
if(year1 != 0) { if (year1 != 0) {
if(month < month1) { if (month < month1) {
continue; continue;
} }
if(month == month1 && day < day1) { if (month == month1 && day < day1) {
continue; continue;
} }
} }
if(year2 != 0) { if (year2 != 0) {
if(month > month2) { if (month > month2) {
continue; continue;
} }
if(month == month2 && day > day2) { if (month == month2 && day > day2) {
continue; continue;
} }
} }

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
@ -29,7 +33,7 @@ public class WorkingDaysWindow extends TWindow {
private static final String YES = "YES"; private static final String YES = "YES";
private static final String THREE_DASHES = "---"; 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 = "?"; public static final String QUESTION_MARK = "?";
private final WorkingDayRepositoryApi workingDayRepository; private final WorkingDayRepositoryApi workingDayRepository;
@ -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;
@ -58,7 +66,7 @@ public class WorkingDaysWindow extends TWindow {
List<String> yearsList = workingDayRepository.getYears(); List<String> yearsList = workingDayRepository.getYears();
String[] yearsArray = new String[yearsList.size()]; 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); yearsArray[i] = yearsList.get(i);
} }
JComboBox years = new JComboBox(yearsArray); JComboBox years = new JComboBox(yearsArray);
@ -66,81 +74,188 @@ 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);
years.setBounds(SwingUtils.MARGIN,SwingUtils.MARGIN, 100, 30); years.setBounds(SwingUtils.MARGIN, SwingUtils.MARGIN, 100, 30);
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);
// //
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,22 +263,29 @@ 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);
final int currentMonth = now.get(Calendar.MONTH) + 1; final int currentMonth = now.get(Calendar.MONTH) + 1;
final int currentDay = now.get(Calendar.DAY_OF_MONTH); final int currentDay = now.get(Calendar.DAY_OF_MONTH);
// System.out.println("currentYear=" + currentYear); // System.out.println("currentYear=" + currentYear);
// System.out.println("currentMonth=" + currentMonth); // System.out.println("currentMonth=" + currentMonth);
// System.out.println("currentDay=" + currentDay); // System.out.println("currentDay=" + currentDay);
boolean endBeforeYearEnd = false; boolean endBeforeYearEnd = false;
for (int month = 1; month <= 12; month++) { for (int month = 1; month <= 12; month++) {
Calendar cal = Calendar.getInstance(); Calendar cal = Calendar.getInstance();
@ -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,64 +398,76 @@ 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",
if(table != null) { "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); scrollPane.remove(table);
} }
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 {
// //
// public ColorRenderer() { // public ColorRenderer() {
// //super.setOpaque(true); // //super.setOpaque(true);
// } // }
// //
// public Component getTableCellRendererComponent( // public Component getTableCellRendererComponent(
// JTable table, Object value, // JTable table, Object value,
// boolean isSelected, boolean hasFocus, // boolean isSelected, boolean hasFocus,
// int row, int column) { // int row, int column) {
// //
// if (value.equals("SATURDAY")) { // if (value.equals("SATURDAY")) {
// super.setForeground(Color.red); // super.setForeground(Color.red);
// //super.setForeground(Color.black); // //super.setForeground(Color.black);
// //
// //
// } else { // } else {
// super.setForeground(Color.YELLOW); // super.setForeground(Color.YELLOW);
// } // }
// setFont(new Font("Dialog", Font.BOLD, 12)); // setFont(new Font("Dialog", Font.BOLD, 12));
// return this; // return this;
// //
// } // }
// } // }
this.table = new JTable(model) { this.table = new JTable(model) {
// //
// public Component prepareRenderer(TableCellRenderer renderer, int row, int column) { // public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
// //
// Component c = super.prepareRenderer(renderer, row, column); // Component c = super.prepareRenderer(renderer, row, column);
// //
// // Alternate row color // // Alternate row color
// String value = data[row - 1][0]; // String value = data[row - 1][0];
// System.out.println("v=" + value); // System.out.println("v=" + value);
//// if (value.equals("SATURDAY")) { //// if (value.equals("SATURDAY")) {
//// c.setBackground(RED); //// c.setBackground(RED);
//// } else c.setBackground(getBackground()); //// } else c.setBackground(getBackground());
// c.setBackground(getBackground()); // c.setBackground(getBackground());
// return c; // return c;
// } // }
}; };
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);