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.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.block.BlockBorder;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.time.Day;
import org.jfree.data.time.Second;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.nanoboot.utils.timecalc.utils.common.NumberFormats;
import javax.swing.BorderFactory;
@ -39,24 +30,35 @@ import java.util.function.BiConsumer;
public class ArrivalChart extends JPanel {
private static final Color ORANGE = new Color(237, 125, 49);
private static final Color BLUE = new Color(68, 114, 196);
private static final Color BROWN = new Color(128,0, 64);
private static final Color PURPLE = new Color(128,0, 255);
private static final Color BROWN = new Color(128, 0, 64);
private static final Color PURPLE = new Color(128, 0, 255);
public static final Rectangle EMPTY_RECTANGLE = new Rectangle();
private final boolean ma14Enabled;
private final boolean ma28Enabled;
private final boolean ma56Enabled;
public ArrivalChart(ArrivalChartData data, int width) {
this(data.getDays(), data.getArrival(), data.getTarget(), data.getMa7(), data.getMa14(), data.getMa28(), data.getMa56(),
data.getStartDate(), data.getEndDate(), width);
this(data.getDays(), data.getArrival(), data.getTarget(), data.getMa7(),
data.getMa14(), data.getMa28(), data.getMa56(),
data.getStartDate(), data.getEndDate(), width,
data.isMa14Enabled(), data.isMa28Enabled(),
data.isMa56Enabled());
}
public ArrivalChart(String[] days, double[] arrival, double target, double[] ma7,
double[] ma14, double[] ma28, double[] ma56, String startDate, String endDate, int width) {
public ArrivalChart(String[] days, double[] arrival, double target,
double[] ma7,
double[] ma14, double[] ma28, double[] ma56, String startDate,
String endDate, int width, boolean ma14Enabled, boolean ma28Enabled,
boolean ma56Enabled) {
this.setLayout(null);
this.setVisible(true);
//
String title = "Arrivals";
List<TimeSeries> timeSeries=
createSeries(days, arrival, target, ma7, ma14, ma28, ma56, title, startDate, endDate);
List<TimeSeries> timeSeries =
createSeries(days, arrival, target, ma7, ma14, ma28, ma56,
title, startDate, endDate);
JFreeChart chart = createChart(timeSeries, title);
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
@ -65,10 +67,12 @@ public class ArrivalChart extends JPanel {
chartPanel.setMouseZoomable(true);
this.add(chartPanel);
chartPanel.setBounds(10, 10, width, 400);
this.ma14Enabled = ma14Enabled;
this.ma28Enabled = ma28Enabled;
this.ma56Enabled = ma56Enabled;
}
public static JFreeChart createChart(List<TimeSeries> timeSeries,
private JFreeChart createChart(List<TimeSeries> timeSeries,
String title) {
JFreeChart chart = ChartFactory.createTimeSeriesChart(
@ -79,20 +83,33 @@ public class ArrivalChart extends JPanel {
);
XYPlot plot = (XYPlot) chart.getPlot();
for(int i = 0; i < 6; i++) {
for (int i = 0; i < 6; i++) {
if (i == 3 && this.ma14Enabled) {
continue;
}
if (i == 4 && !this.ma28Enabled) {
continue;
}
if (i == 5 && !this.ma56Enabled) {
continue;
}
plot.setDataset(i, new TimeSeriesCollection(timeSeries.get(i)));
}
}
chart.setBorderVisible(false);
BiConsumer<Integer, Color> setSeries = (i, c) -> {
XYItemRenderer renderer = new XYLineAndShapeRenderer();
// renderer.setDefaultPaint(c);
// renderer.setDefaultStroke(new BasicStroke(timeSeries.get(0).getItemCount() > 180 ? 1.0f : (i == 1 || i == 2 ? 1.5f : 1.25f)));
// renderer.setDefaultShape(EMPTY_RECTANGLE);
// renderer.setDefaultPaint(c);
// renderer.setDefaultStroke(new BasicStroke(timeSeries.get(0).getItemCount() > 180 ? 1.0f : (i == 1 || i == 2 ? 1.5f : 1.25f)));
// renderer.setDefaultShape(EMPTY_RECTANGLE);
renderer.setSeriesPaint(0, c);
renderer.setSeriesStroke(0, new BasicStroke(i == 1 || i == 2 ? 2.5f : 1.5f));
float strength = i == 1 || i == 2 ? 3f : 1.5f;
BasicStroke stroke = new BasicStroke(strength);
renderer.setSeriesStroke(0, stroke);
renderer.setSeriesShape(0, EMPTY_RECTANGLE);
plot.setRenderer(i, renderer);
};
@ -105,20 +122,20 @@ public class ArrivalChart extends JPanel {
plot.setBackgroundPaint(Color.white);
// plot.setRangeGridlinesVisible(true);
// plot.setRangeGridlinePaint(Color.BLACK);
//
// plot.setDomainGridlinesVisible(true);
// plot.setDomainGridlinePaint(Color.BLACK);
// plot.setRangeGridlinesVisible(true);
// plot.setRangeGridlinePaint(Color.BLACK);
//
// plot.setDomainGridlinesVisible(true);
// plot.setDomainGridlinePaint(Color.BLACK);
chart.getLegend().setFrame(BlockBorder.NONE);
// CategoryAxis domainAxis = plot.getDomainAxis();
// domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);
// domainAxis.setLabelFont(SwingUtils.VERY_SMALL_FONT);
// domainAxis.setTickLabelFont(SwingUtils.VERY_SMALL_FONT);
// domainAxis.setCategoryLabelPositionOffset(10);
// domainAxis.setTickLabelsVisible(true);
// CategoryAxis domainAxis = plot.getDomainAxis();
// domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);
// domainAxis.setLabelFont(SwingUtils.VERY_SMALL_FONT);
// domainAxis.setTickLabelFont(SwingUtils.VERY_SMALL_FONT);
// domainAxis.setCategoryLabelPositionOffset(10);
// domainAxis.setTickLabelsVisible(true);
chart.setTitle(new TextTitle(title,
new Font("Serif", Font.BOLD, 18)
)
@ -127,7 +144,8 @@ public class ArrivalChart extends JPanel {
return chart;
}
private List<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[] ma56, String title, String startDate, String endDate) {
if (startDate == null) {
@ -138,12 +156,14 @@ public class ArrivalChart extends JPanel {
}
List<TimeSeries> result = new ArrayList<>();
final TimeSeries seriesArrival = new TimeSeries( "Arrival" );
final TimeSeries seriesTarget = new TimeSeries( "Target (" + NumberFormats.FORMATTER_TWO_DECIMAL_PLACES.format(target) + " h)");
final TimeSeries seriesMa7 = new TimeSeries( "MA7" );
final TimeSeries seriesMa14 = new TimeSeries( "MA14" );
final TimeSeries seriesMa28 = new TimeSeries( "MA28" );
final TimeSeries seriesMa56 = new TimeSeries( "MA56" );
final TimeSeries seriesArrival = new TimeSeries("Arrival");
final TimeSeries seriesTarget = new TimeSeries(
"Target (" + NumberFormats.FORMATTER_TWO_DECIMAL_PLACES
.format(target) + " h)");
final TimeSeries seriesMa7 = new TimeSeries("MA7");
final TimeSeries seriesMa14 = new TimeSeries("MA14");
final TimeSeries seriesMa28 = new TimeSeries("MA28");
final TimeSeries seriesMa56 = new TimeSeries("MA56");
result.add(seriesArrival);
result.add(seriesTarget);
result.add(seriesMa7);
@ -164,20 +184,20 @@ public class ArrivalChart extends JPanel {
int year = Integer.valueOf(dayArray[0]);
int month = Integer.valueOf(dayArray[1]);
int day = Integer.valueOf(dayArray[2]);
if(year1 != 0) {
if(month < month1) {
if (year1 != 0) {
if (month < month1) {
continue;
}
if(month == month1 && day < day1) {
if (month == month1 && day < day1) {
continue;
}
}
if(year2 != 0) {
if(month > month2) {
if (year2 != 0) {
if (month > month2) {
continue;
}
if(month == month2 && day > day2) {
if (month == month2 && day > day2) {
continue;
}
}

View File

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

View File

@ -1,24 +1,28 @@
package org.nanoboot.utils.timecalc.swing.common;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import org.nanoboot.utils.timecalc.entity.WorkingDay;
import org.nanoboot.utils.timecalc.entity.WorkingDayForStats;
import org.nanoboot.utils.timecalc.persistence.api.WorkingDayRepositoryApi;
import org.nanoboot.utils.timecalc.swing.progress.Time;
import org.nanoboot.utils.timecalc.utils.common.DateFormats;
import org.nanoboot.utils.timecalc.utils.common.NumberFormats;
import org.nanoboot.utils.timecalc.utils.common.TTime;
import org.nanoboot.utils.timecalc.utils.common.Utils;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import org.nanoboot.utils.timecalc.entity.WorkingDay;
import org.nanoboot.utils.timecalc.entity.WorkingDayForStats;
import org.nanoboot.utils.timecalc.persistence.api.WorkingDayRepositoryApi;
import org.nanoboot.utils.timecalc.swing.progress.Time;
import org.nanoboot.utils.timecalc.utils.common.NumberFormats;
import org.nanoboot.utils.timecalc.utils.common.TTime;
import org.nanoboot.utils.timecalc.utils.common.Utils;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
/**
* @author Robert Vokac
@ -29,7 +33,7 @@ public class WorkingDaysWindow extends TWindow {
private static final String YES = "YES";
private static final String THREE_DASHES = "---";
//
private static final Color RED = new Color(255,153,153);
private static final Color RED = new Color(255, 153, 153);
public static final String QUESTION_MARK = "?";
private final WorkingDayRepositoryApi workingDayRepository;
@ -39,12 +43,16 @@ public class WorkingDaysWindow extends TWindow {
private final TTextField startTextField;
private final TTextField endTextField;
private final int chartWidth;
private final JButton decreaseStart;
private final JButton decreaseEnd;
private ArrivalChart arrivalChart;
private JTable table = null;
private final JScrollPane scrollPane;
private int loadedYear;
public WorkingDaysWindow(WorkingDayRepositoryApi workingDayRepository, Time time, double target) {
public WorkingDaysWindow(WorkingDayRepositoryApi workingDayRepository,
Time time, double target) {
setTitle("Work Days");
this.workingDayRepository = workingDayRepository;
@ -58,7 +66,7 @@ public class WorkingDaysWindow extends TWindow {
List<String> yearsList = workingDayRepository.getYears();
String[] yearsArray = new String[yearsList.size()];
for(int i = 0; i< yearsList.size(); i++){
for (int i = 0; i < yearsList.size(); i++) {
yearsArray[i] = yearsList.get(i);
}
JComboBox years = new JComboBox(yearsArray);
@ -66,81 +74,188 @@ public class WorkingDaysWindow extends TWindow {
years.setSelectedItem(String.valueOf(year));
years.addActionListener(e -> {
workingDaysWindow.loadYear(Integer.valueOf((String) years.getSelectedItem()), time);
workingDaysWindow
.loadYear(Integer.valueOf((String) years.getSelectedItem()),
time);
});
add(years);
years.setBounds(SwingUtils.MARGIN,SwingUtils.MARGIN, 100, 30);
years.setBounds(SwingUtils.MARGIN, SwingUtils.MARGIN, 100, 30);
this.reloadButton = new JButton("Reload");
reloadButton.addActionListener(e -> {
workingDaysWindow.loadYear(Integer.valueOf((String) years.getSelectedItem()), time);
workingDaysWindow
.loadYear(Integer.valueOf((String) years.getSelectedItem()),
time);
});
add(reloadButton);
reloadButton.setBounds(years.getX() + years.getWidth() + SwingUtils.MARGIN, years.getY(), 100, 30);
reloadButton
.setBounds(years.getX() + years.getWidth() + SwingUtils.MARGIN,
years.getY(), 100, 30);
JButton exitButton = new JButton("Exit");
exitButton.addActionListener(e -> {
this.setVisible(false);
});
add(exitButton);
exitButton.setBounds(reloadButton.getX() + reloadButton.getWidth() + SwingUtils.MARGIN, reloadButton.getY(), 100, 30);
exitButton.setBounds(reloadButton.getX() + reloadButton.getWidth()
+ SwingUtils.MARGIN, reloadButton.getY(), 100, 30);
TLabel deleteLabel = new TLabel("Delete:");
add(deleteLabel);
deleteLabel.setBounds(exitButton.getX() + exitButton.getWidth() + SwingUtils.MARGIN, exitButton.getY(), 50, 30);
deleteLabel.setBounds(
exitButton.getX() + exitButton.getWidth() + SwingUtils.MARGIN,
exitButton.getY(), 50, 30);
TTextField deleteTextField = new TTextField();
add(deleteTextField);
deleteTextField.setBounds(deleteLabel.getX() + deleteLabel.getWidth() + SwingUtils.MARGIN, deleteLabel.getY(), 100, 30);
deleteTextField.setBounds(
deleteLabel.getX() + deleteLabel.getWidth() + SwingUtils.MARGIN,
deleteLabel.getY(), 100, 30);
deleteTextField.addActionListener(e -> {
if(deleteTextField.getText().isEmpty()) {
if (deleteTextField.getText().isEmpty()) {
//nothing to do
return;
}
if(!Utils.askYesNo(this, "Do you really want to delete this day: " + deleteTextField.getText(), "Day deletion")) {
if (!Utils.askYesNo(this,
"Do you really want to delete this day: " + deleteTextField
.getText(), "Day deletion")) {
return;
}
workingDayRepository.delete(deleteTextField.getText());
reloadButton.doClick();
});
TLabel startLabel = new TLabel("Start:");
add(startLabel);
startLabel.setBounds(deleteTextField.getX() + deleteTextField.getWidth() + 6 * SwingUtils.MARGIN, deleteTextField.getY(), 50, 30);
startLabel.setBounds(deleteTextField.getX() + deleteTextField.getWidth()
+ 6 * SwingUtils.MARGIN, deleteTextField.getY(),
50, 30);
this.startTextField = new TTextField();
add(startTextField);
startTextField.setBounds(startLabel.getX() + startLabel.getWidth() + SwingUtils.MARGIN, startLabel.getY(), 100, 30);
startTextField.setBounds(
startLabel.getX() + startLabel.getWidth() + SwingUtils.MARGIN,
startLabel.getY(), 100, 30);
startTextField.addActionListener(e -> {
reloadButton.doClick();
});
TLabel endLabel = new TLabel("End:");
add(endLabel);
endLabel.setBounds(startTextField.getX() + startTextField.getWidth() + SwingUtils.MARGIN, startTextField.getY(), 50, 30);
endLabel.setBounds(startTextField.getX() + startTextField.getWidth()
+ SwingUtils.MARGIN, startTextField.getY(), 50, 30);
this.endTextField = new TTextField();
add(endTextField);
endTextField.setBounds(endLabel.getX() + endLabel.getWidth() + SwingUtils.MARGIN, endLabel.getY(), 100, 30);
endTextField.setBounds(
endLabel.getX() + endLabel.getWidth() + SwingUtils.MARGIN,
endLabel.getY(), 100, 30);
endTextField.addActionListener(e -> {
reloadButton.doClick();
});
this.decreaseStart = new JButton("Decrease start");
this.decreaseEnd = new JButton("Decrease end");
add(decreaseStart);
add(decreaseEnd);
decreaseStart.addActionListener(e -> {
if (loadedYear == 0) {
//nothing to do
return;
}
String date = this.startTextField.getText();
if (date.isEmpty()) {
this.startTextField.setText(loadedYear + "-02-01");
reloadButton.doClick();
return;
} else {
String[] array = date.split("-");
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, loadedYear);
cal.set(Calendar.MONTH, Integer.valueOf(array[1]) - 1);
cal.set(Calendar.DAY_OF_MONTH, Integer.valueOf(array[2]));
cal.add(Calendar.DAY_OF_MONTH, 32);
if (cal.get(Calendar.YEAR) != loadedYear) {
return;
}
this.startTextField.setText(
DateFormats.DATE_TIME_FORMATTER_YYYYMMDD
.format(cal.getTime()));
reloadButton.doClick();
}
});
decreaseEnd.addActionListener(e -> {
if (loadedYear == 0) {
//nothing to do
return;
}
String date = this.endTextField.getText();
if (date.isEmpty()) {
this.endTextField.setText(loadedYear + "-11-30");
reloadButton.doClick();
return;
} else {
String[] array = date.split("-");
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, loadedYear);
cal.set(Calendar.MONTH, Integer.valueOf(array[1]) - 1);
cal.set(Calendar.DAY_OF_MONTH, Integer.valueOf(array[2]));
cal.add(Calendar.DAY_OF_MONTH, -32);
if (cal.get(Calendar.YEAR) != loadedYear) {
return;
}
this.endTextField.setText(
DateFormats.DATE_TIME_FORMATTER_YYYYMMDD
.format(cal.getTime()));
reloadButton.doClick();
}
});
decreaseStart.setBounds(endTextField.getX() + endTextField.getWidth()
+ SwingUtils.MARGIN, endTextField.getY(), 120,
30);
decreaseEnd.setBounds(decreaseStart.getX() + decreaseStart.getWidth()
+ SwingUtils.MARGIN, decreaseStart.getY(), 120,
30);
addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_LEFT: decreaseStart.doClick();break;
case KeyEvent.VK_RIGHT: decreaseEnd.doClick();break;
default:
}
}
@Override
public void keyReleased(KeyEvent e) {
}
});
//
ArrivalChartData acd = new ArrivalChartData(new String[]{}, new double[]{}, 7d, new double[]{}, new double[]{}, new double[]{}, new double[]{}, null, null);
ArrivalChartData acd =
new ArrivalChartData(new String[] {}, new double[] {}, 7d,
new double[] {}, new double[] {}, new double[] {},
new double[] {}, null, null, false, false, false);
this.arrivalChart = new ArrivalChart(acd, 1000);
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
this.chartWidth = (int) screen.getWidth() - 60;
arrivalChart.setBounds(SwingUtils.MARGIN, years.getY() + years.getHeight()+ SwingUtils.MARGIN,
arrivalChart.setBounds(SwingUtils.MARGIN,
years.getY() + years.getHeight() + SwingUtils.MARGIN,
(int) (screen.getWidth() - 50),
400);
add(arrivalChart);
//
this.scrollPane
= new JScrollPane(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setBounds(SwingUtils.MARGIN, arrivalChart.getY() + arrivalChart.getHeight()+ SwingUtils.MARGIN,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollPane.setBounds(SwingUtils.MARGIN,
arrivalChart.getY() + arrivalChart.getHeight()
+ SwingUtils.MARGIN,
(int) (screen.getWidth() - 50),
300);
add(scrollPane);
@ -148,22 +263,29 @@ public class WorkingDaysWindow extends TWindow {
loadYear(year, time);
setSize(scrollPane.getWidth() + 3 * SwingUtils.MARGIN, scrollPane.getY() + scrollPane.getHeight() + 4 * SwingUtils.MARGIN);
setSize(scrollPane.getWidth() + 3 * SwingUtils.MARGIN,
scrollPane.getY() + scrollPane.getHeight()
+ 4 * SwingUtils.MARGIN);
}
public void doReloadButtonClick() {
this.reloadButton.doClick();
}
public void loadYear(int year, Time time) {
public void loadYear(int year, Time time) {
if (this.loadedYear != year) {
this.startTextField.setText("");
this.endTextField.setText("");
}
this.loadedYear = year;
List<WorkingDay> workingDaysList = new ArrayList<>();
Calendar now = time.asCalendar();
final int currentYear = now.get(Calendar.YEAR);
final int currentMonth = now.get(Calendar.MONTH) + 1;
final int currentDay = now.get(Calendar.DAY_OF_MONTH);
// System.out.println("currentYear=" + currentYear);
// System.out.println("currentMonth=" + currentMonth);
// System.out.println("currentDay=" + currentDay);
// System.out.println("currentYear=" + currentYear);
// System.out.println("currentMonth=" + currentMonth);
// System.out.println("currentDay=" + currentDay);
boolean endBeforeYearEnd = false;
for (int month = 1; month <= 12; month++) {
Calendar cal = Calendar.getInstance();
@ -174,14 +296,17 @@ public class WorkingDaysWindow extends TWindow {
WorkingDay wd = workingDayRepository.read(year, month, day);
if (wd == null) {
wd = new WorkingDay(WorkingDay.createId(year, month,day), year, month, day, -1, -1, -1, -1, -1, -1, "Fictive day", true);
wd = new WorkingDay(WorkingDay.createId(year, month, day),
year, month, day, -1, -1, -1, -1, -1, -1,
"Fictive day", true);
}
workingDaysList.add(wd);
// System.out.println("year=" + year);
// System.out.println("month=" + month);
// System.out.println("day=" + day);
if (currentYear == year && currentMonth == month && currentDay == day) {
// System.out.println("year=" + year);
// System.out.println("month=" + month);
// System.out.println("day=" + day);
if (currentYear == year && currentMonth == month
&& currentDay == day) {
endBeforeYearEnd = true;
break;
}
@ -192,7 +317,8 @@ public class WorkingDaysWindow extends TWindow {
}
}
List<WorkingDayForStats> wdfsList = WorkingDayForStats.createList(workingDaysList);
List<WorkingDayForStats> wdfsList =
WorkingDayForStats.createList(workingDaysList);
WorkingDayForStats.fillStatisticsColumns(wdfsList);
List<List<String>> listForArray = new ArrayList<>();
@ -201,7 +327,8 @@ public class WorkingDaysWindow extends TWindow {
listForArray.add(list2);
if (wdfs.isThisDayTimeOff()) {
list2.add(wdfs.getDayOfWeekAsString());
list2.add(wdfs.getDayOfWeek() == 6 || wdfs.getDayOfWeek() == 7 ? YES : NO);
list2.add(wdfs.getDayOfWeek() == 6 || wdfs.getDayOfWeek() == 7 ?
YES : NO);
list2.add(wdfs.getId());
list2.add(THREE_DASHES);
list2.add(THREE_DASHES);
@ -211,27 +338,53 @@ public class WorkingDaysWindow extends TWindow {
list2.add(wdfs.getNote());
list2.add(wdfs.isTimeOff() ? YES : NO);
list2.add(QUESTION_MARK);
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage7Days() - target));
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage14Days() - target));
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage28Days() - target));
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage56Days() - target));
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES
.format(wdfs.getArrivalTimeMovingAverage7Days()
- target));
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES
.format(wdfs.getArrivalTimeMovingAverage14Days()
- target));
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES
.format(wdfs.getArrivalTimeMovingAverage28Days()
- target));
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES
.format(wdfs.getArrivalTimeMovingAverage56Days()
- target));
} else {
list2.add(wdfs.getDayOfWeekAsString());
TTime overtime = new TTime(wdfs.getOvertimeHour(), wdfs.getOvertimeMinute());
list2.add(wdfs.getDayOfWeek() == 6 || wdfs.getDayOfWeek() == 7 ? YES : NO);
TTime overtime = new TTime(wdfs.getOvertimeHour(),
wdfs.getOvertimeMinute());
list2.add(wdfs.getDayOfWeek() == 6 || wdfs.getDayOfWeek() == 7 ?
YES : NO);
list2.add(wdfs.getId());
list2.add(new TTime(wdfs.getArrivalHour(), wdfs.getArrivalMinute()).toString().substring(0, 5) + " (" + NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalAsDouble())+ ")");
list2.add(new TTime(wdfs.getDepartureHour(), wdfs.getDepartureMinute()).toString().substring(0, 5));
list2.add(overtime.toString().substring(0, overtime.isNegative() ? 6 : 5));
list2.add(TTime.ofMinutes(wdfs.getWorkingTimeInMinutes()).toString().substring(0, 5));
list2.add(TTime.ofMinutes(wdfs.getPauseTimeInMinutes()).toString().substring(0, 5));
list2.add(new TTime(wdfs.getArrivalHour(),
wdfs.getArrivalMinute()).toString().substring(0, 5)
+ " (" + NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES
.format(wdfs.getArrivalAsDouble()) + ")");
list2.add(new TTime(wdfs.getDepartureHour(),
wdfs.getDepartureMinute()).toString().substring(0, 5));
list2.add(overtime.toString()
.substring(0, overtime.isNegative() ? 6 : 5));
list2.add(TTime.ofMinutes(wdfs.getWorkingTimeInMinutes())
.toString().substring(0, 5));
list2.add(
TTime.ofMinutes(wdfs.getPauseTimeInMinutes()).toString()
.substring(0, 5));
list2.add(wdfs.getNote());
list2.add(wdfs.isTimeOff() ? YES : NO);
list2.add(QUESTION_MARK);
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage7Days() - target));
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage14Days() - target));
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage28Days() - target));
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES.format(wdfs.getArrivalTimeMovingAverage56Days() - target));
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES
.format(wdfs.getArrivalTimeMovingAverage7Days()
- target));
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES
.format(wdfs.getArrivalTimeMovingAverage14Days()
- target));
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES
.format(wdfs.getArrivalTimeMovingAverage28Days()
- target));
list2.add(NumberFormats.FORMATTER_FIVE_DECIMAL_PLACES
.format(wdfs.getArrivalTimeMovingAverage56Days()
- target));
}
}
@ -245,64 +398,76 @@ public class WorkingDaysWindow extends TWindow {
data[index] = data2;
index++;
}
String[] columns = new String[] {"Day of Week", "Weekend", "Date","Arrival","Departure","Overtime","Working time","Pause time","Note", "Time off", "Total overtime", "Arrival MA7", "Arrival MA14", "Arrival MA28", "Arrival MA56"};
if(table != null) {
String[] columns =
new String[] {"Day of Week", "Weekend", "Date", "Arrival",
"Departure", "Overtime", "Working time", "Pause time",
"Note", "Time off", "Total overtime", "Arrival MA7",
"Arrival MA14", "Arrival MA28", "Arrival MA56"};
if (table != null) {
scrollPane.remove(table);
}
DefaultTableModel model = new DefaultTableModel(data, columns) {
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
};
}
;
};
// class ColorRenderer extends JLabel
// implements TableCellRenderer {
//
// public ColorRenderer() {
// //super.setOpaque(true);
// }
//
// public Component getTableCellRendererComponent(
// JTable table, Object value,
// boolean isSelected, boolean hasFocus,
// int row, int column) {
//
// if (value.equals("SATURDAY")) {
// super.setForeground(Color.red);
// //super.setForeground(Color.black);
//
//
// } else {
// super.setForeground(Color.YELLOW);
// }
// setFont(new Font("Dialog", Font.BOLD, 12));
// return this;
//
// }
// }
// class ColorRenderer extends JLabel
// implements TableCellRenderer {
//
// public ColorRenderer() {
// //super.setOpaque(true);
// }
//
// public Component getTableCellRendererComponent(
// JTable table, Object value,
// boolean isSelected, boolean hasFocus,
// int row, int column) {
//
// if (value.equals("SATURDAY")) {
// super.setForeground(Color.red);
// //super.setForeground(Color.black);
//
//
// } else {
// super.setForeground(Color.YELLOW);
// }
// setFont(new Font("Dialog", Font.BOLD, 12));
// return this;
//
// }
// }
this.table = new JTable(model) {
//
// public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
//
// Component c = super.prepareRenderer(renderer, row, column);
//
// // Alternate row color
// String value = data[row - 1][0];
// System.out.println("v=" + value);
//// if (value.equals("SATURDAY")) {
//// c.setBackground(RED);
//// } else c.setBackground(getBackground());
// c.setBackground(getBackground());
// return c;
// }
//
// public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
//
// Component c = super.prepareRenderer(renderer, row, column);
//
// // Alternate row color
// String value = data[row - 1][0];
// System.out.println("v=" + value);
//// if (value.equals("SATURDAY")) {
//// c.setBackground(RED);
//// } else c.setBackground(getBackground());
// c.setBackground(getBackground());
// return c;
// }
};
scrollPane.setViewportView(table);
table.setBounds(30, 30, 750, 600);
//table.setDefaultRenderer(Object.class, new ColorRenderer());
reloadChart(WorkingDayForStats.toArrivalChartData(wdfsList, 7d, startTextField.getText(), endTextField.getText()));
ArrivalChartData acd = WorkingDayForStats
.toArrivalChartData(wdfsList, 7d, startTextField.getText(),
endTextField.getText());
acd.setMa14Enabled(acd.isMa14Enabled());
acd.setMa28Enabled(acd.isMa28Enabled());
acd.setMa56Enabled(acd.isMa56Enabled());
reloadChart(acd);
}
public void reloadChart(ArrivalChartData newArrivalChartData) {

View File

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