org.rssowl.ui.internal.ManageLabelsPreferencePage.java Source code

Java tutorial

Introduction

Here is the source code for org.rssowl.ui.internal.ManageLabelsPreferencePage.java

Source

/*   **********************************************************************  **
 **   Copyright notice                                                       **
 **                                                                          **
 **   (c) 2005-2008 RSSOwl Development Team                                  **
 **   http://www.rssowl.org/                                                 **
 **                                                                          **
 **   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.rssowl.org/legal/epl-v10.html                               **
 **                                                                          **
 **   A copy is found in the file epl-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 Development Team - initial API and implementation             **
 **                                                                          **
 **  **********************************************************************  */

package org.rssowl.ui.internal;

import java.util.Collection;

import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.RGB;
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.Label;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import org.rssowl.core.Owl;
import org.rssowl.core.persist.ILabel;
import org.rssowl.core.persist.INews;
import org.rssowl.core.persist.dao.DynamicDAO;
import org.rssowl.ui.internal.dialogs.ConfirmDeleteDialog;
import org.rssowl.ui.internal.dialogs.LabelDialog;
import org.rssowl.ui.internal.dialogs.LabelDialog.DialogMode;
import org.rssowl.ui.internal.util.LayoutUtils;

/**
 * @author bpasero
 */
public class ManageLabelsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {

    /** ID of the Page */
    public static final String ID = "org.rssowl.ui.ManageLabels";

    private LocalResourceManager fResources;
    private TreeViewer fViewer;

    /** Leave for reflection */
    public ManageLabelsPreferencePage() {
        fResources = new LocalResourceManager(JFaceResources.getResources());
    }

    /*
     * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
     */
    public void init(IWorkbench workbench) {
        noDefaultAndApplyButton();
    }

    /*
     * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected Control createContents(Composite parent) {
        Composite container = createContainer(parent);

        /* Label */
        Label infoLabel = new Label(container, SWT.None);
        infoLabel.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false, 2, 1));
        infoLabel.setText("Labels can be used to categorize and prioritize your news.");

        /* Label Viewer */
        createViewer(container);

        /* Button Box */
        createButtons(container);

        return container;
    }

    private void createButtons(Composite container) {
        Composite buttonBox = new Composite(container, SWT.None);
        buttonBox.setLayout(LayoutUtils.createGridLayout(1, 0, 0));
        buttonBox.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, true));

        Button addButton = new Button(buttonBox, SWT.PUSH);
        addButton.setText("&Add...");
        setButtonLayoutData(addButton);
        addButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                onAdd();
            }
        });

        final Button editButton = new Button(buttonBox, SWT.PUSH);
        editButton.setText("&Edit...");
        editButton.setEnabled(!fViewer.getSelection().isEmpty());
        setButtonLayoutData(editButton);
        editButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                onEdit();
            }
        });

        final Button deleteButton = new Button(buttonBox, SWT.PUSH);
        deleteButton.setText("&Delete");
        deleteButton.setEnabled(!fViewer.getSelection().isEmpty());
        setButtonLayoutData(deleteButton);
        deleteButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                onDelete();
            }
        });

        fViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                editButton.setEnabled(!event.getSelection().isEmpty());
                deleteButton.setEnabled(!event.getSelection().isEmpty());
            }
        });
    }

    private void onAdd() {
        LabelDialog dialog = new LabelDialog(getShell(), DialogMode.ADD, null);
        if (dialog.open() == IDialogConstants.OK_ID) {
            String name = dialog.getName();
            RGB color = dialog.getColor();

            ILabel newLabel = Owl.getModelFactory().createLabel(null, name);
            newLabel.setColor(color.red + "," + color.green + "," + color.blue);
            DynamicDAO.save(newLabel);

            fViewer.refresh();
            fViewer.setSelection(new StructuredSelection(newLabel));
        }
        fViewer.getTree().setFocus();
    }

    private void onEdit() {
        IStructuredSelection selection = (IStructuredSelection) fViewer.getSelection();
        if (!selection.isEmpty()) {
            ILabel label = (ILabel) selection.getFirstElement();
            LabelDialog dialog = new LabelDialog(getShell(), DialogMode.EDIT, label);
            if (dialog.open() == IDialogConstants.OK_ID) {
                boolean changed = false;
                String name = dialog.getName();
                RGB color = dialog.getColor();

                if (!label.getName().equals(name)) {
                    label.setName(name);
                    if (label.getSearchMark() != null) {
                        label.getSearchMark().setName(name);
                    }
                    changed = true;
                }

                String colorStr = color.red + "," + color.green + "," + color.blue;
                if (!label.getColor().equals(colorStr)) {
                    label.setColor(colorStr);
                    changed = true;
                }

                /* Save Label */
                if (changed) {
                    Controller.getDefault().getSavedSearchService().forceQuickUpdate();
                    DynamicDAO.save(label);
                    fViewer.update(label, null);
                }
            }
        }
        fViewer.getTree().setFocus();
    }

    private void onDelete() {
        IStructuredSelection selection = (IStructuredSelection) fViewer.getSelection();
        if (!selection.isEmpty()) {
            ILabel label = (ILabel) selection.getFirstElement();

            String msg = "Are you sure you want to delete the Label '" + label.getName() + "'?";
            ConfirmDeleteDialog dialog = new ConfirmDeleteDialog(getShell(), "Confirm Delete",
                    "This action can not be undone", msg, null);
            if (dialog.open() == IDialogConstants.OK_ID) {

                /* Remove Label from any News containing it */
                Collection<INews> affectedNews = label.findNewsWithLabel();
                for (INews news : affectedNews) {
                    news.removeLabel(label);
                }

                Controller.getDefault().getSavedSearchService().forceQuickUpdate();
                DynamicDAO.saveAll(affectedNews);

                /* Delete associated SearchMark of Label from DB */
                if (label.getSearchMark() != null) {
                    DynamicDAO.delete(label.getSearchMark());
                }

                /* Delete Label from DB */
                DynamicDAO.delete(label);
                fViewer.refresh();
            }
        }
        fViewer.getTree().setFocus();
    }

    private void createViewer(Composite container) {
        fViewer = new TreeViewer(container, SWT.FULL_SELECTION | SWT.BORDER | SWT.SINGLE);
        fViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        /* Content Provider */
        fViewer.setContentProvider(new ITreeContentProvider() {
            public Object[] getElements(Object inputElement) {
                return DynamicDAO.loadAll(ILabel.class).toArray();
            }

            public Object[] getChildren(Object parentElement) {
                return null;
            }

            public Object getParent(Object element) {
                return null;
            }

            public boolean hasChildren(Object element) {
                return false;
            }

            public void dispose() {
            }

            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
            }
        });

        /* Label Provider */
        fViewer.setLabelProvider(new CellLabelProvider() {
            @Override
            public void update(ViewerCell cell) {
                ILabel label = (ILabel) cell.getElement();

                /* Text */
                cell.setText(label.getName());

                /* Color */
                cell.setForeground(OwlUI.getColor(fResources, label));
            }
        });

        /* Set dummy Input */
        fViewer.setInput(new Object());

        /* Edit on Doubleclick */
        fViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent event) {
                onEdit();
            }
        });
    }

    private Composite createContainer(Composite parent) {
        Composite composite = new Composite(parent, SWT.NULL);
        GridLayout layout = new GridLayout(2, false);
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        composite.setLayout(layout);
        composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
        composite.setFont(parent.getFont());
        return composite;
    }

    /*
     * @see org.eclipse.jface.dialogs.DialogPage#dispose()
     */
    @Override
    public void dispose() {
        super.dispose();
        fResources.dispose();
    }
}