xref: /titanic_41/usr/src/cmd/krb5/kadmin/gui/dataclasses/PrintUtil.java (revision 9512fe850e98fdd448c638ca63fdd92a8a510255)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * ident	"%Z%%M%	%I%	%E% SMI"
24  *
25  * Copyright (c) 1999-2000 by Sun Microsystems, Inc.
26  * All rights reserved.
27  */
28 import java.awt.*;
29 import java.awt.event.*;
30 import java.io.*;
31 import java.util.ResourceBundle;
32 import java.util.MissingResourceException;
33 
34 public class PrintUtil {
35 
36     // For I18N
37     private static ResourceBundle rb =
38     ResourceBundle.getBundle("GuiResource" /* NOI18N */);
39     private static ResourceBundle hrb =
40     ResourceBundle.getBundle("HelpData" /* NOI18N */);
41     /**
42      * Prints an object to either file or printer. Uses the toString()
43      * method of the object to obtain a string representation for it.
44      * @param obj the Object that is to be printed
45      */
46     public static void dump(Frame parent, Object obj) {
47 
48         boolean usePrinter;
49         String stringRep = obj.toString();
50 
51         Frame printFrame = new PrintFrame(parent, stringRep);
52         printFrame.setVisible(true);
53     }
54 
55     /**
56      * Call rb.getString(), but catch exception and return English
57      * key so that small spelling errors don't cripple the GUI
58      *
59      */
60     private static final String getString(String key) {
61         return (getString(rb, key));
62     }
63 
64     private static final String getString(ResourceBundle rb, String key) {
65         try {
66     	    String res = rb.getString(key);
67 	    return res;
68         } catch (MissingResourceException e) {
69 	    System.out.println("Missing resource "+key+", using English.");
70 	    return key;
71         }
72     }
73 
74     /**
75      * Forgets the command and filename that was last entered.
76      */
77     public static final void reinitialize() {
78         PrintFrame.command = PrintFrame.fileName = null;
79     }
80 
81     /*
82      ************************************************************
83      *   I N N E R    C L A S S E S   F O L L O W
84      ************************************************************
85      */
86 
87     /**
88      * This class will show a Frame to determine whether the user wants
89      * to print to  a file and which file, if so, or to the printer
90      * directly. Finally it will print to the appropriate destinaition.
91      */
92     private static class PrintFrame extends Frame {
93 
94         private String text;
95 
96         static TextField command = null;
97         static TextField fileName = null;
98 
99         private CheckboxGroup options;
100         private Checkbox printer;
101         private Checkbox file;
102 
103         private Frame parent;
104 
105         private static String defaultFileName =
106             "/tmp/.SEAM_temp.txt" /* NO18N */;
107 
108         /**
109          * Constructor for PrintFrame.
110          */
111         public PrintFrame(Frame parent, String text) {
112             super(rb.getString("SEAM Print Helper"));
113             this.text = text;
114             this.parent = parent;
115             setLayout(new GridBagLayout());
116 
117             addLabelsAndFields();
118             addCheckboxGroup();
119             addButtons();
120 
121             setBackground(parent.getBackground());
122             setForeground(parent.getForeground());
123             setSize(340, 160);
124             setResizable(false);
125 
126             printer.setState(true);
127             command.setEditable(true);
128             fileName.setEditable(false);
129         }
130 
131         private void addLabelsAndFields() {
132             GridBagConstraints gbc = new GridBagConstraints();
133             gbc.weightx = gbc.weighty = 1;
134             gbc.gridwidth = 2;
135             gbc.fill = GridBagConstraints.HORIZONTAL;
136 
137             gbc.gridx = 1;
138             gbc.gridy = 0;
139             add(new Label(getString("Print Command")), gbc);
140             if (command == null)
141 	        command = new TextField("lp" /* NO18N */, 10);
142             gbc.gridx = 3;
143             add(command, gbc);
144 
145             gbc.gridx = 1;
146             gbc.gridy = 1;
147             add(new Label(getString("File Name")), gbc);
148             if (fileName == null)
149 	        fileName = new TextField("" /* NO18N */, 10);
150             gbc.gridx = 3;
151             add(fileName, gbc);
152 
153             ActionListener al = new StartPrintingListener();
154             command.addActionListener(al);
155             fileName.addActionListener(al);
156         }
157 
158         private void addCheckboxGroup() {
159 
160             GridBagConstraints gbc = new GridBagConstraints();
161             gbc.weightx = gbc.weighty = 1;
162 
163             options = new CheckboxGroup();
164               printer = new Checkbox();
165             file = new Checkbox();
166             printer.setCheckboxGroup(options);
167             file.setCheckboxGroup(options);
168             options.setSelectedCheckbox(printer);
169 
170             printer.addItemListener(new PrintSelectedListener());
171             file.addItemListener(new FileSelectedListener());
172 
173             gbc.gridx = 0;
174 
175             gbc.gridy = 0;
176             add(printer, gbc);
177             gbc.gridy = 1;
178             add(file, gbc);
179         }
180 
181         private void addButtons() {
182 
183             Button fileMore = new Button("..." /* NO18N */);
184             Button print = new Button(getString("Print"));
185             Button cancel = new Button(getString("Cancel"));
186             Button help = new Button(getString("Help"));
187 
188             GridBagConstraints gbc = new GridBagConstraints();
189             gbc.weightx = gbc.weighty = 1;
190 
191             gbc.gridx = 5;
192             gbc.gridy = 1;
193             add(fileMore, gbc);
194 
195 
196             gbc.gridx = 0;
197       //      gbc.gridy = 2;
198             gbc.gridwidth = GridBagConstraints.REMAINDER;
199             gbc.fill = GridBagConstraints.BOTH;
200       //      gbc.insets = new Insets(0, 10, 0, 10);
201       //      gbc.weighty = .1;
202       //   add(new LineSeparator(), gbc);
203       //      gbc.weighty = 1;
204 
205             Panel p = new Panel();
206             gbc.insets = new Insets(0, 10, 0, 10);
207             gbc.gridy = 2;
208             add(p, gbc);
209 
210             p.setLayout(new GridBagLayout());
211             gbc = new GridBagConstraints();
212             gbc.fill = GridBagConstraints.HORIZONTAL;
213             gbc.weightx = gbc.weighty = 1;
214 
215             p.add(print, gbc);
216             p.add(cancel, gbc);
217             p.add(help, gbc);
218 
219             print.addActionListener(new StartPrintingListener());
220             cancel.addActionListener(new CancelButtonListener());
221             help.addActionListener(new HelpButtonListener());
222             fileMore.addActionListener(new FileMoreButtonListener());
223             addWindowListener(new WindowCloseListener());
224 
225         }
226 
227         /**
228          * Called when the print frame has to be closed. IT may be closed
229          * as a result of the user choosing any one of "print", "cancel" or
230          * just the window close (which also cancels the printing).
231          * @param doIt true if the printing should be carried out, false
232          * if it is to be cancelled.
233          */
234         private void close(boolean doIt) {
235             if (doIt) {
236 
237 	        Checkbox cb = options.getSelectedCheckbox();
238 	        String dest = null;
239 
240 	        try {
241 	            if (cb == printer) {
242 	                dest = command.getText().trim();
243 	                if (dest.length() == 0)
244 	                    return;
245 	                else
246 	                    print(dest);
247 	            } else {
248 	                dest = fileName.getText().trim();
249 	                if (dest.length() == 0)
250 	                    return;
251 	                else
252 	                    saveToFile(dest);
253 	            }
254 	        } catch (IOException e) {
255 	            // System.out.println(e); XXX
256 	        }
257             } // end of doIt
258 
259             dispose();
260         }// end of close
261 
262         /**
263          * Prints the string to a file and then send the file's contents
264          * to the printer. It then deletes the file.
265          * @param command the print comman to be used
266          */
267         private void print(String command) throws IOException {
268             Thread printThread = new PrintThread(command);
269             printThread.start();
270             saveToFile(defaultFileName);
271         }
272 
273         /**
274          * Saves the string onto the file.
275          * @param fileName the file to which the string must be written
276          */
277         private void saveToFile(String fileName) throws IOException {
278             PrintWriter outFile = null;
279             outFile = new PrintWriter(new BufferedWriter(new
280                       FileWriter(fileName)));
281             outFile.print(text);
282             outFile.flush();
283             outFile.close();
284         }
285 
286         // Listeners for the gui components:
287         // javac in current makefile will not compile if these are anonymous.
288 
289         private class PrintSelectedListener implements ItemListener {
290             public void itemStateChanged(ItemEvent e) {
291 	        command.setEditable(true);
292 	        fileName.setEditable(false);
293             }
294         }
295 
296         private class FileSelectedListener implements ItemListener {
297             public void itemStateChanged(ItemEvent e) {
298 	        command.setEditable(false);
299 	        fileName.setEditable(true);
300             }
301         }
302 
303         private class StartPrintingListener implements ActionListener {
304             public void actionPerformed(ActionEvent e) {
305 	        close(true);
306             }
307         }
308 
309         private  class CancelButtonListener implements ActionListener {
310             public void actionPerformed(ActionEvent e) {
311 	        close(false);
312             }
313         }
314 
315         private  class HelpButtonListener implements ActionListener {
316             public void actionPerformed(ActionEvent e) {
317 	        HelpDialog hd = new HelpDialog(PrintFrame.this,
318 		getString("Help for Date/Time Helper"), false);
319 	        hd.setVisible(true);
320 	        hd.setText(getString(hrb, "PrintUtilHelp"));
321             }
322         }
323 
324         private  class FileMoreButtonListener implements
325         ActionListener {
326 
327             public void actionPerformed(ActionEvent e) {
328 
329 	        // Turn off print "command" and enable output "file name"
330 	        options.setSelectedCheckbox(file);
331 	        command.setEditable(false);
332 	        fileName.setEditable(true);
333 
334 	        FileDialog fd = new FileDialog(PrintFrame.this,
335 				       getString("SEAM File Helper"),
336 				       FileDialog.SAVE);
337 	        fd.setDirectory(System.getProperty("user.dir" /* NO18N */));
338 
339 	        // Use what's in the fileName field already to initialize the
340 	        // FileDialog
341 	        String fileNameText = fileName.getText();
342 	        if (fileNameText != null) {
343 	            File file = new File(fileNameText);
344 	            if (file.isDirectory())
345 	                fd.setDirectory(fileNameText);
346 	            else {
347 	                fd.setFile(fileNameText);
348 	                String parent = file.getParent();
349 	                if (parent != null)
350 	                    fd.setDirectory(parent);
351 	            }
352 	        }
353 
354 	        fd.setVisible(true);
355 	        if (fd.getFile() != null && fd.getFile().length() > 0)
356 	            fileName.setText(fd.getDirectory() + fd.getFile());
357             }
358         }
359 
360         /**
361          * This class prints out to a temporary file defaultFileName, send
362          * that to the printer, and then deletes the file after TIME_OUT
363          * milliseconds.
364          */
365         private class PrintThread extends Thread {
366             private String command;
367             private long TIME_OUT = 30000; // milliseconds
368 
369             public PrintThread(String command) {
370 	        this.command = command;
371             }
372 
373             public void run() {
374 	        try {
375 	            Process printProcess = Runtime.getRuntime()
376 	            .exec(command + " " /* NO18N */ + defaultFileName);
377 	            try {
378 	                sleep(TIME_OUT);
379 	            } catch (InterruptedException e) {}
380 	            printProcess.destroy();
381 	            File tempFile = new File(PrintFrame.this.defaultFileName);
382 	            tempFile.delete();
383 	        } catch (IOException e) {
384 	            // System.err.println(e); XXX
385 	        }
386             }
387         }
388 
389         private  class WindowCloseListener extends  WindowAdapter {
390             public void windowClosing(WindowEvent e) {
391 	        close(false);
392             }
393         }
394     }  // class PrintFrame
395 }
396