source: trunk/src/org/expeditee/items/widgets/DataFrameWidget.java@ 286

Last change on this file since 286 was 286, checked in by ra33, 16 years ago
File size: 3.6 KB
Line 
1package org.expeditee.items.widgets;
2
3import java.awt.Color;
4import java.awt.Graphics;
5import java.util.Collection;
6import java.util.HashSet;
7
8import javax.swing.JComponent;
9
10import org.expeditee.gui.Frame;
11import org.expeditee.gui.FrameIO;
12import org.expeditee.gui.FrameObserver;
13import org.expeditee.items.Item;
14import org.expeditee.items.ItemParentStateChangedEvent;
15import org.expeditee.items.Text;
16
17public abstract class DataFrameWidget extends InteractiveWidget implements
18 FrameObserver {
19
20 private boolean _needsUpdating;
21
22 protected Collection<Frame> _subjects = new HashSet<Frame>();
23
24 protected Frame _dataFrame;
25
26 protected DataFrameWidget(Text source, JComponent component, int minWidth,
27 int maxWidth, int minHeight, int maxHeight) {
28 this(source, component, minWidth, minWidth, maxWidth, minHeight,
29 minHeight, maxHeight);
30 }
31
32 public DataFrameWidget(Text source, JComponent component, int minWidth,
33 int defaultWidth, int maxWidth, int minHeight, int defaultHeight,
34 int maxHeight) {
35 super(source, component, minWidth, maxWidth, minHeight, maxHeight);
36 setSize(defaultWidth, defaultHeight);
37
38 String link = source.getAbsoluteLink();
39 _dataFrame = link != null ? FrameIO.LoadFrame(link) : null;
40 if (_dataFrame != null) {
41 addSubject(_dataFrame);
42 }
43 }
44
45 protected void setDataFrame(Frame newDataFrame) {
46 _dataFrame = newDataFrame;
47 }
48
49 public Frame getDataFrame() {
50 if (_dataFrame == null && getSource().getLink() != null) {
51 _dataFrame = FrameIO.LoadFrame(getSource().getAbsoluteLink());
52 if (_dataFrame != null) {
53 addSubject(_dataFrame);
54 } else {
55 // If the dataFrame has not been saved yet because it has just
56 // been
57 // created via TDFC this chart needs to be marked as changed so
58 // it will
59 // be refreshed when the user goes back
60 update();
61 }
62 }
63 return _dataFrame;
64 }
65
66 protected void clearSubjects() {
67 for (Frame frame : _subjects) {
68 frame.removeObserver(this);
69 }
70 _subjects.clear();
71 }
72
73 public void removeSubject(Frame frame) {
74 assert (frame != null);
75 _subjects.remove(frame);
76 frame.removeObserver(this);
77 // Reset the dataFrame if it is being removed from the cache to avoid
78 // memory leaks
79 if (frame == _dataFrame)
80 _dataFrame = null;
81 }
82
83 public void addSubject(Frame frame) {
84 assert (frame != null);
85 _subjects.add(frame);
86 frame.addObserver(this);
87 }
88
89 public boolean needsRefresh() {
90 return _needsUpdating;
91 }
92
93 public void refresh() {
94 _needsUpdating = false;
95 }
96
97 public void update() {
98 _needsUpdating = true;
99 }
100
101 @Override
102 public void setLink(String link) {
103 String newLink = Item.convertToAbsoluteLink(link);
104 String oldLink = getSource().getAbsoluteLink();
105 if ((newLink == null && oldLink == null)
106 || (newLink != null && newLink.equals(oldLink)))
107 return;
108 super.setLink(link);
109 clearSubjects();
110 setDataFrame(null);
111 refresh();
112 }
113
114 @Override
115 protected void onParentStateChanged(int eventType) {
116
117 switch (eventType) {
118
119 case ItemParentStateChangedEvent.EVENT_TYPE_ADDED:
120 case ItemParentStateChangedEvent.EVENT_TYPE_ADDED_VIA_OVERLAY:
121 case ItemParentStateChangedEvent.EVENT_TYPE_SHOWN:
122 case ItemParentStateChangedEvent.EVENT_TYPE_SHOWN_VIA_OVERLAY:
123 if (needsRefresh()) {
124 refresh();
125 }
126 break;
127
128 case ItemParentStateChangedEvent.EVENT_TYPE_REMOVED:
129 case ItemParentStateChangedEvent.EVENT_TYPE_REMOVED_VIA_OVERLAY:
130 case ItemParentStateChangedEvent.EVENT_TYPE_HIDDEN:
131 break;
132 }
133 }
134
135 protected void paintInFreeSpace(Graphics g) {
136 super.paintInFreeSpace(g);
137 g.setFont(((Text)getSource()).getFont());
138 g.setColor(Color.WHITE);
139 g.drawString(this.getClass().getSimpleName(), getX() + 10, getY() + 20);
140
141 }
142}
Note: See TracBrowser for help on using the repository browser.