org.opencms.ui.sitemap.CmsLocaleComparePanel Maven / Gradle / Ivy
Show all versions of opencms-test Show documentation
/*
* This library is part of OpenCms -
* the Open Source Content Management System
*
* Copyright (c) Alkacon Software GmbH & Co. KG (http://www.alkacon.com)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* For further information about Alkacon Software, please see the
* company website: http://www.alkacon.com
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.opencms.ui.sitemap;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsResource;
import org.opencms.file.CmsResourceFilter;
import org.opencms.gwt.shared.CmsGwtConstants;
import org.opencms.gwt.shared.CmsIconUtil;
import org.opencms.i18n.CmsLocaleGroup;
import org.opencms.i18n.CmsLocaleGroupService;
import org.opencms.main.CmsException;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.site.CmsSite;
import org.opencms.ui.A_CmsUI;
import org.opencms.ui.CmsVaadinUtils;
import org.opencms.ui.FontOpenCms;
import org.opencms.ui.Messages;
import org.opencms.ui.components.CmsErrorDialog;
import org.opencms.ui.components.OpenCmsTheme;
import org.opencms.util.CmsUUID;
import org.opencms.workplace.explorer.CmsResourceUtil;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import org.apache.commons.logging.Log;
import com.google.common.collect.Lists;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.server.Resource;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.JavaScript;
import com.vaadin.ui.Notification;
import com.vaadin.ui.VerticalLayout;
/**
* View used to compare sitemaps across locales.
*/
public class CmsLocaleComparePanel extends VerticalLayout implements I_CmsLocaleCompareContext {
/** The logger instance for this class. */
private static final Log LOG = CmsLog.getLog(CmsLocaleComparePanel.class);
/** The serial version id. */
private static final long serialVersionUID = 1L;
/** Icon for the main locale option in select boxes. */
public static final Resource MAIN_LOCALE_ICON = FontOpenCms.CIRCLE_INFO;
/** The parent layout of the tree. */
protected CssLayout m_treeContainer = new CssLayout();
/** The selected comparison locale. */
private Locale m_comparisonLocale;
/** The comparison locale selector. */
private ComboBox m_comparisonLocaleSelector;
/** The current root of the tree. */
private CmsResource m_currentRoot;
/** Flag which is set while the user switches one of the locales. */
private boolean m_handlingLocaleChange;
/** The root locale (locale of the root resource). */
private Locale m_rootLocale;
/** The root locale selector. */
private ComboBox m_rootLocaleSelector;
/**
* Creates a new instance.
*
* @param id the id of a sitemap entry
*/
public CmsLocaleComparePanel(String id) {
super();
Locale locale = OpenCms.getWorkplaceManager().getWorkplaceLocale(A_CmsUI.getCmsObject());
A_CmsUI.get().setLocale(locale);
try {
initialize(new CmsUUID(id), null);
} catch (CmsException e) {
LOG.error(e.getLocalizedMessage(), e);
CmsErrorDialog.showErrorDialog(e);
}
}
/**
* @see org.opencms.ui.sitemap.I_CmsLocaleCompareContext#getComparisonLocale()
*/
public Locale getComparisonLocale() {
return m_comparisonLocale;
}
/**
* Gets the locales selectable as comparison locales.
*
* @return the possible comparison locales
*/
public List getComparisonLocales() {
CmsObject cms = A_CmsUI.getCmsObject();
cms.getLocaleGroupService();
List result = CmsLocaleGroupService.getPossibleLocales(cms, m_currentRoot);
return result;
}
/**
* @see org.opencms.ui.sitemap.I_CmsLocaleCompareContext#getLocaleGroup()
*/
public CmsLocaleGroup getLocaleGroup() {
try {
CmsObject cms = A_CmsUI.getCmsObject();
CmsLocaleGroupService service = cms.getLocaleGroupService();
return service.readLocaleGroup(m_currentRoot);
} catch (Exception e) {
LOG.error(e.getLocalizedMessage(), e);
return null;
}
}
/**
* @see org.opencms.ui.sitemap.I_CmsLocaleCompareContext#getRoot()
*/
public CmsResource getRoot() {
return m_currentRoot;
}
/**
* @see org.opencms.ui.sitemap.I_CmsLocaleCompareContext#getRootLocale()
*/
public Locale getRootLocale() {
return m_rootLocale;
}
/**
* Initializes the locale comparison view.
*
* @param id the structure id of the currrent sitemap root entry
* @param initialComparisonLocale if not null, the initially selected ccomparison locale
*
* @throws CmsException if something goes wrong
*/
public void initialize(CmsUUID id, Locale initialComparisonLocale) throws CmsException {
removeAllComponents();
CmsObject cms = A_CmsUI.getCmsObject();
CmsResource res = cms.readResource(id);
m_currentRoot = res;
CmsSite site = OpenCms.getSiteManager().getSiteForRootPath(res.getRootPath());
Locale rootLocale = OpenCms.getLocaleManager().getDefaultLocale(cms, res);
m_rootLocale = rootLocale;
Locale mainLocale = site.getMainTranslationLocale(null);
List secondaryLocales = site.getSecondaryTranslationLocales();
List possibleLocaleSelections = getMainLocaleSelectOptions(cms, res, mainLocale, secondaryLocales);
m_rootLocaleSelector = new ComboBox();
m_rootLocaleSelector.addStyleName("o-sitemap-localeselect");
m_rootLocaleSelector.setNullSelectionAllowed(false);
for (Locale selectableLocale : possibleLocaleSelections) {
m_rootLocaleSelector.addItem(selectableLocale);
m_rootLocaleSelector.setItemIcon(selectableLocale, FontOpenCms.SPACE);
m_rootLocaleSelector.setItemCaption(
selectableLocale,
selectableLocale.getDisplayName(A_CmsUI.get().getLocale()));
}
m_rootLocaleSelector.setItemIcon(mainLocale, MAIN_LOCALE_ICON);
m_rootLocaleSelector.setValue(m_rootLocale);
m_rootLocaleSelector.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = 1L;
@SuppressWarnings("synthetic-access")
public void valueChange(ValueChangeEvent event) {
if (!m_handlingLocaleChange) {
m_handlingLocaleChange = true;
try {
Locale newLocale = (Locale)(event.getProperty().getValue());
switchToLocale(newLocale);
} catch (Exception e) {
LOG.error(e.getLocalizedMessage(), e);
CmsErrorDialog.showErrorDialog(e);
} finally {
m_handlingLocaleChange = false;
}
}
}
});
m_comparisonLocaleSelector = new ComboBox();
m_comparisonLocaleSelector.addStyleName("o-sitemap-localeselect");
m_comparisonLocaleSelector.setNullSelectionAllowed(false);
List comparisonLocales = getComparisonLocales();
Locale selectedComparisonLocale = null;
for (Locale comparisonLocale : comparisonLocales) {
m_comparisonLocaleSelector.addItem(comparisonLocale);
m_comparisonLocaleSelector.setItemIcon(comparisonLocale, FontOpenCms.SPACE);
m_comparisonLocaleSelector.setItemCaption(
comparisonLocale,
comparisonLocale.getDisplayName(A_CmsUI.get().getLocale()));
if ((selectedComparisonLocale == null) && !comparisonLocale.equals(m_rootLocale)) {
selectedComparisonLocale = comparisonLocale;
}
if ((initialComparisonLocale != null)
&& comparisonLocale.equals(initialComparisonLocale)
&& !comparisonLocale.equals(m_rootLocale)) {
// if an initial comparison locale is given, it should have priority over the first comparison locale
selectedComparisonLocale = comparisonLocale;
}
}
m_comparisonLocale = selectedComparisonLocale;
m_comparisonLocaleSelector.setValue(selectedComparisonLocale);
m_comparisonLocaleSelector.setItemIcon(mainLocale, MAIN_LOCALE_ICON);
m_comparisonLocaleSelector.addValueChangeListener(new ValueChangeListener() {
private static final long serialVersionUID = 1L;
@SuppressWarnings("synthetic-access")
public void valueChange(ValueChangeEvent event) {
if (!m_handlingLocaleChange) {
m_handlingLocaleChange = true;
try {
Locale locale = (Locale)(event.getProperty().getValue());
if (m_rootLocale.equals(locale)) {
Locale oldComparisonLocale = m_comparisonLocale;
if (getLocaleGroup().getResourcesByLocale().keySet().contains(oldComparisonLocale)) {
m_comparisonLocale = locale;
switchToLocale(oldComparisonLocale);
updateLocaleWidgets();
} else {
Notification.show(
CmsVaadinUtils.getMessageText(
Messages.GUI_LOCALECOMPARE_CANNOT_SWITCH_COMPARISON_LOCALE_0));
m_comparisonLocaleSelector.setValue(oldComparisonLocale);
}
} else {
m_comparisonLocale = locale;
updateLocaleWidgets();
initTree(m_currentRoot);
}
} catch (Exception e) {
LOG.error(e.getLocalizedMessage(), e);
CmsErrorDialog.showErrorDialog(e);
} finally {
m_handlingLocaleChange = false;
}
}
}
});
CssLayout localeSelectors = new CssLayout();
localeSelectors.addStyleName(OpenCmsTheme.SITEMAP_LOCALE_BAR);
m_rootLocaleSelector.setCaption(CmsVaadinUtils.getMessageText(Messages.GUI_LOCALECOMPARE_MAIN_LOCALE_0));
m_comparisonLocaleSelector.setCaption(
CmsVaadinUtils.getMessageText(Messages.GUI_LOCALECOMPARE_COMPARISON_LOCALE_0));
localeSelectors.setWidth("100%");
localeSelectors.addComponent(m_rootLocaleSelector);
localeSelectors.addComponent(m_comparisonLocaleSelector);
// localeSelectors.setComponentAlignment(wrapper2, Alignment.MIDDLE_RIGHT);
setSpacing(true);
addComponent(localeSelectors);
addComponent(m_treeContainer);
m_treeContainer.setWidth("100%");
initTree(res);
}
/**
* @see org.opencms.ui.sitemap.I_CmsLocaleCompareContext#refreshAll()
*/
public void refreshAll() {
try {
initialize(m_currentRoot.getStructureId(), m_comparisonLocale);
} catch (CmsException e) {
LOG.error(e.getLocalizedMessage(), e);
CmsErrorDialog.showErrorDialog(e);
}
}
/**
* Switches the root locale to the given value.
*
* @param locale the new root locale
* @throws CmsException if something goes wrong
*/
public void switchToLocale(Locale locale) throws CmsException {
CmsObject cms = A_CmsUI.getCmsObject();
CmsLocaleGroupService groupService = cms.getLocaleGroupService();
CmsLocaleGroup localeGroup = groupService.readDefaultFileLocaleGroup(m_currentRoot);
Collection resources = localeGroup.getResourcesForLocale(locale);
if (resources.isEmpty()) {
LOG.error(
"Can not switch to locale "
+ locale
+ ": no page found in locale group of "
+ m_currentRoot.getRootPath());
}
CmsResource localeVariant = resources.iterator().next();
if (!localeVariant.isFolder()) {
CmsResource parentFolder = cms.readParentFolder(localeVariant.getStructureId());
if (m_comparisonLocale.equals(locale)) {
m_comparisonLocale = m_rootLocale;
m_rootLocale = locale;
} else {
m_rootLocale = locale;
}
updateLocaleWidgets();
initTree(parentFolder);
} else {
LOG.error("locale variant should not be a folder: " + localeVariant.getRootPath());
}
}
/**
* Initializes the tree with the given resource as a root.
*
* @param rootRes the new tree root resource
* @throws CmsException if something goes wrong
*/
protected void initTree(CmsResource rootRes) throws CmsException {
m_currentRoot = rootRes;
m_treeContainer.removeAllComponents();
showHeader();
CmsSitemapTreeController controller = new CmsSitemapTreeController(
A_CmsUI.getCmsObject(),
rootRes,
this,
m_treeContainer);
// no need to escape a structure id
JavaScript.eval(CmsGwtConstants.VAR_LOCALE_ROOT + "='" + rootRes.getStructureId() + "'");
CmsSitemapUI ui = (CmsSitemapUI)(A_CmsUI.get());
ui.getSitemapExtension().setSitemapTreeController(controller);
CmsSitemapTreeNode root1 = controller.createRootNode();
controller.initEventHandlers(root1);
m_treeContainer.addComponent(root1);
controller.onClickOpen(root1);
}
/**
* Shows the current loale values in their corresponding widgets.
*/
protected void updateLocaleWidgets() {
m_rootLocaleSelector.setValue(m_rootLocale);
m_comparisonLocaleSelector.setValue(m_comparisonLocale);
}
/**
* Gets the possible locale values selectable as main locale.
*
* @param cms the CMS context
* @param res the resource
* @param mainLocale the main locale
* @param secondaryLocales the secondary locales
*
* @return the possible locale selections
*/
private List getMainLocaleSelectOptions(
CmsObject cms,
CmsResource res,
Locale mainLocale,
List secondaryLocales) {
try {
CmsLocaleGroup localeGroup = cms.getLocaleGroupService().readDefaultFileLocaleGroup(res);
List result = Lists.newArrayList();
if (localeGroup.hasLocale(mainLocale)) {
result.add(mainLocale);
}
for (Locale locale : secondaryLocales) {
if (localeGroup.hasLocale(locale)) {
result.add(locale);
}
}
return result;
} catch (CmsException e) {
LOG.error(e.getLocalizedMessage(), e);
return Lists.newArrayList();
}
}
/**
* Shows the header for the currently selected sitemap root.
*
* @throws CmsException if something goes wrong
*/
private void showHeader() throws CmsException {
CmsSitemapUI ui = (CmsSitemapUI)A_CmsUI.get();
String title = null;
String description = null;
String path = null;
String locale = m_rootLocale.toString();
CmsObject cms = A_CmsUI.getCmsObject();
CmsResource targetRes = getRoot();
if (targetRes.isFolder()) {
targetRes = cms.readDefaultFile(targetRes, CmsResourceFilter.IGNORE_EXPIRATION);
if (targetRes == null) {
targetRes = getRoot();
}
}
CmsResourceUtil resUtil = new CmsResourceUtil(cms, getRoot());
title = resUtil.getTitle();
description = resUtil.getGalleryDescription(A_CmsUI.get().getLocale());
path = OpenCms.getLinkManager().getServerLink(
cms,
cms.getRequestContext().removeSiteRoot(targetRes.getRootPath()));
String iconClasses = CmsIconUtil.getResourceIconClasses(
OpenCms.getResourceManager().getResourceType(getRoot()).getTypeName(),
false);
ui.getSitemapExtension().showInfoHeader(title, description, path, locale, iconClasses);
}
}