扩展点总结之org.eclipse.ui.importWizards

来源:互联网 发布:centos如何绑定IP 编辑:程序博客网 时间:2024/06/10 04:01

导入向导扩展点

可在插件和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());
        }
      }
    });
  }
}

原创粉丝点击