All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opencms.ui.sitemap.CmsSitemapTreeController Maven / Gradle / Ivy

Go to download

OpenCms is an enterprise-ready, easy to use website content management system based on Java and XML technology. Offering a complete set of features, OpenCms helps content managers worldwide to create and maintain beautiful websites fast and efficiently.

There is a newer version: 18.0
Show newest version
/*
 * 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.CmsProject;
import org.opencms.file.CmsProperty;
import org.opencms.file.CmsPropertyDefinition;
import org.opencms.file.CmsResource;
import org.opencms.file.CmsResourceFilter;
import org.opencms.gwt.CmsCoreService;
import org.opencms.i18n.CmsLocaleGroupService;
import org.opencms.i18n.CmsLocaleManager;
import org.opencms.lock.CmsLockActionRecord;
import org.opencms.lock.CmsLockActionRecord.LockChange;
import org.opencms.lock.CmsLockUtil;
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.I_CmsDialogContext;
import org.opencms.ui.Messages;
import org.opencms.ui.actions.CmsResourceInfoAction;
import org.opencms.ui.apps.CmsSitemapEditorConfiguration;
import org.opencms.ui.components.CmsBasicDialog;
import org.opencms.ui.components.CmsBasicDialog.DialogWidth;
import org.opencms.ui.components.CmsErrorDialog;
import org.opencms.ui.components.CmsResourceIcon;
import org.opencms.ui.components.CmsResourceIcon.IconMode;
import org.opencms.ui.components.CmsResourceInfo;
import org.opencms.ui.components.OpenCmsTheme;
import org.opencms.ui.contextmenu.CmsContextMenu;
import org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry;
import org.opencms.util.CmsUUID;
import org.opencms.workplace.explorer.menu.CmsMenuItemVisibilityMode;

import java.util.Arrays;
import java.util.Collection;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Locale;

import org.apache.commons.logging.Log;

import com.google.common.base.Joiner;
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
import com.vaadin.event.LayoutEvents.LayoutClickEvent;
import com.vaadin.event.LayoutEvents.LayoutClickListener;
import com.vaadin.server.FontAwesome;
import com.vaadin.ui.AbstractComponent;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.Component;
import com.vaadin.ui.ComponentContainer;
import com.vaadin.ui.CssLayout;
import com.vaadin.ui.MenuBar;
import com.vaadin.ui.MenuBar.Command;
import com.vaadin.ui.MenuBar.MenuItem;
import com.vaadin.ui.Notification;
import com.vaadin.ui.Notification.Type;
import com.vaadin.ui.UI;
import com.vaadin.ui.Window;

/**
 * Manages the sitemap tree in the 'locale comparison' view in the sitemap editor.

*/ public class CmsSitemapTreeController { /** * The context used for child dialogs.

*/ public class DialogContext implements I_CmsDialogContext { /** The tree node. */ private CmsSitemapTreeNode m_node; /** The resource. */ private CmsResource m_resource; /** * Creates a new instance.

* * @param resource the resource * @param node the tree node */ public DialogContext(CmsResource resource, CmsSitemapTreeNode node) { m_resource = resource; m_node = node; } /** * Closes the dialog window.

*/ public void closeWindow() { if (m_window != null) { m_window.close(); m_window = null; } } /** * @see org.opencms.ui.I_CmsDialogContext#error(java.lang.Throwable) */ public void error(Throwable error) { getTreeControllerLog().error(error.getLocalizedMessage(), error); CmsErrorDialog.showErrorDialog(error); } /** * @see org.opencms.ui.I_CmsDialogContext#finish(org.opencms.file.CmsProject, java.lang.String) */ public void finish(CmsProject project, String siteRoot) { closeWindow(); } /** * @see org.opencms.ui.I_CmsDialogContext#finish(java.util.Collection) */ @SuppressWarnings("synthetic-access") public void finish(Collection result) { closeWindow(); if (result.isEmpty()) { return; } if (m_node != null) { if (m_node == m_currentRootNode) { m_localeContext.refreshAll(); } else { updateNode(m_node); } } } /** * @see org.opencms.ui.I_CmsDialogContext#focus(org.opencms.util.CmsUUID) */ public void focus(CmsUUID structureId) { // not used } /** * @see org.opencms.ui.I_CmsDialogContext#getAllStructureIdsInView() */ public List getAllStructureIdsInView() { return null; } /** * @see org.opencms.ui.I_CmsDialogContext#getAppId() */ public String getAppId() { return CmsSitemapEditorConfiguration.APP_ID; } /** * @see org.opencms.ui.I_CmsDialogContext#getCms() */ public CmsObject getCms() { return A_CmsUI.getCmsObject(); } /** * @see org.opencms.ui.I_CmsDialogContext#getContextType() */ public ContextType getContextType() { return null; } /** * @see org.opencms.ui.I_CmsDialogContext#getResources() */ public List getResources() { return Arrays.asList(m_resource); } /** * @see org.opencms.ui.I_CmsDialogContext#navigateTo(java.lang.String) */ public void navigateTo(String appId) { // not used } /** * @see org.opencms.ui.I_CmsDialogContext#onViewChange() */ public void onViewChange() { // do nothing } /** * @see org.opencms.ui.I_CmsDialogContext#reload() */ public void reload() { // do nothing } /** * @see org.opencms.ui.I_CmsDialogContext#setWindow(com.vaadin.ui.Window) */ public void setWindow(Window window) { m_window = window; } /** * @see org.opencms.ui.I_CmsDialogContext#start(java.lang.String, com.vaadin.ui.Component) */ public void start(String title, Component dialog) { start(title, dialog, DialogWidth.narrow); } /** * @see org.opencms.ui.I_CmsDialogContext#start(java.lang.String, com.vaadin.ui.Component, org.opencms.ui.components.CmsBasicDialog.DialogWidth) */ public void start(String title, Component dialog, DialogWidth width) { if (dialog != null) { m_window = CmsBasicDialog.prepareWindow(width); m_window.setCaption(title); m_window.setContent(dialog); UI.getCurrent().addWindow(m_window); if (dialog instanceof CmsBasicDialog) { ((CmsBasicDialog)dialog).initActionHandler(m_window); } } } /** * @see org.opencms.ui.I_CmsDialogContext#updateUserInfo() */ public void updateUserInfo() { // not supported } } /** * Copy menu entry. */ class EntryCopy implements I_CmsSimpleContextMenuEntry { /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#executeAction(java.lang.Object) */ public void executeAction(MenuContext context) { openPageCopyDialog(context.getNode(), context.getData()); } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getTitle(java.util.Locale) */ public String getTitle(Locale locale) { return CmsVaadinUtils.getMessageText(Messages.GUI_LOCALECOMPARE_COPY_PAGE_0); } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getVisibility(java.lang.Object) */ public CmsMenuItemVisibilityMode getVisibility(MenuContext context) { return visibleIfTrue(context.getData().isCopyable()); } } /** * Menu entry for opening the explorer.

*/ class EntryExplorer implements I_CmsSimpleContextMenuEntry { /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#executeAction(java.lang.Object) */ public void executeAction(MenuContext context) { String link = CmsCoreService.getVaadinWorkplaceLink( A_CmsUI.getCmsObject(), context.getData().getResource().getStructureId()); A_CmsUI.get().getPage().setLocation(link); } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getTitle(java.util.Locale) */ public String getTitle(Locale locale) { return CmsVaadinUtils.getMessageText(Messages.GUI_LOCALECOMPARE_EXPLORER_0); } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getVisibility(java.lang.Object) */ public CmsMenuItemVisibilityMode getVisibility(MenuContext context) { return visibleIfTrue(true); } } /** * Menu entry for opening the info dialog.

*/ class EntryInfo implements I_CmsSimpleContextMenuEntry { /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#executeAction(java.lang.Object) */ public void executeAction(MenuContext context) { CmsResourceInfoAction infoAction = new CmsResourceInfoAction(); infoAction.executeAction(new DialogContext(context.getData().getResource(), context.getNode())); } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getTitle(java.util.Locale) */ public String getTitle(Locale locale) { return CmsVaadinUtils.getMessageText(Messages.GUI_RESOURCE_INFO_0); } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getVisibility(java.lang.Object) */ public CmsMenuItemVisibilityMode getVisibility(MenuContext context) { return visibleIfTrue(true); } } /** * Menu entry for opening the 'LInk locale' dialog.

*/ class EntryLink implements I_CmsSimpleContextMenuEntry { /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#executeAction(java.lang.Object) */ @SuppressWarnings("synthetic-access") public void executeAction(MenuContext data) { try { DialogContext dialogContext = new DialogContext( A_CmsUI.getCmsObject().readResource( data.getData().getClientEntry().getId(), CmsResourceFilter.IGNORE_EXPIRATION), data.getNode()); CmsLocaleLinkTargetSelectionDialog dialog = new CmsLocaleLinkTargetSelectionDialog( dialogContext, m_localeContext); dialogContext.start( CmsVaadinUtils.getMessageText(Messages.GUI_LOCALECOMPARE_LINK_LOCALE_VARIANT_0), dialog, DialogWidth.narrow); } catch (CmsException e) { LOG.error(e.getLocalizedMessage(), e); CmsErrorDialog.showErrorDialog(e); } } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getTitle(java.util.Locale) */ public String getTitle(Locale locale) { return CmsVaadinUtils.getMessageText(Messages.GUI_LOCALECOMPARE_LINK_LOCALE_VARIANT_0); } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getVisibility(java.lang.Object) */ @SuppressWarnings("synthetic-access") public CmsMenuItemVisibilityMode getVisibility(MenuContext context) { return activeIfTrue( !context.getData().isLinked() && !context.getData().isMarkedNoTranslation(m_localeContext.getComparisonLocale())); } } /** * Context menu entry for the 'Do not translate' mark.

*/ class EntryMark implements I_CmsSimpleContextMenuEntry { /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#executeAction(java.lang.Object) */ @SuppressWarnings("synthetic-access") public void executeAction(MenuContext context) { CmsSitemapTreeNodeData entry = context.getData(); CmsSitemapTreeNode node = context.getNode(); CmsObject cms = A_CmsUI.getCmsObject(); CmsLockActionRecord actionRecord = null; CmsResource fileToModify2 = null; try { CmsResource primary = A_CmsUI.getCmsObject().readResource( entry.getClientEntry().getId(), CmsResourceFilter.IGNORE_EXPIRATION); if (primary.isFolder()) { CmsResource defaultFile = A_CmsUI.getCmsObject().readDefaultFile( primary, CmsResourceFilter.IGNORE_EXPIRATION); if (defaultFile != null) { primary = defaultFile; } } final CmsResource primaryFinal = primary; fileToModify2 = primaryFinal; if (fileToModify2.isFolder()) { try { fileToModify2 = A_CmsUI.getCmsObject().readDefaultFile( fileToModify2, CmsResourceFilter.IGNORE_EXPIRATION); } catch (CmsException e) { LOG.error(e.getLocalizedMessage(), e); } } actionRecord = CmsLockUtil.ensureLock(cms, fileToModify2); m_localeContext.getComparisonLocale().toString(); CmsProperty prop = cms.readPropertyObject( fileToModify2, CmsPropertyDefinition.PROPERTY_LOCALE_NOTRANSLATION, false); String propValue = prop.getValue(); if (propValue == null) { propValue = ""; // make getLocales not return null } List currentLocales = CmsLocaleManager.getLocales(propValue); if (!currentLocales.contains(m_localeContext.getComparisonLocale())) { currentLocales.add(m_localeContext.getComparisonLocale()); String newPropValue = Joiner.on(",").join(currentLocales); CmsProperty newProp = new CmsProperty( CmsPropertyDefinition.PROPERTY_LOCALE_NOTRANSLATION, newPropValue, null); cms.writePropertyObjects(fileToModify2, Arrays.asList(newProp)); DialogContext dialogContext = new DialogContext( A_CmsUI.getCmsObject().readResource( entry.getClientEntry().getId(), CmsResourceFilter.IGNORE_EXPIRATION), node); dialogContext.finish(Arrays.asList(fileToModify2.getStructureId())); } } catch (CmsException e) { LOG.error(e.getLocalizedMessage(), e); CmsErrorDialog.showErrorDialog(e); } finally { if ((actionRecord != null) && (actionRecord.getChange() == LockChange.locked)) { try { cms.unlockResource(fileToModify2); } catch (CmsException e) { LOG.error(e.getLocalizedMessage(), e); CmsErrorDialog.showErrorDialog(e); } } } } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getTitle(java.util.Locale) */ public String getTitle(Locale locale) { return CmsVaadinUtils.getMessageText(Messages.GUI_LOCALECOMPARE_ADD_DONT_TRANSLATE_0); } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getVisibility(java.lang.Object) */ @SuppressWarnings("synthetic-access") public CmsMenuItemVisibilityMode getVisibility(MenuContext context) { CmsSitemapTreeNodeData entry = context.getData(); boolean result = context.isMainLocale() && !entry.isMarkedNoTranslation(m_localeContext.getComparisonLocale()) && !entry.isLinked(); return visibleIfTrue(result); } } /** * 'Open page' menu entry.

*/ class EntryOpen implements I_CmsSimpleContextMenuEntry { /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#executeAction(java.lang.Object) */ @SuppressWarnings("synthetic-access") public void executeAction(MenuContext context) { openTargetPage((CmsSitemapTreeNodeData)(context.getNode().getData()), false); } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getTitle(java.util.Locale) */ public String getTitle(Locale locale) { return CmsVaadinUtils.getMessageText(Messages.GUI_LOCALECOMPARE_OPEN_PAGE_0); } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getVisibility(java.lang.Object) */ public CmsMenuItemVisibilityMode getVisibility(MenuContext data) { return visibleIfTrue(true); } } /** * 'Properties' menu entry.

*/ class EntryProperties implements I_CmsSimpleContextMenuEntry { /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#executeAction(java.lang.Object) */ @SuppressWarnings("synthetic-access") public void executeAction(MenuContext context) { ((CmsSitemapUI)A_CmsUI.get()).getSitemapExtension().openPropertyDialog( context.getData().getResource().getStructureId(), m_root.getStructureId()); } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getTitle(java.util.Locale) */ public String getTitle(Locale locale) { return CmsVaadinUtils.getMessageText(Messages.GUI_LOCALECOMPARE_PROPERTIES_0); } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getVisibility(java.lang.Object) */ public CmsMenuItemVisibilityMode getVisibility(MenuContext context) { return visibleIfTrue(true); } } /** * 'Remove mark' menu entry.

*/ class EntryRemoveMark implements I_CmsSimpleContextMenuEntry { /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#executeAction(java.lang.Object) */ @SuppressWarnings("synthetic-access") public void executeAction(MenuContext context) { CmsSitemapTreeNodeData entry = context.getData(); CmsSitemapTreeNode node = context.getNode(); CmsObject cms = A_CmsUI.getCmsObject(); CmsLockActionRecord actionRecord = null; CmsResource fileToModify2 = null; try { CmsResource primary = A_CmsUI.getCmsObject().readResource( entry.getClientEntry().getId(), CmsResourceFilter.IGNORE_EXPIRATION); if (primary.isFolder()) { CmsResource defaultFile = A_CmsUI.getCmsObject().readDefaultFile( primary, CmsResourceFilter.IGNORE_EXPIRATION); if (defaultFile != null) { primary = defaultFile; } } final CmsResource primaryFinal = primary; fileToModify2 = primaryFinal; if (fileToModify2.isFolder()) { try { fileToModify2 = A_CmsUI.getCmsObject().readDefaultFile( fileToModify2, CmsResourceFilter.IGNORE_EXPIRATION); } catch (CmsException e) { LOG.error(e.getLocalizedMessage(), e); } } actionRecord = CmsLockUtil.ensureLock(cms, fileToModify2); m_localeContext.getComparisonLocale().toString(); CmsProperty prop = cms.readPropertyObject( fileToModify2, CmsPropertyDefinition.PROPERTY_LOCALE_NOTRANSLATION, false); String propValue = prop.getValue(); if (propValue == null) { propValue = ""; // make getLocales not return null } List currentLocales = CmsLocaleManager.getLocales(propValue); if (currentLocales.contains(m_localeContext.getComparisonLocale())) { currentLocales.remove(m_localeContext.getComparisonLocale()); String newPropValue = Joiner.on(",").join(currentLocales); CmsProperty newProp = new CmsProperty( CmsPropertyDefinition.PROPERTY_LOCALE_NOTRANSLATION, newPropValue, null); cms.writePropertyObjects(primaryFinal, Arrays.asList(newProp)); DialogContext dialogContext = new DialogContext( A_CmsUI.getCmsObject().readResource( entry.getClientEntry().getId(), CmsResourceFilter.IGNORE_EXPIRATION), node); dialogContext.finish(Arrays.asList(fileToModify2.getStructureId())); } } catch (CmsException e) { LOG.error(e.getLocalizedMessage(), e); CmsErrorDialog.showErrorDialog(e); } finally { if ((actionRecord != null) && (actionRecord.getChange() == LockChange.locked)) { try { cms.unlockResource(fileToModify2); } catch (CmsException e) { LOG.error(e.getLocalizedMessage(), e); CmsErrorDialog.showErrorDialog(e); } } } } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getTitle(java.util.Locale) */ public String getTitle(Locale locale) { return CmsVaadinUtils.getMessageText(Messages.GUI_LOCALECOMPARE_REMOVE_DONT_TRANSLATE_0); } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getVisibility(java.lang.Object) */ @SuppressWarnings("synthetic-access") public CmsMenuItemVisibilityMode getVisibility(MenuContext context) { boolean result = context.isMainLocale() && context.getData().isMarkedNoTranslation(m_localeContext.getComparisonLocale()); return visibleIfTrue(result); } } /** * 'Unlink' menu entry.

*/ class EntryUnlink implements I_CmsSimpleContextMenuEntry { /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#executeAction(java.lang.Object) */ @SuppressWarnings("synthetic-access") public void executeAction(MenuContext context) { try { CmsResource secondary = context.getData().getLinkedResource(); DialogContext dialogContext = new DialogContext( A_CmsUI.getCmsObject().readResource( context.getData().getClientEntry().getId(), CmsResourceFilter.IGNORE_EXPIRATION), context.getNode()); CmsUnlinkDialog dialog = new CmsUnlinkDialog(dialogContext, secondary); dialogContext.start( CmsVaadinUtils.getMessageText(Messages.GUI_LOCALECOMPARE_UNLINK_LOCALE_VARIANT_0), dialog, DialogWidth.wide); } catch (CmsException e) { LOG.error(e.getLocalizedMessage(), e); CmsErrorDialog.showErrorDialog(e); } } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getTitle(java.util.Locale) */ public String getTitle(Locale locale) { return CmsVaadinUtils.getMessageText(Messages.GUI_LOCALECOMPARE_UNLINK_LOCALE_VARIANT_0); } /** * @see org.opencms.ui.contextmenu.I_CmsSimpleContextMenuEntry#getVisibility(java.lang.Object) */ @SuppressWarnings("synthetic-access") public CmsMenuItemVisibilityMode getVisibility(final MenuContext context) { if (!context.getData().isLinked()) { return visibleIfTrue(false); } try { CmsResource primary = A_CmsUI.getCmsObject().readResource( context.getData().getClientEntry().getId(), CmsResourceFilter.IGNORE_EXPIRATION); if (primary.isFolder()) { CmsResource defaultFile = A_CmsUI.getCmsObject().readDefaultFile( primary, CmsResourceFilter.IGNORE_EXPIRATION); if (defaultFile != null) { primary = defaultFile; } } CmsLocaleGroupService groupService = A_CmsUI.getCmsObject().getLocaleGroupService(); Locale mainLocale = groupService.getMainLocale(m_localeContext.getRoot().getRootPath()); int mainLocaleCount = 0; for (Locale testLocale : Arrays.asList( m_localeContext.getRootLocale(), m_localeContext.getComparisonLocale())) { mainLocaleCount += mainLocale.equals(testLocale) ? 1 : 0; } return visibleIfTrue(mainLocaleCount == 1); } catch (Exception e) { return visibleIfTrue(false); } } } /** * Context object for the context menu.

*/ class MenuContext { /** The tree node data. */ private CmsSitemapTreeNodeData m_data; /** The tree node widget. */ private CmsSitemapTreeNode m_node; /** * Creates a new instance.

* * @param data the sitemap tree data * @param node the tree node widget */ public MenuContext(CmsSitemapTreeNodeData data, CmsSitemapTreeNode node) { m_node = node; m_data = data; } /** * Gets the tree node data.

* * @return the tree node data */ public CmsSitemapTreeNodeData getData() { return m_data; } /** * Gets the tree node widget.

* * @return the tree node widget */ public CmsSitemapTreeNode getNode() { return m_node; } /** * Checks if the currently selected locale is the main locale.

* * @return true if we are in the main locale */ @SuppressWarnings("synthetic-access") public boolean isMainLocale() { return m_localeContext.getRootLocale().equals( A_CmsUI.getCmsObject().getLocaleGroupService().getMainLocale(m_localeContext.getRoot().getRootPath())); } } /** Default width for linked items displayed on the right side of tree items. */ public static final int RHS_WIDTH = 420; /** The log isntance for this class. */ private static final Log LOG = CmsLog.getLog(CmsSitemapTreeController.class); /** The context menu. */ CmsContextMenu m_menu = new CmsContextMenu(); /** The currently opened window. */ Window m_window; /** Map of already loaded nodes. */ private IdentityHashMap m_alreadyLoaded = new IdentityHashMap<>(); /** Current root node widget. */ private CmsSitemapTreeNode m_currentRootNode; /** The locale context. */ private I_CmsLocaleCompareContext m_localeContext; /** The resource corresponding to the tree's root. */ private CmsResource m_root; /** The tree data provider. */ private CmsSitemapTreeDataProvider m_treeDataProvider; /** * Creates a new instance.

* * @param cms the CMS context * @param root the tree's root resource * @param context the locale comparison context * @param parent the parent widget in which the tree will be rendered */ public CmsSitemapTreeController( CmsObject cms, CmsResource root, I_CmsLocaleCompareContext context, Component parent) { m_treeDataProvider = new CmsSitemapTreeDataProvider(cms, root, context); m_localeContext = context; m_root = root; m_menu.extend((AbstractComponent)parent); } /** * Returns VISIBILITY_ACTIVE if the given parameter is true, and VISIBILITY_INACTIVE otherwise.

* * @param condition a boolean value * @return the visibility based on the condition value */ public static CmsMenuItemVisibilityMode activeIfTrue(boolean condition) { return condition ? CmsMenuItemVisibilityMode.VISIBILITY_ACTIVE : CmsMenuItemVisibilityMode.VISIBILITY_INACTIVE; } /** * Returns VISIBILITY_ACTIVE if the given parameter is true, and VISIBILITY_INVISIBLE otherwise.

* * @param condition a boolean value * @return the visibility based on the condition value */ public static CmsMenuItemVisibilityMode visibleIfTrue(boolean condition) { return condition ? CmsMenuItemVisibilityMode.VISIBILITY_ACTIVE : CmsMenuItemVisibilityMode.VISIBILITY_INVISIBLE; } /** * Creates a sitemap tree node widget from a tree node bean.

* * @param entry the tree node bean * @return the tree node widget */ public CmsSitemapTreeNode createNode(final CmsSitemapTreeNodeData entry) { final CmsSitemapTreeNode node = new CmsSitemapTreeNode(); node.addLayoutClickListener(new LayoutClickListener() { private static final long serialVersionUID = 1L; @SuppressWarnings("synthetic-access") public void layoutClick(LayoutClickEvent event) { Component currentComponent = event.getClickedComponent(); if (currentComponent != null) { boolean linked = false; do { currentComponent = currentComponent.getParent(); if ((currentComponent != null) && "linked".equals(((AbstractComponent)currentComponent).getData())) { linked = true; } if (event.getClickedComponent() instanceof CmsResourceIcon) { if (currentComponent == node) { openTargetPage((CmsSitemapTreeNodeData)(node.getData()), linked); } else if (currentComponent instanceof CmsSitemapTreeNode) { break; } } } while (currentComponent != null); } } }); String icon = CmsResourceIcon.getSitemapResourceIcon( A_CmsUI.getCmsObject(), entry.getResource(), IconMode.localeCompare); CmsResourceInfo info = new CmsResourceInfo( entry.getClientEntry().getTitle(), entry.getClientEntry().getSitePath(), icon); info = CmsResourceInfo.createSitemapResourceInfo( entry.getResource(), OpenCms.getSiteManager().getSiteForRootPath(m_localeContext.getRoot().getRootPath())); info.getResourceIcon().addStyleName(OpenCmsTheme.POINTER); info.getResourceIcon().setDescription(CmsVaadinUtils.getMessageText(Messages.GUI_LOCALECOMPARE_OPEN_PAGE_0)); if (entry.getClientEntry().isHiddenNavigationEntry()) { info.addStyleName(OpenCmsTheme.RESOURCE_INFO_WEAK); } final MenuBar menu = new MenuBar(); boolean noTranslation = false; noTranslation = entry.isMarkedNoTranslation(m_localeContext.getComparisonLocale()); final MenuItem main = menu.addItem("", null); main.setIcon(FontOpenCms.CONTEXT_MENU); CssLayout rightSide = new CssLayout(); info.setButtonWidget(rightSide); rightSide.addComponent(menu); main.setCommand(new Command() { /** Serial version id. */ private static final long serialVersionUID = 1L; public void menuSelected(MenuItem selectedItem) { List> entries = Arrays.asList( new EntryOpen(), new EntryExplorer(), new EntryProperties(), new EntryLink(), new EntryUnlink(), new EntryMark(), new EntryRemoveMark(), new EntryCopy(), new EntryInfo()); MenuContext context = new MenuContext(entry, node); m_menu.setEntries(entries, context); m_menu.open(menu); } }); menu.addStyleName("borderless o-toolbar-button o-resourceinfo-toolbar"); if (entry.isLinked()) { CmsSite site = OpenCms.getSiteManager().getSiteForRootPath(m_localeContext.getRoot().getRootPath()); CmsResourceInfo linkedInfo = CmsResourceInfo.createSitemapResourceInfo( readSitemapEntryFolderIfPossible(entry.getLinkedResource()), site); linkedInfo.addStyleName(OpenCmsTheme.RESOURCE_INFO_DIRECTLINK); rightSide.addComponent(linkedInfo, 0); linkedInfo.setWidth(RHS_WIDTH + "px"); node.setContent(info); linkedInfo.setData("linked"); // Data used by click handler to distinguish clicked resource icons linkedInfo.getResourceIcon().setDescription( CmsVaadinUtils.getMessageText(Messages.GUI_LOCALECOMPARE_OPEN_PAGE_0)); linkedInfo.getResourceIcon().addStyleName(OpenCmsTheme.POINTER); } else { if (noTranslation) { CmsResourceInfo noTranslationInfo = new CmsResourceInfo(); String topMessage = CmsVaadinUtils.getMessageText(Messages.GUI_LOCALECOMPARE_NO_TRANSLATION_TOP_0); String bottomMessage = CmsVaadinUtils.getMessageText( Messages.GUI_LOCALECOMPARE_NO_TRANSLATION_BOTTOM_0); noTranslationInfo.getTopLine().setValue(topMessage); noTranslationInfo.getBottomLine().setValue(bottomMessage); noTranslationInfo.getResourceIcon().setValue( "" + FontAwesome.BAN.getHtml() + ""); noTranslationInfo.addStyleName(OpenCmsTheme.RESOURCE_INFO_DIRECTLINK); noTranslationInfo.setWidth(RHS_WIDTH + "px"); rightSide.addComponent(noTranslationInfo, 0); } node.setContent(info); } if (entry.hasNoChildren()) { node.setOpen(true); node.setOpenerVisible(false); } node.setData(entry); return node; } /** * Creates the root node of the tree.

* * @return the root node of the tree */ public CmsSitemapTreeNode createRootNode() { m_currentRootNode = createNode(m_treeDataProvider.getRoot()); return m_currentRootNode; } /** * Gets the resource corresponding to the tree's root.

* * @return the resource for the root node */ public CmsResource getRoot() { return m_root; } /** * Initializes the event handlers for a tree node widget.

* * @param node the node for which to initialize the event handlers */ public void initEventHandlers(final CmsSitemapTreeNode node) { node.getOpener().addClickListener(new ClickListener() { private static final long serialVersionUID = 1L; public void buttonClick(ClickEvent event) { CmsSitemapTreeController.this.onClickOpen(node); } }); } /** * Called when the user clicks on the 'opener' icon of a sitemap tree entry.

* * @param node the sitemap node widget */ public void onClickOpen(CmsSitemapTreeNode node) { if (node.isOpen()) { node.setOpen(false); } else { if (!m_alreadyLoaded.containsKey(node)) { Object nodeData = node.getData(); List children = m_treeDataProvider.getChildren( (CmsSitemapTreeNodeData)nodeData); m_alreadyLoaded.put(node, null); if (children.isEmpty()) { node.setOpenerVisible(false); } else { for (CmsSitemapTreeNodeData child : children) { CmsSitemapTreeNode childNode = createNode(child); childNode.setData(child); initEventHandlers(childNode); node.getChildren().addComponent(childNode); } } } node.setOpen(true); } } /** * Opens the page copy dialog for a tree entry.

* * @param node the tree node widget * @param entry the tree entry */ public void openPageCopyDialog(CmsSitemapTreeNode node, CmsSitemapTreeNodeData entry) { CmsObject cms = A_CmsUI.getCmsObject(); try { CmsResource resource = cms.readResource( entry.getClientEntry().getId(), CmsResourceFilter.IGNORE_EXPIRATION); DialogContext context = new DialogContext(resource, node); CmsCopyPageDialog dialog = new CmsCopyPageDialog(context); String title = CmsVaadinUtils.getMessageText(Messages.GUI_COPYPAGE_DIALOG_TITLE_0); context.start(title, dialog); } catch (CmsException e) { LOG.error(e.getLocalizedMessage(), e); CmsErrorDialog.showErrorDialog(e); } } /** * Updates a sitemap node widget after the resource it corresponds to has changed.

* * @param node the sitemap node */ public void updateNode(CmsSitemapTreeNode node) { CmsSitemapTreeNodeData data = (CmsSitemapTreeNodeData)node.getData(); try { CmsSitemapTreeNodeData changedData = m_treeDataProvider.getData( A_CmsUI.getCmsObject().readResource( data.getClientEntry().getId(), CmsResourceFilter.IGNORE_EXPIRATION)); CmsSitemapTreeNode changedNode = createNode(changedData); initEventHandlers(changedNode); ComponentContainer parent = (ComponentContainer)(node.getParent()); parent.replaceComponent(node, changedNode); } catch (CmsException e) { LOG.error(e.getLocalizedMessage(), e); } } /** * Updates the tree node for the resource with the given structure id, if it exists.

* * @param id the structure id of a resource */ public void updateNodeForId(final CmsUUID id) { final List nodes = Lists.newArrayList(); CmsVaadinUtils.visitDescendants(m_currentRootNode, new Predicate() { public boolean apply(Component input) { if (input instanceof CmsSitemapTreeNode) { CmsSitemapTreeNode node = (CmsSitemapTreeNode)input; CmsSitemapTreeNodeData data = (CmsSitemapTreeNodeData)node.getData(); if (data.getResource().getStructureId().equals(id)) { nodes.add(node); return false; } } return true; } }); if (nodes.size() == 1) { updateNode(nodes.get(0)); } } /** * If the given resource is the default file of a sitmeap entry folder, then returns that * folder, else the original file.

* * @param resource a resource * @return the resource or its parent folder */ protected CmsResource readSitemapEntryFolderIfPossible(CmsResource resource) { CmsObject cms = A_CmsUI.getCmsObject(); try { if (resource.isFolder()) { return resource; } CmsResource parent = cms.readParentFolder(resource.getStructureId()); CmsResource defaultFile = cms.readDefaultFile(parent, CmsResourceFilter.IGNORE_EXPIRATION); if ((defaultFile != null) && defaultFile.equals(resource)) { return parent; } return resource; } catch (CmsException e) { LOG.error(e.getLocalizedMessage(), e); return resource; } } /** * Gets the logger for the tree controller.

* * @return the logger */ Log getTreeControllerLog() { return LOG; } /** * Opens the page corresponding to a sitemap entry.

* * @param nodeData the node bean * @param second true if the user has clicked on the second resource box in a tree node */ private void openTargetPage(CmsSitemapTreeNodeData nodeData, boolean second) { CmsUUID id = nodeData.getClientEntry().getId(); CmsUUID defaultFileId = nodeData.getClientEntry().getDefaultFileId(); CmsUUID targetId = defaultFileId; if (targetId == null) { targetId = id; } try { CmsResource resource = A_CmsUI.getCmsObject().readResource(targetId, CmsResourceFilter.IGNORE_EXPIRATION); String link = OpenCms.getLinkManager().substituteLink(A_CmsUI.getCmsObject(), resource); if (second) { resource = A_CmsUI.getCmsObject().readResource( nodeData.getLinkedResource().getStructureId(), CmsResourceFilter.IGNORE_EXPIRATION); link = OpenCms.getLinkManager().substituteLink(A_CmsUI.getCmsObject(), resource); } String mySiteRoot = A_CmsUI.getCmsObject().getRequestContext().getSiteRoot(); final boolean sameSite = mySiteRoot.equals(OpenCms.getSiteManager().getSiteRoot(resource.getRootPath())); if (sameSite) { A_CmsUI.get().getPage().setLocation(link); } else { String message = CmsVaadinUtils.getMessageText( Messages.GUI_LOCALECOMPARE_SHOW_WRONGSITE_1, resource.getRootPath()); Notification.show(message, Type.ERROR_MESSAGE); } } catch (CmsException e) { LOG.error(e.getLocalizedMessage(), e); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy