/*********************************************************************************************
* Copyright (c) 2014-2015 Software Behaviour Analysis Lab, Concordia University, Montreal, Canada
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of Eclipse Public License v1.0 License which
* accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Syed Shariyar Murtaza -- Initial design and implementation
**********************************************************************************************/
package org.eclipse.tracecompass.totalads.ui.models;
import java.util.LinkedHashSet;
import org.eclipse.core.runtime.ListenerList;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.tracecompass.totalads.algorithms.AlgorithmFactory;
import org.eclipse.tracecompass.totalads.dbms.DBMSFactory;
import org.eclipse.tracecompass.totalads.dbms.IDBMSObserver;
import org.eclipse.tracecompass.totalads.dbms.IDataAccessObject;
import org.eclipse.tracecompass.totalads.ui.models.DataModelLabelProvider;
import org.eclipse.tracecompass.totalads.ui.models.DataModelTableContentProvider;
import org.eclipse.tracecompass.totalads.ui.models.Messages;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.jface.viewers.StructuredSelection;
/**
* This class creates a view to display the models
*
* @author <p>
* Efraim Lopez
* </p>
* <p>
* Syed Shariyar Murtaza justsshary@hotmail.com
* </p>
*
*/
public class DataModelsView extends ViewPart implements ISelectionProvider {
/**
* View Id
*/
public static final String VIEW_ID = "org.eclipse.tracecompass.totalads.ui.DataModelsView"; //$NON-NLS-1$
private ModelsList modelListViewer = null;
private ListenerList listeners;
private LinkedHashSet<String> selection;
// /////////////////////////////////////////////////////////////////////////////////////////////
// Inner class
// ////////////////////////////////////////////////////////////////////////////////////////////
/**
*
* Inner class representing a table for models
*
*/
private class ModelsList implements IDBMSObserver {
private CheckboxTableViewer fViewer = null;
private Table fTable = null;
private IDataAccessObject fDataAccessObject;
/**
* Constructor
*
* @param parent
* Parent composite
*/
public ModelsList(Composite parent) {
fTable = new Table(parent, SWT.MULTI | SWT.H_SCROLL | SWT.CHECK
| SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
fTable.setHeaderVisible(true);
fTable.setLinesVisible(true);
fViewer = new CheckboxTableViewer(fTable);
TableViewerColumn modelName = new TableViewerColumn(fViewer, SWT.NONE);
modelName.getColumn().setWidth(100);
modelName.getColumn().setText(Messages.DataModelsView_Models);
fViewer.setLabelProvider(new DataModelLabelProvider());
fViewer.setContentProvider(new DataModelTableContentProvider());
fDataAccessObject = DBMSFactory.INSTANCE.getDataAccessObject();
DBMSFactory.INSTANCE.verifyConnection();
fViewer.setInput(fDataAccessObject);
fDataAccessObject.addObserver(this);
// Event handler for check marks (selection) in the Table
fViewer.addCheckStateListener(new ICheckStateListener() {
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
checkState(event);
}
});// end of event handler
}
/**
* Handles the check state of the fTable
*
* @param event
*/
private void checkState(CheckStateChangedEvent event) {
String msgTitle="TotalADS"; //$NON-NLS-1$
String modelName = (String) event.getElement();
String[] modelAcronym = modelName.split("_"); //$NON-NLS-1$
if (event.getChecked()) {
// Don't let user select no connection message
if (modelName.equals(DataModelTableContentProvider.EMPTY_VIEW_FIELD)) {
uncheckedSelectedModel(modelName);
return;
}// See if more than 5 models are selected
else if (selection.size() >= 5) {
MessageDialog.openError(Display.getCurrent().getActiveShell(),
msgTitle, Messages.DataModelsView_SixModels);
uncheckedSelectedModel(modelName);
return;
} // Making sure that it is not a database that already exist in
// the db
else if (modelAcronym == null || modelAcronym.length < 2) {
MessageDialog.openError(Display.getCurrent().getActiveShell(),
msgTitle,NLS.bind(Messages.DataModelsView_NotAValidModel, modelName));
uncheckedSelectedModel(modelName);
return;
}// Make sure the algorithm is there in the list
else if (AlgorithmFactory.getInstance().getAlgorithmByAcronym(modelAcronym[1]) == null) {
MessageDialog.openError(Display.getCurrent().getActiveShell(),
msgTitle, NLS.bind(Messages.DataModelsView_NotAValidModel, modelName));
uncheckedSelectedModel(modelName);
return;
}
selection.add(modelName);
} else if (!event.getChecked()) {
selection.remove(modelName);
} // end of event checking
// now calling listeners
setSelection(new StructuredSelection(selection.clone()));
}
/**
* Unchecked selected model in the table view
*
* @param modelName
* Model name
*/
private void uncheckedSelectedModel(String modelName) {
for (int i = 0; i < fViewer.getTable().getItemCount(); i++) {
if (fViewer.getTable().getItem(i).getText().equals(modelName)) {
fViewer.getTable().getItem(i).setChecked(false);
break;
}
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.tracecompass.totalads.dbms.IDBMSObserver#update()
*/
@Override
public void update() {
if (fViewer != null) {
Table table = this.fViewer.getTable();
if (table != null && !table.isDisposed()) {
table.removeAll();
this.fViewer.refresh();
selection.clear();
setSelection(new StructuredSelection(selection.clone()));
}
}
}
/**
* Disposes the object
*/
public void dispose() {
fDataAccessObject.removeObserver(this);
}
}
// /////////////////////////////////////////////////////////////////////////////////////////////
// Inner class ends
// ////////////////////////////////////////////////////////////////////////////////////////////
/**
* Constructor
*/
public DataModelsView() {
listeners = new ListenerList();
selection = new LinkedHashSet<>();
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets
* .Composite)
*/
@Override
public void createPartControl(Composite parent) {
modelListViewer = new ModelsList(parent);
// Registering fViewer as a provider with Eclipse to monitor changes
getSite().setSelectionProvider(this);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.WorkbenchPart#setFocus()
*/
@Override
public void setFocus() {
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener
* (org.eclipse.jface.viewers.ISelectionChangedListener)
*/
@Override
public void addSelectionChangedListener(ISelectionChangedListener listener) {
listeners.add(listener);
}
/*
* (non-Javadoc)
*
* @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
*/
@Override
public ISelection getSelection() {
return new StructuredSelection(selection);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener
* (org.eclipse.jface.viewers.ISelectionChangedListener)
*/
@Override
public void removeSelectionChangedListener(
ISelectionChangedListener listener) {
listeners.remove(listener);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse
* .jface.viewers.ISelection)
*/
@Override
public void setSelection(ISelection selection) {
Object[] list = listeners.getListeners();
for (int i = 0; i < list.length; i++) {
((ISelectionChangedListener) list[i])
.selectionChanged(new SelectionChangedEvent(this, selection));
}
}
/**
* Refreshes the viewer and its contents
*/
public void refresh() {
this.modelListViewer.update();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.part.WorkbenchPart#dispose()
*/
@Override
public void dispose() {
modelListViewer.dispose();
super.dispose();
}
}