Skip to content

Commit

Permalink
ZSS-294: cannot create a named range
Browse files Browse the repository at this point in the history
  • Loading branch information
henrichen committed Apr 7, 2014
1 parent f907ced commit 91e5b4c
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 2 deletions.
7 changes: 7 additions & 0 deletions zss/src/org/zkoss/zss/api/Range.java
Original file line number Diff line number Diff line change
Expand Up @@ -789,4 +789,11 @@ public Font findFont(Boldweight boldweight, Color color,
* @since 3.5.0
*/
public SRange getInternalRange();

/**
* Create a {@link Name} that refer to this range.
* @param nameName name of the {@link Name} that you can refer in formulas.
* @since 3.5.0
*/
public void createName(String nameName);
}
6 changes: 4 additions & 2 deletions zss/src/org/zkoss/zss/api/impl/RangeImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -685,6 +685,8 @@ public String asString() {
public SRange getInternalRange() {
return _range;
}


@Override
public void createName(String nameName) {
_range.createName(nameName);
}
}
5 changes: 5 additions & 0 deletions zssmodel/src/org/zkoss/zss/range/SRange.java
Original file line number Diff line number Diff line change
Expand Up @@ -715,4 +715,9 @@ public void sort(SRange key1, boolean descending1, SortDataOption dataOption1, S
*/
public void clearAll();

/**
* Create a {@link SName} that refer to this range.
* @param nameName name of the {@link SName} that you can refer in formulas.
*/
public void createName(String nameName);
}
35 changes: 35 additions & 0 deletions zssmodel/src/org/zkoss/zss/range/impl/RangeImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,14 @@
import org.zkoss.zss.model.SSheet;
import org.zkoss.zss.model.SSheetViewInfo;
import org.zkoss.zss.model.SheetRegion;
import org.zkoss.zss.model.SName;
import org.zkoss.zss.model.ViewAnchor;
import org.zkoss.zss.model.impl.AbstractBookSeriesAdv;
import org.zkoss.zss.model.impl.AbstractSheetAdv;
import org.zkoss.zss.model.impl.AbstractNameAdv;
import org.zkoss.zss.model.impl.FormulaCacheCleaner;
import org.zkoss.zss.model.impl.RefImpl;
import org.zkoss.zss.model.impl.NameRefImpl;
import org.zkoss.zss.model.sys.EngineFactory;
import org.zkoss.zss.model.sys.dependency.DependencyTable;
import org.zkoss.zss.model.sys.dependency.DependencyTable.RefFilter;
Expand Down Expand Up @@ -1674,6 +1677,38 @@ protected Object doInvoke() {
protected void doBeforeNotify() {}
}.doInWriteLock(getLock());
}

@Override
public void createName(final String nameName) {
new ReadWriteTask() {
@Override
public Object invoke() {
createNameInLock(nameName);
return null;
}
}.doInWriteLock(getLock());
}

private void createNameInLock(String nameName) {
final SSheet sht = getSheet();
final String sn = sht.getSheetName();
final org.zkoss.poi.ss.util.AreaReference af = new org.zkoss.poi.ss.util.AreaReference(
new org.zkoss.poi.ss.util.CellReference(sn,getRow(),getColumn(),true,true),
new org.zkoss.poi.ss.util.CellReference(sn,getLastRow(),getLastColumn(),true,true));
final String refers = af.formatAsString();
final SName name = getBook().createName(nameName);
name.setRefersToFormula(refers);

// Some formula might have referred to the {@link Name} by the specified nameName already;
// have to notify those cells.
final AbstractBookSeriesAdv series = (AbstractBookSeriesAdv) getBookSeries();
final DependencyTable table = series.getDependencyTable();
handleRefNotifyContentChange(series, table.getEvaluatedDependents(new NameRefImpl((AbstractNameAdv)name)));

// Notify change of the associated range of this name
// TODO: createName does not change contents of the associated range, do I have to notifyChange?
SRanges.rangeByName(sht, nameName).notifyChange();
}

private static final SRange EMPTY_RANGE = new EmptyNRange();
}

0 comments on commit 91e5b4c

Please sign in to comment.