diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/BaseDeleteForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/BaseDeleteForm.java
new file mode 100755
index 000000000..65adf39f8
--- /dev/null
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/BaseDeleteForm.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+package com.arsdigita.cms.ui;
+
+import com.arsdigita.bebop.Component;
+import com.arsdigita.bebop.Label;
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.event.FormProcessListener;
+import com.arsdigita.bebop.form.Submit;
+import com.arsdigita.globalization.GlobalizedMessage;
+
+/**
+ * @author Justin Ross
+ */
+public abstract class BaseDeleteForm extends BaseForm
+ implements FormProcessListener {
+
+ protected final Submit m_delete;
+ protected final Submit m_cancel;
+
+ public BaseDeleteForm(final Component message) {
+ super("delete", new Label(gz("cms.ui.attention")));
+
+ addComponent(message);
+
+ m_delete = new Submit("delete", gz("cms.ui.delete"));
+ addAction(m_delete);
+
+ m_cancel = new Submit("cancel", gz("cms.ui.cancel"));
+ addAction(m_cancel);
+
+ addProcessListener(this);
+ }
+
+ public BaseDeleteForm(final GlobalizedMessage message) {
+ this(new Label(message));
+ }
+
+ @Override
+ public final boolean isCancelled(final PageState state) {
+ return m_cancel.isSelected(state);
+ }
+}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/BaseForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/BaseForm.java
new file mode 100755
index 000000000..04b1741d2
--- /dev/null
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/BaseForm.java
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+package com.arsdigita.cms.ui;
+
+import com.arsdigita.bebop.BoxPanel;
+import com.arsdigita.bebop.Component;
+import com.arsdigita.bebop.Form;
+import com.arsdigita.bebop.GridPanel;
+import com.arsdigita.bebop.Label;
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.SimpleContainer;
+import com.arsdigita.bebop.form.FormErrorDisplay;
+import com.arsdigita.bebop.form.Submit;
+import com.arsdigita.bebop.form.TextArea;
+import com.arsdigita.bebop.form.TextField;
+import com.arsdigita.bebop.parameters.NotEmptyValidationListener;
+import com.arsdigita.bebop.parameters.NotNullValidationListener;
+import com.arsdigita.bebop.parameters.StringLengthValidationListener;
+import com.arsdigita.bebop.parameters.TrimmedStringParameter;
+import com.arsdigita.cms.ui.item.ContentItemRequestLocal;
+import com.arsdigita.globalization.GlobalizedMessage;
+import com.arsdigita.toolbox.ui.Cancellable;
+import com.arsdigita.toolbox.ui.Section;
+import com.arsdigita.util.Assert;
+
+import org.apache.log4j.Logger;
+import org.librecms.CmsConstants;
+
+/**
+ * A convenience class for CMS forms.
+ *
+ * @author Jens Pelzetter
+ * @author Justin Ross
+ */
+public abstract class BaseForm extends Form implements Cancellable {
+
+ private static final Logger s_log = Logger.getLogger(BaseForm.class);
+
+ private final BodySection m_body;
+ private final BoxPanel m_actions;
+ private Cancel m_cancel;
+
+ protected BaseForm(final String name, final Label heading) {
+ super(name, new GridPanel(1));
+
+ setRedirecting(true);
+
+ m_body = new BodySection(heading);
+ m_actions = new BoxPanel(BoxPanel.HORIZONTAL);
+
+ add(m_body);
+ add(m_actions);
+
+ addComponent(new FormErrorDisplay(this));
+ }
+
+ protected BaseForm(final String name,
+ final GlobalizedMessage heading) {
+ this(name, new Label(heading));
+ }
+
+ private class BodySection extends Section {
+
+ final SimpleContainer m_container;
+
+ BodySection(final Label heading) {
+ setHeading(heading);
+
+ m_container = new GridPanel(2);
+ setBody(m_container);
+ }
+
+ final void add(final Component component) {
+ m_container.add(component);
+ }
+
+ final void add(final Component component, int hints) {
+ m_container.add(component, hints);
+ }
+
+ }
+
+ protected final void addComponent(final Component component) {
+ m_body.add(component, GridPanel.FULL_WIDTH);
+ }
+
+ protected final void addField(final Label name, final Component widget) {
+ m_body.add(name);
+ m_body.add(widget);
+ }
+
+ protected final void addField(final GlobalizedMessage name,
+ final Component widget) {
+ addField(new Label(name), widget);
+ }
+
+ protected final void addAction(final Submit button) {
+ m_actions.add(button);
+ }
+
+ protected final void addAction(final Cancel button) {
+ m_cancel = button;
+ m_actions.add(button);
+ }
+
+ protected final void addSecurityListener(final String action) {
+ addSubmissionListener(new FormSecurityListener(action));
+ }
+
+ protected final void addSecurityListener(final String action,
+ final ContentItemRequestLocal item) {
+ addSubmissionListener(new FormSecurityListener(action, item));
+ }
+
+ @Override
+ public boolean isCancelled(final PageState state) {
+ return m_cancel != null && m_cancel.isSelected(state);
+ }
+
+ protected final class Name extends TextField {
+
+ public Name(final String key, final int max, final boolean required) {
+ super(new TrimmedStringParameter(key));
+
+ if (required) {
+ addValidationListener(new NotEmptyValidationListener());
+ }
+
+ setSize(40);
+ setMaxLength(max);
+ }
+
+ }
+
+ protected final class Description extends TextArea {
+
+ public Description(final String key,
+ final int maxLength,
+ final boolean isRequired) {
+ super(new TrimmedStringParameter(key));
+ Assert.isTrue(maxLength > 0, "Max length cannot be negative");
+
+ if (isRequired) {
+ addValidationListener(NotNullValidationListener.DEFAULT);
+ }
+ addValidationListener(new StringLengthValidationListener(maxLength));
+ setCols(40);
+ setRows(5);
+ setWrap(TextArea.SOFT);
+ }
+
+ }
+
+ protected final class Finish extends Submit {
+
+ public Finish() {
+ super("finish", gz("cms.ui.finish"));
+ }
+
+ }
+
+ protected final class Cancel extends Submit {
+
+ public Cancel() {
+ super("cancel", gz("cms.ui.cancel"));
+ }
+
+ }
+
+ protected static final GlobalizedMessage gz(final String key) {
+ return new GlobalizedMessage(key, CmsConstants.CMS_BUNDLE);
+ }
+
+ protected static final String lz(final String key) {
+ return (String) gz(key).localize();
+ }
+
+}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/CMSForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/CMSForm.java
new file mode 100755
index 000000000..3a13c25b2
--- /dev/null
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/CMSForm.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+package com.arsdigita.cms.ui;
+
+import com.arsdigita.bebop.Container;
+import com.arsdigita.bebop.Form;
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.toolbox.ui.Cancellable;
+
+/**
+ * A convenience class for CMS forms. The "CMS Admin" class eliminates
+ * the nested tables created by the Bebop ColumnPanel. This is mainly
+ * to increase form rendering.
+ *
+ * @author Michael Pih
+ */
+public class CMSForm extends Form implements Cancellable {
+
+ public static final String CLASS = "CMS Admin";
+
+ public CMSForm(final String name) {
+ super(name);
+
+ setClassAttr(CLASS);
+ getPanel().setClassAttr(CLASS);
+ }
+
+ public CMSForm(final String name, final Container panel) {
+ super(name, panel);
+
+ setClassAttr(CLASS);
+ panel.setClassAttr(CLASS);
+ }
+
+ /**
+ * Determines whether the form has been cancelled.
+ * Override this method if the form can be cancelled.
+ *
+ * @param state The page state
+ * @return true if the form is cancelled, false otherwise
+ */
+ public boolean isCancelled(PageState state) {
+ return false;
+ }
+}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/FormSecurityListener.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/FormSecurityListener.java
new file mode 100755
index 000000000..be2152bfe
--- /dev/null
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/FormSecurityListener.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+package com.arsdigita.cms.ui;
+
+import com.arsdigita.bebop.FormProcessException;
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.event.FormSectionEvent;
+import com.arsdigita.bebop.event.FormSubmissionListener;
+
+import org.librecms.contentsection.ContentItem;
+
+import com.arsdigita.cms.dispatcher.Utilities;
+import com.arsdigita.cms.ui.item.ContentItemRequestLocal;
+import com.arsdigita.dispatcher.AccessDeniedException;
+
+import org.libreccm.security.User;
+
+import com.arsdigita.util.Assert;
+import com.arsdigita.web.Web;
+
+import org.apache.log4j.Logger;
+import org.libreccm.cdi.utils.CdiUtil;
+import org.libreccm.security.PermissionChecker;
+
+/**
+ * @author Justin Ross <jross@redhat.com>
+ * @version $Id$
+ */
+public class FormSecurityListener implements FormSubmissionListener {
+
+ private static Logger s_log = Logger.getLogger(FormSecurityListener.class);
+
+ private final String m_action;
+ private final ContentItemRequestLocal m_item;
+
+ public FormSecurityListener(final String action,
+ final ContentItemRequestLocal item) {
+ Assert.exists(action, String.class);
+
+ m_action = action;
+ m_item = item;
+ }
+
+ public FormSecurityListener(final String action) {
+ this(action, null);
+ }
+
+ @Override
+ public final void submitted(final FormSectionEvent event)
+ throws FormProcessException {
+
+ final PageState state = event.getPageState();
+
+ final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
+ final PermissionChecker permissionChecker = cdiUtil.findBean(PermissionChecker.class);
+
+ if (m_item == null) {
+ if (permissionChecker.isPermitted(m_action)) {
+ return;
+ }
+ } else {
+ final ContentItem item = m_item.getContentItem(state);
+
+ if (permissionChecker.isPermitted(m_action, item)) {
+ return;
+ }
+ }
+
+ throw new AccessDeniedException();
+ }
+}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/ChildUniqueValidationListener.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/ChildUniqueValidationListener.java
new file mode 100755
index 000000000..f6b3fce86
--- /dev/null
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/ChildUniqueValidationListener.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+package com.arsdigita.cms.ui.folder;
+
+import com.arsdigita.bebop.FormProcessException;
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.event.ParameterEvent;
+import com.arsdigita.bebop.event.ParameterListener;
+
+import org.libreccm.categorization.Category;
+
+
+/**
+ *
+ *
+ */
+final class ChildUniqueValidationListener implements ParameterListener {
+
+ private final FolderRequestLocal m_parent;
+
+ /**
+ * Constructor.
+ * @param parent
+ */
+ public ChildUniqueValidationListener(final FolderRequestLocal parent) {
+ m_parent = parent;
+ }
+
+ /**
+ *
+ * @param e
+ * @throws FormProcessException
+ */
+ @Override
+ public final void validate(final ParameterEvent e)
+ throws FormProcessException {
+ final PageState state = e.getPageState();
+ final String name = (String) e.getParameterData().getValue();
+
+ if (name != null) {
+ validateNameUniqueness(m_parent.getFolder(state), name);
+ }
+ }
+
+ /**
+ *
+ * @param parent
+ * @param name
+ * @throws FormProcessException
+ */
+ private void validateNameUniqueness(final Category parent,
+ final String name)
+ throws FormProcessException {
+
+ //ToDo
+
+ }
+}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderAddForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderAddForm.java
new file mode 100755
index 000000000..9216f4613
--- /dev/null
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderAddForm.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+package com.arsdigita.cms.ui.folder;
+
+import com.arsdigita.bebop.FormProcessException;
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.SingleSelectionModel;
+import com.arsdigita.bebop.event.FormProcessListener;
+import com.arsdigita.bebop.event.FormSectionEvent;
+
+import org.apache.log4j.Logger;
+import org.libreccm.categorization.Category;
+import org.libreccm.categorization.CategoryRepository;
+import org.libreccm.cdi.utils.CdiUtil;
+
+class FolderAddForm extends FolderBaseForm {
+
+ private static Logger s_log = Logger.getLogger(FolderAddForm.class);
+
+ private final SingleSelectionModel m_model;
+ private final FolderRequestLocal m_parent;
+
+ public FolderAddForm(final SingleSelectionModel model,
+ final FolderRequestLocal parent) {
+ super("folder-add");
+
+ m_model = model;
+ m_parent = parent;
+
+ m_fragment.addValidationListener(new ChildUniqueValidationListener(
+ parent));
+
+ addProcessListener(new ProcessListener());
+ }
+
+ private class ProcessListener implements FormProcessListener {
+
+ public final void process(final FormSectionEvent e)
+ throws FormProcessException {
+ final PageState state = e.getPageState();
+
+ final Category folder = new Category();
+
+ folder.setParentCategory(m_parent.getFolder(state));
+ folder.setDisplayName((String) m_title.getValue(state));
+ folder.setName((String) m_fragment.getValue(state));
+
+ final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
+ final CategoryRepository categoryRepo = cdiUtil.findBean(
+ CategoryRepository.class);
+ categoryRepo.save(folder);
+
+ m_model.setSelectedKey(state, folder.getObjectId());
+ }
+
+ }
+
+}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderAdminPane.java.off b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderAdminPane.java
similarity index 69%
rename from ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderAdminPane.java.off
rename to ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderAdminPane.java
index 15d0e79f3..655fe3ab3 100755
--- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderAdminPane.java.off
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderAdminPane.java
@@ -29,26 +29,29 @@ import com.arsdigita.bebop.event.ActionListener;
import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.cms.CMS;
-import com.arsdigita.cms.ContentSection;
+
+import org.librecms.contentsection.ContentSection;
+
import com.arsdigita.cms.ui.BaseDeleteForm;
-import com.arsdigita.cms.util.GlobalizationUtil;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.toolbox.ui.SelectionPanel;
+
import org.apache.log4j.Logger;
+import org.libreccm.categorization.CategoryRepository;
+import org.libreccm.cdi.utils.CdiUtil;
+import org.librecms.CmsConstants;
import java.math.BigDecimal;
/**
- * A pane that contains a folder tree on the left and a folder
- * manipulator on the right.
+ * A pane that contains a folder tree on the left and a folder manipulator on
+ * the right.
*
* @author Justin Ross <jross@redhat.com>
- * @version $Id: FolderAdminPane.java 1942 2009-05-29 07:53:23Z terry $
*/
public class FolderAdminPane extends SelectionPanel {
- private static final Logger s_log = Logger.getLogger
- (FolderAdminPane.class);
+ private static final Logger s_log = Logger.getLogger(FolderAdminPane.class);
private final FolderRequestLocal m_folder;
@@ -69,16 +72,23 @@ public class FolderAdminPane extends SelectionPanel {
setEdit(new ActionLink(new Label(gz("cms.ui.folder.edit"))),
new FolderEditForm(m_folder));
- final BaseDeleteForm delete = new BaseDeleteForm
- (new Label(gz("cms.ui.folder.delete_prompt"))) {
- public final void process(final FormSectionEvent e)
- throws FormProcessException {
- final PageState state = e.getPageState();
+ final BaseDeleteForm delete = new BaseDeleteForm(new Label(gz(
+ "cms.ui.folder.delete_prompt"))) {
- m_folder.getFolder(state).delete();
- getSelectionModel().clearSelection(state);
- }
- };
+ @Override
+ public final void process(final FormSectionEvent e)
+ throws FormProcessException {
+ final PageState state = e.getPageState();
+
+ final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
+ final CategoryRepository categoryRepo = cdiUtil.findBean(
+ CategoryRepository.class);
+
+ categoryRepo.delete(m_folder.getFolder(state));
+ getSelectionModel().clearSelection(state);
+ }
+
+ };
setDelete(new ActionLink(new Label(gz("cms.ui.folder.delete"))),
delete);
@@ -91,6 +101,7 @@ public class FolderAdminPane extends SelectionPanel {
addAction(getDeleteLink());
}
+ @Override
public void register(final Page page) {
super.register(page);
@@ -99,31 +110,35 @@ public class FolderAdminPane extends SelectionPanel {
}
private class PreselectListener implements ActionListener {
+
+ @Override
public final void actionPerformed(final ActionEvent e) {
final PageState state = e.getPageState();
- final SingleSelectionModel model = getSelectionModel();
+ final SingleSelectionModel model = getSelectionModel();
if (!model.isSelected(state)) {
- final BigDecimal value = (BigDecimal) state.getValue(m_param);
+ final Long value = (Long) state.getValue(m_param);
if (value == null) {
- final ContentSection section =
- CMS.getContext().getContentSection();
+ final ContentSection section = CMS.getContext()
+ .getContentSection();
- model.setSelectedKey
- (state, section.getRootFolder().getID());
+ model.setSelectedKey(state, section.getRootDocumentsFolder()
+ .getObjectId());
} else {
model.setSelectedKey(state, value);
}
}
}
+
}
private static GlobalizedMessage gz(final String key) {
- return GlobalizationUtil.globalize(key);
+ return new GlobalizedMessage(key, CmsConstants.CMS_FOLDER_BUNDLE);
}
private static String lz(final String key) {
return (String) gz(key).localize();
}
+
}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBaseForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBaseForm.java
new file mode 100755
index 000000000..110c2df23
--- /dev/null
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBaseForm.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+package com.arsdigita.cms.ui.folder;
+
+import com.arsdigita.bebop.GridPanel;
+import com.arsdigita.bebop.Label;
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.SaveCancelSection;
+import com.arsdigita.bebop.form.TextField;
+import com.arsdigita.bebop.parameters.NotNullValidationListener;
+import com.arsdigita.bebop.parameters.TrimmedStringParameter;
+
+import org.librecms.contentsection.ContentItem;
+
+import com.arsdigita.cms.ui.CMSForm;
+import com.arsdigita.globalization.GlobalizedMessage;
+import com.arsdigita.web.Web;
+
+import org.apache.log4j.Logger;
+import org.librecms.CmsConstants;
+
+/**
+ * Class FolderForm implements the basic form for creating or renaming folders.
+ *
+ * @author Jon Orris <jorris@redhat.com>
+ * @version $Id$
+ */
+abstract class FolderBaseForm extends CMSForm {
+
+ private static Logger s_log = Logger.getLogger(FolderBaseForm.class);
+
+ public static final String NAME = "ContentItemName";
+ public static final String TITLE = "ContentPageTitle";
+
+ private static final String TITLE_ON_FOCUS = "if (this.form." + NAME + ".value == '') {"
+ + " defaulting = true;" + " this.form."
+ + NAME + ".value = urlize(this.value);" + "}";
+
+ private static final String TITLE_ON_KEY_UP = "if (defaulting) {" + " this.form." + NAME
+ + ".value = urlize(this.value)" + "}";
+
+ private static final String FRAGMENT_ON_FOCUS = "defaulting = false";
+
+ private static final String FRAGMENT_ON_BLUR = "if (this.value == '') {"
+ + " defaulting = true;"
+ + " this.value = urlize(this.form." + TITLE
+ + ".value)" + "} else {"
+ + " this.value = urlize(this.value);" + "}";
+
+ private Label m_script = new Label(
+ String.format(
+ "",
+ Web.getWebappContextPath()),
+ false);
+
+ final TextField m_title;
+ final TextField m_fragment;
+ final SaveCancelSection m_submits;
+
+ public FolderBaseForm(final String name) {
+ super(name);
+
+ add(m_script, GridPanel.FULL_WIDTH);
+
+ // Title
+ add(new Label(gz("cms.ui.folder.name")));
+
+ m_title = new TextField(new TrimmedStringParameter(TITLE));
+ add(m_title);
+
+ m_title.addValidationListener(new NotNullValidationListener());
+ m_title.setOnFocus(TITLE_ON_FOCUS);
+
+ m_title.setOnFocus(TITLE_ON_FOCUS);
+ m_title.setOnKeyUp(TITLE_ON_KEY_UP);
+
+ // Fragment
+ add(new Label(gz("cms.ui.folder.fragment")));
+
+ m_fragment = new TextField(new TrimmedStringParameter(NAME));
+ add(m_fragment);
+
+ m_fragment.addValidationListener(new NotNullValidationListener());
+
+ m_fragment.setOnFocus(FRAGMENT_ON_FOCUS);
+ m_fragment.setOnBlur(FRAGMENT_ON_BLUR);
+
+ m_submits = new SaveCancelSection();
+ add(m_submits, GridPanel.FULL_WIDTH);
+ }
+
+ public final boolean isCancelled(final PageState state) {
+ return m_submits.getCancelButton().isSelected(state);
+ }
+
+ private static GlobalizedMessage gz(final String key) {
+ return new GlobalizedMessage(key, CmsConstants.CMS_FOLDER_BUNDLE);
+ }
+
+ private static String lz(final String key) {
+ return (String) gz(key).localize();
+ }
+
+}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderEditForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderEditForm.java
new file mode 100755
index 000000000..103eeff59
--- /dev/null
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderEditForm.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+package com.arsdigita.cms.ui.folder;
+
+import com.arsdigita.bebop.Form;
+import com.arsdigita.bebop.FormProcessException;
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.event.FormInitListener;
+import com.arsdigita.bebop.event.FormProcessListener;
+import com.arsdigita.bebop.event.FormSectionEvent;
+
+import org.apache.log4j.Logger;
+import org.libreccm.categorization.Category;
+import org.libreccm.categorization.CategoryRepository;
+import org.libreccm.cdi.utils.CdiUtil;
+
+class FolderEditForm extends FolderBaseForm {
+
+ private static Logger s_log = Logger.getLogger(FolderEditForm.class);
+
+ private final FolderRequestLocal m_folder;
+
+ public FolderEditForm(final FolderRequestLocal folder) {
+ super("folder-edit");
+
+ m_folder = folder;
+
+ // XXX need to do name uniqueness valdation on m_fragment here
+ // as well.
+
+ addInitListener(new InitListener());
+ addProcessListener(new ProcessListener());
+ }
+
+ private static FolderRequestLocal parent(final FolderRequestLocal folder) {
+ final FolderRequestLocal parent = new FolderRequestLocal(null) {
+ @Override
+ protected final Object initialValue(final PageState state) {
+ return folder.getFolder(state).getParent().get();
+ }
+ };
+
+ return parent;
+ }
+
+ private class InitListener implements FormInitListener {
+ public final void init(final FormSectionEvent e) {
+ final PageState state = e.getPageState();
+
+ final Category folder = m_folder.getFolder(state);
+
+ m_title.setValue(state, folder.getDisplayName());
+ m_fragment.setValue(state, folder.getName());
+ }
+ }
+
+ private class ProcessListener implements FormProcessListener {
+ public final void process(final FormSectionEvent e)
+ throws FormProcessException {
+ final PageState state = e.getPageState();
+
+ final Category folder = m_folder.getFolder(state);
+
+ folder.setDisplayName((String) m_title.getValue(state));
+ folder.setName((String) m_fragment.getValue(state));
+
+ final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
+ final CategoryRepository categoryRepo = cdiUtil.findBean(CategoryRepository.class);
+ categoryRepo.save(folder);
+ }
+ }
+}
diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/item/ContentItemRequestLocal.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/item/ContentItemRequestLocal.java
new file mode 100755
index 000000000..f37cb5643
--- /dev/null
+++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/item/ContentItemRequestLocal.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
+ *
+ * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+package com.arsdigita.cms.ui.item;
+
+import com.arsdigita.bebop.PageState;
+import com.arsdigita.bebop.RequestLocal;
+
+import org.librecms.contentsection.ContentItem;
+
+import com.arsdigita.util.Assert;
+
+/**
+ * {@link RequestLocal} storing a content item.
+ */
+public abstract class ContentItemRequestLocal extends RequestLocal {
+
+ public final ContentItem getContentItem(final PageState state) {
+ final ContentItem item = (ContentItem) get(state);
+
+ Assert.exists(item, "ContentItem item");
+
+ return item;
+ }
+}
diff --git a/ccm-core/src/main/java/com/arsdigita/toolbox/ui/ModalPanel.java b/ccm-core/src/main/java/com/arsdigita/toolbox/ui/ModalPanel.java
index 939edab60..eeae215e1 100755
--- a/ccm-core/src/main/java/com/arsdigita/toolbox/ui/ModalPanel.java
+++ b/ccm-core/src/main/java/com/arsdigita/toolbox/ui/ModalPanel.java
@@ -50,7 +50,6 @@ import org.apache.log4j.Logger;
/**
*
- * @version $Id$
*/
public class ModalPanel extends ComponentMap {
diff --git a/ccm-core/src/main/java/com/arsdigita/toolbox/ui/SelectionPanel.java b/ccm-core/src/main/java/com/arsdigita/toolbox/ui/SelectionPanel.java
index 09d333b64..d62716328 100755
--- a/ccm-core/src/main/java/com/arsdigita/toolbox/ui/SelectionPanel.java
+++ b/ccm-core/src/main/java/com/arsdigita/toolbox/ui/SelectionPanel.java
@@ -37,13 +37,12 @@ import org.apache.log4j.Logger;
/**
*
- * @version $Id$
*/
public class SelectionPanel extends LayoutPanel implements Resettable {
private static final Logger s_log = Logger.getLogger(SelectionPanel.class);
- private SingleSelectionModel m_model;
+ private SingleSelectionModel m_model;
private Component m_selector;
private ActionGroup m_group;
private final ModalPanel m_body;
@@ -60,7 +59,7 @@ public class SelectionPanel extends LayoutPanel implements Resettable {
protected void build(final Component title,
final Component selector,
- final SingleSelectionModel model) {
+ final SingleSelectionModel model) {
m_model = model;
m_selector = selector;
@@ -198,11 +197,11 @@ public class SelectionPanel extends LayoutPanel implements Resettable {
m_selector = selector;
}
- public final void setSelectionModel(final SingleSelectionModel model) {
+ public final void setSelectionModel(final SingleSelectionModel model) {
m_model = model;
}
- public final SingleSelectionModel getSelectionModel() {
+ public final SingleSelectionModel getSelectionModel() {
return m_model;
}