package org.korsakow.ide.ui.interfacebuilder.panel;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.event.ChangeListener;
import org.korsakow.ide.lang.LanguageBundle;
import org.korsakow.ide.ui.components.MyButtonGroup;
import org.korsakow.ide.ui.constraints.NumberRangeTextFieldConstraint;
import org.korsakow.ide.ui.interfacebuilder.panel.InfoPanel.TextFieldUpdateListener;
import org.korsakow.ide.util.UIHelper;
public class GridInfoPanel extends JPanel
{
private abstract class AbstractAspectConstraint implements ActionListener, FocusListener
{
protected Float aspect;
public void setAspect(Float aspect)
{
this.aspect = aspect;
validate();
}
public void focusLost(FocusEvent event) {
JTextField textField = (JTextField)event.getSource();
if (!textField.isEnabled())
return;
validate();
}
public void actionPerformed(ActionEvent event) {
JTextField textField = (JTextField)event.getSource();
if (!textField.isEnabled())
return;
validate();
}
protected abstract void validate();
public void focusGained(FocusEvent e){}
}
public class WidthAspectContraist extends AbstractAspectConstraint
{
@Override
protected void validate()
{
if (aspect != null) {
int width = GridInfoPanel.this.getGridWidthValue();
int height = (int)(width / aspect);
GridInfoPanel.this.setGridHeightValue(height);
}
}
}
public class HeightAspectContraist extends AbstractAspectConstraint
{
@Override
protected void validate()
{
if (aspect != null) {
int height = GridInfoPanel.this.getGridHeightValue();
int width = (int)(height * aspect);
GridInfoPanel.this.setGridWidthValue(width);
}
}
}
private class AspectNoneAction implements ActionListener {
public void actionPerformed(ActionEvent event) {
widthConstraint.setAspect(null);
heightConstraint.setAspect(null);
}
}
private class Aspect1x1Action implements ActionListener {
public void actionPerformed(ActionEvent event) {
widthConstraint.setAspect(1.0f/1.0f);
heightConstraint.setAspect(1.0f/1.0f);
}
}
private class Aspect4x3Action implements ActionListener {
public void actionPerformed(ActionEvent event) {
widthConstraint.setAspect(4.0f/3.0f);
heightConstraint.setAspect(4.0f/3.0f);
}
}
private class Aspect16x9Action implements ActionListener {
public void actionPerformed(ActionEvent event) {
widthConstraint.setAspect(16.0f/9.0f);
heightConstraint.setAspect(16.0f/9.0f);
}
}
private JTextField gridWidthField;
private JTextField gridHeightField;
private NumberRangeTextFieldConstraint numberConstraint;
private AbstractAspectConstraint widthConstraint;
private AbstractAspectConstraint heightConstraint;
private JRadioButton aspectNone;
private JRadioButton aspect1x1Button;
private JRadioButton aspect16x9Button;
private JRadioButton aspect4x3Button;
private MyButtonGroup aspectGroup;
public GridInfoPanel()
{
initUI();
initListeners();
}
private void initUI()
{
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
setBorder(BorderFactory.createEmptyBorder(20, 25, 20, 25));
JPanel whPanel = new JPanel(new GridLayout(1, 2, 0, 0));
Dimension fieldPreferredSize = new Dimension(50, 20);
JPanel widthPanel = new JPanel();
whPanel.add(widthPanel);
widthPanel.add(new JLabel(LanguageBundle.getString("interfacebuilder.gridinfo.gridwidth.label")));
widthPanel.add(gridWidthField = new JTextField());
gridWidthField.setPreferredSize(fieldPreferredSize);
JPanel heightPanel = new JPanel();
whPanel.add(heightPanel);
heightPanel.add(new JLabel(LanguageBundle.getString("interfacebuilder.gridinfo.gridheight.label")));
heightPanel.add(gridHeightField = new JTextField());
gridHeightField.setPreferredSize(fieldPreferredSize);
JPanel aspectPanel = new JPanel(new GridLayout(2, 2));
aspectPanel.add(aspectNone = new JRadioButton("Arbitrary"));
aspectPanel.add(aspect4x3Button = new JRadioButton("4:3"));
aspectPanel.add(aspect1x1Button = new JRadioButton("1:1"));
aspectPanel.add(aspect16x9Button = new JRadioButton("16:9"));
aspectNone.setSelected(true);
aspectGroup = new MyButtonGroup();
aspectGroup.add(aspectNone);
aspectGroup.add(aspect1x1Button);
aspectGroup.add(aspect4x3Button);
aspectGroup.add(aspect16x9Button);
add(UIHelper.createVerticalBoxLayoutPanel(
whPanel,
Box.createVerticalStrut(20),
aspectPanel
));
add(Box.createVerticalGlue());
}
private void initListeners()
{
numberConstraint = new NumberRangeTextFieldConstraint(Integer.class, 0, null);
numberConstraint.addAsListenerTo(gridWidthField);
numberConstraint.addAsListenerTo(gridHeightField);
widthConstraint = new WidthAspectContraist();
gridWidthField.addFocusListener(widthConstraint);
gridWidthField.addActionListener(widthConstraint);
heightConstraint = new HeightAspectContraist();
gridHeightField.addFocusListener(heightConstraint);
gridHeightField.addActionListener(heightConstraint);
aspectNone.addActionListener(new AspectNoneAction());
aspect1x1Button.addActionListener(new Aspect1x1Action());
aspect4x3Button.addActionListener(new Aspect4x3Action());
aspect16x9Button.addActionListener(new Aspect16x9Action());
}
// public void setEnabled(boolean enabled)
// {
// gridWidthField.setEnabled(enabled);
// gridHeightField.setEnabled(enabled);
// if (!enabled) {
// gridWidthField.setText(LanguageBundle.getString("interfacebuilder.gridinfo.novalue"));
// gridHeightField.setText(LanguageBundle.getString("interfacebuilder.gridinfo.novalue"));
// }
// }
public void addWidthChangeListener(ChangeListener listener)
{
TextFieldUpdateListener textFieldUpdater = new TextFieldUpdateListener();
textFieldUpdater.addAsListenerTo(gridWidthField);
textFieldUpdater.addChangeListener(listener);
final AspectChangeNotifier aspectUpdater = new AspectChangeNotifier(gridWidthField, textFieldUpdater);
aspectNone.addActionListener(aspectUpdater);
aspect1x1Button.addActionListener(aspectUpdater);
aspect4x3Button.addActionListener(aspectUpdater);
aspect16x9Button.addActionListener(aspectUpdater);
}
public void addHeightChangeListener(ChangeListener listener)
{
TextFieldUpdateListener textFieldUpdater = new TextFieldUpdateListener();
textFieldUpdater.addAsListenerTo(gridHeightField);
textFieldUpdater.addChangeListener(listener);
final AspectChangeNotifier aspectUpdater = new AspectChangeNotifier(gridHeightField, textFieldUpdater);
aspectNone.addActionListener(aspectUpdater);
aspect1x1Button.addActionListener(aspectUpdater);
aspect4x3Button.addActionListener(aspectUpdater);
aspect16x9Button.addActionListener(aspectUpdater);
}
public boolean isGridAspectLocked()
{
return !aspectNone.isSelected();
}
public void setGridWidthValue(int width)
{
gridWidthField.setText(""+width);
}
public int getGridWidthValue()
{
try {
return Integer.parseInt(gridWidthField.getText());
} catch (NumberFormatException e) {
return 0;
}
}
public void setGridHeightValue(int height)
{
gridHeightField.setText(""+height);
}
public int getGridHeightValue()
{
try {
return Integer.parseInt(gridHeightField.getText());
} catch (NumberFormatException e) {
return 0;
}
}
private static class AspectChangeNotifier implements ActionListener
{
private final JTextField field;
private final TextFieldUpdateListener updater;
public AspectChangeNotifier(JTextField field, TextFieldUpdateListener updater)
{
this.field = field;
this.updater = updater;
}
public void actionPerformed(ActionEvent event) {
updater.notifyChange(field);
}
}
}