/* * $Id: NewsReader.java,v 1.141.2.2 2007/01/12 19:32:28 idegaweb Exp $ * * Copyright (C) 2001 Idega hf. All Rights Reserved. * * This software is the proprietary information of Idega hf. * Use is subject to license terms. * */ package com.idega.block.news.presentation; import java.text.DateFormat; import java.util.Collections; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Vector; import com.idega.block.category.business.CategoryFinder; import com.idega.block.category.data.ICCategory; import com.idega.block.category.presentation.CategoryBlock; import com.idega.block.news.business.NewsBusiness; import com.idega.block.news.business.NewsFinder; import com.idega.block.news.business.NewsFormatter; import com.idega.block.news.business.NewsHelper; import com.idega.block.news.business.NewsLayoutHandler; import com.idega.block.news.data.NwNews; import com.idega.block.text.business.ContentHelper; import com.idega.block.text.data.Content; import com.idega.block.text.data.LocalizedText; import com.idega.core.file.data.ICFile; import com.idega.core.user.data.User; import com.idega.idegaweb.IWBundle; import com.idega.idegaweb.IWResourceBundle; import com.idega.idegaweb.block.presentation.Builderaware; import com.idega.idegaweb.block.presentation.ImageWindow; import com.idega.presentation.IWContext; import com.idega.presentation.Image; import com.idega.presentation.PresentationObject; import com.idega.presentation.Table; import com.idega.presentation.text.Link; import com.idega.presentation.text.Text; import com.idega.presentation.ui.Parameter; import com.idega.util.IWTimestamp; import com.idega.util.text.TextSoap; /** * Title: Description: Copyright: Copyright (c) 2001 Company: idega.is * * @author 2000 - idega team -<br> * <a href="mailto:aron@idega.is">Aron Birkir </a> <br> * @version 1.0 */ public class NewsReader extends CategoryBlock implements Builderaware { private final static String IW_BUNDLE_IDENTIFIER = "com.idega.block.news"; public final static String CACHE_KEY = "nw_news"; private boolean hasEdit = false, hasAdd = false, hasInfo = false, hasEditExisting = false; private int iCategoryId = -1; private String attributeName = null; private int attributeId = -1; private User eUser = null; private boolean showNewsCollectionButton = false; private int categoryId = 0; private Table outerTable = new Table(1, 1); private int numberOfLetters = 273; private int numberOfHeadlineLetters = -1; private int numberOfDisplayedNews = 5; private int numberOfExpandedNews = 3; private int numberOfCollectionNews = 30; private int iSpaceBetween = 1; private int iSpaceBetweenNews = 20; private int iSpaceBetweenNewsAndBody = 5; private int cellPadding = 0; private int cellSpacing = 0; private int viewPageId = -1; private int textSize = 2; private int firstImageWidth = 200; private int ImageWidth = 100; private int ImageBorder = 1; private int dateWidth = 60; private boolean showBackButton = false; private boolean showAll = false; private boolean showImages = true; private boolean showImagesInOverview = true; private boolean showOnlyDates = false; private boolean showTime = true; private boolean showInfo = true; private boolean showUpdatedDate = false; private boolean showTimeFirst = false; private boolean headlineAsLink = false; private boolean showHeadlineImage = false; private boolean showMoreButton = true; private boolean alignWithHeadline = false; private boolean limitNumberOfNews = false; private boolean enableDelete = true; private boolean viewNews = true; private boolean newobjinst = false; private boolean showBackText = false; private boolean showMoreText = false; private boolean showCollectionText = true; private boolean showTeaserText = true; private boolean addImageInfo = true; private String outerTableWidth = "100%"; private String sObjectAlign = "center"; private String headlineImageURL; private String firstTableColor = null; private String secondTableColor = null; private String dateAlign = "left"; private Image headlineImage = null; private Image backImage = null; private Image moreImage = null; private Image collectionImage = null; private Hashtable objectsBetween = null; private Text textProxy = new Text(); private Text headlineProxy = new Text(); private Text informationProxy = new Text(); private Text moreProxy = new Text(); private Image spacerImage = null; private static String prmFromPage = "nwr_from_page"; private static String prmDelete = "nwr_delete"; private static String prmEdit = "nwr_edit"; private static String prmNew = "nwr_new"; private static String prmMore = "nwr_more"; private static String prmCollection = "nwr_collection"; private static String prmObjIns = "nwr_instance_id"; public static String prmListCategory = "nwr_newscategoryid"; public static String prmNewsCategoryId = "nwr_listcategory"; private static String AddPermisson = "add"; private static String InfoPermission = "info"; private static String EditExistingPermission = "edit_existing"; private IWBundle iwb; private IWResourceBundle iwrb; public static final int SINGLE_FILE_LAYOUT = NewsLayoutHandler.SINGLE_FILE_LAYOUT; public static final int NEWS_SITE_LAYOUT = NewsLayoutHandler.NEWS_SITE_LAYOUT; public static final int NEWS_PAPER_LAYOUT = NewsLayoutHandler.NEWS_PAPER_LAYOUT; public static final int SINGLE_LINE_LAYOUT = NewsLayoutHandler.SINGLE_LINE_LAYOUT; public static final int COLLECTION_LAYOUT = NewsLayoutHandler.COLLECTION_LAYOUT; private int iLayout = SINGLE_FILE_LAYOUT; private int visibleNewsRangeStart = 0; private int visibleNewsRangeEnd = Integer.MAX_VALUE; private boolean setHeadlineLinktToCategoryMainViewerPage = false; private boolean showCategoryInSingleLineView = false; private String moreAndBackStyleClass; private String moreStyleClass; private String backStyleClass; private String CollectionLinkStyleClass = null; public NewsReader() { setCacheable(getCacheKey(), 999999999);//cache indefinately init(); this.showAll = true; } public NewsReader(int iCategoryId) { this(); this.iCategoryId = iCategoryId; this.showAll = false; } public void registerPermissionKeys() { registerPermissionKey(AddPermisson); registerPermissionKey(InfoPermission); registerPermissionKey(EditExistingPermission); } public boolean getMultible() { return true; } public String getCategoryType() { return "news"; } private void init() { this.headlineProxy.setBold(); this.informationProxy.setFontColor("#666666"); this.textProxy.setFontSize(1); this.informationProxy.setFontSize(1); } private void checkCategories() { } /** @todo take out when instanceId handler is used */ private String getInstanceIDString(IWContext iwc) { if (this.viewPageId > 0 || iwc.isParameterSet(prmFromPage)) { return ""; } else { return String.valueOf(getICObjectInstanceID()); } } private Parameter getFromPageParameter() { return new Parameter(prmFromPage, "true"); } private void checkFromPage(Link link) { if (this.viewPageId > 0) { link.addParameter(getFromPageParameter()); } } private void control(IWContext iwc) { if (this.moreImage == null) { this.moreImage = this.iwrb.getImage("more.gif"); } if (this.backImage == null) { this.backImage = this.iwrb.getImage("back.gif"); } if (this.collectionImage == null) { this.collectionImage = this.iwrb.getImage("collection.gif"); } Locale locale = iwc.getCurrentLocale(); String sNewsId = null; boolean beInvisible = false; if (this.viewNews) { if(this.visibleNewsRangeStart>0) { Enumeration enumer = iwc.getParameterNames(); while (enumer.hasMoreElements()) { String pName = (String) enumer.nextElement(); if(pName.startsWith(prmMore)) { if(this.visibleNewsRangeStart==1) { sNewsId = iwc.getParameter(pName); } else { beInvisible=true; } break; } } } else { sNewsId = iwc.getParameter(prmMore + getInstanceIDString(iwc)); } } if(!beInvisible) { ICCategory newsCategory = null; String prm = prmListCategory + getInstanceIDString(iwc); boolean info = false; if (iwc.isParameterSet(prm)) { if (iwc.getParameter(prm).equalsIgnoreCase("true")) { info = true; } else { info = false; } } if (this.iCategoryId <= 0) { String sCategoryId = iwc.getParameter(prmNewsCategoryId); if (sCategoryId != null) { this.iCategoryId = Integer.parseInt(sCategoryId); } else { //if(getICObjectInstanceID() > 0){ // iCategoryId = // NewsFinder.getObjectInstanceCategoryId(getICObjectInstanceID(),true); this.iCategoryId = getCategoryId(); if (this.iCategoryId <= 0) { this.newobjinst = true; } } } Table T = new Table(1, 1); T.setCellpadding(0); T.setCellpadding(0); T.setWidth("100%"); if (this.hasEdit || this.hasAdd || this.hasInfo) { T.add(getAdminPart(this.iCategoryId, false, this.newobjinst, info, iwc), 1, 1); } if (this.iCategoryId > 0) { newsCategory = CategoryFinder.getInstance().getCategory(this.iCategoryId); if (newsCategory != null) { if (sNewsId != null) { int id = Integer.parseInt(sNewsId); NewsHelper nh = NewsFinder.getNewsHelper(id); T.add(getNewsTable(nh, locale, true, false, iwc, true), 1, 1); } else if (info) { T.add(getCategoryList(locale, iwc), 1, 1); } else { String cprm = prmCollection + getInstanceIDString(iwc); T.add(publishNews(iwc, locale, iwc.isParameterSet(cprm)), 1, 1); } } } else { T.add(new Text(this.iwrb.getLocalizedString("no_news_category", "No news category"))); } super.add(T); } } private PresentationObject getAdminPart(int iCategoryId, boolean enableDelete, boolean newObjInst, boolean info, IWContext iwc) { Table T = new Table(3, 1); T.setCellpadding(2); T.setCellspacing(2); T.setBorder(0); IWBundle core = iwc.getIWMainApplication().getBundle(IW_CORE_BUNDLE_IDENTIFIER); if (iCategoryId > 0) { if (this.hasEdit || this.hasAdd || this.hasInfo) { Link ne = new Link(core.getImage("/shared/create.gif")); ne.setWindowToOpen(NewsEditorWindow.class); ne.addParameter(NewsEditorWindow.prmCategory, iCategoryId); ne.addParameter(NewsEditorWindow.prmObjInstId, getICObjectInstanceID()); T.add(ne, 1, 1); } //T.add(T.getTransparentCell(iwc),1,1); if (this.hasEdit || this.hasInfo) { Link list = new Link(this.iwb.getImage("/shared/info.gif")); checkFromPage(list); if (!info) { list.addParameter(prmListCategory + getInstanceIDString(iwc), "true"); } else { list.addParameter(prmListCategory + getInstanceIDString(iwc), "false"); } T.add(list, 1, 1); } if (this.hasEdit) { Link change = getCategoryLink(); change.setImage(core.getImage("/shared/detach.gif")); T.add(change, 1, 1); } if (this.hasEdit && enableDelete) { T.add(T.getTransparentCell(iwc), 1, 1); Link delete = new Link(core.getImage("/shared/delete.gif")); delete.setWindowToOpen(NewsEditorWindow.class); delete.addParameter(NewsEditorWindow.prmDelete, iCategoryId); T.add(delete, 3, 1); } } if (this.hasEdit && newObjInst) { Link newLink = getCategoryLink(); newLink.setImage(core.getImage("/shared/detach.gif")); //Link newLink = new Link(core.getImage("/shared/create.gif")); //newLink.setWindowToOpen(NewsEditorWindow.class); //if(newObjInst) //newLink.addParameter(NewsEditorWindow.prmObjInstId,getICObjectInstanceID()); T.add(newLink, 2, 1); } T.setWidth("100%"); return T; } private PresentationObject getCategoryList(Locale locale, IWContext iwc) { List L = NewsFinder.listOfAllNewsHelpersInCategory(getCategoryIds(), 50, locale); Table T = new Table(); int row = 1; if (L != null) { Iterator I = L.iterator(); NewsHelper newsHelper; while (I.hasNext()) { newsHelper = (NewsHelper) I.next(); T.add(getNewsOverViewTable(newsHelper, locale, iwc), 1, row++); } } else { // T.add(new Text(iwrb.getLocalizedString("no_news","No News"))); } return T; } private PresentationObject getNewsOverViewTable(NewsHelper newsHelper, Locale locale, IWContext iwc) { Table T = new Table(); T.setCellpadding(0); T.setCellspacing(0); T.setBorder(0); T.setWidth("100%"); DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, locale); ContentHelper contentHelper = newsHelper.getContentHelper(); NwNews news = newsHelper.getNwNews(); LocalizedText locText = contentHelper.getLocalizedText(locale); Text newsInfo = getInfoText(news, newsHelper.getContentHelper().getContent(), locale, this.showOnlyDates, this.showTime, this.showTimeFirst, this.showUpdatedDate); String sNewsBody = ""; String sHeadline = ""; if (locText != null) { sHeadline = locText.getHeadline(); sNewsBody = locText.getBody(); } int letterCount = sNewsBody.length(); int fileCount = 0; List files = newsHelper.getContentHelper().getFiles(); if (files != null) { fileCount = files.size(); } Text hLetters = formatText(this.iwrb.getLocalizedString("letters", "Letters") + " : ", true); Text hFiles = formatText(this.iwrb.getLocalizedString("files", "Files") + " : ", true); Text hFrom = formatText(this.iwrb.getLocalizedString("publish_from", "Publish from") + " : ", true); Text hTo = formatText(this.iwrb.getLocalizedString("publish_to", "Publish to") + " : ", true); Text hCreated = formatText(this.iwrb.getLocalizedString("created", "Created") + " : ", true); Text hUpdated = formatText(this.iwrb.getLocalizedString("updated", "Updated") + " : ", true); Text tLetters = formatText(String.valueOf(letterCount), false); Text tFiles = formatText(String.valueOf(fileCount), false); IWTimestamp now = IWTimestamp.RightNow(); IWTimestamp from = new IWTimestamp(newsHelper.getContentHelper().getContent().getPublishFrom()); IWTimestamp to = new IWTimestamp(newsHelper.getContentHelper().getContent().getPublishTo()); IWTimestamp created = new IWTimestamp(newsHelper.getContentHelper().getContent().getCreated()); IWTimestamp updated = new IWTimestamp(newsHelper.getContentHelper().getContent().getLastUpdated()); Text tFrom = formatText(df.format((java.util.Date) from.getTimestamp()), true); Text tTo = formatText(df.format((java.util.Date) to.getTimestamp()), true); Text tCreated = formatText(df.format((java.util.Date) created.getTimestamp()), false); Text tUpdated = formatText(df.format((java.util.Date) updated.getTimestamp()), false); // Unpublished if (from.isLaterThan(now)) { tFrom.setFontColor("#FFDE00"); tTo.setFontColor("#FFDE00"); } // Published else if (now.isLaterThan(to)) { tFrom.setFontColor("#CC3300"); tTo.setFontColor("#CC3300"); } // Publishing else if (now.isLaterThan(from) && to.isLaterThan(now)) { tFrom.setFontColor("#333399"); tTo.setFontColor("#333399"); } Text headLine = new Text(sHeadline); if (newsInfo != null) { newsInfo = setInformationAttributes(newsInfo); } headLine = setHeadlineAttributes(headLine); Table infoTable = new Table(); infoTable.add(hLetters, 1, 1); infoTable.add(tLetters, 2, 1); infoTable.add(hFiles, 1, 2); infoTable.add(tFiles, 2, 2); infoTable.add(hFrom, 3, 1); infoTable.add(tFrom, 4, 1); infoTable.add(hTo, 3, 2); infoTable.add(tTo, 4, 2); infoTable.add(hCreated, 5, 1); infoTable.add(tCreated, 6, 1); infoTable.add(hUpdated, 5, 2); infoTable.add(tUpdated, 6, 2); int row = 1; if (this.showInfo) { T.add(newsInfo, 1, row++); } T.add(headLine, 1, row++); T.add(infoTable, 1, row++); T.setHeight(row++, String.valueOf(this.iSpaceBetweenNewsAndBody)); if (this.showMoreButton) { T.add(getMoreLink(this.moreImage, news.getID(), iwc), 1, row); T.add(Text.getNonBrakingSpace(), 1, row); } if (this.showMoreText) { Text tMore = new Text(this.iwrb.getLocalizedString("more", "More")); tMore = setMoreAttributes(tMore); T.add(getMoreLink(tMore, news.getID(), iwc), 1, row); } row++; int ownerId = newsHelper.getContentHelper().getContent().getUserId(); if (this.hasEdit || this.hasEditExisting || (this.hasAdd && (ownerId == iwc.getUserId()))) { T.add(getNewsAdminPart(news, iwc), 1, row); } return T; } private Text formatText(String text, boolean bold) { Text T = new Text(text); T.setFontSize(2); T.setBold(bold); return T; } private PresentationObject publishNews(IWContext iwc, Locale locale, boolean collection) { List L = null; if (this.iLayout == COLLECTION_LAYOUT || collection) { L = NewsFinder.listOfAllNewsHelpersInCategory(getCategoryIds(), this.numberOfCollectionNews, locale); } else { L = NewsFinder.listOfNewsHelpersInCategory(getCategoryIds(), this.numberOfDisplayedNews, locale); } NewsTable T = new NewsTable(NewsTable.NEWS_SITE_LAYOUT, this.cellPadding, this.cellSpacing, this.firstTableColor, this.secondTableColor); //int count = NewsFinder.countNewsInCategory(newsCategory.getID()); //System.err.println(" news count "+count); boolean useDividedTable = this.iLayout == NEWS_SITE_LAYOUT ? true : false; if (L != null) { int len = Math.min(this.visibleNewsRangeEnd, L.size()); Integer I; NewsHelper newsHelper; for (int i = Math.max(0, (this.visibleNewsRangeStart - 1)); i < len; i++) { if (this.numberOfExpandedNews == i) { collection = true; // show the rest as } // collection newsHelper = (NewsHelper) L.get(i); I = new Integer(i); if (this.objectsBetween != null && this.objectsBetween.containsKey(I)) { Table t = new Table(1, 1); t.setCellpadding(4); t.add((PresentationObject) this.objectsBetween.get(I)); T.add(t, this.sObjectAlign); this.objectsBetween.remove(I); } T.add(getNewsTable(newsHelper, locale, false, collection, iwc, (i + 1) == len), useDividedTable, "left"); } // news collection if (this.showNewsCollectionButton) { if (!collection) { // adds collectionButton only if one category bound to instance: //if(getCategoryIds().length == 1) T.add(getCollectionTable(iwc, getCategoryIds()[0])); } else if (collection && isFromCollectionLink(iwc)) { T.add(getBackTable(iwc)); } else if (collection && !isFromCollectionLink(iwc)) { T.add(getCollectionTable(iwc, getCategoryIds()[0])); } } // Finish objectsbetween if (this.objectsBetween != null && this.objectsBetween.size() > 0) { Vector V = new Vector(this.objectsBetween.values()); Collections.reverse(V); Iterator iter = V.iterator(); while (iter.hasNext()) { T.add((PresentationObject) iter.next(), this.sObjectAlign); } } } else { if (this.hasEdit || this.hasInfo) { T.add(new Text(this.iwrb.getLocalizedString("no_news", "No News"))); } } return (T); } private Table getCollectionTable(IWContext iwc, int iCollectionCategoryId) { Table smallTable = new Table(1, 1); smallTable.setCellpadding(0); smallTable.setCellspacing(0); if(this.CollectionLinkStyleClass != null){ Text collText = new Text(this.iwrb.getLocalizedString("collection", "Collection")); collText.setStyleClass(this.CollectionLinkStyleClass); smallTable.add(getCollectionLink(collText, iCollectionCategoryId, iwc), 1, 1); } else { if (this.collectionImage != null) { smallTable.add(getCollectionLink(this.collectionImage, iCollectionCategoryId, iwc), 1, 1); } if (this.showCollectionText) { Text collText = new Text(this.iwrb.getLocalizedString("collection", "Collection")); collText = setInformationAttributes(collText); smallTable.add(getCollectionLink(collText, iCollectionCategoryId, iwc), 1, 1); } } return smallTable; } public Table getBackTable(IWContext iwc) { Table smallTable = new Table(1, 1); smallTable.setCellpadding(0); smallTable.setCellspacing(0); if (this.showBackButton) { smallTable.add(getBackLink(this.backImage), 1, 1); smallTable.add(Text.getNonBrakingSpace(), 1, 1); } if (this.showBackText) { Text tBack = new Text(this.iwrb.getLocalizedString("back", "Back")); tBack = setMoreAttributes(tBack); smallTable.add(getBackLink(tBack), 1, 1); } return smallTable; } private Link getCollectionLink(PresentationObject obj, int iCategoryId, IWContext iwc) { Link collectionLink = new Link(obj); checkFromPage(collectionLink); collectionLink.addParameter(prmNewsCategoryId, iCategoryId); collectionLink.addParameter(prmCollection + getInstanceIDString(iwc), "true"); if (this.viewPageId > 0) { collectionLink.setPage(this.viewPageId); } return collectionLink; } private boolean isFromCollectionLink(IWContext iwc) { return iwc.isParameterSet(prmCollection + getInstanceIDString(iwc)); } // Make a table around each news private PresentationObject getNewsTable(NewsHelper newsHelper, Locale locale, boolean showAll, boolean collection, IWContext iwc, boolean isLastNews) { Table T = new Table(); T.setCellpadding(0); T.setCellspacing(0); T.setBorder(0); T.setWidth("100%"); int row = 1; ContentHelper contentHelper = newsHelper.getContentHelper(); NwNews news = newsHelper.getNwNews(); LocalizedText locText = contentHelper.getLocalizedText(locale); if (this.iLayout == SINGLE_LINE_LAYOUT) { this.showOnlyDates = true; } String sNewsBody = ""; String sHeadline = ""; String sTeaser = ""; if (locText != null) { sHeadline = locText.getHeadline(); sHeadline = sHeadline == null ? "" : sHeadline; sTeaser = locText.getTitle(); sTeaser = sTeaser == null ? "" : sTeaser; } // shortening headlinestext boolean needMoreButton = collection; if (!showAll && this.numberOfHeadlineLetters > -1 && sHeadline.length() >= this.numberOfHeadlineLetters) { sHeadline = sHeadline.substring(0, this.numberOfHeadlineLetters) + "..."; needMoreButton = true; } Text headLine = new Text(sHeadline); Text teaser = new Text(sTeaser); Text newsInfo = getInfoText(news, newsHelper.getContentHelper().getContent(), locale, this.showOnlyDates, this.showTime, this.showTimeFirst, this.showUpdatedDate); if (newsInfo != null) { newsInfo = setInformationAttributes(newsInfo); } headLine = setHeadlineAttributes(headLine); teaser = setTextAttributes(teaser); // Check if using single_line_layout if (this.iLayout != SINGLE_LINE_LAYOUT) { if (newsInfo != null) { T.add(newsInfo, 1, row); T.setVerticalAlignment(1, row, Table.VERTICAL_ALIGN_TOP); row++; } //////// HEADLINE PART //////////////// if (this.alignWithHeadline) { if (this.headlineImage != null) { this.headlineImage.setHorizontalSpacing(3); T.add(getMoreLink(this.headlineImage, news.getID(), iwc), 1, row); } if (this.headlineImageURL != null) { T.add(getMoreLink(this.iwb.getImage(this.headlineImageURL), news.getID(), iwc), 1, row); } } if (this.headlineAsLink) { if (this.setHeadlineLinktToCategoryMainViewerPage) { T.add(getLinkToCategoryMainViewerPage(headLine, news, iwc), 1, row); } else { T.add(getMoreLink(headLine, news.getID(), iwc), 1, row); } } else { T.add(headLine, 1, row); } row++; if (this.iSpaceBetweenNewsAndBody > 0) { T.setHeight(row++, String.valueOf(this.iSpaceBetweenNewsAndBody)); } /////////// BODY PART ////////// if (this.showTeaserText && sTeaser.length() > 0 && !showAll) { if (this.showImages && this.showImagesInOverview) { T.add(getNewsImage(newsHelper, sHeadline), 1, row); //if (news.getImageId()!= -1 && showImages && // news.getIncludeImage()){ } T.add(teaser, 1, row++); needMoreButton = true; } else if (locText != null && !collection) { // counting news sNewsBody = locText.getBody(); sNewsBody = sNewsBody == null ? "" : sNewsBody; // shortening newstext if (!showAll && sNewsBody.length() >= this.numberOfLetters) { sNewsBody = sNewsBody.substring(0, this.numberOfLetters) + "..."; needMoreButton = true; } sNewsBody = TextSoap.formatText(sNewsBody); Text newsBody = new Text(sNewsBody); newsBody = setTextAttributes(newsBody); //////////// IMAGE PART /////////// if (this.showImages) { if (!showAll && this.showImagesInOverview) { T.add(getNewsImage(newsHelper, sHeadline), 1, row); } else if (showAll) { T.add(getNewsImage(newsHelper, sHeadline), 1, row); //if (news.getImageId()!= -1 && showImages && // news.getIncludeImage()){ } } T.add(newsBody, 1, row++); } ///////// BACK LINK //////////////// if (showAll) { if (this.iSpaceBetweenNewsAndBody > 0) { T.setHeight(row++, String.valueOf(this.iSpaceBetweenNewsAndBody)); } if (this.showBackButton) { T.add(getBackLink(this.backImage), 1, row); T.add(Text.getNonBrakingSpace(), 1, row); } if (this.showBackText) { Text tBack = new Text(this.iwrb.getLocalizedString("back", "Back")); tBack = setMoreAttributes(tBack); T.add(getBackLink(tBack), 1, row); } } ////////// MORE LINK /////////////// if (!showAll && needMoreButton) { if (this.iSpaceBetweenNewsAndBody > 0) { T.setHeight(row++, String.valueOf(this.iSpaceBetweenNewsAndBody)); } if (this.showMoreButton) { T.add(getMoreLink(this.moreImage, news.getID(), iwc), 1, row); T.add(Text.getNonBrakingSpace(), 1, row); } if (this.showMoreText) { Text tMore = new Text(this.iwrb.getLocalizedString("more", "More")); tMore = setMoreAttributes(tMore); T.add(getMoreLink(tMore, news.getID(), iwc), 1, row); } row++; } //////////// ADMIN PART ///////////////////// int ownerId = newsHelper.getContentHelper().getContent().getUserId(); if (this.hasEdit || this.hasEditExisting || (this.hasAdd && (ownerId == iwc.getUserId()))) { T.add(getNewsAdminPart(news, iwc), 1, row++); } if (!isLastNews) { if (this.iSpaceBetweenNews > 0) { T.setHeight(row++, String.valueOf(this.iSpaceBetweenNews)); } } } //////////// SINGLE LINE VIEW /////////////// // if single line view else { int headlineCol = 3; int dateCol = 1; if (this.dateAlign.toLowerCase().equals("right")) { headlineCol = 1; dateCol = 3; } if (this.alignWithHeadline) { if (this.headlineImage != null) { this.headlineImage.setHorizontalSpacing(3); T.add(this.headlineImage, dateCol, 1); } if (this.headlineImageURL != null) { T.add(this.iwb.getImage(this.headlineImageURL), dateCol, 1); } } if (this.showInfo) { T.setWidth(dateCol, 1, this.dateWidth); T.setVerticalAlignment(dateCol, 1, Table.VERTICAL_ALIGN_TOP); T.add(newsInfo, dateCol, 1); } if (this.spacerImage == null) { this.spacerImage = T.getTransparentCell(iwc); this.spacerImage.setWidth(this.iSpaceBetweenNewsAndBody); this.spacerImage.setHeight(1); } T.setAlignment(headlineCol, 1, "left"); T.setAlignment(4, 1, "right"); T.setWidth(headlineCol, 1, "100%"); T.setWidth(dateCol, 1, "45"); T.add(this.spacerImage, 2, 1); //T.add(Text.getNonBrakingSpace(2),2,1); if (this.headlineAsLink) { if (this.setHeadlineLinktToCategoryMainViewerPage) { T.add(getLinkToCategoryMainViewerPage(headLine, news, iwc), headlineCol, 1); } else { T.add(getMoreLink(headLine, news.getID(), iwc), headlineCol, 1); } } else { T.add(headLine, headlineCol, 1); } int ownerId = newsHelper.getContentHelper().getContent().getUserId(); if (this.hasEdit || this.hasEditExisting || (this.hasAdd && (ownerId == iwc.getUserId()))) { T.add(getNewsAdminPart(news, iwc), 4, 1); } if (this.iSpaceBetweenNews > 0 && !isLastNews) { T.setHeight(2, this.iSpaceBetweenNews); } } //T.setBorder(1); return T; } private Link getMoreLink(PresentationObject obj, int newsId, IWContext iwc) { Link moreLink = new Link(obj); if(this.moreStyleClass != null){ moreLink.setStyle(this.moreStyleClass); } else if (this.moreAndBackStyleClass != null) { moreLink.setStyle(this.moreAndBackStyleClass); } checkFromPage(moreLink); moreLink.addParameter(prmMore + getInstanceIDString(iwc), newsId); if (this.viewPageId > 0) { moreLink.setPage(this.viewPageId); } return moreLink; } private Text getLinkToCategoryMainViewerPage(Text obj, NwNews news, IWContext iwc) { Link categoryPageLink = new Link(obj); checkFromPage(categoryPageLink); try { String pageKey = news.getNewsCategory().getMetaData(METADATAKEY_CATEGORY_MAIN_VIEWER_PAGE); if (pageKey != null) { try { categoryPageLink.setPage(Integer.parseInt(pageKey)); } catch (NumberFormatException e) { System.out.println("NewsReader.getLinkToCategoryMainViewerPage - NumberFormatException parsing pageKey"); return obj; } } else { return obj; } } catch (NullPointerException e) { e.printStackTrace(); return obj; } return categoryPageLink; } private Link getBackLink(PresentationObject obj) { Link backLink = new Link(obj); if(this.backStyleClass != null){ backLink.setStyle(this.backStyleClass); } else if (this.moreAndBackStyleClass != null) { backLink.setStyle(this.moreAndBackStyleClass); } backLink.setAsBackLink(1); return backLink; } private PresentationObject getNewsAdminPart(NwNews news, IWContext iwc) { Table links = new Table(3, 1); Link newsEdit = new Link(this.iwb.getImage("/shared/edit.gif")); newsEdit.setWindowToOpen(NewsEditorWindow.class); newsEdit.addParameter(NewsEditorWindow.prmNwNewsId, news.getID()); newsEdit.addParameter(NewsEditorWindow.prmObjInstId, getICObjectInstanceID()); Link newsDelete = new Link(this.iwb.getImage("/shared/delete.gif")); newsDelete.setWindowToOpen(NewsEditorWindow.class); newsDelete.addParameter(NewsEditorWindow.prmDelete, news.getID()); //links.setAlignment(1,1,"left"); //links.setAlignment(2,1,"right"); links.setCellpadding(0); links.setCellspacing(0); links.add(newsEdit, 1, 1); links.add(links.getTransparentCell(iwc), 2, 1); links.add(newsDelete, 3, 1); return links; } private Text getInfoText(NwNews nwNews, Content content, Locale locale, boolean ifUseOnlyDates, boolean ifShowTime, boolean ifShowTimeFirst, boolean showUpdatedDate) { if (this.showInfo) { String categoryName = ""; try { if (this.showCategoryInSingleLineView) { categoryName = nwNews.getNewsCategory().getName(locale); } } catch (RuntimeException e) { System.out.println("Error in NewsReader#getInfoText(...)"); // } return new Text(NewsFormatter.getInfoText(nwNews, content, categoryName, locale, ifUseOnlyDates, ifShowTime, ifShowTimeFirst, showUpdatedDate)); } else { return null; } } public void main(IWContext iwc) throws Exception { this.hasEdit = iwc.hasEditPermission(this); this.hasAdd = iwc.hasPermission(AddPermisson, this); this.hasInfo = iwc.hasPermission(InfoPermission, this); this.hasEditExisting = iwc.hasPermission(EditExistingPermission, this); this.iwb = getBundle(iwc); this.iwrb = getResourceBundle(iwc); control(iwc); } public boolean deleteBlock(int instanceid) { return NewsBusiness.disconnectBlock(instanceid); } public void setConnectionAttributes(String attributeName, int attributeId) { this.attributeName = attributeName; this.attributeId = attributeId; } public void setConnectionAttributes(String attributeName, String attributeId) { this.attributeName = attributeName; this.attributeId = Integer.parseInt(attributeId); } /* * * This method uses static layouts from this class * */ public void setLayout(int LAYOUT) { this.iLayout = LAYOUT; } /** * * return a proxy for the main text. Use the standard set methods on this * object such as .setFontSize(1) etc. and it will set the property for all * texts. */ public Text getTextProxy() { return this.textProxy; } public Text getHeadlineProxy() { return this.headlineProxy; } public Text getInformationProxy() { return this.informationProxy; } public Text getMoreProxy() { return this.moreProxy; } public void setTextProxy(Text textProxy) { this.textProxy = textProxy; } public void setHeadlineProxy(Text headlineProxy) { this.headlineProxy = headlineProxy; } public void setInformationProxy(Text informationProxy) { this.informationProxy = informationProxy; } private Text setTextAttributes(Text realText) { Text tempText = (Text) this.textProxy.clone(); tempText.setText(realText.getText()); return tempText; } private Text setHeadlineAttributes(Text realText) { Text tempText = (Text) this.headlineProxy.clone(); tempText.setText(realText.getText()); return tempText; } private Text setInformationAttributes(Text realText) { Text tempText = (Text) this.informationProxy.clone(); tempText.setText(realText.getText()); return tempText; } private Text setMoreAttributes(Text realText) { Text tempText = (Text) this.moreProxy.clone(); tempText.setText(realText.getText()); return tempText; } public void setInformationFontSize(int size) { getInformationProxy().setFontSize(size); } public void setHeadlineFontSize(int size) { getHeadlineProxy().setFontSize(size); } public void setTextFontSize(int size) { getTextProxy().setFontSize(size); } public void setInformationFontColor(String color) { getInformationProxy().setFontColor(color); } public void setHeadlineFontColor(String color) { getHeadlineProxy().setFontColor(color); } public void setTextFontColor(String color) { getTextProxy().setFontColor(color); } public void setInformationFontFace(String face) { getInformationProxy().setFontFace(face); } public void setHeadlineFontFace(String face) { getHeadlineProxy().setFontFace(face); } public void setTextFontFontFace(String face) { getTextProxy().setFontFace(face); } public void setInformationFontStyle(String style) { getInformationProxy().setFontStyle(style); } public void setInformationFontStyleClass(String styleName) { getInformationProxy().removeMarkupAttribute("style"); getInformationProxy().setStyleClass(styleName); } public void setMoreAndBackFontStyle(String style) { getMoreProxy().setFontStyle(style); } public void setMoreAndBackFontStyleClass(String styleName) { getMoreProxy().removeMarkupAttribute("style"); getMoreProxy().setStyleClass(styleName); } public void setHeadlineFontStyle(String face) { getHeadlineProxy().setFontStyle(face); } public void setHeadlineStyleClass(String styleName) { getHeadlineProxy().removeMarkupAttribute("style"); getHeadlineProxy().setStyleClass(styleName); } public void setTextFontFontStyle(String face) { getTextProxy().setFontStyle(face); } public void setTextFontStyleClass(String styleName) { getTextProxy().removeMarkupAttribute("style"); getTextProxy().setStyleClass(styleName); } public void setNumberOfLetters(int numberOfLetters) { this.numberOfLetters = Math.abs(numberOfLetters); } public void setNumberOfHeadlineLetters(int numberOfLetters) { this.numberOfHeadlineLetters = Math.abs(numberOfLetters); } //debug this changes the number of news displayed..that is the date alone is // failing public void setNumberOfDisplayedNews(int numberOfDisplayedNews) { this.limitNumberOfNews = true; this.numberOfDisplayedNews = Math.abs(numberOfDisplayedNews); } public void setNumberOfCollectionNews(int numberOfCollectionNews) { this.limitNumberOfNews = true; this.numberOfCollectionNews = Math.abs(numberOfCollectionNews); } public void setToViewNews(boolean viewNews) { this.viewNews = viewNews; } public void setAdmin(boolean isAdmin) { this.hasEdit = isAdmin; } public void setWidth(int width) { setWidth(Integer.toString(width)); } public void setWidth(String width) { this.outerTableWidth = width; } public void setBackgroundColor(String color) { this.firstTableColor = color; } public void setZebraColored(String firstColor, String secondColor) { this.firstTableColor = firstColor; this.secondTableColor = secondColor; } public void setCellPadding(int cellpad) { this.cellPadding = cellpad; } public void setCellSpacing(int cellspace) { this.cellSpacing = cellspace; } public void showNewsCollectionButton(boolean showNewsCollectionButton) { this.showNewsCollectionButton = showNewsCollectionButton; } public void setNumberOfExpandedNews(int numberOfExpandedNews) { this.numberOfExpandedNews = Math.abs(numberOfExpandedNews); } public void setShowTeaser(boolean showTeaser) { this.showTeaserText = showTeaser; } public void setShowBackButton(boolean showButton) { this.showBackButton = showButton; } public void setShowBackText(boolean showText) { this.showBackText = showText; } public void setShowImages(boolean showImages) { this.showImages = showImages; } public void setShowImagesInOverview(boolean showImages) { this.showImagesInOverview = showImages; } public void setShowMoreButton(boolean showMoreButton) { this.showMoreButton = showMoreButton; } public void setShowMoreText(boolean moreText) { this.showMoreText = moreText; } public void setShowHeadlineImage(boolean showHeadlineImage) { this.showHeadlineImage = showHeadlineImage; } public void alignImageWithHeadline() { this.alignWithHeadline = true; } public void setHeadlineAsLink(boolean headlineAsLink) { this.headlineAsLink = headlineAsLink; this.showHeadlineImage = true; } public void setHeadlineImage(Image image) { this.headlineImage = image; this.alignWithHeadline = true; } public void setBackImage(Image image) { this.backImage = image; } public void setMoreImage(Image image) { this.moreImage = image; } public void setFirstImageWidth(int imageWith) { this.firstImageWidth = imageWith; } public void setImageWidth(int imagewidth) { this.ImageWidth = imagewidth; } public void setCollectionImage(Image image) { this.collectionImage = image; } public void setHeadlineImageURL(String headlineImageURL) { this.headlineImageURL = headlineImageURL; this.alignWithHeadline = true; } public void setShowOnlyDates(boolean showOnlyDates) { this.showOnlyDates = showOnlyDates; } public void setDateAlign(String alignment) { this.dateAlign = alignment; } public void setViewPage(com.idega.core.builder.data.ICPage page) { this.viewPageId = page.getID(); } public void setShowTime(boolean showTime) { this.showTime = this.showOnlyDates; } public void setSpaceBetweenNews(int pixels) { this.iSpaceBetweenNews = pixels; } public void setSpaceBetweenTitleAndBody(int pixels) { this.iSpaceBetweenNewsAndBody = pixels; } public void setShowTimeFirst(boolean showTimeFirst) { this.showTimeFirst = showTimeFirst; } public void setShowUpdatedDate(boolean showUpdatedDate) { this.showUpdatedDate = showUpdatedDate; } public void setShowInfo(boolean showInfo) { this.showInfo = showInfo; } public void setShowCollectionText(boolean showText) { this.showCollectionText = showText; } public String getBundleIdentifier() { return IW_BUNDLE_IDENTIFIER; } public String getCacheKey() { return CACHE_KEY; } public String getObjectAlignment() { return this.sObjectAlign; } public void setObjectAligment(String sAlign) { this.sObjectAlign = sAlign; } public void addObjectBetween(PresentationObject object, int spaceNumber) { if (this.objectsBetween == null) { this.objectsBetween = new Hashtable(); } this.objectsBetween.put(new Integer(spaceNumber), object); } // overriding super class method public void add(PresentationObject MO) { addObjectBetween(MO, this.iSpaceBetween); if (this.iLayout == NEWS_SITE_LAYOUT) { this.iSpaceBetween += 2; } else { this.iSpaceBetween++; } } public synchronized Object clone() { NewsReader obj = null; try { obj = (NewsReader) super.clone(); // integers : obj.numberOfLetters = this.numberOfLetters; obj.numberOfHeadlineLetters = this.numberOfHeadlineLetters; obj.numberOfDisplayedNews = this.numberOfDisplayedNews; obj.numberOfExpandedNews = this.numberOfExpandedNews; obj.numberOfCollectionNews = this.numberOfCollectionNews; obj.iSpaceBetween = this.iSpaceBetween; obj.cellPadding = this.cellPadding; obj.cellSpacing = this.cellSpacing; obj.viewPageId = this.viewPageId; obj.textSize = this.textSize; // booleans: obj.showBackButton = this.showBackButton; obj.showAll = this.showAll; obj.showImages = this.showImages; obj.showOnlyDates = this.showOnlyDates; obj.showTime = this.showTime; obj.showInfo = this.showInfo; obj.showTimeFirst = this.showTimeFirst; obj.headlineAsLink = this.headlineAsLink; obj.setHeadlineLinktToCategoryMainViewerPage = this.setHeadlineLinktToCategoryMainViewerPage; obj.showHeadlineImage = this.showHeadlineImage; obj.showMoreButton = this.showMoreButton; obj.alignWithHeadline = this.alignWithHeadline; obj.limitNumberOfNews = this.limitNumberOfNews; obj.enableDelete = this.enableDelete; obj.viewNews = this.viewNews; obj.newobjinst = this.newobjinst; obj.showBackText = this.showBackText; obj.showMoreText = this.showMoreText; obj.showTeaserText = this.showTeaserText; // Strings : obj.outerTableWidth = this.outerTableWidth; obj.sObjectAlign = this.sObjectAlign; obj.headlineImageURL = this.headlineImageURL; obj.dateAlign = this.dateAlign; if (this.headlineImage != null) { obj.headlineImage = this.headlineImage; } if (this.backImage != null) { obj.backImage = this.backImage; } if (this.moreImage != null) { obj.moreImage = this.moreImage; } if (this.collectionImage != null) { obj.collectionImage = this.collectionImage; } // Nullable : if (this.firstTableColor != null) { obj.firstTableColor = this.firstTableColor; } if (this.secondTableColor != null) { obj.secondTableColor = this.secondTableColor; } if (this.objectsBetween != null) { obj.objectsBetween = this.objectsBetween; } if (this.spacerImage != null) { obj.spacerImage = this.spacerImage; } // Text proxies : obj.textProxy = this.textProxy; obj.headlineProxy = this.headlineProxy; obj.informationProxy = this.informationProxy; } catch (Exception ex) { ex.printStackTrace(System.err); } return obj; } /**@todo finish this for all states**/ protected String getCacheState(IWContext iwc, String cacheStatePrefix) { String returnString = ""; String parName = prmMore + getInstanceIDString(iwc); if (iwc.isParameterSet(parName)) { returnString += parName+"="+iwc.getParameter(parName); } else { if (this.viewNews) { if(this.visibleNewsRangeStart>0) { Enumeration enumer = iwc.getParameterNames(); while (enumer.hasMoreElements()) { String pName = (String) enumer.nextElement(); if(pName.startsWith(prmMore)) { returnString += pName+"="+iwc.getParameter(pName); break; } } } } } parName = prmListCategory + getInstanceIDString(iwc); if (iwc.isParameterSet(parName)) { returnString += parName + "=" + iwc.getParameter(parName); } parName = prmNewsCategoryId; if (iwc.isParameterSet(parName)) { returnString += parName + "=" + iwc.getParameter(parName); parName = prmCollection + getInstanceIDString(iwc); if (iwc.isParameterSet(parName)) { returnString += parName + "=" + iwc.getParameter(parName); } } return cacheStatePrefix + returnString; } private PresentationObject getNewsImage(NewsHelper newsHelper, String headline) { List files = newsHelper.getContentHelper().getFiles(); if (files != null && !files.isEmpty()) { try { //Table imageTable = new Table(1, 2); ICFile imagefile = (ICFile) files.get(0); int imid = ((Integer) imagefile.getPrimaryKey()).intValue(); String att = imagefile.getMetaData(NewsEditorWindow.imageAttributeKey); Image newsImage = new Image(imid); if (att != null) { newsImage.addMarkupAttributes(getAttributeMap(att)); } else { newsImage.setAlignment("right"); newsImage.setBorder(this.ImageBorder); } if (newsImage.getWidth() == null || newsImage.getWidth().length() == 0) { newsImage.setMaxImageWidth(this.ImageWidth); } Link L = new Link(newsImage); L.addParameter(ImageWindow.prmImageId, imid); if (this.addImageInfo) { L.addParameter(ImageWindow.prmInfo, TextSoap.convertSpecialCharacters(headline)); } L.setWindowToOpen(ImageWindow.class); return L; } catch (Exception ex) { ex.printStackTrace(); } } return null; } /** * @param addImageInfo */ public void setShowImageInfo(boolean showImageInfo) { this.addImageInfo = showImageInfo; } public void setVisibleNewsRange(int start, int end) { if (end > 0 && start > end) { this.visibleNewsRangeStart = end; this.visibleNewsRangeEnd = start; } else { this.visibleNewsRangeStart = start; this.visibleNewsRangeEnd = (end < 1) ? Integer.MAX_VALUE : end; } } /** * @param visibleNewsRangeEnd * The visibleNewsRangeEnd to set. */ public void setVisibleNewsRangeEnd(int visibleNewsRangeEnd) { this.visibleNewsRangeEnd = visibleNewsRangeEnd; } /** * @param visibleNewsRangeStart * The visibleNewsRangeStart to set. */ public void setVisibleNewsRangeStart(int visibleNewsRangeStart) { this.visibleNewsRangeStart = visibleNewsRangeStart; } /** * @return Returns the setHeadlineLinktToCategoryMainViewerPage. */ public boolean isHeadlineLinktSetToCategoryMainViewerPage() { return this.setHeadlineLinktToCategoryMainViewerPage; } /** * @param value * The setHeadlineLinktToCategoryMainViewerPage to set. */ public void setHeadlineLinktToCategoryMainViewerPage(boolean value) { this.setHeadlineLinktToCategoryMainViewerPage = value; } /** * @param value * The showCategoryInSingleLineView to set. */ public void setToShowCategoryInSingleLineView(boolean value) { this.showCategoryInSingleLineView = value; } /** * @param dateWidth The dateWidth to set. */ public void setDateWidth(int dateWidth) { this.dateWidth = dateWidth; } /** * @param moreAndBackStyleClass The moreAndBackStyleClass to set. */ public void setMoreAndBackStyleClass(String moreAndBackStyleClass) { this.moreAndBackStyleClass = moreAndBackStyleClass; } /** * @return Returns the collectionLinkStyleClass. */ public String getCollectionLinkStyleClass() { return this.CollectionLinkStyleClass; } /** * @param collectionLinkStyleClass The collectionLinkStyleClass to set. */ public void setCollectionLinkStyleClass(String collectionLinkStyleClass) { this.CollectionLinkStyleClass = collectionLinkStyleClass; } /** * @return Returns the backStyleClass. */ public String getBackStyleClass() { return this.backStyleClass; } /** * @param backStyleClass The backStyleClass to set. */ public void setBackStyleClass(String backStyleClass) { this.backStyleClass = backStyleClass; } /** * @return Returns the moreStyleClass. */ public String getMoreStyleClass() { return this.moreStyleClass; } /** * @param moreStyleClass The moreStyleClass to set. */ public void setMoreStyleClass(String moreStyleClass) { this.moreStyleClass = moreStyleClass; } }