source: ether_statistics/service/implementation/gov/noaa/pmel/sgt/beans/Page.java @ 569

Last change on this file since 569 was 569, checked in by vmipsl, 12 years ago

Nouveau projet

File size: 13.6 KB
Line 
1/*
2 * $Id: Page.java,v 1.12 2003/09/18 21:01:14 dwd Exp $
3 *
4 * This software is provided by NOAA for full, free and open release.  It is
5 * understood by the recipient/user that NOAA assumes no liability for any
6 * errors contained in the code.  Although this software is released without
7 * conditions or restrictions in its use, it is expected that appropriate
8 * credit be given to its author and to the National Oceanic and Atmospheric
9 * Administration should the software be included by the recipient as an
10 * element in other product development.
11 */
12
13package gov.noaa.pmel.sgt.beans;
14
15import gov.noaa.pmel.sgt.JPane;
16import gov.noaa.pmel.sgt.SGLabel;
17import gov.noaa.pmel.sgt.Layer;
18import gov.noaa.pmel.sgt.CartesianGraph;
19import gov.noaa.pmel.sgt.StackedLayout;
20import gov.noaa.pmel.sgt.swing.JClassTree;
21import gov.noaa.pmel.util.Dimension2D;
22import gov.noaa.pmel.util.Point2D;
23//import gov.noaa.pmel.util.SoTDomain;
24
25import java.awt.Graphics;
26import java.awt.Graphics2D;
27import java.awt.Color;
28import java.awt.Dimension;
29import java.awt.BorderLayout;
30import java.awt.Component;
31
32import java.util.Vector;
33import java.util.Iterator;
34import javax.swing.JComponent;
35import javax.swing.border.EtchedBorder;
36import javax.swing.border.Border;
37import java.awt.event.MouseAdapter;
38import java.awt.event.MouseEvent;
39import java.awt.event.InputEvent;
40import java.awt.Rectangle;
41import java.awt.Point;
42
43import java.beans.*;
44import java.io.*;
45import java.awt.print.PageFormat;
46import java.awt.print.PrinterException;
47import java.awt.print.Printable;
48
49/**
50 * Main SGT JavaBean in conjunction with a <code>DataModel</code> and <code>PanelModel</code>
51 * will create a graphic.
52 *
53 * <p> Some classes have been omitted for display purposes.
54 * <P ALIGN="CENTER"><IMG SRC="images/RunTimeSimple.png" ALIGN="BOTTOM" BORDER="0">
55 *
56 * @author Donald Denbo
57 * @version $Revision: 1.12 $, $Date: 2003/09/18 21:01:14 $
58 * @since 3.0
59 * @stereotype bean
60 **/
61public class Page extends JComponent implements PropertyChangeListener, Serializable, Printable {
62  public static final boolean DEBUG = false;
63  /**
64   * @link aggregation
65   * @supplierCardinality 1
66   * @undirected
67   * @label dataModel
68   */
69  private DataModel dataModel;
70
71  /**
72   * @link aggregation
73   * @supplierCardinality 1
74   * @undirected
75   * @label panelModel
76   */
77  private PanelModel panelModel;
78
79  /**
80   *@link aggregation
81   *     @associates <{Panel}>
82   * @supplierCardinality 1..*
83   * @clientCardinality 1
84   * @undirected
85   */
86//  transient private Vector panels_;
87
88  /**
89   * @link aggregationByValue
90   * @clientCardinality 1
91   * @supplierCardinality 1
92   * @undirected
93   * @label pane
94   */
95  private JPane pane_;
96  private String name;
97  transient private boolean isDesignTime_ = Beans.isDesignTime();
98
99  /**
100   * <code>Page</code> constructor.
101   */
102  public Page() {
103    pane_ = new JPane("SGT Bean Pane", new Dimension(200, 200));
104    pane_.addPropertyChangeListener(this);
105    pane_.setBackground(Color.white);
106    pane_.setOpaque(true);
107    this.setOpaque(true);
108    this.setLayout(new BorderLayout());
109    this.setBackground(Color.white);
110    this.add(pane_, BorderLayout.CENTER);
111    pane_.addMouseListener(new PageMouse());
112  }
113
114  /**
115   * Get <code>JPane</code> associated with <code>Page</code>
116   * @return JPane
117   */
118  public JPane getJPane() {
119    return pane_;
120  }
121
122  /**
123   * Get <code>JPane</code> size.
124   * @return JPane size
125   */
126  public Dimension getJPaneSize() {
127    return pane_.getSize();
128  }
129
130  protected void paintComponent(Graphics g) {
131    super.paintComponent(g);
132  }
133
134  /**
135   * Get <code>DataModel</code>.
136   * @return DataModel
137   * @see DataModel
138   */
139  public DataModel getDataModel() {
140      return dataModel;
141  }
142
143  /**
144   * Set <code>DataModel</code>. <code>DataModel</code> is used to define the
145   * relationship between <code>SGTData</code> and the graphical representation.
146   * @param dataModel DataModel
147   * @see DataModel
148   */
149  public void setDataModel(DataModel dataModel) {
150    if(DEBUG) System.out.println("Page.setDataModel()");
151
152    DataModel saved = this.dataModel;
153    if(this.dataModel != null) this.dataModel.removePropertyChangeListener(this);
154    if(dataModel != null) dataModel.addPropertyChangeListener(this);
155
156    this.dataModel = dataModel;
157    this.dataModel.setPage(this);
158    if(isDesignTime_) repaint();
159    firePropertyChange("dataModel", saved, this.dataModel);
160  }
161
162  /**
163   * Get <code>PanelModel</code>.
164   * @return PanelModel
165   * @see PanelModel
166   */
167  public PanelModel getPanelModel(){
168    return panelModel;
169  }
170
171  /**
172   * Set <code>PanelModel</code>.  The <code>PanelModel</code> contains the information
173   * that indicates placement of <code>Panel</code>s and <code>DataGroupLayer</code>s.
174   * @param panelModel PanelModel
175   * @see PanelModel
176   */
177  public void setPanelModel(PanelModel panelModel){
178    if(DEBUG) System.out.println("Page.setPanelModel()");
179    PanelModel saved = this.panelModel;
180    setSize(panelModel.getPageSize());
181    setBackground(panelModel.getPageBackgroundColor());
182    setPreferredSize(panelModel.getPageSize());
183    this.panelModel = panelModel;
184    this.panelModel.setPage(this);
185    updatePanels();
186    if(isDesignTime_) repaint();
187    firePropertyChange("panelModel", saved, this.panelModel);
188  }
189
190  public String getName() {
191    return name;
192  }
193  public void setBackground(Color color) {
194    super.setBackground(color);
195    pane_.setBackground(color);
196  }
197  public void setName(String name) {
198    firePropertyChange("name", this.name, name);
199    this.name = name;
200  }
201
202  public void propertyChange(PropertyChangeEvent evt) {
203    Object source = evt.getSource();
204    String property = evt.getPropertyName();
205    if(source instanceof PanelModel) {
206      if(DEBUG) System.out.println("Page.propertyChange(PanelModel): " + property);
207      updatePanels();
208    } else if(source instanceof DataModel) {
209      Object obj = evt.getNewValue();
210      if(obj instanceof DataHolder) {
211        try {
212          pane_.setBatch(true);
213          ((DataHolder)obj).notifyPanel();
214          pane_.setModified(true, "Page");
215          pane_.setBatch(false);
216        } catch (DataTargetMismatchException dtme) {
217          dtme.printStackTrace();
218        }
219      }
220      if(DEBUG) System.out.println("Page.propertyChange(DataModel): " + property);
221    } else if(source == pane_) {
222      if(property.equals("objectSelected")) {
223
224      } else if(property.equals("zoomRectangle")) {
225
226      }
227      if(DEBUG) System.out.println("Page.propertyChange(JPane): " + property);
228
229    }
230  }
231
232  private void updatePanels() {
233    // check for deleted PanelHolders
234    setSize(panelModel.getPageSize());
235    setBackground(panelModel.getPageBackgroundColor());
236    setPrintHAlign(panelModel.getPrintHAlign());
237    setPrintVAlign(panelModel.getPrintVAlign());
238    setPrintOrigin(panelModel.getPrintOrigin());
239    setPrintScaleMode(panelModel.getPrintScaleMode());
240    pane_.setBatch(true);
241    Component[] comps = pane_.getComponents();
242    for(int i=0; i < comps.length; i++) {
243      if(comps[i] instanceof Panel) {
244        Panel pnl = (Panel)comps[i];
245        if(!panelModel.hasPanelHolder(pnl.getName())) {
246          pane_.remove(pnl);
247        }
248      }
249    }
250    // check for new PanelHolders then create otherwise update
251    Panel panel = null;
252    Iterator phIter = panelModel.panelIterator();
253    while(phIter.hasNext()) {
254      PanelHolder ph = (PanelHolder)phIter.next();
255      panel = findPanel(ph);
256      if(panel == null) {
257        panel = new Panel(ph);
258        ph.setInstantiated(true);
259//        panel.setBorder(new EtchedBorder());
260        pane_.add(panel);
261      } else {
262        panel.update();
263      }
264    }
265    validate();
266    pane_.setModified(true, "Page");
267    pane_.setBatch(false);
268  }
269
270  /**
271   * Find the <code>Panel</code> associated with <code>PanelHolder</code>, a
272   * <code>PanelModel</code> component.
273   * @param pHolder PanelHolder
274   * @return Panel
275   * @see PanelModel
276   * @see PanelHolder
277   * @see Panel
278   */
279  public Panel findPanel(PanelHolder pHolder) {
280    Component[] comps = pane_.getComponents();
281    for(int i=0; i < comps.length; i++) {
282      if(comps[i] instanceof Panel) {
283        if(((Panel)comps[i]).getName().equals(pHolder.getId())) return (Panel)comps[i];
284      }
285    }
286    return null;
287  }
288
289  private void pageMousePressed(MouseEvent event) {
290    if(!event.isControlDown()) return;
291
292    pane_.setBatch(true);
293    Component[] comps = pane_.getComponents();
294    for(int i=0; i < comps.length; i++) {
295      if(comps[i] instanceof Panel) {
296        Panel pnl = (Panel)comps[i];
297        pnl.resetZoom(event.getX(), event.getY());
298      }
299    }
300    pane_.setBatch(false);
301  }
302
303  /**
304   * Reset the zoom for all <code>Panel</code>s and <code>DataGroupLayer</code>s.
305   */
306  public void resetZoom() {
307    pane_.setBatch(true);
308    Component[] comps = pane_.getComponents();
309    for(int i=0; i < comps.length; i++) {
310      if(comps[i] instanceof Panel) {
311        Panel pnl = (Panel)comps[i];
312        pnl.resetZoom();
313      }
314    }
315    pane_.setBatch(false);
316  }
317
318  private void pageMouseClicked(MouseEvent event) {
319    if(event.isControlDown()) return;  // ignore zoom resets
320    if(event.isPopupTrigger()) System.out.println("Page.pageMouseClicked(): isPopupTrigger()");
321    Object obj = pane_.getSelectedObject();
322    if((event.getModifiers()&InputEvent.BUTTON3_MASK) != 0) System.out.println("Page.pageMouseClicked(): Button3!");
323  }
324
325  private void pageMouseReleased(MouseEvent event) {
326    //
327    // continue only if button1 is pressed
328    //
329    if((event.getModifiers()&InputEvent.BUTTON1_MASK) == 0) return;
330    Rectangle zm = pane_.getZoomBounds();
331    Point zmStart = pane_.getZoomStart();
332    if(zm.width <= 1 || zm.height <= 1) return;
333
334    pane_.setBatch(true);
335    Component[] comps = pane_.getComponents();
336    for(int i=0; i < comps.length; i++) {
337      if(comps[i] instanceof Panel) {
338        Panel pnl = (Panel)comps[i];
339        pnl.zoomTo(zmStart, zm);
340      }
341    }
342    pane_.setBatch(false);
343  }
344
345  class PageMouse extends MouseAdapter  {
346    public void mousePressed(MouseEvent event) {
347      if(!pane_.isMouseEventsEnabled()) return;
348      pageMousePressed(event);
349    }
350
351    public void mouseClicked(MouseEvent event) {
352      if(!pane_.isMouseEventsEnabled()) return;
353      pageMouseClicked(event);
354    }
355
356    public void mouseReleased(MouseEvent event) {
357      if(!pane_.isMouseEventsEnabled()) return;
358      pageMouseReleased(event);
359    }
360  }
361  public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException {
362    int result = NO_SUCH_PAGE;
363    Color saveColor = getBackground();
364    if(panelModel.isPrintWhitePage()) {
365      setBackground(Color.white);
366    }
367    result = pane_.print(g, pf, pageIndex);
368    if(result == PAGE_EXISTS && panelModel.isPrintBorders()) {
369      Component[] comps = pane_.getComponents();
370       for(int i=0; i < comps.length; i++) {
371         if(comps[i] instanceof Panel) {
372           Panel pnl = (Panel)comps[i];
373           Rectangle r = pnl.getBounds();
374           Border bdr = pnl.getBorder();
375           bdr.paintBorder(pnl, g, r.x, r.y, r.width, r.height);
376         }
377       }
378    }
379    setBackground(saveColor);
380    return result;
381  }
382  /**
383   * Set printing  scale mode.  Legal values are AbstractPane.DEFAULT_SCALE,
384   * AbstractPane.TO_FIT, and AbstractPane.SHRINK_TO_FIT.  Default =
385   * AbstractPane.DEFAULT_SCALE.
386   * @param mode scale mode
387   * @see gov.noaa.pmel.sgt.AbstractPane#DEFAULT_SCALE AbstractPane.DEFAULT_SCALE
388   * @see gov.noaa.pmel.sgt.AbstractPane#TO_FIT AbstractPane.TO_FIT
389   * @see gov.noaa.pmel.sgt.AbstractPane#SHRINK_TO_FIT AbstractPane.SHRINK_TO_FIT
390   */
391  public void setPrintScaleMode(int mode) {
392    pane_.setPageScaleMode(mode);
393  }
394  /**
395   * Get printing scale mode.
396   * @return scale mode
397   */
398  public int  getPrintScaleMode() {
399    return pane_.getPageScaleMode();
400  }
401  /**
402   * Set vertical  alignment for printing.  Legal values are AbstractPane.TOP,
403   * AbstractPane.MIDDLE, AbstractPane.BOTTOM, and AbstractPane.SPECIFIED_LOCATION.
404   * Default = AbstractPane.TOP;
405   * @param pageVAlign vertical alignment
406   * @see gov.noaa.pmel.sgt.AbstractPane#TOP AbstractPane.TOP
407   * @see gov.noaa.pmel.sgt.AbstractPane#MIDDLE AbstractPane.MIDDLE
408   * @see gov.noaa.pmel.sgt.AbstractPane#BOTTOM AbstractPane.BOTTOM
409   * @see gov.noaa.pmel.sgt.AbstractPane#SPECIFIED_LOCATION AbstractPane.SPECIFIED_LOCATION
410   */
411  public void setPrintVAlign(int vert) {
412    pane_.setPageVAlign(vert);
413  }
414  /**
415   * Set horizontal alignment for printing.  Legal values are AbstractPane.LEFT,
416   * AbstractPane.CENTER, AbstractPane.RIGHT, and AbstractPane.SPECIFIED_LOCATION.
417   * Default = AbstractPane.CENTER.
418   * @param pageHAlign horizontal alignment
419   * @see gov.noaa.pmel.sgt.AbstractPane#LEFT AbstractPane.LEFT
420   * @see gov.noaa.pmel.sgt.AbstractPane#CENTER AbstractPane.CENTER
421   * @see gov.noaa.pmel.sgt.AbstractPane#RIGHT AbstractPane.RIGHT
422   * @see gov.noaa.pmel.sgt.AbstractPane#SPECIFIED_LOCATION AbstractPane.SPECIFIED_LOCATION
423   */
424  public void setPrintHAlign(int horz) {
425    pane_.setPageHAlign(horz);
426  }
427  /**
428   * Get vertical alignment for printing.
429   * @return vertical alignment.
430   */
431  public int getPrintVAlign() {
432    return pane_.getPageVAlign();
433  }
434  /**
435   * Get horizontal alignment for printing.
436   * @return horizontal alignment
437   */
438  public int getPrintHAlign() {
439    return pane_.getPageHAlign();
440  }
441  /**
442   * Set page origin for printing.  Will be used if the horizontal or vertical alignment is
443   * AbstractPane.SPECIFIED_LOCATION.  Default = (0,0).
444   * @param pageOrigin page origin
445   * @see gov.noaa.pmel.sgt.AbstractPane AbstractPane
446   */
447  public void setPrintOrigin(Point pt) {
448    pane_.setPageOrigin(pt);
449  }
450  /**
451   * Get page origin for printing.
452   * @return page origin.
453   */
454  public Point  getPrintOrigin() {
455    return pane_.getPageOrigin();
456  }
457}
Note: See TracBrowser for help on using the repository browser.