View Javadoc

1   /*
2    *  File: TourenExample.java 
3    *  Copyright (c) 2004-2007  Peter Kliem (Peter.Kliem@jaret.de)
4    *  A commercial license is available, see http://www.jaret.de.
5    *
6    *  This program is free software; you can redistribute it and/or modify
7    *  it under the terms of the GNU General Public License as published by
8    *  the Free Software Foundation; either version 2 of the License, or
9    *  (at your option) any later version.
10   *
11   *  This program is distributed in the hope that it will be useful,
12   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   *  GNU General Public License for more details.
15   *
16   *  You should have received a copy of the GNU General Public License
17   *  along with this program; if not, write to the Free Software
18   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19   */
20  package de.jaret.examples.timebars.touren;
21  
22  import java.awt.BorderLayout;
23  import java.awt.Color;
24  import java.awt.Dimension;
25  import java.awt.Rectangle;
26  import java.beans.PropertyChangeEvent;
27  import java.beans.PropertyChangeListener;
28  
29  import javax.swing.JComponent;
30  import javax.swing.JFrame;
31  import javax.swing.JLabel;
32  import javax.swing.JPanel;
33  import javax.swing.JScrollPane;
34  import javax.swing.JSplitPane;
35  import javax.swing.JTable;
36  
37  import de.jaret.util.date.JaretDate;
38  import de.jaret.util.ui.timebars.TimeBarRowFilter;
39  import de.jaret.util.ui.timebars.TimeBarRowSorter;
40  import de.jaret.util.ui.timebars.model.DefaultTimeBarModel;
41  import de.jaret.util.ui.timebars.swing.TimeBarViewer;
42  
43  /***
44   * This example is a proof of concept showing trips from one point to another point ("Touren") in the timebarviewer and
45   * shows additional data in an attached JTable. Since newer versiocns of the viewer component scroll smooth - a feature
46   * the JTable lacks to have - the integration with th table is not as nice as it could be. For demonstration purposes a
47   * sorter and a filter can be chosen from comboboxes. Scaling is possible. Renderer for the tour elements is
48   * specialized. A gap renderer is used to render the point labels.
49   * 
50   * @author Peter Kliem
51   * @version $Id: TourenExample.java 275 2007-02-18 21:50:30Z olk $
52   */
53  public class TourenExample {
54  
55      public static void main(String[] args) {
56          JFrame f = new JFrame(TourenExample.class.getName());
57          f.setSize(1000, 600);
58          f.getContentPane().setLayout(new BorderLayout());
59          f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
60  
61          DefaultTimeBarModel model = new DefaultTimeBarModel();
62          JaretDate base = new JaretDate();
63          base.setHours(0);
64          base.setMinutes(0);
65          for (int d = 0; d < 3; d++) {
66              for (int i = 0; i < 330; i++) {
67                  Tour t = new Tour(d * 1000 + i, base);
68                  model.addRow(t);
69              }
70              base.advanceDays(1);
71          }
72  
73          final TimeBarViewer tbv = new TimeBarViewer(model, false, false);
74          tbv.setTimeScalePosition(TimeBarViewer.TIMESCALE_POSITION_TOP);
75          tbv.setStartDate(new JaretDate());
76          tbv.setDrawRowGrid(true);
77          tbv.setTimeBarRenderer(new TourenElementRenderer());
78          tbv.setPixelPerSecond(800.0 / (24.0 * 60.0 * 60.0));
79          tbv.setGapRenderer(new TourenGapRenderer());
80  
81          JPanel tablePanel = new JPanel();
82          tablePanel.setBackground(Color.YELLOW);
83          tablePanel.setLayout(new BorderLayout());
84  
85          final TourenTableModel tmodel = new TourenTableModel(model);
86          final JTable table = new JTable(tmodel);
87          final JScrollPane scroll = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_NEVER,
88                  JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
89          tablePanel.add(scroll, BorderLayout.CENTER);
90  
91          JComponent filler = new JLabel();
92          int height = tbv.getTimeScaleRenderer().getHeight() - table.getTableHeader().getPreferredSize().height;
93          Dimension size = new Dimension(20, height);
94          filler.setMinimumSize(size);
95          filler.setMaximumSize(size);
96          filler.setPreferredSize(size);
97          tablePanel.add(filler, BorderLayout.NORTH);
98  
99          table.setRowHeight(tbv.getRowHeight());
100         tbv.addPropertyChangeListener(new PropertyChangeListener() {
101 
102             public void propertyChange(PropertyChangeEvent evt) {
103                 if (evt.getPropertyName().equals("RowHeight")) {
104                     table.setRowHeight(tbv.getRowHeight());
105                     int firstrow = tbv.getFirstRowDisplayed();
106                     Rectangle rect = table.getCellRect(firstrow, 0, true);
107                     scroll.getVerticalScrollBar().setValue(rect.y);
108                 } else if (evt.getPropertyName().equals("FirstRow")) {
109                     int firstrow = tbv.getFirstRowDisplayed();
110                     Rectangle rect = table.getCellRect(firstrow, 0, true);
111                     scroll.getVerticalScrollBar().setValue(rect.y);
112                 } else if (evt.getPropertyName().equals("RowSorter")) {
113                     tmodel.setTimeBarRowSorter((TimeBarRowSorter) evt.getNewValue());
114                 } else if (evt.getPropertyName().equals("RowFilter")) {
115                     tmodel.setTimeBarRowFilter((TimeBarRowFilter) evt.getNewValue());
116                 }
117             }
118 
119         });
120 
121         JSplitPane splitter = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
122         splitter.add(tbv);
123         splitter.add(tablePanel);
124         f.getContentPane().add(splitter, BorderLayout.CENTER);
125 
126         // add the control panel
127         ControlPanel cp = new ControlPanel(tbv, null);
128         f.getContentPane().add(cp, BorderLayout.NORTH);
129 
130         f.setVisible(true);
131 
132         splitter.setDividerLocation(0.8);
133 
134     }
135 
136 }