Permanent scrolling fix on ViewSettings, plus a little PMD.

This commit is contained in:
Doublestrike
2012-02-13 07:44:24 +00:00
parent b10d44b2e5
commit 0bb4385f6c

View File

@@ -1,14 +1,10 @@
package forge.view.home; package forge.view.home;
import java.awt.Color; import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font; import java.awt.Font;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Image; import java.awt.Image;
import java.awt.Insets;
import java.awt.event.FocusAdapter; import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent; import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter; import java.awt.event.KeyAdapter;
@@ -63,24 +59,23 @@ public class ViewSettings extends JPanel {
private final JCheckBox cbAnte, cbScaleLarger, cbDevMode, cbRemoveSmall, cbRemoveArtifacts, private final JCheckBox cbAnte, cbScaleLarger, cbDevMode, cbRemoveSmall, cbRemoveArtifacts,
cbUploadDraft, cbStackLand, cbRandomFoil, cbTextMana, cbSingletons; cbUploadDraft, cbStackLand, cbRandomFoil, cbTextMana, cbSingletons;
//private final JRadioButton radCardTiny, radCardSmaller, radCardSmall,
// radCardMedium, radCardLarge, radCardHuge;
private final JPanel pnlTabber, pnlPrefs, pnlAvatars, tabPrefs, tabAvatars; private final JPanel pnlTabber, pnlPrefs, pnlAvatars, tabPrefs, tabAvatars;
private final JScrollPane scrContent; private final JScrollPane scrContent;
private String sectionConstraints, regularConstraints, tabberConstraints;
private AvatarLabel avatarHuman, avatarAI; private AvatarLabel avatarHuman, avatarAI;
private List<AvatarLabel> lstAvatars; private List<AvatarLabel> lstAvatars;
/** /**
* *
* Assembles swing components for "Settings" mode menu. * Assembles swing components for "Settings" mode menu.
* @param v0 &emsp; HomeTopLevel * @param view0 &emsp; HomeTopLevel
*/ */
public ViewSettings(final HomeTopLevel v0) { public ViewSettings(final HomeTopLevel view0) {
// Display // Display
super(); super();
this.setOpaque(false); this.setOpaque(false);
this.parentView = v0; this.parentView = view0;
// Final component inits: JPanels // Final component inits: JPanels
pnlTabber = new JPanel(); pnlTabber = new JPanel();
@@ -95,14 +90,6 @@ public class ViewSettings extends JPanel {
tabPrefs = new SubTab("Preferences"); tabPrefs = new SubTab("Preferences");
tabAvatars = new SubTab("Avatars"); tabAvatars = new SubTab("Avatars");
// Final component inits: Radio buttons and check boxes
/*radCardTiny = new CardSizeRadio("Tiny");
radCardSmaller = new CardSizeRadio("Smaller");
radCardSmall = new CardSizeRadio("Small");
radCardMedium = new CardSizeRadio("Medium");
radCardLarge = new CardSizeRadio("Large");
radCardHuge = new CardSizeRadio("Huge");*/
cbRemoveSmall = new OptionsCheckBox("Remove Small Creatures"); cbRemoveSmall = new OptionsCheckBox("Remove Small Creatures");
cbSingletons = new OptionsCheckBox("Singleton Mode"); cbSingletons = new OptionsCheckBox("Singleton Mode");
cbRemoveArtifacts = new OptionsCheckBox("Remove Artifacts"); cbRemoveArtifacts = new OptionsCheckBox("Remove Artifacts");
@@ -117,7 +104,7 @@ public class ViewSettings extends JPanel {
// Final component inits: Various // Final component inits: Various
scrContent = new JScrollPane( scrContent = new JScrollPane(
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrContent.getViewport().setOpaque(false); scrContent.getViewport().setOpaque(false);
scrContent.setBorder(null); scrContent.setBorder(null);
scrContent.setOpaque(false); scrContent.setOpaque(false);
@@ -149,20 +136,20 @@ public class ViewSettings extends JPanel {
tabPrefs.setToolTipText("Global preference options"); tabPrefs.setToolTipText("Global preference options");
tabAvatars.setToolTipText("Human and AI avatar select"); tabAvatars.setToolTipText("Human and AI avatar select");
final String constraints = "w 50%!, h 20px!"; tabberConstraints = "w 50%!, h 20px!";
pnlTabber.setOpaque(false); pnlTabber.setOpaque(false);
pnlTabber.setLayout(new MigLayout("insets 0, gap 0, align center")); pnlTabber.setLayout(new MigLayout("insets 0, gap 0, align center"));
pnlTabber.add(tabPrefs, constraints); pnlTabber.add(tabPrefs, tabberConstraints);
pnlTabber.add(tabAvatars, constraints); pnlTabber.add(tabAvatars, tabberConstraints);
} }
private void populatePrefs() { private void populatePrefs() {
pnlPrefs.setLayout(new MigLayout("insets 0, gap 0, wrap 2")); pnlPrefs.setLayout(new MigLayout("insets 0, gap 0, wrap 2"));
// Spacing between components is defined here. // Spacing between components is defined here.
final String sectionConstraints = "w 80%!, h 42px!, gap 10% 0 10px 10px, span 2 1"; sectionConstraints = "w 80%!, h 42px!, gap 10% 0 10px 10px, span 2 1";
final String regularConstraints = "w 80%!, h 22px!, gap 10% 0 0 10px, span 2 1"; regularConstraints = "w 80%!, h 22px!, gap 10% 0 0 10px, span 2 1";
// Deck building options // Deck building options
pnlPrefs.add(new SectionLabel("Deck Building Options"), sectionConstraints + ", gaptop 2%"); pnlPrefs.add(new SectionLabel("Deck Building Options"), sectionConstraints + ", gaptop 2%");
@@ -213,33 +200,17 @@ public class ViewSettings extends JPanel {
pnlPrefs.add(cbTextMana, regularConstraints); pnlPrefs.add(cbTextMana, regularConstraints);
pnlPrefs.add(new NoteLabel("Overlays each card with basic card-specific information."), regularConstraints); pnlPrefs.add(new NoteLabel("Overlays each card with basic card-specific information."), regularConstraints);
// Card size radio buttons
/*ButtonGroup group = new ButtonGroup();
group.add(radCardTiny);
group.add(radCardSmaller);
group.add(radCardSmall);
group.add(radCardMedium);
group.add(radCardLarge);
group.add(radCardHuge);
String constraints = "gapleft 10%, wrap";
pnlPrefs.add(radCardTiny, constraints);
pnlPrefs.add(radCardSmaller, constraints);
pnlPrefs.add(radCardSmall, constraints);
pnlPrefs.add(radCardMedium, constraints);
pnlPrefs.add(radCardLarge, constraints);
pnlPrefs.add(radCardHuge, constraints + ", gapbottom 2%");*/
// Keyboard shortcuts // Keyboard shortcuts
final JLabel lblShortcuts = new SectionLabel("Keyboard Shortcuts"); final JLabel lblShortcuts = new SectionLabel("Keyboard Shortcuts");
pnlPrefs.add(lblShortcuts, sectionConstraints); pnlPrefs.add(lblShortcuts, sectionConstraints);
List<Shortcut> shortcuts = ((GuiTopLevel) AllZone.getDisplay()).getController().getShortcuts(); final List<Shortcut> shortcuts = ((GuiTopLevel) AllZone.getDisplay()).getController().getShortcuts();
FLabel lblTemp; FLabel lblTemp;
for (Shortcut s : shortcuts) { KeyboardShortcutField ksf;
for (final Shortcut s : shortcuts) {
lblTemp = new FLabel.Builder().text(s.getDescription()).build(); lblTemp = new FLabel.Builder().text(s.getDescription()).build();
KeyboardShortcutField ksf = new KeyboardShortcutField(s); ksf = new KeyboardShortcutField(s);
pnlPrefs.add(lblTemp, "w 40%!, h 22px!, gap 10%! 0 0 1%"); pnlPrefs.add(lblTemp, "w 40%!, h 22px!, gap 10%! 0 0 1%");
pnlPrefs.add(ksf, "w 25%!"); pnlPrefs.add(ksf, "w 25%!");
} }
@@ -250,34 +221,26 @@ public class ViewSettings extends JPanel {
} // End populatePrefs() } // End populatePrefs()
private void populateAvatars() { private void populateAvatars() {
final JPanel pnlTitle = new JPanel(new MigLayout("insets 0, gap 0 0 20px 20px, wrap, alignx center"));
final JLabel lblTitle = new SectionLabel("Avatar Selection"); final JLabel lblTitle = new SectionLabel("Avatar Selection");
final JLabel lblNote1 = new NoteLabel("Click on an image to set that avatar for a player or AI."); final JLabel lblNote1 = new NoteLabel("Click on an image to set that avatar for a player or AI.");
final JLabel lblNote2 = new NoteLabel("Click multiple times to cycle through available players or AI."); final JLabel lblNote2 = new NoteLabel("Click multiple times to cycle.");
lblTitle.setHorizontalAlignment(SwingConstants.CENTER); lblTitle.setHorizontalAlignment(SwingConstants.CENTER);
lblNote1.setHorizontalAlignment(SwingConstants.CENTER); lblNote1.setHorizontalAlignment(SwingConstants.CENTER);
lblNote2.setHorizontalAlignment(SwingConstants.CENTER); lblNote2.setHorizontalAlignment(SwingConstants.CENTER);
pnlTitle.setOpaque(false); pnlAvatars.setLayout(new MigLayout("insets 0, gap 0, align center, wrap 3"));
pnlTitle.add(lblTitle, "w 50%!"); pnlAvatars.add(lblTitle, "w 330px!, span 3 1");
pnlTitle.add(lblNote1, "w 50%!"); pnlAvatars.add(lblNote1, "w 330px!, span 3 1");
pnlTitle.add(lblNote2, "w 50%!"); pnlAvatars.add(lblNote2, "w 330px!, span 3 1");
final JPanel pnlPics = new JPanel(new ModifiedFlowLayout(1, 30, 30));
pnlPics.setOpaque(false);
pnlAvatars.setLayout(new ModifiedFlowLayout(1, 30, 30));
lstAvatars = new ArrayList<AvatarLabel>(); lstAvatars = new ArrayList<AvatarLabel>();
int counter = 0; int counter = 0;
for (Image i : FSkin.getAvatars().values()) { for (final Image i : FSkin.getAvatars().values()) {
lstAvatars.add(new AvatarLabel(i, counter++)); lstAvatars.add(new AvatarLabel(i, counter++));
pnlAvatars.add(lstAvatars.get(lstAvatars.size() - 1)); pnlAvatars.add(lstAvatars.get(lstAvatars.size() - 1), "gap 5px 5px 5px 5px");
} }
final String[] indexes = Singletons.getModel().getPreferences().getPref(FPref.UI_AVATARS).split(","); final String[] indexes = Singletons.getModel().getPreferences().getPref(FPref.UI_AVATARS).split(",");
int humanIndex = Integer.parseInt(indexes[0]); int humanIndex = Integer.parseInt(indexes[0]);
int aiIndex = Integer.parseInt(indexes[1]); int aiIndex = Integer.parseInt(indexes[1]);
@@ -304,25 +267,25 @@ public class ViewSettings extends JPanel {
} }
/** Surprisingly complicated - be careful when modifying! */ /** Surprisingly complicated - be careful when modifying! */
private void cycleOwner(final AvatarLabel a0) { private void cycleOwner(final AvatarLabel lbl0) {
if (a0.getOwner() == null) { if (lbl0.getOwner() == null) {
a0.setOwner(PlayerType.HUMAN); lbl0.setOwner(PlayerType.HUMAN);
a0.repaint(); lbl0.repaint();
if (avatarHuman != null) { if (avatarHuman != null) {
avatarHuman.setOwner(null); avatarHuman.setOwner(null);
avatarHuman.repaint(); avatarHuman.repaint();
} }
avatarHuman = a0; avatarHuman = lbl0;
} }
else if (a0.getOwner() == PlayerType.HUMAN) { else if (lbl0.getOwner() == PlayerType.HUMAN) {
// Re-assign avatar to human // Re-assign avatar to human
avatarHuman.setOwner(null); avatarHuman.setOwner(null);
avatarHuman.repaint(); avatarHuman.repaint();
for (int i = 0; i < lstAvatars.size(); i++) { for (int i = 0; i < lstAvatars.size(); i++) {
if (lstAvatars.get(i) != a0) { if (lstAvatars.get(i) != lbl0) {
avatarHuman = lstAvatars.get(i); avatarHuman = lstAvatars.get(i);
avatarHuman.setOwner(PlayerType.HUMAN); avatarHuman.setOwner(PlayerType.HUMAN);
avatarHuman.repaint(); avatarHuman.repaint();
@@ -331,19 +294,19 @@ public class ViewSettings extends JPanel {
} }
// Assign computer // Assign computer
a0.setOwner(PlayerType.COMPUTER); lbl0.setOwner(PlayerType.COMPUTER);
a0.repaint(); lbl0.repaint();
if (avatarAI != null) { if (avatarAI != null) {
avatarAI.setOwner(null); avatarAI.setOwner(null);
avatarAI.repaint(); avatarAI.repaint();
} }
avatarAI = a0; avatarAI = lbl0;
} }
else { else {
a0.setOwner(null); lbl0.setOwner(null);
a0.repaint(); lbl0.repaint();
// Re-assign avatar to computer // Re-assign avatar to computer
avatarAI.setOwner(null); avatarAI.setOwner(null);
@@ -376,63 +339,21 @@ public class ViewSettings extends JPanel {
this.addMouseListener(new MouseAdapter() { this.addMouseListener(new MouseAdapter() {
@Override @Override
public void mouseEntered(MouseEvent e) { public void mouseEntered(final MouseEvent evt) {
setOpaque(true); setOpaque(true);
} }
@Override @Override
public void mouseExited(MouseEvent e) { public void mouseExited(final MouseEvent evt) {
setOpaque(false); setOpaque(false);
} }
}); });
} }
} }
/** Consolidates checkbox styling in one place. */
/* private class OptionsRadio extends JRadioButton {
public OptionsRadio(final String txt0) {
super();
setText(txt0);
setFont(FSkin.getBoldFont(12));
setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
setBackground(FSkin.getColor(FSkin.Colors.CLR_HOVER));
setOpaque(false);
this.addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e) {
setOpaque(true);
}
@Override
public void mouseExited(MouseEvent e) {
setOpaque(false);
}
});
}
}
/*private class CardSizeRadio extends OptionsRadio {
public CardSizeRadio(String txt0) {
super(txt0);
if (Singletons.getModel().getPreferences().getPref(FPref.UI_CARD_SIZE)
.equalsIgnoreCase(txt0)) {
setSelected(true);
}
this.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent arg0) {
try { control.updateCardSize(CardSizeRadio.this); }
catch (Exception e) { e.printStackTrace(); }
}
});
}
}*/
/** Consolidates section title label styling in one place. */ /** Consolidates section title label styling in one place. */
private class SectionLabel extends JLabel { private class SectionLabel extends JLabel {
public SectionLabel(String txt0) { public SectionLabel(final String txt0) {
super(txt0); super(txt0);
setBorder(new MatteBorder(0, 0, 1, 0, FSkin.getColor(FSkin.Colors.CLR_BORDERS))); setBorder(new MatteBorder(0, 0, 1, 0, FSkin.getColor(FSkin.Colors.CLR_BORDERS)));
setHorizontalAlignment(SwingConstants.CENTER); setHorizontalAlignment(SwingConstants.CENTER);
@@ -443,7 +364,7 @@ public class ViewSettings extends JPanel {
/** Consolidates notation label styling in one place. */ /** Consolidates notation label styling in one place. */
private class NoteLabel extends JLabel { private class NoteLabel extends JLabel {
public NoteLabel(String txt0) { public NoteLabel(final String txt0) {
super(txt0); super(txt0);
setFont(FSkin.getItalicFont(12)); setFont(FSkin.getItalicFont(12));
setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT));
@@ -456,8 +377,9 @@ public class ViewSettings extends JPanel {
private PlayerType owner; private PlayerType owner;
private boolean hovered = false; private boolean hovered = false;
public AvatarLabel(Image i0, int index0) { public AvatarLabel(final Image img0, final int index0) {
img = i0; super();
img = img0;
index = index0; index = index0;
setMaximumSize(new Dimension(100, 120)); setMaximumSize(new Dimension(100, 120));
setMinimumSize(new Dimension(100, 120)); setMinimumSize(new Dimension(100, 120));
@@ -465,18 +387,18 @@ public class ViewSettings extends JPanel {
this.addMouseListener(new MouseAdapter() { this.addMouseListener(new MouseAdapter() {
@Override @Override
public void mouseEntered(MouseEvent e) { hovered = true; repaint(); } public void mouseEntered(final MouseEvent evt) { hovered = true; repaint(); }
@Override @Override
public void mouseExited(MouseEvent e) { hovered = false; repaint(); } public void mouseExited(final MouseEvent evt) { hovered = false; repaint(); }
@Override @Override
public void mouseClicked(MouseEvent e) { cycleOwner(AvatarLabel.this); repaint(); } public void mouseClicked(final MouseEvent evt) { cycleOwner(AvatarLabel.this); repaint(); }
}); });
} }
public void setOwner(PlayerType p0) { public void setOwner(final PlayerType player0) {
this.owner = p0; this.owner = player0;
} }
public PlayerType getOwner() { public PlayerType getOwner() {
@@ -487,19 +409,19 @@ public class ViewSettings extends JPanel {
return this.index; return this.index;
} }
protected void paintComponent(Graphics g) { protected void paintComponent(final Graphics graphics0) {
if (hovered) { if (hovered) {
g.setColor(FSkin.getColor(FSkin.Colors.CLR_HOVER)); graphics0.setColor(FSkin.getColor(FSkin.Colors.CLR_HOVER));
g.fillRect(0, 0, 100, 120); graphics0.fillRect(0, 0, 100, 120);
} }
g.drawImage(img, 0, 20, null); graphics0.drawImage(img, 0, 20, null);
if (owner == null) { return; } if (owner == null) { return; }
g.setColor(FSkin.getColor(FSkin.Colors.CLR_TEXT)); graphics0.setColor(FSkin.getColor(FSkin.Colors.CLR_TEXT));
g.drawRect(0, 0, 99, 119); graphics0.drawRect(0, 0, 99, 119);
g.setFont(FSkin.getBoldFont(14)); graphics0.setFont(FSkin.getBoldFont(14));
g.drawString(owner.toString(), 5, 15); graphics0.drawString(owner.toString(), 5, 15);
} }
} }
@@ -516,33 +438,33 @@ public class ViewSettings extends JPanel {
* the shortcut. Also, an action listener that handles translation of * the shortcut. Also, an action listener that handles translation of
* keycodes into characters and (dis)assembly of keycode stack. * keycodes into characters and (dis)assembly of keycode stack.
* *
* @param s0 &emsp; Shortcut object * @param shortcut0 &emsp; Shortcut object
*/ */
public KeyboardShortcutField(final Shortcut s0) { public KeyboardShortcutField(final Shortcut shortcut0) {
super(); super();
this.setEditable(false); this.setEditable(false);
this.setFont(FSkin.getFont(14)); this.setFont(FSkin.getFont(14));
this.setCodeString(Singletons.getModel().getPreferences().getPref(s0.getPrefKey())); this.setCodeString(Singletons.getModel().getPreferences().getPref(shortcut0.getPrefKey()));
this.addKeyListener(new KeyAdapter() { this.addKeyListener(new KeyAdapter() {
@Override @Override
public void keyPressed(final KeyEvent e) { public void keyPressed(final KeyEvent evt) {
KeyboardShortcuts.addKeyCode(e); KeyboardShortcuts.addKeyCode(evt);
} }
}); });
this.addFocusListener(new FocusAdapter() { this.addFocusListener(new FocusAdapter() {
@Override @Override
public void focusGained(final FocusEvent e) { public void focusGained(final FocusEvent evt) {
KeyboardShortcutField.this.setBackground(FSkin.getColor(FSkin.Colors.CLR_ACTIVE)); KeyboardShortcutField.this.setBackground(FSkin.getColor(FSkin.Colors.CLR_ACTIVE));
} }
@Override @Override
public void focusLost(final FocusEvent e) { public void focusLost(final FocusEvent evt) {
Singletons.getModel().getPreferences().setPref( Singletons.getModel().getPreferences().setPref(
s0.getPrefKey(), getCodeString()); shortcut0.getPrefKey(), getCodeString());
Singletons.getModel().getPreferences().save(); Singletons.getModel().getPreferences().save();
s0.attach(); shortcut0.attach();
KeyboardShortcutField.this.setBackground(Color.white); KeyboardShortcutField.this.setBackground(Color.white);
} }
}); });
@@ -553,22 +475,22 @@ public class ViewSettings extends JPanel {
* *
* @return String * @return String
*/ */
public String getCodeString() { public final String getCodeString() {
return this.codeString; return this.codeString;
} }
/** /**
* Sets the code string. * Sets the code string.
* *
* @param s0 * @param str0
* &emsp; The new code string (space delimited) * &emsp; The new code string (space delimited)
*/ */
public void setCodeString(final String s0) { public final void setCodeString(final String str0) {
if (s0.equals("null")) { if ("null".equals(str0)) {
return; return;
} }
this.codeString = s0.trim(); this.codeString = str0.trim();
final List<String> codes = new ArrayList<String>(Arrays.asList(this.codeString.split(" "))); final List<String> codes = new ArrayList<String>(Arrays.asList(this.codeString.split(" ")));
final List<String> displayText = new ArrayList<String>(); final List<String> displayText = new ArrayList<String>();
@@ -584,27 +506,27 @@ public class ViewSettings extends JPanel {
} }
/** @return {@link javax.swing.JPanel} */ /** @return {@link javax.swing.JPanel} */
public JPanel getPnlPrefs() { public final JPanel getPnlPrefs() {
return this.pnlPrefs; return this.pnlPrefs;
} }
/** @return {@link javax.swing.JPanel} */ /** @return {@link javax.swing.JPanel} */
public JPanel getPnlAvatars() { public final JPanel getPnlAvatars() {
return this.pnlAvatars; return this.pnlAvatars;
} }
/** @return {@link javax.swing.JList} */ /** @return {@link javax.swing.JList} */
public JList getLstChooseSkin() { public final JList getLstChooseSkin() {
return lstChooseSkin; return lstChooseSkin;
} }
/** @return {@link javax.swing.JCheckBox} */ /** @return {@link javax.swing.JCheckBox} */
public JCheckBox getCbRemoveSmall() { public final JCheckBox getCbRemoveSmall() {
return cbRemoveSmall; return cbRemoveSmall;
} }
/** @return {@link javax.swing.JCheckBox} */ /** @return {@link javax.swing.JCheckBox} */
public JCheckBox getCbSingletons() { public final JCheckBox getCbSingletons() {
return cbSingletons; return cbSingletons;
} }
@@ -679,121 +601,14 @@ public class ViewSettings extends JPanel {
} }
/** */ /** */
public void showPrefsTab() { public final void showPrefsTab() {
this.scrContent.getViewport().setView(pnlPrefs); this.scrContent.getViewport().setView(pnlPrefs);
control.updateTabber(tabPrefs); control.updateTabber(tabPrefs);
} }
/** */ /** */
public void showAvatarsTab() { public final void showAvatarsTab() {
this.scrContent.getViewport().setView(pnlAvatars); this.scrContent.getViewport().setView(pnlAvatars);
control.updateTabber(tabAvatars); control.updateTabber(tabAvatars);
} }
//============= HIGHLY EXPERIMENTAL Doublestrike 13-02-12
/**
* A modified version of FlowLayout that allows containers using this
* Layout to behave in a reasonable manner when placed inside a
* JScrollPane
* @author Babu Kalakrishnan
* Modifications by greearb and jzd
*/
public class ModifiedFlowLayout extends FlowLayout {
public ModifiedFlowLayout() {
super();
}
public ModifiedFlowLayout(int align) {
super(align);
}
public ModifiedFlowLayout(int align, int hgap, int vgap) {
super(align, hgap, vgap);
}
public Dimension minimumLayoutSize(Container target) {
// Size of largest component, so we can resize it in
// either direction with something like a split-pane.
return computeMinSize(target);
}
public Dimension preferredLayoutSize(Container target) {
return computeSize(target);
}
private Dimension computeSize(Container target) {
synchronized (target.getTreeLock()) {
int hgap = getHgap();
int vgap = getVgap();
int w = target.getWidth();
// Let this behave like a regular FlowLayout (single row)
// if the container hasn't been assigned any size yet
if (w == 0) {
w = Integer.MAX_VALUE;
}
Insets insets = target.getInsets();
if (insets == null){
insets = new Insets(0, 0, 0, 0);
}
int reqdWidth = 0;
int maxwidth = w - (insets.left + insets.right + hgap * 2);
int n = target.getComponentCount();
int x = 0;
int y = insets.top + vgap; // FlowLayout starts by adding vgap, so do that here too.
int rowHeight = 0;
for (int i = 0; i < n; i++) {
Component c = target.getComponent(i);
if (c.isVisible()) {
Dimension d = c.getPreferredSize();
if ((x == 0) || ((x + d.width) <= maxwidth)) {
// fits in current row.
if (x > 0) {
x += hgap;
}
x += d.width;
rowHeight = Math.max(rowHeight, d.height);
}
else {
// Start of new row
x = d.width;
y += vgap + rowHeight;
rowHeight = d.height;
}
reqdWidth = Math.max(reqdWidth, x);
}
}
y += rowHeight;
y += insets.bottom;
return new Dimension(reqdWidth+insets.left+insets.right, y);
}
}
private Dimension computeMinSize(Container target) {
synchronized (target.getTreeLock()) {
int minx = Integer.MAX_VALUE;
int miny = Integer.MIN_VALUE;
boolean found_one = false;
int n = target.getComponentCount();
for (int i = 0; i < n; i++) {
Component c = target.getComponent(i);
if (c.isVisible()) {
found_one = true;
Dimension d = c.getPreferredSize();
minx = Math.min(minx, d.width);
miny = Math.min(miny, d.height);
}
}
if (found_one) {
return new Dimension(minx, miny);
}
return new Dimension(0, 0);
}
}
}
} }