Holidays just colored.

master
Markus Kreth 7 years ago
parent 11aa82e907
commit 2f6cdf1398
  1. 1
      .settings/org.eclipse.core.resources.prefs
  2. 46
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/CalendarComponent.java
  3. 73
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/CalendarCreator.java
  4. 76
      src/main/java/de/kreth/vaadin/clubhelper/vaadinclubhelper/ui/components/CalendarSource.java
  5. 25
      src/main/resources/jasper/calendar_month.jrxml

@ -1,6 +1,7 @@
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/main/resources=UTF-8
encoding//src/main/resources/jasper/calendar_month.jrxml=UTF-8
encoding//src/test/java=UTF-8
encoding//src/test/resources=UTF-8
encoding//target/generated-resources/gwt=UTF-8

@ -10,8 +10,10 @@ import java.time.format.DateTimeFormatter;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@ -100,31 +102,43 @@ public class CalendarComponent extends CustomComponent {
ZonedDateTime start = calendar.getStartDate();
ZonedDateTime end = calendar.getEndDate();
log.debug("exporting Calendar from {} to {}", start, end);
List<ClubEvent> items = dataProvider.getItems(start, end);
Map<Integer, StringBuilder> values = new HashMap<>();
Set<Integer> holidays = new HashSet<>();
for (ClubEvent ev : items) {
StringBuilder content;
int dayOfMonth = ev.getStart().getDayOfMonth();
int endDayOfMonth = ev.getEnd().getDayOfMonth();
for (;dayOfMonth<=endDayOfMonth; dayOfMonth++) {
if (values.containsKey(dayOfMonth)) {
content = values.get(dayOfMonth);
content.append("\n");
} else {
content = new StringBuilder();
values.put(dayOfMonth, content);
String calendarName = ev.getOrganizerDisplayName();
if ("Schulferien".equals(calendarName)) {
int endDayOfMonth = ev.getEnd().getDayOfMonth();
for (int dayOfMonth = ev.getStart().getDayOfMonth(); dayOfMonth<=endDayOfMonth; dayOfMonth++) {
holidays.add(dayOfMonth);
}
} else {
StringBuilder content;
int dayOfMonth = ev.getStart().getDayOfMonth();
int endDayOfMonth = ev.getEnd().getDayOfMonth();
for (;dayOfMonth<=endDayOfMonth; dayOfMonth++) {
if (values.containsKey(dayOfMonth)) {
content = values.get(dayOfMonth);
content.append("\n");
} else {
content = new StringBuilder();
values.put(dayOfMonth, content);
}
content.append(ev.getCaption());
}
content.append(ev.getCaption());
}
}
try {
JasperPrint print = CalendarCreator.createCalendar(new Date(start.toInstant().toEpochMilli()), values);
JasperPrint print = CalendarCreator.createCalendar(new Date(start.toInstant().toEpochMilli()), values, holidays);
Window window = new Window();
window.setCaption("View PDF");
AbstractComponent e = createEmbedded(print);
AbstractComponent e = createEmbedded(dfMonth.format(start), print);
window.setContent(e);
window.setModal(true);
window.setWidth("50%");
@ -139,12 +153,12 @@ public class CalendarComponent extends CustomComponent {
}
}
private AbstractComponent createEmbedded(JasperPrint print) throws IOException, JRException {
private AbstractComponent createEmbedded(String title, JasperPrint print) throws IOException, JRException {
PipedInputStream in = new PipedInputStream();
final PipedOutputStream out = new PipedOutputStream(in);
final StreamResource resource = new StreamResource(() -> in, "invoice.pdf");
final StreamResource resource = new StreamResource(() -> in, title);
resource.setMIMEType("application/pdf");
BrowserFrame c = new BrowserFrame("PDF invoice", resource);

@ -4,19 +4,17 @@ import java.io.InputStream;
import java.sql.Timestamp;
import java.time.YearMonth;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
@ -28,11 +26,11 @@ public class CalendarCreator {
private final YearMonth yearMonthObject;
public static JasperPrint createCalendar(Date date) throws JRException {
return new CalendarCreator(date).createCalendar(Collections.emptyMap());
return new CalendarCreator(date).createCalendar(Collections.emptyMap(), Collections.emptyList());
}
public static <T extends CharSequence> JasperPrint createCalendar(Date date, Map<Integer, T> values) throws JRException {
return new CalendarCreator(date).createCalendar(values);
public static <T extends CharSequence> JasperPrint createCalendar(Date date, Map<Integer, T> values, Collection<Integer> holidays) throws JRException {
return new CalendarCreator(date).createCalendar(values, holidays);
}
CalendarCreator(Date date) {
@ -44,7 +42,7 @@ public class CalendarCreator {
}
<T extends CharSequence> JasperPrint createCalendar(Map<Integer, T> values) throws JRException {
<T extends CharSequence> JasperPrint createCalendar(Map<Integer, T> values, Collection<Integer> holidays) throws JRException {
Map<String, Object> parameters = new HashMap<>();
Timestamp timestamp = new Timestamp(yearMonthObject.atDay(1).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
@ -56,69 +54,22 @@ public class CalendarCreator {
.compileReport(jrxmlResource);
JasperPrint print = JasperFillManager.fillReport(report,
parameters, new CalendarSource<>(yearMonthObject, values));
parameters, new CalendarSource<>(yearMonthObject, values, holidays));
return print;
}
private static class CalendarSource<T extends CharSequence> implements JRDataSource {
private final List<Integer> days;
private final Map<Integer, T> dayContent;
private int index = -1;
private int prefix;
public CalendarSource(YearMonth yearMonthObject, Map<Integer, T> dayContent) {
days = new ArrayList<>();
this.dayContent = dayContent;
prefix = yearMonthObject.atDay(1).getDayOfWeek().getValue() -1;
int daysInMonth = yearMonthObject.lengthOfMonth();
for (int i=0, limit = daysInMonth + prefix; i<limit; i++) {
days.add(i+1);
}
}
@Override
public boolean next() throws JRException {
if (index+1>=days.size()) {
return false;
}
index++;
return true;
}
@Override
public Object getFieldValue(JRField jrField) throws JRException {
if (jrField.getName().equals("id")) {
return days.get(index);
} else if (jrField.getName().equals("Field_Value") && days.get(index)>0) {
T content = dayContent.get(index - prefix);
if (content != null) {
return content.toString();
} else {
return "";
}
} else {
return "";
}
}
}
public static void main(String[] args) throws JRException {
Locale.setDefault(Locale.GERMANY);
Calendar cal = new GregorianCalendar(2018, Calendar.OCTOBER, 1);
JasperViewer v1 = new JasperViewer(createCalendar(cal.getTime()));
Calendar cal = new GregorianCalendar(2018, Calendar.AUGUST, 1);
JasperViewer v1 = new JasperViewer(createCalendar(cal.getTime(), Collections.emptyMap(), Arrays.asList(2,3,4,5,6)));
v1.setVisible(true);
cal = new GregorianCalendar(2018, Calendar.FEBRUARY, 1);
JasperViewer v3 = new JasperViewer(createCalendar(cal.getTime()));
v3.setVisible(true);
// cal = new GregorianCalendar(2018, Calendar.FEBRUARY, 1);
// JasperViewer v3 = new JasperViewer(createCalendar(cal.getTime()));
// v3.setVisible(true);
}
/**

@ -0,0 +1,76 @@
package de.kreth.vaadin.clubhelper.vaadinclubhelper.ui.components;
import java.time.YearMonth;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;
public class CalendarSource<T extends CharSequence> implements JRDataSource {
private final List<Integer> days;
private final Map<Integer, T> dayContent;
private int index = -1;
private int prefix;
private final Collection<Integer> holidays;
public CalendarSource(YearMonth yearMonthObject, Map<Integer, T> dayContent, Collection<Integer> holidays) {
days = new ArrayList<>();
this.dayContent = dayContent;
this.holidays = holidays;
prefix = yearMonthObject.atDay(1).getDayOfWeek().getValue() -1;
int daysInMonth = yearMonthObject.lengthOfMonth();
for (int i=0, limit = daysInMonth + prefix; i<limit; i++) {
days.add(i+1);
}
}
@Override
public boolean next() throws JRException {
if (index+1>=days.size()) {
return false;
}
index++;
return true;
}
@Override
public Object getFieldValue(JRField jrField) throws JRException {
switch (jrField.getName()) {
case "id":
return days.get(index);
case "Field_Value":
T content = dayContent.get(index - prefix);
if (content != null && days.get(index)>0) {
return content.toString();
} else {
return "";
}
case "IsHoliday":
return holidays.contains(index);
default:
return "";
}
}
public static CalendarSource<String> createTestSource() {
Map<Integer, String> values = new HashMap<>();
for (int i=1; i<30;i+=3) {
values.put(i, String.format("Termin am %s.", i));
}
List<Integer> holi = Arrays.asList(2,3,4,5,6);
return new CalendarSource<>(YearMonth.now(), values, holi );
}
}

@ -2,13 +2,17 @@
<!-- Created with Jaspersoft Studio version 6.6.0.final using JasperReports Library version 6.6.0 -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="clubhelper_calendar" columnCount="7" printOrder="Horizontal" pageWidth="792" pageHeight="612" orientation="Landscape" whenNoDataType="AllSectionsNoDetail" columnWidth="110" leftMargin="11" rightMargin="11" topMargin="6" bottomMargin="6" uuid="32abf871-39b8-4cc7-b03c-d950a55e2bfb">
<property name="com.jaspersoft.studio.data.sql.tables" value=""/>
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="JRSrepo"/>
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="CalendarSource"/>
<property name="com.jaspersoft.studio.unit." value="pixel"/>
<style name="Style1" forecolor="#050505">
<style name="Style1" forecolor="#050505" backcolor="#FFFFFF">
<conditionalStyle>
<conditionExpression><![CDATA[$F{id}.intValue()%7==0]]></conditionExpression>
<style forecolor="#FA0702"/>
</conditionalStyle>
<conditionalStyle>
<conditionExpression><![CDATA[$F{IsHoliday}]]></conditionExpression>
<style backcolor="#FFFFCC"/>
</conditionalStyle>
</style>
<parameter name="Date" class="java.sql.Timestamp">
<defaultValueExpression><![CDATA[new Date()]]></defaultValueExpression>
@ -36,6 +40,9 @@
</queryString>
<field name="id" class="java.lang.Integer"/>
<field name="Field_Value" class="java.lang.String"/>
<field name="IsHoliday" class="java.lang.Boolean">
<fieldDescription><![CDATA[Current Day is a holiday]]></fieldDescription>
</field>
<variable name="Date" class="java.lang.Integer">
<variableExpression><![CDATA[$F{id}.intValue()-$P{DOW}.intValue()+1]]></variableExpression>
</variable>
@ -163,14 +170,8 @@
<property name="com.jaspersoft.studio.unit.y" value="pixel"/>
<property name="com.jaspersoft.studio.unit.width" value="pixel"/>
</reportElement>
<box>
<topPen lineWidth="1.0" lineStyle="Solid"/>
<leftPen lineWidth="1.0" lineStyle="Solid"/>
<bottomPen lineWidth="1.0" lineStyle="Solid"/>
<rightPen lineWidth="1.0" lineStyle="Solid"/>
</box>
<textField>
<reportElement style="Style1" mode="Transparent" x="80" y="0" width="30" height="21" isRemoveLineWhenBlank="true" backcolor="#C6EDBB" uuid="733ff549-0109-4f55-b9de-476f0ad9fbeb">
<reportElement style="Style1" mode="Opaque" x="80" y="0" width="30" height="21" isRemoveLineWhenBlank="true" uuid="733ff549-0109-4f55-b9de-476f0ad9fbeb">
<printWhenExpression><![CDATA[$V{Date}.intValue()>0&&$V{Date}.intValue()<=$P{Days}.intValue()]]></printWhenExpression>
</reportElement>
<box>
@ -189,6 +190,12 @@
<reportElement x="0" y="21" width="110" height="69" isRemoveLineWhenBlank="true" uuid="52fccbc5-19e8-40be-b02c-3d23afa55a7d">
<printWhenExpression><![CDATA[$V{Date}.intValue()>0&&$V{Date}.intValue()<=$P{Days}.intValue()]]></printWhenExpression>
</reportElement>
<box>
<topPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
<leftPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
<bottomPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
<rightPen lineWidth="0.0" lineStyle="Solid" lineColor="#000000"/>
</box>
<textFieldExpression><![CDATA[$F{Field_Value}]]></textFieldExpression>
</textField>
</frame>

Loading…
Cancel
Save