Skip to content

Commit

Permalink
Merge pull request #5989 from mP1/feature/SpreadsheetColumnOrRowRange…
Browse files Browse the repository at this point in the history
…Reference-pulled-all-members

SpreadsheetColumnOrRowRangeReference pulled all members
  • Loading branch information
mP1 authored Mar 3, 2025
2 parents 60831f0 + 5ad61a6 commit 16288e8
Show file tree
Hide file tree
Showing 7 changed files with 294 additions and 198 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,174 +17,16 @@

package walkingkooka.spreadsheet.reference;

import walkingkooka.Cast;
import walkingkooka.collect.HasRange;
import walkingkooka.collect.HasRangeBounds;
import walkingkooka.collect.Range;
import walkingkooka.spreadsheet.formula.parser.SpreadsheetFormulaParserToken;

import java.util.Iterator;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.IntStream;

/**
* Base class for a range that holds a column or row range.
*/
@SuppressWarnings("lgtm[java/inconsistent-equals-and-hashcode]")
abstract class SpreadsheetColumnOrRowRangeReference<T extends SpreadsheetColumnOrRowReference & Comparable<T>> extends SpreadsheetSelection
implements HasRange<T>,
HasRangeBounds<T>,
Iterable<T> {
abstract class SpreadsheetColumnOrRowRangeReference extends SpreadsheetSelection {

/**
* Package private ctor
*/
SpreadsheetColumnOrRowRangeReference(final Range<T> range) {
SpreadsheetColumnOrRowRangeReference() {
super();
this.range = range;
}

/**
* Returns the top left column/row reference.
*/
@SuppressWarnings("OptionalGetWithoutIsPresent")
@Override
public final T begin() {
return this.range.lowerBound().value().get(); // must exist
}

/**
* Returns the bottom right column/row reference.
*/
@SuppressWarnings("OptionalGetWithoutIsPresent")
@Override
public final T end() {
return this.range.upperBound().value().get(); // must exist
}

// replaceReferencesMapper..........................................................................................

@Override
final Optional<Function<SpreadsheetCellReference, Optional<SpreadsheetCellReference>>> replaceReferencesMapper0(final SpreadsheetSelection movedTo) {
return this.toScalar()
.replaceReferencesMapper0(movedTo);
}

// count............................................................................................................

/**
* Returns the number of columns or rows in this range.
*/
@Override
public final long count() {
return this.end()
.value()
- this.begin()
.value()
+ 1;
}

@Override
public final boolean isFirst() {
return this.begin().isFirst() && this.isUnit();
}

@Override
public final boolean isLast() {
return this.begin().isLast() && this.isUnit();
}

/**
* Returns a {@link SpreadsheetCellReference} that holds the top left column/row reference.
*/
@Override
public final Range<T> range() {
return this.range;
}

final Range<T> range;

/**
* Would be setter that accepts a pair of column/row, and returns a range with those values,
* creating a new instance if necessary.
*/
final <R extends SpreadsheetColumnOrRowRangeReference<?>> R setRange0(final Range<T> range) {
return Cast.to(
this.range.equals(range) ?
this :
this.replace(range)
);
}

abstract SpreadsheetColumnOrRowRangeReference<?> replace(final Range<T> range);

// toXXX............................................................................................................

@Override
public SpreadsheetSelection toScalar() {
return this.begin();
}

@Override
public final SpreadsheetCellReference toCell() {
return this.toScalar()
.toCell();
}

// Iterable.........................................................................................................

@Override
public final Iterator<T> iterator() {
return IntStream.rangeClosed(
this.begin().value(),
this.end().value()
)
.boxed()
.map(this::iteratorIntToReference)
.iterator();
}

/**
* Mapping expression that returns a relative {@link SpreadsheetColumnOrRowReference} given the value.
*/
abstract T iteratorIntToReference(int value);

// HasParserToken...................................................................................................

@Override
public final SpreadsheetFormulaParserToken toParserToken() {
throw new UnsupportedOperationException();
}

// HashCodeEqualsDefined.......................................................................................

@Override
public final int hashCode() {
return this.range.hashCode();
}

@Override
boolean equalsNotSameAndNotNull(final Object other,
final boolean includeKind) {
return this.equals1(
(SpreadsheetColumnOrRowRangeReference<?>) other,
includeKind
);
}

private boolean equals1(final SpreadsheetColumnOrRowRangeReference<?> other,
final boolean includeKind) {
return this.begin().equalsNotSameAndNotNull(other.begin(), includeKind) &&
this.end().equalsNotSameAndNotNull(other.end(), includeKind);
}

// toString........................................................................................................

@Override
public final String toString() {
return this.isUnit() ?
this.begin().toString() :
this.begin() + SEPARATOR.string() + this.end();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ public static SpreadsheetColumnOrRowReference parseColumnOrRow(final String text
/**
* Extracts either the column or row range reference from the given {@link SpreadsheetSelection}.
*/
public abstract SpreadsheetColumnOrRowRangeReference<?> columnOrRowRange(final SpreadsheetSelection selection);
public abstract SpreadsheetColumnOrRowRangeReference columnOrRowRange(final SpreadsheetSelection selection);

/**
* Returns the width or height for the given {@link SpreadsheetSelection}. For {@link #COLUMN} it will return the width.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,31 @@

package walkingkooka.spreadsheet.reference;

import walkingkooka.collect.HasRange;
import walkingkooka.collect.HasRangeBounds;
import walkingkooka.collect.Range;
import walkingkooka.collect.RangeBound;
import walkingkooka.spreadsheet.formula.parser.SpreadsheetFormulaParserToken;
import walkingkooka.text.CharSequences;

import java.util.EnumSet;
import java.util.Iterator;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.IntStream;

/**
* Holds a column range.
*/
@SuppressWarnings("lgtm[java/inconsistent-equals-and-hashcode]")
public final class SpreadsheetColumnRangeReference extends SpreadsheetColumnOrRowRangeReference<SpreadsheetColumnReference>
implements Comparable<SpreadsheetColumnRangeReference> {
public final class SpreadsheetColumnRangeReference extends SpreadsheetColumnOrRowRangeReference
implements Comparable<SpreadsheetColumnRangeReference>,
HasRange<SpreadsheetColumnReference>,
HasRangeBounds<SpreadsheetColumnReference>,
Iterable<SpreadsheetColumnReference> {

/**
* A {@link SpreadsheetColumnRangeReference} that includes all columns.
Expand All @@ -56,16 +64,46 @@ static SpreadsheetColumnRangeReference with(final Range<SpreadsheetColumnReferen
* Private ctor
*/
private SpreadsheetColumnRangeReference(final Range<SpreadsheetColumnReference> range) {
super(range);
super();
this.range = range;
}

public SpreadsheetColumnRangeReference setRange(final Range<SpreadsheetColumnReference> range) {
return this.setRange0(range);
/**
* Returns the top left column/row reference.
*/
@SuppressWarnings("OptionalGetWithoutIsPresent")
@Override
public SpreadsheetColumnReference begin() {
return this.range.lowerBound()
.value()
.get(); // must exist
}

/**
* Returns the bottom right column/row reference.
*/
@SuppressWarnings("OptionalGetWithoutIsPresent")
@Override
SpreadsheetColumnRangeReference replace(final Range<SpreadsheetColumnReference> range) {
return with(range);
public SpreadsheetColumnReference end() {
return this.range.upperBound()
.value()
.get(); // must exist
}

@Override
public Range<SpreadsheetColumnReference> range() {
return this.range;
}

private final Range<SpreadsheetColumnReference> range;


public SpreadsheetColumnRangeReference setRange(final Range<SpreadsheetColumnReference> range) {
Objects.requireNonNull(range, "range");

return this.range.equals(range) ?
this :
with(range);
}

/**
Expand Down Expand Up @@ -176,6 +214,40 @@ boolean testRowNonNull(final SpreadsheetRowReference row) {
return false;
}

// count............................................................................................................

/**
* Returns the number of columns in this range.
*/
@Override
public long count() {
return this.end()
.value()
- this.begin()
.value()
+ 1;
}

// isXXX............................................................................................................

@Override
public boolean isFirst() {
return this.begin().isFirst() && this.isUnit();
}

@Override
public boolean isLast() {
return this.begin().isLast() && this.isUnit();
}

// toXXX............................................................................................................

@Override
public SpreadsheetCellReference toCell() {
return this.toScalar()
.toCell();
}

@Override
public SpreadsheetColumnReference toColumn() {
return this.begin();
Expand All @@ -196,6 +268,13 @@ public SpreadsheetRowRangeReference toRowRange() {
throw new UnsupportedOperationException(this.toString());
}

// toScalar.........................................................................................................

@Override
public SpreadsheetColumnReference toScalar() {
return this.begin();
}

// toRange..........................................................................................................

@Override
Expand Down Expand Up @@ -441,6 +520,14 @@ public SpreadsheetColumnReference focused(final SpreadsheetViewportAnchor anchor
.column(this);
}

// replaceReferencesMapper..........................................................................................

@Override
Optional<Function<SpreadsheetCellReference, Optional<SpreadsheetCellReference>>> replaceReferencesMapper0(final SpreadsheetSelection movedTo) {
return this.toScalar()
.replaceReferencesMapper0(movedTo);
}

// SpreadsheetSelectionVisitor......................................................................................

@Override
Expand All @@ -451,11 +538,53 @@ void accept(final SpreadsheetSelectionVisitor visitor) {
// Iterable.........................................................................................................

@Override
SpreadsheetColumnReference iteratorIntToReference(final int value) {
return SpreadsheetReferenceKind.RELATIVE.column(value);
public Iterator<SpreadsheetColumnReference> iterator() {
return IntStream.rangeClosed(
this.begin().value(),
this.end().value()
)
.boxed()
.map(SpreadsheetReferenceKind.RELATIVE::column)
.iterator();
}

// Object...........................................................................................................
// HasParserToken...................................................................................................

@Override
public SpreadsheetFormulaParserToken toParserToken() {
throw new UnsupportedOperationException();
}

// hashCode/equals..................................................................................................

@Override
public int hashCode() {
return this.range.hashCode();
}

@Override
boolean equalsNotSameAndNotNull(final Object other,
final boolean includeKind) {
return this.equals1(
(SpreadsheetColumnRangeReference) other,
includeKind
);
}

private boolean equals1(final SpreadsheetColumnRangeReference other,
final boolean includeKind) {
return this.begin().equalsNotSameAndNotNull(other.begin(), includeKind) &&
this.end().equalsNotSameAndNotNull(other.end(), includeKind);
}

// toString.........................................................................................................

@Override
public String toString() {
return this.isUnit() ?
this.begin().toString() :
this.begin() + SEPARATOR.string() + this.end();
}

// Comparable.......................................................................................................

Expand Down
Loading

0 comments on commit 16288e8

Please sign in to comment.