com.nokia.carbide.cpp.internal.news.reader.ui.NewsPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for com.nokia.carbide.cpp.internal.news.reader.ui.NewsPreferencePage.java

Source

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
*
*/

package com.nokia.carbide.cpp.internal.news.reader.ui;

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

import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.eclipse.ui.PlatformUI;

import com.nokia.carbide.cpp.internal.news.reader.CarbideNewsReaderPlugin;
import com.nokia.carbide.cpp.internal.news.reader.Messages;
import com.nokia.carbide.cpp.internal.news.reader.feed.CarbideSyndFeed;

/**
 * A class for creating and configuring the Carbide.c++ news preference page.
 *
 */
public class NewsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {

    /**
     * Inner class to handle labels of the news feeds table.
     */
    private class NewsPreferenceLabelProvider extends LabelProvider {
        @Override
        public String getText(Object element) {
            if (element instanceof CarbideSyndFeed) {
                CarbideSyndFeed feed = (CarbideSyndFeed) element;
                return feed.getTitle();
            } else {
                return super.getText(element);
            }
        }
    }

    // private content
    private Button launchCtrlButton;
    private Button selectAllButton;
    private Button clearAllButton;
    private Button update06hrButton;
    private Button update12hrButton;
    private Button update24hrButton;
    private CheckboxTableViewer newsFeedsTableViewer;
    private List<CarbideSyndFeed> newsFeeds;
    private int updateInterval;
    private boolean subscriptionChanged;

    /**
     * The Constructor.
     */
    public NewsPreferencePage() {
        super();
        subscriptionChanged = false;
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected Control createContents(Composite parent) {
        final Composite content = new Composite(parent, SWT.NONE);
        final GridLayout contentGridLayout = new GridLayout();
        contentGridLayout.numColumns = 2;
        content.setLayout(contentGridLayout);
        content.setLayoutData(new GridData(GridData.FILL_BOTH));

        launchCtrlButton = new Button(content, SWT.CHECK);
        launchCtrlButton.setText(Messages.Preferences_LaunchCtrlLabel);
        launchCtrlButton.setToolTipText(Messages.Preferences_LaunchCtrlMessage);

        // filler
        new Label(content, SWT.NONE);

        final Group newsFeedsGroup = new Group(content, SWT.NONE);
        newsFeedsGroup.setLayout(new GridLayout());
        final GridData channelsGridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        channelsGridData.heightHint = 100;
        channelsGridData.widthHint = 200;
        newsFeedsGroup.setLayoutData(channelsGridData);
        newsFeedsGroup.setText(Messages.Preferences_NewsFeedsGroupLabel);

        newsFeedsTableViewer = CheckboxTableViewer.newCheckList(newsFeedsGroup, SWT.BORDER);
        newsFeedsTableViewer.setLabelProvider(new NewsPreferenceLabelProvider());
        newsFeedsTableViewer.setContentProvider(new ArrayContentProvider());
        getNewsFeeds();
        newsFeedsTableViewer.setInput(newsFeeds);
        getNewsFeedsSubscriptionStatus();
        final Table table = newsFeedsTableViewer.getTable();
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        table.setToolTipText(Messages.Preferences_NewsFeedsTableMessage);

        final Composite buttonsComposite = new Composite(content, SWT.NONE);
        final GridLayout buttonsGridLayout = new GridLayout();
        buttonsGridLayout.makeColumnsEqualWidth = true;
        buttonsComposite.setLayout(buttonsGridLayout);
        buttonsComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
        final GridData buttonsGridData = new GridData(SWT.NONE, SWT.NONE, true, false);
        buttonsGridData.widthHint = 80;

        selectAllButton = new Button(buttonsComposite, SWT.NONE);
        selectAllButton.setText(Messages.Preferences_SelectAllLabel);
        selectAllButton.setToolTipText(Messages.Preferences_SelectAllMessage);
        selectAllButton.setLayoutData(buttonsGridData);
        selectAllButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent event) {
                handleSelectAll();
            }
        });

        clearAllButton = new Button(buttonsComposite, SWT.NONE);
        clearAllButton.setText(Messages.Preferences_ClearAllLabel);
        clearAllButton.setToolTipText(Messages.Preferences_ClearAllMessage);
        clearAllButton.setLayoutData(buttonsGridData);
        clearAllButton.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent event) {
                handleClearAll();
            }
        });

        final Group feedUpdateGroup = new Group(content, SWT.NONE);
        feedUpdateGroup.setLayout(new GridLayout());
        final GridData feedUpdateGridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
        feedUpdateGridData.heightHint = 70;
        feedUpdateGridData.widthHint = 200;
        feedUpdateGroup.setLayoutData(feedUpdateGridData);
        feedUpdateGroup.setText(Messages.Preferences_UpdateIntervalLabel);
        feedUpdateGroup.setToolTipText(Messages.Preferences_UpdateIntervalMessage);

        update06hrButton = new Button(feedUpdateGroup, SWT.RADIO);
        update06hrButton.setText(Messages.Preferences_Update06HourLabel);
        update12hrButton = new Button(feedUpdateGroup, SWT.RADIO);
        update12hrButton.setText(Messages.Preferences_Update12HourLabel);
        update24hrButton = new Button(feedUpdateGroup, SWT.RADIO);
        update24hrButton.setText(Messages.Preferences_Update24HourLabel);

        getStoredPreferenceValues();
        PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, NewsUIHelpIDs.NEWSREADER_PREFERENCE_PAGE);
        return content;
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
     */
    public void init(IWorkbench workbench) {
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.preference.PreferencePage#performOk()
     */
    @Override
    public boolean performOk() {
        setStoredPreferenceValues();
        return super.performOk();
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
     */
    @Override
    protected void performDefaults() {
        launchCtrlButton.setSelection(true);
        newsFeedsTableViewer.setAllChecked(true);
        update06hrButton.setSelection(true);
        update12hrButton.setSelection(false);
        update24hrButton.setSelection(false);
        super.performDefaults();
    }

    /**
     * Retrieve the stored news feeds.
     */
    private void getNewsFeeds() {
        if (newsFeeds == null) {
            newsFeeds = new ArrayList<CarbideSyndFeed>();
        }
        newsFeeds.addAll(CarbideNewsReaderPlugin.getFeedManager().getNewsFeeds());
    }

    /**
     * Retrieve the subscription status of the news feeds table entries.
     */
    private void getNewsFeedsSubscriptionStatus() {
        for (Iterator<CarbideSyndFeed> iterator = newsFeeds.iterator(); iterator.hasNext();) {
            CarbideSyndFeed feed = iterator.next();
            if (feed.isSubscribed()) {
                newsFeedsTableViewer.setChecked(feed, true);
            } else {
                newsFeedsTableViewer.setChecked(feed, false);
            }
        }
    }

    /**
     * Retrieve the stored value for this preference page.
     */
    private void getStoredPreferenceValues() {
        IPreferenceStore store = CarbideNewsReaderPlugin.getPrefsStore();
        boolean launchAtStartup = store.getBoolean(NewsPreferenceConstants.LAUNCH_AT_STARTUP);
        launchCtrlButton.setSelection(launchAtStartup);
        updateInterval = store.getInt(NewsPreferenceConstants.UPDATE_INTERVAL);
        getUpdateInterval();
    }

    /**
     * Retrieve the update interval value and display it.
     */
    private void getUpdateInterval() {
        switch (updateInterval) {
        case 6:
            update06hrButton.setSelection(true);
            break;
        case 12:
            update12hrButton.setSelection(true);
            break;
        case 24:
            update24hrButton.setSelection(true);
            break;
        default:
            update24hrButton.setSelection(true);
        }
    }

    /**
     * Things to do when the "Clear All" button is selected.
     */
    private void handleClearAll() {
        newsFeedsTableViewer.setAllChecked(false);
    }

    /**
     * Things to do when the "Select All" button is selected.
     */
    private void handleSelectAll() {
        newsFeedsTableViewer.setAllChecked(true);
    }

    /**
     * Save the subscription status of the news feeds table entries.
     */
    private void setNewsFeedsSubscriptionStatus() {
        for (Iterator<CarbideSyndFeed> iterator = newsFeeds.iterator(); iterator.hasNext();) {
            CarbideSyndFeed feed = iterator.next();
            boolean subscribed = newsFeedsTableViewer.getChecked(feed);
            if (feed.isSubscribed() != subscribed) {
                subscriptionChanged = true;
            }
            feed.setSubscribed(subscribed);
        }
        if (subscriptionChanged) {
            CarbideNewsReaderPlugin.getFeedManager().unreadEntriesCountChanged();
            subscriptionChanged = false;
        }
    }

    /**
     * Set the stored value for this preference page.
     */
    private void setStoredPreferenceValues() {
        IPreferenceStore store = CarbideNewsReaderPlugin.getPrefsStore();
        boolean launchAtStartup = launchCtrlButton.getSelection();
        store.setValue(NewsPreferenceConstants.LAUNCH_AT_STARTUP, launchAtStartup);
        setUpdateInterval();
        int oldUpdateInterval = store.getInt(NewsPreferenceConstants.UPDATE_INTERVAL);
        if (oldUpdateInterval != updateInterval) {
            CarbideNewsReaderPlugin.getFeedManager().resetUpdateTimer();
        }
        store.setValue(NewsPreferenceConstants.UPDATE_INTERVAL, updateInterval);
        setNewsFeedsSubscriptionStatus();
    }

    /**
     * Save the update interval value.
     */
    private void setUpdateInterval() {
        if (update06hrButton.getSelection()) {
            updateInterval = 6;
        } else if (update12hrButton.getSelection()) {
            updateInterval = 12;
        } else if (update24hrButton.getSelection()) {
            updateInterval = 24;
        }
    }

}