CCM NG/ccm-cms: Next part of porting the editing step for managing the sections of a MulitPartArticle
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4866 8810af33-2d31-482b-a856-94f89814c4df
Former-commit-id: 671c6dab9d
pull/2/head
parent
9ad91f0266
commit
5e207835fc
|
|
@ -24,8 +24,11 @@ import org.librecms.contenttypes.MultiPartArticleSection;
|
|||
import org.librecms.contenttypes.MultiPartArticleSectionManager;
|
||||
import org.librecms.contenttypes.MultiPartArticleSectionRepository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.enterprise.context.RequestScoped;
|
||||
import javax.inject.Inject;
|
||||
import javax.transaction.Transactional;
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
@ -43,6 +46,21 @@ public class MultiPartArticleSectionStepController {
|
|||
@Inject
|
||||
private MultiPartArticleSectionManager sectionManager;
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
public List<MultiPartArticleSection> retrieveSections(
|
||||
final MultiPartArticle forArticle) {
|
||||
|
||||
final MultiPartArticle article = itemRepo
|
||||
.findById(forArticle.getObjectId(),
|
||||
MultiPartArticle.class)
|
||||
.orElseThrow(() -> new IllegalArgumentException(String
|
||||
.format("No MultiPartArticle with ID %d in the database.",
|
||||
forArticle.getObjectId())));
|
||||
|
||||
return article.getSections();
|
||||
}
|
||||
|
||||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
public void moveToFirst(final MultiPartArticle article,
|
||||
final MultiPartArticleSection section) {
|
||||
|
||||
|
|
|
|||
|
|
@ -21,23 +21,35 @@ package com.arsdigita.cms.contenttypes.ui.mparticle;
|
|||
import com.arsdigita.bebop.ActionLink;
|
||||
import com.arsdigita.bebop.ColumnPanel;
|
||||
import com.arsdigita.bebop.Container;
|
||||
import com.arsdigita.bebop.DefaultSingleSelectionModel;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.Page;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.SingleSelectionModel;
|
||||
import com.arsdigita.bebop.event.ActionEvent;
|
||||
import com.arsdigita.bebop.event.ActionListener;
|
||||
import com.arsdigita.bebop.event.PrintEvent;
|
||||
import com.arsdigita.bebop.event.PrintListener;
|
||||
import com.arsdigita.bebop.event.TableActionEvent;
|
||||
import com.arsdigita.bebop.event.TableActionListener;
|
||||
import com.arsdigita.bebop.parameters.LongParameter;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.bebop.table.TableColumn;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.cms.contenttypes.ui.ResettableContainer;
|
||||
import com.arsdigita.cms.ui.GlobalNavigation;
|
||||
import com.arsdigita.cms.dispatcher.Utilities;
|
||||
import com.arsdigita.cms.ui.authoring.AuthoringKitWizard;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.kernel.KernelConfig;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.security.PermissionChecker;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
import org.librecms.contentsection.privileges.ItemPrivileges;
|
||||
import org.librecms.contenttypes.MultiPartArticle;
|
||||
import org.librecms.contenttypes.MultiPartArticleSection;
|
||||
import org.librecms.contenttypes.MultiPartArticleSectionManager;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
/**
|
||||
* Authoring kit step to manage the sections of a MultiPartArticle. Process is
|
||||
|
|
@ -126,8 +138,11 @@ public class MultiPartArticleSectionsStep extends ResettableContainer {
|
|||
sectionTable.setClassAttr(DATA_TABLE);
|
||||
|
||||
// selected section is based on the selection in the SectionTable
|
||||
selectedSectionModel = new SectionSelectionModel<>(sectionTable
|
||||
.getRowSelectionModel());
|
||||
@SuppressWarnings("unchecked")
|
||||
final SingleSelectionModel<Long> rowSelectionModel = sectionTable
|
||||
.getRowSelectionModel();
|
||||
selectedSectionModel = new SectionSelectionModel<>(
|
||||
MultiPartArticleSection.class, rowSelectionModel);
|
||||
|
||||
sectionTable.setSectionModel(selectedSectionModel);
|
||||
|
||||
|
|
@ -161,5 +176,208 @@ public class MultiPartArticleSectionsStep extends ResettableContainer {
|
|||
controller.moveToFirst(article, section);
|
||||
});
|
||||
|
||||
moveSectionModel.addChangeListener(event -> {
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
if (moveSectionModel.getSelectedKey(state) == null) {
|
||||
beginLink.setVisible(state, false);
|
||||
moveSectionLabel.setVisible(state, false);
|
||||
} else {
|
||||
beginLink.setVisible(state, true);
|
||||
moveSectionLabel.setVisible(state, true);
|
||||
final String selectedLanguage = (String) state
|
||||
.getValue(selectedLanguageParam);
|
||||
final Locale selectedLocale;
|
||||
if (selectedLanguage == null) {
|
||||
selectedLocale = KernelConfig.getConfig().getDefaultLocale();
|
||||
} else {
|
||||
selectedLocale = new Locale(selectedLanguage);
|
||||
}
|
||||
final Object[] parameterObj = {
|
||||
moveSectionModel
|
||||
.getSelectedSection(state)
|
||||
.getTitle()
|
||||
.getValue(selectedLocale)
|
||||
};
|
||||
|
||||
moveSectionLabel
|
||||
.setLabel(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.move_section_name",
|
||||
CmsConstants.CMS_BUNDLE,
|
||||
parameterObj));
|
||||
}
|
||||
});
|
||||
|
||||
// handle clicks to preview or delete a Section
|
||||
sectionTable.addTableActionListener(new TableActionListener() {
|
||||
|
||||
@Override
|
||||
public void cellSelected(final TableActionEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
final TableColumn column = sectionTable
|
||||
.getColumnModel()
|
||||
.get(event.getColumn()
|
||||
.intValue());
|
||||
|
||||
if (column.getModelIndex() == SectionTable.COL_INDEX_DELETE) {
|
||||
onlyShowComponent(state, SECTION_DELETE + typeIdStr);
|
||||
} else if (column.getModelIndex() == SectionTable.COL_INDEX_EDIT) {
|
||||
onlyShowComponent(state, SECTION_EDIT + typeIdStr);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void headSelected(final TableActionEvent event) {
|
||||
//Nothing
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
panel.add(sectionTable);
|
||||
panel.add(buildAddLink());
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds a container to hold a SectionEditForm and a link to return to the
|
||||
* section list.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected Container buildSectionEdit() {
|
||||
|
||||
final ColumnPanel panel = new ColumnPanel(1);
|
||||
panel.setKey(SECTION_EDIT + typeIdStr);
|
||||
panel.setBorderColor("#FFFFFF");
|
||||
panel.setPadColor("#FFFFFF");
|
||||
|
||||
// display an appropriate title
|
||||
panel.add(new Label(event -> {
|
||||
final PageState state = event.getPageState();
|
||||
final Label target = (Label) event.getTarget();
|
||||
|
||||
if (selectedSectionModel.getSelectedKey(state) == null) {
|
||||
target.setLabel(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.add_section",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
} else {
|
||||
target.setLabel(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.edit_section",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
}
|
||||
}));
|
||||
|
||||
sectionEditForm = new SectionEditForm(selectedArticleModel,
|
||||
selectedSectionModel,
|
||||
this,
|
||||
selectedLanguageParam);
|
||||
|
||||
panel.add(sectionEditForm);
|
||||
panel.add(buildViewAllLink());
|
||||
panel.add(buildAddLink());
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds a container to hold the component to confirm deletion of a
|
||||
* section.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected Container buildSectionDelete() {
|
||||
|
||||
final ColumnPanel panel = new ColumnPanel(1);
|
||||
panel.setKey(SECTION_DELETE + typeIdStr);
|
||||
panel.setBorderColor("#FFFFFF");
|
||||
panel.setPadColor("#FFFFFF");
|
||||
|
||||
panel.add(new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.delete_section",
|
||||
CmsConstants.CMS_BUNDLE)));
|
||||
sectionDeleteForm = new SectionDeleteForm(selectedArticleModel,
|
||||
selectedSectionModel);
|
||||
sectionDeleteForm.addSubmissionListener(event -> {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
onlyShowComponent(state, SECTION_TABLE + typeIdStr);
|
||||
});
|
||||
|
||||
panel.add(sectionDeleteForm);
|
||||
panel.add(buildViewAllLink());
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility method to create a link to display the section list.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected ActionLink buildViewAllLink() {
|
||||
final ActionLink viewAllLink = new ActionLink(
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.view_all_sections",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
viewAllLink.setClassAttr(ACTION_LINK);
|
||||
viewAllLink.addActionListener(event -> {
|
||||
onlyShowComponent(event.getPageState(),
|
||||
SECTION_TABLE + typeIdStr);
|
||||
});
|
||||
|
||||
return viewAllLink;
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility method to create a link to display the section list.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected ActionLink buildAddLink() {
|
||||
final ActionLink addLink = new ActionLink(
|
||||
new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.add_new_section",
|
||||
CmsConstants.CMS_BUNDLE)) {
|
||||
|
||||
@Override
|
||||
public boolean isVisible(final PageState state) {
|
||||
|
||||
final PermissionChecker permissionChecker = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(PermissionChecker.class);
|
||||
final ContentItem item = selectedArticleModel
|
||||
.getSelectedItem(state);
|
||||
|
||||
return super.isVisible(state)
|
||||
&& permissionChecker.isPermitted(ItemPrivileges.EDIT,
|
||||
item);
|
||||
}
|
||||
|
||||
};
|
||||
addLink.setClassAttr(ACTION_LINK);
|
||||
addLink.addActionListener(event -> {
|
||||
final PageState state = event.getPageState();
|
||||
selectedSectionModel.clearSelection(state);
|
||||
onlyShowComponent(state, SECTION_EDIT + typeIdStr);
|
||||
});
|
||||
|
||||
return addLink;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(final Page page) {
|
||||
|
||||
super.register(page);
|
||||
|
||||
page.addGlobalStateParam(moveSectionParam);
|
||||
page.setVisibleDefault(beginLink, false);
|
||||
page.setVisibleDefault(moveSectionLabel, false);
|
||||
}
|
||||
|
||||
public String getTypeIDStr() {
|
||||
return typeIdStr;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@
|
|||
*/
|
||||
package com.arsdigita.cms.contenttypes.ui.mparticle;
|
||||
|
||||
|
||||
import com.arsdigita.bebop.ColumnPanel;
|
||||
import com.arsdigita.bebop.Form;
|
||||
import com.arsdigita.bebop.FormProcessException;
|
||||
|
|
@ -35,7 +34,9 @@ import com.arsdigita.cms.contenttypes.MultiPartArticle;
|
|||
import com.arsdigita.cms.contenttypes.util.MPArticleGlobalizationUtil;
|
||||
import com.arsdigita.cms.util.GlobalizationUtil;
|
||||
import com.arsdigita.util.Assert;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
import org.librecms.contenttypes.MultiPartArticleSection;
|
||||
|
||||
/**
|
||||
* A form to confirm deletion of a single section of a MultiPartArticle.
|
||||
|
|
@ -44,36 +45,36 @@ import org.apache.log4j.Logger;
|
|||
* @version $Id: SectionDeleteForm.java 287 2005-02-22 00:29:02Z sskracic $
|
||||
*/
|
||||
public class SectionDeleteForm extends Form
|
||||
implements FormInitListener, FormSubmissionListener, FormProcessListener
|
||||
{
|
||||
private final static Logger log = Logger.getLogger(SectionDeleteForm.class.getName());
|
||||
implements FormInitListener, FormSubmissionListener, FormProcessListener {
|
||||
|
||||
private final static Logger log = Logger.getLogger(SectionDeleteForm.class
|
||||
.getName());
|
||||
|
||||
protected ItemSelectionModel m_selArticle;
|
||||
protected ItemSelectionModel m_selSection;
|
||||
protected SaveCancelSection m_saveCancelSection;
|
||||
private Label m_sectionNameLabel;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @param selArticle
|
||||
* @param selSection
|
||||
*/
|
||||
public SectionDeleteForm
|
||||
( ItemSelectionModel selArticle,
|
||||
ItemSelectionModel selSection) {
|
||||
public SectionDeleteForm(
|
||||
final ItemSelectionModel selArticle,
|
||||
final SectionSelectionModel<? extends MultiPartArticleSection> selSection) {
|
||||
super("SectionDeleteForm", new ColumnPanel(2));
|
||||
m_selArticle = selArticle;
|
||||
m_selSection = selSection;
|
||||
|
||||
ColumnPanel panel = (ColumnPanel)getPanel();
|
||||
ColumnPanel panel = (ColumnPanel) getPanel();
|
||||
panel.setBorder(false);
|
||||
panel.setPadColor("#FFFFFF");
|
||||
panel.setColumnWidth(1, "20%");
|
||||
panel.setColumnWidth(2, "80%");
|
||||
panel.setWidth("100%");
|
||||
|
||||
m_sectionNameLabel = new Label ("Section Name");
|
||||
m_sectionNameLabel = new Label("Section Name");
|
||||
add(m_sectionNameLabel, ColumnPanel.FULL_WIDTH | ColumnPanel.LEFT);
|
||||
addSaveCancelSection();
|
||||
|
||||
|
|
@ -86,7 +87,7 @@ public class SectionDeleteForm extends Form
|
|||
*
|
||||
* @return
|
||||
*/
|
||||
protected SaveCancelSection addSaveCancelSection () {
|
||||
protected SaveCancelSection addSaveCancelSection() {
|
||||
m_saveCancelSection = new SaveCancelSection();
|
||||
m_saveCancelSection.getSaveButton().setButtonLabel(
|
||||
GlobalizationUtil.globalize("cms.ui.delete"));
|
||||
|
|
@ -95,23 +96,24 @@ public class SectionDeleteForm extends Form
|
|||
}
|
||||
|
||||
@Override
|
||||
public void init ( FormSectionEvent event ) throws FormProcessException {
|
||||
public void init(FormSectionEvent event) throws FormProcessException {
|
||||
PageState state = event.getPageState();
|
||||
|
||||
ArticleSection section = (ArticleSection)m_selSection.getSelectedObject(state);
|
||||
ArticleSection section = (ArticleSection) m_selSection
|
||||
.getSelectedObject(state);
|
||||
|
||||
if ( section == null ) {
|
||||
if (section == null) {
|
||||
log.error("No section selected");
|
||||
} else {
|
||||
m_sectionNameLabel.setLabel(section.getTitle(),state);
|
||||
m_sectionNameLabel.setLabel(section.getTitle(), state);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void submitted ( FormSectionEvent event ) throws FormProcessException {
|
||||
public void submitted(FormSectionEvent event) throws FormProcessException {
|
||||
PageState state = event.getPageState();
|
||||
|
||||
if ( m_saveCancelSection.getCancelButton().isSelected(state) ) {
|
||||
if (m_saveCancelSection.getCancelButton().isSelected(state)) {
|
||||
throw new FormProcessException(
|
||||
"Submission cancelled",
|
||||
MPArticleGlobalizationUtil.globalize(
|
||||
|
|
@ -121,11 +123,13 @@ public class SectionDeleteForm extends Form
|
|||
}
|
||||
|
||||
@Override
|
||||
public void process ( FormSectionEvent event ) throws FormProcessException {
|
||||
public void process(FormSectionEvent event) throws FormProcessException {
|
||||
PageState state = event.getPageState();
|
||||
|
||||
MultiPartArticle article = (MultiPartArticle)m_selArticle.getSelectedObject(state);
|
||||
ArticleSection section = (ArticleSection)m_selSection.getSelectedObject(state);
|
||||
MultiPartArticle article = (MultiPartArticle) m_selArticle
|
||||
.getSelectedObject(state);
|
||||
ArticleSection section = (ArticleSection) m_selSection
|
||||
.getSelectedObject(state);
|
||||
|
||||
Assert.exists(article, MultiPartArticle.class);
|
||||
Assert.exists(section, ArticleSection.class);
|
||||
|
|
@ -134,4 +138,5 @@ public class SectionDeleteForm extends Form
|
|||
|
||||
log.info("section " + m_selSection.getSelectedKey(state) + " delete");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,7 +18,6 @@
|
|||
*/
|
||||
package com.arsdigita.cms.contenttypes.ui.mparticle;
|
||||
|
||||
|
||||
import com.arsdigita.bebop.ColumnPanel;
|
||||
import com.arsdigita.bebop.Form;
|
||||
import com.arsdigita.bebop.FormData;
|
||||
|
|
@ -36,6 +35,7 @@ import com.arsdigita.bebop.form.CheckboxGroup;
|
|||
import com.arsdigita.bebop.form.Option;
|
||||
import com.arsdigita.bebop.parameters.BigDecimalParameter;
|
||||
import com.arsdigita.bebop.parameters.NotNullValidationListener;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.bebop.parameters.TrimmedStringParameter;
|
||||
import com.arsdigita.cms.ReusableImageAsset;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
|
|
@ -46,11 +46,12 @@ import com.arsdigita.cms.ui.CMSDHTMLEditor;
|
|||
import com.arsdigita.cms.contenttypes.util.MPArticleGlobalizationUtil;
|
||||
import com.arsdigita.domain.DataObjectNotFoundException;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
import org.librecms.contenttypes.MultiPartArticleSection;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
|
||||
/**
|
||||
* Form to edit an ArticleSection for a MultiPartArticle.
|
||||
*
|
||||
|
|
@ -74,7 +75,6 @@ public class SectionEditForm extends Form {
|
|||
private SaveCancelSection m_saveCancelSection;
|
||||
private ImageUploadSection m_imageUpload;
|
||||
|
||||
|
||||
public static final String TITLE = "title";
|
||||
public static final String TEXT = "text";
|
||||
public static final String IMAGE = "image";
|
||||
|
|
@ -93,20 +93,24 @@ public class SectionEditForm extends Form {
|
|||
ItemSelectionModel selSection) {
|
||||
this(selArticle, selSection, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param selArticle the current article
|
||||
* @param selSection the current section
|
||||
* @param container container which this form is added to
|
||||
* @param sectionsStep container which this form is added to
|
||||
*/
|
||||
public SectionEditForm(ItemSelectionModel selArticle,
|
||||
ItemSelectionModel selSection,
|
||||
MultiPartArticleViewSections container) {
|
||||
public SectionEditForm(
|
||||
final ItemSelectionModel selArticle,
|
||||
final SectionSelectionModel<? extends MultiPartArticleSection> selSection,
|
||||
final MultiPartArticleSectionsStep sectionsStep,
|
||||
final StringParameter selectedLanguageParam) {
|
||||
|
||||
super("SectionEditForm", new ColumnPanel(2));
|
||||
m_selArticle = selArticle;
|
||||
m_selSection = selSection;
|
||||
m_container = container;
|
||||
m_container = sectionsStep;
|
||||
|
||||
m_imageParam = new BigDecimalParameter(IMAGE_PARAM);
|
||||
m_selImage = new ItemSelectionModel(ReusableImageAsset.class.getName(),
|
||||
|
|
@ -121,7 +125,7 @@ public class SectionEditForm extends Form {
|
|||
setMethod(Form.POST);
|
||||
setEncType("multipart/form-data");
|
||||
|
||||
ColumnPanel panel = (ColumnPanel)getPanel();
|
||||
ColumnPanel panel = (ColumnPanel) getPanel();
|
||||
panel.setBorder(false);
|
||||
panel.setPadColor("#FFFFFF");
|
||||
panel.setColumnWidth(1, "20%");
|
||||
|
|
@ -171,8 +175,8 @@ public class SectionEditForm extends Form {
|
|||
//add(new Label(MPArticleGlobalizationUtil
|
||||
// .globalize("cms.contenttypes.ui.mparticle.section.text")),
|
||||
// ColumnPanel.LEFT | ColumnPanel.FULL_WIDTH);
|
||||
CMSDHTMLEditor textWidget =
|
||||
new CMSDHTMLEditor(new TrimmedStringParameter(TEXT));
|
||||
CMSDHTMLEditor textWidget = new CMSDHTMLEditor(
|
||||
new TrimmedStringParameter(TEXT));
|
||||
textWidget.setLabel(MPArticleGlobalizationUtil
|
||||
.globalize("cms.contenttypes.ui.mparticle.section.text"));
|
||||
textWidget.setRows(40);
|
||||
|
|
@ -193,7 +197,8 @@ public class SectionEditForm extends Form {
|
|||
CheckboxGroup pageBreak = new CheckboxGroup(PAGE_BREAK);
|
||||
pageBreak.addOption(new Option("true",
|
||||
new Label(MPArticleGlobalizationUtil
|
||||
.globalize("cms.contenttypes.ui.mparticle.section.create_break")) ));
|
||||
.globalize(
|
||||
"cms.contenttypes.ui.mparticle.section.create_break"))));
|
||||
add(pageBreak);
|
||||
}
|
||||
|
||||
|
|
@ -202,6 +207,7 @@ public class SectionEditForm extends Form {
|
|||
*
|
||||
* @param event
|
||||
* @param article
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
protected ArticleSection createSection(FormSectionEvent event,
|
||||
|
|
@ -212,8 +218,8 @@ public class SectionEditForm extends Form {
|
|||
|
||||
ArticleSection section = new ArticleSection();
|
||||
|
||||
section.setTitle((String)data.get(TITLE));
|
||||
section.setName(article.getName() + ": " + (String)data.get(TITLE));
|
||||
section.setTitle((String) data.get(TITLE));
|
||||
section.setName(article.getName() + ": " + (String) data.get(TITLE));
|
||||
section.setContentSection(article.getContentSection());
|
||||
|
||||
return section;
|
||||
|
|
@ -230,24 +236,22 @@ public class SectionEditForm extends Form {
|
|||
p.addGlobalStateParam(m_textParam);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initialize the form. If there is a selected section, ie. this
|
||||
* is an 'edit' step rather than a 'create new' step, load the data
|
||||
* into the form fields.
|
||||
* Initialize the form. If there is a selected section, ie. this is an
|
||||
* 'edit' step rather than a 'create new' step, load the data into the form
|
||||
* fields.
|
||||
*/
|
||||
private class SectionInitListener implements FormInitListener {
|
||||
|
||||
@Override
|
||||
public void init( FormSectionEvent event )
|
||||
public void init(FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
PageState state = event.getPageState();
|
||||
FormData data = event.getFormData();
|
||||
m_selImage.setSelectedObject(state, null);
|
||||
m_selText.setSelectedObject(state,null);
|
||||
m_selText.setSelectedObject(state, null);
|
||||
|
||||
|
||||
if ( m_selSection.getSelectedKey(state) != null ) {
|
||||
if (m_selSection.getSelectedKey(state) != null) {
|
||||
BigDecimal id = new BigDecimal(m_selSection
|
||||
.getSelectedKey(state).toString());
|
||||
try {
|
||||
|
|
@ -257,7 +261,7 @@ public class SectionEditForm extends Form {
|
|||
data.put(TITLE, section.getTitle());
|
||||
|
||||
TextAsset t = section.getText();
|
||||
if ( t != null ) {
|
||||
if (t != null) {
|
||||
m_selText.setSelectedObject(state, t);
|
||||
data.put(TEXT, t.getText());
|
||||
}
|
||||
|
|
@ -268,10 +272,10 @@ public class SectionEditForm extends Form {
|
|||
}
|
||||
|
||||
if (section.isPageBreak()) {
|
||||
data.put(PAGE_BREAK, new Object[] { "true" });
|
||||
data.put(PAGE_BREAK, new Object[]{"true"});
|
||||
}
|
||||
|
||||
} catch ( DataObjectNotFoundException ex ) {
|
||||
} catch (DataObjectNotFoundException ex) {
|
||||
log.error("Section(" + id + ") could not be found");
|
||||
}
|
||||
}
|
||||
|
|
@ -280,43 +284,44 @@ public class SectionEditForm extends Form {
|
|||
// initializing the image section
|
||||
m_imageUpload.initImageUpload(event);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Called on form submission. Check to see if the user clicked the
|
||||
* cancel button. If they did, don't continue with the form.
|
||||
* Called on form submission. Check to see if the user clicked the cancel
|
||||
* button. If they did, don't continue with the form.
|
||||
*/
|
||||
private class SectionSubmissionListener implements FormSubmissionListener {
|
||||
|
||||
@Override
|
||||
public void submitted( FormSectionEvent event )
|
||||
public void submitted(FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
PageState state = event.getPageState();
|
||||
|
||||
if ( m_saveCancelSection.getCancelButton()
|
||||
if (m_saveCancelSection.getCancelButton()
|
||||
.isSelected(state) && m_container != null) {
|
||||
m_container.onlyShowComponent(
|
||||
state, MultiPartArticleViewSections.SECTION_TABLE+
|
||||
m_container.getTypeIDStr());
|
||||
state, MultiPartArticleViewSections.SECTION_TABLE
|
||||
+ m_container.getTypeIDStr());
|
||||
throw new FormProcessException(
|
||||
"Submission cancelled",
|
||||
MPArticleGlobalizationUtil.globalize(
|
||||
"cms.contenttypes.ui.mparticle.submission_cancelled")
|
||||
);
|
||||
} else if ( m_imageUpload.getDeleteImageButton().isSelected(state) ) {
|
||||
} else if (m_imageUpload.getDeleteImageButton().isSelected(state)) {
|
||||
BigDecimal id = new BigDecimal(m_selSection
|
||||
.getSelectedKey(state).toString());
|
||||
log.debug("deleting image for MPA section " + id);
|
||||
try {
|
||||
ArticleSection section = new ArticleSection(id);
|
||||
section.setImage(null);
|
||||
} catch ( DataObjectNotFoundException ex ) {
|
||||
} catch (DataObjectNotFoundException ex) {
|
||||
log.error("Section(" + id + ") could not be found");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -326,7 +331,7 @@ public class SectionEditForm extends Form {
|
|||
private class SectionProcessListener implements FormProcessListener {
|
||||
|
||||
@Override
|
||||
public void process( FormSectionEvent event )
|
||||
public void process(FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
PageState state = event.getPageState();
|
||||
FormData data = event.getFormData();
|
||||
|
|
@ -338,25 +343,24 @@ public class SectionEditForm extends Form {
|
|||
|
||||
try {
|
||||
article = new MultiPartArticle(id);
|
||||
} catch ( DataObjectNotFoundException ex ) {
|
||||
} catch (DataObjectNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
// get the selected section to update or create a new one
|
||||
ArticleSection section = (ArticleSection)
|
||||
m_selSection.getSelectedObject(state);
|
||||
if ( section == null ) {
|
||||
ArticleSection section = (ArticleSection) m_selSection
|
||||
.getSelectedObject(state);
|
||||
if (section == null) {
|
||||
section = createSection(event, article);
|
||||
article.addSection(section);
|
||||
}
|
||||
|
||||
section.setTitle((String)data.get(TITLE));
|
||||
section.setTitle((String) data.get(TITLE));
|
||||
|
||||
Object[] pageBreakVal = (Object[])data.get(PAGE_BREAK);
|
||||
Object[] pageBreakVal = (Object[]) data.get(PAGE_BREAK);
|
||||
boolean pageBreak;
|
||||
if (pageBreakVal == null ||
|
||||
pageBreakVal.length == 0 ||
|
||||
!"true".equals(pageBreakVal[0])) {
|
||||
if (pageBreakVal == null || pageBreakVal.length == 0 || !"true"
|
||||
.equals(pageBreakVal[0])) {
|
||||
pageBreak = false;
|
||||
} else {
|
||||
pageBreak = true;
|
||||
|
|
@ -364,36 +368,36 @@ public class SectionEditForm extends Form {
|
|||
section.setPageBreak(pageBreak);
|
||||
|
||||
// get the image asset
|
||||
ReusableImageAsset reusableImageAsset =
|
||||
m_imageUpload.processImageUpload(event);
|
||||
if ( reusableImageAsset != null ) {
|
||||
ReusableImageAsset reusableImageAsset = m_imageUpload
|
||||
.processImageUpload(event);
|
||||
if (reusableImageAsset != null) {
|
||||
section.setImage(reusableImageAsset);
|
||||
m_selImage.setSelectedObject(state, reusableImageAsset);
|
||||
}
|
||||
|
||||
|
||||
// get the text asset
|
||||
TextAsset textAsset = (TextAsset)m_selText.getSelectedObject(state);
|
||||
if ( textAsset == null ) {
|
||||
TextAsset textAsset = (TextAsset) m_selText.getSelectedObject(state);
|
||||
if (textAsset == null) {
|
||||
textAsset = new TextAsset();
|
||||
textAsset.setName(section.getName() + " text");
|
||||
m_selText.setSelectedObject(state, textAsset);
|
||||
section.setText(textAsset);
|
||||
}
|
||||
|
||||
String text = (String)data.get(TEXT);
|
||||
if ( text == null ) {
|
||||
String text = (String) data.get(TEXT);
|
||||
if (text == null) {
|
||||
text = "";
|
||||
}
|
||||
|
||||
textAsset.setText(text);
|
||||
if ( m_container != null) {
|
||||
if (m_container != null) {
|
||||
m_container.onlyShowComponent(
|
||||
state,
|
||||
MultiPartArticleViewSections.SECTION_TABLE+
|
||||
m_container.getTypeIDStr());
|
||||
}
|
||||
MultiPartArticleViewSections.SECTION_TABLE + m_container
|
||||
.getTypeIDStr());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ import org.librecms.contenttypes.MultiPartArticleSectionRepository;
|
|||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
class SectionSelectionModel<T extends MultiPartArticleSection>
|
||||
public class SectionSelectionModel<T extends MultiPartArticleSection>
|
||||
implements SingleSelectionModel<Long> {
|
||||
|
||||
private final Class<T> clazz;
|
||||
|
|
|
|||
|
|
@ -31,268 +31,189 @@ import com.arsdigita.bebop.table.TableColumnModel;
|
|||
import com.arsdigita.bebop.table.TableModel;
|
||||
import com.arsdigita.bebop.table.TableModelBuilder;
|
||||
import com.arsdigita.cms.CMS;
|
||||
import com.arsdigita.cms.ContentItem;
|
||||
|
||||
import org.librecms.contentsection.ContentItem;
|
||||
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.cms.SecurityManager;
|
||||
import com.arsdigita.cms.contenttypes.ArticleSection;
|
||||
import com.arsdigita.cms.contenttypes.ArticleSectionCollection;
|
||||
import com.arsdigita.cms.contenttypes.MultiPartArticle;
|
||||
import com.arsdigita.cms.contenttypes.util.MPArticleGlobalizationUtil;
|
||||
import com.arsdigita.domain.DomainObjectFactory;
|
||||
import com.arsdigita.persistence.OID;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import org.librecms.contenttypes.MultiPartArticleSection;
|
||||
import org.librecms.contenttypes.MultiPartArticle;
|
||||
|
||||
import com.arsdigita.util.LockableImpl;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contenttypes.MultiPartArticleSection;
|
||||
import org.librecms.contenttypes.MultiPartArticleSectionRepository;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* A table that displays the sections for the currently
|
||||
* selected MultiPartArticle.
|
||||
* A table that displays the sections for the currently selected
|
||||
* MultiPartArticle.
|
||||
*
|
||||
* @author <a href="mailto:dturner@arsdigita.com">Dave Turner</a>
|
||||
* @version $Id: SectionTable.java 2099 2010-04-17 15:35:14Z pboy $
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class SectionTable extends Table {
|
||||
|
||||
private static final Logger s_log = Logger.getLogger(SectionTable.class);
|
||||
// match columns by (symbolic) index, makes for easier reordering
|
||||
public static final int COL_INDEX_TITLE = 0; // "Section";
|
||||
public static final int COL_INDEX_EDIT = 1; // "Edit";
|
||||
public static final int COL_INDEX_MOVE = 2; // "Move";
|
||||
public static final int COL_INDEX_DELETE = 3; // "Delete";
|
||||
private ItemSelectionModel m_selArticle;
|
||||
private ItemSelectionModel m_selSection;
|
||||
private ItemSelectionModel m_moveSection;
|
||||
private static final Logger LOGGER = LogManager
|
||||
.getLogger(SectionTable.class);
|
||||
|
||||
/**
|
||||
* Index of the title column
|
||||
*/
|
||||
public static final int COL_INDEX_TITLE = 0;
|
||||
/**
|
||||
* Index of the edit column.
|
||||
*/
|
||||
public static final int COL_INDEX_EDIT = 1;
|
||||
/**
|
||||
* Index of the move column
|
||||
*/
|
||||
public static final int COL_INDEX_MOVE = 2;
|
||||
/**
|
||||
* Index of the delete column
|
||||
*/
|
||||
public static final int COL_INDEX_DELETE = 3;
|
||||
|
||||
private ItemSelectionModel selectedArticleModel;
|
||||
private SectionSelectionModel<? extends MultiPartArticleSection> selectedSectionModel;
|
||||
private SectionSelectionModel<? extends MultiPartArticleSection> moveSectionModel;
|
||||
|
||||
/**
|
||||
* Constructor. Create an instance of this class.
|
||||
*
|
||||
* @param selArticle a selection model that returns the MultiPartArticle
|
||||
* which holds the sections to display.
|
||||
* @param moveSection
|
||||
* @param selectedArticleModel a selection model that returns the
|
||||
* MultiPartArticle which holds the sections to
|
||||
* display.
|
||||
* @param moveSectionModel
|
||||
*/
|
||||
public SectionTable(ItemSelectionModel selArticle,
|
||||
ItemSelectionModel moveSection) {
|
||||
public SectionTable(
|
||||
final ItemSelectionModel selectedArticleModel,
|
||||
final SectionSelectionModel<? extends MultiPartArticleSection> moveSectionModel) {
|
||||
|
||||
super();
|
||||
m_selArticle = selArticle;
|
||||
m_moveSection = moveSection;
|
||||
this.selectedArticleModel = selectedArticleModel;
|
||||
this.moveSectionModel = moveSectionModel;
|
||||
|
||||
TableColumnModel model = getColumnModel();
|
||||
final TableColumnModel model = getColumnModel();
|
||||
model.add(new TableColumn(
|
||||
COL_INDEX_TITLE,
|
||||
new Label(MPArticleGlobalizationUtil.globalize(
|
||||
"cms.contenttypes.ui.mparticle.section_table.header_section"))));
|
||||
new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.header_section",
|
||||
CmsConstants.CMS_BUNDLE))));
|
||||
model.add(new TableColumn(
|
||||
COL_INDEX_EDIT,
|
||||
new Label(MPArticleGlobalizationUtil.globalize(
|
||||
"cms.contenttypes.ui.mparticle.section_table.header_edit"))));
|
||||
new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.header_edit",
|
||||
CmsConstants.CMS_BUNDLE))));
|
||||
model.add(new TableColumn(
|
||||
COL_INDEX_MOVE,
|
||||
new Label(MPArticleGlobalizationUtil.globalize(
|
||||
"cms.contenttypes.ui.mparticle.section_table.header_move"))));
|
||||
new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.header_move",
|
||||
CmsConstants.CMS_BUNDLE))));
|
||||
model.add(new TableColumn(
|
||||
COL_INDEX_DELETE,
|
||||
new Label(MPArticleGlobalizationUtil.globalize(
|
||||
"cms.contenttypes.ui.mparticle.section_table.header_delete"))));
|
||||
new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.header_delete",
|
||||
CmsConstants.CMS_BUNDLE))));
|
||||
|
||||
model.get(1).setCellRenderer(new SectionTableCellRenderer(true));
|
||||
model.get(2).setCellRenderer(new SectionTableCellRenderer(true));
|
||||
model.get(3).setCellRenderer(new SectionTableCellRenderer(true));
|
||||
|
||||
|
||||
setModelBuilder(new SectionTableModelBuilder(m_selArticle, m_moveSection));
|
||||
setModelBuilder(
|
||||
new SectionTableModelBuilder(selectedArticleModel, moveSectionModel));
|
||||
|
||||
addTableActionListener(new TableActionListener() {
|
||||
|
||||
@Override
|
||||
public void cellSelected(TableActionEvent event) {
|
||||
PageState state = event.getPageState();
|
||||
public void cellSelected(final TableActionEvent event) {
|
||||
|
||||
TableColumn col = getColumnModel().get(event.getColumn()
|
||||
.intValue());
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
if (col.getModelIndex() == COL_INDEX_MOVE) {
|
||||
if (m_moveSection.getSelectedKey(state) == null) {
|
||||
m_moveSection.setSelectedKey(state,
|
||||
m_selSection
|
||||
.getSelectedKey(state));
|
||||
final TableColumn column = getColumnModel()
|
||||
.get(event.getColumn());
|
||||
|
||||
if (column.getModelIndex() == COL_INDEX_MOVE) {
|
||||
|
||||
if (moveSectionModel.getSelectedKey(state) == null) {
|
||||
moveSectionModel.setSelectedKey(
|
||||
state,
|
||||
selectedSectionModel.getSelectedKey(state));
|
||||
} else {
|
||||
MultiPartArticle article = (MultiPartArticle) m_selArticle.
|
||||
getSelectedObject(state);
|
||||
final MultiPartArticle article
|
||||
= (MultiPartArticle) selectedArticleModel
|
||||
.getSelectedObject(state);
|
||||
|
||||
BigDecimal id = (BigDecimal) m_moveSection.getSelectedKey(state);
|
||||
ArticleSection sect = (ArticleSection) DomainObjectFactory.newInstance(
|
||||
new OID(ArticleSection.BASE_DATA_OBJECT_TYPE, id));
|
||||
final Long sectionId = moveSectionModel
|
||||
.getSelectedKey(state);
|
||||
|
||||
BigDecimal dest =
|
||||
new BigDecimal((String) event.getRowKey());
|
||||
ArticleSection destSect = (ArticleSection) DomainObjectFactory.newInstance(
|
||||
new OID(ArticleSection.BASE_DATA_OBJECT_TYPE, dest));
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final MultiPartArticleSectionRepository sectionRepo
|
||||
= cdiUtil
|
||||
.findBean(
|
||||
MultiPartArticleSectionRepository.class);
|
||||
final MultiPartArticleSectionStepController controller
|
||||
= cdiUtil
|
||||
.findBean(
|
||||
MultiPartArticleSectionStepController.class);
|
||||
final MultiPartArticleSection section = sectionRepo
|
||||
.findById(sectionId)
|
||||
.orElseThrow(() -> new IllegalArgumentException(
|
||||
String
|
||||
.format(
|
||||
"No MultiPartArticleSection with ID %d in "
|
||||
+ "the database.",
|
||||
sectionId)));
|
||||
|
||||
final Long destId = Long
|
||||
.parseLong((String) event.getRowKey());
|
||||
final MultiPartArticleSection destSection = sectionRepo
|
||||
.findById(destId)
|
||||
.orElseThrow(() -> new IllegalArgumentException(
|
||||
String.format(
|
||||
"No MultiPartArticleSection with ID %d in "
|
||||
+ "the database.",
|
||||
destId)));
|
||||
|
||||
// if sect is lower in rank than the dest
|
||||
// then move below is default behavior
|
||||
int rank = destSect.getRank().intValue();
|
||||
if (sect.getRank().intValue() > rank) {
|
||||
int rank = destSection.getRank();
|
||||
if (section.getRank() > rank) {
|
||||
// otherwise, add one to get "move below"
|
||||
rank++;
|
||||
}
|
||||
|
||||
article.changeSectionRank(sect, rank);
|
||||
m_moveSection.setSelectedKey(state, null);
|
||||
section.setRank(rank);
|
||||
sectionRepo.save(section);
|
||||
moveSectionModel.setSelectedKey(state, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void headSelected(TableActionEvent event) {
|
||||
public void headSelected(final TableActionEvent event) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
public void setSectionModel(ItemSelectionModel selSection) {
|
||||
if (selSection == null) {
|
||||
s_log.warn("null item model");
|
||||
}
|
||||
m_selSection = selSection;
|
||||
public void setSectionModel(
|
||||
final SectionSelectionModel<? extends MultiPartArticleSection> selectedSectionModel) {
|
||||
|
||||
Objects.requireNonNull(selectedSectionModel);
|
||||
|
||||
this.selectedSectionModel = selectedSectionModel;
|
||||
}
|
||||
|
||||
/**
|
||||
* The model builder to generate a suitable model for the SectionTable
|
||||
*/
|
||||
protected class SectionTableModelBuilder extends LockableImpl
|
||||
implements TableModelBuilder {
|
||||
|
||||
protected ItemSelectionModel m_selArticle;
|
||||
protected ItemSelectionModel m_moveSection;
|
||||
|
||||
/**
|
||||
* Private class constructor.
|
||||
* @param selArticle
|
||||
* @param moveSection
|
||||
*/
|
||||
public SectionTableModelBuilder(ItemSelectionModel selArticle,
|
||||
ItemSelectionModel moveSection) {
|
||||
m_selArticle = selArticle;
|
||||
m_moveSection = moveSection;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param table
|
||||
* @param state
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public TableModel makeModel(Table table, PageState state) {
|
||||
table.getRowSelectionModel().clearSelection(state);
|
||||
|
||||
MultiPartArticle article = (MultiPartArticle) m_selArticle
|
||||
.getSelectedObject(state);
|
||||
|
||||
return new SectionTableModel(table, state, article, m_moveSection);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal class
|
||||
*/
|
||||
protected class SectionTableModel implements TableModel {
|
||||
|
||||
private TableColumnModel m_colModel;
|
||||
private SectionTable m_table;
|
||||
private PageState m_state;
|
||||
private ArticleSectionCollection m_sections;
|
||||
private ItemSelectionModel m_moveSection;
|
||||
private ArticleSection m_section;
|
||||
|
||||
/** Constructor.
|
||||
* @param table
|
||||
* @param state
|
||||
* @param article
|
||||
* @param moveSection
|
||||
*/
|
||||
public SectionTableModel(Table table, PageState state,
|
||||
MultiPartArticle article,
|
||||
ItemSelectionModel moveSection) {
|
||||
m_colModel = table.getColumnModel();
|
||||
m_state = state;
|
||||
m_sections = article.getSections();
|
||||
m_table = (SectionTable) table;
|
||||
m_moveSection = moveSection;
|
||||
}
|
||||
|
||||
/** Return the number of columsn this TableModel has. */
|
||||
@Override
|
||||
public int getColumnCount() {
|
||||
return m_colModel.size();
|
||||
}
|
||||
|
||||
/** Move to the next row and return true if the model is now positioned
|
||||
* on a valid row.
|
||||
*/
|
||||
@Override
|
||||
public boolean nextRow() {
|
||||
if (m_sections.next()) {
|
||||
m_section = (ArticleSection) m_sections.getArticleSection();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the data element for the given column and the current row.
|
||||
*/
|
||||
@Override
|
||||
public Object getElementAt(int columnIndex) {
|
||||
|
||||
if (m_colModel == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// match columns by (symbolic) index, makes for easier reordering
|
||||
if (columnIndex == COL_INDEX_TITLE) {
|
||||
return m_section.getTitle();
|
||||
} else if (columnIndex == COL_INDEX_EDIT) {
|
||||
//return "edit";
|
||||
return new Label(
|
||||
MPArticleGlobalizationUtil.globalize(
|
||||
"cms.contenttypes.ui.mparticle.section_table.link_edit"));
|
||||
} else if (columnIndex == COL_INDEX_DELETE) {
|
||||
// return "delete";
|
||||
return new Label(
|
||||
MPArticleGlobalizationUtil.globalize(
|
||||
"cms.contenttypes.ui.mparticle.section_table.link_delete"));
|
||||
} else if (columnIndex == COL_INDEX_MOVE) {
|
||||
if (m_moveSection.getSelectedKey(m_state) == null) {
|
||||
// return "move";
|
||||
return new Label(
|
||||
MPArticleGlobalizationUtil.globalize(
|
||||
"cms.contenttypes.ui.mparticle.section_table.link_move"));
|
||||
} else {
|
||||
// return "move below here";
|
||||
return new Label(
|
||||
MPArticleGlobalizationUtil.globalize(
|
||||
"cms.contenttypes.ui.mparticle.section_table.link_move_below"));
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the key for the given column and the current row.
|
||||
*/
|
||||
@Override
|
||||
public Object getKeyAt(int columnIndex) {
|
||||
return m_section.getID();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
|
|
@ -317,7 +238,9 @@ public class SectionTable extends Table {
|
|||
|
||||
Component ret;
|
||||
SecurityManager sm = CMS.getSecurityManager(state);
|
||||
ContentItem item = (ContentItem) m_selArticle.getSelectedObject(state);
|
||||
ContentItem item = (ContentItem) selectedArticleModel
|
||||
.getSelectedObject(
|
||||
state);
|
||||
|
||||
boolean active = m_active && sm.canAccess(state.getRequest(),
|
||||
SecurityManager.EDIT_ITEM,
|
||||
|
|
@ -347,4 +270,5 @@ public class SectionTable extends Table {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,148 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.contenttypes.ui.mparticle;
|
||||
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.Table;
|
||||
import com.arsdigita.bebop.table.TableColumnModel;
|
||||
import com.arsdigita.bebop.table.TableModel;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
import org.arsdigita.cms.CMSConfig;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.librecms.CmsConstants;
|
||||
import org.librecms.contenttypes.MultiPartArticle;
|
||||
import org.librecms.contenttypes.MultiPartArticleSection;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
|
||||
class SectionTableModel implements TableModel {
|
||||
|
||||
private final TableColumnModel columnModel;
|
||||
private final SectionTable sectionTable;
|
||||
private final PageState pageState;
|
||||
private final SectionSelectionModel<? extends MultiPartArticleSection> moveSectionModel;
|
||||
|
||||
private final Iterator<MultiPartArticleSection> iterator;
|
||||
private MultiPartArticleSection currentSection;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param sectionTable
|
||||
* @param pageState
|
||||
* @param article
|
||||
* @param moveSectionModel
|
||||
*/
|
||||
public SectionTableModel(
|
||||
final Table sectionTable,
|
||||
final PageState pageState,
|
||||
final MultiPartArticle article,
|
||||
final SectionSelectionModel<? extends MultiPartArticleSection> moveSectionModel) {
|
||||
|
||||
this.pageState = pageState;
|
||||
this.sectionTable = (SectionTable) sectionTable;
|
||||
this.moveSectionModel = moveSectionModel;
|
||||
|
||||
columnModel = sectionTable.getColumnModel();
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final MultiPartArticleSectionStepController controller = cdiUtil
|
||||
.findBean(MultiPartArticleSectionStepController.class);
|
||||
|
||||
final List<MultiPartArticleSection> sections = controller
|
||||
.retrieveSections(article);
|
||||
iterator = sections.iterator();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the number of columns this TableModel has.
|
||||
*/
|
||||
@Override
|
||||
public int getColumnCount() {
|
||||
return columnModel.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* Move to the next row and return true if the model is now positioned on a
|
||||
* valid row.
|
||||
*/
|
||||
@Override
|
||||
public boolean nextRow() {
|
||||
|
||||
if (iterator.hasNext()) {
|
||||
currentSection = iterator.next();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the data element for the given column and the current row.
|
||||
*/
|
||||
@Override
|
||||
public Object getElementAt(final int columnIndex) {
|
||||
|
||||
if (columnModel == null) {
|
||||
return null;
|
||||
}
|
||||
// match columns by (symbolic) index, makes for easier reordering
|
||||
switch (columnIndex) {
|
||||
case SectionTable.COL_INDEX_TITLE:
|
||||
return currentSection.getTitle();
|
||||
case SectionTable.COL_INDEX_EDIT:
|
||||
//return "edit";
|
||||
return new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.link_edit",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
case SectionTable.COL_INDEX_DELETE:
|
||||
// return "delete";
|
||||
return new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.link_delete",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
case SectionTable.COL_INDEX_MOVE:
|
||||
if (moveSectionModel.getSelectedKey(pageState) == null) {
|
||||
// return "move";
|
||||
return new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.link_move",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
} else {
|
||||
// return "move below here";
|
||||
return new Label(new GlobalizedMessage(
|
||||
"cms.contenttypes.ui.mparticle.section_table.link_move_below",
|
||||
CmsConstants.CMS_BUNDLE));
|
||||
}
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the key for the given column and the current row.
|
||||
*/
|
||||
@Override
|
||||
public Object getKeyAt(final int columnIndex) {
|
||||
return currentSection.getSectionId();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
* Copyright (C) 2017 LibreCCM Foundation.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* 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., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.cms.contenttypes.ui.mparticle;
|
||||
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.Table;
|
||||
import com.arsdigita.bebop.table.TableModel;
|
||||
import com.arsdigita.bebop.table.TableModelBuilder;
|
||||
import com.arsdigita.cms.ItemSelectionModel;
|
||||
import com.arsdigita.util.LockableImpl;
|
||||
|
||||
import org.librecms.contenttypes.MultiPartArticle;
|
||||
import org.librecms.contenttypes.MultiPartArticleSection;
|
||||
|
||||
/**
|
||||
* The model builder to generate a suitable model for the SectionTable
|
||||
*/
|
||||
class SectionTableModelBuilder extends LockableImpl implements TableModelBuilder {
|
||||
|
||||
private final ItemSelectionModel selectedArticleModel;
|
||||
private final SectionSelectionModel<? extends MultiPartArticleSection> moveSectionModel;
|
||||
|
||||
/**
|
||||
* Private class constructor.
|
||||
*
|
||||
* @param selectedArticleModel
|
||||
* @param moveSectionModel
|
||||
*/
|
||||
public SectionTableModelBuilder(
|
||||
final ItemSelectionModel selectedArticleModel,
|
||||
final SectionSelectionModel<? extends MultiPartArticleSection> moveSectionModel) {
|
||||
|
||||
this.selectedArticleModel = selectedArticleModel;
|
||||
this.moveSectionModel = moveSectionModel;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param table
|
||||
* @param state
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public TableModel makeModel(final Table table,
|
||||
final PageState state) {
|
||||
|
||||
table.getRowSelectionModel().clearSelection(state);
|
||||
MultiPartArticle article
|
||||
= (MultiPartArticle) selectedArticleModel
|
||||
.getSelectedObject(state);
|
||||
return new SectionTableModel(table,
|
||||
state,
|
||||
article,
|
||||
moveSectionModel);
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue