/* ********************************************************************** ** ** 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.IDialogConstants; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.resource.LocalResourceManager; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; 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.rssowl.core.Owl; import org.rssowl.core.internal.persist.pref.DefaultPreferences; import org.rssowl.core.persist.pref.IPreferenceScope; import org.rssowl.ui.internal.Activator; import org.rssowl.ui.internal.OwlUI; import org.rssowl.ui.internal.util.JobRunner; import org.rssowl.ui.internal.util.LayoutUtils; /** * A Dialog to show activity, such as the progress of updating feeds or * downloading attachments. * <p> * TODO This dialog uses internal Eclipse classes (Progress Viewer) that can * break over future releases. * </p> * * @author bpasero */ public class ActivityDialog extends TitleAreaDialog { /* Keep the visible instance saved */ private static ActivityDialog fgVisibleInstance; /* Section for Dialogs Settings */ private static final String SETTINGS_SECTION = "org.rssowl.ui.internal.dialogs.ActivityDialog"; //$NON-NLS-1$ /* Minimum Height in DLUs */ private static final int MIN_DIALOG_HEIGHT_DLU = 160; @SuppressWarnings("restriction") private org.eclipse.ui.internal.progress.DetailedProgressViewer fViewer; private LocalResourceManager fResources; private IDialogSettings fDialogSettings; private boolean fFirstTimeOpen; private Button fHideCompletedCheck; private IPreferenceScope fPreferences; /** * @param parentShell */ public ActivityDialog(Shell parentShell) { super(parentShell); fResources = new LocalResourceManager(JFaceResources.getResources()); fDialogSettings = Activator.getDefault().getDialogSettings(); fFirstTimeOpen = (fDialogSettings.getSection(SETTINGS_SECTION) == null); fPreferences = Owl.getPreferenceService().getGlobalScope(); } /** * @return Returns an instance of <code>ActivityDialog</code> or * <code>NULL</code> in case no instance is currently open. */ public static ActivityDialog getVisibleInstance() { return fgVisibleInstance; } /* * @see org.eclipse.jface.window.Window#open() */ @Override public int open() { fgVisibleInstance = this; return super.open(); } /* * @see org.eclipse.jface.dialogs.TitleAreaDialog#close() */ @Override public boolean close() { fgVisibleInstance = null; fResources.dispose(); return super.close(); } /* * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) */ @Override protected void configureShell(Shell shell) { super.configureShell(shell); shell.setText(Messages.ActivityDialog_DOWNLOADS_ACTIVITY); shell.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { fgVisibleInstance = null; } }); } /* * @see org.eclipse.jface.dialogs.TitleAreaDialog#createContents(org.eclipse.swt.widgets.Composite) */ @Override protected Control createContents(Composite parent) { Control c = super.createContents(parent); getButton(IDialogConstants.OK_ID).setFocus(); return c; } /* * @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite) */ @SuppressWarnings("restriction") @Override protected Control createDialogArea(Composite parent) { /* Title */ setTitle(Messages.ActivityDialog_DOWNLOADS_AND_ACTIVITY); /* Title Image */ setTitleImage(OwlUI.getImage(fResources, "icons/wizban/activity_wiz.png")); //$NON-NLS-1$ /* Title Message */ setMessage(Messages.ActivityDialog_ACTIVITY_INFO); /* Separator */ new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL).setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false)); /* Composite to hold all components */ Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(LayoutUtils.createGridLayout(1, 0, 0)); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); /* Progress Viewer */ fViewer = new org.eclipse.ui.internal.progress.DetailedProgressViewer(composite, SWT.NONE); fViewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); /* Content Provider */ boolean hideCompleted = fPreferences.getBoolean(DefaultPreferences.HIDE_COMPLETED_DOWNLOADS); fViewer.setContentProvider(new org.eclipse.ui.internal.progress.ProgressViewerContentProvider(fViewer, false, !hideCompleted)); /* Comparator */ fViewer.setComparator(new ViewerComparator() { @SuppressWarnings("unchecked") @Override public int compare(Viewer viewer, Object obj1, Object obj2) { if (obj1 instanceof Comparable && obj2 instanceof Comparable) return ((Comparable) obj1).compareTo(obj2); return super.compare(viewer, obj1, obj2); } }); /* Input */ fViewer.setInput(org.eclipse.ui.internal.progress.ProgressManager.getInstance()); /* Bug: The initial size is not set properly for the List */ updateViewerSize(); /* Separator */ new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL).setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false)); applyDialogFont(composite); return composite; } @SuppressWarnings("restriction") private void updateViewerSize() { Point size = fViewer.getControl().computeSize(SWT.DEFAULT, SWT.DEFAULT); size.x += IDialogConstants.HORIZONTAL_SPACING; size.y += IDialogConstants.VERTICAL_SPACING; ((ScrolledComposite) fViewer.getControl()).setMinSize(size); } /* * @see org.eclipse.jface.window.Window#getShellStyle() */ @Override protected int getShellStyle() { int style = SWT.MIN | SWT.TITLE | SWT.BORDER | SWT.RESIZE | SWT.CLOSE | getDefaultOrientation(); return style; } /* * @see org.eclipse.jface.dialogs.TrayDialog#createButtonBar(org.eclipse.swt.widgets.Composite) */ @Override protected Control createButtonBar(Composite parent) { GridLayout layout = new GridLayout(1, false); layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN); layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN); layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING); layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING); Composite buttonBar = new Composite(parent, SWT.NONE); buttonBar.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false)); buttonBar.setLayout(layout); /* Keep or Hide Completed Downloads */ fHideCompletedCheck = new Button(buttonBar, SWT.CHECK); fHideCompletedCheck.setText(Messages.ActivityDialog_REMOVE_COMPLETED); fHideCompletedCheck.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); fHideCompletedCheck.setSelection(fPreferences.getBoolean(DefaultPreferences.HIDE_COMPLETED_DOWNLOADS)); fHideCompletedCheck.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { final boolean hideCompleted = fHideCompletedCheck.getSelection(); refreshProgressViewer(hideCompleted); JobRunner.runInBackgroundThread(new Runnable() { public void run() { fPreferences.putBoolean(DefaultPreferences.HIDE_COMPLETED_DOWNLOADS, hideCompleted); } }); } }); /* OK */ createButton(buttonBar, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); return buttonBar; } @SuppressWarnings("restriction") private void refreshProgressViewer(boolean hideCompleted) { fViewer.setContentProvider(new org.eclipse.ui.internal.progress.ProgressViewerContentProvider(fViewer, false, !hideCompleted)); } /* * @see org.eclipse.jface.dialogs.Dialog#getDialogBoundsSettings() */ @Override protected IDialogSettings getDialogBoundsSettings() { IDialogSettings section = fDialogSettings.getSection(SETTINGS_SECTION); if (section != null) return section; return fDialogSettings.addNewSection(SETTINGS_SECTION); } /* * @see org.eclipse.jface.dialogs.Dialog#initializeBounds() */ @Override protected void initializeBounds() { super.initializeBounds(); /* No dialog settings stored */ if (fFirstTimeOpen) { Shell shell = getShell(); /* Minimum Size */ int minWidth = convertHorizontalDLUsToPixels(OwlUI.MIN_DIALOG_WIDTH_DLU); int minHeight = convertVerticalDLUsToPixels(MIN_DIALOG_HEIGHT_DLU); /* 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); } } }