1   package org.wcb.gui.forms;
2   
3   import org.wcb.gui.table.model.AirportModel;
4   import org.wcb.gui.renderer.EditButtonTableCellEditor;
5   import org.wcb.gui.renderer.ColorRowsTableCellRender;
6   import org.wcb.gui.renderer.SelectButtonTableCellEditor;
7   import org.wcb.gui.renderer.DeleteButtonTableCellEditor;
8   import org.wcb.gui.dialog.AirportEntryDialog;
9   import org.wcb.gui.dialog.AirportTableDisplayDialog;
10  import org.wcb.gui.component.WaveButton;
11  import org.wcb.gui.component.JXTitlePanel;
12  import org.wcb.gui.component.border.SearchFieldBorder;
13  import org.wcb.model.vo.hibernate.AirportBO;
14  import org.wcb.resources.MessageResourceRegister;
15  import org.wcb.resources.MessageKey;
16  import org.jdesktop.swingx.border.DropShadowBorder;
17  
18  import javax.swing.*;
19  import javax.swing.border.Border;
20  import javax.swing.border.CompoundBorder;
21  import java.awt.*;
22  import java.awt.event.ActionEvent;
23  import java.awt.event.ActionListener;
24  import java.awt.event.KeyListener;
25  import java.awt.event.KeyEvent;
26  
27  /**
28   * <small>
29   * Copyright (c)  2006  wbogaardt.
30   * This library is free software; you can redistribute it and/or
31   * modify it under the terms of the GNU Lesser General Public
32   * License as published by the Free Software Foundation; either
33   * version 2.1 of the License, or (at your option) any later version.
34   *
35   * This library is distributed in the hope that it will be useful,
36   * but WITHOUT ANY WARRANTY; without even the implied warranty of
37   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
38   * Lesser General Public License for more details.
39   *
40   * You should have received a copy of the GNU Lesser General Public
41   * License along with this library; if not, write to the Free Software
42   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
43   * <p/>
44   * $File:  $ <br>
45   * $Change:  $ submitted by $Author: wbogaardt $ at $DateTime: Mar 29, 2006 3:30:26 PM $ <br>
46   * </small>
47   *
48   * @author wbogaardt
49   * @version 1
50   *          Date: Mar 29, 2006
51   *          Time: 3:30:26 PM
52   */
53  
54  public class AirportTableDisplayForm extends JXTitlePanel implements ActionListener, KeyListener {
55  
56      private JButton jButtonAddAirport;
57      private JTextField searchField;
58      private JTable jTableAirport;
59      private AirportModel tableModel;
60      private AirportBO oSelectAirport;
61      private AirportTableDisplayDialog parentDialog;
62  
63      public AirportTableDisplayForm(JDialog parent, boolean showSelect) {
64          super("Airport View", new Color(0x522aec));
65          Border shadow = new DropShadowBorder(Color.BLACK, 1, 5, .3f, 15, true, true, true, true);
66          setBorder(new CompoundBorder(shadow, getBorder()));
67          if (parent instanceof AirportTableDisplayDialog)
68          {
69              parentDialog = (AirportTableDisplayDialog) parent;
70          }
71          if (showSelect) {
72              tableModel = new AirportModel();
73              jTableAirport = new JTable(tableModel);
74              new SelectButtonTableCellEditor(jTableAirport, 0, this);
75              new EditButtonTableCellEditor(jTableAirport, 5);
76              new DeleteButtonTableCellEditor(jTableAirport, 6);
77          } else {
78              tableModel = new AirportModel(new String[] {"ICAO", "FAA", "Name", "Location", "", ""});
79              jTableAirport = new JTable(tableModel);
80              new EditButtonTableCellEditor(jTableAirport, 4);
81              new DeleteButtonTableCellEditor(jTableAirport, 5);
82          }
83  
84          this.initComponents();
85      }
86  
87  
88      public void refresh(){
89          if (tableModel != null) {
90              tableModel.refreshModel();
91          }
92      }
93  
94      private void initComponents() {
95          this.setBackground(new Color(224, 224, 224));
96          jButtonAddAirport = new WaveButton(MessageResourceRegister.getInstance().getValue(MessageKey.BUTTON_ADD_AIRPORT));
97          searchField = new JTextField(20);
98          searchField.addKeyListener(this);
99          searchField.setBorder(new SearchFieldBorder());
100         tableModel.refreshModel();
101         jTableAirport.setDefaultRenderer(String.class, new ColorRowsTableCellRender());
102         //TableUtils.setColumnWidths(jTableAirport,jTableAirport.getInsets(), false, true);
103         jTableAirport.setAutoResizeMode(JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);
104 
105         setLayout(new BorderLayout());
106 
107         JScrollPane jScrollPane1 = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
108         jScrollPane1.setBorder(BorderFactory.createTitledBorder("Airports"));
109         jScrollPane1.setViewportView(jTableAirport);
110 
111         JPanel jPanelSouth = new JPanel();
112         GridBagConstraints gridBagConstraints;
113         jPanelSouth.setLayout(new GridBagLayout());
114         gridBagConstraints = new GridBagConstraints();
115         gridBagConstraints.anchor = GridBagConstraints.EAST;
116         jPanelSouth.add(jButtonAddAirport, gridBagConstraints);
117 
118         JPanel jSearchPanel = new JPanel();
119         jSearchPanel.add(new JLabel(MessageResourceRegister.getInstance().getValue(MessageKey.LABEL_SEARCH)));
120         jSearchPanel.add(searchField);
121 
122         add(jSearchPanel, BorderLayout.NORTH);
123         add(jScrollPane1, java.awt.BorderLayout.CENTER);
124         add(jPanelSouth, BorderLayout.SOUTH);
125         initListeners();
126     }
127 
128     private void initListeners() {
129         jButtonAddAirport.addActionListener(this);
130     }
131 
132     /**
133      * access to the selected row of the table
134      * @return  The selected row.
135      */
136     public AirportBO getSelectedRow() {
137         if (oSelectAirport == null)
138         {
139             return tableModel.getItemAt(jTableAirport.getSelectedRow());
140         }
141         return oSelectAirport;
142     }
143 
144     public void setSelectedRow(AirportBO value) {
145         oSelectAirport = value;
146         if (parentDialog != null)
147         {
148             parentDialog.fireAirportSelected();
149         }
150     }
151 
152     public void actionPerformed(ActionEvent evt) {
153         Object src = evt.getSource();
154         if (src.equals(jButtonAddAirport))
155         {
156             AirportEntryDialog addAirport = new AirportEntryDialog(this);
157             addAirport.setVisible(true);
158         }
159     }
160 
161     private void search() {
162         String searchString = searchField.getText().toUpperCase();
163         if (searchString.length() > 0) {
164             //If it doesn't start with the IAOC lettering then pre-append it
165             if(!searchString.startsWith("K")) {
166                 searchString = "K" + searchString;
167             }
168             for (int icount = 0; icount < tableModel.getRowCount(); icount++ ) {
169                 AirportBO airport = tableModel.getItemAt(icount);
170                 if(airport.getIcao().startsWith(searchString)) {
171                     this.centerSelectionOnTable(icount);
172                     break;
173                 } else if (airport.getName().toUpperCase().startsWith(searchField.getText().toUpperCase())) {
174                     this.centerSelectionOnTable(icount);
175                     break;
176                 }
177             }
178         }
179     }
180 
181     private void centerSelectionOnTable(int icount) {
182         jTableAirport.setRowSelectionInterval(icount, icount);
183         Rectangle visibleRect = jTableAirport.getVisibleRect();
184         int centerY = visibleRect.y + visibleRect.height/2;
185         Rectangle cellRectangle = jTableAirport.getCellRect(icount, 0, true);
186         if (centerY < cellRectangle.y) {
187             //need to scroll UP
188             cellRectangle.y = cellRectangle.y - visibleRect.y + centerY;
189         } else {
190             //need to scroll DOWN
191             cellRectangle.y = cellRectangle.y + visibleRect.y - centerY;
192         }
193         jTableAirport.scrollRectToVisible(cellRectangle);
194     }
195 
196     public void keyTyped(KeyEvent kvt) {
197         this.search();
198     }
199 
200     public void keyPressed(KeyEvent evt) {
201         // this.search();
202     }
203 
204     public void keyReleased(KeyEvent evt) {
205         // this.search();
206     }
207 }