/**
* Copyright (C) 2012 JBoss Inc
*
* 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 org.jboss.dashboard.ui.formatters;
import org.apache.commons.lang.StringEscapeUtils;
import org.jboss.dashboard.LocaleManager;
import org.jboss.dashboard.ui.NavigationManager;
import org.jboss.dashboard.ui.SessionManager;
import org.jboss.dashboard.ui.taglib.formatter.Formatter;
import org.jboss.dashboard.ui.taglib.formatter.FormatterException;
import org.jboss.dashboard.workspace.*;
import org.jboss.dashboard.workspace.*;
import org.jboss.dashboard.security.PanelPermission;
import org.jboss.dashboard.security.WorkspacePermission;
import org.jboss.dashboard.users.UserStatus;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
public class RegionFormatter extends Formatter {
protected Section currentSection;
protected LayoutRegion currentRegion;
protected SectionRegion currentSectionRegion;
protected boolean userAdmin = false;
protected int cellspacingPanels;
protected List<Panel> regionPanels;
protected int panelRecommendedWidth;
protected String maxDropSize = "100%";
protected String minDropSize = "10px";
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws FormatterException {
currentSection = NavigationManager.lookup().getCurrentSection();
cellspacingPanels = currentSection.getPanelsCellSpacing().intValue();
String regionID = (String) request.getAttribute(Parameters.RENDER_IDREGION);
currentRegion = currentSection.getLayout().getRegion(regionID);
currentSectionRegion = currentSection.getSectionRegion(currentRegion.getId());
regionPanels = getRegionPanels();
panelRecommendedWidth = regionPanels.size() == 0 ? 100 : (currentRegion.isRowRegion() ? (100 / regionPanels.size()) : 100);
WorkspaceImpl workspace = NavigationManager.lookup().getCurrentWorkspace();
if (workspace != null) {
WorkspacePermission permToCheck = WorkspacePermission.newInstance(workspace, WorkspacePermission.ACTION_ADMIN);
userAdmin = getUserStatus().hasPermission( permToCheck);
}
}
protected void renderEmptyShowModeRegion() {
renderFragment("No Panels In Region (normal mode)");
}
protected void renderThereAreNoPanels() {
renderFragment("No Panels In Region");
}
protected void renderRegionPanelsStart() {
renderFragment("Region Panels Start");
}
protected void renderRegionPanelsEnd() {
renderFragment("Region Panels End");
}
protected void renderNewLineStart() {
renderFragment("Region Panels New Line Start");
}
protected void renderNewLineEnd() {
renderFragment("Region Panels New Line End");
}
protected void renderRegionEnd() {
setAttribute("regionId", currentRegion.getId());
renderFragment("regionEnd");
}
protected void renderRegionStart() {
//Render region start
if (userAdmin) {
setAttribute("regionId", currentRegion.getId());
setAttribute("numPanels", regionPanels.size());
setAttribute("regionDescription", currentRegion.getDescription());
setAttribute("cellspacingPanels", cellspacingPanels);
renderFragment("regionStartWithTitle");
} else {
setAttribute("cellspacingPanels", cellspacingPanels);
renderFragment("regionStartWithoutTitle");
}
}
protected void renderPanelDropRegion(int index, boolean hasPanels) {
if (hasPanels) {
renderFragment("panelOutputStart");
renderDropRegion(index);
renderFragment("panelOutputEnd");
}
}
protected void renderDropRegion(int index) {
String width = currentRegion.isColumnRegion() ? getMaxDropSize() : getMinDropSize();
String height = currentRegion.isColumnRegion() ? getMinDropSize() : getMaxDropSize();
setAttribute("width", width);
setAttribute("height", height);
setAttribute("index", index);
setAttribute("regionId", currentRegion.getId());
renderFragment("panelDropRegion");
}
protected void renderPanel(Panel panel, boolean canEditPanel) {
if (!isPanelOk(panel)) return;
setAttribute("panel", panel);
setAttribute("recommendedWidth", panelRecommendedWidth + "%");
renderFragment("panelOutputStart");
if (panel.isPaintTitle() ||
SessionManager.getPanelSession(panel).isMinimized() ||
(userAdmin) ||
(panel.getProvider().getDriver().supportsEditMode(panel) && canEditPanel)) {
setAttribute("panel", panel);
setAttribute("administratorMode", userAdmin);
setAttribute("panelTitle", StringEscapeUtils.escapeHtml(getLocalizedValue(panel.getTitle())));
setAttribute("recommendedWidth", panelRecommendedWidth + "%");
setAttribute("editMode", panel.getPanelSession().isEditMode());
renderFragment("panelContentWithMenu");
} else {
setAttribute("panel", panel);
setAttribute("recommendedWidth", panelRecommendedWidth + "%");
renderFragment("panelContentWithoutMenu");
}
setAttribute("panel", panel);
renderFragment("panelOutputEnd");
}
protected boolean isPanelOk(Panel panel) {
if (panel == null) return false;
if (panel.getInstance() == null) return false;
if (panel.getProvider() == null) return false;
return true;
}
private List<Panel> getRegionPanels() {
Panel[] allPanels = currentSectionRegion.getPanels();
List<Panel> panels = new ArrayList<Panel>();
boolean onlyOnePanel = false;
// When a panel is maximized in region, only show it.
for (int i = 0; i < allPanels.length; i++) {
Panel panel = allPanels[i];
PanelSession status = SessionManager.getPanelSession(panel);
if (status.isMaximizedInRegion()) {
PanelPermission viewPerm = PanelPermission.newInstance(panel, PanelPermission.ACTION_VIEW);
boolean canViewPanel = getUserStatus().hasPermission( viewPerm);
if (canViewPanel) {
panels.add(panel);
onlyOnePanel = true;
break;
}
}
}
if (!onlyOnePanel)
for (int i = 0; i < allPanels.length; i++) {
Panel panel = allPanels[i];
PanelPermission viewPerm = PanelPermission.newInstance(panel, PanelPermission.ACTION_VIEW);
boolean canViewPanel = getUserStatus().hasPermission( viewPerm);
if (canViewPanel) {
panels.add(panel);
}
}
return panels;
}
public String getMaxDropSize() {
return maxDropSize;
}
public void setMaxDropSize(String maxDropSize) {
this.maxDropSize = maxDropSize;
}
public String getMinDropSize() {
return minDropSize;
}
public void setMinDropSize(String minDropSize) {
this.minDropSize = minDropSize;
}
public UserStatus getUserStatus() {
return UserStatus.lookup();
}
}