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