You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by gb...@apache.org on 2010/03/09 01:18:25 UTC
svn commit: r920581 - in
/pivot/trunk/tutorials/src/org/apache/pivot/tutorials/stocktracker:
StockTrackerWindow.java stock_tracker_window.wtkx
Author: gbrown
Date: Tue Mar 9 00:18:24 2010
New Revision: 920581
URL: http://svn.apache.org/viewvc?rev=920581&view=rev
Log:
Update Stock Tracker tutorial to use actions rather than hard-coded button listeners.
Modified:
pivot/trunk/tutorials/src/org/apache/pivot/tutorials/stocktracker/StockTrackerWindow.java
pivot/trunk/tutorials/src/org/apache/pivot/tutorials/stocktracker/stock_tracker_window.wtkx
Modified: pivot/trunk/tutorials/src/org/apache/pivot/tutorials/stocktracker/StockTrackerWindow.java
URL: http://svn.apache.org/viewvc/pivot/trunk/tutorials/src/org/apache/pivot/tutorials/stocktracker/StockTrackerWindow.java?rev=920581&r1=920580&r2=920581&view=diff
==============================================================================
--- pivot/trunk/tutorials/src/org/apache/pivot/tutorials/stocktracker/StockTrackerWindow.java (original)
+++ pivot/trunk/tutorials/src/org/apache/pivot/tutorials/stocktracker/StockTrackerWindow.java Tue Mar 9 00:18:24 2010
@@ -35,6 +35,7 @@
import org.apache.pivot.util.concurrent.Task;
import org.apache.pivot.util.concurrent.TaskListener;
import org.apache.pivot.web.GetQuery;
+import org.apache.pivot.wtk.Action;
import org.apache.pivot.wtk.ApplicationContext;
import org.apache.pivot.wtk.BoxPane;
import org.apache.pivot.wtk.Button;
@@ -44,6 +45,7 @@
import org.apache.pivot.wtk.Display;
import org.apache.pivot.wtk.Keyboard;
import org.apache.pivot.wtk.Label;
+import org.apache.pivot.wtk.Platform;
import org.apache.pivot.wtk.Span;
import org.apache.pivot.wtk.TableView;
import org.apache.pivot.wtk.TableViewRowListener;
@@ -69,15 +71,71 @@
@WTKX private Label lastUpdateLabel = null;
@WTKX private Button yahooFinanceButton = null;
- private ArrayList<String> symbols = new ArrayList<String>();
+ private ArrayList<String> symbols;
private GetQuery getQuery = null;
+ // Action invoked to add a new symbol
+ private Action addSymbolAction = new Action(false) {
+ @Override
+ @SuppressWarnings("unchecked")
+ public void perform() {
+ String symbol = symbolTextInput.getText().toUpperCase();
+ if (symbols.indexOf(symbol) == -1) {
+ symbols.add(symbol);
+
+ List<StockQuote> tableData = (List<StockQuote>)stocksTableView.getTableData();
+ StockQuote stockQuote = new StockQuote();
+ stockQuote.setSymbol(symbol);
+ int index = tableData.add(stockQuote);
+
+ stocksTableView.setSelectedIndex(index);
+ }
+
+ symbolTextInput.setText("");
+ refreshTable();
+ }
+ };
+
+ // Action invoke to remove selected symbols
+ private Action removeSymbolsAction = new Action(false) {
+ @Override
+ public void perform() {
+ int selectedIndex = stocksTableView.getFirstSelectedIndex();
+ int selectionLength = stocksTableView.getLastSelectedIndex() - selectedIndex + 1;
+ stocksTableView.getTableData().remove(selectedIndex, selectionLength);
+ symbols.remove(selectedIndex, selectionLength);
+
+ if (selectedIndex >= symbols.getLength()) {
+ selectedIndex = symbols.getLength() - 1;
+ }
+
+ stocksTableView.setSelectedIndex(selectedIndex);
+
+ if (selectedIndex == -1) {
+ refreshDetail();
+ symbolTextInput.requestFocus();
+ }
+ }
+ };
+
+ // Action invoked to refresh the symbol table view
+ private Action refreshTableAction = new Action() {
+ @Override
+ public void perform() {
+ refreshTable();
+ }
+ };
+
public static final String SERVICE_HOSTNAME = "download.finance.yahoo.com";
public static final String SERVICE_PATH = "/d/quotes.csv";
public static final long REFRESH_INTERVAL = 15000;
public static final String YAHOO_FINANCE_HOME = "http://finance.yahoo.com";
public StockTrackerWindow() {
+ // Create the symbol list
+ symbols = new ArrayList<String>();
+
+ // Set a comparator on the symbol list so the entries are sorted
symbols.setComparator(new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
@@ -85,6 +143,7 @@
}
});
+ // Insert some initial symbols
symbols.add("EBAY");
symbols.add("AAPL");
symbols.add("MSFT");
@@ -92,11 +151,17 @@
symbols.add("GOOG");
symbols.add("ORCL");
symbols.add("IBM");
+
+ // Add action mapping to refresh the symbol table view
+ Keyboard.Modifier commandModifier = Platform.getCommandModifier();
+ Keyboard.KeyStroke refreshKeystroke = new Keyboard.KeyStroke(Keyboard.KeyCode.R,
+ commandModifier.getMask());
+ getActionMappings().add(new ActionMapping(refreshKeystroke, refreshTableAction));
}
@Override
public void initialize(Resources resources) {
- // Wire up event handlers
+ // Add stocks table view event handlers
stocksTableView.getTableViewRowListeners().add(new TableViewRowListener.Adapter() {
@Override
public void rowsSorted(TableView tableView) {
@@ -110,6 +175,9 @@
stocksTableView.getTableViewSelectionListeners().add(new TableViewSelectionListener.Adapter() {
@Override
public void selectedRangesChanged(TableView tableView, Sequence<Span> previousSelectedRanges) {
+ int firstSelectedIndex = stocksTableView.getFirstSelectedIndex();
+ removeSymbolsAction.setEnabled(firstSelectedIndex != -1);
+
refreshDetail();
}
});
@@ -128,17 +196,21 @@
public boolean keyPressed(Component component, int keyCode, Keyboard.KeyLocation keyLocation) {
if (keyCode == Keyboard.KeyCode.DELETE
|| keyCode == Keyboard.KeyCode.BACKSPACE) {
- removeSelectedSymbols();
+ removeSymbolsAction.perform();
+ } else if (keyCode == Keyboard.KeyCode.A
+ && Keyboard.isPressed(Platform.getCommandModifier())) {
+ stocksTableView.selectAll();
}
return false;
}
});
+ // Add symbol text input event handlers
symbolTextInput.getTextInputTextListeners().add(new TextInputTextListener() {
@Override
public void textChanged(TextInput textInput) {
- addSymbolButton.setEnabled(textInput.getTextLength() > 0);
+ addSymbolAction.setEnabled(textInput.getTextLength() > 0);
}
});
@@ -146,27 +218,21 @@
@Override
public boolean keyPressed(Component component, int keyCode, Keyboard.KeyLocation keyLocation) {
if (keyCode == Keyboard.KeyCode.ENTER) {
- addSymbol();
+ if (addSymbolAction.isEnabled()) {
+ addSymbolAction.perform();
+ }
}
return false;
}
});
- addSymbolButton.getButtonPressListeners().add(new ButtonPressListener() {
- @Override
- public void buttonPressed(Button button) {
- addSymbol();
- }
- });
-
- removeSymbolsButton.getButtonPressListeners().add(new ButtonPressListener() {
- @Override
- public void buttonPressed(Button button) {
- removeSelectedSymbols();
- }
- });
+ // Assign actions to add and remove symbol buttons
+ addSymbolButton.setAction(addSymbolAction);
+ removeSymbolsButton.setAction(removeSymbolsAction);
+ // Add a button press listener to open the Yahoo! Finance web page when
+ // the link is clicked
yahooFinanceButton.getButtonPressListeners().add(new ButtonPressListener() {
@Override
public void buttonPressed(Button button) {
@@ -204,110 +270,120 @@
@SuppressWarnings("unchecked")
private void refreshTable() {
- getQuery = new GetQuery(SERVICE_HOSTNAME, SERVICE_PATH);
-
- StringBuilder symbolsArgumentBuilder = new StringBuilder();
- for (int i = 0, n = symbols.getLength(); i < n; i++) {
- if (i > 0) {
- symbolsArgumentBuilder.append(",");
+ // Abort any outstanding query
+ if (getQuery != null) {
+ synchronized (getQuery) {
+ if (getQuery.isPending()) {
+ getQuery.abort();
+ }
}
-
- symbolsArgumentBuilder.append(symbols.get(i));
}
- // Format:
- // s - symbol
- // n - company name
- // l1 - most recent value
- // o - opening value
- // h - high value
- // g - low value
- // c1 - change percentage
- // v - volume
- String symbolsArgument = symbolsArgumentBuilder.toString();
- getQuery.getParameters().put("s", symbolsArgument);
- getQuery.getParameters().put("f", "snl1ohgc1v");
-
- CSVSerializer quoteSerializer = new CSVSerializer();
- quoteSerializer.setItemClass(StockQuote.class);
-
- quoteSerializer.getKeys().add("symbol");
- quoteSerializer.getKeys().add("companyName");
- quoteSerializer.getKeys().add("value");
- quoteSerializer.getKeys().add("openingValue");
- quoteSerializer.getKeys().add("highValue");
- quoteSerializer.getKeys().add("lowValue");
- quoteSerializer.getKeys().add("change");
- quoteSerializer.getKeys().add("volume");
+ // Execute the query
+ if (symbols.getLength() > 0) {
+ getQuery = new GetQuery(SERVICE_HOSTNAME, SERVICE_PATH);
+
+ StringBuilder symbolsArgumentBuilder = new StringBuilder();
+ for (int i = 0, n = symbols.getLength(); i < n; i++) {
+ if (i > 0) {
+ symbolsArgumentBuilder.append(",");
+ }
- getQuery.setSerializer(quoteSerializer);
+ symbolsArgumentBuilder.append(symbols.get(i));
+ }
- getQuery.execute(new TaskAdapter<Object>(new TaskListener<Object>() {
- @Override
- public void taskExecuted(Task<Object> task) {
- if (task == getQuery) {
- List<Object> quotes = (List<Object>)task.getResult();
-
- // Preserve any existing sort and selection
- Sequence<?> selectedStocks = stocksTableView.getSelectedRows();
-
- List<Object> tableData = (List<Object>)stocksTableView.getTableData();
- Comparator<Object> comparator = tableData.getComparator();
- quotes.setComparator(comparator);
-
- stocksTableView.setTableData(quotes);
-
- if (selectedStocks.getLength() > 0) {
- // Select current indexes of selected stocks
- for (int i = 0, n = selectedStocks.getLength(); i < n; i++) {
- Object selectedStock = selectedStocks.get(i);
-
- int index = 0;
- for (Object stock : stocksTableView.getTableData()) {
- String symbol = JSONSerializer.getString(stock, "symbol");
- String selectedSymbol = JSONSerializer.getString(selectedStock, "symbol");
-
- if (symbol.equals(selectedSymbol)) {
- stocksTableView.addSelectedIndex(index);
- break;
- }
+ // Format:
+ // s - symbol
+ // n - company name
+ // l1 - most recent value
+ // o - opening value
+ // h - high value
+ // g - low value
+ // c1 - change percentage
+ // v - volume
+ String symbolsArgument = symbolsArgumentBuilder.toString();
+ getQuery.getParameters().put("s", symbolsArgument);
+ getQuery.getParameters().put("f", "snl1ohgc1v");
+
+ CSVSerializer quoteSerializer = new CSVSerializer();
+ quoteSerializer.setItemClass(StockQuote.class);
+
+ quoteSerializer.getKeys().add("symbol");
+ quoteSerializer.getKeys().add("companyName");
+ quoteSerializer.getKeys().add("value");
+ quoteSerializer.getKeys().add("openingValue");
+ quoteSerializer.getKeys().add("highValue");
+ quoteSerializer.getKeys().add("lowValue");
+ quoteSerializer.getKeys().add("change");
+ quoteSerializer.getKeys().add("volume");
+
+ getQuery.setSerializer(quoteSerializer);
+
+ getQuery.execute(new TaskAdapter<Object>(new TaskListener<Object>() {
+ @Override
+ public void taskExecuted(Task<Object> task) {
+ if (task == getQuery) {
+ List<Object> quotes = (List<Object>)task.getResult();
+
+ // Preserve any existing sort and selection
+ Sequence<?> selectedStocks = stocksTableView.getSelectedRows();
+
+ List<Object> tableData = (List<Object>)stocksTableView.getTableData();
+ Comparator<Object> comparator = tableData.getComparator();
+ quotes.setComparator(comparator);
+
+ stocksTableView.setTableData(quotes);
+
+ if (selectedStocks.getLength() > 0) {
+ // Select current indexes of selected stocks
+ for (int i = 0, n = selectedStocks.getLength(); i < n; i++) {
+ Object selectedStock = selectedStocks.get(i);
+
+ int index = 0;
+ for (Object stock : stocksTableView.getTableData()) {
+ String symbol = JSONSerializer.getString(stock, "symbol");
+ String selectedSymbol = JSONSerializer.getString(selectedStock, "symbol");
+
+ if (symbol.equals(selectedSymbol)) {
+ stocksTableView.addSelectedIndex(index);
+ break;
+ }
- index++;
+ index++;
+ }
+ }
+ } else {
+ if (quotes.getLength() > 0) {
+ stocksTableView.setSelectedIndex(0);
}
}
- } else {
- if (quotes.getLength() > 0) {
- stocksTableView.setSelectedIndex(0);
- }
- }
- refreshDetail();
+ refreshDetail();
- DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG,
- DateFormat.MEDIUM, Locale.getDefault());
- lastUpdateLabel.setText(dateFormat.format(new Date()));
+ DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG,
+ DateFormat.MEDIUM, Locale.getDefault());
+ lastUpdateLabel.setText(dateFormat.format(new Date()));
- getQuery = null;
+ getQuery = null;
+ }
}
- }
- @Override
- public void executeFailed(Task<Object> task) {
- if (task == getQuery) {
- System.err.println(task.getFault());
- getQuery = null;
+ @Override
+ public void executeFailed(Task<Object> task) {
+ if (task == getQuery) {
+ System.err.println(task.getFault());
+ getQuery = null;
+ }
}
- }
- }));
+ }));
+ }
}
@SuppressWarnings("unchecked")
private void refreshDetail() {
- int firstSelectedIndex = stocksTableView.getFirstSelectedIndex();
- removeSymbolsButton.setEnabled(firstSelectedIndex != -1);
-
StockQuote stockQuote = null;
+ int firstSelectedIndex = stocksTableView.getFirstSelectedIndex();
if (firstSelectedIndex != -1) {
int lastSelectedIndex = stocksTableView.getLastSelectedIndex();
@@ -323,39 +399,4 @@
detailPane.load(stockQuote);
}
-
- @SuppressWarnings("unchecked")
- private void addSymbol() {
- String symbol = symbolTextInput.getText().toUpperCase();
- if (symbols.indexOf(symbol) == -1) {
- symbols.add(symbol);
-
- List<StockQuote> tableData = (List<StockQuote>)stocksTableView.getTableData();
- StockQuote stockQuote = new StockQuote();
- stockQuote.setSymbol(symbol);
- int index = tableData.add(stockQuote);
-
- stocksTableView.setSelectedIndex(index);
- }
-
- symbolTextInput.setText("");
- refreshTable();
- }
-
- private void removeSelectedSymbols() {
- int selectedIndex = stocksTableView.getFirstSelectedIndex();
- int selectionLength = stocksTableView.getLastSelectedIndex() - selectedIndex + 1;
- stocksTableView.getTableData().remove(selectedIndex, selectionLength);
- symbols.remove(selectedIndex, selectionLength);
-
- if (selectedIndex >= symbols.getLength()) {
- selectedIndex = symbols.getLength() - 1;
- }
-
- stocksTableView.setSelectedIndex(selectedIndex);
-
- if (selectedIndex == -1) {
- refreshDetail();
- }
- }
}
Modified: pivot/trunk/tutorials/src/org/apache/pivot/tutorials/stocktracker/stock_tracker_window.wtkx
URL: http://svn.apache.org/viewvc/pivot/trunk/tutorials/src/org/apache/pivot/tutorials/stocktracker/stock_tracker_window.wtkx?rev=920581&r1=920580&r2=920581&view=diff
==============================================================================
--- pivot/trunk/tutorials/src/org/apache/pivot/tutorials/stocktracker/stock_tracker_window.wtkx (original)
+++ pivot/trunk/tutorials/src/org/apache/pivot/tutorials/stocktracker/stock_tracker_window.wtkx Tue Mar 9 00:18:24 2010
@@ -41,25 +41,27 @@
<ScrollPane horizontalScrollBarPolicy="fill_to_capacity"
verticalScrollBarPolicy="fill_to_capacity">
<view>
- <TableView wtkx:id="stocksTableView" selectMode="multi"
- styles="{showHorizontalGridLines:false}">
- <columns>
- <TableView.Column name="symbol"
- headerData="%symbol" width="1*" />
- <TableView.Column name="value" headerData="%value" width="1*">
- <cellRenderer>
- <content:TableViewNumberCellRenderer styles="{horizontalAlignment:'right'}"
- numberFormat="$$0.00"/>
- </cellRenderer>
- </TableView.Column>
- <TableView.Column name="change" headerData="%change" width="1*">
- <cellRenderer>
- <stocktracker:ChangeCellRenderer styles="{horizontalAlignment:'right'}"
- numberFormat="+0.00;-0.00"/>
- </cellRenderer>
- </TableView.Column>
- </columns>
- </TableView>
+ <StackPane>
+ <TableView wtkx:id="stocksTableView" selectMode="multi"
+ styles="{showHorizontalGridLines:false}">
+ <columns>
+ <TableView.Column name="symbol"
+ headerData="%symbol" width="1*" />
+ <TableView.Column name="value" headerData="%value" width="1*">
+ <cellRenderer>
+ <content:TableViewNumberCellRenderer styles="{horizontalAlignment:'right'}"
+ numberFormat="$$0.00"/>
+ </cellRenderer>
+ </TableView.Column>
+ <TableView.Column name="change" headerData="%change" width="1*">
+ <cellRenderer>
+ <stocktracker:ChangeCellRenderer styles="{horizontalAlignment:'right'}"
+ numberFormat="+0.00;-0.00"/>
+ </cellRenderer>
+ </TableView.Column>
+ </columns>
+ </TableView>
+ </StackPane>
</view>
<columnHeader>