use of io.jmix.ui.download.Downloader in project jmix by jmix-framework.
the class ExcelExporter method exportDataGrid.
@Override
public void exportDataGrid(Downloader downloader, DataGrid<Object> dataGrid, ExportMode exportMode) {
if (downloader == null) {
throw new IllegalArgumentException("Downloader is null");
}
createWorkbookWithSheet();
createFonts();
createFormats();
List<DataGrid.Column<Object>> columns = dataGrid.getColumns();
int r = 0;
Row row = sheet.createRow(r);
createAutoColumnSizers(columns.size());
float maxHeight = sheet.getDefaultRowHeightInPoints();
CellStyle headerCellStyle = wb.createCellStyle();
headerCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
for (DataGrid.Column column : columns) {
String caption = column.getCaption();
int countOfReturnSymbols = StringUtils.countMatches(caption, "\n");
if (countOfReturnSymbols > 0) {
maxHeight = Math.max(maxHeight, (countOfReturnSymbols + 1) * sheet.getDefaultRowHeightInPoints());
headerCellStyle.setWrapText(true);
}
}
row.setHeightInPoints(maxHeight);
for (int c = 0; c < columns.size(); c++) {
DataGrid.Column column = columns.get(c);
String caption = column.getCaption();
Cell cell = row.createCell(c);
RichTextString richTextString = createStringCellValue(caption);
richTextString.applyFont(boldFont);
cell.setCellValue(richTextString);
ExcelAutoColumnSizer sizer = new ExcelAutoColumnSizer();
sizer.notifyCellValue(caption, boldFont);
sizers[c] = sizer;
cell.setCellStyle(headerCellStyle);
}
EntityDataGridItems<Object> dataGridSource = (EntityDataGridItems) dataGrid.getItems();
if (dataGridSource == null) {
throw new IllegalStateException("DataGrid is not bound to data");
}
if (exportMode == ExportMode.SELECTED && dataGrid.getSelected().size() > 0) {
Set<Object> selected = dataGrid.getSelected();
List<Object> ordered = dataGridSource.getItems().filter(selected::contains).collect(Collectors.toList());
for (Object item : ordered) {
if (checkIsRowNumberExceed(r)) {
break;
}
createDataGridRow(dataGrid, columns, 0, ++r, Id.of(item).getValue());
}
} else {
if (dataGrid instanceof TreeDataGrid) {
TreeDataGrid treeDataGrid = (TreeDataGrid) dataGrid;
TreeDataGridItems<Object> treeDataGridItems = (TreeDataGridItems) dataGridSource;
List<Object> items = treeDataGridItems.getChildren(null).collect(Collectors.toList());
for (Object item : items) {
if (checkIsRowNumberExceed(r)) {
break;
}
r = createDataGridHierarchicalRow(treeDataGrid, treeDataGridItems, columns, 0, r, item);
}
} else {
for (Object itemId : dataGridSource.getItems().map(entity -> Id.of(entity).getValue()).collect(Collectors.toList())) {
if (checkIsRowNumberExceed(r)) {
break;
}
createDataGridRow(dataGrid, columns, 0, ++r, itemId);
}
}
}
for (int c = 0; c < columns.size(); c++) {
sheet.setColumnWidth(c, sizers[c].getWidth() * COL_WIDTH_MAGIC);
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
wb.write(out);
} catch (IOException e) {
throw new RuntimeException("Unable to write document", e);
}
ByteArrayDataProvider dataProvider = new ByteArrayDataProvider(out.toByteArray(), uiProperties.getSaveExportedByteArrayDataThresholdBytes(), coreProperties.getTempDir());
switch(exportFormat) {
case XLSX:
downloader.download(dataProvider, getFileName(dataGrid) + "." + XLSX.getFileExt(), XLSX);
break;
case XLS:
downloader.download(dataProvider, getFileName(dataGrid) + "." + XLS.getFileExt(), XLS);
break;
}
}
use of io.jmix.ui.download.Downloader in project jmix by jmix-framework.
the class ExcelExporter method exportTable.
@Override
public void exportTable(Downloader downloader, Table<Object> table, ExportMode exportMode) {
if (downloader == null) {
throw new IllegalArgumentException("Downloader is null");
}
if (table.getItems() == null) {
throw new IllegalStateException("Table items should not be null");
}
@SuppressWarnings("unchecked") List<Table.Column<Object>> columns = Collections.unmodifiableList(table.getNotCollapsedColumns()).stream().map(c -> (Table.Column<Object>) c).collect(Collectors.toList());
createWorkbookWithSheet();
createFonts();
createFormats();
int r = 0;
Row row = sheet.createRow(r);
createAutoColumnSizers(columns.size());
float maxHeight = sheet.getDefaultRowHeightInPoints();
CellStyle headerCellStyle = wb.createCellStyle();
headerCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
for (Table.Column<Object> column : columns) {
String caption = column.getCaption();
int countOfReturnSymbols = StringUtils.countMatches(caption, "\n");
if (countOfReturnSymbols > 0) {
maxHeight = Math.max(maxHeight, (countOfReturnSymbols + 1) * sheet.getDefaultRowHeightInPoints());
headerCellStyle.setWrapText(true);
}
}
row.setHeightInPoints(maxHeight);
for (int c = 0; c < columns.size(); c++) {
Table.Column<Object> column = columns.get(c);
String caption = column.getCaption();
Cell cell = row.createCell(c);
RichTextString richTextString = createStringCellValue(caption);
richTextString.applyFont(boldFont);
cell.setCellValue(richTextString);
ExcelAutoColumnSizer sizer = new ExcelAutoColumnSizer();
sizer.notifyCellValue(caption, boldFont);
sizers[c] = sizer;
cell.setCellStyle(headerCellStyle);
}
TableItems<Object> tableItems = table.getItems();
if (exportMode == ExportMode.SELECTED && table.getSelected().size() > 0) {
Set<Object> selected = table.getSelected();
List<Object> ordered = tableItems.getItemIds().stream().map(tableItems::getItem).filter(selected::contains).collect(Collectors.toList());
for (Object item : ordered) {
if (checkIsRowNumberExceed(r)) {
break;
}
createRow(table, columns, 0, ++r, Id.of(item).getValue());
}
} else {
if (table.isAggregatable() && exportAggregation && hasAggregatableColumn(table)) {
if (table.getAggregationStyle() == Table.AggregationStyle.TOP) {
r = createAggregatableRow(table, columns, ++r, 1);
}
}
if (table instanceof TreeTable) {
TreeTable<Object> treeTable = (TreeTable<Object>) table;
TreeTableItems<Object> treeTableSource = (TreeTableItems<Object>) treeTable.getItems();
if (treeTableSource != null) {
for (Object itemId : treeTableSource.getRootItemIds()) {
if (checkIsRowNumberExceed(r)) {
break;
}
r = createHierarchicalRow(treeTable, columns, exportExpanded, r, itemId);
}
}
} else if (table instanceof GroupTable && tableItems instanceof GroupTableItems && ((GroupTableItems<Object>) tableItems).hasGroups()) {
GroupTableItems<Object> groupTableSource = (GroupTableItems<Object>) tableItems;
for (Object item : groupTableSource.rootGroups()) {
if (checkIsRowNumberExceed(r)) {
break;
}
r = createGroupRow((GroupTable<Object>) table, columns, ++r, (GroupInfo<?>) item, 0);
}
} else {
if (tableItems != null) {
for (Object itemId : tableItems.getItemIds()) {
if (checkIsRowNumberExceed(r)) {
break;
}
createRow(table, columns, 0, ++r, itemId);
}
}
}
if (table.isAggregatable() && exportAggregation && hasAggregatableColumn(table)) {
if (table.getAggregationStyle() == Table.AggregationStyle.BOTTOM) {
r = createAggregatableRow(table, columns, ++r, 1);
}
}
}
for (int c = 0; c < columns.size(); c++) {
sheet.setColumnWidth(c, sizers[c].getWidth() * COL_WIDTH_MAGIC);
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
wb.write(out);
} catch (IOException e) {
throw new RuntimeException("Unable to write document", e);
}
if (isXlsMaxRowNumberExceeded()) {
Notifications notifications = ComponentsHelper.getScreenContext(table).getNotifications();
notifications.create(Notifications.NotificationType.WARNING).withCaption(messages.getMessage("actions.warningExport.title")).withDescription(messages.getMessage("actions.warningExport.message")).show();
}
ByteArrayDataProvider dataProvider = new ByteArrayDataProvider(out.toByteArray(), uiProperties.getSaveExportedByteArrayDataThresholdBytes(), coreProperties.getTempDir());
switch(exportFormat) {
case XLSX:
downloader.download(dataProvider, getFileName(table) + ".xlsx", XLSX);
break;
case XLS:
downloader.download(dataProvider, getFileName(table) + ".xls", XLS);
break;
}
}
use of io.jmix.ui.download.Downloader in project jmix by jmix-framework.
the class UiControllerDependencyInjector method getInjectedInstance.
@Nullable
protected Object getInjectedInstance(Class<?> type, String name, InjectElement injectElement, FrameOwner frameOwner, ScreenOptions options) {
AnnotatedElement element = injectElement.getElement();
Class annotationClass = injectElement.getAnnotationClass();
Frame frame = UiControllerUtils.getFrame(frameOwner);
if (annotationClass == WindowParam.class) {
if (options instanceof MapScreenOptions) {
return ((MapScreenOptions) options).getParams().get(name);
}
// Injecting a parameter
return null;
} else if (ScreenFragment.class.isAssignableFrom(type)) {
// Injecting inner fragment controller
Component fragment = frame.getComponent(name);
if (fragment == null) {
return null;
}
return ((Fragment) fragment).getFrameOwner();
} else if (Component.class.isAssignableFrom(type)) {
// / if legacy frame - inject controller
Component component = frame.getComponent(name);
if (component instanceof Fragment) {
ScreenFragment fragmentFrameOwner = ((Fragment) component).getFrameOwner();
if (type.isAssignableFrom(fragmentFrameOwner.getClass())) {
return fragmentFrameOwner;
}
}
// Injecting a UI component
return component;
} else if (InstanceContainer.class.isAssignableFrom(type)) {
// Injecting a container
ScreenData data = getScreenData(frameOwner);
return data.getContainer(name);
} else if (DataLoader.class.isAssignableFrom(type)) {
// Injecting a loader
ScreenData data = getScreenData(frameOwner);
return data.getLoader(name);
} else if (DataContext.class.isAssignableFrom(type)) {
// Injecting the data context
ScreenData data = getScreenData(frameOwner);
return data.getDataContext();
} else if (FrameContext.class.isAssignableFrom(type)) {
// Injecting the FrameContext
return frame.getContext();
} else if (Action.class.isAssignableFrom(type)) {
// Injecting an action
return ComponentsHelper.findAction(name, frame);
} else if (Facet.class.isAssignableFrom(type)) {
// Injecting non-visual component
String[] elements = ValuePathHelper.parse(name);
if (elements.length == 1) {
return frame.getFacet(name);
}
String prefix = pathPrefix(elements);
Component component = frame.getComponent(prefix);
if (component == null) {
return null;
}
if (!(component instanceof Fragment)) {
throw new UnsupportedOperationException(String.format("Unable to inject facet with id %s and type %s. Component %s is not a fragment", name, type, prefix));
}
String facetId = elements[elements.length - 1];
return ((Fragment) component).getFacet(facetId);
} else if (Downloader.class.isAssignableFrom(type)) {
// Injecting a Downloader
return applicationContext.getBean(Downloader.class);
} else if (MessageBundle.class == type) {
return createMessageBundle(element, frameOwner, frame);
} else if (ThemeConstants.class == type) {
// Injecting a Theme
ThemeConstantsManager themeManager = applicationContext.getBean(ThemeConstantsManager.class);
return themeManager.getConstants();
} else if (BeanFactory.class.isAssignableFrom(type)) {
return applicationContext;
} else if (ObjectProvider.class.isAssignableFrom(type)) {
if (!(element instanceof Field && ((Field) element).getGenericType() instanceof ParameterizedType) && !(element instanceof Method && ((Method) element).getGenericParameterTypes().length > 0 && ((Method) element).getGenericParameterTypes()[0] instanceof ParameterizedType)) {
throw new UnsupportedOperationException("Unable to inject ObjectProvider without generic parameter");
}
Type genericType;
if (element instanceof Field) {
genericType = ((ParameterizedType) ((Field) element).getGenericType()).getActualTypeArguments()[0];
} else {
genericType = ((ParameterizedType) ((Method) element).getGenericParameterTypes()[0]).getActualTypeArguments()[0];
}
if (genericType instanceof ParameterizedType) {
genericType = ((ParameterizedType) genericType).getRawType();
}
return applicationContext.getBeanProvider((Class<?>) genericType);
} else if (ActionsAwareDialogFacet.DialogAction.class.isAssignableFrom(type)) {
// facet's action
Facet facet;
String actionId;
String[] path = ValuePathHelper.parse(name);
if (path.length == 2) {
facet = frame.getFacet(path[0]);
actionId = path[1];
} else {
String prefix = ValuePathHelper.pathPrefix(path, 2);
Component component = frame.getComponent(prefix);
if (component == null) {
return null;
}
if (!(component instanceof Fragment)) {
throw new UnsupportedOperationException(String.format("Unable to inject dialog action with id '%s'. Component '%s' is not a fragment", name, prefix));
}
actionId = path[path.length - 1];
facet = ((Fragment) component).getFacet(path[path.length - 2]);
}
if (!(facet instanceof ActionsAwareDialogFacet)) {
return null;
}
// noinspection unchecked
Collection<ActionsAwareDialogFacet.DialogAction<Facet>> actions = ((ActionsAwareDialogFacet<Facet>) facet).getActions();
if (CollectionUtils.isNotEmpty(actions)) {
return actions.stream().filter(action -> action.getId().equals(actionId)).findFirst().orElse(null);
}
} else {
Object instance;
// Try to find a Spring bean
Map<String, ?> beans = applicationContext.getBeansOfType(type);
if (!beans.isEmpty()) {
instance = beans.get(name);
// If a bean with required name found, return it
if (instance != null) {
return instance;
} else {
// Otherwise get a bean from the context again to respect @Primary annotation
return applicationContext.getBean(type);
}
}
}
return null;
}
Aggregations