Added several improvements, changes and bug fixes
This commit is contained in:
parent
46130d1855
commit
abc622290c
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -23,4 +23,5 @@ public class ArrivalChartData {
|
||||
private double[] ma56;
|
||||
private String startDate;
|
||||
private String endDate;
|
||||
private boolean ma14Enabled = true, ma28Enabled = true, ma56Enabled = true;
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user