All pastes #43222 Raw Edit

user

public java v1 · immutable
#43222 ·published 2006-02-26 15:05 UTC
rendered paste body
/*   **********************************************************************  ** **   Copyright notice                                                       ** **                                                                          ** **   (c) 2003-2005 RSSOwl Development Team                                  ** **   http://www.rssowl.org/                                                 ** **                                                                          ** **   All rights reserved                                                    ** **                                                                          ** **   This program and the accompanying materials are made available under   ** **   the terms of the Common Public License v1.0 which accompanies this     ** **   distribution, and is available at:                                     ** **   http://www.rssowl.org/legal/cpl-v10.html                               ** **                                                                          ** **   A copy is found in the file cpl-v10.html and important notices to the  ** **   license from the team is found in the textfile LICENSE.txt distributed ** **   in this package.                                                       ** **                                                                          ** **   This copyright notice MUST APPEAR in all copies of the file!           ** **                                                                          ** **   Contributors:                                                          ** **     RSSOwl - initial API and implementation (bpasero@rssowl.org)         ** **                                                                          ** **  **********************************************************************  */package net.sourceforge.rssowl.controller;import net.sourceforge.rssowl.controller.dialog.PreferencesDialog;import net.sourceforge.rssowl.controller.panel.BrowserPanel;import net.sourceforge.rssowl.controller.thread.AmphetaRateThread;import net.sourceforge.rssowl.model.Enclosure;import net.sourceforge.rssowl.model.NewsItem;import net.sourceforge.rssowl.util.GlobalSettings;import net.sourceforge.rssowl.util.i18n.ITranslatable;import net.sourceforge.rssowl.util.shop.BrowserShop;import net.sourceforge.rssowl.util.shop.FontShop;import net.sourceforge.rssowl.util.shop.LayoutDataShop;import net.sourceforge.rssowl.util.shop.LayoutShop;import net.sourceforge.rssowl.util.shop.PaintShop;import net.sourceforge.rssowl.util.shop.RegExShop;import net.sourceforge.rssowl.util.shop.StringShop;import net.sourceforge.rssowl.util.shop.URLShop;import net.sourceforge.rssowl.util.shop.WidgetShop;import net.sourceforge.rssowl.util.shop.XMLShop;import org.eclipse.swt.SWT;import org.eclipse.swt.SWTError;import org.eclipse.swt.custom.SashForm;import org.eclipse.swt.custom.StyledText;import org.eclipse.swt.dnd.DND;import org.eclipse.swt.dnd.DragSource;import org.eclipse.swt.dnd.DragSourceAdapter;import org.eclipse.swt.dnd.DragSourceEvent;import org.eclipse.swt.dnd.TextTransfer;import org.eclipse.swt.dnd.Transfer;import org.eclipse.swt.events.DisposeEvent;import org.eclipse.swt.events.DisposeListener;import org.eclipse.swt.events.MenuAdapter;import org.eclipse.swt.events.MenuEvent;import org.eclipse.swt.events.MouseAdapter;import org.eclipse.swt.events.MouseEvent;import org.eclipse.swt.events.MouseMoveListener;import org.eclipse.swt.events.SelectionAdapter;import org.eclipse.swt.events.SelectionEvent;import org.eclipse.swt.graphics.Point;import org.eclipse.swt.graphics.Rectangle;import org.eclipse.swt.layout.FillLayout;import org.eclipse.swt.layout.FormLayout;import org.eclipse.swt.layout.GridData;import org.eclipse.swt.layout.GridLayout;import org.eclipse.swt.widgets.Composite;import org.eclipse.swt.widgets.Display;import org.eclipse.swt.widgets.Event;import org.eclipse.swt.widgets.Listener;import org.eclipse.swt.widgets.Menu;import org.eclipse.swt.widgets.MenuItem;import org.eclipse.swt.widgets.Shell;import org.eclipse.swt.widgets.ToolBar;import org.eclipse.swt.widgets.ToolItem;import org.eclipse.ui.forms.events.HyperlinkAdapter;import org.eclipse.ui.forms.events.HyperlinkEvent;import org.eclipse.ui.forms.widgets.Hyperlink;import org.jdom.Text;import org.eclipse.swt.events.MouseListener;import org.eclipse.swt.program.Program;import org.eclipse.swt.widgets.Button;import org.eclipse.swt.widgets.Control;import java.util.Iterator;import java.util.Vector;import java.util.Hashtable;import java.util.Enumeration;import java.util.Map;/** * This is the ViewForm where a newsitem is displayed with Title, URL to the * news and the description. *  * @author <a href="mailto:bpasero@rssowl.org">Benjamin Pasero </a> * @version 1.2 */public class NewsText implements ITranslatable, IFontChangeable {  private BrowserPanel browserPanel;  private SashForm contentSash;  private MenuItem copyItemUrl;  private Composite descriptionHolder;  private boolean isShowingNews;  private Menu linkMenu;  private Composite newsContentHolder;  private ViewForm newsContentViewForm;  private Composite newsContentViewFormHeader;  private Composite newsTextHolder;  private MenuItem openExternalItem;  private MenuItem printNews;  private MenuItem rateBad;  private MenuItem rateFantastic;  private MenuItem rateGood;  private MenuItem rateModerate;  private MenuItem rateVeryBad;  private boolean requiresUpdate;  private MenuItem selectAllItem;  private MenuItem useBrowserForNewsText;  MenuItem copyItem;  Display display;  EventManager eventManager;  boolean isReset;  int lastRate;  StyledText newsText;  Menu newsTextMenu;  StyledText newsTextTitle;  StyledText rcTitle;  ToolBar newsTextToolBar;  Hyperlink newsTextUrl;  StyledText rcLocalFiles;  Button playPodcast;  GridLayout rcLayout;  GridData rcData;  MenuItem openInBrowserItem;  Composite rateComposite;  Menu rateDropdown;  ToolItem rateToolItem;  NewsItem rssNewsItem;  GUI rssOwlGui;  Shell shell;  Composite urlTitleHolder;  Composite rcHolder;  int x;  int y;  /**   * Instantiate a new NewsText to display a newsitem   *    * @param display The display   * @param shell The shell   * @param contentSash The Sashform where to add the ViewForm   * @param rssOwlGui Access some methods of the main controller   * @param eventManager The event manager   */  public NewsText(Display display, Shell shell, SashForm contentSash, GUI rssOwlGui, EventManager eventManager) {    this.display = display;    this.shell = shell;    this.contentSash = contentSash;    this.rssOwlGui = rssOwlGui;    this.eventManager = eventManager;    isReset = true;    isShowingNews = false;    requiresUpdate = true;    lastRate = AmphetaRateThread.RATE_MODERATE;    initComponents();  }  /**   * Get the BrowserPanel of the Newstext panel in case internal browser view is   * activated for newstext   *    * @return BrowserPanel The browserpanel for the newstext   */  public BrowserPanel getBrowserPanel() {    return browserPanel;  }  /**   * Let other objects access this controll (for example to focus on it)   *    * @return NewsTextTitle StyledText   */  public StyledText getNewsTextTitle() {    return newsTextTitle;  }  /**   * Get the currently viewed newsitem's text to print.   *    * @return String Text to print   */  public String getPrintableNewstext() {    String printableText = "";    /** Create printable description */    if (rssNewsItem != null)      printableText = rssNewsItem.toPrintable();    return printableText;  }  /**   * Explicitly marks the newstext as required to update. This is called when   * the user has clicked into a news.   */  public void setRequiresUpdate() {    requiresUpdate = true;  }  /**   * @see net.sourceforge.rssowl.controller.IFontChangeable#updateFonts()   */  public void updateFonts() {    /** Update StyledText font */    if (WidgetShop.isset(newsText)) {      newsText.setFont(FontShop.textFont);    }    /** Update Browser Font */    else if (browserPanel != null && rssNewsItem != null && WidgetShop.isset(browserPanel.getBrowser())) {      rssNewsItem.setRequiresViewUpdate(true);      displayNews(rssNewsItem);    }    newsTextTitle.setFont(FontShop.textBoldFont);    newsTextUrl.setFont(FontShop.textFont);  }  /** Update all controlls text with i18n */  public void updateI18N() {    rateFantastic.setText(GUI.i18n.getTranslation("RATE_FANTASTIC"));    rateGood.setText(GUI.i18n.getTranslation("RATE_GOOD"));    rateModerate.setText(GUI.i18n.getTranslation("RATE_MODERATE"));    rateBad.setText(GUI.i18n.getTranslation("RATE_BAD"));    rateVeryBad.setText(GUI.i18n.getTranslation("RATE_VERY_BAD"));    rateToolItem.setToolTipText(GUI.i18n.getTranslation("TOOLTIP_RATE"));    copyItemUrl.setText(GUI.i18n.getTranslation("POP_COPY"));    if (openExternalItem != null)      openExternalItem.setText(GUI.i18n.getTranslation("POP_OPEN_EXTERN"));    /** Init the Mnemonics */    MenuManager.initMnemonics(linkMenu);    /** Update non-browser controlls */    if (!GlobalSettings.useBrowserForNewsText) {      /** Only update if newstext was created before and was not disposed */      if (WidgetShop.isset(newsText)) {        updateAccelerators();        openInBrowserItem.setText(GUI.i18n.getTranslation("POP_OPEN_IN_BROWSER"));        /** Init the Mnemonics */        MenuManager.initMnemonics(newsTextMenu);      }    }  }  /** Update color of Link Label */  public void updateLinkColor() {    newsTextUrl.setForeground(PaintShop.linkColor);  }  /**   * Create the browser panel to display newstext in the internal browser   *    * @param onStartup If TRUE this method is called on startup of RSSOwl   */  private void createBrowserPanel(boolean onStartup) {    try {      browserPanel = new BrowserPanel(rssOwlGui, descriptionHolder, false);      browserPanel.getBrowserPanel().setLayoutData(LayoutDataShop.createFormData(0, 0, 0, 0));    }    /** If OS fails to build internal browser, dont use it! */    catch (SWTError e) {      GUI.logger.log("displayNewsInBrowser()", e);      /** Set browser to null explicitly */      if (browserPanel != null) {        browserPanel.dispose();        browserPanel = null;      }      /** Display the news in the styled text */      GlobalSettings.useBrowserForNewsText = false;      /** Reset MenuItem and ToolItem */      rssOwlGui.getRSSOwlMenu().setUseBrowserForNewsText(GlobalSettings.useBrowserForNewsText);      /** Show info to the user if not called from startup */      if (!onStartup)        MessageBoxFactory.showError(shell, BrowserShop.createBrowserError(e));      /** Create styled text and display news */      createStyledText();      /** Recreate the Newstext using StyledText */      rebuildNewsText();    }  }  /**   * Create the StyledText to display the newstext. This method is called   * whenever the user switches from the internal browser view to the StyledText   * view.   */  private void createStyledText() {    /** StyledText to display the news description */    newsText = new StyledText(descriptionHolder, SWT.READ_ONLY | SWT.WRAP | SWT.V_SCROLL);    newsText.setLayoutData(LayoutDataShop.createFormData(8, 0, 8, -1));    newsText.setFont(FontShop.textFont);    newsText.setBackground(display.getSystemColor(SWT.COLOR_WHITE));    newsText.setCursor(display.getSystemCursor(SWT.CURSOR_IBEAM));    newsText.setCaret(null);    /** Remove selection from Title and URL if selected */    newsText.addSelectionListener(new SelectionAdapter() {      public void widgetSelected(SelectionEvent e) {        if (newsTextTitle != null)          newsTextTitle.setSelection(0);      }    });    /** Listen for the mouseposition and check if the mouse is over an URL * */    newsText.addMouseMoveListener(new MouseMoveListener() {      public void mouseMove(MouseEvent e) {        onMouseMove(e);      }    });    /** Handle Mouse Up Evnt */    newsText.addMouseListener(new MouseAdapter() {      public void mouseUp(MouseEvent e) {        onMouseUp(e);      }    });    /** A popupmenu for the StyledText */    newsTextMenu = new Menu(newsText);    /** Display newstext in internal browser if possible */    if (GlobalSettings.useInternalBrowser()) {      useBrowserForNewsText = new MenuItem(newsTextMenu, SWT.NONE);      if (!GlobalSettings.isMac()) {        useBrowserForNewsText.setImage(PaintShop.loadImage("/img/icons/browserview.gif"));        useBrowserForNewsText.addDisposeListener(DisposeListenerImpl.getInstance());      }      useBrowserForNewsText.addSelectionListener(new SelectionAdapter() {        public void widgetSelected(SelectionEvent e) {          eventManager.actionSetBrowserView(true);        }      });      /** Separator */      new MenuItem(newsTextMenu, SWT.SEPARATOR);    }    /** Copy selection */    copyItem = new MenuItem(newsTextMenu, SWT.NONE);    if (!GlobalSettings.isMac())      copyItem.setImage(PaintShop.iconCopy);    copyItem.addSelectionListener(new SelectionAdapter() {      /** Copy selection to clipboard */      public void widgetSelected(SelectionEvent e) {        if (!newsText.getSelectionText().equals("")) {          newsText.copy();        }      }    });    /** Select all text of the StyledText */    selectAllItem = new MenuItem(newsTextMenu, SWT.NONE);    selectAllItem.addSelectionListener(new SelectionAdapter() {      /** Selection the whole text */      public void widgetSelected(SelectionEvent e) {        newsText.selectAll();      }    });    /** Separator */    new MenuItem(newsTextMenu, SWT.SEPARATOR);    /** Printing is only supported on Windows and Mac */    if (GlobalSettings.usePrinting()) {      /** Print news */      printNews = new MenuItem(newsTextMenu, SWT.NONE);      if (!GlobalSettings.isMac())        printNews.setImage(PaintShop.iconPrint);      printNews.addSelectionListener(new SelectionAdapter() {        /** Print news */        public void widgetSelected(SelectionEvent e) {          eventManager.actionPrintNews();        }      });      /** Separator */      new MenuItem(newsTextMenu, SWT.SEPARATOR);    }    /** Open the selected text in the browser */    openInBrowserItem = new MenuItem(newsTextMenu, SWT.NONE);    openInBrowserItem.setText(GUI.i18n.getTranslation("POP_OPEN_IN_BROWSER"));    openInBrowserItem.addSelectionListener(new SelectionAdapter() {      /** Open the selection in browser */      public void widgetSelected(SelectionEvent e) {        eventManager.actionOpenURL(newsText.getSelectionText());      }    });    /** Dynamically Enable / Disable MenuItems */    newsTextMenu.addMenuListener(new MenuAdapter() {      public void menuShown(MenuEvent e) {        /** First check Widget */        if (!WidgetShop.isset(newsText))          return;        /** User has selected text */        if (newsText.getSelectionText().equals("")) {          copyItem.setEnabled(false);          openInBrowserItem.setEnabled(false);        }        /** User has not selected text */        else {          copyItem.setEnabled(true);          openInBrowserItem.setEnabled(true);        }      }    });    /** Set Accelerators */    updateAccelerators();    /** Set Mnemonics */    MenuManager.initMnemonics(newsTextMenu);    /** Apply menu */    newsText.setMenu(newsTextMenu);  }  /**   * Display news in the ViewForm   *    * @param rssNewsItem The newsitem to display   */  private void displayNews(NewsItem rssNewsItem) {    /** Return in case the news is already showing and an update is not req. */    if (!requiresUpdate && isShowingNews(rssNewsItem))      return;    /** This is a new news to display or no news was displayed */    this.rssNewsItem = rssNewsItem;    /** Update flags */    isShowingNews = true;    requiresUpdate = false;    this.rssNewsItem.setRequiresViewUpdate(false);    /** Tell MenuManager that the newstext is filled */    MenuManager.notifyState(MenuManager.NEWS_TEXT_FILLED);    /** Get Link */    String link = rssNewsItem.getLink();    if (!StringShop.isset(link) && StringShop.isset(rssNewsItem.getGuid()) && RegExShop.isValidURL(rssNewsItem.getGuid()))      link = rssNewsItem.getGuid();    /** If this newsItem has no description and the user chose to directOpen */    if (!StringShop.isset(rssNewsItem.getDescription()) && GlobalSettings.directOpenNews && StringShop.isset(link))      displayNewsLinkInBrowser(link);    /** User chose to open each news in Browser */    else if (GlobalSettings.directOpenEachNews && StringShop.isset(link))      displayNewsLinkInBrowser(link);    /** Display news in the internal browser */    else if (GlobalSettings.useBrowserForNewsText)      displayNewsInBrowser();    /** Display news in a StyledText */    else      displayNewsInStyledText();    /** Show Rate Dropdown */    rateComposite.setVisible(true);    /** Layout components */    descriptionHolder.layout();  }  /**   * Display the selected news in the internal browser. This will display Title   * and URL of the news as usual and show the description (plus possible   * enclosures, comments, source) in the internal browser.   */  private void displayNewsInBrowser() {    /** Display title and link of the news */    displayNewsMetaInfo();    /** Create the browserPanel if not yet done */    if (browserPanel == null)      createBrowserPanel(false);    /** Let the browser display the rest of the news */    if (browserPanel != null)      browserPanel.displayNews(rssNewsItem);    /** Browser creation failed, display news in StyledText */    else      displayNews(rssNewsItem);  }  /**   * Display selected news in a StyledText   */  private void displayNewsInStyledText() {    /** Create the StyledText if not yet done */    if (newsText == null || newsText.isDisposed())      createStyledText();    /** Display title and link of the news */    displayNewsMetaInfo();    /** Update Links in Copy Menu */    int items = newsTextMenu.getItemCount();    int linksBegin = 4 + ((GlobalSettings.useInternalBrowser()) ? 2 : 0) + ((GlobalSettings.usePrinting()) ? 2 : 0);    for (int i = linksBegin; i < items; i++)      newsTextMenu.getItem(linksBegin).dispose();    /** Description of the news */    if (StringShop.isset(rssNewsItem.getDescription())) {      newsText.setText(XMLShop.stripSimpleHTMLTags(Text.normalizeString(rssNewsItem.getDescription())));      /** Add the Links from the description to the popupmenu */      if (rssNewsItem.getLinkList() != null && rssNewsItem.getLinkList().size() > 0) {        /** Separator */        new MenuItem(newsTextMenu, SWT.SEPARATOR);        Iterator linkListIt = rssNewsItem.getLinkList().iterator();        /** Foreach link in the text */        while (linkListIt.hasNext()) {          /** Add a menuitem foreach URL from the text */          final MenuItem linkFromText = new MenuItem(newsTextMenu, SWT.NONE);          linkFromText.setText((String) linkListIt.next());          if (!GlobalSettings.isMac()) {            linkFromText.setImage(PaintShop.iconWorld);          }          linkFromText.addSelectionListener(new SelectionAdapter() {            /** URL openes after click on it */            public void widgetSelected(SelectionEvent e) {              eventManager.actionOpenURL(linkFromText.getText(), linkFromText.getText().equals(rssNewsItem.getOrigurl()));            }          });        }      }    }    /** Selected news has no description */    else {      newsText.setText(GUI.i18n.getTranslation("NEWS_NO_DESCRIPTION"));    }    /** Vector containing all StyleRanges for the Newstext */    Vector styleRanges = new Vector();    /** Paint clickable links in selected link-color */    if (rssNewsItem.getLinkList() != null)      styleRanges.addAll(WidgetShop.calculateStyleRanges(newsText, new Vector(rssNewsItem.getLinkList()), PaintShop.linkColor, display.getSystemColor(SWT.COLOR_WHITE), SWT.NORMAL, false, true));    /** Highlight words if serch was performed */    if (rssNewsItem.getHighlightWords() != null)      styleRanges.addAll(WidgetShop.calculateStyleRanges(newsText, rssNewsItem.getHighlightWords(), display.getSystemColor(SWT.COLOR_BLACK), PaintShop.syntaxHighlightColor, 0, rssNewsItem.isSearchCaseSensitive(), false));    /** Enclosures */    if (rssNewsItem.getEnclosures() != null && rssNewsItem.getEnclosures().size() > 0) {      String enclosureTitle = "\n\n" + GUI.i18n.getTranslation("NEWS_ITEM_INFO_ENCLOSURE") + ":\n";      newsText.append(enclosureTitle);      /** Highlight */      styleRanges.addAll(WidgetShop.calculateStyleRanges(newsText, StringShop.toVector(new String[] { GUI.i18n.getTranslation("NEWS_ITEM_INFO_ENCLOSURE") + ":" }), display.getSystemColor(SWT.COLOR_BLACK), display.getSystemColor(SWT.COLOR_WHITE), SWT.BOLD, true, false));      /** Give out all enclosures */      for (int a = 0; a < rssNewsItem.getEnclosures().size(); a++) {        Enclosure enclosure = (Enclosure) rssNewsItem.getEnclosures().get(a);        newsText.append("\n" + enclosure.getUrl() + " (" + enclosure.getType() + " / " + enclosure.getLength(true) + ")");      }    }    /** Source of the news */    if (rssNewsItem.getSource() != null) {      String source = "\n\n" + GUI.i18n.getTranslation("NEWS_ITEM_INFO_SOURCE") + ":  " + rssNewsItem.getSource();      newsText.append(source);      /** Highlight */      styleRanges.addAll(WidgetShop.calculateStyleRanges(newsText, StringShop.toVector(new String[] { GUI.i18n.getTranslation("NEWS_ITEM_INFO_SOURCE") + ":" }), display.getSystemColor(SWT.COLOR_BLACK), display.getSystemColor(SWT.COLOR_WHITE), SWT.BOLD, true, false));    }    /** Comments to this news */    if (rssNewsItem.getComments() != null && rssNewsItem.getComments().size() > 0) {      newsText.append("\n\n" + GUI.i18n.getTranslation("NEWS_ITEM_INFO_COMMENTS") + ":\n");      /** Highlight */      styleRanges.addAll(WidgetShop.calculateStyleRanges(newsText, StringShop.toVector(new String[] { GUI.i18n.getTranslation("NEWS_ITEM_INFO_COMMENTS") + ":" }), display.getSystemColor(SWT.COLOR_BLACK), display.getSystemColor(SWT.COLOR_WHITE), SWT.BOLD, true, false));      /** Give out all comments */      for (int a = 0; a < rssNewsItem.getComments().size(); a++)        if (rssNewsItem.getComments().get(a) != null && !rssNewsItem.getComments().get(a).equals(""))          newsText.append("\n" + rssNewsItem.getComments().get(a));    }    /** Add StyleRanges */    WidgetShop.highlightText(newsText, styleRanges);  }  /**   * Display the Link of the News using the internal browser.   *    * @param link The valid link of the Newsitem to display.   */  private void displayNewsLinkInBrowser(String link) {    /** Show the link inside the newstext panel */    if (GlobalSettings.useBrowserForNewsText) {      /** Display title and link of the news */      displayNewsMetaInfo();      /** Create the browserPanel if not yet done */      if (browserPanel == null)        createBrowserPanel(false);      /** Let the browser display the rest of the news */      if (browserPanel != null) {        /** Reset to empty page */        browserPanel.getBrowser().setUrl(URLShop.ABOUT_BLANK);        /** Set visibility */        if (!browserPanel.getBrowserPanel().isVisible())          browserPanel.getBrowserPanel().setVisible(true);        /** Load Link */        browserPanel.getBrowser().setUrl(link);      }      /** Browser creation failed, display news in StyledText */      else        displayNews(rssNewsItem);    }    /** Show the link inside a new Tab or external */    else {      eventManager.actionOpenURL(link);    }  }  /**   * Display Title and link of the news   */  private void displayNewsMetaInfo() {    /** Title of the news */    if (rssNewsItem.getTitle() != null) {      newsTextTitle.setText(rssNewsItem.getTitle());      /** Highlight words if serch was performed */      if (rssNewsItem.getHighlightWords() != null)        WidgetShop.highlightText(newsTextTitle, rssNewsItem.getHighlightWords(), display.getSystemColor(SWT.COLOR_BLACK), PaintShop.syntaxHighlightColor, 0, rssNewsItem.isSearchCaseSensitive(), false);    }    /** Title somehow not given */    else {      newsTextTitle.setText(GUI.i18n.getTranslation("NO_TITLE"));    }    /** Link of the news */    if (rssNewsItem.getLink() != null)      newsTextUrl.setText(rssNewsItem.getLink());    /** Try the guid as link */    else if (rssNewsItem.getGuid() != null && RegExShop.isValidURL(rssNewsItem.getGuid()))      newsTextUrl.setText(rssNewsItem.getGuid());    /** Clear newsTextUrl in any other case */    else      newsTextUrl.setText("");    /** Remove tooltip if URL is not given */    if (newsTextUrl.getText().equals("")) {      newsTextUrl.setToolTipText(null);      newsTextUrl.setVisible(false);    }    /** Set tooltip and cursor if URL is given */    else {      newsTextUrl.setVisible(true);    }        /** Set RESTcast local files */    Hashtable<String, Hashtable> rcFiles = rssNewsItem.getRcFilesLocal();    if(!rcFiles.isEmpty())	{    	Composite parent = rcHolder.getParent();    	rcHolder.dispose();    	parent.redraw();    	createRcLocalFiles();                Iterator i = rcFiles.entrySet().iterator();        while(i.hasNext())	{        	Map.Entry me = (Map.Entry) i.next();        	//String key = (String) me.getKey();        	//System.out.println(key);        	        	Hashtable<String, String> props = (Hashtable) me.getValue();        	if(props.get("downloaded") == "true")	{        		addFile(props.get("name"), props.get("location"));        		//System.out.println(props.get("name"));        		//rcLocalFiles.setText(props.get("name"));        		//System.out.println(rcLocalFiles.getText());        		//rcLocalFiles.setVisible(true);        		//rcLocalFiles.setToolTipText("hello");        		//rcTitle.setText("mine");        		//rcLocalFiles.getParent().redraw();        	}        	        }        // unhide RESTcast files        rcData.exclude = false;    	rcHolder.setVisible(true);    	rcHolder.getParent().redraw();    	rcHolder.getParent().update();        System.out.println("set visible");    }    else	{    	Composite parent = rcHolder.getParent();    	rcHolder.dispose();    	parent.redraw();    	createRcLocalFiles();    }        /*    Enumeration keys = rcFiles.keys();    while(keys.hasMoreElements())	{    	String key = (String) keys.nextElement();    	System.out.println("here " + key);        rcLocalFiles.setText("--"+ key);    	System.out.println("here2 " + key);            	//newsTextUrl.setText(key);    }    //}    */                    /** Layout the ViewForm */    newsContentViewForm.layout(false);    /** Show AmphetaRate status label */    String rateLabelMsg = "";    if (AmphetaRateThread.ratedNews.size() > 0) {      Integer rating = (Integer) AmphetaRateThread.ratedNews.get(rssNewsItem.toAmphetaRateURL());      /** News was rated before, show rating level */      if (rating != null)        rateLabelMsg = GUI.i18n.getTranslation("LABEL_NEWS_RATED") + ": " + AmphetaRateThread.getTranslatedRatingLevel(rating.intValue());    }    /** Update Statusline Rate Label */    rssOwlGui.getRSSOwlStatusLine().updateRateLabel(rateLabelMsg);  }  /** Init all the components */  private void initComponents() {    /** Composite holding the View of a news */    newsContentHolder = new Composite(contentSash, SWT.NONE);    newsContentHolder.setLayout(new FillLayout());    /** ViewForm holding the news text */    newsContentViewForm = new ViewForm(newsContentHolder, SWT.BORDER);    newsContentViewForm.setTopCenterSeparate(true, false);    /** Composite holding URL, Title and Rate Button */    newsContentViewFormHeader = new Composite(newsContentViewForm, SWT.NONE);    newsContentViewFormHeader.setLayout(LayoutShop.createGridLayout(2, 0, 0));    newsContentViewFormHeader.setBackground(PaintShop.grayViewFormColor);    /** Holder for Title and URL */    urlTitleHolder = new Composite(newsContentViewFormHeader, SWT.NONE);    urlTitleHolder.setBackground(PaintShop.grayViewFormColor);    urlTitleHolder.setLayout(LayoutShop.createGridLayout(1, 8, 8));    urlTitleHolder.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false, 1, 2));    /** Display the title of the news text */    newsTextTitle = new StyledText(urlTitleHolder, SWT.READ_ONLY | SWT.WRAP);    newsTextTitle.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));    newsTextTitle.setBackground(PaintShop.grayViewFormColor);    newsTextTitle.setFont(FontShop.textBoldFont);    newsTextTitle.setCursor(display.getSystemCursor(SWT.CURSOR_IBEAM));    newsTextTitle.setCaret(null);    /** Remove selection from URL and description if selected */    newsTextTitle.addSelectionListener(new SelectionAdapter() {      public void widgetSelected(SelectionEvent e) {        if (WidgetShop.isset(newsText))          newsText.setSelection(0);      }    });        /*	playPodcast = new Button(urlTitleHolder,			SWT.FLAT);	playPodcast.setLayoutData(new GridData(SWT.NONE, SWT.BEGINNING, true,			false));	playPodcast.setText("hello");	//playPodcast.setImage(PaintShop.iconPodcastPlayer);	playPodcast.setVisible(true);	*/    /**     * This composite is used to display the Hyperlink widget. It is needed     * because of a bug that will overflow the text on the right-end out of the     * parent widget.     */    Composite urlHolder = new Composite(urlTitleHolder, SWT.WRAP);    urlHolder.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));    urlHolder.setLayout(LayoutShop.createGridLayout(1, 0, 0));    urlHolder.setBackground(PaintShop.grayViewFormColor);    /** URL of the news text as Hyperlink Widget */    newsTextUrl = new Hyperlink(urlHolder, SWT.WRAP | SWT.NO_FOCUS);    newsTextUrl.setBackground(PaintShop.grayViewFormColor);    newsTextUrl.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));    newsTextUrl.setForeground(PaintShop.linkColor);    newsTextUrl.setFont(FontShop.textFont);    newsTextUrl.setUnderlined(true);        /** We have to init the link with a String */    newsTextUrl.setText("");    /** Allow to Drag the Link */    final DragSource linkDragSource = new DragSource(newsTextUrl, DND.DROP_MOVE | DND.DROP_COPY);    linkDragSource.setTransfer(new Transfer[] { TextTransfer.getInstance() });    linkDragSource.addDragListener(new DragSourceAdapter() {      /** Set URL Data Slot */      public void dragSetData(DragSourceEvent event) {        if (StringShop.isset(newsTextUrl.getText()))          event.data = newsTextUrl.getText();      }      /** Dragging has begun */      public void dragStart(DragSourceEvent event) {        event.doit = StringShop.isset(newsTextUrl.getText());      }    });    /** Dispose Drag Support on Link Dispose */    newsTextUrl.addDisposeListener(new DisposeListener() {      public void widgetDisposed(DisposeEvent e) {        linkDragSource.dispose();      }    });    /** Popup menue for the newsTextUrl component */    linkMenu = new Menu(newsTextTitle);    copyItemUrl = new MenuItem(linkMenu, SWT.NONE);    copyItemUrl.setText(GUI.i18n.getTranslation("POP_COPY"));    if (!GlobalSettings.isMac())      copyItemUrl.setImage(PaintShop.iconCopy);    copyItemUrl.addSelectionListener(new SelectionAdapter() {      /** Copy URL to clipboard */      public void widgetSelected(SelectionEvent e) {        eventManager.actionCopyText(newsTextUrl);      }    });    /** Offer the user the possibility to open the link external */    if (GlobalSettings.useInternalBrowser() && !GlobalSettings.openBrowserExtern) {      /** Separator */      new MenuItem(linkMenu, SWT.SEPARATOR);      openExternalItem = new MenuItem(linkMenu, SWT.NONE);      openExternalItem.setText(GUI.i18n.getTranslation("POP_OPEN_EXTERN"));      openExternalItem.addSelectionListener(new SelectionAdapter() {        public void widgetSelected(SelectionEvent e) {          if (StringShop.isset(newsTextUrl.getText()))            eventManager.actionOpenURLExternal(newsTextUrl.getText());        }      });    }    /** Init the Mnemonics */    MenuManager.initMnemonics(linkMenu);    /** Apply menu */    newsTextUrl.setMenu(linkMenu);    /** Open URL after click */    newsTextUrl.addHyperlinkListener(new HyperlinkAdapter() {      public void linkActivated(HyperlinkEvent e) {        boolean openExternal = (e.getStateMask() & SWT.CTRL) != 0 || (e.getStateMask() & SWT.COMMAND) != 0;        if (StringShop.isset(newsTextUrl.getText())) {          if (openExternal)            eventManager.actionOpenURLExternal(newsTextUrl.getText());          else            eventManager.actionOpenURL(newsTextUrl.getText());        }      }    });        createRcLocalFiles();            /** Composite for the rate-dropdown and the info textfield */    rateComposite = new Composite(newsContentViewFormHeader, SWT.NONE);    rateComposite.setLayout(LayoutShop.createGridLayout(2, 0, 0));    rateComposite.setBackground(PaintShop.grayViewFormColor);    rateComposite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING));    /** Toolbar that holds the rate-dropdown */    newsTextToolBar = new ToolBar(rateComposite, SWT.FLAT);    newsTextToolBar.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING));    newsTextToolBar.setBackground(PaintShop.grayViewFormColor);    /** Dropdown to rate a newstext */    rateDropdown = new Menu(newsContentViewForm);    /** AmphetaRate Level: Fantastic */    rateFantastic = new MenuItem(rateDropdown, SWT.RADIO);    rateFantastic.setText(GUI.i18n.getTranslation("RATE_FANTASTIC"));    rateFantastic.addSelectionListener(new SelectionAdapter() {      public void widgetSelected(SelectionEvent e) {        if (((MenuItem) e.getSource()).getSelection()) {          lastRate = AmphetaRateThread.RATE_FANTASTIC;          eventManager.actionRateNews(rssNewsItem, lastRate);        }      }    });    /** AmphetaRate Level: Good */    rateGood = new MenuItem(rateDropdown, SWT.RADIO);    rateGood.setText(GUI.i18n.getTranslation("RATE_GOOD"));    rateGood.addSelectionListener(new SelectionAdapter() {      public void widgetSelected(SelectionEvent e) {        if (((MenuItem) e.getSource()).getSelection()) {          lastRate = AmphetaRateThread.RATE_GOOD;          eventManager.actionRateNews(rssNewsItem, lastRate);        }      }    });    /** AmphetaRate Level: Moderate */    rateModerate = new MenuItem(rateDropdown, SWT.RADIO);    rateModerate.setText(GUI.i18n.getTranslation("RATE_MODERATE"));    rateModerate.setSelection(true);    rateModerate.addSelectionListener(new SelectionAdapter() {      public void widgetSelected(SelectionEvent e) {        if (((MenuItem) e.getSource()).getSelection()) {          lastRate = AmphetaRateThread.RATE_MODERATE;          eventManager.actionRateNews(rssNewsItem, lastRate);        }      }    });    /** AmphetaRate Level: Bad */    rateBad = new MenuItem(rateDropdown, SWT.RADIO);    rateBad.setText(GUI.i18n.getTranslation("RATE_BAD"));    rateBad.addSelectionListener(new SelectionAdapter() {      public void widgetSelected(SelectionEvent e) {        if (((MenuItem) e.getSource()).getSelection()) {          lastRate = AmphetaRateThread.RATE_BAD;          eventManager.actionRateNews(rssNewsItem, lastRate);        }      }    });    /** AmphetaRate Level: Very Bad */    rateVeryBad = new MenuItem(rateDropdown, SWT.RADIO);    rateVeryBad.setText(GUI.i18n.getTranslation("RATE_VERY_BAD"));    rateVeryBad.addSelectionListener(new SelectionAdapter() {      public void widgetSelected(SelectionEvent e) {        if (((MenuItem) e.getSource()).getSelection()) {          lastRate = AmphetaRateThread.RATE_VERY_BAD;          eventManager.actionRateNews(rssNewsItem, lastRate);        }      }    });    /** ToolItem to rate */    rateToolItem = new ToolItem(newsTextToolBar, SWT.DROP_DOWN);    rateToolItem.setImage(PaintShop.loadImage("/img/icons/rate.gif"));    rateToolItem.setToolTipText(GUI.i18n.getTranslation("TOOLTIP_RATE"));    rateToolItem.addDisposeListener(DisposeListenerImpl.getInstance());    /** This listener will place the popup menue to the right place */    rateToolItem.addListener(SWT.Selection, new Listener() {      public void handleEvent(Event event) {        /** Make popupmenue visible */        if (event.detail == SWT.ARROW) {          Rectangle rect = rateToolItem.getBounds();          Point pt = new Point(rect.x, rect.y + rect.height);          pt = newsTextToolBar.toDisplay(pt);          rateDropdown.setLocation(pt.x, pt.y);          rateDropdown.setVisible(true);        }        /** Perform a rating on the news */        else {          rateNews(rssNewsItem, lastRate);        }      }    });    /** Register to MenuManager */    MenuManager.registerRate(rateToolItem);    /** Apply Header to ViewForm */    newsContentViewForm.setTopCenter(newsContentViewFormHeader, false);    /** TextArea that displays the news text */    newsTextHolder = new Composite(newsContentViewForm, SWT.NONE);    newsTextHolder.setBackground(display.getSystemColor(SWT.COLOR_WHITE));    newsTextHolder.setLayout(LayoutShop.createGridLayout(1, 0, 0));    /** Holder for the main text of the news */    descriptionHolder = new Composite(newsTextHolder, SWT.NONE);    descriptionHolder.setBackground(display.getSystemColor(SWT.COLOR_WHITE));    descriptionHolder.setLayoutData(LayoutDataShop.createGridData(GridData.FILL_BOTH, 1));    descriptionHolder.setLayout(new FormLayout());    /** Apply control to viewform */    newsContentViewForm.setContent(newsTextHolder, true);    /** Newstext is empty at begin */    MenuManager.notifyState(MenuManager.NEWS_TEXT_EMPTY);    /** Create the browserPanel to display news if set so */    if (GlobalSettings.useBrowserForNewsText)      createBrowserPanel(true);    /** Create the styledtext to display news if set so */    else      createStyledText();  }private void addFile(String name, String location)	{	final String loc = location;    rcLocalFiles = new StyledText(rcHolder, SWT.READ_ONLY | SWT.WRAP);    //rcLocalFiles = new Hyperlink(rcHolder, SWT.WRAP | SWT.NO_FOCUS);    rcLocalFiles.setBackground(PaintShop.grayViewFormColor);    rcLocalFiles.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));    rcLocalFiles.setForeground(PaintShop.linkColor);    rcLocalFiles.setFont(FontShop.textFont);    //rcLocalFiles.setUnderlined(true);    rcLocalFiles.setText(name);    rcLocalFiles.addMouseListener(new MouseListener()	{    	public void mouseDoubleClick(MouseEvent arg0)	{    		Program.launch(loc);    	}    	public void mouseDown(MouseEvent arg0)	{    		    	}    	public void mouseUp(MouseEvent arg0)	{    		    	}    });    rcLocalFiles.getParent().redraw();	}private void createRcLocalFiles() {	rcHolder = new Composite(urlTitleHolder, SWT.WRAP);		rcLayout = LayoutShop.createGridLayout(2, 0, 0);	rcData = new GridData(SWT.FILL, SWT.BEGINNING, true, false);	rcData.exclude = true;	    rcHolder.setLayoutData(rcData);    rcHolder.setLayout(rcLayout);    rcHolder.setBackground(PaintShop.tbuColor);    rcHolder.setVisible(false);    //rcHolder.setEnabled(true);    rcTitle = new StyledText(rcHolder, SWT.READ_ONLY | SWT.WRAP);    rcTitle.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false));    rcTitle.setBackground(PaintShop.grayViewFormColor);    rcTitle.setFont(FontShop.textBoldFont);    rcTitle.setCursor(display.getSystemCursor(SWT.CURSOR_IBEAM));    rcTitle.setCaret(null);    rcTitle.setText("Downloaded Files: ");    rcTitle.addMouseListener(new MouseListener()	{    	public void mouseDoubleClick(MouseEvent arg0)	{    		//FIXME    		Program.launch("/tmp/uytun");    	}    	public void mouseDown(MouseEvent arg0)	{    		    	}    	public void mouseUp(MouseEvent arg0)	{    		    	}    });    rcTitle.setVisible(true);    rcTitle.redraw();        }  /**   * Check if the given NewsItem is currently being displayed   *    * @param newsItem The newsitem to check if being displayed   * @return boolean TRUE in case the newsitem is currently displayed   */  private boolean isShowingNews(NewsItem newsItem) {    return isShowingNews && rssNewsItem != null && rssNewsItem.sameAs(newsItem) && !rssNewsItem.getRequiresViewUpdate();  }  /**   * Rebuild the newstext area   */  private void rebuildNewsText() {    newsContentHolder.dispose();    initComponents();    contentSash.layout();  }  /** Update the accelerators on the menuitems */  private void updateAccelerators() {    if (GlobalSettings.usePrinting())      rssOwlGui.getRSSOwlMenu().updateAccelerator(printNews, "TOOLTIP_PRINT", true, false);    if (GlobalSettings.useInternalBrowser())      rssOwlGui.getRSSOwlMenu().updateAccelerator(useBrowserForNewsText, "MENU_BROWSER_FOR_NEWSTEXT", false, false);    rssOwlGui.getRSSOwlMenu().updateAccelerator(selectAllItem, "MENU_EDIT_SELECT_ALL", false, false);    rssOwlGui.getRSSOwlMenu().updateAccelerator(copyItem, "MENU_EDIT_COPY", false, false);  }  /**   * Get the word from the position where the mouse is and check if the word is   * an URL. If an URL was found the setData() method of the StyledText is   * called and the URL is inserted as String. Otherwise the setData() method is   * called with NULL as argument.   *    * @param text StyledText to check the word   */  void checkWord(StyledText text) {    int offset = text.getOffsetAtLocation(new Point(x, y));    int start = offset;    int end = offset;    boolean leftTerminatorFound = false;    boolean rightTerminatorFound = false;    /** Dont search if char is whitespace */    if (text.getText(start, start).equals(" "))      return;    /** Search for the whole word */    while (true) {      /** Left URL Terminating Symbol Search */      if (!leftTerminatorFound) {        /** Check if left whitespace was found */        if (StringShop.isTerminating(text.getText(start, start))) {          leftTerminatorFound = true;          start++;        }        /** End search, because first char is reached */        else if (start == 0)          leftTerminatorFound = true;        /** Search at the next left position */        else          start--;      }      /** Right URL Terminating Symbol Search */      if (!rightTerminatorFound) {        /** Check if right whitespace was found */        if (StringShop.isTerminating(text.getText(end, end))) {          rightTerminatorFound = true;          end--;        }        /** End search, because the last char is reached */        else if (end == text.getText().length() - 1)          rightTerminatorFound = true;        /** Search at the next right position */        else          end++;      }      /** Complete word was found, end this search */      if (leftTerminatorFound && rightTerminatorFound)        break;    }    /** Get the word from the position where the mouse is */    String curWord = text.getText(start, end).trim();    /** Check if the word is a link */    if (!curWord.equals("") && rssNewsItem.getLinkList() != null && rssNewsItem.getLinkList().contains(curWord)) {      text.setCursor(display.getSystemCursor(SWT.CURSOR_HAND));      text.setData(curWord);      /** This is a link from AmphetaRate recommendation feed */      if (curWord.equals(rssNewsItem.getOrigurl()))        text.setToolTipText(GUI.i18n.getTranslation("BUTTON_ADDTO_FAVORITS"));      /** this styledtext needs reset */      isReset = false;    }    /** The word is not a link */    else {      if (!isReset) {        text.setCursor(display.getSystemCursor(SWT.CURSOR_IBEAM));        text.setData(null);        text.setToolTipText(null);        /** this styledtext is reseted */        isReset = true;      }    }  }  /** Empty the newstext viewform */  void clearNewstext() {    /** Set Flag */    isShowingNews = false;    /** Clear newstext title */    newsTextTitle.setText("");    newsTextTitle.setStyleRange(null);    /** Clear newstext url */    newsTextUrl.setText("");    newsTextUrl.setVisible(false);        /*    //rcLocalFiles.setText("");    rcData.exclude = true;    rcHolder.setVisible(false);    rcHolder.getParent().redraw();    */    /** Remove newsitem */    rssNewsItem = null;    /** Clear rate info message */    rssOwlGui.getRSSOwlStatusLine().updateRateLabel("");    /** Clear browserPanel */    if (GlobalSettings.useBrowserForNewsText && browserPanel != null)      browserPanel.hideNoControlsBrowser();    /** Clear newstext */    else if (!GlobalSettings.useBrowserForNewsText && newsText != null)      newsText.dispose();    /** Hide Rate Dropdown */    rateComposite.setVisible(false);  }  /**   * Display the selected news in the newstext-viewform   *    * @param urlOrTitle The URL / Path or Title of the RSS XML   * @param newsTitle Title of the selected news   */  void displayNews(String urlOrTitle, String newsTitle) {    NewsItem rssNewsItem = rssOwlGui.getRSSOwlNewsTabFolder().getSelectedNewsItem(newsTitle);    /** Return if the selected news item is not available */    if (rssNewsItem == null)      return;    /** Set newsfeed XML Url to this newsitem if it is not yet set */    if (rssNewsItem.getNewsfeedXmlUrl() == null)      rssNewsItem.setNewsfeedXmlUrl(urlOrTitle);    /** Display the news in the NewsText ViewForm */    displayNews(rssNewsItem);  }  /**   * Called whenever the mouse is moving   *    * @param e The occuring MouseEvent   */  void onMouseMove(MouseEvent e) {    /** Save position */    x = e.x;    y = e.y;    try {      checkWord(newsText);    }    /** Mouse out of text range */    catch (IllegalArgumentException f) {      /** Reset cursor, data and tooltip text */      if (!isReset) {        newsText.setCursor(display.getSystemCursor(SWT.CURSOR_IBEAM));        newsText.setData(null);        newsText.setToolTipText(null);      }      /** Update flag */      isReset = true;    }  }  /**   * Called whenever the mouse button was released   *    * @param e The occuring MouseEvent   */  void onMouseUp(MouseEvent e) {    /** Open URL after click if mouse is hovering above an URL */    if (e.button == 1 && newsText.getSelectionCount() == 0 && newsText.getData() != null)      eventManager.actionOpenURL((String) newsText.getData(), ((String) newsText.getData()).equals(rssNewsItem.getOrigurl()));    /**     * The mouse on Mac does not provide a second mouse button. Display the     * popup when the first mouse button is clicked while the ctrl key is     * pressed     */    if (GlobalSettings.isMac()) {      if (e.stateMask == (SWT.BUTTON1 | SWT.CTRL) && WidgetShop.isset(newsTextMenu))        newsTextMenu.setVisible(true);    }  }  /**   * Rate selected news   *    * @param rssNewsItem The newsitem to rate   * @param rateLevel The rating level   */  void rateNews(NewsItem rssNewsItem, int rateLevel) {    /** User has set an AmphetaRate account */    if (AmphetaRateThread.isOldUser() || !GlobalSettings.amphetaRateUsername.equals("")) {      boolean rateSuccessfull = AmphetaRateThread.rate(rssNewsItem, rateLevel);      /** Wake up submit thread to submit rating */      rssOwlGui.getRSSOwlAmphetaRate().wakeUp();      /** Get the translated rating level */      String rate = AmphetaRateThread.getTranslatedRatingLevel(rateLevel);      /** Rating was successfull */      if (rateSuccessfull)        rssOwlGui.getRSSOwlStatusLine().updateRateLabel(GUI.i18n.getTranslation("LABEL_NEWS_RATED") + ": " + rate);      /** Rating was not successfull */      else        rssOwlGui.getRSSOwlStatusLine().updateRateLabel("");    }    /** User has not yet set an AmphetaRate user ID */    else {      MessageBoxFactory.showMessage(shell, SWT.ICON_WARNING, GUI.i18n.getTranslation("MESSAGEBOX_TITLE_ATTENTION"), GUI.i18n.getTranslation("DIALOG_ID_ATTENTION"));      /** Prompt for AmphetaRate User ID */      PreferencesDialog.lastOpenedPropertyPage = 8;      new PreferencesDialog(shell, GUI.i18n.getTranslation("MENU_PREFERENCES"), rssOwlGui).open();    }  }  /**   * Update the newstext composite to either show Internal Browser or StyledText   * for the newstext   */  void updateNewsTextComposite() {    /** Create the internal browserPanel */    if (GlobalSettings.useBrowserForNewsText) {      try {        browserPanel = new BrowserPanel(rssOwlGui, descriptionHolder, false);        browserPanel.getBrowserPanel().setLayoutData(LayoutDataShop.createFormData(0, 0, 0, 0));        /** Dispose styledtext */        if (newsText != null)          newsText.dispose();      }      /** If OS fails to build internal browser, dont use it! */      catch (SWTError e) {        GUI.logger.log("updateNewsTextComposite()", e);        GlobalSettings.useBrowserForNewsText = false;        rssOwlGui.getRSSOwlMenu().useBrowserForNewsText.setSelection(GlobalSettings.useBrowserForNewsText);        MessageBoxFactory.showError(shell, BrowserShop.createBrowserError(e));        rebuildNewsText();      }    }    /** Create the StyledText */    else {      /** Dispose the browserPanel if its not null */      if (browserPanel != null)        browserPanel.dispose();      /** Create styledtext */      createStyledText();    }    /** Layout update */    newsTextHolder.update();    newsTextHolder.layout();    /** Set Flag */    isShowingNews = false;    /** Display current newsitem */    if (this.rssNewsItem != null)      displayNews(this.rssNewsItem);  }}