Kommentare und einige Aufräumarbeiten

git-svn-id: https://svn.libreccm.org/ccm/trunk@1791 8810af33-2d31-482b-a856-94f89814c4df
master
quasi 2012-07-31 05:42:30 +00:00
parent c4969bff47
commit b96f23ecba
13 changed files with 314 additions and 186 deletions

View File

@ -15,7 +15,7 @@ cms.contenttypes.ui.person.edit_basic_properties=Bearbeiten
cms.contenttypes.ui.person.surname=Nachname cms.contenttypes.ui.person.surname=Nachname
cms.contenttypes.ui.person.givenname=Vorname cms.contenttypes.ui.person.givenname=Vorname
cms.contenttypes.ui.person.titlepre=Titel cms.contenttypes.ui.person.titlepre=Titel
cms.contenttypes.ui.person.titlepost=Namesanhang cms.contenttypes.ui.person.titlepost=Namensanhang
cms.contenttypes.ui.person.birthdate=Geburtstag cms.contenttypes.ui.person.birthdate=Geburtstag
cms.contenttypes.ui.person.description=Beschreibung cms.contenttypes.ui.person.description=Beschreibung

View File

@ -34,7 +34,6 @@ import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ImageAsset; import com.arsdigita.cms.ImageAsset;
import com.arsdigita.cms.SecurityManager; import com.arsdigita.cms.SecurityManager;
import com.arsdigita.cms.Service; import com.arsdigita.cms.Service;
import com.arsdigita.cms.ui.ImageComponent;
import com.arsdigita.domain.DataObjectNotFoundException; import com.arsdigita.domain.DataObjectNotFoundException;
import com.arsdigita.domain.DomainObjectFactory; import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.mimetypes.MimeType; import com.arsdigita.mimetypes.MimeType;
@ -62,6 +61,7 @@ import org.apache.log4j.Logger;
* </code></pre></blockquote> * </code></pre></blockquote>
* *
* @author Stanislav Freidin * @author Stanislav Freidin
* @author Sören Bernstein (quasimodo) <sbernstein@quasiweb.de>
* @version $Id: ImageBrowser.java 1940 2009-05-29 07:15:05Z terry $ * @version $Id: ImageBrowser.java 1940 2009-05-29 07:15:05Z terry $
*/ */
public class ImageBrowser extends Table { public class ImageBrowser extends Table {
@ -80,7 +80,7 @@ public class ImageBrowser extends Table {
private static final Logger s_log = Logger.getLogger(ImageBrowser.class); private static final Logger s_log = Logger.getLogger(ImageBrowser.class);
/** /**
* Construct a new ImageBrowser * Construct a new ImageBrowser with default mode.
* *
* @param builder the {@link ImageBrowserModelBuilder} that will supply this * @param builder the {@link ImageBrowserModelBuilder} that will supply this
* component with its {@link ImageBrowserModel} during each request * component with its {@link ImageBrowserModel} during each request
@ -90,6 +90,13 @@ public class ImageBrowser extends Table {
this(b, ImageComponent.ATTACH_IMAGE); this(b, ImageComponent.ATTACH_IMAGE);
} }
/**
* Construct a new ImageBrowser with requested mode.
*
* @param builder the {@link ImageBrowserModelBuilder} that will supply this
* component with its {@link ImageBrowserModel} during each request
* @param mode the component mode (see {@link ImageComponent})
*/
public ImageBrowser(ImageBrowserModelBuilder b, int mode) { public ImageBrowser(ImageBrowserModelBuilder b, int mode) {
super(new BuilderAdapter(b), HEADERS); super(new BuilderAdapter(b), HEADERS);
m_mode = mode; m_mode = mode;

View File

@ -1,6 +1,5 @@
/* /*
* To change this template, choose Tools | Templates *
* and open the template in the editor.
*/ */
package com.arsdigita.cms.ui; package com.arsdigita.cms.ui;
@ -11,11 +10,18 @@ import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.cms.ReusableImageAsset; import com.arsdigita.cms.ReusableImageAsset;
/** /**
* Interface for ImageCompnents.
*
* All components for image handling (like {@link ImageLibraryComponent} or
* {@link ImageUploadComponent}) should implement this interface.
* *
* @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de> * @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de>
*/ */
public interface ImageComponent { public interface ImageComponent {
/**
* The modes
*/
public static final int DISPLAY_ONLY = 0; public static final int DISPLAY_ONLY = 0;
public static final int SELECT_IMAGE = 1; public static final int SELECT_IMAGE = 1;
public static final int ATTACH_IMAGE = 2; public static final int ATTACH_IMAGE = 2;

View File

@ -18,6 +18,12 @@ import java.util.Map;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
/** /**
* An abstract listener for {@link ImageComponent}.
*
* This listener provides the base implementation which is shared between all
* listeners of this kind.
*
* This listerner is used by {@link ImageSelectPage}.
* *
* @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de> * @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de>
*/ */
@ -39,6 +45,13 @@ public abstract class ImageComponentAbstractListener implements FormInitListener
} }
} }
/**
* Call {@link #cancelled(com.arsdigita.bebop.PageState)} if the cancel button
* was pressed.
*
* @param event the {@link FormSectionEvent}
* @throws FormProcessException
*/
public void submitted(FormSectionEvent event) throws FormProcessException { public void submitted(FormSectionEvent event) throws FormProcessException {
PageState ps = event.getPageState(); PageState ps = event.getPageState();
ImageComponent component = getImageComponent(ps); ImageComponent component = getImageComponent(ps);
@ -48,6 +61,13 @@ public abstract class ImageComponentAbstractListener implements FormInitListener
} }
} }
/**
* Call {@link #processImage(com.arsdigita.bebop.event.FormSectionEvent, com.arsdigita.bebop.PageState, com.arsdigita.cms.ui.ImageComponent, com.arsdigita.cms.ReusableImageAsset) }
* if the save button was pressed.
*
* @param event the {@link FormSectionEvent}
* @throws FormProcessException
*/
public void process(FormSectionEvent event) throws FormProcessException { public void process(FormSectionEvent event) throws FormProcessException {
PageState ps = event.getPageState(); PageState ps = event.getPageState();
ImageComponent component = getImageComponent(ps); ImageComponent component = getImageComponent(ps);
@ -62,8 +82,21 @@ public abstract class ImageComponentAbstractListener implements FormInitListener
} }
/**
* To be overridden by child if neccessary.
*
* @param ps
*/
protected void cancelled(PageState ps) {}; protected void cancelled(PageState ps) {};
/**
* Process the input.
*
* @param event the {@link FormSectionEvent}
* @param ps {@link PageState}
* @param component an {@link ImageComponent}
* @param image the {@link ReusableImageAsset}
*/
protected abstract void processImage(FormSectionEvent event, PageState ps, ImageComponent component, ReusableImageAsset image); protected abstract void processImage(FormSectionEvent event, PageState ps, ImageComponent component, ReusableImageAsset image);
protected ImageComponent getImageComponent(PageState ps) { protected ImageComponent getImageComponent(PageState ps) {
@ -80,6 +113,12 @@ public abstract class ImageComponentAbstractListener implements FormInitListener
} }
/**
* Sets the active component
*
* @param ps Page state
* @param activeKey the key of the active component
*/
protected void setImageComponent(PageState ps, final String activeKey) { protected void setImageComponent(PageState ps, final String activeKey) {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {

View File

@ -13,6 +13,9 @@ import com.arsdigita.cms.ReusableImageAsset;
import com.arsdigita.toolbox.ui.ComponentMap; import com.arsdigita.toolbox.ui.ComponentMap;
/** /**
* A listener to administer images.
*
* This listerner is used by {@link ImagesPane}.
* *
* @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de> * @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de>
*/ */

View File

@ -4,7 +4,6 @@
*/ */
package com.arsdigita.cms.ui; package com.arsdigita.cms.ui;
import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.MapComponentSelectionModel; import com.arsdigita.bebop.MapComponentSelectionModel;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.event.FormSectionEvent; import com.arsdigita.bebop.event.FormSectionEvent;
@ -12,15 +11,18 @@ import com.arsdigita.cms.ReusableImageAsset;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
/** /**
* A listener to select an image and save it for later use.
*
* This listerner is used by {@link ImageSelectPage}.
* *
* @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de> * @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de>
*/ */
public class ImageComponentSelectListener extends ImageComponentAbstractListener { public class ImageComponentSelectListener extends ImageComponentAbstractListener {
private static final Logger S_LOG = Logger.getLogger(ImageComponentSelectListener.class); private static final Logger S_LOG = Logger.getLogger(ImageComponentSelectListener.class);
private final ImageSelectResultPane m_resultPane; private final ImageSelectResultComponent m_resultPane;
public ImageComponentSelectListener(MapComponentSelectionModel imageComponent, ImageSelectResultPane resultPane) { public ImageComponentSelectListener(MapComponentSelectionModel imageComponent, ImageSelectResultComponent resultPane) {
super(imageComponent); super(imageComponent);
m_resultPane = resultPane; m_resultPane = resultPane;
} }

View File

@ -25,7 +25,13 @@ import com.arsdigita.domain.DataObjectNotFoundException;
import java.math.BigDecimal; import java.math.BigDecimal;
/** /**
* An image library component.
* *
* This component can be used in different places to add an image library
* in a convinient way. This class uses a listener class which should be extended
* from {@link ImageComponentAbstractListener}.
*
* @author unknown
* @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de> * @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de>
*/ */
public class ImageLibraryComponent extends SimpleContainer implements ImageComponent, Resettable { public class ImageLibraryComponent extends SimpleContainer implements ImageComponent, Resettable {
@ -67,7 +73,7 @@ public class ImageLibraryComponent extends SimpleContainer implements ImageCompo
try { try {
final ReusableImageAsset image = new ReusableImageAsset(imageID); final ReusableImageAsset image = new ReusableImageAsset(imageID);
if(m_mode == ImageComponent.SELECT_IMAGE) { if(m_mode == ImageComponent.SELECT_IMAGE) {
parent.getResultPane().setResult(image.getDisplayName(), image.getID(), image.getWidth(), image.getHeight()); parent.getResultComponent().setResult(image);
} }
m_imageModel.setSelectedObject(state, image); m_imageModel.setSelectedObject(state, image);
} catch (DataObjectNotFoundException ex) { } catch (DataObjectNotFoundException ex) {
@ -164,6 +170,11 @@ public class ImageLibraryComponent extends SimpleContainer implements ImageCompo
return m_saveCancel; return m_saveCancel;
} }
/**
* Add a link to an {@link ImageUploadComponent}
*
* @param actionListener
*/
public void addUploadLink(final ActionListener actionListener) { public void addUploadLink(final ActionListener actionListener) {
// Add action link to image upload component // Add action link to image upload component
if (m_mode != ImageComponent.DISPLAY_ONLY) { if (m_mode != ImageComponent.DISPLAY_ONLY) {
@ -173,7 +184,9 @@ public class ImageLibraryComponent extends SimpleContainer implements ImageCompo
} }
} }
// Reset this component /**
* Reset this component.
*/
public void reset(final PageState state) { public void reset(final PageState state) {
// clear selection // clear selection
m_imageModel.clearSelection(state); m_imageModel.clearSelection(state);

View File

@ -21,6 +21,10 @@ import java.util.HashMap;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
/** /**
* A {@link CMSPage} to select and upload images.
*
* This page is used by /web/templates/ccm-cms/content-section/admin/image_select.jsp
* which is used by the OpenCCM plugin for Xihna editor.
* *
* @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de> * @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de>
*/ */
@ -32,7 +36,7 @@ public class ImageSelectPage extends CMSPage {
private TabbedPane m_tabbedPane; private TabbedPane m_tabbedPane;
private ImageLibraryComponent m_imageLibrary; private ImageLibraryComponent m_imageLibrary;
private ImageUploadComponent m_imageUpload; private ImageUploadComponent m_imageUpload;
private ImageSelectResultPane m_resultPane; private ImageSelectResultComponent m_result;
private BigDecimalParameter m_sectionId; private BigDecimalParameter m_sectionId;
private final StringParameter m_imageComponentKey; private final StringParameter m_imageComponentKey;
private final MapComponentSelectionModel m_imageComponent; private final MapComponentSelectionModel m_imageComponent;
@ -56,7 +60,7 @@ public class ImageSelectPage extends CMSPage {
m_imageComponent = m_imageComponent =
new MapComponentSelectionModel(componentModel, new HashMap()); new MapComponentSelectionModel(componentModel, new HashMap());
m_selectListener = new ImageComponentSelectListener(m_imageComponent, getResultPane()); m_selectListener = new ImageComponentSelectListener(m_imageComponent, getResultComponent());
m_tabbedPane = createTabbedPane(); m_tabbedPane = createTabbedPane();
m_tabbedPane.setIdAttr("page-body"); m_tabbedPane.setIdAttr("page-body");
@ -77,11 +81,16 @@ public class ImageSelectPage extends CMSPage {
} }
}); });
add(m_resultPane); add(m_result);
addGlobalStateParam(m_imageComponentKey); addGlobalStateParam(m_imageComponentKey);
} }
/**
* Create the image library pane
*
* @return m_imageLibrary
*/
protected ImageLibraryComponent getImageLibraryPane() { protected ImageLibraryComponent getImageLibraryPane() {
if (m_imageLibrary == null) { if (m_imageLibrary == null) {
m_imageLibrary = new ImageLibraryComponent(ImageComponent.SELECT_IMAGE, this); m_imageLibrary = new ImageLibraryComponent(ImageComponent.SELECT_IMAGE, this);
@ -92,6 +101,11 @@ public class ImageSelectPage extends CMSPage {
return m_imageLibrary; return m_imageLibrary;
} }
/**
* Create the image upload pane
*
* @return m_imageUpload
*/
protected ImageUploadComponent getImageUploadPane() { protected ImageUploadComponent getImageUploadPane() {
if (m_imageUpload == null) { if (m_imageUpload == null) {
@ -103,13 +117,21 @@ public class ImageSelectPage extends CMSPage {
return m_imageUpload; return m_imageUpload;
} }
protected ImageSelectResultPane getResultPane() { /**
if (m_resultPane == null) { * Creates an {@link ImageSelectResultComponent}
m_resultPane = new ImageSelectResultPane(); *
* @return m_resultPane
*/
protected ImageSelectResultComponent getResultComponent() {
if (m_result == null) {
m_result = new ImageSelectResultComponent();
} }
return m_resultPane; return m_result;
} }
/**
* Create the tabbed pane
*/
protected TabbedPane createTabbedPane() { protected TabbedPane createTabbedPane() {
TabbedPane pane = new TabbedPane(); TabbedPane pane = new TabbedPane();
pane.setClassAttr(XSL_CLASS); pane.setClassAttr(XSL_CLASS);

View File

@ -7,31 +7,33 @@ package com.arsdigita.cms.ui;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Resettable; import com.arsdigita.bebop.Resettable;
import com.arsdigita.bebop.SimpleContainer; import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.cms.ImageAsset;
import com.arsdigita.cms.Service;
import com.arsdigita.xml.Element; import com.arsdigita.xml.Element;
import java.math.BigDecimal;
/** /**
* A component which will insert a javascript to the xml output with the
* image information for the OpenCCM plugin for Xinha editor.
* *
* @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de> * @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de>
*/ */
public class ImageSelectResultPane extends SimpleContainer implements Resettable { public class ImageSelectResultComponent extends SimpleContainer implements Resettable {
boolean m_valid = false; boolean m_valid = false;
String m_name; ImageAsset m_image;
BigDecimal m_id;
BigDecimal m_width;
BigDecimal m_height;
public ImageSelectResultPane() { public ImageSelectResultComponent() {
super(); super();
} }
public void setResult(final String name, final BigDecimal id, final BigDecimal width, final BigDecimal height) { /**
m_name = name; * Save image imformation
m_id = id; *
m_width = width; * @param iamge an {@link ImageAsset}
m_height = height; */
m_valid = true; public void setResult(final ImageAsset image/*, final String name, final BigDecimal id, final BigDecimal width, final BigDecimal height*/) {
m_image = image;
m_valid = (m_image != null);
} }
@Override @Override
@ -48,17 +50,17 @@ public class ImageSelectResultPane extends SimpleContainer implements Resettable
script.append("if(button.id == \"save\" ) {"); script.append("if(button.id == \"save\" ) {");
script.append("window.opener.openCCM.imageSet({"); script.append("window.opener.openCCM.imageSet({");
script.append(" src : \"/ccm/cms-service/stream/image/?image_id="); script.append(" src : \"");
script.append(m_id); script.append(Service.getImageURL(m_image));
script.append("\", "); script.append("\", ");
script.append(" name : \""); script.append(" name : \"");
script.append(m_name); script.append(m_image.getDisplayName());
script.append("\", "); script.append("\", ");
script.append(" width : \""); script.append(" width : \"");
script.append(m_width); script.append(m_image.getWidth());
script.append("\", "); script.append("\", ");
script.append(" height : \""); script.append(" height : \"");
script.append(m_height); script.append(m_image.getHeight());
script.append("\""); script.append("\"");
script.append("});"); script.append("});");
script.append("}"); script.append("}");
@ -71,11 +73,12 @@ public class ImageSelectResultPane extends SimpleContainer implements Resettable
scriptElem.setText(script.toString()); scriptElem.setText(script.toString());
} }
/**
* Reset this component.
*
* @param state Page state
*/
public void reset(PageState state) { public void reset(PageState state) {
m_name = null; setResult(null);
m_id = null;
m_width = null;
m_height = null;
m_valid = false;
} }
} }

View File

@ -21,7 +21,13 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
/** /**
* An image upload component.
* *
* This component can be used in different places to add image upload capabilities
* in a convinient way. This class uses a listener class which should be extended
* from {@link ImageComponentAbstractListener}.
*
* @author unknown
* @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de> * @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de>
*/ */
public class ImageUploadComponent extends Form implements ImageComponent { public class ImageUploadComponent extends Form implements ImageComponent {
@ -34,10 +40,18 @@ public class ImageUploadComponent extends Form implements ImageComponent {
private final SaveCancelSection m_saveCancel; private final SaveCancelSection m_saveCancel;
private int m_mode; private int m_mode;
/**
* Creates an ImageUploadComponent in attach mode.
*/
public ImageUploadComponent() { public ImageUploadComponent() {
this(ImageComponent.ATTACH_IMAGE); this(ImageComponent.ATTACH_IMAGE);
} }
/**
* Creates an ImageUploadComponent with the selected mode.
*
* @param mode The operation mode (see {@link ImageComponent)
*/
public ImageUploadComponent(int mode) { public ImageUploadComponent(int mode) {
super("imageUploadComponent", new ColumnPanel(2)); super("imageUploadComponent", new ColumnPanel(2));
m_mode = mode; m_mode = mode;

View File

@ -34,7 +34,7 @@ import java.util.Map;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
/** /**
* A LayoutPanel to insert into ContentSectionPage or ImageSelectPage * A {@link LayoutPanel} to insert into {@link ContentSectionPage}.
* *
* @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de> * @author Sören Bernstein (quasimodo) <sbernstein@zes.uni-bremen.de>
*/ */
@ -77,6 +77,7 @@ public class ImagesPane extends LayoutPanel implements Resettable {
final Map selectors = m_imageComponent.getComponentsMap(); final Map selectors = m_imageComponent.getComponentsMap();
m_adminListener = new ImageComponentAdminListener(m_imageComponent, this); m_adminListener = new ImageComponentAdminListener(m_imageComponent, this);
// Image library component
final ImageLibraryComponent library = new ImageLibraryComponent(ImageComponent.ADMIN_IMAGES); final ImageLibraryComponent library = new ImageLibraryComponent(ImageComponent.ADMIN_IMAGES);
library.getForm().addInitListener(m_adminListener); library.getForm().addInitListener(m_adminListener);
library.getForm().addProcessListener(m_adminListener); library.getForm().addProcessListener(m_adminListener);
@ -86,6 +87,7 @@ public class ImagesPane extends LayoutPanel implements Resettable {
new Label(GlobalizationUtil.globalize("cms.ui.image_library")), new Label(GlobalizationUtil.globalize("cms.ui.image_library")),
library)); library));
// Image upload component
final ImageUploadComponent upload = new ImageUploadComponent(ImageComponent.ADMIN_IMAGES); final ImageUploadComponent upload = new ImageUploadComponent(ImageComponent.ADMIN_IMAGES);
upload.getForm().addInitListener(m_adminListener); upload.getForm().addInitListener(m_adminListener);
upload.getForm().addSubmissionListener(m_adminListener); upload.getForm().addSubmissionListener(m_adminListener);
@ -126,6 +128,11 @@ public class ImagesPane extends LayoutPanel implements Resettable {
page.addComponentStateParam(this, m_imageComponentKey); page.addComponentStateParam(this, m_imageComponentKey);
} }
/**
* Resets this pane and all its resettable components.
*
* @param state Page state
*/
@Override @Override
public final void reset(final PageState state) { public final void reset(final PageState state) {
super.reset(state); super.reset(state);

View File

@ -76,12 +76,9 @@ import org.apache.log4j.Logger;
*/ */
class CategoryItemPane extends BaseItemPane { class CategoryItemPane extends BaseItemPane {
private static final Logger s_log = Logger.getLogger private static final Logger s_log = Logger.getLogger(CategoryItemPane.class);
(CategoryItemPane.class);
private final SingleSelectionModel m_model; private final SingleSelectionModel m_model;
private final CategoryRequestLocal m_category; private final CategoryRequestLocal m_category;
private final SimpleContainer m_detailPane; private final SimpleContainer m_detailPane;
public CategoryItemPane(final SingleSelectionModel model, public CategoryItemPane(final SingleSelectionModel model,
@ -106,9 +103,8 @@ class CategoryItemPane extends BaseItemPane {
if (!super.isVisible(state)) { if (!super.isVisible(state)) {
return false; return false;
} }
CategorizedCollection items = m_category.getCategory CategorizedCollection items = m_category.getCategory(state).getObjects(ContentItem.BASE_DATA_OBJECT_TYPE);
(state).getObjects(ContentItem.BASE_DATA_OBJECT_TYPE); items.addEqualsFilter(ContentItem.VERSION, ContentItem.LIVE);
items.addEqualsFilter(ContentItem.VERSION,ContentItem.LIVE);
boolean canOrder = items.size() > 1; boolean canOrder = items.size() > 1;
items.close(); items.close();
return canOrder; return canOrder;
@ -128,9 +124,9 @@ class CategoryItemPane extends BaseItemPane {
add(indexForm); add(indexForm);
ViewItemLink viewIndexLink = new ViewItemLink(new Label(gz( ViewItemLink viewIndexLink = new ViewItemLink(new Label(gz(
"cms.ui.category.view_index_item")),""); "cms.ui.category.view_index_item")), "");
EditItemLink editIndexLink = new EditItemLink(new Label(gz( EditItemLink editIndexLink = new EditItemLink(new Label(gz(
"cms.ui.category.edit_index_item")),""); "cms.ui.category.edit_index_item")), "");
// Summary // Summary
m_detailPane.add(new SummarySection(editLink, deleteLink, indexLink, m_detailPane.add(new SummarySection(editLink, deleteLink, indexLink,
@ -143,14 +139,13 @@ class CategoryItemPane extends BaseItemPane {
@Override @Override
public boolean isVisible(PageState state) { public boolean isVisible(PageState state) {
// Only show addLanguage button, if there are langauges to add // Only show addLanguage button, if there are langauges to add
int countSupportedLanguages = ( int countSupportedLanguages = (Kernel.getConfig()).getSupportedLanguagesTokenizer()
Kernel.getConfig()).getSupportedLanguagesTokenizer()
.countTokens(); .countTokens();
long countLanguages = long countLanguages =
m_category.getCategory(state) m_category.getCategory(state)
.getCategoryLocalizationCollection().size(); .getCategoryLocalizationCollection().size();
if(countLanguages < countSupportedLanguages) { if (countLanguages < countSupportedLanguages) {
return true; return true;
} else { } else {
return false; return false;
@ -170,8 +165,7 @@ class CategoryItemPane extends BaseItemPane {
m_detailPane.add(new SubcategorySection(addLink)); m_detailPane.add(new SubcategorySection(addLink));
// Linked categories // Linked categories
final ActionLink linkAddLink = new ActionLink final ActionLink linkAddLink = new ActionLink(new Label(gz("cms.ui.category.linked_add")));
(new Label(gz("cms.ui.category.linked_add")));
final Form linkForm = new LinkForm(m_category); final Form linkForm = new LinkForm(m_category);
add(linkForm); add(linkForm);
@ -196,6 +190,7 @@ class CategoryItemPane extends BaseItemPane {
} }
private class EditVisible extends VisibilityComponent { private class EditVisible extends VisibilityComponent {
EditVisible(final Component child) { EditVisible(final Component child) {
super(child, null); super(child, null);
} }
@ -207,6 +202,7 @@ class CategoryItemPane extends BaseItemPane {
} }
private class AdminVisible extends VisibilityComponent { private class AdminVisible extends VisibilityComponent {
AdminVisible(final Component child) { AdminVisible(final Component child) {
super(child, null); super(child, null);
} }
@ -262,6 +258,7 @@ class CategoryItemPane extends BaseItemPane {
} }
private class Properties extends PropertyList { private class Properties extends PropertyList {
@Override @Override
protected final java.util.List properties(final PageState state) { protected final java.util.List properties(final PageState state) {
final java.util.List props = super.properties(state); final java.util.List props = super.properties(state);
@ -273,8 +270,7 @@ class CategoryItemPane extends BaseItemPane {
if (item != null) { if (item != null) {
itemTitle = item.getDisplayName(); itemTitle = item.getDisplayName();
} else if (!category.ignoreParentIndexItem() } else if (!category.ignoreParentIndexItem()
&& category.getParentCategoryCount() > 0) && category.getParentCategoryCount() > 0) {
{
Category ancestor = findParentCategoryWithNonInheritedIndexItem(category); Category ancestor = findParentCategoryWithNonInheritedIndexItem(category);
if (ancestor != null) { if (ancestor != null) {
if (ancestor.getIndexObject() != null) { if (ancestor.getIndexObject() != null) {
@ -295,13 +291,13 @@ class CategoryItemPane extends BaseItemPane {
props.add(new Property(gz("cms.ui.category.url"), props.add(new Property(gz("cms.ui.category.url"),
category.getURL(""))); category.getURL("")));
props.add(new Property(gz("cms.ui.category.is_not_abstract"), props.add(new Property(gz("cms.ui.category.is_not_abstract"),
category.isAbstract() ? category.isAbstract()
gz("cms.ui.no") : ? gz("cms.ui.no")
gz("cms.ui.yes"))); : gz("cms.ui.yes")));
props.add(new Property(gz("cms.ui.category.is_enabled"), props.add(new Property(gz("cms.ui.category.is_enabled"),
category.isEnabled("") ? category.isEnabled("")
gz("cms.ui.yes") : ? gz("cms.ui.yes")
gz("cms.ui.no"))); : gz("cms.ui.no")));
props.add(new Property(gz("cms.ui.category.index_item"), props.add(new Property(gz("cms.ui.category.index_item"),
itemTitle)); itemTitle));
@ -334,18 +330,28 @@ class CategoryItemPane extends BaseItemPane {
// Quasimodo: BEGIN // Quasimodo: BEGIN
// CategoryLocalizationSection // CategoryLocalizationSection
private class CategoryLocalizationSection extends Section { private class CategoryLocalizationSection extends Section {
private CategoryLocalizationTable m_catLocalizationTable;
private CategoryLocalizationEditForm m_editCategoryLocalizationForm;
CategoryLocalizationSection(ActionLink addLink) { CategoryLocalizationSection(ActionLink addLink) {
setHeading(new Label(gz("cms.ui.category.localizations"))); setHeading(new Label(gz("cms.ui.category.localizations")));
final ActionGroup group = new ActionGroup(); final ActionGroup group = new ActionGroup();
setBody(group); setBody(group);
m_catLocalizationTable = new CategoryLocalizationTable(m_category, m_model);
group.setSubject(new CategoryLocalizationTable(m_category, m_model)); group.setSubject(m_catLocalizationTable);
group.addAction(new AdminVisible(addLink), ActionGroup.ADD); group.addAction(new AdminVisible(addLink), ActionGroup.ADD);
m_editCategoryLocalizationForm = new CategoryLocalizationEditForm(m_category, "de");
connect(m_editCategoryLocalizationForm);
connect(m_catLocalizationTable, 0, m_editCategoryLocalizationForm);
} }
} }
private class SubcategorySection extends Section { private class SubcategorySection extends Section {
SubcategorySection(final ActionLink addLink) { SubcategorySection(final ActionLink addLink) {
setHeading(new Label(gz("cms.ui.category.subcategories"))); setHeading(new Label(gz("cms.ui.category.subcategories")));
@ -358,6 +364,7 @@ class CategoryItemPane extends BaseItemPane {
} }
private class LinkedCategorySection extends Section { private class LinkedCategorySection extends Section {
LinkedCategorySection(final ActionLink linkAddLink) { LinkedCategorySection(final ActionLink linkAddLink) {
setHeading(new Label(gz("cms.ui.category.linked"))); setHeading(new Label(gz("cms.ui.category.linked")));
@ -375,6 +382,7 @@ class CategoryItemPane extends BaseItemPane {
} }
private class CategoryTemplateSection extends Section { private class CategoryTemplateSection extends Section {
CategoryTemplateSection() { CategoryTemplateSection() {
setHeading(new Label(gz("cms.ui.category.templates"))); setHeading(new Label(gz("cms.ui.category.templates")));
@ -388,6 +396,7 @@ class CategoryItemPane extends BaseItemPane {
} }
private class PermissionsSection extends Section { private class PermissionsSection extends Section {
@Override @Override
public boolean isVisible(PageState ps) { public boolean isVisible(PageState ps) {
Category cat = m_category.getCategory(ps); Category cat = m_category.getCategory(ps);
@ -400,7 +409,7 @@ class CategoryItemPane extends BaseItemPane {
final ActionGroup group = new ActionGroup(); final ActionGroup group = new ActionGroup();
setBody(group); setBody(group);
PrivilegeDescriptor[] privs = new PrivilegeDescriptor[] { PrivilegeDescriptor[] privs = new PrivilegeDescriptor[]{
PrivilegeDescriptor.EDIT, PrivilegeDescriptor.EDIT,
Category.MAP_DESCRIPTOR, Category.MAP_DESCRIPTOR,
PrivilegeDescriptor.DELETE, PrivilegeDescriptor.DELETE,
@ -413,8 +422,7 @@ class CategoryItemPane extends BaseItemPane {
privMap.put(Category.MAP_DESCRIPTOR.getName(), "Categorize Items"); privMap.put(Category.MAP_DESCRIPTOR.getName(), "Categorize Items");
privMap.put("admin", "Admin"); privMap.put("admin", "Admin");
final CMSPermissionsPane permPane = new CMSPermissionsPane final CMSPermissionsPane permPane = new CMSPermissionsPane(privs, privMap, new ACSObjectSelectionModel(m_model)) {
(privs, privMap, new ACSObjectSelectionModel(m_model)) {
@Override @Override
public void showAdmin(PageState ps) { public void showAdmin(PageState ps) {
Assert.exists(m_model.getSelectedKey(ps)); Assert.exists(m_model.getSelectedKey(ps));
@ -510,15 +518,15 @@ class CategoryItemPane extends BaseItemPane {
add(new Submit("Done")); add(new Submit("Done"));
} }
} }
/* /*
* This private class creates a link to the index item for a category. * This private class creates a link to the index item for a category.
*/ */
private class ViewItemLink extends Link { private class ViewItemLink extends Link {
ViewItemLink(Component c, String s) { ViewItemLink(Component c, String s) {
super(c,s); super(c, s);
} }
// Build the preview link. This uses a standard redirect link to find // Build the preview link. This uses a standard redirect link to find
@ -526,10 +534,10 @@ class CategoryItemPane extends BaseItemPane {
@Override @Override
protected String prepareURL(final PageState state, String location) { protected String prepareURL(final PageState state, String location) {
ContentItem indexItem = ((ContentBundle)(m_category.getCategory(state) ContentItem indexItem = ((ContentBundle) (m_category.getCategory(state)
.getDirectIndexObject())) .getDirectIndexObject()))
.getPrimaryInstance(); .getPrimaryInstance();
if(indexItem==null) { if (indexItem == null) {
return ""; return "";
} else { } else {
return "/redirect/?oid=" + URLEncoder.encode(indexItem.getOID().toString()); return "/redirect/?oid=" + URLEncoder.encode(indexItem.getOID().toString());
@ -543,7 +551,7 @@ class CategoryItemPane extends BaseItemPane {
return false; return false;
} }
ACSObject indexItem = m_category.getCategory(state).getDirectIndexObject(); ACSObject indexItem = m_category.getCategory(state).getDirectIndexObject();
if(indexItem==null) { if (indexItem == null) {
return false; return false;
} else { } else {
return true; return true;
@ -552,36 +560,38 @@ class CategoryItemPane extends BaseItemPane {
}; };
private class EditItemLink extends Link { private class EditItemLink extends Link {
EditItemLink(Component c, String s) { EditItemLink(Component c, String s) {
super(c,s); super(c, s);
} }
/** /**
* Build the preview link. This is based on code in the * Build the preview link. This is based on code in the
* ContentSoonExpiredPane class. The prepareURL method of the parent * ContentSoonExpiredPane class. The prepareURL method of the parent is
* is overwritten. This method is called by the printwriter * overwritten. This method is called by the printwriter
*/ */
@Override @Override
protected String prepareURL(final PageState state, String location) { protected String prepareURL(final PageState state, String location) {
boolean canEdit = false; boolean canEdit = false;
ContentItem indexItem = ((ContentBundle)(m_category.getCategory(state) ContentItem indexItem = ((ContentBundle) (m_category.getCategory(state)
.getDirectIndexObject())) .getDirectIndexObject()))
.getPrimaryInstance(); .getPrimaryInstance();
if(indexItem==null) { if (indexItem == null) {
return ""; return "";
} }
if (!isItemEditable(indexItem,state)) { if (!isItemEditable(indexItem, state)) {
return ""; return "";
} else { } else {
BigDecimal draftID = indexItem.getDraftVersion().getID(); BigDecimal draftID = indexItem.getDraftVersion().getID();
return "item.jsp?item_id=" + draftID + "&set_tab=" + return "item.jsp?item_id=" + draftID + "&set_tab="
ContentItemPage.AUTHORING_TAB; + ContentItemPage.AUTHORING_TAB;
} }
} }
/** /**
* We only show this link when an index item exists for this category * We only show this link when an index item exists for this category
* and the user is allowed to edit this item. * and the user is allowed to edit this item.
*
* @param state * @param state
* @return * @return
*/ */
@ -591,16 +601,16 @@ class CategoryItemPane extends BaseItemPane {
return false; return false;
} }
ACSObject indexItem = m_category.getCategory(state).getDirectIndexObject(); ACSObject indexItem = m_category.getCategory(state).getDirectIndexObject();
if(indexItem==null) { if (indexItem == null) {
return false; return false;
} else { } else {
return isItemEditable((ContentItem)indexItem,state); return isItemEditable((ContentItem) indexItem, state);
} }
} }
/** /**
* This method checks whether a usern is allowed to edit a * This method checks whether a usern is allowed to edit a particular
* particular item. * item.
* *
* @param item * @param item
* @param state * @param state
@ -614,9 +624,9 @@ class CategoryItemPane extends BaseItemPane {
Iterator permissions = PermissionService.getImpliedPrivileges( Iterator permissions = PermissionService.getImpliedPrivileges(
ci.getOID(), user.getOID()); ci.getOID(), user.getOID());
while (permissions.hasNext()) { while (permissions.hasNext()) {
PrivilegeDescriptor permission = (PrivilegeDescriptor)permissions.next(); PrivilegeDescriptor permission = (PrivilegeDescriptor) permissions.next();
if (permission.equals(PrivilegeDescriptor.ADMIN) || if (permission.equals(PrivilegeDescriptor.ADMIN)
permission.equals(PrivilegeDescriptor.EDIT)) { || permission.equals(PrivilegeDescriptor.EDIT)) {
return true; return true;
} }
} }

View File

@ -27,6 +27,7 @@ import com.arsdigita.bebop.SingleSelectionModel;
import com.arsdigita.bebop.Table; import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.event.TableActionEvent; import com.arsdigita.bebop.event.TableActionEvent;
import com.arsdigita.bebop.event.TableActionListener; import com.arsdigita.bebop.event.TableActionListener;
import com.arsdigita.bebop.table.DefaultTableCellRenderer;
import com.arsdigita.bebop.table.TableCellRenderer; import com.arsdigita.bebop.table.TableCellRenderer;
import com.arsdigita.bebop.table.TableColumn; import com.arsdigita.bebop.table.TableColumn;
import com.arsdigita.bebop.table.TableColumnModel; import com.arsdigita.bebop.table.TableColumnModel;
@ -49,8 +50,8 @@ import java.util.Locale;
/** /**
* Lists all existing localizations for a selected category. * Lists all existing localizations for a selected category.
* *
* This class is part of the admin GUI of CCM and extends the standard form * This class is part of the admin GUI of CCM and extends the standard form in
* in order to present forms for managing the multi-language categories. * order to present forms for managing the multi-language categories.
* *
* @author Sören Bernstein (quasimodo) quasi@zes.uni-bremen.de * @author Sören Bernstein (quasimodo) quasi@zes.uni-bremen.de
*/ */
@ -75,7 +76,7 @@ public class CategoryLocalizationTable extends Table implements TableActionListe
// if table is empty: // if table is empty:
setEmptyView(new Label(GlobalizationUtil.globalize( setEmptyView(new Label(GlobalizationUtil.globalize(
"cms.ui.category.localization_none"))); "cms.ui.category.localization_none")));
TableColumnModel tab_model = getColumnModel(); TableColumnModel tab_model = getColumnModel();
// define columns // define columns
// XXX globalize // XXX globalize
@ -158,6 +159,7 @@ public class CategoryLocalizationTable extends Table implements TableActionListe
/** /**
* Return the * Return the
*
* @see com.arsdigita.bebop.table.TableModel#getElementAt(int) * @see com.arsdigita.bebop.table.TableModel#getElementAt(int)
*/ */
public Object getElementAt(int columnIndex) { public Object getElementAt(int columnIndex) {
@ -197,19 +199,19 @@ public class CategoryLocalizationTable extends Table implements TableActionListe
boolean isSelected, Object key, boolean isSelected, Object key,
int row, int column) { int row, int column) {
//
// if (canEdit) { // if (canEdit) {
// CategoryLocalization cl; // CategoryLocalization cl;
//
// try { // try {
// cl = new CategoryLocalization((BigDecimal) key); // cl = new CategoryLocalization((BigDecimal) key);
// } catch (DataObjectNotFoundException ex) { // } catch (DataObjectNotFoundException ex) {
// return new Label(value.toString()); // return new Label(value.toString());
// } // }
//
// ContentSection section = CMS.getContext().getContentSection(); // ContentSection section = CMS.getContext().getContentSection();
// ItemResolver resolver = section.getItemResolver(); // ItemResolver resolver = section.getItemResolver();
//
// return new Link(value.toString(), resolver.generateItemURL(state, cl, section, cl.getVersion())); // return new Link(value.toString(), resolver.generateItemURL(state, cl, section, cl.getVersion()));
ControlLink link = new ControlLink(value.toString()); ControlLink link = new ControlLink(value.toString());
return link; return link;
@ -230,9 +232,9 @@ public class CategoryLocalizationTable extends Table implements TableActionListe
} }
/** /**
* Provide implementation to TableActionListener method. * Provide implementation to TableActionListener method. Code that comes
* Code that comes into picture when a link on the table is clicked. * into picture when a link on the table is clicked. Handles edit and delete
* Handles edit and delete event. * event.
*/ */
public void cellSelected(TableActionEvent evt) { public void cellSelected(TableActionEvent evt) {
@ -260,8 +262,8 @@ public class CategoryLocalizationTable extends Table implements TableActionListe
} }
/** /**
* provide Implementation to TableActionListener method. * provide Implementation to TableActionListener method. Does nothing in our
* Does nothing in our case. * case.
*/ */
public void headSelected(TableActionEvent e) { public void headSelected(TableActionEvent e) {
throw new UnsupportedOperationException("Not Implemented"); throw new UnsupportedOperationException("Not Implemented");