Package org.rssowl.ui.internal.filter

Source Code of org.rssowl.ui.internal.filter.NewsActionItem

/*   **********************************************************************  **
**   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.filter;

import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.rssowl.core.INewsAction;
import org.rssowl.core.Owl;
import org.rssowl.core.persist.IFilterAction;
import org.rssowl.core.persist.IModelFactory;
import org.rssowl.core.util.StringUtils;
import org.rssowl.ui.filter.INewsActionPresentation;
import org.rssowl.ui.internal.util.LayoutUtils;

import java.util.Collection;

/**
* A subclass of {@link Composite} to show the presentation of a
* {@link INewsAction}.
*
* @author bpasero
*/
public class NewsActionItem extends Composite {
  private final IFilterAction fInitialFilterAction;
  private final IModelFactory fFactory = Owl.getModelFactory();
  private final NewsActionPresentationManager fNewsActionPresentationManager = NewsActionPresentationManager.getInstance();
  private ComboViewer fViewer;
  private INewsActionPresentation fShowingPresentation;

  /**
   * @param parent
   * @param style
   * @param initialFilterAction the initial filter action to show, never
   * <code>null</code>.
   */
  public NewsActionItem(Composite parent, int style, IFilterAction initialFilterAction) {
    super(parent, style);
    Assert.isNotNull(initialFilterAction);

    fInitialFilterAction = initialFilterAction;
    initComponents();
  }

  IFilterAction createFilterAction(boolean ignoreEmpty) {
    IStructuredSelection selection = (IStructuredSelection) fViewer.getSelection();
    NewsActionDescriptor descriptor = (NewsActionDescriptor) selection.getFirstElement();
    IFilterAction filterAction = fFactory.createFilterAction(descriptor.getActionId());
    if (fShowingPresentation != null) {
      Object data = fShowingPresentation.getData();
      if (data != null)
        filterAction.setData(data);
      else if (ignoreEmpty) //Action was not fully specified
        return null;
    }

    return filterAction;
  }

  boolean hasValue() {
    if (fShowingPresentation == null)
      return true;

    return fShowingPresentation.getData() != null;
  }

  void focusInput() {
    fViewer.getCombo().setFocus();
  }

  private void initComponents() {
    setLayout(LayoutUtils.createGridLayout(2, 5, 5));

    /* Chooser for Action */
    Combo combo = new Combo(this, SWT.READ_ONLY | SWT.BORDER);
    combo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));

    fViewer = new ComboViewer(combo);
    fViewer.setContentProvider(new ArrayContentProvider());
    fViewer.setLabelProvider(new LabelProvider() {
      @Override
      public String getText(Object element) {
        return ((NewsActionDescriptor) element).getName();
      }
    });

    Collection<NewsActionDescriptor> actions = fNewsActionPresentationManager.getSortedNewsActions();
    fViewer.setInput(actions);
    combo.setVisibleItemCount(actions.size());

    /* Properly set Selection */
    NewsActionDescriptor selectedFilterAction = null;
    for (NewsActionDescriptor action : actions) {
      if (action.getActionId().equals(fInitialFilterAction.getActionId())) {
        fViewer.setSelection(new StructuredSelection(action));
        selectedFilterAction = action;
        updateInfoControl(action);
        break;
      }
    }

    /* Update Presentation on Selection Changes */
    fViewer.addSelectionChangedListener(new ISelectionChangedListener() {
      public void selectionChanged(SelectionChangedEvent event) {
        IStructuredSelection selection = (IStructuredSelection) event.getSelection();
        NewsActionDescriptor descriptor = (NewsActionDescriptor) selection.getFirstElement();
        showFilterAction(descriptor, null);
        updateInfoControl(descriptor);
      }
    });

    if (selectedFilterAction != null)
      showFilterAction(selectedFilterAction, fInitialFilterAction.getData());
  }

  private void updateInfoControl(NewsActionDescriptor descriptor) {
    if (StringUtils.isSet(descriptor.getDescription()))
      fViewer.getControl().setToolTipText(descriptor.getDescription());
    else
      fViewer.getControl().setToolTipText(null);
  }

  private void showFilterAction(NewsActionDescriptor action, Object data) {

    /* Dispose old */
    if (fShowingPresentation != null)
      fShowingPresentation.dispose();

    /* Create New */
    INewsActionPresentation presentation = fNewsActionPresentationManager.getPresentation(action.getActionId());
    if (presentation != null) {
      presentation.create(this, data);
      fShowingPresentation = presentation;
    } else
      fShowingPresentation = null;

    fViewer.getControl().getParent().layout(true, true);
  }
}
TOP

Related Classes of org.rssowl.ui.internal.filter.NewsActionItem

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.