/*
* 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.dashboard.TabDefinition;
import com.hybridbpm.core.data.dashboard.ViewDefinition;
import com.hybridbpm.ui.HybridbpmUI;
import com.hybridbpm.ui.component.dashboard.ViewManager;
import com.hybridbpm.ui.component.dashboard.tab.DashboardTab;
import com.hybridbpm.ui.util.Translate;
import com.vaadin.annotations.DesignRoot;
import com.vaadin.navigator.View;
import com.vaadin.navigator.ViewChangeListener;
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.CssLayout;
import com.vaadin.ui.TabSheet;
import com.vaadin.ui.TabSheet.Tab;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.declarative.Design;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.vaadin.dialogs.ConfirmDialog;
@DesignRoot
@SuppressWarnings("serial")
public final class DashboardView extends AbstractView implements View, Button.ClickListener, TabSheet.SelectedTabChangeListener, TabSheet.CloseHandler {
private static final Logger logger = Logger.getLogger(DashboardView.class.getSimpleName());
protected ViewDefinition viewDefinition;
protected String viewUrl;
protected String viewUrlParameters;
protected CssLayout root;
protected CssLayout floatToolbar;
protected Button btnAdd;
protected Button btnEdit;
protected Button btnDelete;
protected VerticalLayout tabSheetLayout;
protected TabSheet tabSheet;
public VerticalLayout panelLayout;
public DashboardView(ViewDefinition vd) {
this.viewDefinition = HybridbpmUI.getDashboardAPI().getViewDefinitionById(vd.getId().toString());
Design.read(this);
Responsive.makeResponsive(this);
btnAdd.addClickListener(this);
btnAdd.setIcon(FontAwesome.PLUS_CIRCLE);
btnAdd.setCaption("Add tab");
btnEdit.addClickListener(this);
btnEdit.setIcon(FontAwesome.EDIT);
btnEdit.setCaption("Edit view");
btnDelete.addClickListener(this);
btnDelete.setIcon(FontAwesome.TIMES_CIRCLE);
btnDelete.setCaption("Delete view");
createTabs();
checkDeveloperMode();
tabSheet.addSelectedTabChangeListener(this);
tabSheet.setCloseHandler(this);
}
private void createTabs() {
tabSheet.removeAllComponents();
if (this.viewDefinition != null) {
for (TabDefinition tabDefinition : HybridbpmUI.getDashboardAPI().getTabDefinitionByView(this.viewDefinition.getId().toString())) {
TabSheet.Tab tab = tabSheet.addTab(new DashboardTab(tabDefinition, this.viewDefinition), tabDefinition.getTitle().getValue(HybridbpmUI.getCurrent().getLocale()), FontAwesome.valueOf(tabDefinition.getIcon()));
tab.setClosable(HybridbpmUI.getDeveloperMode());
}
}
}
private void checkDeveloperMode() {
if (HybridbpmUI.getAccessAPI().isDeveloper() && HybridbpmUI.getDeveloperMode()) {
floatToolbar.setEnabled(true);
floatToolbar.setVisible(true);
tabSheetLayout.setMargin(new MarginInfo(true, false, false, false));
} else {
floatToolbar.setEnabled(false);
floatToolbar.setVisible(false);
tabSheetLayout.setMargin(false);
}
}
@Override
public void enter(ViewChangeListener.ViewChangeEvent event) {
checkDeveloperMode();
try {
if (!Objects.equals(event.getOldView(), event.getNewView())) {
viewUrl = event.getViewName();
viewDefinition = HybridbpmUI.getDashboardAPI().getViewDefinitionByUrl(viewUrl);
tabSheet.removeSelectedTabChangeListener(this);
createTabs();
tabSheet.addSelectedTabChangeListener(this);
}
if (event.getParameters() != null && !event.getParameters().trim().isEmpty()) {
openDashboardTab(event.getParameters());
} else {
TabDefinition td = ((DashboardTab) tabSheet.getTab(0).getComponent()).getTabDefinition();
HybridbpmUI.getCurrent().getHybridbpmNavigator().navigateTo(viewUrl + "/" + td.getId());
}
} catch (Exception e) {
logger.log(Level.SEVERE, e.getMessage(), e);
}
}
private void openDashboardTab(String tabId) {
Tab tab = getTab(tabId);
if (tab != null) {
tabSheet.removeSelectedTabChangeListener(this);
tabSheet.setSelectedTab(tab);
tabSheet.addSelectedTabChangeListener(this);
}
}
private Tab getTab(String tabid) {
for (Component component : tabSheet) {
if (component instanceof DashboardTab && Objects.equals(((DashboardTab) component).getTabDefinition().getId().toString(), tabid)) {
return tabSheet.getTab(component);
}
}
return null;
}
@Override
public void selectedTabChange(TabSheet.SelectedTabChangeEvent event) {
try {
if (event.getTabSheet().getSelectedTab() instanceof DashboardTab) {
TabDefinition td = ((DashboardTab) event.getTabSheet().getSelectedTab()).getTabDefinition();
HybridbpmUI.getCurrent().getHybridbpmNavigator().navigateTo(viewUrl + "/" + td.getId());
}
} catch (Exception e) {
logger.log(Level.SEVERE, e.getMessage(), e);
}
}
@Override
public void buttonClick(Button.ClickEvent event) {
if (event.getButton().equals(btnAdd)) {
ViewManager.editTabDefinitionWindow(null, viewDefinition);
} else if (event.getButton().equals(btnEdit)) {
ViewManager.editViewDefinitionWindow(viewDefinition);
} else if (event.getButton().equals(btnDelete)) {
ViewManager.deleteViewDefinitionWindow(viewDefinition);
}
}
@Override
public void onTabClose(final TabSheet tabsheet, final Component tabContent) {
if (tabContent instanceof DashboardTab) {
final DashboardTab dashboardTab = (DashboardTab) tabContent;
ConfirmDialog.show(UI.getCurrent(), Translate.getMessage("windowTitleConfirm"), "Delete tab?", Translate.getMessage("btnOK"), Translate.getMessage("btnCancel"), new ConfirmDialog.Listener() {
@Override
public void onClose(ConfirmDialog dialog) {
if (dialog.isConfirmed()) {
HybridbpmUI.getDashboardAPI().deleteTabDefinition(dashboardTab.getTabDefinition().getId(), true);
tabsheet.removeComponent(tabContent);
tabsheet.setSelectedTab(0);
} else {
// this.close();
}
}
});
}
}
}