001/*
002 * This library is part of OpenCms -
003 * the Open Source Content Management System
004 *
005 * Copyright (c) Alkacon Software GmbH & Co. KG (https://www.alkacon.com)
006 *
007 * This library is free software; you can redistribute it and/or
008 * modify it under the terms of the GNU Lesser General Public
009 * License as published by the Free Software Foundation; either
010 * version 2.1 of the License, or (at your option) any later version.
011 *
012 * This library is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015 * Lesser General Public License for more details.
016 *
017 * For further information about Alkacon Software, please see the
018 * company website: https://www.alkacon.com
019 *
020 * For further information about OpenCms, please see the
021 * project website: https://www.opencms.org
022 *
023 * You should have received a copy of the GNU Lesser General Public
024 * License along with this library; if not, write to the Free Software
025 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
026 */
027
028package org.opencms.ade.sitemap.client.toolbar;
029
030import org.opencms.ade.sitemap.client.CmsSitemapView;
031import org.opencms.ade.sitemap.client.Messages;
032import org.opencms.ade.sitemap.client.control.CmsSitemapController;
033import org.opencms.ade.sitemap.client.ui.CmsCreatableListItem;
034import org.opencms.ade.sitemap.client.ui.CmsCreatableListItem.NewEntryType;
035import org.opencms.ade.sitemap.client.ui.css.I_CmsSitemapLayoutBundle;
036import org.opencms.ade.sitemap.shared.CmsNewResourceInfo;
037import org.opencms.gwt.client.ui.CmsList;
038import org.opencms.gwt.client.ui.CmsListItemWidget;
039import org.opencms.gwt.client.ui.I_CmsButton;
040import org.opencms.gwt.client.ui.I_CmsListItem;
041import org.opencms.gwt.shared.CmsAdditionalInfoBean;
042import org.opencms.gwt.shared.CmsGwtLog;
043import org.opencms.gwt.shared.CmsListInfoBean;
044import org.opencms.util.CmsStringUtil;
045
046import com.google.gwt.user.client.ui.Label;
047import com.google.gwt.user.client.ui.SimplePanel;
048
049/**
050 * Sitemap toolbar new menu button.<p>
051 *
052 * @since 8.0.0
053 */
054public class CmsToolbarNewButton extends A_CmsToolbarListMenuButton {
055
056    /** The tag for identifying redirect items. */
057    public static final String TAG_REDIRECT = "redirect";
058
059    /** The tag for identifying items from the special tab. */
060    public static final String TAG_SPECIAL = "special";
061
062    /** The special elements list. */
063    private CmsList<I_CmsListItem> m_detailList;
064
065    /** The function element list. */
066    private CmsList<I_CmsListItem> m_functionList;
067
068    /** The new-elements list. */
069    private CmsList<I_CmsListItem> m_newElementsList;
070
071    /**
072     * Constructor.<p>
073     *
074     * @param toolbar the toolbar instance
075     * @param controller the sitemap controller
076     */
077    public CmsToolbarNewButton(CmsSitemapToolbar toolbar, CmsSitemapController controller) {
078
079        super(
080            Messages.get().key(Messages.GUI_TOOLBAR_NEW_BUTTON_TITLE_0),
081            I_CmsButton.ButtonData.WAND_BUTTON.getIconClass(),
082            toolbar,
083            controller);
084    }
085
086    /**
087     * @see org.opencms.ade.sitemap.client.toolbar.A_CmsToolbarListMenuButton#initContent()
088     */
089    @Override
090    protected boolean initContent() {
091
092        while (m_tabs.getTabCount() > 0) {
093            m_tabs.removeTab(0);
094        }
095        boolean hasTabs = false;
096        m_newElementsList = new CmsList<I_CmsListItem>();
097        for (CmsNewResourceInfo info : getController().getData().getNewElementInfos()) {
098            m_newElementsList.add(makeNewElementItem(info));
099        }
100        if (m_newElementsList.getWidgetCount() > 0) {
101            hasTabs = true;
102            addTab(createTab(m_newElementsList), Messages.get().key(Messages.GUI_NEW_PAGES_TAB_TITLE_0));
103        }
104        m_detailList = new CmsList<I_CmsListItem>();
105        if (getController().getData().canEditDetailPages()) {
106            for (CmsNewResourceInfo typeInfo : getController().getData().getResourceTypeInfos()) {
107                if (CmsStringUtil.isEmptyOrWhitespaceOnly(typeInfo.getCreateParameter())) {
108                    CmsCreatableListItem item = makeDetailPageItem(typeInfo);
109                    m_detailList.add(item);
110                }
111            }
112        }
113
114        if (getController().canManageDetailPages()) {
115            for (CmsNewResourceInfo typeInfo : getController().getData().getResourceTypeInfos()) {
116                if (!CmsStringUtil.isEmptyOrWhitespaceOnly(typeInfo.getCreateParameter())) {
117                    CmsCreatableListItem item = makeDetailPageItem(typeInfo);
118                    m_detailList.add(item);
119                }
120            }
121        }
122        if (m_detailList.getWidgetCount() > 0) {
123            hasTabs = true;
124            addTab(createTab(m_detailList), Messages.get().key(Messages.GUI_SPECIAL_TAB_TITLE_0));
125        }
126
127        m_functionList = new CmsList<I_CmsListItem>();
128        m_functionList.add(makeRedirectItem());
129        m_functionList.add(makeNavigationLevelItem());
130
131        if (m_functionList.getWidgetCount() > 0) {
132            hasTabs = true;
133            String tabLabel = Messages.get().key(Messages.GUI_FUNCTION_TAB_TITLE_0);
134            addTab(createTab(m_functionList), tabLabel);
135        }
136
137        if (!hasTabs) {
138            // no new elements available, show appropriate message
139
140            //TODO: improve styling, add localization
141            Label messageLabel = new Label(Messages.get().key(Messages.GUI_NO_CREATABLE_ELEMENTS_0));
142            messageLabel.addStyleName(I_CmsSitemapLayoutBundle.INSTANCE.clipboardCss().menuTabContainer());
143            SimplePanel content = new SimplePanel();
144            content.setWidget(messageLabel);
145            setMenuWidget(messageLabel);
146        }
147        return false;
148    }
149
150    /**
151     * Creates a list item representing a detail page to be created.<p>
152     *
153     * @param typeInfo the bean for the type for which the detail page item should be created
154     *
155     * @return the detail page list item
156     */
157    private CmsCreatableListItem makeDetailPageItem(CmsNewResourceInfo typeInfo) {
158
159        CmsListInfoBean info = new CmsListInfoBean();
160        String subtitle = typeInfo.getSubTitle();
161        String title = Messages.get().key(
162            typeInfo.isFunction() ? Messages.GUI_FUNCTION_PAGE_TITLE_1 : Messages.GUI_DETAIL_PAGE_TITLE_1,
163            typeInfo.getTitle());
164
165        info.setTitle(title);
166        info.setSubTitle(subtitle);
167        CmsListItemWidget widget = new CmsListItemWidget(info);
168        widget.setIcon(typeInfo.getBigIconClasses());
169        CmsCreatableListItem listItem = new CmsCreatableListItem(widget, typeInfo, NewEntryType.detailpage);
170        listItem.initMoveHandle(CmsSitemapView.getInstance().getTree().getDnDHandler());
171        return listItem;
172    }
173
174    /**
175     * Creates a list item representing a redirect.<p>
176     *
177     * @return the new list item
178     */
179    private CmsCreatableListItem makeNavigationLevelItem() {
180
181        CmsNewResourceInfo typeInfo = getController().getData().getNewNavigationLevelElementInfo();
182        CmsListItemWidget widget = new CmsListItemWidget(typeInfo);
183        CmsCreatableListItem listItem = new CmsCreatableListItem(widget, typeInfo, NewEntryType.regular);
184        listItem.initMoveHandle(CmsSitemapView.getInstance().getTree().getDnDHandler());
185        return listItem;
186    }
187
188    /**
189     * Create a new-element list item.<p>
190     *
191     * @param typeInfo the new-element info
192     *
193     * @return the list item
194     */
195    private CmsCreatableListItem makeNewElementItem(final CmsNewResourceInfo typeInfo) {
196
197        CmsListItemWidget widget = new CmsListItemWidget(typeInfo);
198        if ((typeInfo.getDescription() != null) && (typeInfo.getDescription().trim().length() > 0)) {
199            widget.addAdditionalInfo(
200                new CmsAdditionalInfoBean(
201                    Messages.get().key(Messages.GUI_LABEL_DESCRIPTION_0),
202                    typeInfo.getDescription(),
203                    null));
204        }
205        if (typeInfo.getVfsPath() != null) {
206            widget.addAdditionalInfo(
207                new CmsAdditionalInfoBean(
208                    Messages.get().key(Messages.GUI_LABEL_VFSPATH_0),
209                    typeInfo.getVfsPath(),
210                    null));
211        }
212        if (typeInfo.getDate() != null) {
213            widget.addAdditionalInfo(
214                new CmsAdditionalInfoBean(Messages.get().key(Messages.GUI_LABEL_DATE_0), typeInfo.getDate(), null));
215        }
216        CmsCreatableListItem listItem = new CmsCreatableListItem(widget, typeInfo, NewEntryType.regular);
217        listItem.initMoveHandle(CmsSitemapView.getInstance().getTree().getDnDHandler(), true);
218        return listItem;
219    }
220
221    /**
222     * Creates a list item representing a redirect.<p>
223     *
224     * @return the new list item
225     */
226    private CmsCreatableListItem makeRedirectItem() {
227
228        CmsNewResourceInfo typeInfo = getController().getData().getNewRedirectElementInfo();
229        CmsListInfoBean info = new CmsListInfoBean();
230        info.setTitle(typeInfo.getTitle());
231        info.setSubTitle(Messages.get().key(Messages.GUI_REDIRECT_SUBTITLE_0));
232        CmsListItemWidget widget = new CmsListItemWidget(info);
233        widget.setIcon(typeInfo.getBigIconClasses());
234        CmsCreatableListItem listItem = new CmsCreatableListItem(widget, typeInfo, NewEntryType.redirect);
235        listItem.initMoveHandle(CmsSitemapView.getInstance().getTree().getDnDHandler());
236        return listItem;
237    }
238}