/* ********************************************************************** **
** 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;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewer;
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.Point;
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.swt.widgets.Shell;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.rssowl.core.Owl;
import org.rssowl.core.internal.persist.pref.DefaultPreferences;
import org.rssowl.core.persist.pref.IPreferenceScope;
import org.rssowl.core.util.StringUtils;
import org.rssowl.ui.internal.ApplicationWorkbenchWindowAdvisor;
import org.rssowl.ui.internal.OwlUI;
import org.rssowl.ui.internal.util.CColumnLayoutData;
import org.rssowl.ui.internal.util.CTable;
import org.rssowl.ui.internal.util.LayoutUtils;
import org.rssowl.ui.internal.util.CColumnLayoutData.Size;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* A dialog to list web sites allowing to add and remove sites.
*
* @author bpasero
*/
public class WebsiteListDialog extends Dialog {
private IPreferenceScope fPreferences = Owl.getPreferenceService().getGlobalScope();
private TableViewer fViewer;
private Text fWebsiteInput;
private Button fRemoveSelectedButton;
/**
* @param parentShell
*/
public WebsiteListDialog(Shell parentShell) {
super(parentShell);
}
/*
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(LayoutUtils.createGridLayout(2, 10, 10));
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
/* Info Label */
Label infoLabel = new Label(composite, SWT.None);
infoLabel.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, false, false, 2, 1));
infoLabel.setText(Messages.WebsiteListDialog_ENTER_WEBSITE);
/* URL Input */
fWebsiteInput = new Text(composite, SWT.BORDER | SWT.SINGLE);
fWebsiteInput.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
fWebsiteInput.setFocus();
Button addWebsiteButton = new Button(composite, SWT.PUSH);
addWebsiteButton.getShell().setDefaultButton(addWebsiteButton);
addWebsiteButton.setText(Messages.WebsiteListDialog_ADD);
applyDialogFont(addWebsiteButton);
setButtonLayoutData(addWebsiteButton);
addWebsiteButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
onAdd();
}
});
/* Website List Viewer */
Composite tableContainer = new Composite(composite, SWT.NONE);
tableContainer.setLayout(LayoutUtils.createGridLayout(1, 0, 0));
tableContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
CTable cTable = new CTable(tableContainer, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
fViewer = new TableViewer(cTable.getControl());
fViewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
fViewer.getTable().setHeaderVisible(true);
((GridData) fViewer.getTable().getLayoutData()).heightHint = fViewer.getTable().getItemHeight() * 10;
fViewer.getTable().setData(ApplicationWorkbenchWindowAdvisor.FOCUSLESS_SCROLL_HOOK, new Object());
TableColumn nameCol = new TableColumn(fViewer.getTable(), SWT.NONE);
CColumnLayoutData data = new CColumnLayoutData(Size.FILL, 100);
cTable.manageColumn(nameCol, data, Messages.WebsiteListDialog_WEBSITE, null, null, false, false);
/* ContentProvider returns all providers */
fViewer.setContentProvider(new ArrayContentProvider());
/* Label Provider */
fViewer.setLabelProvider(new CellLabelProvider() {
@Override
public void update(ViewerCell cell) {
cell.setText(cell.getElement().toString());
}
});
fViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(SelectionChangedEvent event) {
fRemoveSelectedButton.setEnabled(!event.getSelection().isEmpty());
}
});
/* Set input */
fViewer.setInput(fPreferences.getStrings(DefaultPreferences.DISABLE_JAVASCRIPT_EXCEPTIONS));
applyDialogFont(composite);
return composite;
}
/*
* @see org.eclipse.jface.dialogs.Dialog#createButtonBar(org.eclipse.swt.widgets.Composite)
*/
@Override
protected Control createButtonBar(Composite parent) {
Composite buttonBar = (Composite) super.createButtonBar(parent);
((GridLayout) buttonBar.getLayout()).marginHeight = 0;
((GridLayout) buttonBar.getLayout()).marginBottom = 10;
((GridLayout) buttonBar.getLayout()).makeColumnsEqualWidth = false;
((GridData) buttonBar.getLayoutData()).horizontalAlignment = SWT.FILL;
return buttonBar;
}
/*
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
@Override
protected void configureShell(Shell newShell) {
super.configureShell(newShell);
newShell.setText(Messages.WebsiteListDialog_JS_EXCEPTIONS);
}
/*
* @see org.eclipse.jface.window.Window#getShellStyle()
*/
@Override
protected int getShellStyle() {
int style = SWT.APPLICATION_MODAL | SWT.TITLE | SWT.BORDER | SWT.RESIZE | SWT.CLOSE | getDefaultOrientation();
return style;
}
/*
* @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
*/
@Override
protected void createButtonsForButtonBar(Composite parent) {
/* Remove Selected */
fRemoveSelectedButton = createButton(parent, -1, Messages.WebsiteListDialog_REMOVE_WEBSITE, false);
((GridData) fRemoveSelectedButton.getLayoutData()).horizontalAlignment = SWT.BEGINNING;
((GridData) fRemoveSelectedButton.getLayoutData()).grabExcessHorizontalSpace = false;
fRemoveSelectedButton.setEnabled(false);
fRemoveSelectedButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
onRemoveSelected();
}
});
/* Remove All */
Button removeAllButton = createButton(parent, -2, Messages.WebsiteListDialog_REMOVE_ALL_WEBSITES, false);
((GridData) removeAllButton.getLayoutData()).horizontalAlignment = SWT.BEGINNING;
((GridData) removeAllButton.getLayoutData()).grabExcessHorizontalSpace = false;
removeAllButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
onRemoveAll();
}
});
/* Close */
Button closeButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.CLOSE_LABEL, false);
int widthHint = ((GridData) closeButton.getLayoutData()).widthHint;
closeButton.setLayoutData(new GridData(SWT.END, SWT.BEGINNING, true, false));
((GridData) closeButton.getLayoutData()).widthHint = widthHint;
}
private void onAdd() {
String website = StringUtils.normalizeString(fWebsiteInput.getText());
if (StringUtils.isSet(website)) {
String[] websites = fPreferences.getStrings(DefaultPreferences.DISABLE_JAVASCRIPT_EXCEPTIONS);
if (websites == null)
websites = new String[0];
List<String> newWebsites = new ArrayList<String>(Arrays.asList(websites));
if (!newWebsites.contains(website))
newWebsites.add(website);
String[] newWebsitesArray = newWebsites.toArray(new String[newWebsites.size()]);
fPreferences.putStrings(DefaultPreferences.DISABLE_JAVASCRIPT_EXCEPTIONS, newWebsitesArray);
fViewer.setInput(newWebsitesArray);
}
fWebsiteInput.setText(""); //$NON-NLS-1$
fWebsiteInput.setFocus();
}
private void onRemoveAll() {
fPreferences.delete(DefaultPreferences.DISABLE_JAVASCRIPT_EXCEPTIONS);
fViewer.setInput(new String[0]);
}
private void onRemoveSelected() {
String[] websites = fPreferences.getStrings(DefaultPreferences.DISABLE_JAVASCRIPT_EXCEPTIONS);
List<String> newWebsites = new ArrayList<String>(Arrays.asList(websites));
IStructuredSelection selection = (IStructuredSelection) fViewer.getSelection();
List<?> list = selection.toList();
for (Object object : list) {
String website = (String) object;
newWebsites.remove(website);
}
String[] newWebsitesArray = newWebsites.toArray(new String[newWebsites.size()]);
fPreferences.putStrings(DefaultPreferences.DISABLE_JAVASCRIPT_EXCEPTIONS, newWebsitesArray);
fViewer.setInput(newWebsitesArray);
}
/*
* @see org.eclipse.jface.dialogs.Dialog#initializeBounds()
*/
@Override
protected void initializeBounds() {
super.initializeBounds();
Shell shell = getShell();
/* Minimum Size */
int minWidth = convertHorizontalDLUsToPixels(OwlUI.MIN_DIALOG_WIDTH_DLU);
int minHeight = shell.computeSize(minWidth, SWT.DEFAULT).y;
/* Required Size */
Point requiredSize = shell.computeSize(SWT.DEFAULT, SWT.DEFAULT);
shell.setSize(Math.max(minWidth, requiredSize.x), Math.max(minHeight, requiredSize.y));
LayoutUtils.positionShell(shell);
}
}