📄 stockdatabasejdialog.java
字号:
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Copyright (C) 2008 Yan Cheng Cheok <yccheok@yahoo.com>
*/
package org.yccheok.jstock.gui;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import javax.swing.DefaultCellEditor;
import javax.swing.JFormattedTextField;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.RowFilter;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.yccheok.jstock.engine.Code;
import org.yccheok.jstock.engine.MutableStockCodeAndSymbolDatabase;
import org.yccheok.jstock.engine.Stock;
import org.yccheok.jstock.engine.StockCodeAndSymbolDatabase;
import org.yccheok.jstock.engine.Symbol;
/**
*
* @author yccheok
*/
public class StockDatabaseJDialog extends javax.swing.JDialog {
/** Creates new form StockDatabaseJDialog */
public StockDatabaseJDialog(java.awt.Frame parent, StockCodeAndSymbolDatabase stockCodeAndSymbolDatabase, boolean modal) {
super(parent, modal);
this.mutableStockCodeAndSymbolDatabase = new MutableStockCodeAndSymbolDatabase(stockCodeAndSymbolDatabase);
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
jPanel6 = new javax.swing.JPanel();
jXHeader1 = new org.jdesktop.swingx.JXHeader();
jPanel4 = new javax.swing.JPanel();
jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
jTable1 = new javax.swing.JTable();
jPanel3 = new javax.swing.JPanel();
jTextField1 = new javax.swing.JTextField();
jPanel2 = new javax.swing.JPanel();
jScrollPane2 = new javax.swing.JScrollPane();
jTable2 = new javax.swing.JTable();
jPanel5 = new javax.swing.JPanel();
jButton1 = new javax.swing.JButton();
jButton2 = new javax.swing.JButton();
jPanel7 = new javax.swing.JPanel();
jButton3 = new javax.swing.JButton();
jButton4 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Stock Database");
setResizable(false);
addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
formMouseClicked(evt);
}
});
jPanel6.setLayout(new java.awt.BorderLayout(5, 5));
jXHeader1.setDescription("If you cannot find your stock symbol in the official database downloaded from stock exchange server, you may add your stock manually into the user defined database.");
jXHeader1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/64x64/db_add.png"))); // NOI18N
jXHeader1.setTitle("Stock Database");
jXHeader1.setToolTipText("");
jPanel6.add(jXHeader1, java.awt.BorderLayout.CENTER);
getContentPane().add(jPanel6, java.awt.BorderLayout.NORTH);
jPanel4.setLayout(new java.awt.GridLayout());
jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Stock Exchange Server (Read only)"));
jPanel1.setLayout(new java.awt.BorderLayout());
jTable1.setAutoCreateRowSorter(true);
jTable1.setModel(getCodeSymbolTableModel());
this.jTable1.setDefaultRenderer(Symbol.class, new StockTableCellRenderer());
this.jTable1.setDefaultRenderer(Code.class, new StockTableCellRenderer());
jScrollPane1.setViewportView(jTable1);
jPanel1.add(jScrollPane1, java.awt.BorderLayout.CENTER);
jTextField1.setColumns(10);
jTextField1.getDocument().addDocumentListener(
new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
newFilter();
}
public void insertUpdate(DocumentEvent e) {
newFilter();
}
public void removeUpdate(DocumentEvent e) {
newFilter();
}
});
jPanel3.add(jTextField1);
jPanel1.add(jPanel3, java.awt.BorderLayout.NORTH);
jPanel4.add(jPanel1);
jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("User Defined"));
jPanel2.setLayout(new java.awt.BorderLayout());
jTable2.setAutoCreateRowSorter(true);
jTable2.setModel(getSymbolTableModel());
jTable2.setCellEditor(getSymbolCellEditor());
this.jTable2.addMouseListener(new TableRowPopupListener());
this.jTable2.setDefaultRenderer(Symbol.class, new StockTableCellRenderer());
this.jTable2.setDefaultEditor(Symbol.class, this.getSymbolCellEditor());
//this.jTable2.setDefaultEditor(Object.class, this.getSymbolCellEditor());
jTable2.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
jTable2KeyPressed(evt);
}
});
jScrollPane2.setViewportView(jTable2);
jPanel2.add(jScrollPane2, java.awt.BorderLayout.CENTER);
jButton1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/16x16/filenew.png"))); // NOI18N
jButton1.setText("New");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
jPanel5.add(jButton1);
jButton2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/16x16/editdelete.png"))); // NOI18N
jButton2.setText("Delete");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
jPanel5.add(jButton2);
jPanel2.add(jPanel5, java.awt.BorderLayout.PAGE_START);
jPanel4.add(jPanel2);
getContentPane().add(jPanel4, java.awt.BorderLayout.CENTER);
jButton3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/16x16/apply.png"))); // NOI18N
jButton3.setText("OK");
jButton3.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton3ActionPerformed(evt);
}
});
jPanel7.add(jButton3);
jButton4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/16x16/button_cancel.png"))); // NOI18N
jButton4.setText("Cancel");
jButton4.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton4ActionPerformed(evt);
}
});
jPanel7.add(jButton4);
getContentPane().add(jPanel7, java.awt.BorderLayout.PAGE_END);
pack();
}// </editor-fold>//GEN-END:initComponents
private void formMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseClicked
// TODO add your handling code here:
clearAllTablesSelection();
}//GEN-LAST:event_formMouseClicked
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
// TODO add your handling code here:
addNewSymbol();
}//GEN-LAST:event_jButton1ActionPerformed
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
// TODO add your handling code here:
deleteSelectedUserDefinedDatabase();
}//GEN-LAST:event_jButton2ActionPerformed
private void jTable2KeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTable2KeyPressed
if(KeyEvent.VK_DELETE == evt.getKeyCode()) {
this.deleteSelectedUserDefinedDatabase();
return;
}
}//GEN-LAST:event_jTable2KeyPressed
public MutableStockCodeAndSymbolDatabase getMutableStockCodeAndSymbolDatabase()
{
return result;
}
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton4ActionPerformed
// TODO add your handling code here:
this.result = null;
this.setVisible(false);
this.dispose();
}//GEN-LAST:event_jButton4ActionPerformed
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed
final SymbolTableModel model = (SymbolTableModel)(jTable2.getModel());
List<Symbol> symbols = model.getSymbols();
final List<Symbol> oldSymbols = this.mutableStockCodeAndSymbolDatabase.getUserDefinedSymbol();
for(Symbol symbol : oldSymbols) {
this.mutableStockCodeAndSymbolDatabase.removeUserDefinedSymbol(symbol);
}
for(Symbol symbol : symbols) {
if(symbol.toString().length() <= 0) {
continue;
}
this.mutableStockCodeAndSymbolDatabase.addUserDefinedSymbol(symbol);
}
result = mutableStockCodeAndSymbolDatabase;
this.setVisible(false);
this.dispose();
}//GEN-LAST:event_jButton3ActionPerformed
private class TableRowPopupListener extends MouseAdapter {
@Override
public void mousePressed(MouseEvent e) {
maybeShowPopup(e);
}
@Override
public void mouseReleased(MouseEvent e) {
maybeShowPopup(e);
}
private void maybeShowPopup(MouseEvent e) {
if (e.isPopupTrigger()) {
getMyJTablePopupMenu().show(e.getComponent(), e.getX(), e.getY());
}
}
}
private static final class StockTableCellRenderer extends javax.swing.table.DefaultTableCellRenderer {
/** Creates a new instance of StockTableCellRender */
public StockTableCellRenderer() {
super();
}
private Color getBackgroundColor(int row) {
final JStockOptions jStockOptions = MainFrame.getJStockOptions();
if(row % 2 == 0) {
return jStockOptions.getFirstRowBackgroundColor();
}
return jStockOptions.getSecondRowBackgroundColor();
}
@Override
public Component getTableCellRendererComponent(
JTable table, Object color,
boolean isSelected, boolean hasFocus,
int row, int column) {
Component c = super.getTableCellRendererComponent(table, color, isSelected, hasFocus, row, column);
if(isSelected || hasFocus) return c;
final JStockOptions jStockOptions = MainFrame.getJStockOptions();
c.setForeground(jStockOptions.getNormalTextForegroundColor());
c.setBackground(getBackgroundColor(row));
return c;
}
}
private void deleteSelectedUserDefinedDatabase() {
int rows[] = jTable2.getSelectedRows();
final SymbolTableModel symbolTableModel = (SymbolTableModel)(jTable2.getModel());
Arrays.sort(rows);
for(int i=rows.length-1; i>=0; i--) {
int row = rows[i];
if(row < 0) continue;
final int modelIndex = jTable2.getRowSorter().convertRowIndexToModel(row);
symbolTableModel.removeRow(modelIndex);
}
}
private void clearAllTablesSelection() {
this.jTable1.getSelectionModel().clearSelection();
this.jTable2.getSelectionModel().clearSelection();
}
private void selectUserDefinedDatabaseTable(int modelIndex) {
clearAllTablesSelection();
final int selectedViewIndex = jTable2.getRowSorter().convertRowIndexToView(modelIndex);
jTable2.getSelectionModel().setSelectionInterval(selectedViewIndex, selectedViewIndex);
JTableUtilities.scrollToVisible(jTable2, selectedViewIndex, 0);
}
private void selectStockExchangeServerDatabaseTable(int modelIndex) {
clearAllTablesSelection();
final int selectedViewIndex = jTable1.getRowSorter().convertRowIndexToView(modelIndex);
jTable1.getSelectionModel().setSelectionInterval(selectedViewIndex, selectedViewIndex);
JTableUtilities.scrollToVisible(jTable1, selectedViewIndex, 0);
}
private void addNewSymbol()
{
final SymbolTableModel model = (SymbolTableModel)jTable2.getModel();
final int selectedModelIndex = model.addNewSymbol();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -