Package org.rssowl.ui.internal.dialogs

Source Code of org.rssowl.ui.internal.dialogs.SearchMarkWizard$NewSearchMarkWizardPage

/*   **********************************************************************  **
**   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.resource.JFaceResources;
import org.eclipse.jface.resource.LocalResourceManager;
import org.eclipse.jface.resource.ResourceManager;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
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.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.INewWizard;
import org.eclipse.ui.IWorkbench;
import org.rssowl.core.Owl;
import org.rssowl.core.persist.IEntity;
import org.rssowl.core.persist.IFolder;
import org.rssowl.core.persist.IFolderChild;
import org.rssowl.core.persist.IModelFactory;
import org.rssowl.core.persist.INews;
import org.rssowl.core.persist.ISearchCondition;
import org.rssowl.core.persist.ISearchField;
import org.rssowl.core.persist.ISearchMark;
import org.rssowl.core.persist.SearchSpecifier;
import org.rssowl.core.persist.dao.DynamicDAO;
import org.rssowl.core.util.CoreUtils;
import org.rssowl.core.util.Pair;
import org.rssowl.core.util.StringUtils;
import org.rssowl.ui.internal.Controller;
import org.rssowl.ui.internal.OwlUI;
import org.rssowl.ui.internal.search.LocationControl;
import org.rssowl.ui.internal.search.SearchConditionList;
import org.rssowl.ui.internal.util.FolderChooser;
import org.rssowl.ui.internal.util.LayoutUtils;
import org.rssowl.ui.internal.util.FolderChooser.ExpandStrategy;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
* The {@link SearchMarkWizard} is only used in the Eclipse Integration to
* create new Folders.
*
* @author bpasero
*/
public class SearchMarkWizard extends Wizard implements INewWizard {
  private NewSearchMarkWizardPage fPage;
  private IFolderChild fPosition;
  private IFolder fFolder;
  private ResourceManager fResources = new LocalResourceManager(JFaceResources.getResources());

  /* Page for Wizard */
  private class NewSearchMarkWizardPage extends WizardPage {
    private Text fNameInput;
    private FolderChooser fFolderChooser;
    private Button fMatchAllRadio;
    private Button fMatchAnyRadio;
    private SearchConditionList fSearchConditionList;
    private LocationControl fLocationControl;

    NewSearchMarkWizardPage(String pageName) {
      super(pageName, pageName, OwlUI.getImageDescriptor("icons/wizban/search.gif")); //$NON-NLS-1$
      setMessage(Messages.SearchMarkWizard_SEARCH_WIZ_TITLE);
    }

    public void createControl(Composite parent) {
      Composite control = new Composite(parent, SWT.NONE);
      control.setLayout(new GridLayout(2, false));

      Label nameLabel = new Label(control, SWT.NONE);
      nameLabel.setText(Messages.SearchMarkWizard_NAME);

      Composite nameContainer = new Composite(control, SWT.BORDER);
      nameContainer.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
      nameContainer.setLayout(LayoutUtils.createGridLayout(2, 0, 0));
      nameContainer.setBackground(control.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));

      fNameInput = new Text(nameContainer, SWT.SINGLE);
      OwlUI.makeAccessible(fNameInput, nameLabel);
      fNameInput.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
      fNameInput.addModifyListener(new ModifyListener() {
        public void modifyText(ModifyEvent e) {
          setErrorMessage(null);
        }
      });

      ToolBar generateTitleBar = new ToolBar(nameContainer, SWT.FLAT);
      OwlUI.makeAccessible(generateTitleBar, Messages.SearchMarkDialog_CREATE_NAME_FROM_CONDITIONS);
      generateTitleBar.setBackground(control.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));

      ToolItem generateTitleItem = new ToolItem(generateTitleBar, SWT.PUSH);
      generateTitleItem.setImage(OwlUI.getImage(fResources, "icons/etool16/info.gif")); //$NON-NLS-1$
      generateTitleItem.setToolTipText(Messages.SearchMarkDialog_CREATE_NAME_FROM_CONDITIONS);
      generateTitleItem.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
          onGenerateName();
        }
      });

      Label folderLabel = new Label(control, SWT.NONE);
      folderLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
      folderLabel.setText(Messages.SearchMarkWizard_LOCATION);

      /* Folder Chooser */
      fFolderChooser = new FolderChooser(control, fFolder, SWT.BORDER, true);
      fFolderChooser.setExpandStrategy(ExpandStrategy.PACK);
      fFolderChooser.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));
      fFolderChooser.setLayout(LayoutUtils.createGridLayout(1, 0, 0, 2, 5, false));
      fFolderChooser.setBackground(control.getDisplay().getSystemColor(SWT.COLOR_WHITE));

      Composite topControlsContainer = new Composite(control, SWT.None);
      topControlsContainer.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false, 2, 1));
      topControlsContainer.setLayout(LayoutUtils.createGridLayout(4, 5, 0));
      ((GridLayout) topControlsContainer.getLayout()).marginTop = 10;

      fMatchAllRadio = new Button(topControlsContainer, SWT.RADIO);
      fMatchAllRadio.setText(Messages.SearchMarkDialog_MATCH_ALL_CONDITIONS);
      fMatchAllRadio.setSelection(true);

      fMatchAnyRadio = new Button(topControlsContainer, SWT.RADIO);
      fMatchAnyRadio.setText(Messages.SearchMarkDialog_MATCH_ANY_CONDITION);

      /* Separator */
      Label sep = new Label(topControlsContainer, SWT.SEPARATOR | SWT.VERTICAL);
      sep.setLayoutData(new GridData(SWT.DEFAULT, 20));

      /* Scope */
      Composite scopeContainer = new Composite(topControlsContainer, SWT.None);
      scopeContainer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
      scopeContainer.setLayout(LayoutUtils.createGridLayout(2, 0, 0, 0, 5, false));

      Label locationLabel = new Label(scopeContainer, SWT.NONE);
      locationLabel.setText(Messages.SearchMarkDialog_SEARCH_IN);

      fLocationControl = new LocationControl(scopeContainer, SWT.WRAP) {
        @Override
        protected String getDefaultLabel() {
          return Messages.SearchMarkWizard_ALL_NEWS;
        }
      };
      fLocationControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true));
      ((GridData) fLocationControl.getLayoutData()).widthHint = 100;
      fLocationControl.setLayout(LayoutUtils.createGridLayout(1, 0, 0, 0, 0, false));

      Composite conditionsContainer = new Composite(control, SWT.BORDER);
      conditionsContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
      conditionsContainer.setLayout(LayoutUtils.createGridLayout(2));
      conditionsContainer.setBackground(control.getDisplay().getSystemColor(SWT.COLOR_WHITE));
      conditionsContainer.setBackgroundMode(SWT.INHERIT_FORCE);

      /* Search Conditions List */
      fSearchConditionList = new SearchConditionList(conditionsContainer, SWT.None, getDefaultConditions());
      fSearchConditionList.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
      fSearchConditionList.setVisibleItemCount(3);

      setControl(control);
    }

    void onGenerateName() {
      List<ISearchCondition> conditions = fSearchConditionList.createConditions();
      ISearchCondition locationCondition = fLocationControl.toScopeCondition();
      if (locationCondition != null)
        conditions.add(locationCondition);

      String name = CoreUtils.getName(conditions, fMatchAllRadio.getSelection());
      if (name.length() > 0) {
        fNameInput.setText(name);
        fNameInput.selectAll();
      }
    }

    private List<ISearchCondition> getDefaultConditions() {
      List<ISearchCondition> conditions = new ArrayList<ISearchCondition>(1);
      IModelFactory factory = Owl.getModelFactory();

      ISearchField field = factory.createSearchField(IEntity.ALL_FIELDS, INews.class.getName());
      ISearchCondition condition = factory.createSearchCondition(field, SearchSpecifier.CONTAINS, ""); //$NON-NLS-1$

      conditions.add(condition);

      return conditions;
    }

    String getSearchMarkName() {
      return fNameInput.getText();
    }

    IFolder getFolder() {
      return fFolderChooser.getFolder();
    }

    ISearchCondition getScopeCondition() {
      return fLocationControl.toScopeCondition();
    }
  }

  /** Leave for Reflection */
  public SearchMarkWizard() {}

  /*
   * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
   */
  public void init(IWorkbench workbench, IStructuredSelection selection) {
    Pair<IFolder, IFolderChild> pair = OwlUI.getLocationAndPosition(selection);
    fFolder = pair.getFirst();
    fPosition = pair.getSecond();
  }

  /*
   * @see org.eclipse.jface.wizard.Wizard#addPages()
   */
  @Override
  public void addPages() {
    fPage = new NewSearchMarkWizardPage(Messages.SearchMarkWizard_NEW_SEARCH);
    setWindowTitle(Messages.SearchMarkWizard_SAVED_SEARCH);
    setHelpAvailable(false);
    addPage(fPage);
  }

  /*
   * @see org.eclipse.jface.wizard.Wizard#dispose()
   */
  @Override
  public void dispose() {
    fResources.dispose();
    super.dispose();
  }

  /*
   * @see org.eclipse.jface.wizard.Wizard#performFinish()
   */
  @Override
  public boolean performFinish() {
    String name = fPage.getSearchMarkName();
    IModelFactory factory = Owl.getModelFactory();

    /* Generate Name if necessary */
    if (!StringUtils.isSet(name)) {
      fPage.onGenerateName();
      name = fPage.getSearchMarkName();
    }

    /* Make sure Conditions are provided */
    if (fPage.fSearchConditionList.isEmpty()) {
      fPage.setErrorMessage(Messages.SearchMarkWizard_SPECIFY_SEARCH);
      return false;
    }

    IFolder folder = fPage.getFolder();

    ISearchMark searchMark = factory.createSearchMark(null, folder, name, fPosition, fPosition != null ? true : null);
    searchMark.setMatchAllConditions(fPage.fMatchAllRadio.getSelection());

    fPage.fSearchConditionList.createConditions(searchMark);
    ISearchCondition locationCondition = fPage.getScopeCondition();
    if (locationCondition != null)
      searchMark.addSearchCondition(locationCondition);

    /* Copy all Properties from Parent or as Specified into this Mark */
    Map<String, Serializable> properties = folder.getProperties();
    for (Map.Entry<String, Serializable> property : properties.entrySet())
      searchMark.setProperty(property.getKey(), property.getValue());

    DynamicDAO.save(folder);

    /* Update the Search */
    Controller.getDefault().getSavedSearchService().updateSavedSearches(Collections.singleton(searchMark));

    return true;
  }
}
TOP

Related Classes of org.rssowl.ui.internal.dialogs.SearchMarkWizard$NewSearchMarkWizardPage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.