Java tutorial
/* * Copyright (c) 2011-2015 Marat Gubaidullin. * * This file is part of HYBRIDBPM. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. * */ package com.hybridbpm.ui.view; import com.hybridbpm.core.data.access.Permission; import com.hybridbpm.ui.component.TableButtonBar; import com.hybridbpm.core.data.document.Document; import com.hybridbpm.core.util.DashboardConstant; import com.hybridbpm.ui.HybridbpmUI; import com.hybridbpm.ui.component.ConfigureWindow; import com.hybridbpm.ui.component.TableButton; import com.hybridbpm.ui.component.bpm.DateColumnGenerator; import com.hybridbpm.ui.component.document.DocumentBreadcrumbButton; import com.hybridbpm.ui.component.document.DocumentFormLayout; import com.hybridbpm.ui.component.document.DocumentLayout; import com.hybridbpm.ui.component.document.DocumentColumnGenerator; import com.hybridbpm.ui.util.Translate; import com.vaadin.annotations.DesignRoot; import com.vaadin.data.Item; import com.vaadin.navigator.View; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.server.FontAwesome; import com.vaadin.server.Responsive; import com.vaadin.shared.ui.MarginInfo; import com.vaadin.ui.Button; import com.vaadin.ui.Component; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Panel; import com.vaadin.ui.TabSheet; import com.vaadin.ui.TabSheet.Tab; import com.vaadin.ui.Table; import com.vaadin.ui.TextField; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; import com.vaadin.ui.declarative.Design; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Objects; import org.vaadin.dialogs.ConfirmDialog; @DesignRoot @SuppressWarnings("serial") public final class DocumentView extends AbstractView implements View, Button.ClickListener, Window.CloseListener, TabSheet.SelectedTabChangeListener { public static final String VIEW_URL = DashboardConstant.VIEW_URL_DOCUMENT; public static final String TITLE = Translate.getMessage("titleDocuments"); public static final String ICON = FontAwesome.FILES_O.name(); public static final Integer ORDER = Integer.MAX_VALUE - 1; private VerticalLayout panelLayout; private TabSheet tabSheet; private VerticalLayout documentsLayout; private HorizontalLayout breadcrumbs; private TextField textFieldSearch; private Button btnSearch; private Button btnAddFolder; private Button btnAddFile; private Button btnRefresh; private Table documentTable; private Document parent; private String parentId; public DocumentView() { Design.read(this); tabSheet.getTab(documentsLayout).setCaption(Translate.getMessage("Documents")); btnSearch.setCaption(Translate.getMessage("btnSearch")); btnRefresh.setCaption(Translate.getMessage("btnRefresh")); btnAddFile.setCaption(Translate.getMessage("btnAddFile")); btnAddFolder.setCaption(Translate.getMessage("btnAddFolder")); textFieldSearch.setCaption(Translate.getMessage("textFieldSearch")); Responsive.makeResponsive(panelLayout); btnAddFolder.setIcon(FontAwesome.FOLDER_O); btnAddFolder.addClickListener(this); btnAddFile.setIcon(FontAwesome.FILE_O); btnAddFile.addClickListener(this); btnRefresh.setIcon(FontAwesome.REFRESH); btnRefresh.addClickListener(this); textFieldSearch.setIcon(FontAwesome.SEARCH); documentsLayout.setMargin(new MarginInfo(true, false, false, false)); documentsLayout.setExpandRatio(documentTable, 1f); documentTable.addContainerProperty("name", String.class, null, Translate.getMessage("tableDocumentsName"), null, Table.Align.LEFT); documentTable.setColumnExpandRatio("name", 1f); documentTable.addContainerProperty("description", String.class, null, Translate.getMessage("tableDocumentsTitle"), null, Table.Align.LEFT); documentTable.addContainerProperty("creator", String.class, null, Translate.getMessage("tableDocumentsCreator"), null, Table.Align.LEFT); documentTable.addContainerProperty("createDate", Date.class, null, Translate.getMessage("tableDocumentsCreateDate"), null, Table.Align.LEFT); documentTable.addContainerProperty("updateDate", Date.class, null, Translate.getMessage("tableDocumentsUpdateDate"), null, Table.Align.LEFT); documentTable.addContainerProperty("actions", TableButtonBar.class, null, Translate.getMessage("tableDocumentsActions"), null, Table.Align.LEFT); documentTable.setColumnWidth("createDate", 150); documentTable.setColumnWidth("updateDate", 150); documentTable.setColumnWidth("actions", 55); documentTable.addGeneratedColumn("name", new DocumentColumnGenerator(this)); documentTable.addGeneratedColumn("createDate", new DateColumnGenerator()); documentTable.addGeneratedColumn("updateDate", new DateColumnGenerator()); documentTable.setVisibleColumns("name", "description", "creator", "createDate", "updateDate", "actions"); tabSheet.addSelectedTabChangeListener(this); } @Override public void enter(ViewChangeEvent event) { if (event.getParameters() != null && !event.getParameters().trim().isEmpty()) { openDocumentTab(event.getParameters()); } else if (documentTable.getItemIds().isEmpty()) { parentId = null; refreshData(); } } private void refreshData() { checkBreadcrumbs(); checkButtonBar(); documentTable.removeAllItems(); Map<Document, List<Permission.PERMISSION>> documents = HybridbpmUI.getDocumentAPI() .getMyDocuments(parentId); for (Document document : documents.keySet()) { List<Permission.PERMISSION> perms = documents.get(document); addDocumentToTable(document, null, perms); } documentTable.sort(new Object[] { "name" }, new boolean[] { true }); } private void checkBreadcrumbs() { if (parentId != null) { parent = HybridbpmUI.getDocumentAPI().getDocumentById(parentId, false); List<Document> parents = HybridbpmUI.getDocumentAPI().getMyDocumentBreadcumbs(parentId); breadcrumbs.setVisible(true); breadcrumbs.removeAllComponents(); breadcrumbs.addComponents(new DocumentBreadcrumbButton(null, this)); for (Document document : parents) { breadcrumbs.addComponent(new DocumentBreadcrumbButton(document, this)); } } else { breadcrumbs.setVisible(false); } } private void checkButtonBar() { if (parent == null) { if (HybridbpmUI.getAccessAPI().isAdministrator()) { btnAddFolder.setVisible(true); btnAddFile.setVisible(false); } else { btnAddFolder.setVisible(false); btnAddFile.setVisible(false); } } else { btnAddFile.setVisible(false); btnAddFolder.setVisible(false); List<Permission.PERMISSION> permissions = HybridbpmUI.getDocumentAPI() .getMyDocumentPermissions(parentId); if (permissions.contains(Permission.PERMISSION.ADD_FILE)) { btnAddFile.setVisible(true); } if (permissions.contains(Permission.PERMISSION.ADD_FOLDER)) { btnAddFolder.setVisible(true); } } } private void addDocumentToTable(Document document, Document parent, List<Permission.PERMISSION> permissions) { Item item = documentTable.addItem(document); item.getItemProperty("name").setValue(document.getName()); item.getItemProperty("description") .setValue(document.getDescription().getValue(HybridbpmUI.getCurrent().getLocale())); item.getItemProperty("creator").setValue(document.getCreator()); item.getItemProperty("createDate").setValue(document.getCreateDate()); item.getItemProperty("updateDate").setValue(document.getUpdateDate()); item.getItemProperty("actions").setValue(getTableButtonBar(document, permissions)); } @Override public void buttonClick(final Button.ClickEvent event) { if (event.getButton().equals(btnAddFolder)) { addFolder(); } else if (event.getButton().equals(btnAddFile)) { addFile(); } else if (event.getButton().equals(btnRefresh)) { refreshData(); } else if (event.getButton().getData() != null && event.getButton().getData() instanceof Document) { Document document = (Document) event.getButton().getData(); parentId = document.getId().toString(); refreshData(); } else if (event.getButton() instanceof DocumentBreadcrumbButton) { Document document = ((DocumentBreadcrumbButton) event.getButton()).getDocument(); parentId = document != null ? document.getId().toString() : null; refreshData(); } else if (event.getButton() instanceof TableButton && ((TableButton) event.getButton()).getType().equals(TableButton.TYPE.EDIT)) { Document document = ((TableButton<Document>) event.getButton()).getCustomData(); openDocumentTab(document.getId().toString()); } else if (event.getButton() instanceof TableButton && ((TableButton) event.getButton()).getType().equals(TableButton.TYPE.DELETE)) { ConfirmDialog.show(UI.getCurrent(), Translate.getMessage("windowTitleConfirm"), Translate.getMessage("deleteFileQuestion"), Translate.getMessage("btnOK"), Translate.getMessage("btnCancel"), (ConfirmDialog dialog) -> { if (dialog.isConfirmed()) { Document document = ((TableButton<Document>) event.getButton()).getCustomData(); HybridbpmUI.getDocumentAPI().removeDocument(document.getId().toString()); documentTable.removeItem(document); } }); } } private void openDocumentTab(String documentId) { Tab tab = getTab(documentId); if (tab == null) { if (HybridbpmUI.getDocumentAPI().getMyDocumentPermissions(documentId) .contains(Permission.PERMISSION.VIEW)) { tab = tabSheet.addTab(new DocumentLayout(documentId)); tab.setClosable(true); tabSheet.setSelectedTab(tab); } } else { tabSheet.setSelectedTab(tab); } } private Tab getTab(String documentId) { for (Component component : tabSheet) { if (component instanceof DocumentLayout && Objects.equals(((DocumentLayout) component).getDocumentId(), documentId)) { return tabSheet.getTab(component); } } return null; } @Override public void windowClose(Window.CloseEvent e) { refreshData(); } private Object getTableButtonBar(Document document, List<Permission.PERMISSION> permissions) { TableButtonBar buttonBar = new TableButtonBar(); if (permissions.contains(Permission.PERMISSION.EDIT)) { buttonBar.addComponent(TableButton.createEdit(document, this)); } if (permissions.contains(Permission.PERMISSION.DELETE)) { buttonBar.addComponent(TableButton.createDelete(document, this)); } return buttonBar; } public void addFolder() { final DocumentFormLayout documentFormLayout = new DocumentFormLayout(); documentFormLayout.initUI(Document.createFolder(parent)); final ConfigureWindow configureWindow = new ConfigureWindow(documentFormLayout, Translate.getMessage("windowNewFolder")); Button.ClickListener clickListener = new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { if (event.getButton().equals(configureWindow.btnClose)) { } else if (event.getButton().equals(configureWindow.btnOk)) { documentFormLayout.save(); } configureWindow.close(); } }; configureWindow.setClickListener(clickListener); configureWindow.addCloseListener(this); HybridbpmUI.getCurrent().addWindow(configureWindow); } public void addFile() { final DocumentFormLayout documentFormLayout = new DocumentFormLayout(); documentFormLayout.initUI(Document.createFile(parent)); final ConfigureWindow configureWindow = new ConfigureWindow(documentFormLayout, Translate.getMessage("windowNewFile")); Button.ClickListener clickListener = new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { if (event.getButton().equals(configureWindow.btnClose)) { } else if (event.getButton().equals(configureWindow.btnOk)) { documentFormLayout.save(); } configureWindow.close(); } }; configureWindow.setClickListener(clickListener); configureWindow.addCloseListener(this); HybridbpmUI.getCurrent().addWindow(configureWindow); } @Override public void selectedTabChange(TabSheet.SelectedTabChangeEvent event) { if (event.getTabSheet().getSelectedTab().equals(documentsLayout)) { HybridbpmUI.getCurrent().getHybridbpmNavigator().navigateTo(DocumentView.VIEW_URL); } else if (event.getTabSheet().getSelectedTab() instanceof DocumentLayout) { HybridbpmUI.getCurrent().getHybridbpmNavigator().navigateTo(DocumentView.VIEW_URL + "/" + ((DocumentLayout) event.getTabSheet().getSelectedTab()).getDocumentId()); } } }