net.sourceforge.eclipsetrader.news.views.NewsView.java Source code

Java tutorial

Introduction

Here is the source code for net.sourceforge.eclipsetrader.news.views.NewsView.java

Source

/*
 * Copyright (c) 2004-2006 Marco Maccaferri and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Marco Maccaferri - initial API and implementation
 */

package net.sourceforge.eclipsetrader.news.views;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Observable;
import java.util.Observer;

import net.sourceforge.eclipsetrader.core.CorePlugin;
import net.sourceforge.eclipsetrader.core.ICollectionObserver;
import net.sourceforge.eclipsetrader.core.db.NewsItem;
import net.sourceforge.eclipsetrader.core.db.Security;
import net.sourceforge.eclipsetrader.core.ui.views.WebBrowser;
import net.sourceforge.eclipsetrader.news.NewsPlugin;

import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.ui.themes.ITheme;
import org.eclipse.ui.themes.IThemeManager;

public class NewsView extends ViewPart {
    public static final String VIEW_ID = "net.sourceforge.eclipsetrader.newslist"; //$NON-NLS-1$

    static final String TABLE_BACKGROUND = "NEWS_TABLE_BACKGROUND"; //$NON-NLS-1$

    static final String TABLE_FOREGROUND = "NEWS_TABLE_FOREGROUND"; //$NON-NLS-1$

    static final String TABLE_FONT = "NEWS_TABLE_FONT"; //$NON-NLS-1$

    static final String READED_ITEM_BACKGROUND = "NEWS_READED_ITEM_BACKGROUND"; //$NON-NLS-1$

    static final String READED_ITEM_FOREGROUND = "NEWS_READED_ITEM_FOREGROUND"; //$NON-NLS-1$

    static final String READED_ITEM_FONT = "NEWS_READED_ITEM_FONT"; //$NON-NLS-1$

    static final String NEW_ITEM_BACKGROUND = "NEWS_NEW_ITEM_BACKGROUND"; //$NON-NLS-1$

    static final String NEW_ITEM_FOREGROUND = "NEWS_NEW_ITEM_FOREGROUND"; //$NON-NLS-1$

    static final String NEW_ITEM_FONT = "NEWS_NEW_ITEM_FONT"; //$NON-NLS-1$

    IDialogSettings settings;

    Security security;

    TableViewer viewer;

    NewsLabelProvider labelProvider = new NewsLabelProvider();

    List newsList = new ArrayList();

    IPropertyChangeListener themeChangeListener = new IPropertyChangeListener() {
        public void propertyChange(PropertyChangeEvent event) {
            ITheme theme = (ITheme) event.getSource();
            if (event.getProperty().equals(TABLE_BACKGROUND))
                viewer.getControl().setBackground(theme.getColorRegistry().get(TABLE_BACKGROUND));
            else if (event.getProperty().equals(TABLE_FOREGROUND))
                viewer.getControl().setForeground(theme.getColorRegistry().get(TABLE_FOREGROUND));
            else if (event.getProperty().equals(TABLE_FONT))
                viewer.getControl().setFont(theme.getFontRegistry().get(TABLE_FONT));
            else if (event.getProperty().equals(NEW_ITEM_BACKGROUND)) {
                labelProvider.setAddedBackground(theme.getColorRegistry().get(NEW_ITEM_BACKGROUND));
                viewer.refresh();
            } else if (event.getProperty().equals(NEW_ITEM_FOREGROUND)) {
                labelProvider.setAddedForeground(theme.getColorRegistry().get(NEW_ITEM_FOREGROUND));
                viewer.refresh();
            } else if (event.getProperty().equals(NEW_ITEM_FONT)) {
                labelProvider.setAddedFont(theme.getFontRegistry().get(NEW_ITEM_FONT));
                viewer.refresh();
            } else if (event.getProperty().equals(READED_ITEM_BACKGROUND)) {
                labelProvider.setReadedBackground(theme.getColorRegistry().get(READED_ITEM_BACKGROUND));
                viewer.refresh();
            } else if (event.getProperty().equals(READED_ITEM_FOREGROUND)) {
                labelProvider.setReadedForeground(theme.getColorRegistry().get(READED_ITEM_FOREGROUND));
                viewer.refresh();
            } else if (event.getProperty().equals(READED_ITEM_FONT)) {
                labelProvider.setReadedFont(theme.getFontRegistry().get(READED_ITEM_FONT));
                viewer.refresh();
            }
        }
    };

    ICollectionObserver collectionObserver = new ICollectionObserver() {
        public void itemAdded(Object o) {
            final NewsItem newsItem = (NewsItem) o;
            if (security == null || newsItem.isSecurity(security)) {
                newsList.add(newsItem);
                try {
                    viewer.getControl().getDisplay().asyncExec(new Runnable() {
                        public void run() {
                            if (!viewer.getControl().isDisposed()) {
                                viewer.add(newsItem);
                                newsItem.addObserver(newsItemObserver);
                            }
                        }
                    });
                } catch (SWTException e) {
                    if (e.code != SWT.ERROR_WIDGET_DISPOSED)
                        throw (e);
                }
            }
        }

        public void itemRemoved(Object o) {
            final NewsItem newsItem = (NewsItem) o;
            if (security == null || newsItem.isSecurity(security)) {
                newsList.remove(newsItem);
                try {
                    viewer.getControl().getDisplay().asyncExec(new Runnable() {
                        public void run() {
                            if (!viewer.getControl().isDisposed()) {
                                viewer.remove(newsItem);
                                newsItem.deleteObserver(newsItemObserver);
                            }
                        }
                    });
                } catch (SWTException e) {
                    if (e.code != SWT.ERROR_WIDGET_DISPOSED)
                        throw (e);
                }
            }
        }
    };

    Observer newsItemObserver = new Observer() {
        public void update(final Observable o, Object arg) {
            try {
                viewer.getControl().getDisplay().asyncExec(new Runnable() {
                    public void run() {
                        if (!viewer.getControl().isDisposed())
                            viewer.update(o, null);
                    }
                });
            } catch (SWTException e) {
                if (e.code != SWT.ERROR_WIDGET_DISPOSED)
                    throw (e);
            }
        }
    };

    ControlAdapter controlListener = new ControlAdapter() {
        public void controlResized(ControlEvent e) {
            TableColumn column = (TableColumn) e.widget;
            int index = viewer.getTable().indexOf(column);
            settings.put("column" + String.valueOf(index) + ".width", column.getWidth()); //$NON-NLS-1$ //$NON-NLS-2$
        }
    };

    Action refreshAction = new Action(Messages.NewsView_UpdateAction) {
        public void run() {
            if (security != null)
                NewsPlugin.getDefault().startFeedSnapshot(security);
            else
                NewsPlugin.getDefault().startFeedSnapshot();
        }
    };

    Action showPreviousAction = new Action(Messages.NewsView_PreviousAction) {
        public void run() {
            showPrevious();
        }
    };

    Action showNextAction = new Action(Messages.NewsView_NextAction) {
        public void run() {
            showNext();
        }
    };

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.ViewPart#init(org.eclipse.ui.IViewSite)
     */
    public void init(IViewSite site) throws PartInitException {
        refreshAction.setImageDescriptor(NewsPlugin.getImageDescriptor("icons/elcl16/refresh.gif")); //$NON-NLS-1$
        refreshAction.setDisabledImageDescriptor(NewsPlugin.getImageDescriptor("icons/dlcl16/refresh.gif")); //$NON-NLS-1$

        showPreviousAction.setImageDescriptor(NewsPlugin.getImageDescriptor("icons/elcl16/next_nav.gif")); //$NON-NLS-1$
        showPreviousAction.setDisabledImageDescriptor(NewsPlugin.getImageDescriptor("icons/dlcl16/next_nav.gif")); //$NON-NLS-1$

        showNextAction.setImageDescriptor(NewsPlugin.getImageDescriptor("icons/elcl16/prev_nav.gif")); //$NON-NLS-1$
        showNextAction.setDisabledImageDescriptor(NewsPlugin.getImageDescriptor("icons/dlcl16/prev_nav.gif")); //$NON-NLS-1$

        IMenuManager menuManager = site.getActionBars().getMenuManager();
        menuManager.add(new Separator("top")); //$NON-NLS-1$
        menuManager.add(new Separator("group1")); //$NON-NLS-1$
        menuManager.add(new Separator("group2")); //$NON-NLS-1$
        menuManager.add(new Separator("group3")); //$NON-NLS-1$
        menuManager.add(new Separator("group4")); //$NON-NLS-1$
        menuManager.add(new Separator("group5")); //$NON-NLS-1$
        menuManager.add(new Separator("group6")); //$NON-NLS-1$
        menuManager.add(new Separator("additions")); //$NON-NLS-1$
        menuManager.add(new Separator("bottom")); //$NON-NLS-1$

        IToolBarManager toolBarManager = site.getActionBars().getToolBarManager();
        toolBarManager.add(new Separator("begin")); //$NON-NLS-1$
        toolBarManager.add(new Separator("group1")); //$NON-NLS-1$
        toolBarManager.add(showNextAction);
        toolBarManager.add(showPreviousAction);
        toolBarManager.add(new Separator("group2")); //$NON-NLS-1$
        toolBarManager.add(refreshAction);
        toolBarManager.add(new Separator("group3")); //$NON-NLS-1$
        toolBarManager.add(new Separator("group4")); //$NON-NLS-1$
        toolBarManager.add(new Separator("group5")); //$NON-NLS-1$
        toolBarManager.add(new Separator("group6")); //$NON-NLS-1$
        toolBarManager.add(new Separator("additions")); //$NON-NLS-1$
        toolBarManager.add(new Separator("end")); //$NON-NLS-1$

        settings = NewsPlugin.getDefault().getDialogSettings().getSection(VIEW_ID);
        if (settings == null)
            settings = NewsPlugin.getDefault().getDialogSettings().addNewSection(VIEW_ID);

        if (site.getSecondaryId() != null) {
            security = (Security) CorePlugin.getRepository().getSecurity(site.getSecondaryId());
            if (security != null)
                setPartName(security.getDescription() + " " + getPartName()); //$NON-NLS-1$

            if (settings.getSection(site.getSecondaryId()) != null)
                settings = settings.getSection(site.getSecondaryId());
            else
                settings = settings.addNewSection(site.getSecondaryId());
        }

        super.init(site);
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
     */
    public void createPartControl(Composite parent) {
        Table table = new Table(parent, SWT.MULTI | SWT.FULL_SELECTION);
        table.setHeaderVisible(true);
        table.setLinesVisible(false);
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));

        TableColumn column = new TableColumn(table, SWT.NONE);
        column.setText(Messages.NewsView_Date);
        column.setWidth(settings.get("column0.width") == null ? 120 : settings.getInt("column0.width")); //$NON-NLS-1$ //$NON-NLS-2$
        column.addControlListener(controlListener);

        column = new TableColumn(table, SWT.NONE);
        column.setText(Messages.NewsView_Title);
        column.setWidth(settings.get("column1.width") == null ? 240 : settings.getInt("column1.width")); //$NON-NLS-1$ //$NON-NLS-2$
        column.addControlListener(controlListener);

        column = new TableColumn(table, SWT.NONE);
        column.setText(Messages.NewsView_Security);
        column.setWidth(settings.get("column2.width") == null ? 120 : settings.getInt("column2.width")); //$NON-NLS-1$ //$NON-NLS-2$
        column.addControlListener(controlListener);

        column = new TableColumn(table, SWT.NONE);
        column.setText(Messages.NewsView_Source);
        column.setWidth(settings.get("column3.width") == null ? 120 : settings.getInt("column3.width")); //$NON-NLS-1$ //$NON-NLS-2$
        column.addControlListener(controlListener);

        viewer = new TableViewer(table);
        viewer.setLabelProvider(labelProvider);
        viewer.setContentProvider(new ArrayContentProvider());
        viewer.setComparator(new ViewerComparator() {
            public int compare(Viewer viewer, Object e1, Object e2) {
                return ((NewsItem) e2).getDate().compareTo(((NewsItem) e1).getDate());
            }
        });
        viewer.addOpenListener(new IOpenListener() {
            public void open(OpenEvent event) {
                showSelected();
            }
        });

        IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager();
        ITheme theme = themeManager.getCurrentTheme();
        if (theme != null) {
            table.setForeground(theme.getColorRegistry().get(TABLE_FOREGROUND));
            table.setBackground(theme.getColorRegistry().get(TABLE_BACKGROUND));
            table.setFont(theme.getFontRegistry().get(TABLE_FONT));

            labelProvider.setAddedBackground(theme.getColorRegistry().get(NEW_ITEM_BACKGROUND));
            labelProvider.setAddedForeground(theme.getColorRegistry().get(NEW_ITEM_FOREGROUND));
            labelProvider.setAddedFont(theme.getFontRegistry().get(NEW_ITEM_FONT));

            labelProvider.setReadedBackground(theme.getColorRegistry().get(READED_ITEM_BACKGROUND));
            labelProvider.setReadedForeground(theme.getColorRegistry().get(READED_ITEM_FOREGROUND));
            labelProvider.setReadedFont(theme.getFontRegistry().get(READED_ITEM_FONT));

            theme.addPropertyChangeListener(themeChangeListener);
        }

        viewer.setInput(newsList);

        if (security != null)
            CorePlugin.getRepository().allNews(security).addCollectionObserver(collectionObserver);
        else
            CorePlugin.getRepository().allNews().addCollectionObserver(collectionObserver);

        NewsStartupJob job = new NewsStartupJob(security);
        job.addJobChangeListener(new JobChangeAdapter() {

            /* (non-Javadoc)
                * @see org.eclipse.core.runtime.jobs.JobChangeAdapter#done(org.eclipse.core.runtime.jobs.IJobChangeEvent)
                */
            public void done(IJobChangeEvent event) {
                final NewsStartupJob job = (NewsStartupJob) event.getJob();
                try {
                    viewer.getControl().getDisplay().asyncExec(new Runnable() {
                        public void run() {
                            if (!viewer.getControl().isDisposed()) {
                                newsList = job.getList();
                                viewer.setInput(newsList);
                                for (Iterator iter = newsList.iterator(); iter.hasNext();)
                                    ((NewsItem) iter.next()).addObserver(newsItemObserver);
                            }
                        }
                    });
                } catch (SWTException e) {
                    if (e.code != SWT.ERROR_WIDGET_DISPOSED)
                        throw (e);
                }
            }
        });
        job.setUser(false);
        job.schedule();
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#setFocus()
     */
    public void setFocus() {
        if (!viewer.getControl().isDisposed())
            viewer.getControl().setFocus();
    }

    /* (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#dispose()
     */
    public void dispose() {
        if (security != null)
            CorePlugin.getRepository().allNews(security).removeCollectionObserver(collectionObserver);
        else
            CorePlugin.getRepository().allNews().removeCollectionObserver(collectionObserver);

        for (Iterator iter = newsList.iterator(); iter.hasNext();)
            ((NewsItem) iter.next()).deleteObserver(newsItemObserver);

        IThemeManager themeManager = PlatformUI.getWorkbench().getThemeManager();
        ITheme theme = themeManager.getCurrentTheme();
        if (theme != null)
            theme.removePropertyChangeListener(themeChangeListener);

        super.dispose();
    }

    public void showPrevious() {
        NewsItem news = getSelectedItem();
        TableItem[] items = viewer.getTable().getItems();
        if (news == null && items.length != 0) {
            viewer.setSelection(new StructuredSelection(items[0].getData()));
            viewer.reveal(items[0].getData());
            showSelected();
            return;
        }
        for (int i = 0; i < items.length; i++) {
            if (items[i].getData() == news) {
                i++;
                if (i < items.length) {
                    viewer.setSelection(new StructuredSelection(items[i].getData()));
                    viewer.reveal(items[i].getData());
                    showSelected();
                    return;
                }
            }
        }
    }

    public void showNext() {
        NewsItem news = getSelectedItem();
        TableItem[] items = viewer.getTable().getItems();
        if (news == null && items.length != 0) {
            viewer.setSelection(new StructuredSelection(items[items.length - 1].getData()));
            viewer.reveal(items[items.length - 1].getData());
            showSelected();
            return;
        }
        for (int i = 0; i < items.length; i++) {
            if (items[i].getData() == news) {
                i--;
                if (i >= 0) {
                    viewer.setSelection(new StructuredSelection(items[i].getData()));
                    viewer.reveal(items[i].getData());
                    showSelected();
                    return;
                }
            }
        }
    }

    private void showSelected() {
        NewsItem news = getSelectedItem();
        if (news != null) {
            try {
                WebBrowser browser = (WebBrowser) getSite().getPage().showView(WebBrowser.VIEW_ID,
                        NewsPlugin.PLUGIN_ID, IWorkbenchPage.VIEW_ACTIVATE);
                if (browser != null) {
                    browser.setUrl(news.getUrl());
                    news.setRecent(false);
                    news.setReaded(true);
                    CorePlugin.getRepository().save(news);
                }
            } catch (PartInitException e1) {
                CorePlugin.logException(e1);
            }
        }
    }

    protected NewsItem getSelectedItem() {
        if (!viewer.getSelection().isEmpty())
            return (NewsItem) ((IStructuredSelection) viewer.getSelection()).getFirstElement();
        return null;
    }
}