导入向导扩展点
可在插件和rcp平台中使用扩展点:org.eclipse.ui.importWizards
描述:此扩展点用来注册导入向导扩展。导入向导作为“导入对话框”内的选项出现,用来将资源导入工作台。
向导可选择指定其主体应包含有关向导的简短文本的描述子元素。
class:实现org.eclipse.ui.IImportWizard接口的类的标准名称
eg:
<extension
point="org.eclipse.ui.importWizards">
<category
id="org.rssowl.ui.RSSOwlImportCategory"
name="%category.name.2">
</category>
<wizard
category="org.rssowl.ui.RSSOwlImportCategory"
class="org.rssowl.ui.internal.dialogs.importer.ImportWizard"
icon="icons/obj16/bookmark.gif"
id="org.rssowl.ui.ImportWizard"
name="%wizard.name">
<description>
%wizard.description.4
</description>
</wizard>
</extension>
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.ui.IImportWizard;
import org.eclipse.ui.IWorkbench;
import org.rssowl.core.Owl;
import org.rssowl.core.internal.persist.pref.DefaultPreferences;
import org.rssowl.core.interpreter.ITypeImporter;
import org.rssowl.core.persist.IBookMark;
import org.rssowl.core.persist.IFolder;
import org.rssowl.core.persist.IFolderChild;
import org.rssowl.core.persist.ILabel;
import org.rssowl.core.persist.IModelFactory;
import org.rssowl.core.persist.INews;
import org.rssowl.core.persist.INewsBin;
import org.rssowl.core.persist.IPreference;
import org.rssowl.core.persist.ISearchField;
import org.rssowl.core.persist.ISearchFilter;
import org.rssowl.core.persist.ISearchMark;
import org.rssowl.core.persist.SearchSpecifier;
import org.rssowl.core.persist.dao.DynamicDAO;
import org.rssowl.core.persist.dao.IBookMarkDAO;
import org.rssowl.core.persist.pref.IPreferenceScope;
import org.rssowl.core.util.CoreUtils;
import org.rssowl.core.util.StringUtils;
import org.rssowl.ui.internal.Controller;
import org.rssowl.ui.internal.OwlUI;
import org.rssowl.ui.internal.actions.ReloadTypesAction;
import org.rssowl.ui.internal.dialogs.importer.ImportSourcePage.Source;
import org.rssowl.ui.internal.dialogs.welcome.WelcomeWizard;
import org.rssowl.ui.internal.editors.feed.NewsGrouping;
import org.rssowl.ui.internal.util.ImportUtils;
import org.rssowl.ui.internal.util.JobRunner;
import org.rssowl.ui.internal.views.explorer.BookMarkExplorer;
import java.util.EnumSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
/**
* A {@link Wizard} to import bookmarks, saved searches and bins with the option
* to also import settings (Labels, Filters, Properties) from OPML. Supports
* importing from local resources as well as remote.
*
* @author bpasero
*/
public class ImportWizard extends Wizard implements IImportWizard {
private ImportSourcePage fImportSourcePage;
private ImportElementsPage fImportElementsPage;
private ImportTargetPage fImportTargetPage;
private ImportOptionsPage fImportOptionsPage;
private String fWebsite;
private boolean fIsKewordSearch;
private boolean fIsWelcome;
/** Default Constructor */
public ImportWizard() {
this(null, false);
}
/*
* @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
*/
public void init(IWorkbench workbench, IStructuredSelection selection) {}
/**
* @param isWelcome if <code>true</code>, this wizard is used from the
* {@link WelcomeWizard}.
*/
public ImportWizard(boolean isWelcome) {
this(null, false);
fIsWelcome = isWelcome;
}
/**
* @param website a link to a website to discover feeds on.
* @param isKeywordSearch defines if the keyword search should be selected or
* not.
*/
public ImportWizard(String website, boolean isKeywordSearch) {
fWebsite = website;
fIsKewordSearch = isKeywordSearch;
}
/*
* @see org.eclipse.jface.wizard.Wizard#addPages()
*/
@Override
public void addPages() {
setWindowTitle(Messages.ImportWizard_IMPORT);
/* Page 1: Source to Import */
fImportSourcePage = new ImportSourcePage(fWebsite, fIsKewordSearch);
addPage(fImportSourcePage);
/* Page 2: Elements to Import */
fImportElementsPage = new ImportElementsPage();
addPage(fImportElementsPage);
/* Page 3: Target to Import */
fImportTargetPage = new ImportTargetPage();
addPage(fImportTargetPage);
/* Page 4: Import Options */
fImportOptionsPage = new ImportOptionsPage();
addPage(fImportOptionsPage);
}
/*
* @see org.eclipse.jface.wizard.Wizard#getNextPage(org.eclipse.jface.wizard.IWizardPage)
*/
@Override
public IWizardPage getNextPage(IWizardPage page) {
/* Jump to Options Page if required and skip Target if nothing selected */
if (page instanceof ImportElementsPage && !fImportSourcePage.isRemoteSource() && fImportElementsPage.getFolderChildsToImport().isEmpty() && fImportElementsPage.showOptionsPage())
return fImportOptionsPage;
/* Skip Options Page if not required after Target Page */
if (page instanceof ImportTargetPage && !fImportElementsPage.showOptionsPage())
return null;
return super.getNextPage(page);
}
/*
* @see org.eclipse.jface.wizard.Wizard#performFinish()
*/
@Override
public boolean performFinish() {
/* Directly Return if nothing to import */
if (fImportSourcePage.getSource() == Source.NONE)
return true;
/* Perform Import */
return doImport();
}
/*
* @see org.eclipse.jface.wizard.Wizard#canFinish()
*/
@Override
public boolean canFinish() {
/* Prohibit direct Finish from Sources that require a potential remote connection or include recommended feeds */
if (getContainer().getCurrentPage() == fImportSourcePage) {
if ((fImportSourcePage.getSource() == Source.RESOURCE) || fImportSourcePage.isRemoteSource() || (fImportSourcePage.getSource() == Source.RECOMMENDED))
return false;
}
/* Allow to Finish if nothing should be imported */
if (fImportSourcePage.getSource() == Source.NONE)
return true;
/* Other Pages decide on their own */
return super.canFinish();
}
private boolean doImport() {
/* Collect Elements to Import */
List<IFolderChild> folderChilds = fImportElementsPage.getFolderChildsToImport();
boolean isRSSOwlOPML = isRSSOwlOPMLImport(folderChilds);
if (fImportElementsPage.excludeExisting())
folderChilds = excludeExisting(folderChilds);
/* Check for Errors First */
if (StringUtils.isSet(fImportElementsPage.getErrorMessage())) {
getContainer().showPage(fImportElementsPage);
return false;
}
List<ILabel> labels = fImportElementsPage.getLabelsToImport();
List<ISearchFilter> filters = fImportElementsPage.getFiltersToImport();
List<IPreference> preferences = fImportElementsPage.getPreferencesToImport();
/* Normalize Elements to Import */
CoreUtils.normalize(folderChilds);
/* Get Target Location (may be null) */
IFolder target = fIsWelcome ? null : fImportTargetPage.getTargetLocation();
/* Get Options */
boolean importLabels = fImportOptionsPage.importLabels();
if (!importLabels)
labels = null;
boolean importFilters = fImportOptionsPage.importFilters();
if (!importFilters)
filters = null;
boolean importPreferences = fImportOptionsPage.importPreferences();
if (!importPreferences)
preferences = null;
/* Show warning and ask for confirmation if preferences should be imported */
if (!fIsWelcome && importPreferences && preferences != null && !preferences.isEmpty()) {
MessageDialog dialog = new MessageDialog(getShell(), Messages.ImportWizard_ATTENTION, null, Messages.ImportWizard_PREFERENCE_OVERWRITE, MessageDialog.WARNING, new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL }, 0);
if (dialog.open() != 0)
return false;
}
/* Run Import */
ImportUtils.doImport(target, folderChilds, labels, filters, preferences, !fIsWelcome);
/* Add Default Saved Searches if this is from Welcome Wizard */
if (fIsWelcome && !isRSSOwlOPML && !importLabels && !importFilters && !importPreferences)
addDefaultSearches();
/* Save Settings of Pages */
fImportSourcePage.saveSettings();
/* Ask for a restart if preferences have been imported */
if (importPreferences && preferences != null && !preferences.isEmpty()) {
boolean restart = MessageDialog.openQuestion(getShell(), Messages.ImportWizard_RESTART_RSSOWL, Messages.ImportWizard_RESTART_RSSOWL_INFO);
if (restart) {
BookMarkExplorer explorer = OwlUI.getOpenedBookMarkExplorer();
if (explorer != null)
explorer.saveStateOnDispose(false);
Controller.getDefault().restart();
return true;
}
}
/* Reveal and Select Target Folder */
if (target != null && target.getParent() != null) {
BookMarkExplorer explorer = OwlUI.getOpenedBookMarkExplorer();
if (explorer != null)
explorer.reveal(target, true);
}
/* Reload Imported Elements */
new ReloadTypesAction(new StructuredSelection(folderChilds), OwlUI.getPrimaryShell()).run();
/* Force to rerun saved searches */
JobRunner.runDelayedInBackgroundThread(new Runnable() {
public void run() {
Controller.getDefault().getSavedSearchService().updateSavedSearches(true);
}
});
return true;
}
private boolean isRSSOwlOPMLImport(List<IFolderChild> folderChilds) {
for (IFolderChild child : folderChilds) {
if (child instanceof IFolder && child.getParent() == null) {
IFolder set = (IFolder) child;
if (set.getProperty(ITypeImporter.TEMPORARY_FOLDER) == null)
return true;
}
}
return false;
}
/* Remove existing Bookmarks and Empty Folders */
private List<IFolderChild> excludeExisting(List<IFolderChild> folderChilds) {
IBookMarkDAO dao = DynamicDAO.getDAO(IBookMarkDAO.class);
for (Iterator<IFolderChild> iterator = folderChilds.iterator(); iterator.hasNext();) {
IFolderChild child = iterator.next();
/* Bookmark (exclude if another Bookmark with same Link exists) */
if (child instanceof IBookMark) {
IBookMark bm = (IBookMark) child;
if (dao.exists(bm.getFeedLinkReference()))
iterator.remove();
}
/* Bin (exclude if another Bin with same name Exists at same Location) */
else if (child instanceof INewsBin) {
INewsBin bin = (INewsBin) child;
if (CoreUtils.existsNewsBin(bin))
iterator.remove();
}
/* Search (exclude if another Search with same name Exists at same Location and same Conditions) */
else if (child instanceof ISearchMark) {
ISearchMark search = (ISearchMark) child;
if (CoreUtils.existsSearchMark(search))
iterator.remove();
}
/* Folder */
else if (child instanceof IFolder) {
excludeExisting((IFolder) child);
}
}
/* Exclude Empty Folders */
for (Iterator<IFolderChild> iterator = folderChilds.iterator(); iterator.hasNext();) {
IFolderChild child = iterator.next();
if (child instanceof IFolder && ((IFolder) child).getChildren().isEmpty())
iterator.remove();
}
return folderChilds;
}
/* Remove existing Bookmarks and Empty Folders */
private void excludeExisting(IFolder folder) {
IBookMarkDAO dao = DynamicDAO.getDAO(IBookMarkDAO.class);
List<IFolderChild> children = folder.getChildren();
for (IFolderChild child : children) {
/* Bookmark (exclude if another Bookmark with same Link exists) */
if (child instanceof IBookMark) {
IBookMark bm = (IBookMark) child;
if (dao.exists(bm.getFeedLinkReference()))
folder.removeChild(bm);
}
/* Bin (exclude if another Bin with same name Exists at same Location) */
else if (child instanceof INewsBin) {
INewsBin bin = (INewsBin) child;
if (CoreUtils.existsNewsBin(bin))
folder.removeChild(bin);
}
/* Search (exclude if another Search with same name Exists at same Location and same Conditions) */
else if (child instanceof ISearchMark) {
ISearchMark search = (ISearchMark) child;
if (CoreUtils.existsSearchMark(search))
folder.removeChild(search);
}
/* Folder */
else if (child instanceof IFolder) {
excludeExisting((IFolder) child);
}
}
/* Remove from Parent if Empty Now */
if (folder.getChildren().isEmpty() && folder.getParent() != null)
folder.getParent().removeChild(folder);
}
/*
* @see org.eclipse.jface.wizard.Wizard#needsProgressMonitor()
*/
@Override
public boolean needsProgressMonitor() {
return true;
}
private void addDefaultSearches() {
Set<IFolder> roots = CoreUtils.loadRootFolders();
if (roots.isEmpty())
return;
IFolder root = roots.iterator().next();
IModelFactory factory = Owl.getModelFactory();
String newsEntityName = INews.class.getName();
/* SearchCondition: New and Updated News */
{
ISearchMark mark = factory.createSearchMark(null, root, Messages.ImportWizard_NEW_UPDATED_NEWS);
mark.setMatchAllConditions(true);
ISearchField field1 = factory.createSearchField(INews.STATE, newsEntityName);
factory.createSearchCondition(null, mark, field1, SearchSpecifier.IS, EnumSet.of(INews.State.NEW, INews.State.UPDATED));
}
/* SearchCondition: Recent News */
{
ISearchMark mark = factory.createSearchMark(null, root, Messages.ImportWizard_RECENT_NEWS);
mark.setMatchAllConditions(true);
ISearchField field1 = factory.createSearchField(INews.AGE_IN_DAYS, newsEntityName);
factory.createSearchCondition(null, mark, field1, SearchSpecifier.IS_LESS_THAN, 2);
}
/* SearchCondition: News with Attachments */
{
ISearchMark mark = factory.createSearchMark(null, root, Messages.ImportWizard_NEWS_WITH_ATTACHMENTS);
mark.setMatchAllConditions(true);
ISearchField field = factory.createSearchField(INews.HAS_ATTACHMENTS, newsEntityName);
factory.createSearchCondition(null, mark, field, SearchSpecifier.IS, true);
}
/* SearchCondition: Sticky News */
{
ISearchMark mark = factory.createSearchMark(null, root, Messages.ImportWizard_STICKY_NEWS);
mark.setMatchAllConditions(true);
ISearchField field = factory.createSearchField(INews.IS_FLAGGED, newsEntityName);
factory.createSearchCondition(null, mark, field, SearchSpecifier.IS, true);
}
/* SearchCondition: News is Labeld */
{
ISearchMark mark = factory.createSearchMark(null, root, Messages.ImportWizard_LABELED_NEWS);
IPreferenceScope preferences = Owl.getPreferenceService().getEntityScope(mark);
preferences.putInteger(DefaultPreferences.BM_NEWS_GROUPING, NewsGrouping.Type.GROUP_BY_LABEL.ordinal());
ISearchField field = factory.createSearchField(INews.LABEL, newsEntityName);
factory.createSearchCondition(null, mark, field, SearchSpecifier.IS, "*"); //$NON-NLS-1$
}
DynamicDAO.save(root);
}
}
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.fieldassist.ContentProposalAdapter;
import org.eclipse.jface.fieldassist.SimpleContentProposalProvider;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
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.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.rssowl.core.Owl;
import org.rssowl.core.internal.persist.pref.DefaultPreferences;
import org.rssowl.core.persist.ILabel;
import org.rssowl.core.persist.dao.DynamicDAO;
import org.rssowl.core.persist.dao.ICategoryDAO;
import org.rssowl.core.persist.dao.ILabelDAO;
import org.rssowl.core.persist.dao.IPersonDAO;
import org.rssowl.core.persist.pref.IPreferenceScope;
import org.rssowl.core.util.Pair;
import org.rssowl.core.util.StringUtils;
import org.rssowl.core.util.URIUtils;
import org.rssowl.ui.internal.OwlUI;
import org.rssowl.ui.internal.dialogs.welcome.WelcomeWizard;
import org.rssowl.ui.internal.util.JobRunner;
import org.rssowl.ui.internal.util.LayoutUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.TreeSet;
/**
* A {@link WizardPage} to select the source of import.
*
* @author bpasero
*/
public class ImportSourcePage extends WizardPage {
/* Max number of Sources to remember */
private static final int MAX_REMEMBER_SOURCES = 20;
private Button fImportFromResourceRadio;
private Combo fResourceInput;
private Button fBrowseFileButton;
private Button fImportFromKeywordRadio;
private Combo fKeywordInput;
private Button fImportGoogleReaderRadio;
private Button fImportFromRecommendedRadio;
private Button fImportNoneRadio;
private IPreferenceScope fPreferences;
private boolean fIsAutoCompleteKeywordHooked;
private final String fWebsite;
private final boolean fIsKewordSearch;
private Button fLocalizedFeedSearch;
/** Sources for Import */
public enum Source {
/** User has decided against importing */
NONE,
/** User has provided a resource (either local or online) */
RESOURCE,
/** User wants to search feeds matching a keyword */
KEYWORD,
/** User wants to import from recommended */
RECOMMENDED,
/** User wants to import from Google Reader */
GOOGLE
}
ImportSourcePage(String website, boolean isKewordSearch) {
super(Messages.ImportSourcePage_CHOOSE_SOURCE, Messages.ImportSourcePage_CHOOSE_SOURCE, null);
fWebsite = website;
fIsKewordSearch = isKewordSearch;
fPreferences = Owl.getPreferenceService().getGlobalScope();
}
/**
* @return the type of Source to use for the Import
*/
public Source getSource() {
if (fImportFromResourceRadio.getSelection())
return Source.RESOURCE;
if (fImportGoogleReaderRadio.getSelection())
return Source.GOOGLE;
if (fImportFromKeywordRadio.getSelection())
return Source.KEYWORD;
if (fImportNoneRadio != null && fImportNoneRadio.getSelection())
return Source.NONE;
return Source.RECOMMENDED;
}
/* Returns the Resource to Import from or null if none */
String getImportResource() {
return fImportFromResourceRadio.getSelection() ? fResourceInput.getText() : null;
}
/* Returns the Keywords to Import from or null if none */
String getImportKeywords() {
return fImportFromKeywordRadio.getSelection() ? fKeywordInput.getText() : null;
}
/* Returns whether the source is only remotely accessible */
boolean isRemoteSource() {
Source source = getSource();
if (source == Source.KEYWORD)
return true;
if (source == Source.GOOGLE)
return true;
if (source == Source.RESOURCE) {
String resource = getImportResource();
if (!new File(resource).exists() && URIUtils.looksLikeLink(resource))
return true;
}
return false;
}
/* Returns whether the feed search should respect the client language */
boolean isLocalizedFeedSearch() {
return fLocalizedFeedSearch.getSelection();
}
/*
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent) {
boolean isWelcome = isWelcome();
/* Title Image */
setImageDescriptor(OwlUI.getImageDescriptor(isWelcome ? "icons/wizban/welcome_wiz.gif" : "icons/wizban/import_wiz.png")); //$NON-NLS-1$ //$NON-NLS-2$
/* Override Title and Message if this is the Welcome Wizard */
if (isWelcome) {
setTitle(Messages.ImportSourcePage_WELCOME);
setMessage(Messages.ImportSourcePage_WELCOME_INFO);
} else
setMessage(Messages.ImportSourcePage_CHOOSE_SOURCE_FOR_IMPORT);
/* Container */
Composite container = new Composite(parent, SWT.NONE);
container.setLayout(new GridLayout(1, false));
/* Welcome Wizard */
if (isWelcome) {
/* Import from Recommended Feeds */
createImportRecommendedControls(container);
/* Import from Google Reader */
createImportGoogleReaderControls(container);
/* Import from File or Website */
createImportResourceControls(container);
/* Import from Keyword Search */
createImportKeywordControls(container);
/* Import None */
createImportNoneControls(container);
}
/* Import Wizard */
else {
/* Import from File or Website */
createImportResourceControls(container);
/* Import from Keyword Search */
createImportKeywordControls(container);
/* Import from Google Reader */
createImportGoogleReaderControls(container);
/* Import from Recommended Feeds */
createImportRecommendedControls(container);
}
Dialog.applyDialogFont(container);
setControl(container);
updatePageComplete();
}
private void createImportResourceControls(Composite container) {
fImportFromResourceRadio = new Button(container, SWT.RADIO);
fImportFromResourceRadio.setSelection(!fIsKewordSearch && !isWelcome());
fImportFromResourceRadio.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
if (isWelcome())
((GridData) fImportFromResourceRadio.getLayoutData()).verticalIndent = 10;
fImportFromResourceRadio.setText(Messages.ImportSourcePage_IMPORT_FROM_FILE_OR_WEBSITE);
fImportFromResourceRadio.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updatePageComplete();
boolean importFromResource = fImportFromResourceRadio.getSelection();
fResourceInput.setEnabled(importFromResource);
fBrowseFileButton.setEnabled(importFromResource);
if (importFromResource)
fResourceInput.setFocus();
}
});
Composite sourceInputContainer = new Composite(container, SWT.NONE);
sourceInputContainer.setLayout(LayoutUtils.createGridLayout(2, 0, 0));
((GridLayout) sourceInputContainer.getLayout()).marginLeft = 15;
((GridLayout) sourceInputContainer.getLayout()).marginBottom = 10;
sourceInputContainer.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
fResourceInput = new Combo(sourceInputContainer, SWT.DROP_DOWN | SWT.BORDER);
OwlUI.makeAccessible(fResourceInput, fImportFromResourceRadio);
fResourceInput.setEnabled(fImportFromResourceRadio.getSelection());
fResourceInput.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
if (StringUtils.isSet(fWebsite))
fResourceInput.setText(fWebsite);
else if (!isWelcome() && !fIsKewordSearch) {
String cbLink = loadInitialLinkFromClipboard(sourceInputContainer.getDisplay());
if (StringUtils.isSet(cbLink))
fResourceInput.setText(cbLink);
}
if (fImportFromResourceRadio.getSelection())
fResourceInput.setFocus();
String[] previousResources = fPreferences.getStrings(DefaultPreferences.IMPORT_RESOURCES);
if (previousResources != null) {
fResourceInput.setVisibleItemCount(previousResources.length);
for (String source : previousResources) {
fResourceInput.add(source);
}
}
fResourceInput.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updatePageComplete();
}
});
fBrowseFileButton = new Button(sourceInputContainer, SWT.PUSH);
fBrowseFileButton.setText(Messages.ImportSourcePage_BROWSE);
fBrowseFileButton.setEnabled(fImportFromResourceRadio.getSelection());
Dialog.applyDialogFont(fBrowseFileButton);
setButtonLayoutData(fBrowseFileButton);
fBrowseFileButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
onBrowse();
}
});
}
private String loadInitialLinkFromClipboard(Display display) {
Clipboard cb = new Clipboard(display);
TextTransfer transfer = TextTransfer.getInstance();
String data = (String) cb.getContents(transfer);
data = (data != null) ? data.trim() : null;
cb.dispose();
if (URIUtils.looksLikeLink(data))
return URIUtils.ensureProtocol(data);
return null;
}
private void createImportKeywordControls(Composite container) {
fImportFromKeywordRadio = new Button(container, SWT.RADIO);
fImportFromKeywordRadio.setSelection(fIsKewordSearch && !isWelcome());
fImportFromKeywordRadio.setText(Messages.ImportSourcePage_IMPORT_BY_KEYWORD);
fImportFromKeywordRadio.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updatePageComplete();
boolean importFromKeyword = fImportFromKeywordRadio.getSelection();
fKeywordInput.setEnabled(importFromKeyword);
fLocalizedFeedSearch.setEnabled(importFromKeyword);
if (importFromKeyword) {
hookKeywordAutocomplete(false);
fKeywordInput.setFocus();
}
}
});
Composite keywordInputContainer = new Composite(container, SWT.NONE);
keywordInputContainer.setLayout(LayoutUtils.createGridLayout(1, 0, 0));
((GridLayout) keywordInputContainer.getLayout()).marginLeft = 15;
((GridLayout) keywordInputContainer.getLayout()).marginBottom = 10;
keywordInputContainer.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
fKeywordInput = new Combo(keywordInputContainer, SWT.DROP_DOWN | SWT.BORDER);
OwlUI.makeAccessible(fKeywordInput, fImportFromKeywordRadio);
fKeywordInput.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
fKeywordInput.setEnabled(fImportFromKeywordRadio.getSelection());
if (fImportFromKeywordRadio.getSelection()) {
hookKeywordAutocomplete(true);
fKeywordInput.setFocus();
}
String[] previousKeywords = fPreferences.getStrings(DefaultPreferences.IMPORT_KEYWORDS);
if (previousKeywords != null) {
fKeywordInput.setVisibleItemCount(previousKeywords.length);
for (String keyword : previousKeywords) {
fKeywordInput.add(keyword);
}
}
fKeywordInput.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
updatePageComplete();
}
});
fLocalizedFeedSearch = new Button(keywordInputContainer, SWT.CHECK);
fLocalizedFeedSearch.setSelection(fPreferences.getBoolean(DefaultPreferences.LOCALIZED_FEED_SEARCH));
fLocalizedFeedSearch.setEnabled(fImportFromKeywordRadio.getSelection());
String clientLanguage = Locale.getDefault().getDisplayLanguage(Locale.ENGLISH);
if (StringUtils.isSet(clientLanguage))
fLocalizedFeedSearch.setText(NLS.bind(Messages.ImportSourcePage_MATCH_LANGUAGE_N, clientLanguage));
else
fLocalizedFeedSearch.setText(Messages.ImportSourcePage_MATCH_LANGUAGE);
}
private void createImportGoogleReaderControls(Composite container) {
fImportGoogleReaderRadio = new Button(container, SWT.RADIO);
fImportGoogleReaderRadio.setText(Messages.ImportSourcePage_IMPORT_GOOGLE_READER);
fImportGoogleReaderRadio.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
if (isWelcome())
((GridData) fImportGoogleReaderRadio.getLayoutData()).verticalIndent = 10;
fImportGoogleReaderRadio.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updatePageComplete();
}
});
}
private void createImportRecommendedControls(Composite container) {
fImportFromRecommendedRadio = new Button(container, SWT.RADIO);
fImportFromRecommendedRadio.setText(Messages.ImportSourcePage_IMPORT_RECOMMENDED);
fImportFromRecommendedRadio.setSelection(isWelcome());
fImportFromRecommendedRadio.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
if (!isWelcome())
((GridData) fImportFromRecommendedRadio.getLayoutData()).verticalIndent = 10;
fImportFromRecommendedRadio.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updatePageComplete();
}
});
}
private void createImportNoneControls(Composite container) {
fImportNoneRadio = new Button(container, SWT.RADIO);
fImportNoneRadio.setText(Messages.ImportSourcePage_NO_MPORT);
fImportNoneRadio.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
fImportNoneRadio.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
updatePageComplete();
}
});
}
private void onBrowse() {
FileDialog dialog = new FileDialog(getShell());
dialog.setText(Messages.ImportSourcePage_CHOOSE_FILE);
/* Set Export Formats also for Import (we assume this is supported) */
List<String> filterExtensions = new ArrayList<String>();
filterExtensions.add("*.opml"); //$NON-NLS-1$
filterExtensions.add("*.xml"); //$NON-NLS-1$
Collection<String> exportFormats = Owl.getInterpreter().getExportFormats();
for (String exportFormat : exportFormats) {
String format = "*." + exportFormat.toLowerCase(); //$NON-NLS-1$
if (!filterExtensions.contains(format))
filterExtensions.add(format);
}
if (!filterExtensions.contains("*.*")) //$NON-NLS-1$
filterExtensions.add("*.*"); //$NON-NLS-1$
dialog.setFilterExtensions(filterExtensions.toArray(new String[filterExtensions.size()]));
if (StringUtils.isSet(fResourceInput.getText()))
dialog.setFileName(fResourceInput.getText());
String string = dialog.open();
if (string != null)
fResourceInput.setText(string);
updatePageComplete();
}
private void updatePageComplete() {
String errorMessage = null;
/* Import Default */
if (fImportFromRecommendedRadio.getSelection())
setPageComplete(true);
/* Import Google Reader */
if (fImportGoogleReaderRadio.getSelection())
setPageComplete(true);
/* Import None */
else if (fImportNoneRadio != null && fImportNoneRadio.getSelection())
setPageComplete(true);
/* Import from Resource */
else if (fImportFromResourceRadio.getSelection()) {
if (!StringUtils.isSet(fResourceInput.getText()))
setPageComplete(false);
else {
if (isRemoteSource())
setPageComplete(true);
else {
String filePath = fResourceInput.getText();
File fileToImport = new File(filePath);
boolean fileExists = fileToImport.exists() && fileToImport.isFile();
setPageComplete(fileExists);
if (!fileExists)
errorMessage = Messages.ImportSourcePage_CHOOSE_EXISTING_FILE;
}
}
}
/* Import From Keywords */
else if (fImportFromKeywordRadio.getSelection())
setPageComplete(StringUtils.isSet(fKeywordInput.getText()));
/* Set Error Message */
if (errorMessage != null)
setErrorMessage(errorMessage);
/* Restore Normal Message */
else {
setErrorMessage(null);
setMessage(isWelcome() ? Messages.ImportSourcePage_WELCOME_INFO : Messages.ImportSourcePage_CHOOSE_SOURCE_FOR_IMPORT);
}
}
private boolean isWelcome() {
return getWizard() instanceof WelcomeWizard;
}
/* Save Import Sources */
void saveSettings() {
/* Import Resources */
saveComboSettings(fImportFromResourceRadio.getSelection() ? fResourceInput.getText() : null, DefaultPreferences.IMPORT_RESOURCES);
/* Import Keywords */
saveComboSettings(fImportFromKeywordRadio.getSelection() ? fKeywordInput.getText() : null, DefaultPreferences.IMPORT_KEYWORDS);
fPreferences.putBoolean(DefaultPreferences.LOCALIZED_FEED_SEARCH, fLocalizedFeedSearch.getSelection());
}
private void saveComboSettings(String valueToAdd, String prefKey) {
/* First fill current as new one */
List<String> newValues = new ArrayList<String>();
if (StringUtils.isSet(valueToAdd))
newValues.add(valueToAdd);
/* Then add up to N more old ones to remember */
String[] oldValues = fPreferences.getStrings(prefKey);
if (oldValues != null) {
for (int i = 0; i < oldValues.length && newValues.size() < MAX_REMEMBER_SOURCES; i++) {
if (!newValues.contains(oldValues[i]))
newValues.add(oldValues[i]);
}
}
/* Save List */
if (!newValues.isEmpty())
fPreferences.putStrings(prefKey, newValues.toArray(new String[newValues.size()]));
}
private void hookKeywordAutocomplete(boolean delay) {
/* No Content Assist on First Welcome Wizard */
if (isWelcome())
return;
/* Only perform once */
if (fIsAutoCompleteKeywordHooked)
return;
fIsAutoCompleteKeywordHooked = true;
final Pair<SimpleContentProposalProvider, ContentProposalAdapter> autoComplete = OwlUI.hookAutoComplete(fKeywordInput, null, true);
/* Load proposals in the Background */
JobRunner.runInBackgroundThread(delay ? 100 : 0, new Runnable() {
public void run() {
if (!fKeywordInput.isDisposed()) {
Set<String> values = new TreeSet<String>(new Comparator<String>() {
public int compare(String o1, String o2) {
return o1.compareToIgnoreCase(o2);
}
});
/* Add all Categories */
values.addAll(DynamicDAO.getDAO(ICategoryDAO.class).loadAllNames());
/* Add all Authors */
values.addAll(DynamicDAO.getDAO(IPersonDAO.class).loadAllNames());
/* Add all Labels */
Collection<ILabel> labels = DynamicDAO.getDAO(ILabelDAO.class).loadAll();
for (ILabel label : labels) {
values.add(label.getName());
}
/* Apply Proposals */
if (!fKeywordInput.isDisposed())
OwlUI.applyAutoCompleteProposals(values, autoComplete.getFirst(), autoComplete.getSecond());
}
}
});
}
}