/* | |
* ****************************************************************************** | |
* Copyright (C) 2007, International Business Machines Corporation and others. | |
* All Rights Reserved. | |
* ****************************************************************************** | |
*/ | |
package com.ibm.icu.dev.tool.tzu; | |
import java.awt.Component; | |
import java.awt.datatransfer.StringSelection; | |
import java.awt.event.ActionEvent; | |
import java.awt.event.ActionListener; | |
import java.awt.event.KeyAdapter; | |
import java.awt.event.KeyEvent; | |
import java.awt.event.MouseEvent; | |
import java.awt.event.MouseListener; | |
import java.io.File; | |
import java.net.URL; | |
import javax.swing.BoxLayout; | |
import javax.swing.JButton; | |
import javax.swing.JComboBox; | |
import javax.swing.JComponent; | |
import javax.swing.JFileChooser; | |
import javax.swing.JLabel; | |
import javax.swing.JMenuItem; | |
import javax.swing.JPanel; | |
import javax.swing.JPopupMenu; | |
import javax.swing.JScrollPane; | |
import javax.swing.JSeparator; | |
import javax.swing.JTable; | |
/** | |
* The path list GUI component. | |
*/ | |
public class ResultComponent extends JComponent { | |
/** | |
* The serializable UID. | |
*/ | |
public static final long serialVersionUID = 1341; | |
/** | |
* A cancel search button to cancel a search if one is currently occuring. | |
*/ | |
private JButton resultCancelSearchButton = new JButton("Stop Search"); | |
/** | |
* A cancel update button to cancel an update if one is currently occuring. | |
*/ | |
private JButton resultCancelUpdateButton = new JButton("Stop Update"); | |
/** | |
* The dialog that comes up when the browse button is clicked. | |
*/ | |
private JFileChooser resultChooser = new JFileChooser(); | |
/** | |
* A menu item for copying a filename to the clipboard. | |
*/ | |
private JMenuItem resultCopyItem = new JMenuItem("Copy Selected"); | |
/** | |
* The model for all the results from a search. | |
*/ | |
private ResultModel resultModel; | |
/** | |
* The panel where option components are shown. | |
*/ | |
private JPanel resultOptionPanel = new JPanel(); | |
/** | |
* The context menu that pops up with more options. | |
*/ | |
private JPopupMenu resultPopup = new JPopupMenu(); | |
/** | |
* A menu item for <code>pathPopup</code> to remove all files from the | |
* result model. | |
*/ | |
private JMenuItem resultRemoveAllItem = new JMenuItem("Remove All"); | |
/** | |
* A menu item for <code>pathPopup</code> to remove the selected files | |
* from the result model. | |
*/ | |
private JMenuItem resultRemoveSelectedItem = new JMenuItem( | |
"Remove Selected Items"); | |
/** | |
* The label for the result source list. | |
*/ | |
private JLabel resultSourceLabel = new JLabel("New Time Zone Version: "); | |
/** | |
* The combobox for choosing which timezone resource on the web to use in an | |
* update. | |
*/ | |
private JComboBox resultSourceList = new JComboBox(); | |
/** | |
* The panel where status components are shown. | |
*/ | |
private JPanel resultStatusPanel = new JPanel(); | |
/** | |
* The label for the path list. | |
*/ | |
private JLabel resultTableLabel = new JLabel("ICU4J Jar Files found:"); | |
/** | |
* The table where the result model is shown. | |
*/ | |
private JTable resultTable = new JTable(); | |
/** | |
* A menu item for <code>pathPopup</code> to update all files in the | |
* result model. | |
*/ | |
private JMenuItem resultUpdateAllItem = new JMenuItem("Update All"); | |
/** | |
* An update button to update the selected files, or all files if none are | |
* selected. | |
*/ | |
private JButton resultUpdateSelectedButton = new JButton("Update Selected"); | |
/** | |
* The panel where update components are shown. | |
*/ | |
private JPanel resultUpdatePanel = new JPanel(); | |
/** | |
* A menu item for <code>pathPopup</code> to update the selected files in | |
* the result model. | |
*/ | |
private JMenuItem resultUpdateSelectedItem = new JMenuItem( | |
"Update Selected Items"); | |
/** | |
* The model for all the timezone resources on the web. | |
*/ | |
private SourceModel sourceModel; | |
/** | |
* The status bar for status messages. | |
*/ | |
private JLabel statusBar = new JLabel(); | |
/** | |
* @param owner | |
* The GUILoader object that ownes this component. | |
*/ | |
public ResultComponent(final GUILoader owner) { | |
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); | |
add(resultTableLabel); | |
add(new JScrollPane(resultTable)); | |
add(resultStatusPanel); | |
add(resultOptionPanel); | |
add(resultUpdatePanel); | |
resultStatusPanel.add(statusBar); | |
resultOptionPanel.add(resultSourceLabel); | |
resultOptionPanel.add(resultSourceList); | |
resultUpdatePanel.add(resultCancelSearchButton); | |
resultUpdatePanel.add(resultUpdateSelectedButton); | |
resultUpdatePanel.add(resultCancelUpdateButton); | |
resultChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); | |
resultPopup.add(resultCopyItem); | |
resultPopup.add(new JSeparator()); | |
resultPopup.add(resultRemoveSelectedItem); | |
resultPopup.add(resultRemoveAllItem); | |
resultPopup.add(new JSeparator()); | |
resultPopup.add(resultUpdateSelectedItem); | |
resultPopup.add(resultUpdateAllItem); | |
resultTable.addMouseListener(new MouseListener() { | |
public void mouseClicked(MouseEvent event) { | |
checkPopup(event); | |
} | |
public void mouseEntered(MouseEvent event) { | |
checkPopup(event); | |
} | |
public void mouseExited(MouseEvent event) { | |
checkPopup(event); | |
} | |
public void mousePressed(MouseEvent event) { | |
checkPopup(event); | |
} | |
public void mouseReleased(MouseEvent event) { | |
checkPopup(event); | |
} | |
private void checkPopup(MouseEvent event) { | |
if (event.isPopupTrigger()) | |
resultPopup.show((Component) event.getSource(), event | |
.getX(), event.getY()); | |
} | |
}); | |
resultTable.addKeyListener(new KeyAdapter() { | |
public void keyPressed(KeyEvent event) { | |
int code = event.getKeyCode(); | |
if (code == KeyEvent.VK_DELETE | |
|| code == KeyEvent.VK_BACK_SPACE) | |
resultModel.remove(resultTable.getSelectedRows()); | |
} | |
}); | |
resultCopyItem.addActionListener(new ActionListener() { | |
public void actionPerformed(ActionEvent event) { | |
String selection = ""; | |
int[] rows = resultTable.getSelectedRows(); | |
for (int i = 0; i < rows.length; i++) | |
selection += new File(resultModel.getValueAt(rows[i], | |
ResultModel.COLUMN_FILE_PATH).toString(), | |
resultModel.getValueAt(rows[i], | |
ResultModel.COLUMN_FILE_NAME).toString()) | |
.toString() | |
+ "\n"; | |
getToolkit().getSystemClipboard().setContents( | |
new StringSelection(selection), null); | |
} | |
}); | |
resultRemoveSelectedItem.addActionListener(new ActionListener() { | |
public void actionPerformed(ActionEvent event) { | |
resultModel.remove(resultTable.getSelectedRows()); | |
} | |
}); | |
resultRemoveAllItem.addActionListener(new ActionListener() { | |
public void actionPerformed(ActionEvent event) { | |
resultModel.removeAll(); | |
} | |
}); | |
resultUpdateSelectedItem.addActionListener(new ActionListener() { | |
public void actionPerformed(ActionEvent event) { | |
owner | |
.update(resultTable.getSelectedRows(), | |
getSelectedSource()); | |
} | |
}); | |
resultUpdateAllItem.addActionListener(new ActionListener() { | |
public void actionPerformed(ActionEvent event) { | |
owner.updateAll(getSelectedSource()); | |
} | |
}); | |
resultUpdateSelectedButton.addActionListener(new ActionListener() { | |
public void actionPerformed(ActionEvent event) { | |
int[] indices = resultTable.getSelectedRows(); | |
if (indices.length > 0) | |
owner.update(indices, getSelectedSource()); | |
} | |
}); | |
resultCancelSearchButton.addActionListener(new ActionListener() { | |
public void actionPerformed(ActionEvent event) { | |
owner.cancelSearch(); | |
} | |
}); | |
resultCancelUpdateButton.addActionListener(new ActionListener() { | |
public void actionPerformed(ActionEvent event) { | |
owner.cancelUpdate(); | |
} | |
}); | |
} | |
/** | |
* Returns the status bar. | |
* | |
* @return The status bar. | |
*/ | |
public JLabel getStatusBar() { | |
return statusBar; | |
} | |
/** | |
* Sets whether the cancel search button should be enabled. | |
* | |
* @param value | |
* Whether the cancel search button should be enabled. | |
*/ | |
public void setCancelSearchEnabled(boolean value) { | |
resultCancelSearchButton.setEnabled(value); | |
} | |
/** | |
* Sets whether the cancel update button should be enabled. | |
* | |
* @param value | |
* Whether the cancel update button should be enabled. | |
*/ | |
public void setCancelUpdateEnabled(boolean value) { | |
resultCancelUpdateButton.setEnabled(value); | |
} | |
/** | |
* Sets the result model. | |
* | |
* @param resultModel | |
* The result model. | |
*/ | |
public void setResultModel(ResultModel resultModel) { | |
this.resultModel = resultModel; | |
resultTable.setModel(resultModel); | |
} | |
/** | |
* Sets the source model. | |
* | |
* @param sourceModel | |
* The source model. | |
*/ | |
public void setSourceModel(SourceModel sourceModel) { | |
this.sourceModel = sourceModel; | |
resultSourceList.setModel(sourceModel); | |
} | |
/** | |
* Sets whether the update button should be enabled. | |
* | |
* @param value | |
* Whether the update button should be enabled. | |
*/ | |
public void setUpdateEnabled(boolean value) { | |
resultUpdateSelectedButton.setEnabled(value); | |
} | |
/** | |
* Returns the URL of the currently selected item in the result source list. | |
* | |
* @return The URL of the currently selected item in the result source list. | |
*/ | |
private URL getSelectedSource() { | |
return sourceModel.getURL(resultSourceList.getSelectedItem()); | |
} | |
} |