/*
* Copyright (c) 2014 tabletoptool.com team.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* rptools.com team - initial implementation
* tabletoptool.com team - further development
*/
package com.t3.swing;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager2;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
*/
public class PositionalLayout implements LayoutManager2 {
public enum Position {
NW, N, NE,
W, CENTER, E,
SW, S, SE
}
private int padding = 0;
private Map<Component, Position> compPositionMap = new HashMap<Component, Position>();
public PositionalLayout() {}
public PositionalLayout(int edgePadding) {
padding = edgePadding;
}
@Override
public void addLayoutComponent(Component comp,Object constraints){
if (! (constraints instanceof Position)) {
return;
}
compPositionMap.put(comp, (Position) constraints);
}
@Override
public void addLayoutComponent(String name, Component comp) {
throw new IllegalArgumentException("Use add(comp, Position)");
}
@Override
public float getLayoutAlignmentX(Container target){
return 0;
}
@Override
public float getLayoutAlignmentY(Container target){
return 0;
}
@Override
public void invalidateLayout(Container target) {
// Nothing to do right now
}
@Override
public void layoutContainer(Container parent) {
Dimension size = parent.getSize();
Component[] compArray = parent.getComponents();
for (Component comp : compArray) {
Position pos = compPositionMap.get(comp);
Dimension compSize = comp.getSize();
int x = 0;
int y = 0;
switch(pos) {
case NW: {x = padding; y = padding; break;}
case N: {x = center(size.width, compSize.width); y = padding; break;}
case NE: {x = size.width - compSize.width - padding; y = padding; break;}
case W: {x = padding; y = center(size.height, compSize.height); break;}
case E: {x = size.width - compSize.width - padding; y = center(size.height, compSize.height); break;}
case SW: {x = padding; y = size.height - compSize.height - padding; break;}
case S: {x = center(size.width, compSize.width); y = size.height - compSize.height - padding; break;}
case SE: {x = size.width - compSize.width - padding; y = size.height - compSize.height - padding; break;}
case CENTER: {
x = 0;
y = 0;
// Fill available space
comp.setSize(size);
}
}
comp.setLocation(x, y);
}
}
private int center (int outsideWidth, int insideWidth) {
return (outsideWidth - insideWidth) / 2;
}
@Override
public Dimension maximumLayoutSize(Container target){
return preferredLayoutSize(target);
}
@Override
public Dimension minimumLayoutSize(Container parent) {
return preferredLayoutSize(parent);
}
@Override
public Dimension preferredLayoutSize(Container parent) {
return new Dimension(0,0);
}
@Override
public void removeLayoutComponent(Component comp) {
compPositionMap.remove(comp);
}
public static void main (String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new PositionalPanel();
panel.add(createButton("NW"), Position.NW);
panel.add(createButton("N"), Position.N);
panel.add(createButton("NE"), Position.NE);
panel.add(createButton("W"), Position.W);
panel.add(createButton("E"), Position.E);
panel.add(createButton("SW"), Position.SW);
panel.add(createButton("S"), Position.S);
panel.add(createButton("SE"), Position.SE);
panel.add(createButton("CENTER"), Position.CENTER);
frame.setContentPane(panel);
frame.setSize(200, 200);
frame.setVisible(true);
}
private static JButton createButton(String label) {
JButton button = new JButton (label);
button.setSize(button.getMinimumSize());
return button;
}
}