com.hybridbpm.ui.component.dashboard.panel.DashboardPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.hybridbpm.ui.component.dashboard.panel.DashboardPanel.java

Source

/*
 * 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.component.dashboard.panel;

import com.hybridbpm.core.data.chart.DbResponse;
import com.hybridbpm.core.data.chart.DiagrammePreferenceValue;
import com.hybridbpm.ui.component.dashboard.tab.DashboardTab;
import com.hybridbpm.core.data.development.Module;
import com.hybridbpm.core.data.dashboard.PanelDefinition;
import com.hybridbpm.core.util.HybridbpmCoreUtil;
import com.hybridbpm.ui.util.HybridbpmStyle;
import com.hybridbpm.ui.HybridbpmUI;
import com.hybridbpm.ui.util.HybridbpmUiUtil;
import com.hybridbpm.ui.component.ConfigureWindow;
import com.hybridbpm.ui.component.chart.AbstractChart;
import com.hybridbpm.core.data.chart.DiagrammePreference;
import com.hybridbpm.ui.component.chart.util.DiagrammeChartType;
import static com.hybridbpm.ui.component.chart.util.DiagrammeUtil.getPreferenceValue;
import com.hybridbpm.ui.util.Translate;
import com.vaadin.addon.charts.Chart;
import com.vaadin.data.Item;
import com.vaadin.data.fieldgroup.BeanFieldGroup;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.server.FontAwesome;
import com.vaadin.shared.ui.MarginInfo;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.MenuBar;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import com.vaadin.ui.themes.ValoTheme;
import java.util.Map;
import java.util.Objects;
import org.vaadin.dialogs.ConfirmDialog;

/**
 *
 * @author Marat Gubaidullin
 */
public class DashboardPanel extends VerticalLayout {

    protected DashboardTab dashboardTab;
    private PanelDefinition panelDefinition;
    private Label caption = new Label();
    private final PanelMenuBar menuBar = new PanelMenuBar(this);
    private HorizontalLayout toolbar = new HorizontalLayout(caption, menuBar);
    private boolean maximized = false;

    public DashboardPanel(DashboardTab panelView, PanelDefinition pd) {
        this.dashboardTab = panelView;
        this.panelDefinition = pd;

        toolbar = new HorizontalLayout();
        toolbar.setMargin(new MarginInfo(false, false, false, true));
        toolbar.setWidth(99, Unit.PERCENTAGE);
        toolbar.setStyleName(HybridbpmStyle.LAYOUT_PADDING8);

        caption.addStyleName(ValoTheme.LABEL_H4);
        caption.addStyleName(ValoTheme.LABEL_COLORED);
        caption.addStyleName(ValoTheme.LABEL_NO_MARGIN);

        toolbar.removeAllComponents();
        toolbar.addComponents(caption, new PanelMenuBar(this));
        toolbar.setExpandRatio(caption, 1);
        toolbar.setComponentAlignment(caption, Alignment.MIDDLE_LEFT);

        setSizeFull();
        setStyleName(ValoTheme.LAYOUT_CARD);
        addStyleName("dashboard-panel");

        configureModule();
    }

    private void configureModule() {
        removeAllComponents();
        addComponent(toolbar);
        panelDefinition = HybridbpmUI.getDashboardAPI().getPanelDefinitionsById(panelDefinition.getId().toString());
        caption.setValue(panelDefinition.getTitle().getValue(HybridbpmUI.getCurrent().getLocale()));
        if (panelDefinition.getModuleType() != null && panelDefinition.getModuleName() != null) {
            Module module = HybridbpmUI.getDevelopmentAPI().getModuleByName(panelDefinition.getModuleName());
            if (Objects.equals(panelDefinition.getModuleType(), Module.MODULE_TYPE.CHART)) {
                DiagrammePreference diagrammePreference = HybridbpmCoreUtil.jsonToObject(module.getDesign(),
                        DiagrammePreference.class);
                BeanFieldGroup<DiagrammePreference> preferences = new BeanFieldGroup<>(DiagrammePreference.class);
                preferences.setItemDataSource(diagrammePreference);
                DiagrammePreferenceValue secondFieldValue = getPreferenceValue(
                        DiagrammePreference.SECOND_COLUMN_FIELD, preferences);
                boolean groupingOn = secondFieldValue != null;
                IndexedContainer container = prepareData(diagrammePreference.getQuery());
                AbstractChart abstractChart = DiagrammeChartType.valueOf(diagrammePreference.getChartType())
                        .createChart(container, groupingOn);
                abstractChart.bind(preferences);
                abstractChart.render();
                Chart chart = abstractChart.drawChart();
                addComponent(chart);
                setExpandRatio(chart, 1f);
            } else if (Objects.equals(panelDefinition.getModuleType(), Module.MODULE_TYPE.FORM)) {
                Component component = (Component) HybridbpmUiUtil.generateFormObject(module);
                addComponent(component);
                setExpandRatio(component, 1f);
            }
        }
    }

    private IndexedContainer prepareData(String query) {
        try {
            IndexedContainer container = new IndexedContainer();
            DbResponse response = HybridbpmUI.getCrudAPI().queryODocuments(query);
            Map<Integer, Map<String, Object>> data = response.getData();
            for (String name : response.getHeader().keySet()) {
                container.addContainerProperty(name, response.getHeader().get(name), null);
            }
            for (Integer rowId : data.keySet()) {
                Item item = container.addItem(rowId);
                Map<String, Object> map = data.get(rowId);
                for (String name : response.getHeader().keySet()) {
                    item.getItemProperty(name).setValue(map.get(name));
                }
            }
            return container;
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }

    public PanelDefinition getPanelDefinition() {
        return panelDefinition;
    }

    public boolean isMaximized() {
        return maximized;
    }

    public void setMaximized(boolean maximized) {
        this.maximized = maximized;
    }

    public class PanelMenuBar extends MenuBar implements MenuBar.Command, Window.CloseListener {

        private final DashboardPanel dashboardPanel;
        private MenuBar.MenuItem max;
        private MenuBar.MenuItem menuCog;
        private MenuBar.MenuItem configure;
        private MenuBar.MenuItem deletePanel;

        public PanelMenuBar(DashboardPanel dp) {
            this.dashboardPanel = dp;
            addStyleName(ValoTheme.MENUBAR_BORDERLESS);
            addStyleName(ValoTheme.MENUBAR_SMALL);

            if (HybridbpmUI.getDeveloperMode()) {
                menuCog = addItem("", FontAwesome.COG, null);

                configure = menuCog.addItem("Configure", FontAwesome.WRENCH, this);
                deletePanel = menuCog.addItem("Delete", FontAwesome.TIMES_CIRCLE, this);
            } else {
                max = addItem("", FontAwesome.EXPAND, this);
                max.setStyleName(ValoTheme.BUTTON_ICON_ONLY);
            }
        }

        @Override
        public void menuSelected(MenuBar.MenuItem selectedItem) {
            if (selectedItem.equals(max)) {
                selectedItem.setIcon(dashboardPanel.isMaximized() ? FontAwesome.EXPAND : FontAwesome.COMPRESS);
                dashboardTab.toggleMaximized(dashboardPanel, !dashboardPanel.isMaximized());
                dashboardPanel.setMaximized(!dashboardPanel.isMaximized());
            } else if (selectedItem.equals(configure)) {
                openPanelConfigurationWindow();
            } else if (selectedItem.equals(deletePanel)) {
                deletePanel();
            }
        }

        @Override
        public void windowClose(Window.CloseEvent e) {
            configureModule();
        }

        private void openPanelConfigurationWindow() {
            final PanelConfigurationLayout panelLayout = new PanelConfigurationLayout(panelDefinition);
            final ConfigureWindow configureWindow = new ConfigureWindow(panelLayout, "Panel parameters");
            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)) {
                        panelLayout.save();
                    }
                    configureWindow.close();
                }
            };
            configureWindow.setClickListener(clickListener);
            configureWindow.addCloseListener(this);
            HybridbpmUI.getCurrent().addWindow(configureWindow);
        }

        private void deletePanel() {
            ConfirmDialog.show(UI.getCurrent(), Translate.getMessage("windowTitleConfirm"), "Delete panel?",
                    Translate.getMessage("btnOK"), Translate.getMessage("btnCancel"), new ConfirmDialog.Listener() {

                        @Override
                        public void onClose(ConfirmDialog dialog) {
                            if (dialog.isConfirmed()) {
                                HybridbpmUI.getDashboardAPI()
                                        .deletePanelDefinition(panelDefinition.getId().toString(), false);
                                dashboardTab.refresh();
                            }
                        }
                    });
        }

    }
}