View Javadoc

1   package de.orangecafe.amazonrcp.gui.forms;
2   
3   import org.springframework.richclient.form.AbstractTableMasterForm;
4   import org.springframework.richclient.form.AbstractDetailForm;
5   import org.springframework.richclient.command.CommandGroup;
6   import org.springframework.richclient.progress.ListStatusBarUpdater;
7   import org.springframework.binding.form.HierarchicalFormModel;
8   import org.springframework.binding.value.ValueModel;
9   import org.springframework.binding.value.support.ObservableList;
10  
11  import com.amazon.webservices.awsecommerceservice._2007_04_04.Item;
12  import com.amazon.webservices.awsecommerceservice._2007_04_04.ItemAttributes;
13  import com.amazon.webservices.awsecommerceservice._2007_04_04.OfferSummary;
14  import com.amazon.webservices.awsecommerceservice._2007_04_04.Price;
15  
16  import de.orangecafe.amazonrcp.gui.commands.AddToCartCommand;
17  import de.orangecafe.amazonrcp.gui.commands.SearchAmazonCommand;
18  import de.orangecafe.amazonrcp.gui.util.PriceTableCellRenderer;
19  import de.orangecafe.amazonrcp.gui.util.ImageTableCellRenderer;
20  import de.orangecafe.amazonrcp.helper.SelectedItemListHolder;
21  import de.orangecafe.amazonrcp.converter.PriceToStringConverter;
22  import de.orangecafe.amazonrcp.converter.StringToPriceConverter;
23  
24  import javax.swing.*;
25  import javax.swing.table.TableColumnModel;
26  import java.util.List;
27  import java.util.Currency;
28  import java.util.Locale;
29  import java.text.NumberFormat;
30  import java.math.BigInteger;
31  
32  /**
33   * @author Torsten Strasser
34   */
35  public class SearchResultMasterForm extends AbstractTableMasterForm {
36      private final static  String[] COLUMN_NAMES = new String[] {
37              "smallImage",
38              "itemAttributes.title",
39              "itemAttributes.author",
40              "offerSummary.lowestNewPrice",
41              "ASIN"
42      };
43  
44      private SelectedItemListHolder _holder;
45      
46      public SearchResultMasterForm(final HierarchicalFormModel hierarchicalFormModel, final String property, final String formId, final Class detailType, final SelectedItemListHolder holder) {
47          super(hierarchicalFormModel, property, formId, detailType);
48  
49          hierarchicalFormModel.registerPropertyConverter("offerSummary.lowestNewPrice", new PriceToStringConverter(), new StringToPriceConverter());
50  
51          _holder = holder;
52      }
53  
54      protected String[] getColumnPropertyNames() {
55          return COLUMN_NAMES;
56      }
57  
58      protected AbstractDetailForm createDetailForm(final HierarchicalFormModel hierarchicalFormModel, final ValueModel valueModel, final ObservableList observableList) {
59          Item item = (Item) valueModel.getValue();
60  
61          init(item);
62  
63          return new SearchResultDetailForm(hierarchicalFormModel, "searchResultDetail", valueModel, observableList);
64      }
65  
66      @Override
67      protected JComponent createFormControl() {
68          JComponent component = super.createFormControl();
69  
70          TableColumnModel columnModel = getMasterTable().getColumnModel();
71  
72          //TODO: check if this can be replaced by a converter
73          columnModel.getColumn(0).setCellRenderer(new ImageTableCellRenderer());
74          columnModel.getColumn(3).setCellRenderer(new PriceTableCellRenderer());
75  
76          getMasterTable().setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
77  
78          columnModel.getColumn(0).setPreferredWidth(70);
79          columnModel.getColumn(1).setPreferredWidth(370);
80          columnModel.getColumn(2).setPreferredWidth(180);
81          columnModel.getColumn(3).setPreferredWidth(70);
82          columnModel.getColumn(4).setPreferredWidth(70);
83  
84          getMasterTable().setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
85  
86          return component;
87      }
88  
89      @Override
90      protected CommandGroup getCommandGroup() {
91          AddToCartCommand addCommand = (AddToCartCommand) getActiveWindow().getCommandManager().getCommand("addToCartCommand");
92          getSelectionModel().addListSelectionListener(addCommand);
93  
94          SearchAmazonCommand searchCommand = (SearchAmazonCommand) getActiveWindow().getCommandManager().getCommand("searchAmazonCommand");
95  
96          return CommandGroup.createCommandGroup(new Object[] { searchCommand, addCommand });
97      }
98  
99      @Override
100     protected void installSelectionHandler() {
101         super.installSelectionHandler();
102 
103         getSelectionModel().addListSelectionListener(_holder);
104         getFormModel().addPropertyChangeListener(_holder);
105         getSelectionModel().addListSelectionListener(new ListStatusBarUpdater(getActiveWindow().getStatusBar()) {
106             protected String getSelectedObjectName() {
107                 return null;
108             }
109 
110             @Override
111             protected void onSingleSelection(final int i) {
112                 //TODO: i18n
113                 String message = "1 item selected (" + getPrice(new int[] { i }) + ")";
114                 getStatusBar().setMessage(message);
115             }
116 
117             @Override
118             protected void onMultiSelection(final int[] selection) {
119                 //TODO: i18n
120                 String message = getItemsSelected() + " items selected (" + getPrice(selection) + ")";
121                 getStatusBar().setMessage(message);
122             }
123 
124             @Override
125             protected void onNoSelection() {
126                 getStatusBar().setMessage(null);
127             }
128 
129             private String getPrice(int[] selection) {
130                 List<Item> items = getFormData();
131                 float sum = 0;
132                 for (int i : selection) {
133                     if (items.get(i).getOfferSummary().getLowestNewPrice() != null) {
134                         sum += (items.get(i).getOfferSummary().getLowestNewPrice().getAmount().floatValue() / 100);
135                     } else {
136                         //TODO: just as used book available
137                     }
138                 }
139 
140                 NumberFormat formatter = NumberFormat.getCurrencyInstance();
141                 if (items.get(selection[0]).getOfferSummary().getLowestNewPrice() != null) {
142                     formatter.setCurrency(Currency.getInstance(items.get(selection[0]).getOfferSummary().getLowestNewPrice().getCurrencyCode()));
143                 } else {
144                     //TODO: find a more sophisticated solution to get the currency code
145                     formatter.setCurrency(Currency.getInstance("EUR"));
146                 }
147 
148                 return formatter.format(sum);
149             }
150         });
151     }
152 
153     private void init(final Item item) {
154         //Initialize itemAttributes & offerSummary because the valueModel ist just a copy of the detailObject
155         ItemAttributes itemAttributes = (ItemAttributes) getApplicationContext().getBean("itemAttributes");
156 
157         item.setItemAttributes(itemAttributes);
158 
159         OfferSummary offerSummary = (OfferSummary) getApplicationContext().getBean("offerSummary");
160 
161         Price price = (Price) getApplicationContext().getBean("price");
162         price.setAmount(BigInteger.ZERO);
163         price.setCurrencyCode(Currency.getInstance(Locale.getDefault()).getCurrencyCode());
164 
165         offerSummary.setLowestNewPrice(price);
166 
167         item.setOfferSummary(offerSummary);
168 
169         com.amazon.webservices.awsecommerceservice._2007_04_04.Image image = (com.amazon.webservices.awsecommerceservice._2007_04_04.Image) getApplicationContext().getBean("image");
170 
171         item.setLargeImage(image);
172         item.setMediumImage(image);
173         item.setSmallImage(image);
174     }
175 }