/* * Copyright (c) 2004-2011 Marco Maccaferri and others. * 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: * Marco Maccaferri - initial API and implementation */ package org.eclipsetrader.borsaitalia.internal.ui.wizards; import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.Unmarshaller; import javax.xml.bind.ValidationEvent; import javax.xml.bind.ValidationEventHandler; import javax.xml.transform.stream.StreamSource; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipsetrader.borsaitalia.internal.Activator; public class InstrumentsPage extends WizardPage { private CheckboxTableViewer instruments; private List<Instrument> instrumentList; public InstrumentsPage() { super("instrument", Messages.InstrumentsPage_Name, null); //$NON-NLS-1$ setDescription(Messages.InstrumentsPage_Description); setPageComplete(false); } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite) */ @Override public void createControl(Composite parent) { Composite content = new Composite(parent, SWT.NONE); content.setLayout(new GridLayout(1, false)); setControl(content); initializeDialogUnits(content); Label label = new Label(content, SWT.NONE); label.setText(Messages.InstrumentsPage_Instruments); instruments = CheckboxTableViewer.newCheckList(content, SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL); instruments.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); ((GridData) instruments.getControl().getLayoutData()).heightHint = instruments.getTable().getItemHeight() * 15 + instruments.getTable().getBorderWidth() * 2; instruments.setLabelProvider(new LabelProvider()); instruments.setContentProvider(new ArrayContentProvider()); instruments.setSorter(new ViewerSorter()); instruments.addCheckStateListener(new ICheckStateListener() { @Override public void checkStateChanged(CheckStateChangedEvent event) { setPageComplete(instruments.getCheckedElements().length != 0); } }); } /* (non-Javadoc) * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean) */ @Override public void setVisible(boolean visible) { super.setVisible(visible); if (visible && instrumentList == null) { Display.getCurrent().asyncExec(new Runnable() { @Override public void run() { init(); } }); } } protected void init() { try { File file = Activator.getDefault().getStateLocation().append("instruments.xml").toFile(); //$NON-NLS-1$ if (!file.exists()) { file = new File(FileLocator.getBundleFile(Activator.getDefault().getBundle()), "data/instruments.xml"); //$NON-NLS-1$ } if (file.exists() == true) { try { JAXBContext jaxbContext = JAXBContext.newInstance(Instrument[].class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); unmarshaller.setEventHandler(new ValidationEventHandler() { @Override public boolean handleEvent(ValidationEvent event) { Status status = new Status(IStatus.WARNING, Activator.PLUGIN_ID, 0, "Error validating XML: " + event.getMessage(), null); //$NON-NLS-1$ Activator.log(status); return true; } }); JAXBElement<Instrument[]> element = unmarshaller.unmarshal(new StreamSource(file), Instrument[].class); instrumentList = new ArrayList<Instrument>(Arrays.asList(element.getValue())); } catch (Exception e) { Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, "Error loading exchanges from " + file, e); //$NON-NLS-1$ Activator.log(status); } } if (instrumentList != null) { try { if (!instruments.getControl().isDisposed()) { instruments.getControl().getDisplay().asyncExec(new Runnable() { @Override public void run() { if (!instruments.getControl().isDisposed()) { instruments.getControl().setRedraw(false); instruments.setInput(instrumentList); instruments.getControl().setRedraw(true); instruments.getControl().setEnabled(true); setPageComplete(false); } } }); } } catch (Exception e) { // Do nothing } return; } } catch (Exception e) { Status status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, 0, "Error loading instruments", e); //$NON-NLS-1$ Activator.log(status); } } public Instrument[] getInstruments() { Object[] o = instruments.getCheckedElements(); Instrument[] i = new Instrument[o.length]; System.arraycopy(o, 0, i, 0, i.length); return i; } }