/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.swing;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import com.opengamma.core.change.ChangeEvent;
import com.opengamma.core.change.ChangeListener;
import com.opengamma.engine.view.ViewDefinition;
import com.opengamma.master.config.ConfigDocument;
import com.opengamma.master.config.ConfigMaster;
import com.opengamma.master.config.ConfigSearchRequest;
import com.opengamma.master.config.ConfigSearchResult;
/**
* List model holding list of views - updates when underlying config master updates.
*/
public class ViewListModel extends AbstractListModel<ViewEntry> implements ComboBoxModel<ViewEntry> {
/**
* Version UID
*/
private static final long serialVersionUID = 1L;
private Object _viewsLock = new Object();
private volatile List<ViewEntry> _views = new ArrayList<>();
private volatile List<ViewEntry> _filteredViews = new ArrayList<>();
private ConfigMaster _configMaster;
private ViewEntry _selectedItem;
private String _filter;
public ViewListModel(ConfigMaster configMaster) {
_configMaster = configMaster;
registerListener();
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
pullItems();
runFilter();
return null;
}
};
worker.execute();
}
public void setFilter(String filter) {
_filter = filter;
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
runFilter();
return null;
}
};
worker.execute();
}
private void runFilter() {
synchronized (_viewsLock) {
List<ViewEntry> filtered = new ArrayList<>();
for (ViewEntry entry : _views) {
if (_filter == null || entry.getName().contains(_filter)) {
filtered.add(entry);
}
}
_filteredViews = filtered;
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
fireContentsChanged(this, 0, getSize());
}
});
}
private void pullItems() {
ConfigSearchRequest<ViewDefinition> searchReq = new ConfigSearchRequest<ViewDefinition>();
searchReq.setType(ViewDefinition.class);
ConfigSearchResult<ViewDefinition> search = _configMaster.search(searchReq);
synchronized (_viewsLock) {
_views.clear();
for (ConfigDocument document : search.getDocuments()) {
_views.add(ViewEntry.of(document.getUniqueId(), document.getName()));
}
Collections.sort(_views, ViewEntryComparator.getInstance());
}
}
private void registerListener() {
_configMaster.changeManager().addChangeListener(new ChangeListener() {
@Override
public void entityChanged(ChangeEvent event) {
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
@Override
protected Void doInBackground() throws Exception {
pullItems();
runFilter();
return null;
}
};
worker.execute();
}
});
}
@Override
public int getSize() {
return _filteredViews.size();
}
@Override
public ViewEntry getElementAt(int index) {
return _filteredViews.get(index);
}
@Override
public void setSelectedItem(Object anItem) {
_selectedItem = (ViewEntry) anItem;
}
@Override
public Object getSelectedItem() {
return _selectedItem;
}
}