Skip to content

Commit

Permalink
draw unused cells; cleanup logging and locking
Browse files Browse the repository at this point in the history
  • Loading branch information
xzel23 committed Feb 1, 2025
1 parent 1461bd4 commit 9417cc6
Show file tree
Hide file tree
Showing 17 changed files with 317 additions and 257 deletions.
2 changes: 1 addition & 1 deletion meja-fx/src/main/java/com/dua3/meja/ui/fx/FxRow.java
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ public void dispose() {
private void render() {
LOG.trace("render()");
PlatformHelper.checkApplicationThread();
try (var __ = sheetViewDelegate.automaticReadLock()) {
try (var __ = sheetViewDelegate.readLock("FxRow.render()")) {
switch (getItem().rowIndex()) {
case ROW_INDEX_UNUSED -> renderEmpty();
case ROW_INDEX_COLUMN_LABELS -> renderColumnLabels();
Expand Down
4 changes: 2 additions & 2 deletions meja-fx/src/main/java/com/dua3/meja/ui/fx/FxSegmentView.java
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ public FxSegmentView(FxSheetViewDelegate svDelegate, SheetView.Quadrant quadrant

this.rows.addListener((ListChangeListener<? super Row>) change -> {
PlatformHelper.runLater(() -> {
try (var __ = svDelegate.automaticReadLock()) {
try (var __ = svDelegate.readLock("FxSegmentView - rows changed")) {
flow.setCellCount(rows.size());
flow.refresh();
}
Expand All @@ -162,7 +162,7 @@ public void updateLayout() {
}

@Override
public void setViewSizeOnDisplay(float w, float h) {
public void updateViewSize(float w, float h) {
if (quadrant== SheetView.Quadrant.TOP_LEFT) {
setMinSize(w, h);
setMaxSize(w, h);
Expand Down
8 changes: 4 additions & 4 deletions meja-fx/src/main/java/com/dua3/meja/ui/fx/FxSheetView.java
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ public void scrollToCurrentCell() {
LOG.trace("scrollToCurrentCell()");

Platform.runLater(() -> {
try (var __ = delegate.automaticReadLock()) {
try (var __ = delegate.readLock("FxSheetView.scrollToCurrentCell()")) {
Cell cell = delegate.getCurrentLogicalCell();
Sheet sheet = delegate.getSheet();
int i = cell.getRowNumber();
Expand Down Expand Up @@ -316,7 +316,7 @@ public void repaintCell(Cell cell) {
LOG.trace("repaintCell({})", cell);
PlatformHelper.checkApplicationThread();

try (var __ = delegate.automaticReadLock()) {
try (var __ = delegate.readLock("FxSheetView.repaintCell()")) {
Cell lc = cell.getLogicalCell();
int startRow = lc.getRowNumber();
int endRow = startRow + lc.getVerticalSpan();
Expand Down Expand Up @@ -353,7 +353,7 @@ private void updateLayout() {
LOG.debug("updateLayout()");
PlatformHelper.checkApplicationThread();
synchronized (topLeftQuadrant) {
try (var __ = delegate.automaticWriteLock()) {
try (var __ = delegate.readLock("FxSheetView.updateLayout()")) {
delegate.update(getDpi());
bottomRightQuadrant.updateLayout();
topRightQuadrant.updateLayout();
Expand All @@ -372,7 +372,7 @@ public void updateContent() {
return;
}

try (var __ = delegate.automaticWriteLock()) {
try (var __ = delegate.readLock("FxSheetView.updateContent()")) {
synchronized (topLeftQuadrant) {
updateLayout();
topLeftQuadrant.refresh();
Expand Down
5 changes: 3 additions & 2 deletions meja-poi/src/main/java/com/dua3/meja/model/poi/PoiSheet.java
Original file line number Diff line number Diff line change
Expand Up @@ -352,12 +352,13 @@ public void splitAt(int i, int j) {

@Override
public float getDefaultRowHeight() {
return poiSheet.getDefaultRowHeight();
return poiSheet.getDefaultRowHeightInPoints();
}

@Override
public float getDefaultColumnWidth() {
return poiSheet.getDefaultColumnWidth();
// unit is number of characters and 7 is a common character width in points
return poiSheet.getDefaultColumnWidth() * 7;
}

private void init() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
import com.dua3.meja.ui.swing.SwingSheetView;
import com.dua3.meja.ui.swing.SwingWorkbookView;
import com.dua3.meja.util.MejaHelper;
import com.dua3.utility.logging.LogLevel;
import com.dua3.utility.logging.log4j.LogUtilLog4J;
import com.dua3.utility.swing.SwingUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
Expand Down Expand Up @@ -52,6 +54,7 @@
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

Expand Down Expand Up @@ -86,18 +89,23 @@ public class SwingExcelViewer extends JFrame implements ExcelViewer<SwingWorkboo
*/
@SuppressWarnings("UseOfSystemOutOrSystemErr")
public static void main(String[] args) {
List<String> argList = new ArrayList<>(List.of(args));
if (argList.remove("--debug")) {
LogUtilLog4J.init(LogLevel.TRACE);
}

SwingUtil.setNativeLookAndFeel(APPLICATION_NAME);

SwingUtilities.invokeLater(() -> {
ExcelViewerModel<SwingWorkbookView, SwingSheetView> model = new ExcelViewerModel<>(APPLICATION_NAME, YEAR, AUTHOR);
SwingExcelViewer viewer = new SwingExcelViewer(model);

if (args.length > 1) {
if (argList.size() > 1) {
System.out.println(model.getInfo());
System.exit(STATUS_ERROR);
}

File file = args.length == 1 ? new File(args[0]) : null;
File file = argList.isEmpty() ? null : new File(argList.get(0));

viewer.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
viewer.setSize(600, 400);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
Expand All @@ -36,7 +37,7 @@ final class SwingSegmentView extends JPanel implements Scrollable, SegmentView {
SwingSheetViewDelegate sheetViewDelegate,
SheetView.Quadrant quadrant
) {
super(null, false);
super(new GridBagLayout(), false);
this.svDelegate = sheetViewDelegate;
this.ssvDelegate = new SegmentViewDelegate(this, svDelegate, quadrant);
init();
Expand Down Expand Up @@ -83,7 +84,7 @@ public int getScrollableUnitIncrement(java.awt.Rectangle visibleRect, int orient
// scroll up
final float y = yD2S.apply(visibleRect.y);
final int yD = yS2Di.apply(y);
int i = svDelegate.getRowNumberFromY(y);
int i = svDelegate.getRowNumberFromY(y, false);
int posD = yD;
while (i >= 0 && yD <= posD) {
posD = yS2Di.apply(svDelegate.getRowPos(i--));
Expand All @@ -93,7 +94,7 @@ public int getScrollableUnitIncrement(java.awt.Rectangle visibleRect, int orient
// scroll down
final float y = yD2S.apply(visibleRect.y + visibleRect.height);
final int yD = yS2Di.apply(y);
int i = svDelegate.getRowNumberFromY(y);
int i = svDelegate.getRowNumberFromY(y, false);
int posD = yD;
while (i <= svDelegate.getRowCount() && posD <= yD) {
posD = yS2Di.apply(svDelegate.getRowPos(i++));
Expand All @@ -106,7 +107,7 @@ public int getScrollableUnitIncrement(java.awt.Rectangle visibleRect, int orient
// scroll left
final float x = xD2S.apply(visibleRect.x);
final int xD = xS2Di.apply(x);
int j = svDelegate.getColumnNumberFromX(x);
int j = svDelegate.getColumnNumberFromX(x, false);
int posD = xD;
while (j >= 0 && xD <= posD) {
posD = xS2Di.apply(svDelegate.getColumnPos(j--));
Expand All @@ -116,7 +117,7 @@ public int getScrollableUnitIncrement(java.awt.Rectangle visibleRect, int orient
// scroll right
final float x = xD2S.apply(visibleRect.x + visibleRect.width);
int xD = xS2Di.apply(x);
int j = svDelegate.getColumnNumberFromX(x);
int j = svDelegate.getColumnNumberFromX(x, false);
int posD = xD;
while (j <= svDelegate.getColumnCount() && posD <= xD) {
posD = xS2Di.apply(svDelegate.getColumnPos(j++));
Expand All @@ -127,8 +128,14 @@ public int getScrollableUnitIncrement(java.awt.Rectangle visibleRect, int orient
}

@Override
public void setViewSizeOnDisplay(float w, float h) {
public void updateViewSize(float w, float h) {
Dimension dimension = new Dimension(Math.round(w), Math.round(h));
if (!ssvDelegate.isLeftOfSplit()) {
dimension.width = Math.max(dimension.width, getWidth());
}
if (!ssvDelegate.isAboveSplit()) {
dimension.height = Math.max(dimension.height, getHeight());
}
setSize(dimension);
setPreferredSize(dimension);
}
Expand All @@ -140,8 +147,8 @@ public boolean isOptimizedDrawingEnabled() {

@Override
public void validate() {
ssvDelegate.updateLayout();
super.validate();
ssvDelegate.updateLayout();
}

private void init() {
Expand All @@ -163,9 +170,7 @@ public void mousePressed(MouseEvent e) {

@Override
protected void paintComponent(Graphics g) {
LOG.debug("paintComponent(): ({},{}) - ({},{})", ssvDelegate.getStartRow(), ssvDelegate.getStartColumn(), ssvDelegate.getEndRow(), ssvDelegate.getEndColumn());

try (var __ = svDelegate.automaticReadLock()) {
try (var __ = svDelegate.readLock("SwingSegmentView.paintComponent()")) {
// clear background by calling super method
super.paintComponent(g);

Expand Down Expand Up @@ -222,8 +227,7 @@ public void scrollIntoView(Cell cell) {
return;
}

LOG.trace("scrollIntoView()");
try (var __ = svDelegate.automaticReadLock()) {
try (var __ = svDelegate.readLock("SwingSegmentView.scrollIntoView()")) {
Rectangle2f r = svDelegate.getCellRect(cell);
AffineTransformation2f t = ssvDelegate.getTransformation();
Rectangle bounds = SwingGraphics.convert(Rectangle2f.withCorners(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import javax.swing.JViewport;
import javax.swing.ScrollPaneConstants;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Point;

final class SwingSheetPane extends JScrollPane {
Expand Down Expand Up @@ -97,9 +98,30 @@ private void init() {
setRowHeaderView(bottomLeftQuadrant);
setCorner(ScrollPaneConstants.UPPER_LEADING_CORNER, topLeftQuadrant);

getViewport().addChangeListener(evt -> {
updateDimensionWithViewportSize();
});
setViewportBorder(BorderFactory.createEmptyBorder());
}

private void updateDimensionWithViewportSize() {
JViewport viewport = getViewport();
Dimension vpSize = viewport.getSize();
Point vpPosition = viewport.getViewPosition();
int w = vpPosition.x + vpSize.width;
int h = vpPosition.y + vpSize.height;
Dimension newSize = new Dimension(
Math.max(w, bottomRightQuadrant.getWidth()),
Math.max(h, bottomRightQuadrant.getHeight())
);
if (!newSize.equals(bottomRightQuadrant.getSize())) {
bottomRightQuadrant.setPreferredSize(newSize);
bottomRightQuadrant.setSize(newSize);
bottomLeftQuadrant.setPreferredSize(new Dimension(bottomLeftQuadrant.getWidth(), newSize.height));
topRightQuadrant.setPreferredSize(new Dimension(newSize.width, topRightQuadrant.getHeight()));
}
}

public void repaintSheet(Rectangle2f rect) {
LOG.debug("repaintSheet('{}'): {}", svDelegate.getSheet().getSheetName(), rect);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ public SwingSheetView(Sheet sheet) {
super(new GridLayout(1, 1));
this.delegate = new SwingSheetViewDelegate(sheet, this, CellRenderer::new);
this.sheetPane = new SwingSheetPane(delegate);

init();
}

Expand Down Expand Up @@ -255,4 +256,10 @@ public Locale getLocale() {
assert locale != null;
return locale;
}

@Override
public void validate() {
super.validate();
delegate.updateLayout();
}
}
2 changes: 2 additions & 0 deletions meja-ui/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@ dependencies {
api(project(":meja"))

implementation(rootProject.libs.dua3.utility)
implementation(rootProject.libs.dua3.utility.logging)
implementation(rootProject.libs.dua3.utility.logging.log4j)
}
2 changes: 1 addition & 1 deletion meja-ui/src/main/java/com/dua3/meja/ui/SegmentView.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@ public interface SegmentView {
* @param w The width of the view in pixels.
* @param h The height of the view in pixels.
*/
void setViewSizeOnDisplay(float w, float h);
void updateViewSize(float w, float h);

}
25 changes: 15 additions & 10 deletions meja-ui/src/main/java/com/dua3/meja/ui/SegmentViewDelegate.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
import com.dua3.utility.math.geometry.AffineTransformation2f;
import com.dua3.utility.math.geometry.Scale2f;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
* This class serves as a delegate for the {@link SegmentView} and is responsible for managing
Expand All @@ -26,6 +27,8 @@ public class SegmentViewDelegate {
private float widthInPixels;
private float heightInPixels;

private final ReadWriteLock lock = new ReentrantReadWriteLock();

/**
* Constructs a {@code SegmentViewDelegate} instance, which manages the interaction
* between a {@link SegmentView}, a {@link SheetViewDelegate}, and a specific
Expand Down Expand Up @@ -201,12 +204,7 @@ public boolean hasVLine() {
* where segments might be positioned above, below, left, or right of splits.
*/
public void updateLayout() {
Lock lock = getSheet().readLock();
lock.lock();
try {
// update the sheet layout first
sheetViewDelegate.updateLayout();

try (var __ = sheetViewDelegate.readLock("SegmentViewDelegate.updateLayout()")) {
// the width is the width for the labels showing row names ...
float width = isLeftOfSplit() ? sheetViewDelegate.getRowLabelWidthInPoints() : 0;

Expand Down Expand Up @@ -235,9 +233,7 @@ public void updateLayout() {
this.widthInPixels = s.sx() * width;
this.heightInPixels = s.sy() * height;

owner.setViewSizeOnDisplay(widthInPixels, heightInPixels);
} finally {
lock.unlock();
owner.updateViewSize(widthInPixels, heightInPixels);
}
}

Expand Down Expand Up @@ -292,6 +288,15 @@ public AffineTransformation2f getTransformation() {
);
}

/**
* Retrieves the quadrant associated with this segment view delegate.
*
* @return the {@link SheetView.Quadrant} representing the portion of the sheet managed by this delegate
*/
public SheetView.Quadrant getQuadrant() {
return quadrant;
}

@Override
public String toString() {
return (isAboveSplit() ? "TOP_" : "BOTTOM_")
Expand Down
Loading

0 comments on commit 9417cc6

Please sign in to comment.