/* Copyright (c) 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package sample.spreadsheet.gui; import com.google.gdata.client.spreadsheet.FeedURLFactory; import com.google.gdata.client.spreadsheet.SpreadsheetService; import com.google.gdata.data.spreadsheet.SpreadsheetEntry; import com.google.gdata.data.spreadsheet.SpreadsheetFeed; import com.google.gdata.data.spreadsheet.WorksheetEntry; import com.google.gdata.data.spreadsheet.WorksheetFeed; import com.google.gdata.util.ServiceException; import java.awt.BorderLayout; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; /** * Window for selecting a spreadsheet. * * This is a little bit of a complicated class, but the main GData * parts to know are: * * - populateSpreadsheetList just makes a few calls in order to * get a list of spreadsheets * - populateWorksheetList will get a list of worksheets within * that spreadsheet * * */ public class ChooseSpreadsheetFrame extends JFrame { /** The Google Spreadsheets GData service. */ private SpreadsheetService service; private FeedURLFactory factory; private List<SpreadsheetEntry> spreadsheetEntries; private JList spreadsheetListBox; private List<WorksheetEntry> worksheetEntries; private JList worksheetListBox; private JTextField ajaxLinkField; private JTextField worksheetsFeedUrlField; private JTextField cellsFeedUrlField; private JTextField listFeedUrlField; private JButton viewWorksheetsButton; private JButton submitCellsButton; private JButton submitListButton; /** Starts the selection off with a spreadsheet feed helper. */ public ChooseSpreadsheetFrame(SpreadsheetService spreadsheetService) { service = spreadsheetService; factory = FeedURLFactory.getDefault(); initializeGui(); } /** * Gets the list of spreadsheets, and fills the list box. */ private void populateSpreadsheetList() { if (retrieveSpreadsheetList()) { fillSpreadsheetListBox(); } } /** * Asks Google Spreadsheets for a list of all the spreadsheets * the user has access to. * @return true if successful */ private boolean retrieveSpreadsheetList() { SpreadsheetFeed feed; try { feed = service.getFeed( factory.getSpreadsheetsFeedUrl(), SpreadsheetFeed.class); } catch (IOException e) { SpreadsheetApiDemo.showErrorBox(e); return false; } catch (ServiceException e) { SpreadsheetApiDemo.showErrorBox(e); return false; } this.spreadsheetEntries = feed.getEntries(); return true; } /** * Fills up the list-box of spreadsheets with the already-computed entries. */ private void fillSpreadsheetListBox() { String[] stringsForListbox = new String[spreadsheetEntries.size()]; for (int i = 0; i < spreadsheetEntries.size(); i++) { SpreadsheetEntry entry = spreadsheetEntries.get(i); // Title of Spreadsheet (author, updated 2006-6-20 7:30PM) stringsForListbox[i] = entry.getTitle().getPlainText() + " (" + entry.getAuthors().get(0).getEmail() + ", updated " + entry.getUpdated().toUiString() + ")"; } spreadsheetListBox.setListData(stringsForListbox); } /** * Gets the list of worksheets in the specified spreadsheet, * and fills the list box. * @param spreadsheet the selected spreadsheet */ private void populateWorksheetList(SpreadsheetEntry spreadsheet) { if (retrieveWorksheetList(spreadsheet)) { fillWorksheetListBox(spreadsheet.getTitle().getPlainText()); } } /** * Gets the list of worksheets from Google Spreadsheets. * @param spreadsheet the spreadsheet to get a list of worksheets for * @return true if successful */ private boolean retrieveWorksheetList(SpreadsheetEntry spreadsheet) { WorksheetFeed feed; try { feed = service.getFeed( spreadsheet.getWorksheetFeedUrl(), WorksheetFeed.class); } catch (IOException e) { SpreadsheetApiDemo.showErrorBox(e); return false; } catch (ServiceException e) { SpreadsheetApiDemo.showErrorBox(e); return false; } this.worksheetEntries = feed.getEntries(); return true; } /** * Fills up the list-box of worksheets with the already computed entries. */ private void fillWorksheetListBox(String spreadsheetTitle) { String[] stringsForListbox = new String[worksheetEntries.size()]; for (int i = 0; i < worksheetEntries.size(); i++) { WorksheetEntry entry = worksheetEntries.get(i); // Title Of Worksheet (T) stringsForListbox[i] = entry.getTitle().getPlainText() + " (in " + spreadsheetTitle + ")"; } worksheetListBox.setListData(stringsForListbox); } /** * Handles when a user presses the "View Worksheets" button. * */ private void handleViewWorksheetsButton() { int selected = spreadsheetListBox.getSelectedIndex(); if (spreadsheetEntries != null && selected >= 0) { populateWorksheetList(spreadsheetEntries.get(selected)); } } /** * Handles when a user presses a "View Cells Demo" button. */ private void handleSubmitCellsButton() { int selected = worksheetListBox.getSelectedIndex(); if (worksheetEntries != null && selected >= 0) { CellBasedSpreadsheetPanel.createWindow( service, worksheetEntries.get(selected).getCellFeedUrl()); } } /** * Handles when a user presses a "View List Demo" button. */ private void handleSubmitListButton() { int selected = worksheetListBox.getSelectedIndex(); if (worksheetEntries != null && selected >= 0) { ListBasedSpreadsheetPanel.createWindow(service, worksheetEntries.get(selected).getListFeedUrl()); } } /** * Shows the feed URL's as you select spreadsheets. */ private void handleSpreadsheetSelection() { int selected = spreadsheetListBox.getSelectedIndex(); if (spreadsheetEntries != null && selected >= 0) { SpreadsheetEntry entry = spreadsheetEntries.get(selected); ajaxLinkField.setText( entry.getHtmlLink().getHref()); worksheetsFeedUrlField.setText( entry.getWorksheetFeedUrl().toExternalForm()); } } /** * Shows the feed URL's as you select worksheets within a spreadsheets. */ private void handleWorksheetSelection() { int selected = worksheetListBox.getSelectedIndex(); if (worksheetEntries != null && selected >= 0) { WorksheetEntry entry = worksheetEntries.get(selected); cellsFeedUrlField.setText(entry.getCellFeedUrl().toExternalForm()); listFeedUrlField.setText(entry.getListFeedUrl().toExternalForm()); } } // ---- GUI code from here on down ---------------------------------------- private void initializeGui() { setTitle("Choose your Spreadsheet"); Container panel = getContentPane(); panel.setLayout(new GridLayout(2, 1)); // Top part - choose a spreadsheet JPanel spreadsheetPanel = new JPanel(); spreadsheetPanel.setLayout(new BorderLayout()); spreadsheetListBox = new JList(); spreadsheetPanel.add(new JScrollPane(spreadsheetListBox), BorderLayout.CENTER); spreadsheetListBox.addListSelectionListener(new ActionHandler()); Container topButtonsPanel = new JPanel(); topButtonsPanel.setLayout(new GridLayout(3, 1)); viewWorksheetsButton = new JButton("View Worksheets"); viewWorksheetsButton.addActionListener(new ActionHandler()); topButtonsPanel.add(viewWorksheetsButton); panel.add(spreadsheetPanel); ajaxLinkField = new JTextField(); ajaxLinkField.setEditable(false); topButtonsPanel.add(ajaxLinkField); worksheetsFeedUrlField = new JTextField(); worksheetsFeedUrlField.setEditable(false); topButtonsPanel.add(worksheetsFeedUrlField); spreadsheetPanel.add(topButtonsPanel, BorderLayout.SOUTH); panel.add(spreadsheetPanel); // Bottom part - choose a worksheet JPanel worksheetPanel = new JPanel(); worksheetPanel.setLayout(new BorderLayout()); worksheetListBox = new JList( new String[] { "[Please click 'View Worksheets' for a list.]" }); worksheetPanel.add(new JScrollPane(worksheetListBox), BorderLayout.CENTER); worksheetListBox.addListSelectionListener(new ActionHandler()); Container bottomButtonsPanel = new JPanel(); bottomButtonsPanel.setLayout(new GridLayout(4, 1)); submitCellsButton = new JButton("Cells Demo"); submitCellsButton.addActionListener(new ActionHandler()); bottomButtonsPanel.add(submitCellsButton); cellsFeedUrlField = new JTextField(); cellsFeedUrlField.setEditable(false); bottomButtonsPanel.add(cellsFeedUrlField); submitListButton = new JButton("List Demo"); submitListButton.addActionListener(new ActionHandler()); bottomButtonsPanel.add(submitListButton); listFeedUrlField = new JTextField(); listFeedUrlField.setEditable(false); bottomButtonsPanel.add(listFeedUrlField); worksheetPanel.add(bottomButtonsPanel, BorderLayout.SOUTH); panel.add(worksheetPanel); populateSpreadsheetList(); pack(); setSize(700, 600); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); } private class ActionHandler implements ActionListener, ListSelectionListener { public void actionPerformed(ActionEvent ae) { if (ae.getSource() == viewWorksheetsButton) { handleViewWorksheetsButton(); } else if (ae.getSource() == submitCellsButton) { handleSubmitCellsButton(); } else if (ae.getSource() == submitListButton) { handleSubmitListButton(); } } public void valueChanged(ListSelectionEvent e) { if (e.getSource() == spreadsheetListBox) { handleSpreadsheetSelection(); } else if (e.getSource() == worksheetListBox) { handleWorksheetSelection(); } } } }