/*=============================================================================# # Copyright (c) 2010-2016 Stephan Wahlbrink (WalWare.de) 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: # Stephan Wahlbrink - initial API and implementation #=============================================================================*/ package de.walware.statet.r.internal.ui.dataeditor; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import de.walware.rj.data.RArray; import de.walware.rj.data.RDataUtil; import de.walware.rj.data.RObject; import de.walware.rj.data.RStore; import de.walware.rj.data.UnexpectedRDataException; import de.walware.rj.eclient.IRToolService; import de.walware.rj.services.utils.dataaccess.LazyRStore; import de.walware.rj.services.utils.dataaccess.RMatrixDataAdapter; import de.walware.statet.r.core.model.RElementName; import de.walware.statet.r.ui.dataeditor.IRDataTableInput; import de.walware.statet.r.ui.dataeditor.RDataTableColumn; public class RMatrixDataProvider extends AbstractRDataProvider<RArray<?>> { public RMatrixDataProvider(final IRDataTableInput input, final RArray<?> struct) throws CoreException { super(input, new RMatrixDataAdapter(), struct); reset(); } @Override public boolean getAllColumnsEqual() { return true; } @Override protected RDataTableContentDescription loadDescription(final RElementName name, final RArray<?> struct, final IRToolService r, final IProgressMonitor monitor) throws CoreException, UnexpectedRDataException { final RDataTableContentDescription description= new RDataTableContentDescription(name, struct, r.getTool()); final long count= getColumnCount(); description.setRowHeaderColumns( createNamesColumn("rownames(" + getInput().getFullName() + ")", getAdapter().getRowCount(struct), r, monitor )); final RDataTableColumn template= createColumn(struct.getData(), getInput().getFullName(), null, -1, null, r, monitor ); if (count <= 2500) { final int l= (int) count; RStore names; final RObject rObject= r.evalData("colnames(" + getInput().getFullName() + ")", monitor); if (rObject != null && rObject.getRObjectType() == RObject.TYPE_VECTOR && rObject.getLength() == l) { names= rObject.getData(); } else { names= null; } final RDataTableColumn[] dataColumns= new RDataTableColumn[l]; for (int i= 0; i < l; i++) { dataColumns[i]= new RDataTableColumn(i, (names != null) ? names.getChar(i) : Integer.toString((i+1)), null, null, template.getVarType(), template.getDataStore(), template.getClassNames(), template.getDefaultFormat()); } description.setVariables(dataColumns); } description.setDefaultDataFormat(template.getDefaultFormat()); return description; } @Override protected void appendOrderCmd(final StringBuilder cmd, final SortColumn sortColumn) { cmd.append("order("); cmd.append(getInput().getFullName()); cmd.append("[,"); cmd.append((sortColumn.getIdx() + 1)); cmd.append("],decreasing="); cmd.append(sortColumn.decreasing ? "TRUE" : "FALSE"); cmd.append(')'); } @Override protected Object getDataValue(final LazyRStore.Fragment<RArray<?>> fragment, final long rowIdx, final long columnIdx) { return fragment.getRObject().getData().get(RDataUtil.getDataIdx(fragment.getRowCount(), fragment.toLocalRowIdx(rowIdx), fragment.toLocalColumnIdx(columnIdx) )); } @Override protected Object getColumnName(final LazyRStore.Fragment<RArray<?>> fragment, final long columnIdx) { final RStore names= fragment.getRObject().getNames(1); if (names != null) { return names.get(columnIdx - fragment.getColumnBeginIdx()); } else { return Long.toString(columnIdx + 1); } } }