/*
* #%L
* gitools-ui-app
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.ui.app.actions.edit;
import org.gitools.api.analysis.IProgressMonitor;
import org.gitools.api.matrix.IMatrix;
import org.gitools.api.matrix.IMatrixLayer;
import org.gitools.api.persistence.FileFormat;
import org.gitools.api.resource.IResource;
import org.gitools.api.resource.IResourceFormat;
import org.gitools.heatmap.Heatmap;
import org.gitools.heatmap.format.HeatmapFormat;
import org.gitools.matrix.FileFormats;
import org.gitools.matrix.format.CdmMatrixFormat;
import org.gitools.matrix.format.TdmMatrixFormat;
import org.gitools.matrix.model.hashmatrix.HashMatrix;
import org.gitools.ui.app.commands.CommandLoadFile;
import org.gitools.ui.app.fileimport.ImportManager;
import org.gitools.ui.core.Application;
import org.gitools.ui.core.actions.HeatmapAction;
import org.gitools.ui.core.utils.FileChoose;
import org.gitools.ui.core.utils.FileChooserUtils;
import org.gitools.ui.core.utils.FileFormatFilter;
import org.gitools.ui.platform.icons.IconNames;
import org.gitools.ui.platform.progress.JobThread;
import org.gitools.ui.platform.settings.Settings;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static org.gitools.api.ApplicationContext.getPersistenceManager;
public class AddNewLayersFromFileAction extends HeatmapAction {
public static FileFormat[] FORMAT_HEATMAPS = new FileFormat[]{
HeatmapFormat.FILE_FORMAT,
FileFormats.MULTIVALUE_DATA_MATRIX,
FileFormats.DOUBLE_MATRIX,
FileFormats.DOUBLE_BINARY_MATRIX,
FileFormats.GENE_CLUSTER_TEXT,
FileFormats.GENE_MATRIX,
FileFormats.GENE_MATRIX_TRANSPOSED,
FileFormats.DOUBLE_BINARY_MATRIX,
FileFormats.MODULES_INDEXED_MAP,
FileFormats.MODULES_2C_MAP
};
public static FileFormatFilter[] FILE_FORMAT_FILTERS;
static {
List<FileFormatFilter> filters = new ArrayList<>();
Collections.addAll(filters,
new FileFormatFilter("All known formats", FileFormat.concat(
ImportManager.get().getFileFormats(),
FORMAT_HEATMAPS
)),
new FileFormatFilter(HeatmapFormat.FILE_FORMAT),
new FileFormatFilter("All files"),
new FileFormatFilter(FileFormats.MULTIVALUE_DATA_MATRIX),
new FileFormatFilter(FileFormats.DOUBLE_MATRIX),
new FileFormatFilter(FileFormats.GENE_CLUSTER_TEXT),
new FileFormatFilter(FileFormats.DOUBLE_BINARY_MATRIX),
new FileFormatFilter(FileFormats.GENE_MATRIX),
new FileFormatFilter(FileFormats.GENE_MATRIX_TRANSPOSED)
);
filters.addAll(ImportManager.get().getFileFormatFilters());
FILE_FORMAT_FILTERS = filters.toArray(new FileFormatFilter[filters.size()]);
}
public AddNewLayersFromFileAction() {
super("New data from file...");
setSmallIconFromResource(IconNames.add16);
}
@Override
public boolean isEnabledByModel(Object model) {
return (model instanceof Heatmap) && (((Heatmap) model).getContents() instanceof HashMatrix);
}
@Override
public void actionPerformed(ActionEvent e) {
final FileChoose fileChoose = FileChooserUtils.selectFile("Select file", FileChooserUtils.MODE_OPEN, FILE_FORMAT_FILTERS);
if (fileChoose == null) {
return;
}
Settings.get().setLastPath(fileChoose.getFile().getParent());
Settings.get().save();
IResourceFormat format = null;
if (fileChoose.getFilter() != null) {
if (fileChoose.getFilter().getDescription().startsWith(FileFormats.MULTIVALUE_DATA_MATRIX.getTitle())) {
format = getPersistenceManager().getFormat(TdmMatrixFormat.EXSTENSION, IMatrix.class);
}
if (fileChoose.getFilter().getDescription().startsWith(FileFormats.DOUBLE_MATRIX.getTitle())) {
format = getPersistenceManager().getFormat(CdmMatrixFormat.EXTENSION, IMatrix.class);
}
}
CommandLoadFile loadFile = new CommandLoadFile(fileChoose.getFile().getAbsolutePath(), format) {
@Override
public void afterLoad(IResource resource, IProgressMonitor monitor) throws CommandException {
// A IMatrix
if (IMatrix.class.isAssignableFrom(resource.getClass())) {
HashMatrix mainData = (HashMatrix) getHeatmap().getContents();
IMatrix newData = (IMatrix) resource;
for (IMatrixLayer newLayer : newData.getLayers()) {
IMatrixLayer mainLayer = mainData.getLayers().get(newLayer.getId());
if (mainLayer != null) {
//TODO Support data fusion ??
throw new UnsupportedOperationException("Overwrite layer data is not allowed. The layer '" + newLayer.getId() + "' already exist.");
}
mainData.addLayer(newLayer);
getHeatmap().getLayers().initLayer(newLayer);
mainLayer = mainData.getLayers().get(newLayer.getId());
copyLayerValues(newData, newLayer, mainData, mainLayer);
}
getHeatmap().getLayers().updateLayers();
}
}
};
JobThread.execute(Application.get(), loadFile);
Application.get().showNotification("New data layer added");
}
private static void copyLayerValues(IMatrix fromMatrix, IMatrixLayer fromLayer, IMatrix toMatrix, IMatrixLayer toLayer) {
if ((fromMatrix instanceof HashMatrix) && (toMatrix instanceof HashMatrix)) {
HashMatrix fromHM = (HashMatrix) fromMatrix;
HashMatrix toHM = (HashMatrix) toMatrix;
toHM.copyLayerValues(fromLayer.getId(), fromHM);
} else {
for (String column : fromMatrix.getColumns()) {
for (String row : fromMatrix.getRows()) {
toMatrix.set(toLayer, fromMatrix.get(fromLayer, row, column), row, column);
}
}
}
}
}