- Neue Version des DaBIn-Importers:

- Autoren werden jetzt in der für Publikationen vorgesehen Contentsection angelegt
  - Import der Verlage hoffentlich korrigiert
- A to Z Leiste für Folder im Content-Center. Wird derzeit immer angezeigt, Ausblenden bei unterschreiten einer bestimmten Anzahl von Items funktioniert noch 
  nicht und wahrscheinlich auch nicht ohne größere Umbauten an FolderManipulator und FolderBrowser möglich.
- Abstract bei den Publikationen wird jetzt im Propertysheet mit Zeilenumbrüchen etc. (wie im TextArea eingegeben) angezeigt.


git-svn-id: https://svn.libreccm.org/ccm/trunk@827 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2011-04-04 17:24:41 +00:00
parent 2279dd49b5
commit 401bb5670c
10 changed files with 694 additions and 482 deletions

View File

@ -1135,7 +1135,11 @@ public class DaBInImporter extends Program {
System.out.printf("%4d of %4d: %s...\n", counter, number, result. System.out.printf("%4d of %4d: %s...\n", counter, number, result.
getString("name")); getString("name"));
PublicationData data = new PublicationData(); PublicationData data = new PublicationData();
data.setType(PublicationType.ARTICLE_IN_COLLECTED_VOLUME); //All publications of the DaBIn type "Artikel/Aufsatz" are now
//imported as ArticleInJournal since ArticleInJournal and ArticleInCollectedVolume
//can't be seperated from the information in DaBIn
//data.setType(PublicationType.ARTICLE_IN_COLLECTED_VOLUME);
data.setType(PublicationType.ARTICLE_IN_JOURNAL);
data.setPublicationDaBInId(result.getString("Publikation_Id")); data.setPublicationDaBInId(result.getString("Publikation_Id"));
data.setName(result.getString("Name")); data.setName(result.getString("Name"));
data.setVerlag(result.getString("Verlag")); data.setVerlag(result.getString("Verlag"));
@ -1493,8 +1497,13 @@ public class DaBInImporter extends Program {
personDe.setTitlePre(personData.getTitlePre()); personDe.setTitlePre(personData.getTitlePre());
personDe.setDescription(String.format("DaBInId={%s}", personDe.setDescription(String.format("DaBInId={%s}",
personData.getDabinId())); personData.getDabinId()));
personDe.setContentSection(section); if (type == PersonType.AUTHOR) {
personDe.setContentSection(publicationsSection);
personDe.setLifecycle(createLifecycle(publicationsLifecycle));
} else {
personDe.setContentSection(personsSection);
personDe.setLifecycle(createLifecycle(personsLifecycle)); personDe.setLifecycle(createLifecycle(personsLifecycle));
}
personDe.save(); personDe.save();
personDe.setLanguage("de"); personDe.setLanguage("de");
@ -1503,8 +1512,13 @@ public class DaBInImporter extends Program {
personEn.setGivenName(personData.getGivenname()); personEn.setGivenName(personData.getGivenname());
personEn.setDescription(String.format("DaBInId={%s}", personEn.setDescription(String.format("DaBInId={%s}",
personData.getDabinId())); personData.getDabinId()));
personEn.setContentSection(section); if (type == PersonType.AUTHOR) {
personEn.setContentSection(publicationsSection);
personEn.setLifecycle(createLifecycle(publicationsLifecycle));
} else {
personEn.setContentSection(personsSection);
personEn.setLifecycle(createLifecycle(personsLifecycle)); personEn.setLifecycle(createLifecycle(personsLifecycle));
}
personEn.save(); personEn.save();
personEn.setLanguage("en"); personEn.setLanguage("en");
@ -1520,7 +1534,7 @@ public class DaBInImporter extends Program {
personEn.setContentSection(section); personEn.setContentSection(section);
Folder folder = null; Folder folder = null;
switch(type) { switch (type) {
case MEMBER: case MEMBER:
folder = members; folder = members;
break; break;
@ -2856,9 +2870,19 @@ public class DaBInImporter extends Program {
System.out.printf("\tde: %s, %s...", publisherData.getName(), publisherData. System.out.printf("\tde: %s, %s...", publisherData.getName(), publisherData.
getPlace()); getPlace());
publisherDe = new Publisher(); publisherDe = new Publisher();
if ((publisherData.getPlace() == null) || publisherData.getPlace().
isEmpty()) {
publisherDe.setTitle(publisherData.getName()); publisherDe.setTitle(publisherData.getName());
publisherDe.setName(DaBInImporter.normalizeString(publisherData. publisherDe.setName(DaBInImporter.normalizeString(publisherData.
getName())); getName()));
} else {
publisherDe.setTitle(String.format("%s, %s", publisherData.
getName(), publisherData.getPlace()));
publisherDe.setName(DaBInImporter.normalizeString(String.
format(
"%s, %s", publisherData.getName(), publisherData.
getPlace())));
}
publisherDe.setPlace(publisherData.getPlace()); publisherDe.setPlace(publisherData.getPlace());
publisherDe.setLanguage("de"); publisherDe.setLanguage("de");
publisherDe.setLifecycle(createLifecycle(publicationsLifecycle)); publisherDe.setLifecycle(createLifecycle(publicationsLifecycle));
@ -2869,9 +2893,19 @@ public class DaBInImporter extends Program {
System.out.printf("\tEn: %s, %s...", publisherData.getName(), publisherData. System.out.printf("\tEn: %s, %s...", publisherData.getName(), publisherData.
getPlace()); getPlace());
publisherEn = new Publisher(); publisherEn = new Publisher();
if ((publisherData.getPlace() == null) || publisherData.getPlace().
isEmpty()) {
publisherEn.setTitle(publisherData.getName()); publisherEn.setTitle(publisherData.getName());
publisherEn.setName(DaBInImporter.normalizeString(publisherData. publisherEn.setName(DaBInImporter.normalizeString(publisherData.
getName())); getName()));
} else {
publisherEn.setTitle(String.format("%s, %s", publisherData.
getName(), publisherData.getPlace()));
publisherEn.setName(DaBInImporter.normalizeString(String.
format(
"%s, %s", publisherData.getName(), publisherData.
getPlace())));
}
publisherEn.setPlace(publisherData.getPlace()); publisherEn.setPlace(publisherData.getPlace());
publisherEn.setLanguage("en"); publisherEn.setLanguage("en");
publisherEn.setLifecycle(createLifecycle(publicationsLifecycle)); publisherEn.setLifecycle(createLifecycle(publicationsLifecycle));
@ -2889,6 +2923,9 @@ public class DaBInImporter extends Program {
publisherEn.setContentSection(publicationsSection); publisherEn.setContentSection(publicationsSection);
publishers.addItem(publisher); publishers.addItem(publisher);
System.out.printf(
"Putting publisher into publishers map. HashCode: %d",
publisherData.hashCode());
publishersMap.put(publisherData, publisher); publishersMap.put(publisherData, publisher);
System.out.println("OK"); System.out.println("OK");
} }
@ -2975,7 +3012,12 @@ public class DaBInImporter extends Program {
int colonIndex = normalizedData.indexOf(':'); int colonIndex = normalizedData.indexOf(':');
if (colonIndex < 0) { if (colonIndex < 0) {
publisher.setName(normalizedData);/*.replace(",", ""). while ((normalizedData.length() > 1)
&& !Character.isLetter(normalizedData.charAt(0))) {
normalizedData = normalizedData.substring(1);
}
publisher.setName(normalizedData.trim());/*.replace(",", "").
replace("/", ""). replace("/", "").
replaceAll("\\s\\s+", " "). replaceAll("\\s\\s+", " ").
replace(' ', '-').toLowerCase());*/ replace(' ', '-').toLowerCase());*/
@ -3015,11 +3057,19 @@ public class DaBInImporter extends Program {
System.out.printf("\tprevDelimIndex = %d\n", prevDelimIndex); System.out.printf("\tprevDelimIndex = %d\n", prevDelimIndex);
place = normalizedData.substring(prevDelimIndex, colonIndex); place = normalizedData.substring(prevDelimIndex, colonIndex);
publisher.setName(name.trim(). while ((name.length() > 1)
replace(",", ""). && !Character.isLetter(name.charAt(0))) {
replace("/", ""). name = name.substring(1);
replaceAll("\\s\\s+", " "). }
replace(' ', '-').toLowerCase()); publisher.setName(name.trim());//.
//replace(",", "").
//replace("/", "").
//replaceAll("\\s\\s+", " ").
//replace(' ', '-').toLowerCase());
while ((place.length() > 1)
&& !Character.isLetter(place.charAt(0))) {
place = place.substring(1);
}
publisher.setPlace(place.trim()); publisher.setPlace(place.trim());
} }
@ -3191,7 +3241,7 @@ public class DaBInImporter extends Program {
"Ä", "Ae").replace("Ü", "Ue").replace("Ö", "Oe").replace("ß", "Ä", "Ae").replace("Ü", "Ue").replace("Ö", "Oe").replace("ß",
"ss"). "ss").
replace(" ", "-"). replace(" ", "-").
replaceAll("[^a-zA-Z0-9\\-]", "").toLowerCase(); replaceAll("[^a-zA-Z0-9\\-]", "").toLowerCase().trim();
} }
public static void main(String[] args) { public static void main(String[] args) {

View File

@ -67,3 +67,4 @@ cms.ui.folder.item_already_exists=There is already an item in the target folder
cms.ui.folder.item_is_live= is live; you must unpublish it before moving it. cms.ui.folder.item_is_live= is live; you must unpublish it before moving it.
cms.ui.folder.no_permission_for_item=You do not have permission to delete or move cms.ui.folder.no_permission_for_item=You do not have permission to delete or move
cms.ui.folder.no_such_item=Item ID supplied does not match an existing Content Item. cms.ui.folder.no_such_item=Item ID supplied does not match an existing Content Item.
cms.ui.folder.filter.all=All

View File

@ -2,7 +2,7 @@ COMMENT.00=BUTTONS/LINKS/LABELS
cms.ui.folder.save=Speichern cms.ui.folder.save=Speichern
cms.ui.folder.cancel=Abbrechen cms.ui.folder.cancel=Abbrechen
cms.ui.folder.edit=Editieren cms.ui.folder.edit=Editieren
cms.ui.folder.delete=L\u00F6schen cms.ui.folder.delete=L\u00f6schen
cms.ui.folder.move=Verschieben cms.ui.folder.move=Verschieben
cms.ui.folder.copy=Kopieren cms.ui.folder.copy=Kopieren
cms.ui.folder.go=Los cms.ui.folder.go=Los
@ -16,22 +16,22 @@ cms.ui.folder.unlock=Entsperren
cms.ui.folder.external_lock=Externe Sperrung cms.ui.folder.external_lock=Externe Sperrung
cms.ui.folder.left=Links cms.ui.folder.left=Links
cms.ui.folder.right=Rechts cms.ui.folder.right=Rechts
cms.ui.folder.items=Eintrag/Eintr\u00E4ge cms.ui.folder.items=Eintrag/Eintr\u00e4ge
cms.ui.folder.from=von cms.ui.folder.from=von
cms.ui.folder.to=an cms.ui.folder.to=an
cms.ui.folder.no_items=Keine Eintr\u00E4ge cms.ui.folder.no_items=Keine Eintr\u00e4ge
cms.ui.folder.no_image=Kein Bild cms.ui.folder.no_image=Kein Bild
cms.ui.folder.hide_metadata=Metadaten verbergen cms.ui.folder.hide_metadata=Metadaten verbergen
cms.ui.folder.show_metadata=Zeige die Metadaten cms.ui.folder.show_metadata=Zeige die Metadaten
cms.ui.folder.edit_subject_classes=Themenklassen editieren cms.ui.folder.edit_subject_classes=Themenklassen editieren
cms.ui.folder.add_paragraph=Abschnitt hinzuf\u00FCgen cms.ui.folder.add_paragraph=Abschnitt hinzuf\u00fcgen
cms.ui.folder.edit_in_applet=In EoPro editieren cms.ui.folder.edit_in_applet=In EoPro editieren
cms.ui.folder.edit_in_browser=Im Browser editieren cms.ui.folder.edit_in_browser=Im Browser editieren
cms.ui.folder.edit_current_folder=Bearbeiten des aktuellen Verzeichnisses cms.ui.folder.edit_current_folder=Bearbeiten des aktuellen Verzeichnisses
cms.ui.folder.preview_current_folder=Vorschau des aktuellen Verzeichnisses cms.ui.folder.preview_current_folder=Vorschau des aktuellen Verzeichnisses
cms.ui.folder.contents_for=Inhalt für cms.ui.folder.contents_for=Inhalt f\u00fcr
cms.ui.folder.choose_target_folder=Zielverzeichnis auswählen cms.ui.folder.choose_target_folder=Zielverzeichnis ausw\u00e4hlen
cms.ui.foldr.new_wcms_doc=Neue WCMS Documente cms.ui.foldr.new_wcms_doc=Neue WCMS Documente
COMMENT.05=INPUTS COMMENT.05=INPUTS
@ -40,26 +40,27 @@ cms.ui.folder.right=Rechts
COMMENT.10=FOLDER METADATA COMMENT.10=FOLDER METADATA
cms.ui.folder.headline=Titelzeile cms.ui.folder.headline=Titelzeile
cms.ui.folder.heading=\u00DCberschrift cms.ui.folder.heading=\u00dcberschrift
cms.ui.folder.body=Hauptbereich cms.ui.folder.body=Hauptbereich
cms.ui.folder.add_image=Bild hinzuf\u00FCgen cms.ui.folder.add_image=Bild hinzuf\u00fcgen
cms.ui.folder.replace_image=Ersetze dieses Bild cms.ui.folder.replace_image=Ersetze dieses Bild
cms.ui.folder.align=Ausrichten cms.ui.folder.align=Ausrichten
cms.ui.folder.add_download=Download hinzuf\u00FCgen cms.ui.folder.add_download=Download hinzuf\u00fcgen
cms.ui.folder.alt=Alt cms.ui.folder.alt=Alt
cms.ui.folder.caption=\u00DCberschrift cms.ui.folder.caption=\u00dcberschrift
COMMENT.20=ERROR MESSAGES COMMENT.20=ERROR MESSAGES
cms.ui.folder.column_index_not_in_table_model=Spaltenindex befindet sich nicht im Datenbankmodell: cms.ui.folder.column_index_not_in_table_model=Spaltenindex befindet sich nicht im Datenbankmodell:
cms.ui.folder.cannot_find_root_folder=Oberster Ordner kann nicht gefunden werden. cms.ui.folder.cannot_find_root_folder=Oberster Ordner kann nicht gefunden werden.
cms.ui.folder.must_select_item=Es mu\u00DF mindestens ein Eintrag zum Verschieben/Kopieren ausgew\u00E4hlt werden cms.ui.folder.must_select_item=Es mu\u00df mindestens ein Eintrag zum Verschieben/Kopieren ausgew\u00e4hlt werden
cms.ui.folder.no_source_items_specified=Es wurden keine Ursprungseintr\u00E4ge gew\u00E4hlt cms.ui.folder.no_source_items_specified=Es wurden keine Ursprungseintr\u00e4ge gew\u00e4hlt
cms.ui.folder.need_select_target_folder=Es mu\u00DF ein Ordner ausgew\u00E4hlt werden, in den die Eintr\u00E4ge verschoben oder kopiert werden sollen. cms.ui.folder.need_select_target_folder=Es mu\u00df ein Ordner ausgew\u00e4hlt werden, in den die Eintr\u00e4ge verschoben oder kopiert werden sollen.
cms.ui.folder.not_within_same_folder=Kopieren/Verschieben im gleichen Ordner nicht m\u00F6glich cms.ui.folder.not_within_same_folder=Kopieren/Verschieben im gleichen Ordner nicht m\u00f6glich
cms.ui.folder.no_permission=Sie haben nicht die Berechtigung Eintr\u00E4ge zu erzeugen, zu kopieren oder zu verschieben. cms.ui.folder.no_permission=Sie haben nicht die Berechtigung Eintr\u00e4ge zu erzeugen, zu kopieren oder zu verschieben.
cms.ui.folder.item_already_exists=Es gibt schon einen Eintrag im Zielordner mit Namen: cms.ui.folder.item_already_exists=Es gibt schon einen Eintrag im Zielordner mit Namen:
cms.ui.folder.item_is_live=ist ver\u00F6ffentlicht. Sie m\u00FCssen ihn zum Verschieben zur\u00FCckholen cms.ui.folder.item_is_live=ist ver\u00f6ffentlicht. Sie m\u00fcssen ihn zum Verschieben zur\u00fcckholen
cms.ui.folder.no_permission_for_item=Sie haben nicht die Berechtigung zum L\u00F6schen oder Verschieben. cms.ui.folder.no_permission_for_item=Sie haben nicht die Berechtigung zum L\u00f6schen oder Verschieben.
cms.ui.folder.no_such_item=Die verwendete Eintrags-ID pa\u00DFt zu keinem Eintrag. cms.ui.folder.no_such_item=Die verwendete Eintrags-ID pa\u00dft zu keinem Eintrag.
cms.ui.folder.remove_asset_link=Entfernen cms.ui.folder.remove_asset_link=Entfernen
cms.ui.folder.filter.all=Alle

View File

@ -3,7 +3,7 @@ cms.ui.folder.save=Sauver
cms.ui.folder.cancel=Annuler cms.ui.folder.cancel=Annuler
cms.ui.folder.edit=Modifier cms.ui.folder.edit=Modifier
cms.ui.folder.delete=Effacer cms.ui.folder.delete=Effacer
cms.ui.folder.move=Déplacer cms.ui.folder.move=D\u00e9placer
cms.ui.folder.copy=Copier cms.ui.folder.copy=Copier
cms.ui.folder.go=Go cms.ui.folder.go=Go
cms.ui.folder.name=Nom cms.ui.folder.name=Nom
@ -11,26 +11,26 @@ cms.ui.folder.type=Type
cms.ui.folder.action=Action cms.ui.folder.action=Action
cms.ui.folder.title=Titre cms.ui.folder.title=Titre
cms.ui.folder.index=Index cms.ui.folder.index=Index
cms.ui.folder.preview=Pré-visualisation cms.ui.folder.preview=Pr\u00e9-visualisation
cms.ui.folder.lock=Verrouiller cms.ui.folder.lock=Verrouiller
cms.ui.folder.unlock=Dé-vérrouiller cms.ui.folder.unlock=D\u00e9-v\u00e9rrouiller
cms.ui.folder.external_lock=Verrou externe cms.ui.folder.external_lock=Verrou externe
cms.ui.folder.left=Gauche cms.ui.folder.left=Gauche
cms.ui.folder.right=Droite cms.ui.folder.right=Droite
cms.ui.folder.items=élément(s) cms.ui.folder.items=\u00e9l\u00e9ment(s)
cms.ui.folder.from=de cms.ui.folder.from=de
cms.ui.folder.to=à cms.ui.folder.to=\u00e0
cms.ui.folder.no_items=Pas d'éléments cms.ui.folder.no_items=Pas d'\u00e9l\u00e9ments
cms.ui.folder.no_image=Pas d'image cms.ui.folder.no_image=Pas d'image
cms.ui.folder.hide_metadata=Cacher les méta-données cms.ui.folder.hide_metadata=Cacher les m\u00e9ta-donn\u00e9es
cms.ui.folder.show_metadata=Montrer les méta-données cms.ui.folder.show_metadata=Montrer les m\u00e9ta-donn\u00e9es
cms.ui.folder.edit_subject_classes=Modifier les classes objet cms.ui.folder.edit_subject_classes=Modifier les classes objet
cms.ui.folder.add_paragraph=Ajouter un paragraphe cms.ui.folder.add_paragraph=Ajouter un paragraphe
cms.ui.folder.edit_in_applet=Modifier dans EoPro cms.ui.folder.edit_in_applet=Modifier dans EoPro
cms.ui.folder.edit_in_browser=Modifier dans un navigateur cms.ui.folder.edit_in_browser=Modifier dans un navigateur
cms.ui.folder.edit_current_folder=Modifier le dossier courant cms.ui.folder.edit_current_folder=Modifier le dossier courant
cms.ui.folder.preview_current_folder=Pré-visualiser le dossier courant cms.ui.folder.preview_current_folder=Pr\u00e9-visualiser le dossier courant
cms.ui.folder.contents_for=Contenu&nbsp;de&nbsp; cms.ui.folder.contents_for=Contenu&nbsp;de&nbsp;
cms.ui.folder.choose_target_folder=Choisir le dossier de destination cms.ui.folder.choose_target_folder=Choisir le dossier de destination
cms.ui.foldr.new_wcms_doc=Nouveau document WCMS cms.ui.foldr.new_wcms_doc=Nouveau document WCMS
@ -41,26 +41,27 @@ cms.ui.folder.right=Droite
COMMENT.10=DOSSIER DES META DONNEES COMMENT.10=DOSSIER DES META DONNEES
cms.ui.folder.headline=Entête cms.ui.folder.headline=Ent\u00eate
cms.ui.folder.heading=Chapeau cms.ui.folder.heading=Chapeau
cms.ui.folder.body=Corps cms.ui.folder.body=Corps
cms.ui.folder.add_image=Ajouter une image cms.ui.folder.add_image=Ajouter une image
cms.ui.folder.replace_image=Remplacer cette image cms.ui.folder.replace_image=Remplacer cette image
cms.ui.folder.align=Aligner cms.ui.folder.align=Aligner
cms.ui.folder.add_download=Ajouter un téléchargement cms.ui.folder.add_download=Ajouter un t\u00e9l\u00e9chargement
cms.ui.folder.alt=Alt cms.ui.folder.alt=Alt
cms.ui.folder.caption=Légende cms.ui.folder.caption=L\u00e9gende
cms.ui.folder.remove_asset_link=Retirer cms.ui.folder.remove_asset_link=Retirer
COMMENT.20=MESSAGES D'ERREURS COMMENT.20=MESSAGES D'ERREURS
cms.ui.folder.column_index_not_in_table_model=Index de la colonne absent du modèle de table: cms.ui.folder.column_index_not_in_table_model=Index de la colonne absent du mod\u00e8le de table:
cms.ui.folder.cannot_find_root_folder=Impossible de trouver le dossier racine. cms.ui.folder.cannot_find_root_folder=Impossible de trouver le dossier racine.
cms.ui.folder.must_select_item=Vous devez sélectionner au moins élément pour le déplacer ou le copier cms.ui.folder.must_select_item=Vous devez s\u00e9lectionner au moins \u00e9l\u00e9ment pour le d\u00e9placer ou le copier
cms.ui.folder.no_source_items_specified=Pas d'élément source spécifié. cms.ui.folder.no_source_items_specified=Pas d'\u00e9l\u00e9ment source sp\u00e9cifi\u00e9.
cms.ui.folder.need_select_target_folder=Vous devez sélectionner un dossier dans lequel les éléments seront déplacés ou copiés. cms.ui.folder.need_select_target_folder=Vous devez s\u00e9lectionner un dossier dans lequel les \u00e9l\u00e9ments seront d\u00e9plac\u00e9s ou copi\u00e9s.
cms.ui.folder.not_within_same_folder=Impossible de déplacer ou de copier des éléments à l'intérieur d'un même dossier. cms.ui.folder.not_within_same_folder=Impossible de d\u00e9placer ou de copier des \u00e9l\u00e9ments \u00e0 l'int\u00e9rieur d'un m\u00eame dossier.
cms.ui.folder.no_permission=Vous n'avez pas l'autorisation de créer, de copier, ou de déplacer des éléments. cms.ui.folder.no_permission=Vous n'avez pas l'autorisation de cr\u00e9er, de copier, ou de d\u00e9placer des \u00e9l\u00e9ments.
cms.ui.folder.item_already_exists=Il y a déjà un élément dans le dossier destination appelé: cms.ui.folder.item_already_exists=Il y a d\u00e9j\u00e0 un \u00e9l\u00e9ment dans le dossier destination appel\u00e9:
cms.ui.folder.item_is_live=est en ligne ; Vous devez le dé-publier avant de le déplacer. cms.ui.folder.item_is_live=est en ligne ; Vous devez le d\u00e9-publier avant de le d\u00e9placer.
cms.ui.folder.no_permission_for_item=Vous n'avez pas l'autorisation de supprimer ou de déplacer cms.ui.folder.no_permission_for_item=Vous n'avez pas l'autorisation de supprimer ou de d\u00e9placer
cms.ui.folder.no_such_item=L'identifiant fourni pour l'élément ne correspond pas à un contenu existant. cms.ui.folder.no_such_item=L'identifiant fourni pour l'\u00e9l\u00e9ment ne correspond pas \u00e0 un contenu existant.
cms.ui.folder.filter.all=

View File

@ -81,40 +81,37 @@ import javax.servlet.ServletException;
public class FolderBrowser extends Table { public class FolderBrowser extends Table {
private static final Logger s_log = Logger.getLogger(FolderBrowser.class); private static final Logger s_log = Logger.getLogger(FolderBrowser.class);
private static GlobalizedMessage[] s_headers = { private static GlobalizedMessage[] s_headers = {
globalize("cms.ui.folder.name"), globalize("cms.ui.folder.title"), globalize("cms.ui.folder.name"), globalize("cms.ui.folder.title"),
globalize("cms.ui.folder.type"), globalize("cms.ui.folder.creation_date"), globalize("cms.ui.folder.type"),
globalize("cms.ui.folder.last_modified"), globalize("cms.ui.folder.action"), globalize("cms.ui.folder.creation_date"),
globalize("cms.ui.folder.index") }; globalize("cms.ui.folder.last_modified"), globalize(
"cms.ui.folder.action"),
globalize("cms.ui.folder.index")};
private static GlobalizedMessage[] s_noIndexHeaders = { private static GlobalizedMessage[] s_noIndexHeaders = {
globalize("cms.ui.folder.name"), globalize("cms.ui.folder.title"), globalize("cms.ui.folder.name"), globalize("cms.ui.folder.title"),
globalize("cms.ui.folder.type"), globalize("cms.ui.folder.creation_date"), globalize("cms.ui.folder.type"),
globalize("cms.ui.folder.last_modified"), globalize("cms.ui.folder.action") }; globalize("cms.ui.folder.creation_date"),
globalize("cms.ui.folder.last_modified"), globalize(
"cms.ui.folder.action")};
private static final String SORT_ACTION_UP = "sortActionUp"; private static final String SORT_ACTION_UP = "sortActionUp";
private static final String SORT_ACTION_DOWN = "sortActionDown"; private static final String SORT_ACTION_DOWN = "sortActionDown";
private FolderSelectionModel m_currentFolder; private FolderSelectionModel m_currentFolder;
private TableActionListener m_folderChanger; private TableActionListener m_folderChanger;
private TableActionListener m_deleter; private TableActionListener m_deleter;
private TableActionListener m_indexChanger; private TableActionListener m_indexChanger;
private TableColumn m_nameColumn; private TableColumn m_nameColumn;
private TableColumn m_deleteColumn; private TableColumn m_deleteColumn;
private TableColumn m_indexColumn; private TableColumn m_indexColumn;
private final static String SORT_KEY_NAME = "name"; private final static String SORT_KEY_NAME = "name";
private final static String SORT_KEY_TITLE = "title"; private final static String SORT_KEY_TITLE = "title";
private final static String SORT_KEY_LAST_MODIFIED_DATE = "lastModified"; private final static String SORT_KEY_LAST_MODIFIED_DATE = "lastModified";
private final static String SORT_KEY_CREATION_DATE = "creationDate"; private final static String SORT_KEY_CREATION_DATE = "creationDate";
private StringParameter m_sortType = new StringParameter("sortType"); private StringParameter m_sortType = new StringParameter("sortType");
private StringParameter m_sortDirection = new StringParameter("sortDirn"); private StringParameter m_sortDirection = new StringParameter("sortDirn");
private StringParameter m_filter = null;
private FolderManipulator.FilterForm m_filterForm;
private long m_folderSize;
public FolderBrowser(FolderSelectionModel currentFolder) { public FolderBrowser(FolderSelectionModel currentFolder) {
//super(new FolderTableModelBuilder(), s_headers); //super(new FolderTableModelBuilder(), s_headers);
@ -123,7 +120,9 @@ public class FolderBrowser extends Table {
m_sortDirection.setDefaultValue(SORT_ACTION_UP); m_sortDirection.setDefaultValue(SORT_ACTION_UP);
setModelBuilder(new FolderTableModelBuilder(currentFolder)); setModelBuilder(new FolderTableModelBuilder(currentFolder));
setColumnModel(new DefaultTableColumnModel(hideIndexColumn() ? s_noIndexHeaders : s_headers)); setColumnModel(new DefaultTableColumnModel(hideIndexColumn()
? s_noIndexHeaders
: s_headers));
setHeader(new TableHeader(getColumnModel())); setHeader(new TableHeader(getColumnModel()));
// DEE 1/18/02: the folder table model builder needs to know about // DEE 1/18/02: the folder table model builder needs to know about
// 'this' in order to set visibility, but 'this' isn't available // 'this' in order to set visibility, but 'this' isn't available
@ -134,7 +133,7 @@ public class FolderBrowser extends Table {
// so we break the model builder construction up into two parts, // so we break the model builder construction up into two parts,
// and pull the foldertablemodelbuilder back with the super class' // and pull the foldertablemodelbuilder back with the super class'
// accessor. // accessor.
((FolderTableModelBuilder)getModelBuilder()).setFolderBrowser(this); ((FolderTableModelBuilder) getModelBuilder()).setFolderBrowser(this);
m_currentFolder = currentFolder; m_currentFolder = currentFolder;
@ -158,14 +157,17 @@ public class FolderBrowser extends Table {
*/ */
setClassAttr("dataTable"); setClassAttr("dataTable");
getHeader().setDefaultRenderer(new com.arsdigita.cms.ui.util.DefaultTableCellRenderer()); getHeader().setDefaultRenderer(
new com.arsdigita.cms.ui.util.DefaultTableCellRenderer());
m_nameColumn = getColumn(0); m_nameColumn = getColumn(0);
m_nameColumn.setCellRenderer(new NameCellRenderer()); m_nameColumn.setCellRenderer(new NameCellRenderer());
m_nameColumn.setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_NAME)); m_nameColumn.setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_NAME));
getColumn(1).setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_TITLE)); getColumn(1).setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_TITLE));
getColumn(3).setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_CREATION_DATE)); getColumn(3).setHeaderRenderer(new HeaderCellRenderer(
getColumn(4).setHeaderRenderer(new HeaderCellRenderer(SORT_KEY_LAST_MODIFIED_DATE)); SORT_KEY_CREATION_DATE));
getColumn(4).setHeaderRenderer(new HeaderCellRenderer(
SORT_KEY_LAST_MODIFIED_DATE));
m_deleteColumn = getColumn(5); m_deleteColumn = getColumn(5);
m_deleteColumn.setCellRenderer(new ActionCellRenderer()); m_deleteColumn.setCellRenderer(new ActionCellRenderer());
m_deleteColumn.setAlign("center"); m_deleteColumn.setAlign("center");
@ -183,10 +185,9 @@ public class FolderBrowser extends Table {
m_deleter = new ItemDeleter(); m_deleter = new ItemDeleter();
addTableActionListener(m_deleter); addTableActionListener(m_deleter);
setEmptyView(new Label(globalize("cms.ui.folder.no_items"))); setEmptyView(new Label(globalize("cms.ui.folder.no_items")));
Assert.exists( m_currentFolder.getStateParameter() ); Assert.exists(m_currentFolder.getStateParameter());
} }
@Override @Override
@ -197,6 +198,7 @@ public class FolderBrowser extends Table {
p.addComponentStateParam(this, m_sortType); p.addComponentStateParam(this, m_sortType);
p.addComponentStateParam(this, m_sortDirection); p.addComponentStateParam(this, m_sortDirection);
p.addActionListener(new ActionListener() { p.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
final PageState state = e.getPageState(); final PageState state = e.getPageState();
@ -213,7 +215,8 @@ public class FolderBrowser extends Table {
Assert.exists(folder); Assert.exists(folder);
boolean canDelete = boolean canDelete =
sm.canAccess(state.getRequest(), SecurityManager.DELETE_ITEM, folder); sm.canAccess(state.getRequest(), SecurityManager.DELETE_ITEM,
folder);
m_deleteColumn.setVisible(state, canDelete); m_deleteColumn.setVisible(state, canDelete);
} }
@ -222,10 +225,10 @@ public class FolderBrowser extends Table {
public void respond(PageState state) throws ServletException { public void respond(PageState state) throws ServletException {
String key = state.getControlEventName(); String key = state.getControlEventName();
String value = state.getControlEventValue(); String value = state.getControlEventValue();
if ( SORT_ACTION_UP.equals(key) ) { if (SORT_ACTION_UP.equals(key)) {
state.setValue(m_sortType, value); state.setValue(m_sortType, value);
state.setValue(m_sortDirection, SORT_ACTION_UP); state.setValue(m_sortDirection, SORT_ACTION_UP);
} else if ( SORT_ACTION_DOWN.equals(key) ) { } else if (SORT_ACTION_DOWN.equals(key)) {
state.setValue(m_sortType, value); state.setValue(m_sortType, value);
state.setValue(m_sortDirection, SORT_ACTION_DOWN); state.setValue(m_sortDirection, SORT_ACTION_DOWN);
} else { } else {
@ -238,6 +241,18 @@ public class FolderBrowser extends Table {
return m_currentFolder; return m_currentFolder;
} }
protected void setFilterForm(FolderManipulator.FilterForm filterForm) {
m_filterForm = filterForm;
}
protected void setFilterParameter(StringParameter filter) {
m_filter = filter;
}
protected long getFolderSize() {
return m_folderSize;
}
private class FolderTableModelBuilder private class FolderTableModelBuilder
extends AbstractTableModelBuilder implements PaginationModelBuilder { extends AbstractTableModelBuilder implements PaginationModelBuilder {
@ -250,7 +265,8 @@ public class FolderBrowser extends Table {
this(sel, null); this(sel, null);
} }
public FolderTableModelBuilder(FolderSelectionModel sel, FolderBrowser fb) { public FolderTableModelBuilder(FolderSelectionModel sel,
FolderBrowser fb) {
super(); super();
m_folder = sel; m_folder = sel;
m_size = new RequestLocal(); m_size = new RequestLocal();
@ -259,14 +275,35 @@ public class FolderBrowser extends Table {
} }
public TableModel makeModel(Table t, PageState s) { public TableModel makeModel(Table t, PageState s) {
FolderSelectionModel sel = ((FolderBrowser) t).getFolderSelectionModel(); FolderSelectionModel sel = ((FolderBrowser) t).
getFolderSelectionModel();
Folder f = (Folder) sel.getSelectedObject(s); Folder f = (Folder) sel.getSelectedObject(s);
if ( f == null ) { if (f == null) {
return Table.EMPTY_MODEL; return Table.EMPTY_MODEL;
} else { } else {
t.getRowSelectionModel().clearSelection(s); t.getRowSelectionModel().clearSelection(s);
return new FolderTableModel s_log.debug(String.format("filter = '%s'", s.getValue(m_filter)));
((FolderBrowser) t, s, (Folder.ItemCollection) m_itemColl.get(s)); Folder.ItemCollection itemColl = (Folder.ItemCollection) m_itemColl.
get(s);
s_log.debug(String.format("itemColl.size = %d", itemColl.size()));
/*if (itemColl.size() < 20) {
s_log.debug("Setting filter invisible.");
m_filterForm.setVisible(s, false);
} else {
s_log.debug("Setting filter visible.");
m_filterForm.setVisible(s, true);
}*/
m_folderSize = itemColl.size();
if (s.getValue(m_filter) != null) {
itemColl.addFilter(String.format(
"lower(name) like lower('%s%%') or lower(displayName) like lower('%s%%')",
s.getValue(m_filter),
s.getValue(m_filter)));
}
return new FolderTableModel((FolderBrowser) t, s, itemColl);
//((FolderBrowser) t, s, (Folder.ItemCollection) m_itemColl.get(s));
} }
} }
@ -284,37 +321,43 @@ public class FolderBrowser extends Table {
return 0; return 0;
} }
if (state.getValue(m_filter) != null) {
itemColl.addFilter(String.format(
"lower(name) like lower('%s%%') or lower(displayName) like lower('%s%%')",
state.getValue(m_filter),
state.getValue(m_filter)));
}
PermissionService.filterQuery( PermissionService.filterQuery(
itemColl, itemColl,
"id", "id",
PrivilegeDescriptor.READ, PrivilegeDescriptor.READ,
Kernel.getContext().getParty().getOID() Kernel.getContext().getParty().getOID());
);
size = new Integer( (int) f.getPrimaryInstances().size()); //size = new Integer((int) f.getPrimaryInstances().size());
size = new Integer((int) itemColl.size());
itemColl.setRange(new Integer(paginator.getFirst(state)), itemColl.setRange(new Integer(paginator.getFirst(state)),
new Integer(paginator.getLast(state) + 1)); new Integer(paginator.getLast(state) + 1));
String sortKey = (String)state.getValue(m_sortType); String sortKey = (String) state.getValue(m_sortType);
String direction = "asc"; String direction = "asc";
if (SORT_ACTION_DOWN.equals((String)state.getValue(m_sortDirection))) { if (SORT_ACTION_DOWN.equals((String) state.getValue(
m_sortDirection))) {
direction = "desc"; direction = "desc";
} }
if ( sortKey.equals(SORT_KEY_TITLE) ) { if (sortKey.equals(SORT_KEY_TITLE)) {
itemColl.setOrder("lower(item." + itemColl.setOrder("lower(item." + ContentItem.DISPLAY_NAME
ContentItem.DISPLAY_NAME + ") " + + ") " + direction);
direction); } else if (sortKey.equals(SORT_KEY_NAME)) {
} else if ( sortKey.equals(SORT_KEY_NAME) ) { itemColl.setOrder("lower(item." + ContentItem.NAME + ") "
itemColl.setOrder("lower(item." + + direction);
ContentItem.NAME + ") " + direction); } else if (sortKey.equals(SORT_KEY_LAST_MODIFIED_DATE)) {
} else if ( sortKey.equals(SORT_KEY_LAST_MODIFIED_DATE)) { itemColl.setOrder("item.auditing.lastModifiedDate "
itemColl.setOrder("item.auditing.lastModifiedDate " + + direction);
direction); } else if (sortKey.equals(SORT_KEY_CREATION_DATE)) {
} else if ( sortKey.equals(SORT_KEY_CREATION_DATE)) { itemColl.setOrder("item.auditing.creationDate " + direction);
itemColl.setOrder("item.auditing.creationDate " +
direction);
} }
m_size.set(state, size); m_size.set(state, size);
@ -336,11 +379,10 @@ public class FolderBrowser extends Table {
* associated folder browser is unknown. * associated folder browser is unknown.
*/ */
public boolean isVisible(PageState state) { public boolean isVisible(PageState state) {
return (m_fb != null)?m_fb.isVisible(state):true; return (m_fb != null) ? m_fb.isVisible(state) : true;
} }
} }
private class HeaderCellRenderer private class HeaderCellRenderer
extends com.arsdigita.cms.ui.util.DefaultTableCellRenderer { extends com.arsdigita.cms.ui.util.DefaultTableCellRenderer {
@ -355,10 +397,11 @@ public class FolderBrowser extends Table {
Object value, Object value,
boolean isSelected, Object key, boolean isSelected, Object key,
int row, int column) { int row, int column) {
String headerName = (String)((GlobalizedMessage)value).localize(); String headerName = (String) ((GlobalizedMessage) value).localize();
String sortKey = (String)state.getValue(m_sortType); String sortKey = (String) state.getValue(m_sortType);
final boolean isCurrentKey = sortKey.equals(m_key); final boolean isCurrentKey = sortKey.equals(m_key);
final String currentSortDirection = (String)state.getValue(m_sortDirection); final String currentSortDirection = (String) state.getValue(
m_sortDirection);
String imageURLStub = null; String imageURLStub = null;
if (SORT_ACTION_UP.equals(currentSortDirection)) { if (SORT_ACTION_UP.equals(currentSortDirection)) {
@ -368,12 +411,13 @@ public class FolderBrowser extends Table {
} }
ControlLink cl = new ControlLink(headerName) { ControlLink cl = new ControlLink(headerName) {
public void setControlEvent(PageState ps) { public void setControlEvent(PageState ps) {
String sortDirectionAction = null; String sortDirectionAction = null;
// by default, everything sorts "up" unless it // by default, everything sorts "up" unless it
// is the current key and it is already pointing up // is the current key and it is already pointing up
if (SORT_ACTION_UP.equals(currentSortDirection) && if (SORT_ACTION_UP.equals(currentSortDirection)
isCurrentKey) { && isCurrentKey) {
sortDirectionAction = SORT_ACTION_DOWN; sortDirectionAction = SORT_ACTION_DOWN;
} else { } else {
sortDirectionAction = SORT_ACTION_UP; sortDirectionAction = SORT_ACTION_UP;
@ -390,7 +434,7 @@ public class FolderBrowser extends Table {
SimpleContainer container = new SimpleContainer(); SimpleContainer container = new SimpleContainer();
container.add(l); container.add(l);
if ( isCurrentKey ) { if (isCurrentKey) {
Image image = new Image("/assets/" + imageURLStub); Image image = new Image("/assets/" + imageURLStub);
image.setBorder("0"); image.setBorder("0");
container.add(image); container.add(image);
@ -405,6 +449,7 @@ public class FolderBrowser extends Table {
* to change into the folder. * to change into the folder.
*/ */
private class NameCellRenderer extends DefaultTableCellRenderer { private class NameCellRenderer extends DefaultTableCellRenderer {
public NameCellRenderer() { public NameCellRenderer() {
super(true); super(true);
} }
@ -416,7 +461,7 @@ public class FolderBrowser extends Table {
Folder.ItemCollection coll = (Folder.ItemCollection) value; Folder.ItemCollection coll = (Folder.ItemCollection) value;
String name = coll.getName(); String name = coll.getName();
if ( coll.isFolder() ) { if (coll.isFolder()) {
return super.getComponent(table, state, name, return super.getComponent(table, state, name,
isSelected, key, row, column); isSelected, key, row, column);
} else { } else {
@ -427,27 +472,30 @@ public class FolderBrowser extends Table {
return new Label(name); return new Label(name);
} else { } else {
ItemResolver resolver = section.getItemResolver(); ItemResolver resolver = section.getItemResolver();
return new Link(name, resolver.generateItemURL return new Link(name, resolver.generateItemURL(state, id,
(state, id, name, section, coll.getVersion())); name, section, coll.
getVersion()));
} }
} }
} }
} }
/** /**
* Produce delete links for items and non-empty folders. * Produce delete links for items and non-empty folders.
*/ */
private static class ActionCellRenderer implements TableCellRenderer { private static class ActionCellRenderer implements TableCellRenderer {
private static Label s_noAction; private static Label s_noAction;
private static ControlLink s_link; private static ControlLink s_link;
private static final Logger logger = Logger.getLogger(ActionCellRenderer.class); private static final Logger logger = Logger.getLogger(
ActionCellRenderer.class);
static { static {
logger.debug("Static initializer is starting..."); logger.debug("Static initializer is starting...");
s_noAction = new Label("&nbsp;", false); s_noAction = new Label("&nbsp;", false);
s_noAction.lock(); s_noAction.lock();
s_link = new ControlLink(new Label(globalize("cms.ui.folder.delete"))); s_link = new ControlLink(
new Label(globalize("cms.ui.folder.delete")));
s_link.setConfirmation("Permanently delete this item?"); // XXX G11N ? s_link.setConfirmation("Permanently delete this item?"); // XXX G11N ?
logger.debug("Static initializer finished."); logger.debug("Static initializer finished.");
} }
@ -455,7 +503,7 @@ public class FolderBrowser extends Table {
public Component getComponent(Table table, PageState state, Object value, public Component getComponent(Table table, PageState state, Object value,
boolean isSelected, Object key, boolean isSelected, Object key,
int row, int column) { int row, int column) {
if ( ((Boolean) value).booleanValue() ) { if (((Boolean) value).booleanValue()) {
return s_link; return s_link;
} else { } else {
return s_noAction; return s_noAction;
@ -465,9 +513,11 @@ public class FolderBrowser extends Table {
private final class IndexToggleRenderer implements TableCellRenderer { private final class IndexToggleRenderer implements TableCellRenderer {
public Component getComponent(Table table, PageState state, Object value, boolean isSelected, Object key, int row, int column) { public Component getComponent(Table table, PageState state, Object value,
boolean isSelected, Object key, int row,
int column) {
if ( value == null ) { if (value == null) {
return new Label(GlobalizationUtil.globalize("cms.ui.folder.na")); return new Label(GlobalizationUtil.globalize("cms.ui.folder.na"));
} }
ControlLink link = new ControlLink(""); ControlLink link = new ControlLink("");
@ -484,10 +534,11 @@ public class FolderBrowser extends Table {
// Deletes an item // Deletes an item
private class ItemDeleter extends TableActionAdapter { private class ItemDeleter extends TableActionAdapter {
public void cellSelected(TableActionEvent e) { public void cellSelected(TableActionEvent e) {
int col = e.getColumn().intValue(); int col = e.getColumn().intValue();
if ( m_deleteColumn != getColumn(col) ) { if (m_deleteColumn != getColumn(col)) {
return; return;
} }
@ -517,6 +568,7 @@ public class FolderBrowser extends Table {
* Table model around ItemCollection * Table model around ItemCollection
*/ */
private static class FolderTableModel implements TableModel { private static class FolderTableModel implements TableModel {
private static final int NAME = 0; private static final int NAME = 0;
private static final int TITLE = 1; private static final int TITLE = 1;
private static final int TYPE = 2; private static final int TYPE = 2;
@ -524,7 +576,6 @@ public class FolderBrowser extends Table {
private static final int LAST_MODIFIED = 4; private static final int LAST_MODIFIED = 4;
private static final int DELETABLE = 5; private static final int DELETABLE = 5;
private static final int IS_INDEX = 6; private static final int IS_INDEX = 6;
private PageState m_state; private PageState m_state;
private FolderBrowser m_table; private FolderBrowser m_table;
private Folder.ItemCollection m_itemColl; private Folder.ItemCollection m_itemColl;
@ -535,17 +586,17 @@ public class FolderBrowser extends Table {
//public FolderTableModel(Folder folder) { //public FolderTableModel(Folder folder) {
//m_itemColl = folder.getItems(); //m_itemColl = folder.getItems();
//} //}
public FolderTableModel(FolderBrowser table, PageState state,
public FolderTableModel Folder.ItemCollection itemColl) {
(FolderBrowser table, PageState state, Folder.ItemCollection itemColl) {
m_state = state; m_state = state;
m_table = table; m_table = table;
m_itemColl = itemColl; m_itemColl = itemColl;
m_fol = (Folder) table.getFolderSelectionModel().getSelectedObject(state); m_fol = (Folder) table.getFolderSelectionModel().getSelectedObject(
state);
if (!hideIndexColumn()) { if (!hideIndexColumn()) {
ContentBundle indexItem = m_fol.getIndexItem(); ContentBundle indexItem = m_fol.getIndexItem();
if ( indexItem == null ) { if (indexItem == null) {
m_folIndexID = null; m_folIndexID = null;
} else { } else {
m_folIndexID = indexItem.getID(); m_folIndexID = indexItem.getID();
@ -571,14 +622,15 @@ public class FolderBrowser extends Table {
return m_itemColl.getTypeLabel(); return m_itemColl.getTypeLabel();
case CREATION_DATE: { case CREATION_DATE: {
java.util.Date creationDate = m_itemColl.getCreationDate(); java.util.Date creationDate = m_itemColl.getCreationDate();
if ( creationDate == null ) { if (creationDate == null) {
return "--"; return "--";
} }
return FormatStandards.formatDate(creationDate); return FormatStandards.formatDate(creationDate);
} }
case LAST_MODIFIED: { case LAST_MODIFIED: {
java.util.Date lastModified = m_itemColl.getLastModifiedDate(); java.util.Date lastModified =
if ( lastModified == null ) { m_itemColl.getLastModifiedDate();
if (lastModified == null) {
return "--"; return "--";
} }
return FormatStandards.formatDate(lastModified); return FormatStandards.formatDate(lastModified);
@ -587,21 +639,23 @@ public class FolderBrowser extends Table {
return new Boolean(isDeletable()); return new Boolean(isDeletable());
case IS_INDEX: { case IS_INDEX: {
if (hideIndexColumn()) { if (hideIndexColumn()) {
throw new IndexOutOfBoundsException("Column index " + columnIndex + throw new IndexOutOfBoundsException(
" not in table model."); "Column index " + columnIndex
+ " not in table model.");
} }
if ( m_itemColl.isFolder() ) { if (m_itemColl.isFolder()) {
return null; return null;
} }
if ( m_folIndexID == null ) { if (m_folIndexID == null) {
return new Boolean(false); return new Boolean(false);
} }
return new Boolean(m_folIndexID return new Boolean(m_folIndexID.compareTo(m_itemColl.
.compareTo(m_itemColl.getBundleID()) == 0); getBundleID()) == 0);
} }
default: default:
throw new IndexOutOfBoundsException("Column index " + columnIndex + throw new IndexOutOfBoundsException("Column index "
" not in table model."); + columnIndex
+ " not in table model.");
} }
} }
@ -621,14 +675,14 @@ public class FolderBrowser extends Table {
if (m_itemColl.isFolder()) { if (m_itemColl.isFolder()) {
if (!m_itemColl.hasChildren()) { if (!m_itemColl.hasChildren()) {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("The item is an empty folder; it may be " + s_log.debug("The item is an empty folder; it may be "
"deleted"); + "deleted");
} }
return true; return true;
} else { } else {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("The folder is not empty; it cannot be " + s_log.debug("The folder is not empty; it cannot be "
"deleted"); + "deleted");
} }
return false; return false;
} }
@ -643,21 +697,22 @@ public class FolderBrowser extends Table {
public Object getKeyAt(int columnIndex) { public Object getKeyAt(int columnIndex) {
// Mark folders by using their negative ID (dirty, dirty) // Mark folders by using their negative ID (dirty, dirty)
return ( m_itemColl.isFolder() ) ? m_itemColl.getID().negate() return (m_itemColl.isFolder()) ? m_itemColl.getID().negate()
: m_itemColl.getBundleID(); : m_itemColl.getBundleID();
} }
} }
private class FolderChanger extends TableActionAdapter { private class FolderChanger extends TableActionAdapter {
public void cellSelected(TableActionEvent e) { public void cellSelected(TableActionEvent e) {
PageState s = e.getPageState(); PageState s = e.getPageState();
int col = e.getColumn().intValue(); int col = e.getColumn().intValue();
if ( m_nameColumn != getColumn(col) ) { if (m_nameColumn != getColumn(col)) {
return; return;
} }
String key = (String) e.getRowKey(); String key = (String) e.getRowKey();
if ( key.startsWith("-") ) { // XXX dirty dirty if (key.startsWith("-")) { // XXX dirty dirty
clearSelection(s); clearSelection(s);
getFolderSelectionModel().setSelectedKey(s, key.substring(1)); getFolderSelectionModel().setSelectedKey(s, key.substring(1));
} }
@ -676,8 +731,8 @@ public class FolderBrowser extends Table {
public void cellSelected(TableActionEvent e) { public void cellSelected(TableActionEvent e) {
PageState state = e.getPageState(); PageState state = e.getPageState();
BigDecimal rowkey = new BigDecimal((String)e.getRowKey()); BigDecimal rowkey = new BigDecimal((String) e.getRowKey());
if (rowkey == null){ if (rowkey == null) {
return; return;
} }
@ -686,8 +741,11 @@ public class FolderBrowser extends Table {
Folder folder = (Folder) m_fol.getSelectedObject(state); Folder folder = (Folder) m_fol.getSelectedObject(state);
ContentBundle currentIndexItem = (ContentBundle) folder.getIndexItem(); ContentBundle currentIndexItem = (ContentBundle) folder.
if ( currentIndexItem == null || (currentIndexItem.getID().compareTo(contentItem.getID()) != 0)) { getIndexItem();
if (currentIndexItem == null || (currentIndexItem.getID().
compareTo(contentItem.getID())
!= 0)) {
folder.setIndexItem(contentItem); folder.setIndexItem(contentItem);
} else { } else {
folder.removeIndexItem(); folder.removeIndexItem();

View File

@ -70,7 +70,7 @@ import java.util.Map;
/** /**
* Encapsulates a {@link FolderManipulator} in order to create a flat * Encapsulates a {@link FolderManipulator} in order to create a flat
* item listing. Also contains a new item form. * item listing. Also contains a new item form.
2 * *
* @author <a href="mailto:sfreidin@arsdigita.com">Stanislav Freidin</a> * @author <a href="mailto:sfreidin@arsdigita.com">Stanislav Freidin</a>
* @version $Revision: #6 $ $DateTime: 2004/08/17 23:15:09 $ * @version $Revision: #6 $ $DateTime: 2004/08/17 23:15:09 $
* @version Id: FolderItemPane.java 287 2005-02-22 00:29:02Z sskracic $ * @version Id: FolderItemPane.java 287 2005-02-22 00:29:02Z sskracic $

View File

@ -18,6 +18,7 @@
*/ */
package com.arsdigita.cms.ui.folder; package com.arsdigita.cms.ui.folder;
import com.arsdigita.bebop.ActionLink;
import com.arsdigita.bebop.BoxPanel; import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.Component; import com.arsdigita.bebop.Component;
import com.arsdigita.bebop.Container; import com.arsdigita.bebop.Container;
@ -37,6 +38,9 @@ import com.arsdigita.bebop.SaveCancelSection;
import com.arsdigita.bebop.SimpleContainer; import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.Table; import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.Tree; import com.arsdigita.bebop.Tree;
import com.arsdigita.bebop.event.ActionEvent;
import com.arsdigita.bebop.event.ActionListener;
import com.arsdigita.bebop.event.FormInitListener;
import com.arsdigita.bebop.event.FormProcessListener; import com.arsdigita.bebop.event.FormProcessListener;
import com.arsdigita.bebop.event.FormSectionEvent; import com.arsdigita.bebop.event.FormSectionEvent;
import com.arsdigita.bebop.event.FormSubmissionListener; import com.arsdigita.bebop.event.FormSubmissionListener;
@ -49,12 +53,14 @@ import com.arsdigita.bebop.form.Option;
import com.arsdigita.bebop.form.OptionGroup; import com.arsdigita.bebop.form.OptionGroup;
import com.arsdigita.bebop.form.SingleSelect; import com.arsdigita.bebop.form.SingleSelect;
import com.arsdigita.bebop.form.Submit; import com.arsdigita.bebop.form.Submit;
import com.arsdigita.bebop.form.TextField;
import com.arsdigita.bebop.parameters.ArrayParameter; import com.arsdigita.bebop.parameters.ArrayParameter;
import com.arsdigita.bebop.parameters.BigDecimalParameter; import com.arsdigita.bebop.parameters.BigDecimalParameter;
import com.arsdigita.bebop.parameters.StringParameter; import com.arsdigita.bebop.parameters.StringParameter;
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.tree.TreeCellRenderer; import com.arsdigita.bebop.tree.TreeCellRenderer;
import com.arsdigita.cms.CMSGlobalized;
import com.arsdigita.cms.ContentBundle; import com.arsdigita.cms.ContentBundle;
import com.arsdigita.cms.ContentItem; import com.arsdigita.cms.ContentItem;
import com.arsdigita.cms.ContentSection; import com.arsdigita.cms.ContentSection;
@ -95,28 +101,29 @@ public class FolderManipulator extends SimpleContainer
private static Logger s_log = private static Logger s_log =
Logger.getLogger(FolderManipulator.class); Logger.getLogger(FolderManipulator.class);
public static final String RESOURCE_BUNDLE = public static final String RESOURCE_BUNDLE =
"com.arsdigita.cms.ui.folder.CMSFolderResources"; "com.arsdigita.cms.ui.folder.CMSFolderResources";
private static final String MOVE = "Move"; private static final String MOVE = "Move";
private static final String COPY = "Copy"; private static final String COPY = "Copy";
private static final BigDecimal[] EMPTY_ARRAY = new BigDecimal[0]; private static final BigDecimal[] EMPTY_ARRAY = new BigDecimal[0];
private ArrayParameter m_sources; private ArrayParameter m_sources;
private StringParameter m_action; private StringParameter m_action;
// The folder in which the source items live // The folder in which the source items live
private FolderSelectionModel m_srcFolderSel; private FolderSelectionModel m_srcFolderSel;
private ItemView m_itemView; private ItemView m_itemView;
private TargetSelector m_targetSelector; private TargetSelector m_targetSelector;
private FilterForm m_filterForm;
private StringParameter m_filter = new StringParameter("filter");
public FolderManipulator(FolderSelectionModel folderSel) { public FolderManipulator(FolderSelectionModel folderSel) {
m_sources = new ArrayParameter(new BigDecimalParameter("srcs")); m_sources = new ArrayParameter(new BigDecimalParameter("srcs"));
m_action = new StringParameter("act"); m_action = new StringParameter("act");
m_srcFolderSel = folderSel; m_srcFolderSel = folderSel;
s_log.debug("Adding filter form...");
m_filterForm = new FilterForm();
add(m_filterForm);
m_itemView = new ItemView(); m_itemView = new ItemView();
m_itemView.addProcessListener(this); m_itemView.addProcessListener(this);
m_itemView.addValidationListener(this); m_itemView.addValidationListener(this);
@ -133,16 +140,18 @@ public class FolderManipulator extends SimpleContainer
public void register(Page p) { public void register(Page p) {
super.register(p); super.register(p);
p.setVisibleDefault(m_targetSelector, false); p.setVisibleDefault(m_targetSelector, false);
p.setVisibleDefault(m_filterForm, true);
p.addComponentStateParam(this, m_sources); p.addComponentStateParam(this, m_sources);
p.addComponentStateParam(this, m_action); p.addComponentStateParam(this, m_action);
p.addComponentStateParam(this, m_filter);
} }
public final BigDecimal[] getSources(PageState s) { public final BigDecimal[] getSources(PageState s) {
BigDecimal[] result = (BigDecimal[]) s.getValue(m_sources); BigDecimal[] result = (BigDecimal[]) s.getValue(m_sources);
return (result==null) ? EMPTY_ARRAY : result; return (result == null) ? EMPTY_ARRAY : result;
} }
public final FolderSelectionModel getSrcFolderSel () { public final FolderSelectionModel getSrcFolderSel() {
return m_srcFolderSel; return m_srcFolderSel;
} }
@ -163,32 +172,31 @@ public class FolderManipulator extends SimpleContainer
} }
protected void moveItems(Folder target, BigDecimal[] items) { protected void moveItems(Folder target, BigDecimal[] items) {
s_log.debug ("moving to folder: " + target + " items: " + items); s_log.debug("moving to folder: " + target + " items: " + items);
for (int i=0; i<items.length; i++ ) { for (int i = 0; i < items.length; i++) {
try { try {
ContentItem item = new ContentItem(items[i]); ContentItem item = new ContentItem(items[i]);
item.setParent(target); item.setParent(target);
item.save(); item.save();
} catch(DataObjectNotFoundException e) { } catch (DataObjectNotFoundException e) {
s_log.warn ("object not found in content move", e); s_log.warn("object not found in content move", e);
throw new IllegalStateException throw new IllegalStateException((String) globalize(
((String) globalize("cms.ui.folder.no_such_item").localize()); "cms.ui.folder.no_such_item").localize());
} }
} }
} }
protected void copyItems(final Folder target, protected void copyItems(final Folder target,
final BigDecimal[] items) { final BigDecimal[] items) {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("Copying items " + Arrays.asList(items) + " to " + s_log.debug("Copying items " + Arrays.asList(items) + " to "
target); + target);
} }
for (int i = 0; i < items.length; i++) { for (int i = 0; i < items.length; i++) {
ContentItem item = (ContentItem) DomainObjectFactory.newInstance ContentItem item = (ContentItem) DomainObjectFactory.newInstance(new OID(
(new OID(ContentItem.BASE_DATA_OBJECT_TYPE, items[i])); ContentItem.BASE_DATA_OBJECT_TYPE, items[i]));
Assert.exists(item, ContentItem.class); Assert.exists(item, ContentItem.class);
@ -232,18 +240,18 @@ public class FolderManipulator extends SimpleContainer
@Override @Override
public void process(FormSectionEvent e) { public void process(FormSectionEvent e) {
PageState s = e.getPageState(); PageState s = e.getPageState();
if ( e.getSource() == m_itemView ) { if (e.getSource() == m_itemView) {
m_itemView.setVisible(s, false); m_itemView.setVisible(s, false);
m_targetSelector.setVisible(s, true); m_targetSelector.setVisible(s, true);
m_targetSelector.expose(s); m_targetSelector.expose(s);
} else if ( e.getSource() == m_targetSelector ) { } else if (e.getSource() == m_targetSelector) {
m_itemView.setVisible(s, true); m_itemView.setVisible(s, true);
m_targetSelector.setVisible(s, false); m_targetSelector.setVisible(s, false);
Folder f = m_targetSelector.getTarget(s); Folder f = m_targetSelector.getTarget(s);
BigDecimal[] items = getSources(s); BigDecimal[] items = getSources(s);
if ( isCopy(s) ) { if (isCopy(s)) {
copyItems(f, items); copyItems(f, items);
} else if ( isMove(s) ) { } else if (isMove(s)) {
moveItems(f, items); moveItems(f, items);
} }
reset(s); reset(s);
@ -261,29 +269,31 @@ public class FolderManipulator extends SimpleContainer
boolean hasSources = sources.length > 0; boolean hasSources = sources.length > 0;
SecurityManager sm = Utilities.getSecurityManager(s); SecurityManager sm = Utilities.getSecurityManager(s);
if ( e.getSource() == m_itemView ) { if (e.getSource() == m_itemView) {
if ( ! hasSources ) { if (!hasSources) {
d.addError(globalize("cms.ui.folder.must_select_item")); d.addError(globalize("cms.ui.folder.must_select_item"));
} }
} else if ( e.getSource() == m_targetSelector ) { } else if (e.getSource() == m_targetSelector) {
// The source items must have gotten lost somehow // The source items must have gotten lost somehow
if ( ! hasSources ) { if (!hasSources) {
throw new IllegalStateException( (String) GlobalizationUtil.globalize("cms.ui.folder.no_source_items_specified").localize()); throw new IllegalStateException((String) GlobalizationUtil.
globalize("cms.ui.folder.no_source_items_specified").
localize());
} }
Folder target = m_targetSelector.getTarget(s); Folder target = m_targetSelector.getTarget(s);
if ( target == null ) { if (target == null) {
d.addError(globalize("cms.ui.folder.need_select_target_folder")); d.addError(globalize("cms.ui.folder.need_select_target_folder"));
} }
if ( target.equals(m_srcFolderSel.getSelectedObject(s)) ) { if (target.equals(m_srcFolderSel.getSelectedObject(s))) {
d.addError(globalize("cms.ui.folder.not_within_same_folder")); d.addError(globalize("cms.ui.folder.not_within_same_folder"));
} }
// check create item permission // check create item permission
User user = Web.getContext().getUser(); User user = Web.getContext().getUser();
if ( ! sm.canAccess(user, SecurityManager.NEW_ITEM, target) ) { if (!sm.canAccess(user, SecurityManager.NEW_ITEM, target)) {
d.addError(globalize("cms.ui.folder.no_permission_for_item")); d.addError(globalize("cms.ui.folder.no_permission_for_item"));
} }
// Per-item checks // Per-item checks
for (int i=0; i<sources.length; i++ ) { for (int i = 0; i < sources.length; i++) {
try { try {
item = new ContentItem(sources[i]); item = new ContentItem(sources[i]);
name = item.getName(); name = item.getName();
@ -291,20 +301,26 @@ public class FolderManipulator extends SimpleContainer
items.addNameFilter(name); items.addNameFilter(name);
if (items.next()) { if (items.next()) {
// there is an item in the target folder that already has this name // there is an item in the target folder that already has this name
d.addError((String) globalize("cms.ui.folder.item_already_exists").localize() + name); d.addError((String) globalize(
"cms.ui.folder.item_already_exists").localize()
+ name);
} }
items.close(); items.close();
if (item.isLive() && isMove(s)) { if (item.isLive() && isMove(s)) {
d.addError(name + (String) globalize("cms.ui.folder.item_is_live").localize()); d.addError(name + (String) globalize(
"cms.ui.folder.item_is_live").localize());
} }
if ( (! sm.canAccess(user, SecurityManager.DELETE_ITEM, item)) && isMove(s) ) { if ((!sm.canAccess(user, SecurityManager.DELETE_ITEM, item)) && isMove(
d.addError((String) globalize("cms.ui.folder.no_permission_for_item").localize() + name + "."); s)) {
d.addError((String) globalize(
"cms.ui.folder.no_permission_for_item").localize()
+ name + ".");
} }
} catch(DataObjectNotFoundException exc) { } catch (DataObjectNotFoundException exc) {
s_log.warn ("object not found in validation", exc); s_log.warn("object not found in validation", exc);
throw new IllegalStateException throw new IllegalStateException((String) globalize(
((String) globalize("cms.ui.folder.no_such_item").localize()); "cms.ui.folder.no_such_item").localize());
} }
} }
} }
@ -314,9 +330,10 @@ public class FolderManipulator extends SimpleContainer
public void submitted(FormSectionEvent e) public void submitted(FormSectionEvent e)
throws FormProcessException { throws FormProcessException {
PageState s = e.getPageState(); PageState s = e.getPageState();
if ( m_targetSelector.isCancelled(s) ) { if (m_targetSelector.isCancelled(s)) {
reset(s); reset(s);
throw new FormProcessException( (String) GlobalizationUtil.globalize("cms.ui.folder.cancelled").localize()); throw new FormProcessException((String) GlobalizationUtil.globalize(
"cms.ui.folder.cancelled").localize());
} }
} }
@ -333,9 +350,9 @@ public class FolderManipulator extends SimpleContainer
// The form containing the tree to select the target folder from // The form containing the tree to select the target folder from
private class TargetSelector extends Form private class TargetSelector extends Form
implements Resettable { implements Resettable {
private FolderSelectionModel m_targetSel; private FolderSelectionModel m_targetSel;
private FolderTree m_folderTree; private FolderTree m_folderTree;
private Submit m_cancel; private Submit m_cancel;
public TargetSelector() { public TargetSelector() {
@ -343,7 +360,7 @@ public class FolderManipulator extends SimpleContainer
setMethod(GET); setMethod(GET);
m_targetSel = new FolderSelectionModel("target"); m_targetSel = new FolderSelectionModel("target");
m_folderTree = new FolderTree(m_targetSel); m_folderTree = new FolderTree(m_targetSel);
m_folderTree.setCellRenderer (new FolderTreeCellRenderer()); m_folderTree.setCellRenderer(new FolderTreeCellRenderer());
Label l = new Label(new PrintListener() { Label l = new Label(new PrintListener() {
@Override @Override
@ -365,6 +382,7 @@ public class FolderManipulator extends SimpleContainer
"&nbsp;" + msg); "&nbsp;" + msg);
} }
} }
}
}); });
l.setOutputEscaping(false); l.setOutputEscaping(false);
add(l); add(l);
@ -384,8 +402,8 @@ public class FolderManipulator extends SimpleContainer
// Set things up the first time the selector gets visible // Set things up the first time the selector gets visible
public void expose(PageState s) { public void expose(PageState s) {
Folder f = (Folder) m_srcFolderSel.getSelectedObject(s); Folder f = (Folder) m_srcFolderSel.getSelectedObject(s);
m_targetSel.clearSelection (s); m_targetSel.clearSelection(s);
if ( f != null ) { if (f != null) {
ItemCollection i = f.getPathInfo(true); ItemCollection i = f.getPathInfo(true);
while (i.next()) { while (i.next()) {
m_folderTree.expand(i.getID().toString(), s); m_folderTree.expand(i.getID().toString(), s);
@ -414,14 +432,12 @@ public class FolderManipulator extends SimpleContainer
// The form containing the browser and the drop down for selecting an // The form containing the browser and the drop down for selecting an
// action // action
private class ItemView extends Form private class ItemView extends Form implements Resettable {
implements Resettable {
private FolderBrowser m_browser; private FolderBrowser m_browser;
private Paginator m_paginator; private Paginator m_paginator;
private OptionGroup m_checkboxGroup; private OptionGroup m_checkboxGroup;
private SingleSelect m_actionSel; private SingleSelect m_actionSel;
private Submit m_submit; private Submit m_submit;
public ItemView() { public ItemView() {
@ -435,9 +451,12 @@ public class FolderManipulator extends SimpleContainer
group.setSubject(panel); group.setSubject(panel);
m_browser = new FolderBrowser(m_srcFolderSel); m_browser = new FolderBrowser(m_srcFolderSel);
m_paginator = new Paginator m_browser.setFilterParameter(m_filter);
((PaginationModelBuilder)m_browser.getModelBuilder(), m_browser.setFilterForm(m_filterForm);
ContentSection.getConfig().getFolderBrowseListSize()); m_paginator = new Paginator((PaginationModelBuilder) m_browser.
getModelBuilder(),
ContentSection.getConfig().
getFolderBrowseListSize());
panel.add(m_paginator); panel.add(m_paginator);
panel.add(m_browser); panel.add(m_browser);
@ -451,8 +470,10 @@ public class FolderManipulator extends SimpleContainer
c.add(new Label(globalize("cms.ui.folder.edit_selection"))); c.add(new Label(globalize("cms.ui.folder.edit_selection")));
m_actionSel = new SingleSelect(m_action); m_actionSel = new SingleSelect(m_action);
m_actionSel.addOption(new Option(COPY, new Label(globalize("cms.ui.folder.copy")))); m_actionSel.addOption(new Option(COPY, new Label(globalize(
m_actionSel.addOption(new Option(MOVE, new Label(globalize("cms.ui.folder.move")))); "cms.ui.folder.copy"))));
m_actionSel.addOption(new Option(MOVE, new Label(globalize(
"cms.ui.folder.move"))));
c.add(m_actionSel); c.add(m_actionSel);
m_submit = new Submit("Go", globalize("cms.ui.folder.go")); m_submit = new Submit("Go", globalize("cms.ui.folder.go"));
c.add(m_submit); c.add(m_submit);
@ -472,6 +493,7 @@ public class FolderManipulator extends SimpleContainer
m_checkboxGroup.setValue(s, null); m_checkboxGroup.setValue(s, null);
m_actionSel.setValue(s, null); m_actionSel.setValue(s, null);
m_paginator.reset(s); m_paginator.reset(s);
s.setValue(m_filter, null);
} }
// The renderer for the first column in the itemView table // The renderer for the first column in the itemView table
@ -481,13 +503,83 @@ public class FolderManipulator extends SimpleContainer
boolean isSelected, Object key, boolean isSelected, Object key,
int row, int column) { int row, int column) {
BigDecimal n = (BigDecimal) key; BigDecimal n = (BigDecimal) key;
Option result = new Option(m_sources.marshalElement(n.abs()), ""); Option result =
new Option(m_sources.marshalElement(n.abs()), "");
result.setGroup(m_checkboxGroup); result.setGroup(m_checkboxGroup);
return result; return result;
} }
} }
} }
protected class FilterForm extends Form implements FormProcessListener,
FormInitListener,
FormSubmissionListener {
private SimpleContainer panel;
public FilterForm() {
super("folderFilterForm");
// m_browser = browser;
s_log.debug("Creating filter form...");
addProcessListener(this);
addInitListener(this);
addSubmissionListener(this);
panel = new BoxPanel(BoxPanel.HORIZONTAL);
ActionLink allLink = new ActionLink((String)globalize(
"cms.ui.folder.filter.all").localize());
allLink.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
event.getPageState().setValue(m_filter, "");
}
});
panel.add(allLink);
for (char c = 'A';
c <= 'Z'; c++) {
final char lowerCaseChar = Character.toLowerCase(c);
ActionLink link = new ActionLink(Character.toString(c));
link.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
event.getPageState().setValue(m_filter,
Character.toString(
lowerCaseChar));
}
});
panel.add(link);
}
/*panel.add(new Label("filter"));
panel.add(new TextField(m_filter));
panel.add(new Submit("filterFolderSubmit", "filter"));*/
add(panel);
}
public void process(FormSectionEvent fse) throws FormProcessException {
}
public void init(FormSectionEvent fse) throws FormProcessException {
}
public void submitted(FormSectionEvent fse) throws FormProcessException {
}
@Override
public void setVisible(PageState state, boolean visible) {
s_log.debug("Setting visible to..." + visible);
panel.setVisible(state, visible);
super.setVisible(state, visible);
}
}
/** /**
* Getting the GlobalizedMessage using a CMS Class targetBundle. * Getting the GlobalizedMessage using a CMS Class targetBundle.
* *
@ -498,7 +590,6 @@ public class FolderManipulator extends SimpleContainer
return new GlobalizedMessage(key, RESOURCE_BUNDLE); return new GlobalizedMessage(key, RESOURCE_BUNDLE);
} }
private class FolderTreeCellRenderer implements TreeCellRenderer { private class FolderTreeCellRenderer implements TreeCellRenderer {
private RequestLocal m_invalidFolders = new RequestLocal(); private RequestLocal m_invalidFolders = new RequestLocal();
@ -523,13 +614,13 @@ public class FolderManipulator extends SimpleContainer
invalidFolders = new ArrayList(); invalidFolders = new ArrayList();
DataCollection collection = DataCollection collection =
SessionManager.getSession().retrieve SessionManager.getSession().retrieve(
(ContentItem.BASE_DATA_OBJECT_TYPE); ContentItem.BASE_DATA_OBJECT_TYPE);
CompoundFilter filter = collection.getFilterFactory().or(); CompoundFilter filter = collection.getFilterFactory().or();
// The sources themselves are not valid. // The sources themselves are not valid.
BigDecimal[] sources = getSources(state); BigDecimal[] sources = getSources(state);
for (int i = 0; i < sources.length; i++) { for (int i = 0; i < sources.length; i++) {
invalidFolders.add (sources[i].toString()); invalidFolders.add(sources[i].toString());
Filter temp = filter.addFilter("id = :id" + i); Filter temp = filter.addFilter("id = :id" + i);
temp.set("id" + i, sources[i]); temp.set("id" + i, sources[i]);
@ -537,14 +628,15 @@ public class FolderManipulator extends SimpleContainer
collection.addFilter(filter); collection.addFilter(filter);
DataCollection folders = DataCollection folders =
SessionManager.getSession().retrieve(Folder.BASE_DATA_OBJECT_TYPE); SessionManager.getSession().retrieve(
Folder.BASE_DATA_OBJECT_TYPE);
folders.addEqualsFilter(Folder.IS_DELETED, Boolean.FALSE); folders.addEqualsFilter(Folder.IS_DELETED, Boolean.FALSE);
filter = collection.getFilterFactory().or(); filter = collection.getFilterFactory().or();
int count = 0; int count = 0;
while (collection.next()) { while (collection.next()) {
filter.addFilter(Folder.ANCESTORS + " like :ancestors" + filter.addFilter(Folder.ANCESTORS + " like :ancestors"
count + " || '%'"); + count + " || '%'");
filter.set("ancestors" + count, filter.set("ancestors" + count,
collection.get(ContentItem.ANCESTORS)); collection.get(ContentItem.ANCESTORS));
count++; count++;
@ -552,7 +644,7 @@ public class FolderManipulator extends SimpleContainer
folders.addFilter(filter); folders.addFilter(filter);
while (folders.next()) { while (folders.next()) {
invalidFolders.add (folders.get(Folder.ID).toString()); invalidFolders.add(folders.get(Folder.ID).toString());
} }
// Get all subfolders of the sources. These are also not valid. // Get all subfolders of the sources. These are also not valid.
@ -567,16 +659,16 @@ public class FolderManipulator extends SimpleContainer
// The folder from which the sources are being moved/copied is // The folder from which the sources are being moved/copied is
// not allowed. // not allowed.
invalidFolders invalidFolders.add(
.add(m_srcFolderSel.getSelectedKey(state).toString()); m_srcFolderSel.getSelectedKey(state).toString());
// Save the invalid folder list // Save the invalid folder list
m_invalidFolders.set (state, invalidFolders); m_invalidFolders.set(state, invalidFolders);
} }
Label l = new Label(value.toString()); Label l = new Label(value.toString());
if (invalidFolders.contains (key.toString())) { if (invalidFolders.contains(key.toString())) {
return l; return l;
} }

View File

@ -82,13 +82,10 @@ import org.apache.log4j.Logger;
*/ */
public class Page extends BlockStylable implements Container { public class Page extends BlockStylable implements Container {
/** Class specific logger instance. */ /** Class specific logger instance. */
private static final Logger s_log = Logger.getLogger(Page.class); private static final Logger s_log = Logger.getLogger(Page.class);
/** The delimiter character for components naming */ /** The delimiter character for components naming */
private static final String DELIMITER = "."; private static final String DELIMITER = ".";
/** /**
* The prefix that gets prepended to all state variables. Components must * The prefix that gets prepended to all state variables. Components must
* not use variables starting with this prefix. This guarantees that the * not use variables starting with this prefix. This guarantees that the
@ -96,9 +93,7 @@ public class Page extends BlockStylable implements Container {
* interfere with each other. * interfere with each other.
*/ */
private static final String COMPONENT_PREFIX = "bbp" + DELIMITER; private static final String COMPONENT_PREFIX = "bbp" + DELIMITER;
private static final String INTERNAL = COMPONENT_PREFIX; private static final String INTERNAL = COMPONENT_PREFIX;
/** /**
* The name of the special parameter that indicates which component has * The name of the special parameter that indicates which component has
* been selected. * been selected.
@ -116,13 +111,11 @@ public class Page extends BlockStylable implements Container {
CONTROL_EVENT_KEYS.add(CONTROL_VALUE); CONTROL_EVENT_KEYS.add(CONTROL_VALUE);
s_log.debug("Static initalizer finished."); s_log.debug("Static initalizer finished.");
} }
/** /**
* The name of the request parameter used for the visibility state of * The name of the request parameter used for the visibility state of
* components stored in m_invisible. * components stored in m_invisible.
*/ */
static final String INVISIBLE = INTERNAL + "i"; static final String INVISIBLE = INTERNAL + "i";
/** /**
* Map of stateful components (id --> Component) * Map of stateful components (id --> Component)
* SortedMap used because component based hash for page is based on concatenation of * SortedMap used because component based hash for page is based on concatenation of
@ -131,48 +124,36 @@ public class Page extends BlockStylable implements Container {
*/ */
private SortedMap m_componentMap; private SortedMap m_componentMap;
private List m_components; private List m_components;
/** /**
* Map of component -> owned parameter collection * Map of component -> owned parameter collection
*/ */
private Map m_componentParameterMap = new HashMap(); private Map m_componentParameterMap = new HashMap();
private FormModel m_stateModel; private FormModel m_stateModel;
/** /**
* <code>Container</code> that renders this <code>Page</code>. * <code>Container</code> that renders this <code>Page</code>.
*/ */
protected Container m_panel; protected Container m_panel;
private List m_actionListeners; private List m_actionListeners;
private List m_requestListeners; private List m_requestListeners;
/** /**
* The title of the page to be added in the head of HTML output. The * The title of the page to be added in the head of HTML output. The
* title is wrapped in a Label to allow developers to add * title is wrapped in a Label to allow developers to add
* PrintListeners to dynamically change the value of the title. * PrintListeners to dynamically change the value of the title.
*/ */
private Label m_title; private Label m_title;
/** /**
* Stores the actual title for the current request. The title may be * Stores the actual title for the current request. The title may be
* generated with a PrintListener of the m_title Label. * generated with a PrintListener of the m_title Label.
*/ */
private RequestLocal m_currentTitle; private RequestLocal m_currentTitle;
/** /**
* A list of all the client-side stylesheets. The elements of the list * A list of all the client-side stylesheets. The elements of the list
* are of type Page.Stylesheet, defined at the end of this file. * are of type Page.Stylesheet, defined at the end of this file.
*/ */
private List m_clientStylesheets; private List m_clientStylesheets;
private StringParameter m_selected; private StringParameter m_selected;
private StringParameter m_controlEvent; private StringParameter m_controlEvent;
private StringParameter m_controlValue; private StringParameter m_controlValue;
/** /**
* The default (initial) visibility of components. The encoding is * The default (initial) visibility of components. The encoding is
* identical to that for PageState.m_invisible. * identical to that for PageState.m_invisible.
@ -181,18 +162,15 @@ public class Page extends BlockStylable implements Container {
* PageState. * PageState.
*/ */
protected BitSet m_invisible; protected BitSet m_invisible;
/** /**
* The PageErrorDisplay component that will display page state validation * The PageErrorDisplay component that will display page state validation
* errors on this page * errors on this page
*/ */
private Component m_errorDisplay; private Component m_errorDisplay;
/** /**
* Indicates whether finish() has been called on this Page. * Indicates whether finish() has been called on this Page.
*/ */
private boolean m_finished = false; private boolean m_finished = false;
/** /**
* indicates whether pageState.stateAsURL() should export the * indicates whether pageState.stateAsURL() should export the
* entire state for this page, or whether it should only export * entire state for this page, or whether it should only export
@ -270,6 +248,7 @@ public class Page extends BlockStylable implements Container {
// Initialize the RequestLocal where the title for the current // Initialize the RequestLocal where the title for the current
// request will be kept // request will be kept
m_currentTitle = new RequestLocal() { m_currentTitle = new RequestLocal() {
protected Object initialValue(PageState state) { protected Object initialValue(PageState state) {
return m_title.firePrintEvent(state); return m_title.firePrintEvent(state);
} }
@ -542,7 +521,6 @@ public class Page extends BlockStylable implements Container {
// Assert.isUnlocked(this); // Assert.isUnlocked(this);
// addClientStylesheet(styleSheetURI, styleSheetType); // addClientStylesheet(styleSheetURI, styleSheetType);
// } // }
/** /**
* Adds a client-side stylesheet that should be used in HTML * Adds a client-side stylesheet that should be used in HTML
* output. Arbitrarily many client-side stylesheets can be added with * output. Arbitrarily many client-side stylesheets can be added with
@ -651,8 +629,8 @@ public class Page extends BlockStylable implements Container {
m_panel.generateXML(state, page); m_panel.generateXML(state, page);
} }
if (Kernel.getConfig().isDebugEnabled() && if (Kernel.getConfig().isDebugEnabled() && debugStructure(state.
debugStructure(state.getRequest()) ) { getRequest())) {
Element structure = Element structure =
page.newChildElement("bebop:structure", BEBOP_XML_NS); page.newChildElement("bebop:structure", BEBOP_XML_NS);
@ -746,7 +724,6 @@ public class Page extends BlockStylable implements Container {
// PageState state = process(req, res); // PageState state = process(req, res);
// return state; // return state;
// } // }
/** /**
* Builds a DOM Document from the current request state by * Builds a DOM Document from the current request state by
* doing a depth-first tree walk on the current set of components * doing a depth-first tree walk on the current set of components
@ -797,6 +774,7 @@ public class Page extends BlockStylable implements Container {
Assert.isUnlocked(this); Assert.isUnlocked(this);
Traversal componentRegistrar = new Traversal() { Traversal componentRegistrar = new Traversal() {
protected void act(Component c) { protected void act(Component c) {
addComponent(c); addComponent(c);
c.register(Page.this); c.register(Page.this);
@ -949,7 +927,8 @@ public class Page extends BlockStylable implements Container {
} }
public void generateXML(Element parent) { public void generateXML(Element parent) {
Element style = parent.newChildElement("bebop:stylesheet", BEBOP_XML_NS); Element style = parent.newChildElement("bebop:stylesheet",
BEBOP_XML_NS);
style.addAttribute("href", m_URI); style.addAttribute("href", m_URI);
if (m_type != null) { if (m_type != null) {
style.addAttribute("type", m_type); style.addAttribute("type", m_type);
@ -977,8 +956,8 @@ public class Page extends BlockStylable implements Container {
} }
if (m_componentMap.get(key) != null) { if (m_componentMap.get(key) != null) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Component key must not be duplicated. The key " + "Component key must not be duplicated. The key " + key
key + " is shared by more than one component."); + " is shared by more than one component.");
} }
m_componentMap.put(key, c); m_componentMap.put(key, c);
m_components.add(c); m_components.add(c);
@ -1005,15 +984,18 @@ public class Page extends BlockStylable implements Container {
public void addComponentStateParam(Component c, ParameterModel p) { public void addComponentStateParam(Component c, ParameterModel p) {
Assert.isUnlocked(this); Assert.isUnlocked(this);
if ( ! stateContains(c)) { if (!stateContains(c)) {
throw new IllegalArgumentException throw new IllegalArgumentException(
("Component must be registered in Page"); "Component must be registered in Page");
} }
if ( ! m_stateModel.containsFormParam(p) ) { if (!m_stateModel.containsFormParam(p)) {
p.setName(parameterName(c, p.getName())); String name = parameterName(c, p.getName());
s_log.debug(String.format("Setting name of parameter to add to '%s'",
name));
p.setName(name);
m_stateModel.addFormParam(p); m_stateModel.addFormParam(p);
Collection params = (Collection)m_componentParameterMap.get(c); Collection params = (Collection) m_componentParameterMap.get(c);
if (params == null) { if (params == null) {
params = new ArrayList(); params = new ArrayList();
m_componentParameterMap.put(c, params); m_componentParameterMap.put(c, params);
@ -1029,7 +1011,6 @@ public class Page extends BlockStylable implements Container {
return (Collection) m_componentParameterMap.get(c); return (Collection) m_componentParameterMap.get(c);
} }
/** /**
* Gets the state index of a component. This is the number assigned * Gets the state index of a component. This is the number assigned
* to the component in the register traveral * to the component in the register traveral
@ -1181,7 +1162,6 @@ public class Page extends BlockStylable implements Container {
resetter.preorder(cmpnt); resetter.preorder(cmpnt);
} }
/** /**
* Return the prefix that is prepended to each component's state * Return the prefix that is prepended to each component's state
* parameters to keep them unique. * parameters to keep them unique.
@ -1193,11 +1173,11 @@ public class Page extends BlockStylable implements Container {
// WRS: preferentially use key if it exists // WRS: preferentially use key if it exists
String key = c.getKey(); String key = c.getKey();
if (key == null) { if (key == null) {
if ( stateContains(c) ) { if (stateContains(c)) {
key = String.valueOf(stateIndex(c)); key = String.valueOf(stateIndex(c));
} else { } else {
throw new IllegalArgumentException throw new IllegalArgumentException(
("Cannot generate prefix for component: key is null " "Cannot generate prefix for component: key is null "
+ "and component " + c.toString() + "/" + c.getKey() + "and component " + c.toString() + "/" + c.getKey()
+ " did not register with page."); + " did not register with page.");
} }
@ -1213,7 +1193,7 @@ public class Page extends BlockStylable implements Container {
* @return the unmangled name. * @return the unmangled name.
*/ */
private static final String unmangle(String name) { private static final String unmangle(String name) {
if ( ! name.startsWith(COMPONENT_PREFIX) ) { if (!name.startsWith(COMPONENT_PREFIX)) {
return name; return name;
} }
// Find the second occurence of delimiter // Find the second occurence of delimiter
@ -1223,9 +1203,7 @@ public class Page extends BlockStylable implements Container {
} }
return name; return name;
} }
// Procs for debugging output // Procs for debugging output
private static String NAME = "name"; private static String NAME = "name";
/** /**
@ -1316,7 +1294,7 @@ public class Page extends BlockStylable implements Container {
* by implementations of hashCode & equals * by implementations of hashCode & equals
* @return * @return
*/ */
public String getComponentString () { public String getComponentString() {
Iterator it = m_componentMap.keySet().iterator(); Iterator it = m_componentMap.keySet().iterator();
/*int hash = 0; /*int hash = 0;
while (it.hasNext()) { while (it.hasNext()) {
@ -1329,10 +1307,11 @@ public class Page extends BlockStylable implements Container {
StringBuffer hashString = new StringBuffer(); StringBuffer hashString = new StringBuffer();
while (it.hasNext()) { while (it.hasNext()) {
String componentId = (String)it.next(); String componentId = (String) it.next();
hashString.append(componentId); hashString.append(componentId);
} }
s_log.debug("Time to create hashCode for page: " + (new Date().getTime() - start.getTime())); s_log.debug("Time to create hashCode for page: " + (new Date().getTime() - start.
getTime()));
return hashString.toString(); return hashString.toString();

View File

@ -74,8 +74,8 @@ import com.arsdigita.toolbox.util.GlobalizationUtil;
*/ */
public class DomainObjectPropertySheet extends PropertySheet { public class DomainObjectPropertySheet extends PropertySheet {
public static final String versionId = "$Id: DomainObjectPropertySheet.java 287 2005-02-22 00:29:02Z sskracic $ by $Author: sskracic $, $DateTime: 2004/08/16 18:10:38 $"; public static final String versionId =
"$Id: DomainObjectPropertySheet.java 287 2005-02-22 00:29:02Z sskracic $ by $Author: sskracic $, $DateTime: 2004/08/16 18:10:38 $";
private List m_props; private List m_props;
private DomainObjectSelectionModel m_objModel; private DomainObjectSelectionModel m_objModel;
private AttributeFormatter m_toStringFormatter; private AttributeFormatter m_toStringFormatter;
@ -102,8 +102,7 @@ public class DomainObjectPropertySheet extends PropertySheet {
* *
*/ */
public DomainObjectPropertySheet( public DomainObjectPropertySheet(
DomainObjectSelectionModel objModel, boolean valueOutputEscape DomainObjectSelectionModel objModel, boolean valueOutputEscape) {
) {
super(new DomainObjectModelBuilder(), valueOutputEscape); super(new DomainObjectModelBuilder(), valueOutputEscape);
m_objModel = objModel; m_objModel = objModel;
@ -142,7 +141,7 @@ public class DomainObjectPropertySheet extends PropertySheet {
public void add(GlobalizedMessage label, String attribute) { public void add(GlobalizedMessage label, String attribute) {
// Determine if we are dealing with a simple string or a complex // Determine if we are dealing with a simple string or a complex
// path // path
if(attribute.indexOf('.') == -1) { if (attribute.indexOf('.') == -1) {
add(label, attribute, m_toStringFormatter); add(label, attribute, m_toStringFormatter);
} else { } else {
add(label, attribute, m_recursiveFormatter); add(label, attribute, m_recursiveFormatter);
@ -172,7 +171,8 @@ public class DomainObjectPropertySheet extends PropertySheet {
* @param attribute The name for the attribute * @param attribute The name for the attribute
* @param formatter An instance of AttributeFormatter * @param formatter An instance of AttributeFormatter
*/ */
public void add(GlobalizedMessage label, String attribute, AttributeFormatter f) { public void add(GlobalizedMessage label, String attribute,
AttributeFormatter f) {
m_props.add(new Property(label, attribute, f)); m_props.add(new Property(label, attribute, f));
} }
@ -225,17 +225,26 @@ public class DomainObjectPropertySheet extends PropertySheet {
/** /**
* @deprecated use getGlobalizedLabel instead * @deprecated use getGlobalizedLabel instead
*/ */
public String getLabel() { return m_label.getKey(); } public String getLabel() {
return m_label.getKey();
}
public GlobalizedMessage getGlobalizedLabel() { return m_label; } public GlobalizedMessage getGlobalizedLabel() {
return m_label;
}
public String getAttribute() { return m_attr; } public String getAttribute() {
return m_attr;
}
public AttributeFormatter getFormatter() { return m_formatter; } public AttributeFormatter getFormatter() {
return m_formatter;
}
} }
// Build up the object properties model from the iterator over all properties // Build up the object properties model from the iterator over all properties
private static class DomainObjectPropertiesModel implements PropertySheetModel { private static class DomainObjectPropertiesModel implements
PropertySheetModel {
private DomainObject m_obj; private DomainObject m_obj;
private PageState m_state; private PageState m_state;
@ -245,8 +254,7 @@ public class DomainObjectPropertySheet extends PropertySheet {
"No current property. Make sure that nextRow() was called at least once."; "No current property. Make sure that nextRow() was called at least once.";
public DomainObjectPropertiesModel( public DomainObjectPropertiesModel(
DomainObject obj, Iterator props, PageState state DomainObject obj, Iterator props, PageState state) {
) {
m_obj = obj; m_obj = obj;
m_props = props; m_props = props;
m_state = state; m_state = state;
@ -254,11 +262,11 @@ public class DomainObjectPropertySheet extends PropertySheet {
} }
public boolean nextRow() { public boolean nextRow() {
if(!m_props.hasNext()) { if (!m_props.hasNext()) {
return false; return false;
} }
m_current = (Property)m_props.next(); m_current = (Property) m_props.next();
return true; return true;
} }
@ -270,18 +278,19 @@ public class DomainObjectPropertySheet extends PropertySheet {
} }
public GlobalizedMessage getGlobalizedLabel() { public GlobalizedMessage getGlobalizedLabel() {
if(m_current == null) { if (m_current == null) {
throw new IllegalStateException(ERROR); throw new IllegalStateException(ERROR);
} }
return m_current.getGlobalizedLabel(); return m_current.getGlobalizedLabel();
} }
public String getValue() { public String getValue() {
if(m_current == null) { if (m_current == null) {
throw new IllegalStateException(ERROR); throw new IllegalStateException(ERROR);
} }
return m_current.getFormatter() return m_current.getFormatter().format(m_obj,
.format(m_obj, m_current.getAttribute(), m_state); m_current.getAttribute(),
m_state);
} }
} }
@ -290,12 +299,11 @@ public class DomainObjectPropertySheet extends PropertySheet {
implements PropertySheetModelBuilder { implements PropertySheetModelBuilder {
public PropertySheetModel makeModel(PropertySheet sheet, PageState state) { public PropertySheetModel makeModel(PropertySheet sheet, PageState state) {
DomainObjectPropertySheet s = (DomainObjectPropertySheet)sheet; DomainObjectPropertySheet s = (DomainObjectPropertySheet) sheet;
return new DomainObjectPropertiesModel ( return new DomainObjectPropertiesModel(
s.getObjectSelectionModel().getSelectedObject(state), s.getObjectSelectionModel().getSelectedObject(state),
s.properties(), s.properties(),
state state);
);
} }
} }
@ -333,11 +341,13 @@ public class DomainObjectPropertySheet extends PropertySheet {
} }
public String format(DomainObject obj, String attribute, PageState state) { public String format(DomainObject obj, String attribute, PageState state) {
if(obj == null) return getDefaultString(); if (obj == null) {
return getDefaultString();
}
Object value = get(obj, attribute); Object value = get(obj, attribute);
if(value == null) { if (value == null) {
return getDefaultString(); return getDefaultString();
} else { } else {
return value.toString(); return value.toString();
@ -349,7 +359,6 @@ public class DomainObjectPropertySheet extends PropertySheet {
// by following the names in the attribute string. For example, if // by following the names in the attribute string. For example, if
// the string says "foo.bar.baz", the formatter will attempt to call // the string says "foo.bar.baz", the formatter will attempt to call
// obj.get("foo").get("bar").get("baz"); // obj.get("foo").get("bar").get("baz");
private static class RecursiveAttributeFormatter private static class RecursiveAttributeFormatter
extends DefaultAttributeFormatter { extends DefaultAttributeFormatter {
@ -362,26 +371,31 @@ public class DomainObjectPropertySheet extends PropertySheet {
} }
public String format(DomainObject obj, String attribute, PageState state) { public String format(DomainObject obj, String attribute, PageState state) {
if(obj == null) return getDefaultString(); if (obj == null) {
return getDefaultString();
}
StringTokenizer tokenizer = new StringTokenizer(attribute, "."); StringTokenizer tokenizer = new StringTokenizer(attribute, ".");
String token = null; String token = null;
Object value = getDataObject(obj); Object value = getDataObject(obj);
while(tokenizer.hasMoreTokens()) { while (tokenizer.hasMoreTokens()) {
token = tokenizer.nextToken(); token = tokenizer.nextToken();
// Null check // Null check
value = ((DataObject)value).get(token); value = ((DataObject) value).get(token);
if(value == null) if (value == null) {
return getDefaultString(); return getDefaultString();
} }
}
// Extract leaf value // Extract leaf value
if(token == null || value == null) if (token == null || value == null) {
return getDefaultString(); return getDefaultString();
}
return value.toString(); return value.toString();
} }
} }
} }

View File

@ -34,6 +34,7 @@ import com.arsdigita.cms.contenttypes.util.ContenttypesGlobalizationUtil;
import com.arsdigita.cms.ui.authoring.BasicPageForm; import com.arsdigita.cms.ui.authoring.BasicPageForm;
import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess; import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess;
import com.arsdigita.domain.DomainObject; import com.arsdigita.domain.DomainObject;
import com.arsdigita.domain.DomainService;
import java.text.DateFormat; import java.text.DateFormat;
/** /**
@ -74,7 +75,8 @@ public class PublicationPropertiesStep extends SimpleEditStep {
Publication.YEAR_OF_PUBLICATION); Publication.YEAR_OF_PUBLICATION);
sheet.add(PublicationGlobalizationUtil.globalize( sheet.add(PublicationGlobalizationUtil.globalize(
"publications.ui.publication.abstract"), "publications.ui.publication.abstract"),
Publication.ABSTRACT); Publication.ABSTRACT,
new PreFormattedTextFormatter());
sheet.add(PublicationGlobalizationUtil.globalize( sheet.add(PublicationGlobalizationUtil.globalize(
"publications.ui.publication.misc"), "publications.ui.publication.misc"),
Publication.MISC); Publication.MISC);
@ -143,4 +145,18 @@ public class PublicationPropertiesStep extends SimpleEditStep {
labelKey).localize()), labelKey).localize()),
step); step);
} }
private static class PreFormattedTextFormatter
extends DomainService
implements DomainObjectPropertySheet.AttributeFormatter {
public PreFormattedTextFormatter() {
super();
}
public String format(DomainObject obj, String attribute, PageState state) {
return String.format("<pre>%s</pre>", get(obj, attribute));
}
}
} }