View Javadoc

1   /*
2    *  File: FancyExample.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.fancy.swt;
21  
22  import java.util.ArrayList;
23  import java.util.List;
24  
25  import org.eclipse.jface.window.ApplicationWindow;
26  import org.eclipse.swt.SWT;
27  import org.eclipse.swt.events.MouseAdapter;
28  import org.eclipse.swt.events.MouseEvent;
29  import org.eclipse.swt.events.SelectionAdapter;
30  import org.eclipse.swt.events.SelectionEvent;
31  import org.eclipse.swt.layout.GridData;
32  import org.eclipse.swt.layout.GridLayout;
33  import org.eclipse.swt.layout.RowLayout;
34  import org.eclipse.swt.widgets.Button;
35  import org.eclipse.swt.widgets.Composite;
36  import org.eclipse.swt.widgets.Control;
37  import org.eclipse.swt.widgets.Label;
38  import org.eclipse.swt.widgets.Scale;
39  import org.eclipse.swt.widgets.Shell;
40  
41  import de.jaret.examples.timebars.fancy.model.FancyInterval;
42  import de.jaret.examples.timebars.fancy.model.ModelCreator;
43  import de.jaret.examples.timebars.fancy.swt.renderer.FancyEventRenderer;
44  import de.jaret.examples.timebars.fancy.swt.renderer.FancyGlobalRenderer;
45  import de.jaret.examples.timebars.fancy.swt.renderer.FancyRenderer;
46  import de.jaret.util.date.Event;
47  import de.jaret.util.date.Interval;
48  import de.jaret.util.date.IntervalImpl;
49  import de.jaret.util.date.JaretDate;
50  import de.jaret.util.ui.timebars.TimeBarViewerDelegate;
51  import de.jaret.util.ui.timebars.mod.DefaultIntervalModificator;
52  import de.jaret.util.ui.timebars.model.DefaultTimeBarRowModel;
53  import de.jaret.util.ui.timebars.model.FocussedIntervalListener;
54  import de.jaret.util.ui.timebars.model.IRowHeightStrategy;
55  import de.jaret.util.ui.timebars.model.ITimeBarViewState;
56  import de.jaret.util.ui.timebars.model.TimeBarModel;
57  import de.jaret.util.ui.timebars.model.TimeBarRow;
58  import de.jaret.util.ui.timebars.model.TimeBarSelectionListener;
59  import de.jaret.util.ui.timebars.model.TimeBarSelectionModel;
60  import de.jaret.util.ui.timebars.swt.TimeBarViewer;
61  import de.jaret.util.ui.timebars.swt.renderer.BoxTimeScaleRenderer;
62  import de.jaret.util.ui.timebars.swt.renderer.DefaultTitleRenderer;
63  import de.jaret.util.ui.timebars.swt.util.TimeScaleDragSupport;
64  
65  /***
66   * This example will demonstrate some fancy drawing.
67   * 
68   * @author Peter Kliem
69   * @version $Id: FancyExample.java 801 2008-12-27 22:44:54Z kliem $
70   */
71  public class FancyExample extends ApplicationWindow {
72      private static TimeBarViewer _tbv;
73  
74      public FancyExample() {
75          super(null);
76      }
77  
78      protected Control createContents(Composite parent) {
79          GridLayout gridLayout = new GridLayout();
80          gridLayout.numColumns = 1;
81          parent.setLayout(gridLayout);
82  
83          TimeBarModel model = ModelCreator.createModel();
84  
85          GridData gd = new GridData(GridData.FILL_BOTH);
86  
87          _tbv = new TimeBarViewer(parent, SWT.H_SCROLL | SWT.V_SCROLL);
88          _tbv.setLayoutData(gd);
89  
90          _tbv.setTimeScalePosition(TimeBarViewer.TIMESCALE_POSITION_TOP);
91          _tbv.setModel(model);
92          _tbv.addIntervalModificator(new DefaultIntervalModificator());
93  
94          _tbv.setPixelPerSecond(0.05);
95          _tbv.setDrawRowGrid(true);
96  
97          _tbv.setSelectionDelta(6);
98  
99          // configure the title renderer with a background image and set the title
100         DefaultTitleRenderer titleRenderer = new DefaultTitleRenderer();
101         titleRenderer.setBackgroundRscName("/de/jaret/examples/timebars/hierarchy/swt/titlebg.png");
102         _tbv.setTitleRenderer(titleRenderer);
103         _tbv.setTitle("Fancy");
104         _tbv.setTimeScaleRenderer(new BoxTimeScaleRenderer());
105 
106         // register the fancy renderer
107         _tbv.registerTimeBarRenderer(FancyInterval.class, new FancyRenderer());
108         // register the event renderer
109         _tbv.registerTimeBarRenderer(Event.class, new FancyEventRenderer());
110         
111         
112         _tbv.setGlobalAssistantRenderer(new FancyGlobalRenderer());
113         
114         // enable dragging of the scale
115         TimeScaleDragSupport scaleDragger = new TimeScaleDragSupport(_tbv);
116         
117         
118         
119         FancyControlPanel ctrl = new FancyControlPanel(parent, SWT.NULL, _tbv);
120         gd = new GridData(GridData.FILL_HORIZONTAL);
121         ctrl.setLayoutData(gd);
122 
123         // add a listener for doubleclicks
124         // shows how to get intervals from a point
125         _tbv.addMouseListener(new MouseAdapter() {
126             public void mouseDoubleClick(MouseEvent e) {
127                 List<Interval> intervals = _tbv.getIntervalsAt(e.x, e.y);
128                 if (intervals != null && intervals.size() > 0) {
129                     for (Interval interval : intervals) {
130                         System.out.println("Doubleclicked: " + interval.toString());
131                         FancyInterval fi = (FancyInterval)interval;
132                         fi.setState(!fi.getState());
133                     }
134                 }
135             }
136         });
137 
138 
139         // additional controls
140         Composite addPanel = new Composite(parent, SWT.NULL);
141         gd = new GridData(GridData.FILL_HORIZONTAL);
142         addPanel.setLayoutData(gd);
143         addPanel.setLayout(new RowLayout());
144 
145         final Button addIntervals = new Button(addPanel, SWT.PUSH);
146         addIntervals.setText("Add intervals to selected row");
147         addIntervals.addSelectionListener(new SelectionAdapter() {
148             @Override
149             public void widgetSelected(SelectionEvent e) {
150                 List<TimeBarRow> selectedRows = _tbv.getSelectionModel().getSelectedRows();
151                 if (selectedRows.size() == 1) {
152                     // create some random intervals and add them at once
153                     List<Interval> intervals = new ArrayList<Interval>();
154                     for (int i = 0; i < 5; i++) {
155                         Interval interval = new IntervalImpl();
156                         JaretDate startDate = _tbv.getStartDate().copy().advanceHours(Math.random() * 10);
157                         JaretDate endDate = startDate.copy().advanceHours(Math.random() * 5);
158                         interval.setBegin(startDate);
159                         interval.setEnd(endDate);
160                         intervals.add(interval);
161                     }
162                     // add all intervals at once
163                     ((DefaultTimeBarRowModel) selectedRows.get(0)).addIntervals(intervals);
164                 }
165             }
166         });
167 
168         final Button clearIntervals = new Button(addPanel, SWT.PUSH);
169         clearIntervals.setText("Clear selected row");
170         clearIntervals.addSelectionListener(new SelectionAdapter() {
171             @Override
172             public void widgetSelected(SelectionEvent e) {
173                 List<TimeBarRow> selectedRows = _tbv.getSelectionModel().getSelectedRows();
174                 if (selectedRows.size() == 1) {
175                     // correct selection
176                     _tbv.getSelectionModel().remSelectedIntervals(
177                             ((DefaultTimeBarRowModel) selectedRows.get(0)).getIntervals());
178                     // clear all intervals at once
179                     ((DefaultTimeBarRowModel) selectedRows.get(0)).clear();
180                 }
181             }
182         });
183         final Button remIntervals = new Button(addPanel, SWT.PUSH);
184         remIntervals.setText("Remove selected intervals");
185         remIntervals.addSelectionListener(new SelectionAdapter() {
186             @Override
187             public void widgetSelected(SelectionEvent e) {
188                 List<Interval> selectedIntervals = _tbv.getSelectionModel().getSelectedIntervals();
189                 if (selectedIntervals.size() > 0) {
190                     selectedIntervals = new ArrayList<Interval>(selectedIntervals);
191                     // remove from selection
192                     _tbv.getSelectionModel().remSelectedIntervals(selectedIntervals);
193                     // go through all rows, try to remove the intervals
194                     // (This is the hard way ...)
195                     for (int i = 0; i < _tbv.getModel().getRowCount(); i++) {
196                         ((DefaultTimeBarRowModel) _tbv.getModel().getRow(i)).remIntervals(selectedIntervals);
197                     }
198                 }
199             }
200         });
201         final Button changeIntervals = new Button(addPanel, SWT.PUSH);
202         changeIntervals.setText("Change selected intervals");
203         changeIntervals.addSelectionListener(new SelectionAdapter() {
204             @Override
205             public void widgetSelected(SelectionEvent e) {
206                 List<Interval> selectedIntervals = _tbv.getSelectionModel().getSelectedIntervals();
207                 if (selectedIntervals.size() > 0) {
208                     for (Interval interval : selectedIntervals) {
209                         // can be done like this (discouraged): interval.getBegin().advanceHours(1);
210                         interval.setBegin(interval.getBegin().copy().advanceHours(1));
211                     }
212                 }
213             }
214         });
215 
216         addIntervals.setEnabled(false);
217         clearIntervals.setEnabled(false);
218         remIntervals.setEnabled(false);
219         changeIntervals.setEnabled(false);
220         _tbv.getSelectionModel().addTimeBarSelectionListener(new TimeBarSelectionListener() {
221 
222             private void check(TimeBarSelectionModel selectionModel) {
223                 boolean oneRowSelected = selectionModel.getSelectedRows().size() == 1;
224                 addIntervals.setEnabled(oneRowSelected);
225                 clearIntervals.setEnabled(oneRowSelected);
226 
227                 boolean containsIntervals = selectionModel.getSelectedIntervals().size() > 0;
228                 remIntervals.setEnabled(containsIntervals);
229                 changeIntervals.setEnabled(containsIntervals);
230             }
231 
232             public void elementAddedToSelection(TimeBarSelectionModel selectionModel, Object element) {
233                 check(selectionModel);
234             }
235 
236             public void elementRemovedFromSelection(TimeBarSelectionModel selectionModel, Object element) {
237                 check(selectionModel);
238             }
239 
240             public void selectionChanged(TimeBarSelectionModel selectionModel) {
241                 check(selectionModel);
242             }
243 
244         });
245 
246         // Strategy checkbox
247         final Button heightStrategyCheck = new Button(addPanel, SWT.CHECK);
248         heightStrategyCheck.setText("Height strategy");
249         heightStrategyCheck.setSelection(_tbv.getTimeBarViewState().getRowHeightStrategy() != null);
250         heightStrategyCheck.addSelectionListener(new SelectionAdapter() {
251 
252             public void widgetSelected(SelectionEvent e) {
253                 if (heightStrategyCheck.getSelection()) {
254                     _tbv.getTimeBarViewState().setRowHeightStrategy(new IRowHeightStrategy() {
255                         public int calculateRowHeight(TimeBarViewerDelegate delegate,
256                                 ITimeBarViewState timeBarViewState, TimeBarRow row) {
257                             int maxOverlap = timeBarViewState.getDefaultRowHeight();
258                             int height = delegate.getMaxOverlapCount(row) * maxOverlap;
259                             return height;
260                         }
261 
262                         public boolean overrideDefault() {
263                             return true;
264                         }
265                     });
266                 } else {
267                     _tbv.getTimeBarViewState().setRowHeightStrategy(null);
268                 }
269 
270             }
271 
272         });
273 
274         // slider for the percentage
275         Label l = new Label(addPanel, SWT.NULL);
276         l.setText("Percentage:");
277 
278         final Scale percentageScale = new Scale(addPanel, SWT.HORIZONTAL);
279         percentageScale.setMaximum(100);
280         percentageScale.setMinimum(0);
281         percentageScale.setEnabled(false);
282         percentageScale.addSelectionListener(new SelectionAdapter() {
283             public void widgetSelected(SelectionEvent ev) {
284                 int val = percentageScale.getSelection();
285                 FancyInterval interval = (FancyInterval)_tbv.getFocussedInterval();
286                 if (interval != null) {
287                     interval.setPercentage(val);
288                 }
289             }
290         });
291 
292         // focussed interval listener enabling and disabling the perecentage scale
293         _tbv.addFocussedIntervalListener(new FocussedIntervalListener() {
294             public void focussedIntervalChanged(Object source, TimeBarRow row, Interval interval) {
295                 if (interval != null && interval instanceof FancyInterval) {
296                     percentageScale.setEnabled(true);
297                     percentageScale.setSelection(((FancyInterval)interval).getPercentage());
298                 } else {
299                     percentageScale.setEnabled(false);
300                 }
301             }
302             
303         });
304         
305         
306         return _tbv;
307     }
308 
309 
310     protected void configureShell(Shell shell) {
311         super.configureShell(shell);
312         shell.setText(getClass().getName());
313     }
314 
315     public static void main(String[] args) {
316         FancyExample test = new FancyExample();
317         test.setBlockOnOpen(true);
318         test.open();
319     }
320 
321 
322 
323 }