changed tabs to four spaces
parent
ae360c8ce7
commit
e55264be16
|
@ -13,51 +13,48 @@ import java.util.Set;
|
||||||
|
|
||||||
public class ImageBattlefieldViewer extends JPanel implements ChoiceViewer {
|
public class ImageBattlefieldViewer extends JPanel implements ChoiceViewer {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private final ViewerInfo viewerInfo;
|
private final ViewerInfo viewerInfo;
|
||||||
private final boolean opponent;
|
private final boolean opponent;
|
||||||
private final ImagePermanentsViewer permanentsViewer;
|
private final ImagePermanentsViewer permanentsViewer;
|
||||||
private final PermanentFilter permanentFilter;
|
private final PermanentFilter permanentFilter;
|
||||||
|
|
||||||
public ImageBattlefieldViewer(final ViewerInfo viewerInfo,final GameController controller,final boolean opponent) {
|
public ImageBattlefieldViewer(final ViewerInfo viewerInfo,final GameController controller,final boolean opponent) {
|
||||||
|
this.viewerInfo=viewerInfo;
|
||||||
this.viewerInfo=viewerInfo;
|
this.opponent=opponent;
|
||||||
this.opponent=opponent;
|
|
||||||
|
|
||||||
final Theme theme=ThemeFactory.getInstance().getCurrentTheme();
|
final Theme theme=ThemeFactory.getInstance().getCurrentTheme();
|
||||||
|
|
||||||
controller.registerChoiceViewer(this);
|
controller.registerChoiceViewer(this);
|
||||||
|
|
||||||
setOpaque(false);
|
setOpaque(false);
|
||||||
|
|
||||||
setLayout(new BorderLayout(6,0));
|
setLayout(new BorderLayout(6,0));
|
||||||
|
|
||||||
final JPanel leftPanel=new JPanel(new BorderLayout());
|
final JPanel leftPanel=new JPanel(new BorderLayout());
|
||||||
leftPanel.setOpaque(false);
|
leftPanel.setOpaque(false);
|
||||||
add(leftPanel,BorderLayout.WEST);
|
add(leftPanel,BorderLayout.WEST);
|
||||||
|
|
||||||
final JLabel iconLabel=new JLabel(theme.getIcon(Theme.ICON_SMALL_BATTLEFIELD));
|
final JLabel iconLabel=new JLabel(theme.getIcon(Theme.ICON_SMALL_BATTLEFIELD));
|
||||||
iconLabel.setOpaque(true);
|
iconLabel.setOpaque(true);
|
||||||
iconLabel.setBackground(theme.getColor(Theme.COLOR_ICON_BACKGROUND));
|
iconLabel.setBackground(theme.getColor(Theme.COLOR_ICON_BACKGROUND));
|
||||||
iconLabel.setPreferredSize(new Dimension(24,24));
|
iconLabel.setPreferredSize(new Dimension(24,24));
|
||||||
iconLabel.setBorder(FontsAndBorders.BLACK_BORDER);
|
iconLabel.setBorder(FontsAndBorders.BLACK_BORDER);
|
||||||
leftPanel.add(iconLabel,BorderLayout.NORTH);
|
leftPanel.add(iconLabel,BorderLayout.NORTH);
|
||||||
|
|
||||||
permanentsViewer=new ImagePermanentsViewer(controller, opponent);
|
permanentsViewer=new ImagePermanentsViewer(controller, opponent);
|
||||||
add(permanentsViewer,BorderLayout.CENTER);
|
add(permanentsViewer,BorderLayout.CENTER);
|
||||||
|
|
||||||
permanentFilter=new PermanentFilter(this,controller);
|
permanentFilter=new PermanentFilter(this,controller);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void update() {
|
public void update() {
|
||||||
|
permanentsViewer.viewPermanents(permanentFilter.getPermanents(viewerInfo,opponent));
|
||||||
permanentsViewer.viewPermanents(permanentFilter.getPermanents(viewerInfo,opponent));
|
}
|
||||||
}
|
|
||||||
|
@Override
|
||||||
@Override
|
public void showValidChoices(final Set<Object> validChoices) {
|
||||||
public void showValidChoices(final Set<Object> validChoices) {
|
permanentsViewer.showValidChoices(validChoices);
|
||||||
|
}
|
||||||
permanentsViewer.showValidChoices(validChoices);
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -14,206 +14,206 @@ import java.util.Set;
|
||||||
|
|
||||||
public class ImagePermanentsViewer extends JPanel {
|
public class ImagePermanentsViewer extends JPanel {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
private static final int POSITION_SPACING = 60;
|
private static final int POSITION_SPACING = 60;
|
||||||
private static final int HORIZONTAL_SPACING = 40;
|
private static final int HORIZONTAL_SPACING = 40;
|
||||||
private static final int VERTICAL_SPACING = 30;
|
private static final int VERTICAL_SPACING = 30;
|
||||||
private static final float CARD_WIDTH = (float) CardImagesProvider.CARD_WIDTH;
|
private static final float CARD_WIDTH = (float) CardImagesProvider.CARD_WIDTH;
|
||||||
private static final float CARD_HEIGHT = (float) CardImagesProvider.CARD_HEIGHT;
|
private static final float CARD_HEIGHT = (float) CardImagesProvider.CARD_HEIGHT;
|
||||||
private static final float CARD_ASPECT_RATIO = CARD_WIDTH / CARD_HEIGHT;
|
private static final float CARD_ASPECT_RATIO = CARD_WIDTH / CARD_HEIGHT;
|
||||||
|
|
||||||
private final GameController controller;
|
private final GameController controller;
|
||||||
private final boolean isTop;
|
private final boolean isTop;
|
||||||
|
|
||||||
private List<ImagePermanentViewer> viewers;
|
private List<ImagePermanentViewer> viewers;
|
||||||
private Set<Object> validChoices;
|
private Set<Object> validChoices;
|
||||||
|
|
||||||
public ImagePermanentsViewer(final GameController controller) {
|
public ImagePermanentsViewer(final GameController controller) {
|
||||||
this(controller, false);
|
this(controller, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ImagePermanentsViewer(final GameController controller, final boolean isTop) {
|
public ImagePermanentsViewer(final GameController controller, final boolean isTop) {
|
||||||
this.controller = controller;
|
this.controller = controller;
|
||||||
this.isTop = isTop;
|
this.isTop = isTop;
|
||||||
|
|
||||||
setLayout(null);
|
setLayout(null);
|
||||||
setOpaque(false);
|
setOpaque(false);
|
||||||
|
|
||||||
viewers=Collections.emptyList();
|
viewers=Collections.emptyList();
|
||||||
validChoices=Collections.emptySet();
|
validChoices=Collections.emptySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int divideIntoRows(final List<ImagePermanentViewer> cards, final int maxCardsPerRow, final int startingRow) {
|
private static int divideIntoRows(final List<ImagePermanentViewer> cards, final int maxCardsPerRow, final int startingRow) {
|
||||||
int numCardsThisRow = 0;
|
int numCardsThisRow = 0;
|
||||||
int currentRow = startingRow;
|
int currentRow = startingRow;
|
||||||
|
|
||||||
for(ImagePermanentViewer card : cards) {
|
for(ImagePermanentViewer card : cards) {
|
||||||
if(numCardsThisRow + 1 > maxCardsPerRow) {
|
if(numCardsThisRow + 1 > maxCardsPerRow) {
|
||||||
// goto next row
|
// goto next row
|
||||||
currentRow++;
|
currentRow++;
|
||||||
numCardsThisRow = 0;
|
numCardsThisRow = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
numCardsThisRow++;
|
numCardsThisRow++;
|
||||||
card.setLogicalRow(currentRow);
|
card.setLogicalRow(currentRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
return currentRow;
|
return currentRow;
|
||||||
}
|
}
|
||||||
|
|
||||||
private int divideAllIntoRows(final List<ImagePermanentViewer> creatures, final List<ImagePermanentViewer> nonCreatures, final int maxCardsPerRow) {
|
private int divideAllIntoRows(final List<ImagePermanentViewer> creatures, final List<ImagePermanentViewer> nonCreatures, final int maxCardsPerRow) {
|
||||||
final List<ImagePermanentViewer> firstCards = (isTop) ? nonCreatures : creatures;
|
final List<ImagePermanentViewer> firstCards = (isTop) ? nonCreatures : creatures;
|
||||||
final List<ImagePermanentViewer> secondCards = (isTop) ? creatures : nonCreatures;
|
final List<ImagePermanentViewer> secondCards = (isTop) ? creatures : nonCreatures;
|
||||||
|
|
||||||
int currentRow = divideIntoRows(firstCards, maxCardsPerRow, 1);
|
int currentRow = divideIntoRows(firstCards, maxCardsPerRow, 1);
|
||||||
if(firstCards.size() > 0) { // creatures go in separate row from others
|
if(firstCards.size() > 0) { // creatures go in separate row from others
|
||||||
currentRow++;
|
currentRow++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return divideIntoRows(secondCards, maxCardsPerRow, currentRow);
|
return divideIntoRows(secondCards, maxCardsPerRow, currentRow);
|
||||||
}
|
}
|
||||||
|
|
||||||
private int calculateAndSetPositions(final List<ImagePermanentViewer> creatures, final List<ImagePermanentViewer> nonCreatures) {
|
private int calculateAndSetPositions(final List<ImagePermanentViewer> creatures, final List<ImagePermanentViewer> nonCreatures) {
|
||||||
int currentRow=1;
|
int currentRow=1;
|
||||||
int x=0;
|
int x=0;
|
||||||
int y=0;
|
int y=0;
|
||||||
int maxWidth=0;
|
int maxWidth=0;
|
||||||
int rowHeight=0;
|
int rowHeight=0;
|
||||||
|
|
||||||
List<ImagePermanentViewer> aViewers = new ArrayList<ImagePermanentViewer>();
|
List<ImagePermanentViewer> aViewers = new ArrayList<ImagePermanentViewer>();
|
||||||
if(isTop) {
|
if(isTop) {
|
||||||
aViewers.addAll(nonCreatures);
|
aViewers.addAll(nonCreatures);
|
||||||
aViewers.addAll(creatures);
|
aViewers.addAll(creatures);
|
||||||
} else {
|
} else {
|
||||||
aViewers.addAll(creatures);
|
aViewers.addAll(creatures);
|
||||||
aViewers.addAll(nonCreatures);
|
aViewers.addAll(nonCreatures);
|
||||||
}
|
}
|
||||||
|
|
||||||
int prevPosition=aViewers.get(0).getPosition();
|
int prevPosition=aViewers.get(0).getPosition();
|
||||||
|
|
||||||
for (final ImagePermanentViewer viewer : aViewers) {
|
for (final ImagePermanentViewer viewer : aViewers) {
|
||||||
if (currentRow!=viewer.getLogicalRow()) {
|
if (currentRow!=viewer.getLogicalRow()) {
|
||||||
currentRow++;
|
currentRow++;
|
||||||
x=0;
|
x=0;
|
||||||
y+=VERTICAL_SPACING+rowHeight;
|
y+=VERTICAL_SPACING+rowHeight;
|
||||||
}
|
}
|
||||||
if (viewer.getPosition()!=prevPosition) {
|
if (viewer.getPosition()!=prevPosition) {
|
||||||
prevPosition=viewer.getPosition();
|
prevPosition=viewer.getPosition();
|
||||||
if (x>0) {
|
if (x>0) {
|
||||||
x+=POSITION_SPACING;
|
x+=POSITION_SPACING;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
viewer.setLogicalPosition(new Point(x,y));
|
viewer.setLogicalPosition(new Point(x,y));
|
||||||
final Dimension logicalSize=viewer.getLogicalSize();
|
final Dimension logicalSize=viewer.getLogicalSize();
|
||||||
x+=logicalSize.width;
|
x+=logicalSize.width;
|
||||||
maxWidth=Math.max(maxWidth,x);
|
maxWidth=Math.max(maxWidth,x);
|
||||||
x+=HORIZONTAL_SPACING;
|
x+=HORIZONTAL_SPACING;
|
||||||
rowHeight=Math.max(rowHeight,logicalSize.height);
|
rowHeight=Math.max(rowHeight,logicalSize.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
final int maxHeight=y+rowHeight;
|
final int maxHeight=y+rowHeight;
|
||||||
final int width=getWidth();
|
final int width=getWidth();
|
||||||
final int height=getHeight();
|
final int height=getHeight();
|
||||||
int scaleMult=width;
|
int scaleMult=width;
|
||||||
int scaleDiv=maxWidth;
|
int scaleDiv=maxWidth;
|
||||||
if ((maxHeight*scaleMult)/scaleDiv>height) {
|
if ((maxHeight*scaleMult)/scaleDiv>height) {
|
||||||
scaleMult=height;
|
scaleMult=height;
|
||||||
scaleDiv=maxHeight;
|
scaleDiv=maxHeight;
|
||||||
}
|
}
|
||||||
if (scaleMult>scaleDiv/2) {
|
if (scaleMult>scaleDiv/2) {
|
||||||
scaleMult=scaleDiv/2;
|
scaleMult=scaleDiv/2;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (final ImagePermanentViewer viewer : aViewers) {
|
for (final ImagePermanentViewer viewer : aViewers) {
|
||||||
final Point point=viewer.getLogicalPosition();
|
final Point point=viewer.getLogicalPosition();
|
||||||
viewer.setLocation((point.x*scaleMult)/scaleDiv,(point.y*scaleMult)/scaleDiv);
|
viewer.setLocation((point.x*scaleMult)/scaleDiv,(point.y*scaleMult)/scaleDiv);
|
||||||
final Dimension size=viewer.getLogicalSize();
|
final Dimension size=viewer.getLogicalSize();
|
||||||
viewer.setSize((size.width*scaleMult)/scaleDiv,(size.height*scaleMult)/scaleDiv);
|
viewer.setSize((size.width*scaleMult)/scaleDiv,(size.height*scaleMult)/scaleDiv);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (1000*scaleMult)/scaleDiv;
|
return (1000*scaleMult)/scaleDiv;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void calculateOptimalPositions(final List<ImagePermanentViewer> creatures, final List<ImagePermanentViewer> nonCreatures) {
|
private void calculateOptimalPositions(final List<ImagePermanentViewer> creatures, final List<ImagePermanentViewer> nonCreatures) {
|
||||||
final float screenWidth = (float) getWidth();
|
final float screenWidth = (float) getWidth();
|
||||||
final float screenHeight = (float) getHeight();
|
final float screenHeight = (float) getHeight();
|
||||||
final int numCards = creatures.size() + nonCreatures.size();
|
final int numCards = creatures.size() + nonCreatures.size();
|
||||||
|
|
||||||
if(numCards > 0 && screenWidth > 0 && screenHeight > 0) { // ignore cases where drawing doesn't matter
|
if(numCards > 0 && screenWidth > 0 && screenHeight > 0) { // ignore cases where drawing doesn't matter
|
||||||
int r;
|
int r;
|
||||||
int maxCardsForBestNumRow = 1;
|
int maxCardsForBestNumRow = 1;
|
||||||
float largestScaledCardSize = 0;
|
float largestScaledCardSize = 0;
|
||||||
|
|
||||||
// approximate number of rows needed to contain all the cards
|
// approximate number of rows needed to contain all the cards
|
||||||
for(r = (creatures.size() == 0 || nonCreatures.size() == 0) ? 1 : 2; r < numCards; r++) {
|
for(r = (creatures.size() == 0 || nonCreatures.size() == 0) ? 1 : 2; r < numCards; r++) {
|
||||||
float numCardsPerRow = (float) Math.ceil((float) numCards / r); // avoid lost of precision
|
float numCardsPerRow = (float) Math.ceil((float) numCards / r); // avoid lost of precision
|
||||||
|
|
||||||
// max width and height for a card using this number of rows
|
// max width and height for a card using this number of rows
|
||||||
float scaledCardHeight = screenHeight / r;
|
float scaledCardHeight = screenHeight / r;
|
||||||
float scaledCardWidth = screenWidth / numCardsPerRow;
|
float scaledCardWidth = screenWidth / numCardsPerRow;
|
||||||
|
|
||||||
// change width or height to maintain aspect ratio
|
// change width or height to maintain aspect ratio
|
||||||
if (scaledCardWidth / scaledCardHeight > CARD_ASPECT_RATIO) {
|
if (scaledCardWidth / scaledCardHeight > CARD_ASPECT_RATIO) {
|
||||||
// height is limiting factor on size of scaled card
|
// height is limiting factor on size of scaled card
|
||||||
scaledCardWidth = (scaledCardHeight / CARD_HEIGHT) * CARD_WIDTH;
|
scaledCardWidth = (scaledCardHeight / CARD_HEIGHT) * CARD_WIDTH;
|
||||||
} else {
|
} else {
|
||||||
// width is limiting factor on size of scaled card
|
// width is limiting factor on size of scaled card
|
||||||
scaledCardHeight = (scaledCardWidth / CARD_WIDTH) * CARD_HEIGHT;;
|
scaledCardHeight = (scaledCardWidth / CARD_WIDTH) * CARD_HEIGHT;;
|
||||||
}
|
}
|
||||||
numCardsPerRow = (float) Math.ceil(screenWidth / scaledCardWidth); // scaled -> more cards can fit per row
|
numCardsPerRow = (float) Math.ceil(screenWidth / scaledCardWidth); // scaled -> more cards can fit per row
|
||||||
|
|
||||||
// set best possible
|
// set best possible
|
||||||
final float scaledCardSize = scaledCardWidth * scaledCardHeight;
|
final float scaledCardSize = scaledCardWidth * scaledCardHeight;
|
||||||
if(scaledCardSize > largestScaledCardSize) {
|
if(scaledCardSize > largestScaledCardSize) {
|
||||||
largestScaledCardSize = scaledCardSize;
|
largestScaledCardSize = scaledCardSize;
|
||||||
maxCardsForBestNumRow = (int) numCardsPerRow;
|
maxCardsForBestNumRow = (int) numCardsPerRow;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
divideAllIntoRows(creatures, nonCreatures, maxCardsForBestNumRow);
|
divideAllIntoRows(creatures, nonCreatures, maxCardsForBestNumRow);
|
||||||
calculateAndSetPositions(creatures, nonCreatures);
|
calculateAndSetPositions(creatures, nonCreatures);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void viewPermanents(final Collection<PermanentViewerInfo> permanentInfos) {
|
public void viewPermanents(final Collection<PermanentViewerInfo> permanentInfos) {
|
||||||
final List<ImagePermanentViewer> creatures = new ArrayList<ImagePermanentViewer>();
|
final List<ImagePermanentViewer> creatures = new ArrayList<ImagePermanentViewer>();
|
||||||
final List<ImagePermanentViewer> nonCreatures = new ArrayList<ImagePermanentViewer>();
|
final List<ImagePermanentViewer> nonCreatures = new ArrayList<ImagePermanentViewer>();
|
||||||
final List<ImagePermanentViewer> newViewers = new ArrayList<ImagePermanentViewer>();
|
final List<ImagePermanentViewer> newViewers = new ArrayList<ImagePermanentViewer>();
|
||||||
|
|
||||||
for (final PermanentViewerInfo permanentInfo : permanentInfos) {
|
for (final PermanentViewerInfo permanentInfo : permanentInfos) {
|
||||||
ImagePermanentViewer perm = new ImagePermanentViewer(this,permanentInfo);
|
ImagePermanentViewer perm = new ImagePermanentViewer(this,permanentInfo);
|
||||||
if(permanentInfo.creature) {
|
if(permanentInfo.creature) {
|
||||||
creatures.add(perm);
|
creatures.add(perm);
|
||||||
} else {
|
} else {
|
||||||
nonCreatures.add(perm);
|
nonCreatures.add(perm);
|
||||||
}
|
}
|
||||||
newViewers.add(perm); // permanentInfos has a specific order
|
newViewers.add(perm); // permanentInfos has a specific order
|
||||||
}
|
}
|
||||||
|
|
||||||
calculateOptimalPositions(creatures, nonCreatures);
|
calculateOptimalPositions(creatures, nonCreatures);
|
||||||
|
|
||||||
removeAll();
|
removeAll();
|
||||||
for (final ImagePermanentViewer viewer : newViewers) {
|
for (final ImagePermanentViewer viewer : newViewers) {
|
||||||
add(viewer);
|
add(viewer);
|
||||||
}
|
}
|
||||||
viewers=newViewers;
|
viewers=newViewers;
|
||||||
revalidate();
|
revalidate();
|
||||||
repaint();
|
repaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
public GameController getController() {
|
public GameController getController() {
|
||||||
return controller;
|
return controller;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showValidChoices(final Set<Object> aValidChoices) {
|
public void showValidChoices(final Set<Object> aValidChoices) {
|
||||||
this.validChoices=aValidChoices;
|
this.validChoices=aValidChoices;
|
||||||
for (final ImagePermanentViewer viewer : viewers) {
|
for (final ImagePermanentViewer viewer : viewers) {
|
||||||
viewer.repaint();
|
viewer.repaint();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isValidChoice(final PermanentViewerInfo permanentInfo) {
|
public boolean isValidChoice(final PermanentViewerInfo permanentInfo) {
|
||||||
return validChoices.contains(permanentInfo.permanent);
|
return validChoices.contains(permanentInfo.permanent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue