import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GraphicsEnvironment;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Toolkit;
import java.util.Hashtable;
import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
/**
* <p>Frame containing a paginated list of transactions (including their effective GVC rules)
* and a few GUI elements to create/edit/delete <code>{@link Rule}s</code> .</p>
*
* <p>Changes in one of the two lists are reflected immediately in display.</p>
*
* @author Paule
*/
public class TestLayoutView {
private static final long serialVersionUID = 9139718415334230659L;
// /**
// * Page size when viewing <code>{@link Transaction}s</code>.
// * Value is computed and depends on screen size of display.
// */
// private int transactionsPerPage;
/* GUI elements */
/** Combobox for displaying all <code>{@link GVC}</code> objects. */
private JComboBox gvcComboBox;
/** List for displaying GVC rules. */
private JList gvcRuleList;
/** List for displaying exception elements. */
private JList exceptionList;
/** Main panel to which all components of this frame are attached. */
private JPanel mainPanel;
/** Button to add a rule to list. */
private JButton addRuleButton;
/** Button to delete a rule from list. */
private JButton deleteRuleButton;
/** Button to update an always-existing rule in list. */
private JButton updateRuleButton;
/** Button to cancel the creation of a rule. */
private JButton cancelRuleButton;
/** Button to add all visible elements as exception to list. */
private JButton addAllVisibleAsExceptionButton;
/** Button to add a exception element to list. */
private JButton addExceptionButton;
/** Button to delete a exception element from list. */
private JButton deleteExceptionButton;
/** Button to test a SQL where clause. */
private JButton testWhereClauseButton;
/** Text field for editing the priority of a GVC rule. This element is linked to a slider. */
private JTextField gvcPriorityField;
/** Text field for editing the optional description of a GVC rule. */
private JTextField gvcDescriptionField;
/** Multiline text field for editing the where clause of a GVC rule. */
private JTextArea gvcWhereClauseField;
/** Slider for adjusting the priority of a GVC rule. This element is linked to a textfield. */
private JSlider gvcPrioritySlider;
/** Table with for paginated data view. */
protected JTable paginatedTable;
private JFrame frame;
private final static String BROWSE_DATA_HEADLINE_TEXT =
"Browse working data set";
private Insets screenInsets;
/** Measured maximum dimension of any GUI frame (depends on user display). */
private Dimension maxFrameDimension;
/** Measured dimension of physical display. */
private Dimension physicalDimension;
public void fillTestData() {
/* paginated table in middle of screen */
final DefaultTableModel tableModel = (DefaultTableModel)this.paginatedTable.getModel();
Object[] row = {0, "data", "buikbuikbuik", "Bitch Death Teenage Mucousi Monster From Hell",
"lips", "um", "lorum", "anvil", "löffelsteel","Kernspaltaxt","Heizol","hacken",
"Unsinn","Unsinn","Unsinn","Unsinn","Unsinn","Unsinn"};
for (int i=1; i<row.length; ) {
tableModel.addColumn("col "+(++i));
}
for (int i=0; i<50; i++) {
row[0] = ((Integer)row[0])+1;
tableModel.addRow(row);
}
/* rule list to the left */
DefaultListModel listModel = (DefaultListModel)gvcRuleList.getModel();
listModel.addElement("hello");
listModel.addElement("world");
listModel.addElement(11111);
listModel.addElement("Es könnte noch weitere Antworten auf das Thema geben, jedoch erhalten Sie keine zusätzlichen Benachrichtigungen, bis Sie das Forum wieder");
listModel.addElement("hello");
listModel.addElement("world");
listModel.addElement("hello");
listModel.addElement("world");
listModel.addElement("hello");
listModel.addElement("world");
listModel.addElement("hello");
listModel.addElement("world");
/* exception list to the rightt */
listModel = (DefaultListModel)exceptionList.getModel();
listModel.addElement("world");
listModel.addElement("hello");
listModel.addElement("world");
listModel.addElement("hello");
listModel.addElement("world");
listModel.addElement("hello");
listModel.addElement("world");
listModel.addElement("1world");
listModel.addElement("2hello");
listModel.addElement("3world");
listModel.addElement("4hello");
listModel.addElement("5world");
listModel.addElement("6hello");
listModel.addElement("77777777777777world");
}
private JPanel getCombinedEditPanel() {
/* GVC rule list and list buttons */
this.gvcRuleList = new JList();
this.gvcRuleList.setModel(new DefaultListModel());
this.gvcRuleList.setVisibleRowCount(12);
this.gvcRuleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.addRuleButton = new JButton ("Add");
this.deleteRuleButton = new JButton ("Remove");
/* excludes list and buttons */
this.exceptionList = new JList();
this.exceptionList.setVisibleRowCount(12);
this.exceptionList.setModel(new DefaultListModel());
this.exceptionList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.addAllVisibleAsExceptionButton = new JButton ("Add all visible as exception");
this.addExceptionButton = new JButton ("Add");
this.deleteExceptionButton = new JButton ("Remove");
/* Bottom part with:
* - search panel, pagination panel (top part)
* - GVC rule list, GVC rule edit panel, GVC rule exceptions (middle part)
* - buttons for list, panel and list (bottom part)
*
* Again, this is a BorderLayout.
*/
final JPanel combinedEditPanel = new JPanel(new BorderLayout());
JPanel panel2 = new JPanel (new BorderLayout());
final GridBagConstraints constraint = new GridBagConstraints();
panel2.add(this.getPaginationControlPanel(), BorderLayout.WEST);
panel2.add(this.getSearchPanel(), BorderLayout.EAST);
combinedEditPanel.add(panel2, BorderLayout.NORTH);
panel2 = new JPanel (new GridBagLayout());
/* head labels */
constraint.gridx = 0;
constraint.fill = GridBagConstraints.BOTH;
constraint.insets.left = constraint.insets.right = 5;
constraint.gridy = 0;
panel2.add(new JLabel("GVC rules"));
constraint.gridx++;
panel2.add(new JLabel("Edit rule"));
constraint.gridx++;
panel2.add(new JLabel("GVC rule exceptions"));
/* center lists, edit fields */
constraint.gridx = 0;
constraint.fill = GridBagConstraints.BOTH;
constraint.weightx = 0.5;
constraint.gridy ++;
final JScrollPane gvcRuleListScrollPane = new JScrollPane(
this.gvcRuleList,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
panel2.add(gvcRuleListScrollPane, constraint);
constraint.gridx++;
constraint.fill = GridBagConstraints.BOTH;
constraint.weightx = 1.;
panel2.add(this.getGVCRuleEditPanel(),constraint);
constraint.gridx++;
constraint.weightx = 0.;
final JScrollPane exceptionListScrollPane = new JScrollPane(
this.exceptionList,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
panel2.add(exceptionListScrollPane, constraint);
/* bottom line buttons (two buttons per panel) */
JPanel buttonPanel = new JPanel(new FlowLayout());
buttonPanel.add(this.addRuleButton);
buttonPanel.add(this.deleteRuleButton);
constraint.gridx = 0;
constraint.gridy ++;
panel2.add(buttonPanel,constraint);
buttonPanel = new JPanel(new FlowLayout());
buttonPanel.add(this.cancelRuleButton);
buttonPanel.add(this.updateRuleButton);
constraint.gridx++;
panel2.add(buttonPanel,constraint);
buttonPanel = new JPanel(new FlowLayout());
buttonPanel.add(this.addExceptionButton);
buttonPanel.add(this.deleteExceptionButton);
constraint.gridx++;
panel2.add(buttonPanel,constraint);
combinedEditPanel.add(panel2, BorderLayout.CENTER);
return combinedEditPanel;
}
/**
* @return
*/
private JPanel getGVCRuleEditPanel() {
final JPanel ruleEditPanel = new JPanel(new GridBagLayout());
final GridBagConstraints constraint = new GridBagConstraints();
/* prepare GUI elements */
this.updateRuleButton = new JButton("Save/Update");
this.cancelRuleButton = new JButton("Cancel creation");
this.testWhereClauseButton = new JButton("Test");
this.gvcWhereClauseField = new JTextArea(2,30);
this.gvcWhereClauseField.setLineWrap(true);
this.gvcWhereClauseField.setWrapStyleWord(true);
this.gvcComboBox = new JComboBox();
this.gvcPrioritySlider = new JSlider(0,999,999);
Hashtable<Integer, JComponent> sliderLabels = new Hashtable<Integer, JComponent>();
sliderLabels.put(0, new JLabel("min"));
sliderLabels.put(500, new JLabel("medium"));
sliderLabels.put(999, new JLabel("max"));
this.gvcPrioritySlider.setLabelTable(sliderLabels);
this.gvcPrioritySlider.setMajorTickSpacing(100);
this.gvcPrioritySlider.setPaintTicks(true);
this.gvcPrioritySlider.setPaintLabels(true);
/* listen on changes in this slider to update text field */
this.gvcPriorityField = new JTextField(3);
this.gvcWhereClauseField.setBorder(this.gvcPriorityField.getBorder());
this.gvcDescriptionField = new JTextField(30);
/* layout components */
/* left column: code (label)*/
constraint.gridx = 0;
constraint.gridy = 0;
ruleEditPanel.add(new JLabel("code",SwingConstants.LEFT),constraint);
/* left column: where clause (label) and test button */
constraint.gridy++;
final JPanel wherePanel = new JPanel(new GridLayout(2,1));
wherePanel.add(new JLabel("where clause",SwingConstants.LEFT));
wherePanel.add(this.testWhereClauseButton);
ruleEditPanel.add(wherePanel,constraint);
/* left column: priority (label) */
constraint.gridy++;
ruleEditPanel.add(new JLabel("priority",SwingConstants.LEFT),constraint);
/* left column: description (label) */
constraint.gridy++;
ruleEditPanel.add(new JLabel("description",SwingConstants.LEFT),constraint);
/* right column: code (combo box) */
constraint.gridx = 1;
constraint.gridy = 0;
ruleEditPanel.add(this.gvcComboBox,constraint);
/* right column: where clause (edit field) */
constraint.gridy++;
ruleEditPanel.add(new JScrollPane(this.gvcWhereClauseField),constraint);
/* right column: priority (display and slider) */
constraint.gridy++;
JPanel priorityPanel = new JPanel(new FlowLayout(FlowLayout.LEFT,30,0));
priorityPanel.add(this.gvcPriorityField);
priorityPanel.add(this.gvcPrioritySlider);
ruleEditPanel.add(priorityPanel,constraint);
/* right column: decription (edit field) */
constraint.gridy++;
ruleEditPanel.add(this.gvcDescriptionField,constraint);
return ruleEditPanel;
}
private JPanel getPageInputPanel() {
/* prepare initial, writable components */
final JPanel panel = new JPanel(new GridBagLayout());
/* total pages */
final JLabel totalPagesTextField = new JLabel();
/* selected page */
final JTextField selectedPageTextField = new JTextField(5);
final GridBagConstraints constraint = new GridBagConstraints();
constraint.gridwidth = 3;
constraint.gridx = 0;
constraint.gridy = 0;
panel.add(new JLabel("Page"),constraint);
constraint.gridwidth = 1;
constraint.gridy++;
panel.add(selectedPageTextField,constraint);
constraint.gridx++;
panel.add(new JLabel(" / "),constraint);
constraint.gridx++;
panel.add(totalPagesTextField,constraint);
return panel;
}
private JPanel getPaginationControlPanel() {
/** JPanel with paginate buttons and pageInputPanel. */
final JPanel paginateControlPanel;
/** Button to switch to next displayable page. */
final JButton nextPageButton;
/** Button to switch to previous displayable page. */
final JButton prevPageButton;
/** Button to switch to first displayable page. */
final JButton firstPageButton;
/** Button to switch to last displayable page. */
final JButton lastPageButton;
/* instantiate predefined buttons for pagination scrolling */
firstPageButton = new JButton("<<");
prevPageButton = new JButton("<");
nextPageButton = new JButton(">");
lastPageButton = new JButton(">>");
/* add bottom line buttons and page input panel */
paginateControlPanel = new JPanel(new FlowLayout(FlowLayout.CENTER,5,0));
paginateControlPanel.add(firstPageButton);
paginateControlPanel.add(prevPageButton);
paginateControlPanel.add(getPageInputPanel());
paginateControlPanel.add(nextPageButton);
paginateControlPanel.add(lastPageButton);
return paginateControlPanel;
}
private JPanel getSearchPanel() {
final JPanel panel = new JPanel (new FlowLayout());
/* Text area for search string input. */
final JTextField textField = new JTextField(25);
/* Click on this button to start the search. */
final JButton searchButton = new JButton("Search");
panel.add(textField);
panel.add(searchButton);
return panel;
}
/**
* @return
*/
private JPanel getBrowsePanel() {
final JPanel browsePanel = new JPanel(new BorderLayout());
/** Button group for JRadioButtons in browse view. */
final ButtonGroup browseButtonGroup;
/** Radio button for showing all transactions. */
final JRadioButton showAllRadioButton;
/** Radio button for showing only transactions connected to 1 GVC rule. */
final JRadioButton showSingleConnectedRadioButton;
/** Radio button for showing only transactions connected to more than 1 GVC rule. */
final JRadioButton showMultiConnectedRadioButton;
/** Radio button for showing only transactions connected to no GVC rule. */
final JRadioButton showUnconnectedRadioButton;
/** JLabel for browse information. */
final JLabel browseInfoLabel;
/* init top radio buttons for switching view mode */
showAllRadioButton = new JRadioButton("all");
showSingleConnectedRadioButton = new JRadioButton("single connected");
showSingleConnectedRadioButton.setBackground( new Color(128,255,128));
showMultiConnectedRadioButton = new JRadioButton("multi connected ");
showMultiConnectedRadioButton.setBackground( new Color(255,128,128));
showUnconnectedRadioButton = new JRadioButton("free ");
showUnconnectedRadioButton.setBackground( new Color(255,255,128));
browseButtonGroup = new ButtonGroup();
browseButtonGroup.add(showAllRadioButton);
browseButtonGroup.add(showSingleConnectedRadioButton);
browseButtonGroup.add(showMultiConnectedRadioButton);
browseButtonGroup.add(showUnconnectedRadioButton);
showAllRadioButton.setSelected(true);
/* browse info label */
browseInfoLabel = new JLabel(BROWSE_DATA_HEADLINE_TEXT);
/* lay out elements */
Box innerboxLeft = Box.createVerticalBox();
innerboxLeft.add(showAllRadioButton);
innerboxLeft.add(showSingleConnectedRadioButton);
Box innerboxRight = Box.createVerticalBox();
innerboxRight.add(showMultiConnectedRadioButton);
innerboxRight.add(showUnconnectedRadioButton);
Box outerBox = Box.createHorizontalBox();
outerBox.add(innerboxLeft);
outerBox.add(innerboxRight);
browsePanel.add(browseInfoLabel,BorderLayout.WEST);
browsePanel.add(outerBox,BorderLayout.EAST);
return browsePanel;
}
/**
* <p>Inits some screen size dimensions:</p>
* <ul>
* <li>physical screen size</li>
* <li>maximum size of a frame</li>
* <li>maximum size of a component in a frame</li>
* </ul>
*/
private void initScreenSizeProps() {
/*
* Get max dimension from toolkit. Beware: this dimension includes OS elements like
* toolbars.
*/
this.physicalDimension = Toolkit.getDefaultToolkit().getScreenSize();
this.screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(
GraphicsEnvironment.getLocalGraphicsEnvironment()
.getDefaultScreenDevice().getDefaultConfiguration());
this.maxFrameDimension = new Dimension(
this.physicalDimension.width - screenInsets.left - screenInsets.right,
this.physicalDimension.height - screenInsets.top - screenInsets.bottom);
/*
* Create a frame, maximize it and display it for a short time to get maximum
* dimension. Inside the frame, place a panel with maximum dimension.
*/
final JFrame testFrame = new JFrame();
testFrame.setSize(this.maxFrameDimension);
testFrame.setVisible(true);
testFrame.validate();
testFrame.dispose();
}
/**
* <p>Set frame's prefered size, and position it in frame (optionally centered).</p>
*
* @param view
* @param preferedWidth
* @param preferedHeight
* @param centered
*/
private void setViewSizeAndPosition () {
this.frame = new JFrame();
/* dimension can not be greater than maximum frame dimension */
Dimension newFrameSize = new Dimension (
this.maxFrameDimension.width,
this.maxFrameDimension.height
);
this.frame.setSize(newFrameSize);
/* centered on display */
this.frame.setLocation(
(this.maxFrameDimension.width - newFrameSize.width) / 2 + this.screenInsets.left,
(this.maxFrameDimension.height - newFrameSize.height) / 2 + this.screenInsets.top
);
/* frame is unresizable */
this.frame.setResizable(false);
this.frame.setContentPane(this.mainPanel);
}
/* (non-Javadoc)
* @see gui.frame.AbstractView#initializeGUIComponents()
*/
public void setVisible() {
this.initScreenSizeProps();
/* browse data table */
this.paginatedTable = new JTable();
this.paginatedTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
/* init frame and it's panel */
this.mainPanel = new JPanel(null);
this.mainPanel.setLayout( new BorderLayout());
this.mainPanel.add(this.getBrowsePanel(),BorderLayout.NORTH);
/* middle console of paginated data */
final JScrollPane paginatedTableScrollPane = new JScrollPane(
this.paginatedTable,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
this.mainPanel.add(paginatedTableScrollPane,BorderLayout.CENTER);
this.mainPanel.add(getCombinedEditPanel(),BorderLayout.SOUTH);
/* frame properties */
this.setViewSizeAndPosition();
// /* Size JLists manually, because long entries in lists kill layout. */
// SwingUtilities.invokeLater(new Runnable() {
//
// @Override
// public void run() {
//
// final int exceptionListWidth = 200;
//
// gvcRuleList.setSize( new Dimension(
// gvcRuleList.getWidth(),
// gvcRuleList.getFixedCellHeight() * 12)
// );
//
// /* set fixed width of right hand exception list */
// exceptionList.setSize( new Dimension(
// exceptionListWidth,
// exceptionList.getFixedCellHeight() * 12 ));
//
//
// /* compute maximum height of transaction table */
// final int paginatedTableHeight = paginatedTable.getHeight();
//
// transactionsPerPage =
// ((int)paginatedTableScrollPane.getVisibleRect().getHeight()
// - paginatedTableScrollPane.getHorizontalScrollBar().getHeight())
// / paginatedTable.getRowHeight();
// paginatedTable.setPreferredSize( new Dimension(
// (int)paginatedTableScrollPane.getVisibleRect().getWidth(),
// transactionsPerPage * paginatedTable.getRowHeight()));
//
//
// }
// });
/* init pagination object */
// TODO HACK
// this.transactionsPerPage = 10;
this.frame.setVisible(true);
}
public static void main(String[] args) {
final TestLayoutView view = new TestLayoutView();
SwingUtilities.invokeLater(new Runnable (){
public void run() {
view.setVisible();
view.fillTestData();
}});
}
}