/*
 * Copyright 2004-2007 IDCA. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
 * following conditions are met:
 * 
 *    1. Redistributions of source code must retain the above copyright notice, this list of conditions and
 *        the following disclaimer.
 *    2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions
 *        and the following disclaimer in the documentation and/or other materials provided with the
 *        distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY IDCA AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IDCA OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 * 
 * The views and conclusions contained in the software and documentation are those of the authors and
 * should not be interpreted as representing official policies, either expressed or implied, of IDCA.
 */

package com.idcanet.vasc.impl.swt;

import java.awt.TextField;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
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.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
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.Control;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;

import com.idcanet.fff.SwingImageHelper;
import com.idcanet.vasc.core.VascDataExporter;
import com.idcanet.vasc.core.VascTable;
import com.idcanet.vasc.core.VascUserOption;
import com.idcanet.vasc.core.VascViewRenderer;
import com.idcanet.vasc.core.actions.GlobalVascAction;
import com.idcanet.vasc.core.actions.RowVascAction;
import com.idcanet.vasc.core.column.VascTableColumn;

/**
 * 
 * @author Willem Cazander
 * @version 1.0 Mar 21, 2007
 */
public class SwtVascViewRenderer implements VascViewRenderer {

	private Logger logger = null;
	private Composite parent = null;
	private VascTable table = null;
	
	public SwtVascViewRenderer(Composite parent) {
		logger = Logger.getLogger(SwtVascViewRenderer.class.getName());
		this.parent=parent;
	}
	
	public void initTable(VascTable table) throws Exception {
		if (table.getVascViewRenderer()==null) {
			table.setVascViewRenderer(this);
		} else {
			if (table.getVascViewRenderer()!=this) {
				throw new IllegalArgumentException("VascTable has already a differtent VascViewRenderer attected");
			}
		}
		table.getVascTableController().finalizeVascColumns(table);
		table.getVascTableController().finalizeVascTable(table);
		table.getVascTableController().refreshData(table);
		this.table=table;
	}
	
    private static final String[] FILTER_NAMES = {
        "All Files (*.*)",
        "Comma Separated Values Files (*.csv)",
        "Microsoft Excel Spreadsheet Files (*.xls)",
    };
    /** These filter extensions are used to filter which files are displayed. */
    private static final String[] FILTER_EXTS = { "*.*","*.csv","*.xls" };
	
	public void renderExport(VascDataExporter exporter) throws Exception {
	    FileDialog dlg = new FileDialog(Display.getCurrent().getActiveShell(), SWT.SAVE);
        dlg.setFilterNames(FILTER_NAMES);
        dlg.setFilterExtensions(FILTER_EXTS);
        dlg.setFileName(table.getHeaderName()+".csv");
        String fileName = dlg.open();
        logger.fine("FileName: "+fileName);
        if (fileName == null) {
            return;
        }
        OutputStream out = new FileOutputStream(fileName);
        try {
        	exporter.doExport(out, table);
        } catch (Exception e) {
            //MessageDialog.openError(Display.getCurrent().getActiveShell(),crudTable.i18n("crud.event.export.error.title"),crudTable.i18n("crud.event.export.error.message"));
            logger.log(Level.WARNING,"Error: "+e.getMessage(),e);
        } finally {
        	if (out!=null) {
        		out.close();
        	}
        }
	}
	
	public void renderEdit(Object object) throws Exception {
		
		logger.info("Rending Edit View");
		table.getVascTableController().initEditObject(table, object);
        
		SwtVascEditDialog dialog = new SwtVascEditDialog(Display.getCurrent().getActiveShell(),table,object,"Vasc Edit","Edit");
        Object result = dialog.open();
        if(result==null) {
            return;
        }
        try {            
        	result = table.getVascDataSource().merge(object);  
        	//table.getVascTableController().fireModelUpdateListeners(result);
        } finally {
        	//TODO: or merge into table == faster 
        	table.getVascTableController().refreshData(table);
        }
	}
	
	public ImageDescriptor getImageDescriptor(String path) {
		try {
			path = table.getVascTextValue().getTextValue(path);
			
			
			logger.info("Loading image: "+path);
			//System.out.println("==== 1");
			ImageDescriptor result =  ImageDescriptor.createFromFile(path.getClass(), path);
			result =  ImageDescriptor.createFromFile(SwingImageHelper.class, path);
			if(result==null) {
				// 	try load fff
				//.out.println("==== 2");
				
				//result = ImageDescriptor.createFromURL(SwingImageHelper.class.getClass().getResource(path));
			}
			//System.out.println("==== 3");
			if(result==null) {
				throw new NullPointerException("Can't load resource: "+path);
			}
			//System.out.println("==== 4 "+result.getImageData().height+" w:"+result.getImageData().width);
			return result;
		} catch (Exception e) {			
			logger.warning("Could not load image from path: '"+path+"'");
			try {
				ImageDescriptor result = null; //ImageDescriptor.createFromURL(SwingImageHelper.class.getClass().getResource("/META-INF/images/silk/png/bomb.png"));
				if(result==null) {
					throw new NullPointerException("Can't load resource: "+path);
				}
				return result;
			} catch (Exception e2) {
				return ImageDescriptor.getMissingImageDescriptor(); // default swt missing image fall back
			}
		}
	}
	
	public void renderDelete(Object rowBean) throws Exception {
		
	}
	
	public class SwtVascEditDialog extends Dialog {
		
		private Shell shell = null;
		private String headerText = null;
		private String title = null;
		private Object result = null;
		private Object bean = null;
		
		public SwtVascEditDialog (Shell parent,VascTable table,Object bean,String title,String headerText) {
			super (parent, 0);
			this.headerText = headerText;
			this.title = title;
			this.bean = bean;
		}
		public Object open() {
			shell = new Shell(getParent(), SWT.TITLE | SWT.BORDER | SWT.APPLICATION_MODAL);
			shell.setText(title);
			
			GridLayout layout = new GridLayout();
			layout.marginHeight = 0;
			layout.marginWidth = 0;
			shell.setLayout(layout);
	    		
			Composite header = new Composite(shell, SWT.NONE);
			GridLayout headerLayout = new GridLayout();
			headerLayout.numColumns = 6;
			header.setLayout(headerLayout);
			header.setLayoutData(new GridData(GridData.FILL_BOTH));
	    		
			Composite body = new Composite(shell, SWT.NONE);
			GridLayout bodyLayout = new GridLayout();
			bodyLayout.numColumns = 1;
			body.setLayout(bodyLayout);  
			body.setLayoutData(new GridData(GridData.FILL_BOTH));
	    		
			Composite footer = new Composite(shell, SWT.NONE);
			GridLayout footerLayout = new GridLayout();
			footerLayout.numColumns = 6;
			footer.setLayout(footerLayout);
			footer.setLayoutData(new GridData(SWT.NONE));
	    	
			//createHeader(header);
			createBody(body);
			//createFooter(footer);
			
			// should be last
			partCreated();

			shell.pack();
			shell.open();

			Display display = shell.getDisplay();
			while (!shell.isDisposed()) {
				if (!display.readAndDispatch()) {
					display.sleep();
				}
			}
			//image.dispose();
			//closeDialog();
			return result;
		}
		
		public void createBody(Composite body) {
			body.setLayout(new GridLayout(2, true));
			body.setLayoutData(new GridData(GridData.FILL_BOTH));

	        for(VascTableColumn c:table.getTableColumns()) {        	
	        	Label l = new Label(body, SWT.WRAP);
	    		l.setText(c.getName());
	            
	            if(c.getToolTip()!=null) {
	                l.setToolTipText(c.getToolTip());
	            }
	            

	            
	            try {
	            	table.getVascTableController().initEditObjectColumn(c, bean);

		        	//if(c.getVascColumnEditor()==null) {
		        		Label valueLabel = new Label(body, SWT.WRAP);
		        		valueLabel.setText(""+c.getVascColumnValue().getValue(c, bean));
		        		c.setColumnEditor(valueLabel);
		        	/*
		        	} else {
		        		c.setColumnEditor(c.getVascColumnEditor().createColumnEditor(c,bean,body));
		        	}
		        	*/
	            } catch (Exception e) {
                    logger.log(Level.WARNING,"Error making column editor: '"+c.getVascColumnValue()+"' error: "+e.getMessage(),e);
                }
	            
	            if(c.getColumnEditor() instanceof Control) {
	            	Control editor = (Control)c.getColumnEditor();
	            	GridData gridData = new GridData();
	            	gridData.grabExcessHorizontalSpace = true;
	            	gridData.grabExcessVerticalSpace = true;
	            	gridData.horizontalAlignment = GridData.FILL;
	            	gridData.verticalAlignment = GridData.FILL;
	            	editor.setLayoutData(gridData);
	            }
	        }
	        
	        // create some spaceing , should replace by seperator
	        new Label(body, SWT.WRAP);
	        new Label(body, SWT.WRAP);
	        
			Button saveButton = new Button(body, SWT.NONE);
	        saveButton.setImage(getImageDescriptor("vasc.dialog.save.image").createImage());
	        saveButton.setText(table.getVascTextValue().getTextValue("vasc.dialog.save.name"));
	        saveButton.setToolTipText(table.getVascTextValue().getTextValue("vasc.dialog.save.tooltip"));
			saveButton.addSelectionListener(new SelectionAdapter() {
				public void widgetSelected(SelectionEvent e) {
					//if(hasRecordError()) {
					//	return;
					//}
					//result = bean;
					shell.dispose();
				}
			});
			Button cancelButton = new Button(body, SWT.NONE);
	        cancelButton.setImage(getImageDescriptor("vasc.dialog.cancel.image").createImage());
	        cancelButton.setText(table.getVascTextValue().getTextValue("vasc.dialog.cancel.name"));
	        cancelButton.setToolTipText(table.getVascTextValue().getTextValue("vasc.dialog.cancel.tooltip"));
			cancelButton.addSelectionListener(new SelectionAdapter() {
				public void widgetSelected(SelectionEvent e) {
					result = null;
					shell.dispose();
				}
			});
		}
	}
	
	public Object defaultColumnEditor(VascTableColumn column,Object bean,Object gui) throws Exception {
		
		Composite body = (Composite)gui;		
		Text text = new Text(body,SWT.SINGLE);
		text.addSelectionListener(new TextListener(column,bean));
		text.setText(""+column.getVascColumnValue().getValue(column, bean));
		return text;
	}
	
	class TextListener extends SelectionAdapter {
		
		private VascTableColumn column = null;
		private Object bean = null;
		
		public TextListener(VascTableColumn column,Object bean) {
			this.column=column;
			this.bean=bean;
		}

		/**
		 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
		 */
		public void widgetSelected(SelectionEvent e) {
			// SHIT it works :)
			Object value = e.data;
			logger.finer("Setting value: "+value);
			try {
				column.getVascColumnValue().setValue(column, bean, value);
			} catch (Exception ee) {
				ee.printStackTrace();
			}
		}
	}
	
	public Object defaultColumnRenderer(VascTableColumn column,Object gui) throws Exception {
		
		return null;
	}
	
	
	public void renderView() throws Exception {
		GridLayout layout = new GridLayout();
		layout.marginHeight = 0;
		layout.marginWidth = 0;
		parent.setLayout(layout);
    		
		Composite header = new Composite(parent, SWT.NONE);
		GridLayout headerLayout = new GridLayout();
		headerLayout.numColumns = 6;
		header.setLayout(headerLayout);
		header.setLayoutData(new GridData(SWT.NONE));
    		
		Composite body = new Composite(parent, SWT.NONE);
		GridLayout bodyLayout = new GridLayout();
		bodyLayout.numColumns = 1;
		body.setLayout(bodyLayout);  
		body.setLayoutData(new GridData(GridData.FILL_BOTH));
    		
		Composite footer = new Composite(parent, SWT.NONE);
		GridLayout footerLayout = new GridLayout();
		footerLayout.numColumns = 6;
		footer.setLayout(footerLayout);
		footer.setLayoutData(new GridData(SWT.NONE));
    	
		createHeader(header);
		createBody(body);
		createFooter(footer);
		
		// should be last
		partCreated();
	}
	
	
	public void createHeader(Composite header) {
		logger.finest("Creating header");
		
		GridLayout layout = new GridLayout();
		layout.marginHeight = 0;
		layout.marginWidth = 0;
		header.setLayout(layout);
		header.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
    		
		Composite headerBar = new Composite(header, SWT.NONE);
		//GridLayout headerLayout = new GridLayout();
		//headerLayout.numColumns = 1;
		headerBar.setLayout(new FillLayout());
		//headerBar.setLayoutData(new GridData(GridData.FILL_BOTH));
    		
		Composite headerName = new Composite(header, SWT.NONE);
		GridLayout bodyLayout = new GridLayout();
		bodyLayout.numColumns = 1;
		headerName.setLayout(bodyLayout);
		headerName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		//headerName.setLayoutData(new GridData(GridData.FILL_BOTH));
    		
		Composite headerOptions = new Composite(header, SWT.NONE);
		GridLayout footerLayout = new GridLayout();
		footerLayout.numColumns = 1;
		headerOptions.setLayout(footerLayout);
		//headerOptions.setLayoutData(new GridData(SWT.NONE));
		headerOptions.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
		
		ToolBar toolBar = new ToolBar(headerBar, SWT.NONE);
		for (GlobalVascAction action:table.getGlobalActions()) {
			ToolItem item = new ToolItem(toolBar, SWT.PUSH);
			item.setText(table.getVascTextValue().getTextValue(action.getName()));
			item.setToolTipText(table.getVascTextValue().getTextValue(action.getToolTip()));
			if (action.getImage()!=null) {
				item.setImage(getImageDescriptor(action.getImage()).createImage());
			}
			item.addSelectionListener(new GlobalActionListener(action));
		}
	    
	    
		Color c = new Color(header.getDisplay(),255,255,255);
		headerName.setBackground(c);
        if(table.getHeaderName()!=null) {
            Font headerFont = new Font(header.getDisplay(), "verdana", 16, SWT.BOLD);
            Label l = new Label(headerName, SWT.CENTER);
            l.setImage(getImageDescriptor(table.getHeaderImage()).createImage());
            l.setFont(headerFont);
            l.setText(table.getVascTextValue().getTextValue(table.getHeaderName()));
            l.setBackground(c);
        }
        
        // create options
        for(VascUserOption option:table.getUserOptions()) {
            
        	/*
            if(option.getLabelText()!=null) {
                Label l = new Label(header,SWT.WRAP);
                l.setText(crudTable.i18n(cpo.getLabelText()));
                l.setBackground(c);
            }

            // create ValueHolder
            cpo.setValueHolder(new ValueHolder(null));
            // create control
            cpo.setTempObjectPropertyControl(cpo.getPropertyEditor().createPropertyEditor(header,cpo.getValueHolder()));
            
            cpo.getValueHolder().addPropertyChangeListener(this);
            */
        }
	}
	class GlobalActionListener extends  SelectionAdapter {
		
		private GlobalVascAction action = null;
		
		public GlobalActionListener(GlobalVascAction action) {
			this.action=action;
		}
    	/**
         * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
         */
        @Override
        public void widgetSelected(SelectionEvent event) {
        	logger.info("Global Action");
        	try {
        		action.doGlobalAction(table);
        	} catch (Exception e) {
        		table.getVascTableController().handleException(e, table);
        	}
        }
    }
	
	
	
	
	
	
	
	
	public void createBody(Composite body) {
		logger.finer("Creating body");
        
		 // Create the table viewer to display the players
		final TableViewer tableViewer = new TableViewer(body, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
        final Table table2 = tableViewer.getTable();
		table2.setLayoutData(new GridData(GridData.FILL_BOTH));
		table2.setHeaderVisible(true);
		table2.setLinesVisible(true);
		
		table2.addSelectionListener(new SelectionListener() {

			/**
			 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
			 */
			public void widgetDefaultSelected(SelectionEvent e) {
			}

			/**
			 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
			 */
			public void widgetSelected(SelectionEvent e) {
				Object data = e.item.getData();
				logger.info("Slecting data: "+data);
				table.setSelectedObject(data);
			}
			
		});
        
		// Set the content and label providers
		tableViewer.setContentProvider(new ListConverterContentProvider());
		tableViewer.setLabelProvider(new DefaultLabelProvider(table));
		//TODO: add renderer support
		
		//Add sort indicator and sort data when column selected
		Listener sortListener = new Listener() {
			public void handleEvent(Event e) {
				// determine new sort column and direction
				TableColumn sortColumn = table2.getSortColumn();
				TableColumn currentColumn = (TableColumn) e.widget;
				int dir = table2.getSortDirection();
				if (sortColumn == currentColumn) {
					dir = dir == SWT.UP ? SWT.DOWN : SWT.UP;
				} else {
					table2.setSortColumn(currentColumn);
					dir = SWT.UP;
				}
				// sort the data based on column and direction
				//String prop = (String)currentColumn.getData("PROP");
	
				//List l = new ArrayList(10);
				/*
				 *             //columns[i].setData("PROP",table.getTableColumns().get(i)....);
				 * 
				for(int i=0;i<crudTable.getSelectionInList().getSize();i++) {
					l.add(crudTable.getSelectionInList().getElementAt(i));
				}
				BeanPropertyComparator c = new BeanPropertyComparator();
				c.setAscending(dir!=SWT.DOWN);
				c.setProperty(prop);
				Collections.sort(l,c);
				crudTable.getSelectionInList().setList(l);
				*/
			}
		};
		

		
		for(VascTableColumn c:table.getTableColumns()) {
			TableColumn tc = new TableColumn(table2, SWT.LEFT);
		    tc.setText(c.getName());
		    tc.setToolTipText(c.getToolTip());
		    if (c.getImage()!=null) {
		    	tc.setImage(getImageDescriptor(c.getImage()).createImage());
		    }
		    tc.addListener(SWT.Selection, sortListener);
		    tc.setMoveable(false);
		    tc.setResizable(true);
		}
		
		


		int totalWidth = table.getVascTableController().getTotalColumnsWidth(table);
		logger.finer("Total size: "+totalWidth);
        TableColumn[] columns = table2.getColumns();
        for (int i = 0; i < columns.length; i++) {
           	Integer cWidth = table.getTableColumns().get(i).getWidth();
           	if (cWidth==null) {
           		break;
           	}
           	//int w = (int)((double)totalSize/(double)totalSize)*cWidth;
           	columns[i].setWidth(cWidth);
           	columns[i].pack();
            //logger.finest("Setting column width: "+w+" total: "+totalSize+" c: "+cWidth+" of column: "+i);
        }
		logger.fine("Table with columns created: "+table2.getColumnCount());
		
		tableViewer.setInput(table);
	}
	
    
	public void createFooter(Composite footer) {
		logger.finest("Creating footer");
		for(RowVascAction action:table.getRowActions()) {			
			Button actionButton = new Button(footer, SWT.NONE);
			actionButton.setText(table.getVascTextValue().getTextValue(action.getName()));
			actionButton.setToolTipText(table.getVascTextValue().getTextValue(action.getToolTip()));
			if (action.getImage()!=null) {
				actionButton.setImage(getImageDescriptor(action.getImage()).createImage());
			}
		    actionButton.addSelectionListener(new ActionListener(action));
			
		}
	}
	class ActionListener extends  SelectionAdapter {
		
		private RowVascAction action = null;
		
		public ActionListener(RowVascAction action) {
			this.action=action;
		}
    	/**
         * @see org.eclipse.swt.events.SelectionAdapter#widgetSelected(org.eclipse.swt.events.SelectionEvent)
         */
        @Override
        public void widgetSelected(SelectionEvent event) {
        	logger.info("Row Action");
        	try {
        		action.doRowAction(table, table.getSelectedObject());
        	} catch (Exception e) {
        		table.getVascTableController().handleException(e, table);
        	}
        }
    }
	
	/**
	 * Is called when all createPartControl is done with creating Parts
	 */
	public void partCreated() {

	}
	
	class DefaultLabelProvider implements ITableLabelProvider {

		private VascTable table = null;
		
		public DefaultLabelProvider(VascTable table) {
			this.table=table;
		}
		
		/**
		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
		 */
		public Image getColumnImage(Object arg0, int arg1) {
			return null;
		}

		/**
		 * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
		 */
		public String getColumnText(Object bean, int columnNumber) {
			VascTableColumn vtc = table.getTableColumns().get(columnNumber);
			if (vtc.getVascColumnRenderer()==null) {
				try {
					return ""+vtc.getVascColumnValue().getValue(vtc,bean);
				} catch (Exception e) {
					logger.log(Level.WARNING,"Error in get value: '"+vtc.getVascColumnValue()+"' error: "+e.getMessage(),e);
					return "Err";
				}
			}
			// see custem column renderer, so this code will never be called
			return "CUSTEM_RENDER";
		}

		/**
		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
		 */
		public void addListener(ILabelProviderListener arg0) {
		}

		/**
		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
		 */
		public void dispose() {
		}

		/**
		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
		 */
		public boolean isLabelProperty(Object arg0, String arg1) {
			return false;
		}

		/**
		 * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
		 */
		public void removeListener(ILabelProviderListener arg0) {
		}
		
	}
	
	class ListConverterContentProvider implements IStructuredContentProvider {

		/**
		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
		 */
		public Object[] getElements(Object obj) {
			return ((VascTable)obj).getTableData().toArray();
		}

		/**
		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
		 */
		public void dispose() {
		}

		/**
		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
		 */
		public void inputChanged(Viewer arg0, Object arg1, Object arg2) {
		}
		
	}
}