20 package net.sf.gridarta.model.mapgrid;
22 import java.awt.Point;
23 import java.awt.Rectangle;
24 import java.util.ArrayList;
25 import java.util.Collection;
26 import java.util.List;
27 import java.util.concurrent.CopyOnWriteArrayList;
29 import org.jetbrains.annotations.NotNull;
30 import org.jetbrains.annotations.Nullable;
75 private final Rectangle
recChange =
new Rectangle();
160 private final Collection<MapGridListener>
listenerList =
new CopyOnWriteArrayList<>();
220 final int[][] newGridFlags =
new int[newSize.getWidth()][newSize.getHeight()];
221 final Point pos =
new Point();
229 for (pos.x = 0; pos.x < minSize.
getWidth(); pos.x++) {
230 for (pos.y = 0; pos.y < minSize.
getHeight(); pos.y++) {
231 newGridFlags[pos.x][pos.y] =
gridFlags[pos.x][pos.y];
246 listener.mapGridChanged(e);
256 listener.mapGridResized(e);
281 }
catch (
final ArrayIndexOutOfBoundsException ignored) {
313 public void preSelect(@NotNull
final Point start, @NotNull
final Point end) {
334 public void updatePreSelect(@NotNull
final Point start, @NotNull
final Point oldEnd, @NotNull
final Point newEnd) {
335 final Point old1 =
new Point(Math.min(start.x, oldEnd.x), Math.min(start.y, oldEnd.y));
336 final Point old2 =
new Point(Math.max(start.x, oldEnd.x), Math.max(start.y, oldEnd.y));
337 final Point new1 =
new Point(Math.min(start.x, newEnd.x), Math.min(start.y, newEnd.y));
338 final Point new2 =
new Point(Math.max(start.x, newEnd.x), Math.max(start.y, newEnd.y));
342 if (old1.x < new1.x) {
346 if (new2.x < old2.x) {
350 if (old1.y < new1.y) {
354 if (new2.y < old2.y) {
360 if (new1.x < old1.x) {
364 if (old2.x < new2.x) {
368 if (new1.y < old1.y) {
372 if (old2.y < new2.y) {
378 assert old1.x == new1.x;
379 assert old2.x == new2.x;
380 assert old1.y == new1.y;
381 assert old2.y == new2.y;
393 public void unPreSelect(@NotNull
final Point start, @NotNull
final Point end) {
422 switch (selectionMode) {
444 private void calculateRec(@NotNull
final Point p1, @NotNull
final Point p2) {
692 private void setFlags(
final int minX,
final int minY,
final int maxX,
final int maxY,
final int flags) {
693 for (
int x = minX; x <= maxX; x++) {
694 for (
int y = minY; y <= maxY; y++) {
695 if ((
gridFlags[x][y] & flags) != flags) {
715 private void unsetFlags(
final int minX,
final int minY,
final int maxX,
final int maxY,
final int flags) {
716 for (
int x = minX; x <= maxX; x++) {
717 for (
int y = minY; y <= maxY; y++) {
738 private void toggleFlags(
final int minX,
final int minY,
final int maxX,
final int maxY,
final int flags) {
739 for (
int x = minX; x <= maxX; x++) {
740 for (
int y = minY; y <= maxY; y++) {
764 throw new IllegalStateException(
"A transaction must only be used by one thread.");
778 throw new IllegalStateException(
"Tried to end a transaction but no transaction was open.");
816 private void updateSelectionFlag(
final int x,
final int y,
final boolean newState,
final int dx,
final int dy,
final int flag,
final int dFlag) {
845 final List<Point> selection =
new ArrayList<>();
846 if (selectedRec !=
null) {
847 for (
int x = selectedRec.x; x < selectedRec.x + selectedRec.width; x++) {
848 for (
int y = selectedRec.y; y < selectedRec.y + selectedRec.height; y++) {
850 selection.add(
new Point(x, y));
857 return selection.toArray(
new Point[0]);