/* ********************************************************************** **
** Copyright notice **
** **
** (c) 2005-2009 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.dialogs.properties;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.swt.widgets.Spinner;
import org.rssowl.core.Owl;
import org.rssowl.core.internal.persist.pref.DefaultPreferences;
import org.rssowl.core.persist.IEntity;
import org.rssowl.core.persist.IFolder;
import org.rssowl.core.persist.IMark;
import org.rssowl.core.persist.pref.IPreferenceScope;
import org.rssowl.ui.dialogs.properties.IEntityPropertyPage;
import org.rssowl.ui.dialogs.properties.IPropertyDialogSite;
import org.rssowl.ui.internal.util.LayoutUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
* Reading Properties.
*
* @author bpasero
*/
public class ReadingPropertyPage implements IEntityPropertyPage {
private List<IEntity> fEntities;
private ArrayList<IPreferenceScope> fEntityPreferences;
private boolean fPrefMarkReadState;
private int fPrefMarkReadVal;
private boolean fPrefMarkReadOnMinimize;
private boolean fPrefMarkReadOnScrolling;
private boolean fPrefMarkReadOnTabClose;
private boolean fPrefMarkReadOnFeedChange;
private Button fMarkReadStateCheck;
private Spinner fMarkReadAfterSpinner;
private Button fMarkReadOnMinimize;
private Button fMarkReadOnScrolling;
private Button fMarkReadOnChange;
private boolean fSettingsChanged;
private Button fMarkReadOnTabClose;
/*
* @see org.rssowl.ui.dialogs.properties.IEntityPropertyPage#init(org.rssowl.ui.dialogs.properties.IPropertyDialogSite, java.util.List)
*/
public void init(IPropertyDialogSite site, List<IEntity> entities) {
Assert.isTrue(!entities.isEmpty());
fEntities = entities;
/* Load Entity Preferences */
fEntityPreferences = new ArrayList<IPreferenceScope>(fEntities.size());
for (IEntity entity : entities)
fEntityPreferences.add(Owl.getPreferenceService().getEntityScope(entity));
/* Load initial Settings */
loadInitialSettings();
}
private void loadInitialSettings() {
/* Take the first scope as initial values */
IPreferenceScope firstScope = fEntityPreferences.get(0);
fPrefMarkReadState = firstScope.getBoolean(DefaultPreferences.MARK_READ_STATE);
fPrefMarkReadVal = firstScope.getInteger(DefaultPreferences.MARK_READ_IN_MILLIS);
fPrefMarkReadOnMinimize = firstScope.getBoolean(DefaultPreferences.MARK_READ_ON_MINIMIZE);
fPrefMarkReadOnScrolling = firstScope.getBoolean(DefaultPreferences.MARK_READ_ON_SCROLLING);
fPrefMarkReadOnTabClose = firstScope.getBoolean(DefaultPreferences.MARK_READ_ON_TAB_CLOSE);
fPrefMarkReadOnFeedChange = firstScope.getBoolean(DefaultPreferences.MARK_READ_ON_CHANGE);
/* For any other scope not sharing the initial values, use the default */
IPreferenceScope defaultScope = Owl.getPreferenceService().getDefaultScope();
for (int i = 1; i < fEntityPreferences.size(); i++) {
IPreferenceScope otherScope = fEntityPreferences.get(i);
if (otherScope.getBoolean(DefaultPreferences.MARK_READ_STATE) != fPrefMarkReadState)
fPrefMarkReadState = defaultScope.getBoolean(DefaultPreferences.MARK_READ_STATE);
if (otherScope.getInteger(DefaultPreferences.MARK_READ_IN_MILLIS) != fPrefMarkReadVal)
fPrefMarkReadVal = defaultScope.getInteger(DefaultPreferences.MARK_READ_IN_MILLIS);
if (otherScope.getBoolean(DefaultPreferences.MARK_READ_ON_MINIMIZE) != fPrefMarkReadOnMinimize)
fPrefMarkReadOnMinimize = defaultScope.getBoolean(DefaultPreferences.MARK_READ_ON_MINIMIZE);
if (otherScope.getBoolean(DefaultPreferences.MARK_READ_ON_CHANGE) != fPrefMarkReadOnFeedChange)
fPrefMarkReadOnFeedChange = defaultScope.getBoolean(DefaultPreferences.MARK_READ_ON_CHANGE);
if (otherScope.getBoolean(DefaultPreferences.MARK_READ_ON_TAB_CLOSE) != fPrefMarkReadOnTabClose)
fPrefMarkReadOnTabClose = defaultScope.getBoolean(DefaultPreferences.MARK_READ_ON_TAB_CLOSE);
if (otherScope.getBoolean(DefaultPreferences.MARK_READ_ON_SCROLLING) != fPrefMarkReadOnScrolling)
fPrefMarkReadOnScrolling = defaultScope.getBoolean(DefaultPreferences.MARK_READ_ON_SCROLLING);
}
}
/*
* @see org.rssowl.ui.dialogs.properties.IEntityPropertyPage#createContents(org.eclipse.swt.widgets.Composite)
*/
public Control createContents(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
container.setLayout(LayoutUtils.createGridLayout(1, 10, 10));
/* Mark read after millis */
Composite markReadAfterContainer = new Composite(container, SWT.None);
markReadAfterContainer.setLayout(LayoutUtils.createGridLayout(3, 0, 0));
/* Mark Read after Millis */
fMarkReadStateCheck = new Button(markReadAfterContainer, SWT.CHECK);
fMarkReadStateCheck.setText(Messages.ReadingPropertyPage_MARK_READ_AFTER);
fMarkReadStateCheck.setSelection(fPrefMarkReadState);
fMarkReadStateCheck.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
fMarkReadAfterSpinner.setEnabled(fMarkReadStateCheck.getSelection());
}
});
fMarkReadAfterSpinner = new Spinner(markReadAfterContainer, SWT.BORDER);
fMarkReadAfterSpinner.setMinimum(0);
fMarkReadAfterSpinner.setMaximum(100);
fMarkReadAfterSpinner.setSelection(fPrefMarkReadVal / 1000);
fMarkReadAfterSpinner.setEnabled(fMarkReadStateCheck.getSelection());
Label label = new Label(markReadAfterContainer, SWT.None);
label.setText(Messages.ReadingPropertyPage_SECONDS);
/* Mark Read on Scrolling */
fMarkReadOnScrolling = new Button(container, SWT.CHECK);
fMarkReadOnScrolling.setText(Messages.ReadingPropertyPage_MARK_READ_ON_SCROLLING);
fMarkReadOnScrolling.setSelection(fPrefMarkReadOnScrolling);
/* Mark Read on changing displayed Feed */
fMarkReadOnChange = new Button(container, SWT.CHECK);
fMarkReadOnChange.setText(Messages.ReadingPropertyPage_MARK_READ_ON_SWITCH);
fMarkReadOnChange.setSelection(fPrefMarkReadOnFeedChange);
/* Mark Read on closing Feed Tab */
fMarkReadOnTabClose = new Button(container, SWT.CHECK);
fMarkReadOnTabClose.setText(Messages.ReadingPropertyPage_MARK_READ_ON_CLOSE);
fMarkReadOnTabClose.setSelection(fPrefMarkReadOnTabClose);
/* Mark Read on Minimize */
fMarkReadOnMinimize = new Button(container, SWT.CHECK);
fMarkReadOnMinimize.setText(Messages.ReadingPropertyPage_MARK_READ_ON_MINIMIZE);
fMarkReadOnMinimize.setSelection(fPrefMarkReadOnMinimize);
return container;
}
/*
* @see org.rssowl.ui.dialogs.properties.IEntityPropertyPage#getImage()
*/
public ImageDescriptor getImage() {
return null;
}
/*
* @see org.rssowl.ui.dialogs.properties.IEntityPropertyPage#setFocus()
*/
public void setFocus() {}
/*
* @see org.rssowl.ui.dialogs.properties.IEntityPropertyPage#performOk(java.util.Set)
*/
public boolean performOk(Set<IEntity> entitiesToSave) {
fSettingsChanged = false;
/* Update this Entity */
for (IPreferenceScope scope : fEntityPreferences) {
if (updatePreferences(scope)) {
IEntity entityToSave = fEntities.get(fEntityPreferences.indexOf(scope));
entitiesToSave.add(entityToSave);
fSettingsChanged = true;
}
}
/* Update changes in all Childs as well if Folder */
for (IEntity entity : fEntities) {
if (fSettingsChanged && entity instanceof IFolder)
updateChildPreferences((IFolder) entity);
}
return true;
}
private void updateChildPreferences(IFolder folder) {
/* Update changes to Child-Marks */
List<IMark> marks = folder.getMarks();
for (IMark mark : marks) {
IPreferenceScope scope = Owl.getPreferenceService().getEntityScope(mark);
updatePreferences(scope);
}
/* Update changes to Child-Folders */
List<IFolder> folders = folder.getFolders();
for (IFolder childFolder : folders) {
IPreferenceScope scope = Owl.getPreferenceService().getEntityScope(childFolder);
updatePreferences(scope);
/* Recursively Proceed */
updateChildPreferences(childFolder);
}
}
private boolean updatePreferences(IPreferenceScope scope) {
boolean changed = false;
/* Mark Read after Millies */
boolean bVal = fMarkReadStateCheck.getSelection();
if (fPrefMarkReadState != bVal) {
scope.putBoolean(DefaultPreferences.MARK_READ_STATE, bVal);
changed = true;
}
int iVal = fMarkReadAfterSpinner.getSelection();
if (fPrefMarkReadVal != iVal) {
scope.putInteger(DefaultPreferences.MARK_READ_IN_MILLIS, iVal * 1000);
changed = true;
}
/* Mark Read on Minimize */
bVal = fMarkReadOnMinimize.getSelection();
if (fPrefMarkReadOnMinimize != bVal) {
scope.putBoolean(DefaultPreferences.MARK_READ_ON_MINIMIZE, bVal);
changed = true;
}
/* Mark Read on Feed Change */
bVal = fMarkReadOnChange.getSelection();
if (fPrefMarkReadOnFeedChange != bVal) {
scope.putBoolean(DefaultPreferences.MARK_READ_ON_CHANGE, bVal);
changed = true;
}
/* Mark Read on Tab Close */
bVal = fMarkReadOnTabClose.getSelection();
if (fPrefMarkReadOnTabClose != bVal) {
scope.putBoolean(DefaultPreferences.MARK_READ_ON_TAB_CLOSE, bVal);
changed = true;
}
/* Mark Read on Scrolling */
bVal = fMarkReadOnScrolling.getSelection();
if (fPrefMarkReadOnScrolling != bVal) {
scope.putBoolean(DefaultPreferences.MARK_READ_ON_SCROLLING, bVal);
changed = true;
}
return changed;
}
/*
* @see org.rssowl.ui.dialogs.properties.IEntityPropertyPage#finish()
*/
public void finish() {}
}