Java tutorial
/******************************************************************************* * Copyright (c) 2009 Siemens AG * * 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.eclipse.org/legal/epl-v10.html * * Contributors: * Kai Toedter - initial API and implementation *******************************************************************************/ package com.siemens.ct.mp3m.ui.views.logical; import java.util.List; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ILazyContentProvider; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.part.ViewPart; import com.siemens.ct.mp3m.model.IMP3Info; import com.siemens.ct.mp3m.model.MP3Infos; import com.siemens.ct.mp3m.model.physical.MusicFolders; import com.siemens.ct.mp3m.model.physical.MusicFoldersChangeListener; public class VirtualTableView extends ViewPart { @Override public void createPartControl(Composite parent) { final TableViewer tableViewer = new TableViewer(parent, SWT.VIRTUAL | SWT.BORDER | SWT.V_SCROLL); Table table = tableViewer.getTable(); table.setLayoutData(new GridData(GridData.FILL_BOTH)); table.setHeaderVisible(true); table.setLinesVisible(true); TableColumn column = new TableColumn(table, SWT.NONE, 0); column.setText(Messages.getString("VirtualTableView.no")); //$NON-NLS-1$ column.setWidth(50); column = new TableColumn(table, SWT.NONE, 1); column.setText(Messages.getString("VirtualTableView.song")); //$NON-NLS-1$ column.setWidth(200); column = new TableColumn(table, SWT.NONE, 2); column.setText(Messages.getString("VirtualTableView.artist")); //$NON-NLS-1$ column.setWidth(200); tableViewer.setItemCount(100000); tableViewer.setContentProvider(new LazyContentProvider()); tableViewer.setLabelProvider(new TableLabelProvider()); tableViewer.setUseHashlookup(true); tableViewer.setInput(null); this.getSite().setSelectionProvider(tableViewer); MusicFolders.addChangeListener(new MusicFoldersChangeListener() { public void musicFoldersChanged(List<String> folders) { tableViewer.refresh(); } }); } @Override public void setFocus() { } } class LazyContentProvider implements ILazyContentProvider { private TableViewer viewer; public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.viewer = (TableViewer) viewer; this.viewer.getTable().addListener(SWT.SetData, new Listener() { Table table = LazyContentProvider.this.viewer.getTable(); int oldTopIndex = 0; int oldBottomIndex = 0; public void handleEvent(Event event) { int topIndex = table.getTopIndex(); int itemHeight = table.getItemHeight(); int tableHeight = table.getClientArea().height; if (table.getHeaderVisible()) { tableHeight -= table.getHeaderHeight(); } int rows = (tableHeight + itemHeight - 1) / itemHeight; int bottomIndex = topIndex + rows; if (topIndex == oldTopIndex && bottomIndex == oldBottomIndex) { return; } int clearTopIndex = 0; int clearBottomIndex = 0; if (topIndex > oldBottomIndex || bottomIndex < oldTopIndex) { clearTopIndex = oldTopIndex; clearBottomIndex = oldBottomIndex; } else if (topIndex < oldTopIndex) { clearTopIndex = bottomIndex; clearBottomIndex = oldBottomIndex; } else { clearTopIndex = oldTopIndex; clearBottomIndex = topIndex; } if (clearTopIndex < 0) { clearTopIndex = 0; } if (clearBottomIndex > 99999) { clearBottomIndex = 99999; } table.clear(clearTopIndex, clearBottomIndex); oldTopIndex = topIndex; oldBottomIndex = bottomIndex; // System.out.println("cleared: " + clearTopIndex + ":" + clearBottomIndex); //$NON-NLS-1$ //$NON-NLS-2$ } }); } public void updateElement(int index) { // System.out.println("Virtual Table: update element: " + index); //$NON-NLS-1$ List<IMP3Info> mp3Infos = MP3Infos.getMP3Infos(); if (mp3Infos.size() != 0) { IMP3Info mp3Info = MP3Infos.getMP3Infos().get((index % MP3Infos.getMP3Infos().size())); viewer.replace(new Song(index, mp3Info), index); } } } class Song { int index; IMP3Info mp3Info; public Song(int index, IMP3Info mp3Info) { super(); this.index = index; this.mp3Info = mp3Info; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } public IMP3Info getMp3Info() { return mp3Info; } public void setMp3Info(IMP3Info mp3Info) { this.mp3Info = mp3Info; } } class TableLabelProvider implements ITableLabelProvider { // Java 6: @Override public Image getColumnImage(Object element, int columnIndex) { return null; } // Java 6: @Override public String getColumnText(Object element, int columnIndex) { if (element instanceof Song) { Song song = (Song) element; switch (columnIndex) { case 0: return Integer.toString(song.getIndex()); case 1: return song.getMp3Info().getArtist(); case 2: return song.getMp3Info().getTitle(); } } return "?"; //$NON-NLS-1$ } // Java 6: @Override public void addListener(ILabelProviderListener listener) { } // Java 6: @Override public void dispose() { } // Java 6: @Override public boolean isLabelProperty(Object element, String property) { return false; } // Java 6: @Override public void removeListener(ILabelProviderListener listener) { } }