Source code: com/arranger/jarl/shell/views/mainShellPanes/MSPRenderStatusPane.java
1 package com.arranger.jarl.shell.views.mainShellPanes;
2
3 import com.arranger.jarl.Jarl;
4 import com.arranger.jarl.widget.container.EchoCollection;
5 import com.arranger.jarl.base.*;
6 import com.arranger.jarl.filter.IFilter;
7 import com.arranger.jarl.shell.models.BaseModel;
8 import com.arranger.jarl.shell.models.JarlContextModel;
9 import com.arranger.jarl.util.Debug;
10 import com.arranger.jarl.util.JarlInfoUtil;
11
12 import javax.swing.*;
13 import java.awt.*;
14 import java.util.Collection;
15 import java.util.Iterator;
16
17 /**
18 * MSPRenderStatusPane created on Apr 21, 2003
19 */
20 public class MSPRenderStatusPane extends BaseMSP implements IStatusListener, IRenderListener {
21 protected static final int PREP_RANGE = 30;
22 protected static final int RENDER_RANGE = 70;
23
24 protected JTextField m_textField;
25 protected JProgressBar m_progressBar;
26 protected double m_increment = 10;
27 protected int m_incrementCount = 0;
28
29 /**
30 * Create a component
31 * @return
32 */
33 public Component createComponent() {
34 JPanel renderStatusPanel = new JPanel(new GridLayout(2, 1));
35
36 //status field
37 m_textField = new JTextField("<status>");
38 m_textField.setEditable(false);
39 renderStatusPanel.add(m_textField);
40
41 //progress bar
42 m_progressBar = new JProgressBar(JProgressBar.HORIZONTAL);
43 m_progressBar.setMinimum(0);
44 m_progressBar.setMaximum(100);
45 renderStatusPanel.add(m_progressBar);
46
47 //title
48 renderStatusPanel.setBorder(BorderFactory.createTitledBorder("Render Status"));
49 return renderStatusPanel;
50 }
51
52 /**
53 * Events have been fired
54 * @param baseModel
55 * @param propertyName
56 */
57 public void onChange(BaseModel baseModel, String propertyName) {
58 if (!(baseModel instanceof JarlContextModel)) {
59 return;
60 }
61
62 JarlContextModel jarlContextModel = (JarlContextModel) baseModel;
63 if (JarlContextModel.RENDER_PREPARING.equals(propertyName)) {
64 m_textField.setText("Preparing...");
65 m_progressBar.setValue(0);
66 m_increment = 10;
67 m_incrementCount = 0;
68 } else if (JarlContextModel.RENDER_PROCESSING_CONFIG.equals(propertyName)) { //this is matched with initialized
69 m_textField.setText("Started...");
70 Jarl jarl = jarlContextModel.getJarl();
71 jarl.getContext().addStatusListener(this);
72 jarl.getRenderManager().addRenderListener(this);
73 increment();
74 m_progressBar.setIndeterminate(true);
75 } else if (JarlContextModel.INITIALIZED.equals(propertyName)) {
76 m_textField.setText("Jarl Project Initialized...");
77
78 m_progressBar.setIndeterminate(false);
79 } else if (JarlContextModel.RENDER_STARTING.equals(propertyName)) {
80
81 //determine what the increment will be
82 double totalSize = calculateNumOfRenderingWidgets(jarlContextModel);
83 //totalSize += 3; // i think there are 3 extra calls to onStatus
84 m_increment = (double) RENDER_RANGE / totalSize;
85
86 } else if (JarlContextModel.RENDER_COMPLETED.equals(propertyName)) {
87 m_progressBar.setIndeterminate(false); //just in case
88 m_progressBar.setValue(100);
89 m_textField.setText("Completed.");
90 } else if (JarlContextModel.ERROR.equals(propertyName)) {
91 m_progressBar.setIndeterminate(false); //just in case
92 }
93 }
94
95 /**
96 * This is to determine how many widgets will be rendered
97 * @param jarlContextModel
98 */
99 private double calculateNumOfRenderingWidgets(JarlContextModel jarlContextModel) {
100 IRenderManager renderManager = jarlContextModel.getJarl().getRenderManager();
101 Collection widgets = renderManager.getRegisteredWidgets();
102 Collection filters = renderManager.getRegisteredFilters();
103 double totalSize = filters.size() * 3; //triple weight filters
104 totalSize += widgets.size();
105 totalSize += countCollection(widgets);
106 return totalSize;
107 }
108
109 /**
110 * Recurse through collections
111 * @param widgets
112 */
113 private double countCollection(Collection widgets) {
114 double totalSize = 0;
115 for (Iterator it = widgets.iterator(); it.hasNext();) {
116 Object obj = it.next();
117 if (obj instanceof IJarlObjectCollection) {
118 IJarlObjectCollection col = (IJarlObjectCollection) obj;
119 double childrenCount = col.getChildren().size();
120 childrenCount += countCollection(col.getChildren());
121 totalSize += childrenCount;
122
123 if (col instanceof EchoCollection) {
124 EchoCollection echoCollection = (EchoCollection)col;
125 totalSize += (echoCollection.getNumEchos().getFrame() * childrenCount);
126 }
127 }
128 }
129 return totalSize;
130 }
131
132 protected void increment() {
133 m_incrementCount++;
134 m_progressBar.setValue(PREP_RANGE + (int) (m_increment * m_incrementCount));
135 }
136
137 /**
138 * A simple message
139 * @param message
140 */
141 public void onStatus(String message) {
142 m_textField.setText(message);
143 //increment();
144 }
145
146 /**
147 * An error occurred
148 * @param throwable
149 */
150 public void onError(Throwable throwable) {
151 m_progressBar.setIndeterminate(false); //just in case
152 m_textField.setText("Error Occurred...");
153 String title = throwable.getMessage();
154 if (title == null) {
155 title = "Null Pointer Exception";
156 }
157 JOptionPane.showMessageDialog(null, Debug.getStackTrace(throwable), title, JOptionPane.ERROR_MESSAGE);
158 }
159
160 /**
161 * Rendering the jarl object at this context
162 * @param jarlObject
163 * @param context
164 */
165 public void onRender(IJarlObject jarlObject, IContext context) {
166 onStatus("Rendering: " + JarlInfoUtil.getName(jarlObject));
167 increment();
168 if (jarlObject instanceof IFilter) {
169 increment();
170 increment(); //times 3 total
171 }
172 }
173
174 public void onRenderFrameStart(IContext context) {
175 onStatus("Starting Frame Rendering.");
176 }
177
178 public void onRenderFrameStop(IContext context, Image image) {
179 onStatus("Finished Frame Rendering.");
180 }
181 }