001 package market.stdform; 002 003 import java.awt.GridBagConstraints; 004 import java.awt.GridBagLayout; 005 import java.awt.GridLayout; 006 import java.awt.event.KeyAdapter; 007 import java.awt.event.KeyEvent; 008 009 import javax.swing.Box; 010 import javax.swing.BoxLayout; 011 import javax.swing.ButtonGroup; 012 import javax.swing.JLabel; 013 import javax.swing.JPanel; 014 import javax.swing.JRadioButton; 015 import javax.swing.JTextField; 016 017 import market.Conversions; 018 import market.VCDummy; 019 import market.VCPositiveDouble; 020 import market.swing.ComponentFactory; 021 import market.swing.JTFCheckable; 022 import sale.FormSheet; 023 import sale.FormSheetContentCreator; 024 import data.Value; 025 026 /** 027 * This FormSheet displays the bill of a customer`s buy 028 */ 029 public class FSSellerBill extends FormSheet{ 030 031 public static final int JTFC_DISCOUNT = 0; 032 public static final int JTFC_ENDSUM = 1; 033 034 private Value v_sum; 035 private double discount; 036 private Value v_endSum; 037 private JTFCheckable jtfc_discount; 038 private JTFCheckable jtfc_endSum; 039 040 /** 041 * @param v the value of customer's current purchase. 042 * @param d the customer's current discount, it covers values from 0 to 1. 043 */ 044 public FSSellerBill(Value v, double d) { 045 super("Rechnung", null); 046 v_sum = v; 047 discount = d; 048 setEndSum(discount); 049 this.addContentCreator(getFSCC()); 050 jtfc_discount.addKeyListener(new KeyAdapter(){ 051 public void keyPressed(KeyEvent e) { 052 if(e.getKeyCode()==KeyEvent.VK_ENTER){ 053 setNewDiscount(); 054 } 055 } 056 }); 057 } 058 059 /** 060 * @return a new {@link FSCheckable} that uses a FSSellerBill as argument. 061 * 062 * @param v the value of customer's current purchase. 063 * @param d the customer's current discount, it covers values from 0 to 1. 064 */ 065 public static FSCheckable create(Value v, double d){ 066 FormSheet fs = new FSSellerBill(v, d); 067 return new FSCheckable(fs); 068 } 069 070 /** 071 * @return the FormSheetContentCreator of this FormSheet class. 072 */ 073 private FormSheetContentCreator getFSCC(){ 074 return new FormSheetContentCreator(){ 075 protected void createFormSheetContent(FormSheet fs) { 076 077 //JPanel Initialization 078 JPanel jp_content = new JPanel(); 079 JPanel jp_main = new JPanel(); 080 JPanel jp_amounts = new JPanel(); 081 JPanel jp_paymentMode = new JPanel(); 082 083 GridBagLayout gridbag = new GridBagLayout(); 084 GridBagConstraints c = new GridBagConstraints(); 085 jp_content.setLayout(gridbag); 086 c.gridy = 1; 087 c.weighty = 1; 088 gridbag.setConstraints(jp_main, c); 089 090 jp_main.setLayout(new BoxLayout(jp_main, BoxLayout.Y_AXIS)); 091 jp_amounts.setLayout(new GridLayout(3,3)); 092 jp_amounts.setAlignmentX(Box.CENTER_ALIGNMENT); 093 jp_paymentMode.setLayout(new GridLayout(2,1)); 094 jp_paymentMode.setBorder(ComponentFactory.createInsetBorder("Zahlungsart")); 095 jp_paymentMode.setAlignmentX(Box.CENTER_ALIGNMENT); 096 097 //TextField Initialisation 098 JTextField jtf_sum = new JTextField(Conversions.valueToCurrency(v_sum)); 099 jtfc_discount = new JTFCheckable(JTFC_DISCOUNT, new VCPositiveDouble("Rabatt", false), 3); 100 jtfc_discount.setText(Conversions.fixedDecimal(100 * discount, 3)); 101 jtfc_endSum = new JTFCheckable(JTFC_ENDSUM, new VCDummy("Endsumme"), 7); 102 jtfc_endSum.setText(Conversions.valueToCurrency(v_endSum)); 103 jtf_sum.setEditable(false); 104 jtfc_endSum.setEditable(false); 105 106 //ButtonGroup to select mode of payment 107 JRadioButton jrb_cash = new JRadioButton("Bar", true); 108 JRadioButton jrb_card = new JRadioButton("Geldkarte", false); 109 ButtonGroup group = new ButtonGroup(); 110 group.add(jrb_cash); 111 group.add(jrb_card); 112 113 //Adds Components to JPanels 114 jp_amounts.add(new JLabel("Summe: ")); 115 jp_amounts.add(jtf_sum); 116 jp_amounts.add(new JLabel(" Euro")); 117 jp_amounts.add(new JLabel("Rabatt: ")); 118 jp_amounts.add(jtfc_discount); 119 jp_amounts.add(new JLabel(" %")); 120 jp_amounts.add(new JLabel("Rechnungsbetrag: ")); 121 jp_amounts.add(jtfc_endSum); 122 jp_amounts.add(new JLabel(" Euro")); 123 124 jp_paymentMode.add(jrb_cash); 125 jp_paymentMode.add(jrb_card); 126 127 jp_main.add(jp_amounts); 128 jp_main.add(Box.createVerticalStrut(50)); 129 jp_main.add(jp_paymentMode); 130 131 jp_content.add(jp_main); 132 133 //Adds components and Buttons to the FormSheet 134 fs.setComponent(jp_content); 135 fs.removeAllButtons(); 136 fs.addButton("Zahlung", ButtonIDs.BTN_ACCEPT, null); 137 fs.addButton("Zurück", ButtonIDs.BTN_BACK, null); 138 } 139 }; 140 } 141 142 /** 143 * Updates the TextFields containing discount and end-sum, using entry in field discount. 144 */ 145 private void setNewDiscount(){ 146 if(jtfc_discount.hasValidValue()){ 147 double oldDisc = discount; 148 discount = Conversions.round( 149 Double.valueOf(Conversions.convertComma( 150 jtfc_discount.getText())).doubleValue()/100, 5); 151 if (discount > 1) { //do not give more than 100 percent discount 152 discount = oldDisc; 153 } 154 setEndSum(discount); 155 jtfc_discount.setText(Conversions.fixedDecimal(100 * discount, 3)); 156 jtfc_endSum.setText(Conversions.valueToCurrency(v_endSum)); 157 } else { 158 jtfc_discount.setText(Conversions.fixedDecimal(100 * discount, 3)); 159 } 160 } 161 162 /** 163 * Sets new end-sum using sum and given discount. 164 */ 165 private void setEndSum(double discount){ 166 if(discount==0) v_endSum = v_sum; 167 else v_endSum = v_sum.subtract(v_sum.multiply(discount)); 168 } 169 170 /** 171 * @return the final value the customer has to pay. 172 */ 173 public Value getEndSum(){ 174 return v_endSum; 175 } 176 }