All pastes #190374 Raw Edit

Anonymous

public text v1 · immutable
·published 2006-10-03 22:43 UTC
rendered paste body
/*   **********************************************************************  **

 **   Copyright notice                                                       **

 **                                                                          **

 **   (c) 2005-2006 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.views.feedview;



import java.util.List;



import org.eclipse.jface.viewers.ILazyTreeContentProvider;

import org.eclipse.jface.viewers.TreeViewer;

import org.eclipse.jface.viewers.Viewer;

import org.eclipse.swt.widgets.Display;

import org.rssowl.core.model.NewsModel;

import org.rssowl.core.model.dao.IApplicationLayer;

import org.rssowl.core.model.dao.ModelDAOException;

import org.rssowl.core.model.reference.FeedReference;

import org.rssowl.core.model.reference.NewsReference;

import org.rssowl.core.model.types.IFeed;

import org.rssowl.core.model.types.INews;



public class FeedContentProvider implements ILazyTreeContentProvider {

  

  private TreeViewer fTreeViewer;

  private IApplicationLayer appLayer;

  

  public FeedContentProvider() {

    appLayer = NewsModel.getDefault().getPersistanceLayer().getApplicationLayer();

  }

  /* ITreeContentProvider implementation

  public Object[] getElements(Object inputElement) {

    FeedReference feedRef = (FeedReference) inputElement;

    IFeed feed = resolve(feedRef);

    return feed.getNews().toArray();

  }

  

  public Object[] getChildren(Object parentElement) {

  FeedReference feedRef = (FeedReference) parentElement;

  IFeed feed = resolve(feedRef);

  return feed.getNews().toArray();

  }

  

  public Object getParent(Object element) {

  NewsReference newsRef = (NewsReference) element;

  return resolve(newsRef).getFeed();

  }

  */

  

  /* Alternative ITreeContentProvider implementation

  public Object[] getChildren(Object parentElement) {

    FeedReference feedRef = (FeedReference) parentElement;

    IFeed feed = resolve(feedRef);

    try {

      // return

      // NewsModel.getDefault().getPersistanceLayer().getModelDAO().loadNews(feed.getNews()).toArray();

    } catch (ModelDAOException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

    }

    return null;

  }



  public Object[] getElements(Object parentElement) {

    FeedReference feedRef = (FeedReference) parentElement;

    IFeed feed = resolve(feedRef);

    try {

      return NewsModel.getDefault().getPersistanceLayer().getModelDAO().loadNews(feed.getNews()).toArray();

    } catch (ModelDAOException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

    }

    return null;

  }

  */



  public Object getParent(Object element) {

    if (element instanceof NewsReference) {

      return resolve((NewsReference) element).getFeed();

    }

    if (element instanceof FeedReference) {

      return null;

    }

    return null;

  }

  

  private IFeed resolve(FeedReference feedRef) {

    try {

      return feedRef.resolve();

    } catch (ModelDAOException e) {

      // TODO Auto-generated catch block

      e.printStackTrace();

    }

    return null;

  }



  

  private INews resolve(NewsReference newsRef) {

    try {

      if (newsRef.isCached()) {

        return newsRef.resolve();

      }

      return appLayer.loadNewsSummary(newsRef.getId());

      //return NewsModel.getDefault().getTypesCache().obtainNews(newsRef);

    } catch (ModelDAOException e) {

      e.printStackTrace();

    }

    return null;

  }



  public boolean hasChildren(Object element) {

    if (element instanceof NewsReference) {

      return false;

    }

    if (element instanceof FeedReference) {

      return resolve((FeedReference) element).getNews().size() > 0;

    }

    return false;

  }



  public void dispose() {}



  public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

    if (newInput == null) {

      return;

    }

    fTreeViewer = (TreeViewer) viewer;

    final FeedReference feedRef = (FeedReference) newInput;

    final IFeed feed = resolve(feedRef);

    Display.getCurrent().asyncExec(new Runnable() {

      public void run() {

        fTreeViewer.setChildCount(feedRef, feed.getNews().size());

      };

    });

  }



  public void updateChildCount(Object element, int currentChildCount) {

    if (element instanceof FeedReference) {

      IFeed feed = resolve((FeedReference) element);

      fTreeViewer.setChildCount(element, feed.getNews().size());

    }

    

  }



  public void updateElement(Object parent, int index) {

    FeedReference feedRef = (FeedReference) parent;

    IFeed feed = resolve(feedRef);

    List<NewsReference> newsRefs = feed.getNews();

    if (index > newsRefs.size() - 1) {

      return;

    }

    NewsReference newsRef = feed.getNews().get(index);

    INews news = resolve(newsRef);

    NewsReference cachedRef = new NewsReference(news);

    fTreeViewer.replace(parent, index, cachedRef);

    //System.out.println("Time to display virtual : " + (System.currentTimeMillis() - FeedView.time));

    

  }



}