View Javadoc

1   /*
2    *  File: ControlPanel2.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.pdi.swing;
21  
22  import java.awt.FlowLayout;
23  import java.awt.datatransfer.DataFlavor;
24  import java.awt.datatransfer.Transferable;
25  import java.awt.dnd.DnDConstants;
26  import java.awt.dnd.DropTargetAdapter;
27  import java.awt.dnd.DropTargetDragEvent;
28  import java.awt.dnd.DropTargetDropEvent;
29  import java.awt.event.ActionEvent;
30  import java.awt.event.ActionListener;
31  import java.util.Iterator;
32  import java.util.List;
33  
34  import javax.swing.AbstractAction;
35  import javax.swing.JButton;
36  import javax.swing.JCheckBox;
37  import javax.swing.JComboBox;
38  import javax.swing.JPanel;
39  import javax.swing.JSlider;
40  import javax.swing.event.ChangeEvent;
41  import javax.swing.event.ChangeListener;
42  
43  import de.jaret.examples.timebars.pdi.model.Assignment;
44  import de.jaret.examples.timebars.pdi.model.Duty;
45  import de.jaret.util.date.Interval;
46  import de.jaret.util.misc.PropertyObservableBase;
47  import de.jaret.util.ui.timebars.AbstractTimeBarIntervalFilter;
48  import de.jaret.util.ui.timebars.TimeBarIntervalFilter;
49  import de.jaret.util.ui.timebars.TimeBarMarkerImpl;
50  import de.jaret.util.ui.timebars.TimeBarRowFilter;
51  import de.jaret.util.ui.timebars.TimeBarRowSorter;
52  import de.jaret.util.ui.timebars.model.TimeBarRow;
53  import de.jaret.util.ui.timebars.model.TimeBarSelectionListener;
54  import de.jaret.util.ui.timebars.model.TimeBarSelectionModel;
55  import de.jaret.util.ui.timebars.swing.TimeBarViewer;
56  import de.jaret.util.ui.timebars.swing.dnd.IntervalListTransferable;
57  import de.jaret.util.ui.timebars.swing.dnd.RowIntervalTuple;
58  import de.jaret.util.ui.timebars.swing.renderer.DefaultGapRenderer;
59  
60  /***
61   * @author Peter Kliem
62   * @version $Id: ControlPanel2.java 426 2007-05-13 15:41:49Z olk $
63   */
64  public class ControlPanel2 extends JPanel implements ChangeListener, ActionListener {
65      TimeBarViewer _viewer;
66      JSlider _timeScaleSlider;
67      JSlider _rowHeigthSlider;
68      JComboBox _sorterCombo;
69      JComboBox _filterCombo;
70      JComboBox _intervalFilterCombo;
71      TimeBarMarkerImpl _marker;
72      JButton _freisetzenButton;
73  
74      public ControlPanel2(TimeBarViewer viewer, TimeBarMarkerImpl marker) {
75          _viewer = viewer;
76          _marker = marker;
77          setLayout(new FlowLayout());
78          createControls();
79      }
80  
81      /***
82       * 
83       */
84      private void createControls() {
85          _timeScaleSlider = new JSlider(50, 500);
86          _timeScaleSlider.addChangeListener(this);
87          _timeScaleSlider.setValue((int) (_viewer.getPixelPerSecond() * 60.0 * 60.0 * 24));
88          add(_timeScaleSlider);
89          _rowHeigthSlider = new JSlider(10, 300);
90          _rowHeigthSlider.addChangeListener(this);
91          _rowHeigthSlider.setValue(_viewer.getRowHeight());
92          add(_rowHeigthSlider);
93  
94          _sorterCombo = new JComboBox();
95          _sorterCombo.addItem("No sorter");
96          _sorterCombo.addItem(new FullerSorter());
97          _sorterCombo.addActionListener(this);
98          add(_sorterCombo);
99  
100         _filterCombo = new JComboBox();
101         _filterCombo.addItem("No Filter");
102         _filterCombo.addItem(new EmptyFilter());
103         _filterCombo.addActionListener(this);
104         add(_filterCombo);
105 
106         _intervalFilterCombo = new JComboBox();
107         _intervalFilterCombo.addItem("No Interval Filter");
108         _intervalFilterCombo.addItem(new OffenFilter());
109         _intervalFilterCombo.addActionListener(this);
110         add(_intervalFilterCombo);
111 
112         final JCheckBox gapCheck = new JCheckBox("GapRenderer");
113         gapCheck.setSelected(_viewer.getGapRenderer() != null);
114         gapCheck.addActionListener(new ActionListener() {
115             public void actionPerformed(ActionEvent e) {
116                 if (gapCheck.isSelected()) {
117                     _viewer.setGapRenderer(new DefaultGapRenderer());
118                 } else {
119                     _viewer.setGapRenderer(null);
120                 }
121             }
122         });
123         add(gapCheck);
124 
125         final JCheckBox optScrollingCheck = new JCheckBox("Optimize scrolling");
126         optScrollingCheck.setSelected(_viewer.getOptimizeScrolling());
127         optScrollingCheck.addActionListener(new ActionListener() {
128             public void actionPerformed(ActionEvent e) {
129                 _viewer.setOptimizeScrolling(optScrollingCheck.isSelected());
130             }
131         });
132         add(optScrollingCheck);
133 
134     }
135 
136     public void stateChanged(ChangeEvent e) {
137         if (e.getSource() == _timeScaleSlider) {
138             double pixPerSecond = (double) _timeScaleSlider.getValue() / (24.0 * 60 * 60);
139             _viewer.setPixelPerSecond(pixPerSecond);
140         } else if (e.getSource() == _rowHeigthSlider) {
141             _viewer.setRowHeight(_rowHeigthSlider.getValue());
142         }
143     }
144 
145     class FreisetzenAction extends AbstractAction implements TimeBarSelectionListener {
146         TimeBarSelectionModel _selModel;
147 
148         public FreisetzenAction(TimeBarSelectionModel selModel) {
149             _selModel = selModel;
150             _selModel.addTimeBarSelectionListener(this);
151             setName("Freisetzen");
152         }
153 
154         public void actionPerformed(ActionEvent e) {
155             List selIntervals = _selModel.getSelectedIntervals();
156             Iterator it = selIntervals.iterator();
157             while (it.hasNext()) {
158                 Interval interval = (Interval) it.next();
159                 if (interval instanceof Assignment) {
160                     Assignment v = (Assignment) interval;
161                     v.getPersonenDispo().remVerplanung(v);
162                 }
163             }
164         }
165 
166         public void selectionChanged(TimeBarSelectionModel selectionModel) {
167             setEnabled(selectionModel.hasIntervalSelection());
168         }
169 
170         public void elementAddedToSelection(TimeBarSelectionModel selectionModel, Object element) {
171             setEnabled(selectionModel.hasIntervalSelection());
172         }
173 
174         public void elementRemovedFromSelection(TimeBarSelectionModel selectionModel, Object element) {
175             setEnabled(selectionModel.hasIntervalSelection());
176         }
177 
178     }
179 
180     class FreisetzenDropTargetListener extends DropTargetAdapter {
181 
182         public void dragOver(DropTargetDragEvent e) {
183             if (e.isDataFlavorSupported(IntervalListTransferable.intervalListFlavor)) {
184                 e.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
185             }
186         }
187 
188         public void drop(DropTargetDropEvent e) {
189             System.out.println("Freisetzen Drop!");
190             try {
191                 Transferable tr = e.getTransferable();
192                 DataFlavor[] flavors = tr.getTransferDataFlavors();
193                 for (int i = 0; i < flavors.length; i++) {
194                     if (flavors[i].equals(IntervalListTransferable.intervalListFlavor)) {
195                         // e.rejectDrop();
196                         e.acceptDrop(e.getDropAction());
197                         List l = (List) e.getTransferable()
198                                 .getTransferData(IntervalListTransferable.intervalListFlavor);
199                         List intervals = ((RowIntervalTuple) l.get(0)).getIntervals();
200                         Iterator it = intervals.iterator();
201                         while (it.hasNext()) {
202                             Interval interval = (Interval) it.next();
203                             if (interval instanceof Assignment) {
204                                 Assignment v = (Assignment) interval;
205                                 v.getPersonenDispo().remVerplanung(v);
206                             }
207                         }
208                         e.dropComplete(true);
209                     }
210                 }
211             } catch (Throwable t) {
212                 t.printStackTrace();
213             }
214             e.rejectDrop();
215         }
216     }
217 
218     class FullerSorter extends PropertyObservableBase implements TimeBarRowSorter {
219         public int compare(TimeBarRow o1, TimeBarRow o2) {
220             TimeBarRow r1 = (TimeBarRow) o1;
221             TimeBarRow r2 = (TimeBarRow) o2;
222             return r2.getIntervals().size() - r1.getIntervals().size();
223         }
224 
225         public String toString() {
226             return "ElementCountSorter";
227         }
228     }
229 
230     class EmptyFilter extends PropertyObservableBase implements TimeBarRowFilter {
231         public boolean isInResult(TimeBarRow row) {
232             return row.getIntervals().size() > 0;
233         }
234 
235         public String toString() {
236             return "No Empty rows";
237         }
238     }
239 
240     class OffenFilter extends AbstractTimeBarIntervalFilter implements TimeBarIntervalFilter {
241         public boolean isInResult(Interval interval) {
242             return ((Duty) interval).getAssignedTo() == null;
243         }
244 
245         public String toString() {
246             return "Nur offene Dienste";
247         }
248     }
249 
250     public void actionPerformed(ActionEvent e) {
251         if (e.getSource() == _sorterCombo) {
252             Object sel = _sorterCombo.getSelectedItem();
253             if (sel instanceof TimeBarRowSorter) {
254                 _viewer.setRowSorter((TimeBarRowSorter) sel);
255             } else {
256                 _viewer.setRowSorter(null);
257             }
258         } else if (e.getSource() == _filterCombo) {
259             Object sel = _filterCombo.getSelectedItem();
260             if (sel instanceof TimeBarRowFilter) {
261                 _viewer.setRowFilter((TimeBarRowFilter) sel);
262             } else {
263                 _viewer.setRowFilter(null);
264             }
265         } else if (e.getSource() == _intervalFilterCombo) {
266             Object sel = _intervalFilterCombo.getSelectedItem();
267             if (sel instanceof TimeBarIntervalFilter) {
268                 _viewer.setIntervalFilter((TimeBarIntervalFilter) sel);
269             } else {
270                 _viewer.setIntervalFilter(null);
271             }
272         }
273     }
274 
275 }