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 | */
|
---|
16 | package org.tp23.antinstaller.renderer.swing;
|
---|
17 |
|
---|
18 | import java.awt.BorderLayout;
|
---|
19 | import java.awt.FlowLayout;
|
---|
20 | import java.awt.Color;
|
---|
21 | import java.awt.Dimension;
|
---|
22 | import java.awt.Font;
|
---|
23 | import java.awt.GridLayout;
|
---|
24 | import java.awt.event.ActionEvent;
|
---|
25 | import java.awt.event.ActionListener;
|
---|
26 | import java.io.ByteArrayOutputStream;
|
---|
27 | import java.io.InputStream;
|
---|
28 | import java.util.ResourceBundle;
|
---|
29 |
|
---|
30 | import javax.swing.BorderFactory;
|
---|
31 | import javax.swing.ImageIcon;
|
---|
32 | import javax.swing.JButton;
|
---|
33 | import javax.swing.JLabel;
|
---|
34 | import javax.swing.JPanel;
|
---|
35 | import javax.swing.border.Border;
|
---|
36 |
|
---|
37 | import org.tp23.antinstaller.InstallerContext;
|
---|
38 | import org.tp23.antinstaller.ValidationException;
|
---|
39 | import 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 | */
|
---|
49 | public 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 | }
|
---|