source: release-kits/shared/ant-installer/src/org/tp23/antinstaller/renderer/swing/SwingPageRenderer.java@ 17578

Last change on this file since 17578 was 17578, checked in by oranfry, 16 years ago

more HCI changes to the installer: an animated activity indicator during install, better target names for the greenstone2 installers

File size: 9.1 KB
Line 
1/*
2 * Copyright 2005 Paul Hinds
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.tp23.antinstaller.renderer.swing;
17
18import java.awt.BorderLayout;
19import java.awt.FlowLayout;
20import java.awt.Color;
21import java.awt.Dimension;
22import java.awt.Font;
23import java.awt.GridLayout;
24import java.awt.event.ActionEvent;
25import java.awt.event.ActionListener;
26import java.io.ByteArrayOutputStream;
27import java.io.InputStream;
28import java.util.ResourceBundle;
29
30import javax.swing.BorderFactory;
31import javax.swing.ImageIcon;
32import javax.swing.JButton;
33import javax.swing.JLabel;
34import javax.swing.JPanel;
35import javax.swing.border.Border;
36
37import org.tp23.antinstaller.InstallerContext;
38import org.tp23.antinstaller.ValidationException;
39import org.tp23.antinstaller.page.Page;
40
41/**
42 *
43 * <p>Abstract super class for page renderers. setPage will always be called. </p>
44 * <p>Subclasses should implement instanceInit for initialising swing components
45 * on the page. </p>
46 * @author Paul Hinds
47 * @version $Id: SwingPageRenderer.java,v 1.10 2007/01/19 00:24:35 teknopaul Exp $
48 */
49public abstract class SwingPageRenderer
50 extends JPanel {
51
52 // gui components
53 private BorderLayout borderLayout1 = new BorderLayout();
54
55 // holds the next back buttons etc
56 private JPanel controlPanel = new JPanel(new FlowLayout(FlowLayout.CENTER,12,3));
57
58 private JButton backButton = new JButton();
59 private JButton cancelButton = new JButton();
60 private JButton nextButton = new JButton();
61 private JButton finishButton = new JButton();
62
63 public JPanel masterPanel = new JPanel( new BorderLayout() );
64
65 private JPanel titlePanel = new JPanel();
66 private JLabel titleLabel = new JLabel();
67 private JLabel imagePanel = new JLabel(); // Graphic for the installer
68 private GridLayout titleLayout = new GridLayout();
69
70 // app components
71 protected Page page;
72 protected SwingInstallerContext swingCtx;
73 protected InstallerContext ctx;
74 protected PageCompletionListener listener;
75 private Border bevelBorder;
76
77
78 private static Font titleFont;
79 static{
80 titleFont = new JLabel().getFont();
81 try {
82 titleFont = new Font(titleFont.getFamily(), Font.BOLD, 14);
83 }
84 catch (Exception ex) {
85 // lets not fail due to font errors
86 }
87 }
88
89 public SwingPageRenderer(){
90 super();
91 }
92 public void setPage(Page page){
93 this.page = page;
94 try {
95 jbInit();
96 }
97 catch (Exception e) {
98 ctx.log(e.getMessage());
99 if(ctx.getInstaller().isVerbose()) {
100 ctx.log(e);
101 }
102 }
103 }
104
105 public void setContext(SwingInstallerContext swingCtx){
106 this.ctx = swingCtx.getInstallerContext();
107 this.swingCtx = swingCtx;
108 }
109
110 public void reInit() {
111 backButton.setText(org.tp23.antinstaller.Installer.langPack.getString("backButton"));// "<< Back");
112 cancelButton.setText(org.tp23.antinstaller.Installer.langPack.getString("cancelButton"));// "Cancel");
113 nextButton.setText(org.tp23.antinstaller.Installer.langPack.getString("nextButton"));// "Next >>");
114 finishButton.setText(ctx.getInstaller().getFinishButtonText());
115 titleLabel.setText(page.getDisplayText());
116 }
117
118 private void jbInit() throws Exception {
119
120 this.setDoubleBuffered(true);
121 //emptyBorder = BorderFactory.createEmptyBorder(2,5,2,2);
122 //bevelBorder = BorderFactory.createCompoundBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED,Color.white,Color.white,new Color(116, 116, 112),new Color(166, 166, 161)),BorderFactory.createEmptyBorder(2,SwingInputFieldRenderer.LEFT_INDENT,2,2));
123 bevelBorder = BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.black,1),BorderFactory.createEmptyBorder(2,SizeConstants.LEFT_INDENT,2,2));
124 bevelBorder = BorderFactory.createCompoundBorder(BorderFactory.createEtchedBorder(),BorderFactory.createEmptyBorder(2,SizeConstants.LEFT_INDENT,2,2));
125 Border tripleBorder = BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(3,4,1,4),bevelBorder);
126 this.setLayout(borderLayout1);
127 titleLabel.setBorder(tripleBorder);
128 controlPanel.setBorder(tripleBorder);
129
130 masterPanel.add(titlePanel, BorderLayout.NORTH);
131 this.add(masterPanel, BorderLayout.NORTH);
132 this.add(controlPanel, BorderLayout.SOUTH);
133
134 // title panel
135 titlePanel.add(imagePanel, null);
136 titlePanel.add(titleLabel, null);
137
138 titlePanel.setLayout(titleLayout);
139 titleLayout.setColumns(1);
140 titleLayout.setHgap(0);
141 titleLayout.setRows(2);
142 titleLayout.setVgap(2);
143 titlePanel.setMinimumSize(new Dimension(SizeConstants.PAGE_WIDTH, SizeConstants.TITLE_PANEL_HEIGHT));
144 titlePanel.setMaximumSize(new Dimension(SizeConstants.PAGE_WIDTH, SizeConstants.TITLE_PANEL_HEIGHT));
145 titlePanel.setPreferredSize(new Dimension(SizeConstants.PAGE_WIDTH, SizeConstants.TITLE_PANEL_HEIGHT));
146
147 titleLabel.setText(page.getDisplayText());
148 titleLabel.setFont(titleFont);
149 setImage(page.getImageResource());
150 imagePanel.setMinimumSize(new Dimension(SizeConstants.PAGE_WIDTH, SizeConstants.TITLE_IMAGE_HEIGHT));
151 imagePanel.setMaximumSize(new Dimension(SizeConstants.PAGE_WIDTH, SizeConstants.TITLE_IMAGE_HEIGHT));
152 imagePanel.setPreferredSize(new Dimension(SizeConstants.PAGE_WIDTH, SizeConstants.TITLE_IMAGE_HEIGHT));
153
154 // Ctrl Panel
155 controlPanel.add(cancelButton, null);
156 controlPanel.add(backButton, null);
157 controlPanel.add(nextButton, null);
158 controlPanel.add(finishButton, null);
159 backButton.setText(org.tp23.antinstaller.Installer.langPack.getString("backButton"));// "<< Back");
160 cancelButton.setText(org.tp23.antinstaller.Installer.langPack.getString("cancelButton"));// "Cancel");
161 nextButton.setText(org.tp23.antinstaller.Installer.langPack.getString("nextButton"));// "Next >>");
162 finishButton.setText(ctx.getInstaller().getFinishButtonText());
163 finishButton.setVisible(false);
164 setEventListeners();
165 setIcons();
166 }
167 public abstract void instanceInit() throws Exception ;
168 public abstract void reInstanceInit();
169 public abstract void updateInputFields();
170 public abstract void updateDefaultValues();
171 public abstract boolean validateFields()throws ValidationException;
172
173 public void setPageCompletionListener(PageCompletionListener listener){
174 this.listener = listener;
175 }
176
177 public void stopPage() {}
178
179 private void setImage(String resource) throws Exception{
180 if(resource == null){
181 resource = ctx.getInstaller().getDefaultImageResource();
182 }
183 ImageIcon icon = getImage(resource);
184 imagePanel.setIcon(icon);
185 }
186
187 protected ImageIcon getImage(String resource){
188 try {
189 if (resource != null) {
190 ByteArrayOutputStream baos = new ByteArrayOutputStream();
191 InputStream in = this.getClass().getResourceAsStream(resource);
192 byte[] buffer = new byte[2048];
193 int read = -1;
194 while ( (read = in.read(buffer)) != -1) {
195 baos.write(buffer, 0, read);
196 }
197 ImageIcon icon = new ImageIcon(baos.toByteArray());
198 return icon;
199 }
200 }
201 catch (Exception ex) {
202 ctx.log("Can't load image resource:" + resource);
203 if(ctx.getInstaller().isVerbose()){
204 ctx.log(ex);
205 }
206 }
207 return null;
208 }
209
210
211 private void setEventListeners(){
212 backButton.addActionListener(new ActionListener(){
213 public void actionPerformed(ActionEvent e){
214 listener.pageBack(page);
215 }
216 });
217 cancelButton.addActionListener(new ActionListener(){
218 public void actionPerformed(ActionEvent e){
219 page.setAbort(true);
220 if (ctx.getInstaller().isVerbose()) {
221 ctx.log("Abort called");
222 }
223 listener.pageComplete(page);
224 }
225 });
226 nextButton.addActionListener(new ActionListener(){
227 public void actionPerformed(ActionEvent e){
228 listener.pageComplete(page);
229
230 }
231 });
232 finishButton.addActionListener(new ActionListener(){
233 public void actionPerformed(ActionEvent e){
234 if(finishButton.getText().equals(org.tp23.antinstaller.Installer.langPack.getString("exit"))) {
235 //TODO FindBugs this will prevent cleanup in FinalizerFilter
236 System.exit(0);
237 }
238 listener.pageComplete(page);
239 //((SwingInstallerContext)ctx).getSwingRunner().finish();
240 }
241 });
242 }
243
244 private void setIcons(){
245 backButton.setIcon(getImage("/resources/icons/back.png"));
246 cancelButton.setIcon(getImage("/resources/icons/cancel.png"));
247 nextButton.setIcon(getImage("/resources/icons/next.png"));
248 finishButton.setIcon(getImage("/resources/icons/finish.png"));
249 }
250
251 public JButton getCancelButton() {
252 return cancelButton;
253 }
254
255 public InstallerContext getCtx() {
256 return ctx;
257 }
258
259 public JPanel getControlPanel() {
260 return controlPanel;
261 }
262
263 public JLabel getImagePanel() {
264 return imagePanel;
265 }
266
267 public JButton getNextButton() {
268 return nextButton;
269 }
270
271 public JLabel getTitleLabel() {
272 return titleLabel;
273 }
274 public JButton getFinishButton() {
275 return finishButton;
276 }
277 public JButton getBackButton() {
278 return backButton;
279 }
280}
Note: See TracBrowser for help on using the repository browser.