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

org.opencms.ui.dialogs.CmsNewDialog 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.dialogs;

import org.opencms.ade.configuration.CmsADEConfigData;
import org.opencms.ade.configuration.CmsElementView;
import org.opencms.ade.configuration.CmsResourceTypeConfig;
import org.opencms.ade.containerpage.CmsAddDialogTypeHelper;
import org.opencms.ade.galleries.shared.CmsResourceTypeBean;
import org.opencms.ade.galleries.shared.CmsResourceTypeBean.Origin;
import org.opencms.configuration.preferences.CmsElementViewPreference;
import org.opencms.db.CmsUserSettings;
import org.opencms.file.CmsObject;
import org.opencms.file.CmsResource;
import org.opencms.main.CmsLog;
import org.opencms.main.OpenCms;
import org.opencms.ui.A_CmsUI;
import org.opencms.ui.CmsVaadinUtils;
import org.opencms.ui.I_CmsDialogContext;
import org.opencms.ui.Messages;
import org.opencms.ui.apps.CmsAppWorkplaceUi;
import org.opencms.ui.components.CmsBasicDialog;
import org.opencms.ui.components.CmsOkCancelActionHandler;
import org.opencms.ui.components.CmsResourceInfo;
import org.opencms.ui.components.extensions.CmsPropertyDialogExtension;
import org.opencms.ui.util.CmsNewResourceBuilder;
import org.opencms.ui.util.CmsNewResourceBuilder.I_Callback;
import org.opencms.util.CmsStringUtil;
import org.opencms.util.CmsUUID;
import org.opencms.workplace.CmsWorkplace;
import org.opencms.workplace.explorer.CmsExplorerTypeSettings;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import org.apache.commons.logging.Log;

import com.google.common.base.Predicate;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.vaadin.annotations.DesignRoot;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.event.LayoutEvents.LayoutClickEvent;
import com.vaadin.event.LayoutEvents.LayoutClickListener;
import com.vaadin.server.FontAwesome;
import com.vaadin.server.VaadinService;
import com.vaadin.ui.AbstractComponent;
import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.declarative.Design;

/**
 * Dialog for creating new resources.

*/ @DesignRoot public class CmsNewDialog extends CmsBasicDialog { /** Default value for the 'default location' check box. */ public static final Boolean DEFAULT_LOCATION_DEFAULT = Boolean.TRUE; /** Id for the 'All' pseudo-view. */ public static final CmsUUID ID_VIEW_ALL = CmsUUID.getConstantUUID("view-all"); /** Setting name for the standard view. */ public static final String SETTING_STANDARD_VIEW = "newDialogStandardView"; /** The 'All' pseudo-view. */ public static final CmsElementView VIEW_ALL = new CmsElementView(ID_VIEW_ALL); /** Logger instance for this class. */ private static final Log LOG = CmsLog.getLog(CmsNewDialog.class); /** Serial version id. */ private static final long serialVersionUID = 1L; /** The cancel button. */ protected Button m_cancelButton; /** The created resource. */ protected CmsResource m_createdResource; /** The current view id. */ protected CmsElementView m_currentView; /** Check box for enabling / disabling default creation folders. */ protected CheckBox m_defaultLocationCheckbox; /** The dialog context. */ protected I_CmsDialogContext m_dialogContext; /** The current folder. */ protected CmsResource m_folderResource; /** The selected type. */ protected CmsResourceTypeBean m_selectedType; /** Container for the type list. */ protected VerticalLayout m_typeContainer; /** The type helper. */ protected CmsAddDialogTypeHelper m_typeHelper; /** Element view selector. */ protected ComboBox m_viewSelector; /** List of all types. */ private List m_allTypes; /** * Creates a new instance.

* * @param folderResource the folder resource * @param context the context */ public CmsNewDialog(CmsResource folderResource, I_CmsDialogContext context) { m_folderResource = folderResource; m_dialogContext = context; Design.read(this); CmsVaadinUtils.visitDescendants(this, new Predicate() { public boolean apply(Component component) { component.setCaption(CmsVaadinUtils.localizeString(component.getCaption())); return true; } }); CmsUUID initViewId = (CmsUUID)VaadinService.getCurrentRequest().getWrappedSession().getAttribute( SETTING_STANDARD_VIEW); if (initViewId == null) { try { CmsUserSettings settings = new CmsUserSettings(A_CmsUI.getCmsObject()); String viewSettingStr = settings.getAdditionalPreference( CmsElementViewPreference.EXPLORER_PREFERENCE_NAME, true); if ((viewSettingStr != null) && CmsUUID.isValidUUID(viewSettingStr)) { initViewId = new CmsUUID(viewSettingStr); } } catch (Exception e) { LOG.error(e.getLocalizedMessage(), e); } } if (initViewId == null) { initViewId = CmsUUID.getNullUUID(); } CmsElementView initView = initViews(initViewId); m_cancelButton.addClickListener(new ClickListener() { private static final long serialVersionUID = 1L; public void buttonClick(ClickEvent event) { finish(new ArrayList()); } }); m_defaultLocationCheckbox.setValue(getInitialValueForUseDefaultLocationOption(folderResource)); m_defaultLocationCheckbox.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; public void valueChange(ValueChangeEvent event) { try { init(m_currentView, ((Boolean)event.getProperty().getValue()).booleanValue()); } catch (Exception e) { m_dialogContext.error(e); } } }); m_viewSelector.setNullSelectionAllowed(false); m_viewSelector.setTextInputAllowed(false); m_typeContainer.addLayoutClickListener(new LayoutClickListener() { private static final long serialVersionUID = 1L; public void layoutClick(LayoutClickEvent event) { CmsResourceTypeBean clickedType = (CmsResourceTypeBean)(((AbstractComponent)(event.getChildComponent())).getData()); handleSelection(clickedType); } }); setActionHandler(new CmsOkCancelActionHandler() { private static final long serialVersionUID = 1L; @Override protected void cancel() { finish(new ArrayList()); } @Override protected void ok() { // nothing to do } }); init(initView, true); } /** * Notifies the context that the given ids have changed.

* * @param ids the ids */ public void finish(List ids) { m_dialogContext.finish(ids); if (ids.size() == 1) { m_dialogContext.focus(ids.get(0)); } } /** * Initializes and displays the type list for the given view.

* * @param view the element view * @param useDefault true if we should use the default location for resource creation */ public void init(CmsElementView view, boolean useDefault) { m_currentView = view; if (!view.getId().equals(m_viewSelector.getValue())) { m_viewSelector.setValue(view.getId()); } m_typeContainer.removeAllComponents(); List typeBeans = m_typeHelper.getPrecomputedTypes(view); if (view.getId().equals(ID_VIEW_ALL)) { typeBeans = m_allTypes; } if (typeBeans == null) { LOG.warn("precomputed type list is null: " + view.getTitle(A_CmsUI.getCmsObject(), Locale.ENGLISH)); return; } for (CmsResourceTypeBean type : typeBeans) { final String typeName = type.getType(); String title = typeName; String subtitle = getSubtitle(type, useDefault); CmsExplorerTypeSettings explorerType = OpenCms.getWorkplaceManager().getExplorerTypeSetting(typeName); String iconUri = explorerType.getBigIconIfAvailable(); title = CmsVaadinUtils.getMessageText(explorerType.getKey()); CmsResourceInfo info = new CmsResourceInfo( title, subtitle, CmsWorkplace.getResourceUri("filetypes/" + iconUri)); info.setData(type); m_typeContainer.addComponent(info); // info.getButtonLabel().setContentMode(ContentMode.HTML); // String labelClass = getLabelClass(); // info.getButtonLabel().setValue(""); // info.getButtonLabel().addStyleName(OpenCmsTheme.RESINFO_HIDDEN_ICON); } } /** * Creates type helper which is responsible for generating the type list.

* * @return the type helper */ protected CmsAddDialogTypeHelper createTypeHelper() { return new CmsAddDialogTypeHelper() { @Override protected boolean exclude(CmsResourceTypeBean type) { String typeName = type.getType(); CmsExplorerTypeSettings explorerType = OpenCms.getWorkplaceManager().getExplorerTypeSetting(typeName); boolean noCreate = !(type.isCreatableType() && !type.isDeactivated()); return noCreate || (explorerType == null) || CmsStringUtil.isEmpty(explorerType.getNewResourceUri()); } }; } /** * Gets the HTML for the action buttons the type info boxes.

* * @return the HTML for the buttons */ protected String getActionIconHtml() { return FontAwesome.PLUS.getHtml(); } /** * Returns the class for the button label.

* * @return the CSS class for the button label */ protected String getLabelClass() { return "o-addIcon"; } /** * Gets the subtitle for the type info widget.

* * @param type the type * @param useDefault true if we are in 'use default' mode * * @return the subtitle */ protected String getSubtitle(CmsResourceTypeBean type, boolean useDefault) { String subtitle = ""; CmsExplorerTypeSettings explorerType = OpenCms.getWorkplaceManager().getExplorerTypeSetting(type.getType()); if ((explorerType != null) && (explorerType.getInfo() != null)) { subtitle = CmsVaadinUtils.getMessageText(explorerType.getInfo()); } if (useDefault && (type.getOrigin() == Origin.config) && (type.getCreatePath() != null)) { String path = type.getCreatePath(); CmsObject cms = A_CmsUI.getCmsObject(); path = cms.getRequestContext().removeSiteRoot(path); subtitle = CmsVaadinUtils.getMessageText(Messages.GUI_NEW_CREATE_IN_PATH_1, path); } return subtitle; } /** * Handles selection of a type.

* * @param selectedType the selected type */ protected void handleSelection(final CmsResourceTypeBean selectedType) { CmsObject cms = A_CmsUI.getCmsObject(); m_selectedType = selectedType; try { CmsNewResourceBuilder builder = new CmsNewResourceBuilder(cms); builder.addCallback(new I_Callback() { public void onError(Exception e) { m_dialogContext.error(e); } public void onResourceCreated(CmsNewResourceBuilder builderParam) { finish(Lists.newArrayList(builderParam.getCreatedResource().getStructureId())); } }); m_selectedType = selectedType; Boolean useDefaultLocation = m_defaultLocationCheckbox.getValue(); if (useDefaultLocation.booleanValue() && (m_selectedType.getCreatePath() != null)) { try { CmsADEConfigData configData = OpenCms.getADEManager().lookupConfiguration( cms, m_folderResource.getRootPath()); CmsResourceTypeConfig typeConfig = configData.getResourceType(m_selectedType.getType()); if (typeConfig != null) { typeConfig.configureCreateNewElement(cms, m_folderResource.getRootPath(), builder); } } catch (Exception e) { m_dialogContext.error(e); } } else { boolean explorerNameGenerationMode = false; String sitePath = cms.getRequestContext().removeSiteRoot(m_folderResource.getRootPath()); String namePattern = m_selectedType.getNamePattern(); if (CmsStringUtil.isEmptyOrWhitespaceOnly(namePattern)) { namePattern = OpenCms.getWorkplaceManager().getDefaultNamePattern(m_selectedType.getType()); explorerNameGenerationMode = true; } String fileName = CmsStringUtil.joinPaths(sitePath, namePattern); builder.setPatternPath(fileName); builder.setType(m_selectedType.getType()); builder.setExplorerNameGeneration(explorerNameGenerationMode); } CmsPropertyDialogExtension ext = new CmsPropertyDialogExtension(A_CmsUI.get(), null); CmsAppWorkplaceUi.get().disableGlobalShortcuts(); ext.editPropertiesForNewResource(builder); finish(new ArrayList()); } catch (Exception e) { throw new RuntimeException(e); } } /** * Gets the initial value for the 'default location' option.

* * @param folderResource the current folder * * @return the initial value for the option */ private Boolean getInitialValueForUseDefaultLocationOption(CmsResource folderResource) { String rootPath = folderResource.getRootPath(); return Boolean.valueOf(OpenCms.getSiteManager().getSiteForRootPath(rootPath) != null); } /** * Initializes the view selector, using the given view id as an initial value.

* * @param startId the start view * * @return the start view */ private CmsElementView initViews(CmsUUID startId) { Map viewMap = OpenCms.getADEManager().getElementViews(A_CmsUI.getCmsObject()); List viewList = new ArrayList(viewMap.values()); Collections.sort(viewList, new Comparator() { public int compare(CmsElementView arg0, CmsElementView arg1) { return ComparisonChain.start().compare(arg0.getOrder(), arg1.getOrder()).result(); } }); m_viewSelector.setItemCaptionMode(ItemCaptionMode.EXPLICIT); m_typeHelper = createTypeHelper(); m_typeHelper.precomputeTypeLists( A_CmsUI.getCmsObject(), m_folderResource.getRootPath(), A_CmsUI.getCmsObject().getRequestContext().removeSiteRoot(m_folderResource.getRootPath()), viewList, null); // also collect types in LinkedHashMap to preserve order and ensure uniqueness LinkedHashMap allTypes = Maps.newLinkedHashMap(); for (CmsElementView view : viewList) { if (view.hasPermission(A_CmsUI.getCmsObject(), m_folderResource)) { List typeBeans = m_typeHelper.getPrecomputedTypes(view); if (typeBeans.isEmpty()) { continue; } for (CmsResourceTypeBean typeBean : typeBeans) { allTypes.put(typeBean.getType(), typeBean); } m_viewSelector.addItem(view.getId()); m_viewSelector.setItemCaption( view.getId(), view.getTitle(A_CmsUI.getCmsObject(), A_CmsUI.get().getLocale())); } } m_viewSelector.addItem(VIEW_ALL.getId()); m_viewSelector.setItemCaption(VIEW_ALL.getId(), CmsVaadinUtils.getMessageText(Messages.GUI_VIEW_ALL_0)); m_allTypes = Lists.newArrayList(allTypes.values()); if (allTypes.size() <= 8) { startId = ID_VIEW_ALL; } if (m_viewSelector.getItem(startId) == null) { startId = (CmsUUID)(m_viewSelector.getItemIds().iterator().next()); } m_viewSelector.addValueChangeListener(new ValueChangeListener() { private static final long serialVersionUID = 1L; public void valueChange(ValueChangeEvent event) { CmsUUID viewId = (CmsUUID)(event.getProperty().getValue()); CmsElementView selectedView; if (viewId.equals(ID_VIEW_ALL)) { selectedView = VIEW_ALL; } else { selectedView = OpenCms.getADEManager().getElementViews(A_CmsUI.getCmsObject()).get( event.getProperty().getValue()); } init(selectedView, m_defaultLocationCheckbox.getValue().booleanValue()); if (selectedView != VIEW_ALL) { VaadinService.getCurrentRequest().getWrappedSession().setAttribute( SETTING_STANDARD_VIEW, (event.getProperty().getValue())); } } }); if (startId.equals(ID_VIEW_ALL)) { return VIEW_ALL; } else { return OpenCms.getADEManager().getElementViews(A_CmsUI.getCmsObject()).get(startId); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy