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.CmsListInfoBean;
043import org.opencms.util.CmsStringUtil;
044
045import com.google.gwt.user.client.ui.Label;
046import com.google.gwt.user.client.ui.SimplePanel;
047
048/**
049 * Sitemap toolbar new menu button.<p>
050 *
051 * @since 8.0.0
052 */
053public class CmsToolbarNewButton extends A_CmsToolbarListMenuButton {
054
055    /** The tag for identifying redirect items. */
056    public static final String TAG_REDIRECT = "redirect";
057
058    /** The tag for identifying items from the special tab. */
059    public static final String TAG_SPECIAL = "special";
060
061    /** The special elements list. */
062    private CmsList<I_CmsListItem> m_detailList;
063
064    /** The function element list. */
065    private CmsList<I_CmsListItem> m_functionList;
066
067    /** The new-elements list. */
068    private CmsList<I_CmsListItem> m_newElementsList;
069
070    /**
071     * Constructor.<p>
072     *
073     * @param toolbar the toolbar instance
074     * @param controller the sitemap controller
075     */
076    public CmsToolbarNewButton(CmsSitemapToolbar toolbar, CmsSitemapController controller) {
077
078        super(
079            Messages.get().key(Messages.GUI_TOOLBAR_NEW_BUTTON_TITLE_0),
080            I_CmsButton.ButtonData.WAND_BUTTON.getIconClass(),
081            toolbar,
082            controller);
083    }
084
085    /**
086     * @see org.opencms.ade.sitemap.client.toolbar.A_CmsToolbarListMenuButton#initContent()
087     */
088    @Override
089    protected boolean initContent() {
090
091        while (m_tabs.getTabCount() > 0) {
092            m_tabs.removeTab(0);
093        }
094        boolean hasTabs = false;
095        m_newElementsList = new CmsList<I_CmsListItem>();
096        for (CmsNewResourceInfo info : getController().getData().getNewElementInfos()) {
097            m_newElementsList.add(makeNewElementItem(info));
098        }
099        if (m_newElementsList.getWidgetCount() > 0) {
100            hasTabs = true;
101            addTab(createTab(m_newElementsList), Messages.get().key(Messages.GUI_NEW_PAGES_TAB_TITLE_0));
102        }
103        m_detailList = new CmsList<I_CmsListItem>();
104        if (getController().getData().canEditDetailPages()) {
105            for (CmsNewResourceInfo typeInfo : getController().getData().getResourceTypeInfos()) {
106                if (CmsStringUtil.isEmptyOrWhitespaceOnly(typeInfo.getCreateParameter())) {
107                    CmsCreatableListItem item = makeDetailPageItem(typeInfo);
108                    m_detailList.add(item);
109                }
110            }
111        }
112
113        if (getController().canManageDetailPages()) {
114            for (CmsNewResourceInfo typeInfo : getController().getData().getResourceTypeInfos()) {
115                if (!CmsStringUtil.isEmptyOrWhitespaceOnly(typeInfo.getCreateParameter())) {
116                    CmsCreatableListItem item = makeDetailPageItem(typeInfo);
117                    m_detailList.add(item);
118                }
119            }
120        }
121        if (m_detailList.getWidgetCount() > 0) {
122            hasTabs = true;
123            addTab(createTab(m_detailList), Messages.get().key(Messages.GUI_SPECIAL_TAB_TITLE_0));
124        }
125
126        m_functionList = new CmsList<I_CmsListItem>();
127        m_functionList.add(makeRedirectItem());
128        m_functionList.add(makeNavigationLevelItem());
129
130        if (m_functionList.getWidgetCount() > 0) {
131            hasTabs = true;
132            String tabLabel = Messages.get().key(Messages.GUI_FUNCTION_TAB_TITLE_0);
133            addTab(createTab(m_functionList), tabLabel);
134        }
135
136        if (!hasTabs) {
137            // no new elements available, show appropriate message
138
139            //TODO: improve styling, add localization
140            Label messageLabel = new Label(Messages.get().key(Messages.GUI_NO_CREATABLE_ELEMENTS_0));
141            messageLabel.addStyleName(I_CmsSitemapLayoutBundle.INSTANCE.clipboardCss().menuTabContainer());
142            SimplePanel content = new SimplePanel();
143            content.setWidget(messageLabel);
144            setMenuWidget(messageLabel);
145        }
146        return false;
147    }
148
149    /**
150     * Creates a list item representing a detail page to be created.<p>
151     *
152     * @param typeInfo the bean for the type for which the detail page item should be created
153     *
154     * @return the detail page list item
155     */
156    private CmsCreatableListItem makeDetailPageItem(CmsNewResourceInfo typeInfo) {
157
158        CmsListInfoBean info = new CmsListInfoBean();
159        String subtitle = typeInfo.getSubTitle();
160        String title = Messages.get().key(
161            typeInfo.isFunction() ? Messages.GUI_FUNCTION_PAGE_TITLE_1 : Messages.GUI_DETAIL_PAGE_TITLE_1,
162            typeInfo.getTitle());
163
164        info.setTitle(title);
165        info.setSubTitle(subtitle);
166        CmsListItemWidget widget = new CmsListItemWidget(info);
167        widget.setIcon(typeInfo.getBigIconClasses());
168        CmsCreatableListItem listItem = new CmsCreatableListItem(widget, typeInfo, NewEntryType.detailpage);
169        listItem.initMoveHandle(CmsSitemapView.getInstance().getTree().getDnDHandler());
170        return listItem;
171    }
172
173    /**
174     * Creates a list item representing a redirect.<p>
175     *
176     * @return the new list item
177     */
178    private CmsCreatableListItem makeNavigationLevelItem() {
179
180        CmsNewResourceInfo typeInfo = getController().getData().getNewNavigationLevelElementInfo();
181        CmsListItemWidget widget = new CmsListItemWidget(typeInfo);
182        CmsCreatableListItem listItem = new CmsCreatableListItem(widget, typeInfo, NewEntryType.regular);
183        listItem.initMoveHandle(CmsSitemapView.getInstance().getTree().getDnDHandler());
184        return listItem;
185    }
186
187    /**
188     * Create a new-element list item.<p>
189     *
190     * @param typeInfo the new-element info
191     *
192     * @return the list item
193     */
194    private CmsCreatableListItem makeNewElementItem(final CmsNewResourceInfo typeInfo) {
195
196        CmsListItemWidget widget = new CmsListItemWidget(typeInfo);
197        if ((typeInfo.getDescription() != null) && (typeInfo.getDescription().trim().length() > 0)) {
198            widget.addAdditionalInfo(
199                new CmsAdditionalInfoBean(
200                    Messages.get().key(Messages.GUI_LABEL_DESCRIPTION_0),
201                    typeInfo.getDescription(),
202                    null));
203        }
204        if (typeInfo.getVfsPath() != null) {
205            widget.addAdditionalInfo(
206                new CmsAdditionalInfoBean(
207                    Messages.get().key(Messages.GUI_LABEL_VFSPATH_0),
208                    typeInfo.getVfsPath(),
209                    null));
210        }
211        if (typeInfo.getDate() != null) {
212            widget.addAdditionalInfo(
213                new CmsAdditionalInfoBean(Messages.get().key(Messages.GUI_LABEL_DATE_0), typeInfo.getDate(), null));
214        }
215        CmsCreatableListItem listItem = new CmsCreatableListItem(widget, typeInfo, NewEntryType.regular);
216        listItem.initMoveHandle(CmsSitemapView.getInstance().getTree().getDnDHandler(), true);
217        return listItem;
218    }
219
220    /**
221     * Creates a list item representing a redirect.<p>
222     *
223     * @return the new list item
224     */
225    private CmsCreatableListItem makeRedirectItem() {
226
227        CmsNewResourceInfo typeInfo = getController().getData().getNewRedirectElementInfo();
228        CmsListInfoBean info = new CmsListInfoBean();
229        info.setTitle(typeInfo.getTitle());
230        info.setSubTitle(Messages.get().key(Messages.GUI_REDIRECT_SUBTITLE_0));
231        CmsListItemWidget widget = new CmsListItemWidget(info);
232        widget.setIcon(typeInfo.getBigIconClasses());
233        CmsCreatableListItem listItem = new CmsCreatableListItem(widget, typeInfo, NewEntryType.redirect);
234        listItem.initMoveHandle(CmsSitemapView.getInstance().getTree().getDnDHandler());
235        return listItem;
236    }
237}