KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > htmlparser > parserapplications > filterbuilder > FilterBuilder


1 // HTMLParser Library $Name: v1_5_20050313 $ - A java-based parser for HTML
2
// http://sourceforge.org/projects/htmlparser
3
// Copyright (C) 2005 Derrick Oswald
4
//
5
// Revision Control Information
6
//
7
// $Source: /cvsroot/htmlparser/htmlparser/src/org/htmlparser/parserapplications/filterbuilder/FilterBuilder.java,v $
8
// $Author: derrickoswald $
9
// $Date: 2005/03/04 15:57:25 $
10
// $Revision: 1.3 $
11
//
12
// This library is free software; you can redistribute it and/or
13
// modify it under the terms of the GNU Lesser General Public
14
// License as published by the Free Software Foundation; either
15
// version 2.1 of the License, or (at your option) any later version.
16
//
17
// This library is distributed in the hope that it will be useful,
18
// but WITHOUT ANY WARRANTY; without even the implied warranty of
19
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20
// Lesser General Public License for more details.
21
//
22
// You should have received a copy of the GNU Lesser General Public
23
// License along with this library; if not, write to the Free Software
24
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25
//
26

27 package org.htmlparser.parserapplications.filterbuilder;
28
29 import java.awt.BorderLayout JavaDoc;
30 import java.awt.Component JavaDoc;
31 import java.awt.Container JavaDoc;
32 import java.awt.Dimension JavaDoc;
33 import java.awt.Event JavaDoc;
34 import java.awt.FileDialog JavaDoc;
35 import java.awt.FlowLayout JavaDoc;
36 import java.awt.Insets JavaDoc;
37 import java.awt.Point JavaDoc;
38 import java.awt.Toolkit JavaDoc;
39 import java.awt.datatransfer.Clipboard JavaDoc;
40 import java.awt.datatransfer.ClipboardOwner JavaDoc;
41 import java.awt.datatransfer.DataFlavor JavaDoc;
42 import java.awt.datatransfer.StringSelection JavaDoc;
43 import java.awt.datatransfer.Transferable JavaDoc;
44 import java.awt.datatransfer.UnsupportedFlavorException JavaDoc;
45 import java.awt.dnd.DnDConstants JavaDoc;
46 import java.awt.dnd.DragGestureEvent JavaDoc;
47 import java.awt.dnd.DragGestureListener JavaDoc;
48 import java.awt.dnd.DragSource JavaDoc;
49 import java.awt.dnd.DragSourceDragEvent JavaDoc;
50 import java.awt.dnd.DragSourceDropEvent JavaDoc;
51 import java.awt.dnd.DragSourceEvent JavaDoc;
52 import java.awt.dnd.DragSourceListener JavaDoc;
53 import java.awt.dnd.DropTarget JavaDoc;
54 import java.awt.dnd.DropTargetContext JavaDoc;
55 import java.awt.dnd.DropTargetDragEvent JavaDoc;
56 import java.awt.dnd.DropTargetDropEvent JavaDoc;
57 import java.awt.dnd.DropTargetEvent JavaDoc;
58 import java.awt.dnd.DropTargetListener JavaDoc;
59 import java.awt.event.ActionEvent JavaDoc;
60 import java.awt.event.ActionListener JavaDoc;
61 import java.awt.event.InputEvent JavaDoc;
62 import java.awt.event.KeyEvent JavaDoc;
63 import java.awt.event.MouseEvent JavaDoc;
64 import java.awt.event.MouseListener JavaDoc;
65 import java.awt.event.MouseMotionListener JavaDoc;
66 import java.awt.event.WindowEvent JavaDoc;
67 import java.awt.event.WindowListener JavaDoc;
68 import java.beans.PropertyVetoException JavaDoc;
69 import java.io.File JavaDoc;
70 import java.io.FileReader JavaDoc;
71 import java.io.FileWriter JavaDoc;
72 import java.io.IOException JavaDoc;
73 import java.io.LineNumberReader JavaDoc;
74 import java.io.PrintWriter JavaDoc;
75 import java.io.StringWriter JavaDoc;
76 import java.lang.reflect.Method JavaDoc;
77 import java.net.MalformedURLException JavaDoc;
78 import java.net.URL JavaDoc;
79 import java.util.Vector JavaDoc;
80
81 import javax.swing.Icon JavaDoc;
82 import javax.swing.ImageIcon JavaDoc;
83 import javax.swing.JButton JavaDoc;
84 import javax.swing.JDesktopPane JavaDoc;
85 import javax.swing.JFrame JavaDoc;
86 import javax.swing.JInternalFrame JavaDoc;
87 import javax.swing.JMenu JavaDoc;
88 import javax.swing.JMenuBar JavaDoc;
89 import javax.swing.JMenuItem JavaDoc;
90 import javax.swing.JOptionPane JavaDoc;
91 import javax.swing.JPanel JavaDoc;
92 import javax.swing.JPopupMenu JavaDoc;
93 import javax.swing.JScrollPane JavaDoc;
94 import javax.swing.JSeparator JavaDoc;
95 import javax.swing.JSplitPane JavaDoc;
96 import javax.swing.JTextField JavaDoc;
97 //import javax.swing.JTextPane;
98
import javax.swing.JToolBar JavaDoc;
99 import javax.swing.JTree JavaDoc;
100 import javax.swing.KeyStroke JavaDoc;
101 import javax.swing.ScrollPaneConstants JavaDoc;
102 import javax.swing.WindowConstants JavaDoc;
103
104 import org.htmlparser.Parser;
105 import org.htmlparser.beans.FilterBean;
106 import org.htmlparser.parserapplications.filterbuilder.layouts.NullLayoutManager;
107 import org.htmlparser.util.EncodingChangeException;
108 import org.htmlparser.util.NodeIterator;
109 import org.htmlparser.util.NodeList;
110 import org.htmlparser.util.ParserException;
111
112 /**
113  * The main program for the FilterBuilder programming system.
114  * <p>ToDo:
115  * <ul>
116  * <li>thread the attribute fetching</li>
117  * <li>CSS selector filter</li>
118  * <li>table row filter</li>
119  * <li>table column filter</li>
120  * <li>trigger filter</li>
121  * <li>undo</li>
122  * <li>handle bad URLs</li>
123  * <li>StringBean type secondary text output</li>
124  * <li>context sensitive menus</li>
125  * </ul>
126  */

127 public class FilterBuilder
128     extends
129         JFrame JavaDoc
130     implements
131         WindowListener JavaDoc,
132         ActionListener JavaDoc,
133         MouseListener JavaDoc,
134         MouseMotionListener JavaDoc,
135         DragGestureListener JavaDoc,
136         DragSourceListener JavaDoc,
137         DropTargetListener JavaDoc,
138         ClipboardOwner JavaDoc
139 {
140     static final String JavaDoc TITLE = "HTML Parser FilterBuilder";
141
142     static final URL JavaDoc mDocumentBase;
143     
144     static
145     {
146         
147         String JavaDoc p;
148         char ps;
149         URL JavaDoc base;
150
151         p = System.getProperty ("user.dir");
152         // if the system file separator isn't the URL file separator convert it.
153
try
154         {
155             ps = (System.getProperty ("file.separator")).charAt(0);
156             if ('/' != ps)
157                 p.replace (ps, '/');
158         }
159         catch (StringIndexOutOfBoundsException JavaDoc e)
160         {
161         }
162
163         try
164         {
165             base = new URL JavaDoc ("file:///" + p + "/");
166         }
167         catch (MalformedURLException JavaDoc murle)
168         {
169             base = null;
170         }
171         mDocumentBase = base;
172     }
173
174     static String JavaDoc mHomeDir;
175     
176     static
177     {
178         String JavaDoc dir;
179         File JavaDoc file;
180
181         dir = System.getProperty ("user.home")
182             + System.getProperty ("file.separator")
183             + ".htmlparser";
184         file = new File JavaDoc (dir);
185         if (!file.exists ())
186             if (!file.mkdirs ()) // make the directory if it doesn't exist
187
throw new RuntimeException JavaDoc (
188                     "cannot create directory "
189                     + file.getAbsolutePath ());
190         mHomeDir = file.getAbsolutePath ();
191     }
192     
193     /**
194      * The relative position of the mouse while dragging.
195      */

196     protected Point JavaDoc mBasePoint;
197
198     /**
199      * Selected commands.
200      */

201     protected Vector JavaDoc mSelection;
202
203     /**
204      * If true selection moved.
205      */

206     protected boolean mMoved;
207
208     /**
209      * This component is a drop target.
210      */

211     protected DropTarget JavaDoc mDropTarget;
212     
213     /**
214      * Enables this component to be a Drag Source.
215      */

216     protected DragSource JavaDoc mDragSource;
217
218     /**
219      * Kludge: Used by actionPerformed/filterAction to remember the filter menu item.
220      */

221     protected Component JavaDoc mCurrentComponent;
222
223     protected JPanel JavaDoc mMainPanel;
224     protected JScrollPane JavaDoc mMainScroller;
225     protected JTextField JavaDoc mURLField;
226     protected JDesktopPane JavaDoc mOutput;
227
228     /**
229      * Create an FilterBuilder programming environment.
230      */

231     public FilterBuilder ()
232     {
233         JMenuBar JavaDoc menubar;
234         JToolBar JavaDoc toolbar;
235         JMenu JavaDoc menu;
236         JPanel JavaDoc panel;
237         JScrollPane JavaDoc pane;
238         JSplitPane JavaDoc split;
239         JMenuItem JavaDoc item;
240
241         // drag and drop support
242
mMainPanel = new JPanel JavaDoc ();
243         mDropTarget = new DropTarget JavaDoc (mMainPanel, this);
244         mDragSource = new DragSource JavaDoc ();
245
246         // menu and toolbar
247
menubar = new JMenuBar JavaDoc();
248         toolbar = new JToolBar JavaDoc ();
249         toolbar.setAlignmentY (0.222222F);
250
251         // file menu
252
menu = new JMenu JavaDoc ();
253         menu.setText ("File");
254         menu.setActionCommand ("File");
255         menu.setMnemonic ((int)'F');
256         makeMenuButton ("New", "Create a new document", "New", 'N', KeyStroke.getKeyStroke (KeyEvent.VK_N, Event.CTRL_MASK), toolbar, menu);
257         makeMenuButton ("Open", "Open an existing document", "Open...", 'O', KeyStroke.getKeyStroke (KeyEvent.VK_O, Event.CTRL_MASK), toolbar, menu);
258         makeMenuButton ("Save", "Save the active document", "Save...", 'S', KeyStroke.getKeyStroke (KeyEvent.VK_S, Event.CTRL_MASK), toolbar, menu);
259         makeMenuButton ("SaveAs", "Save the active document", "Save As...", 'A', KeyStroke.getKeyStroke (KeyEvent.VK_A, Event.CTRL_MASK), null, menu);
260         menu.add (new JSeparator JavaDoc ());
261         makeMenuButton ("Exit", "Exit the program", "Exit", 'E', KeyStroke.getKeyStroke (KeyEvent.VK_E, Event.CTRL_MASK), null, menu);
262         menubar.add (menu);
263         
264         toolbar.add(new JToolBar.Separator JavaDoc());
265
266         // edit menu
267
menu = new JMenu JavaDoc ();
268         menu.setText ("Edit");
269         menu.setActionCommand ("Edit");
270         menu.setMnemonic ((int)'E');
271         makeMenuButton ("Cut", "Cut the selection and put it on the Clipboard", "Cut", 'T', KeyStroke.getKeyStroke (KeyEvent.VK_X, Event.CTRL_MASK), toolbar, menu);
272         makeMenuButton ("Copy", "Copy the selection and put it on the Clipboard", "Copy", 'C', KeyStroke.getKeyStroke (KeyEvent.VK_C, Event.CTRL_MASK), toolbar, menu);
273         makeMenuButton ("Paste", "Insert Clipboard contents", "Paste", 'P', KeyStroke.getKeyStroke (KeyEvent.VK_V, Event.CTRL_MASK), toolbar, menu);
274         makeMenuButton ("Delete", "Delete the selection", "Delete", 'D', KeyStroke.getKeyStroke (KeyEvent.VK_DELETE, 0), toolbar, menu);
275         menubar.add (menu);
276
277         // filter menu
278
menu = new JMenu JavaDoc ();
279         menu.setText ("Filter");
280         menu.setActionCommand ("Filter");
281         menu.setMnemonic ((int)'F');
282         menubar.add (menu);
283
284         toolbar.add (new JToolBar.Separator JavaDoc());
285
286         // filters menu and filters toolbar
287
addFilter (menu, toolbar, "org.htmlparser.parserapplications.filterbuilder.wrappers.AndFilterWrapper");
288         addFilter (menu, toolbar, "org.htmlparser.parserapplications.filterbuilder.wrappers.OrFilterWrapper");
289         addFilter (menu, toolbar, "org.htmlparser.parserapplications.filterbuilder.wrappers.NotFilterWrapper");
290         menu.addSeparator ();
291         toolbar.add (new JToolBar.Separator JavaDoc ());
292
293         addFilter (menu, toolbar, "org.htmlparser.parserapplications.filterbuilder.wrappers.StringFilterWrapper");
294         addFilter (menu, toolbar, "org.htmlparser.parserapplications.filterbuilder.wrappers.RegexFilterWrapper");
295         addFilter (menu, toolbar, "org.htmlparser.parserapplications.filterbuilder.wrappers.TagNameFilterWrapper");
296         addFilter (menu, toolbar, "org.htmlparser.parserapplications.filterbuilder.wrappers.NodeClassFilterWrapper");
297         addFilter (menu, toolbar, "org.htmlparser.parserapplications.filterbuilder.wrappers.HasAttributeFilterWrapper");
298         menu.addSeparator ();
299         toolbar.add (new JToolBar.Separator JavaDoc ());
300
301         addFilter (menu, toolbar, "org.htmlparser.parserapplications.filterbuilder.wrappers.HasParentFilterWrapper");
302         addFilter (menu, toolbar, "org.htmlparser.parserapplications.filterbuilder.wrappers.HasChildFilterWrapper");
303         addFilter (menu, toolbar, "org.htmlparser.parserapplications.filterbuilder.wrappers.HasSiblingFilterWrapper");
304         menu.addSeparator ();
305         toolbar.add (new JToolBar.Separator JavaDoc ());
306
307         // operation menu
308
menu = new JMenu JavaDoc ();
309         menu.setText ("Operation");
310         menu.setActionCommand ("Operation");
311         menu.setMnemonic ((int)'r');
312         item = new JMenuItem JavaDoc ();
313         item.setText ("Expand");
314         item.setActionCommand ("expandAction");
315         item.addActionListener (this);
316         menu.add (item);
317         item = new JMenuItem JavaDoc ();
318         item.setText ("Collapse");
319         item.setActionCommand ("collapseAction");
320         item.addActionListener (this);
321         menu.add (item);
322         menu.addSeparator ();
323         item = new JMenuItem JavaDoc ();
324         item.setText ("Expand All");
325         item.setActionCommand ("expandAllAction");
326         item.addActionListener (this);
327         menu.add (item);
328         item = new JMenuItem JavaDoc ();
329         item.setText ("Collapse All");
330         item.setActionCommand ("collapseAllAction");
331         item.addActionListener (this);
332         menu.add (item);
333         menu.addSeparator ();
334         item = new JMenuItem JavaDoc ("Fetch Page");
335         item.setActionCommand ("fetchAction");
336         item.addActionListener (this);
337         menu.add (item);
338         item = new JMenuItem JavaDoc ("Execute Filter");
339         item.setActionCommand ("executeAction");
340         item.addActionListener (this);
341         menu.add (item);
342         menubar.add (menu);
343
344         // help menu
345
menu = new JMenu JavaDoc ();
346         menu.setText ("Help");
347         menu.setActionCommand ("Help");
348         menu.setMnemonic ((int)'H');
349         item = new JMenuItem JavaDoc ("Filtering");
350         item.setActionCommand ("filteringAction");
351         item.addActionListener (this);
352         menu.add (item);
353         item = new JMenuItem JavaDoc ("Instructions");
354         item.setActionCommand ("instructionsAction");
355         item.addActionListener (this);
356         menu.add (item);
357         item = new JMenuItem JavaDoc ("Tutorial");
358         item.setActionCommand ("tutorialAction");
359         item.addActionListener (this);
360         menu.add (item);
361         item = new JMenuItem JavaDoc ("Hints");
362         item.setActionCommand ("hintsAction");
363         item.addActionListener (this);
364         menu.add (item);
365         makeMenuButton ("About", "Display program information, version number and copyright", "About", 'B', KeyStroke.getKeyStroke (KeyEvent.VK_H, Event.CTRL_MASK), toolbar, menu);
366         menubar.add (menu);
367
368         setJMenuBar (menubar);
369
370         // toolbar panel
371
panel = new JPanel JavaDoc ();
372         panel.setLayout (new FlowLayout JavaDoc (FlowLayout.LEFT,0,0));
373         panel.add (toolbar);
374         getContentPane().setLayout (new BorderLayout JavaDoc (0,0));
375         getContentPane ().add (BorderLayout.NORTH, panel);
376
377         // URL entry
378
mURLField = new JTextField JavaDoc ();
379         mURLField.setToolTipText ("Enter the URL to view");
380 // mTextField.addActionListener (this);
381
mURLField.setText ("http://sourceforge.org/projects/htmlparser");
382         getContentPane().add (BorderLayout.SOUTH, mURLField);
383
384         // application setup
385
setTitle (TITLE);
386         setDefaultCloseOperation (WindowConstants.DO_NOTHING_ON_CLOSE);
387         setSize (640, 480);
388         setVisible (false);
389
390         // main panel
391
mMainPanel.setLayout (new NullLayoutManager ());
392         mMainScroller = new JScrollPane JavaDoc (
393                 mMainPanel,
394                 ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
395                 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
396
397         split = new JSplitPane JavaDoc ();
398         pane = new JScrollPane JavaDoc ();
399         pane.setViewportView (mMainScroller);
400         split.setLeftComponent (pane);
401
402         mOutput = new JDesktopPane JavaDoc ();
403         split.setRightComponent (mOutput);
404
405         getContentPane().add (BorderLayout.CENTER, split);
406
407         // shenanigans to get the splitter bar at the midpoint
408
setVisible (true);
409         split.setDividerLocation (0.5);
410         setVisible (false);
411
412         // listeners
413
addWindowListener (this);
414         setIconImage (Toolkit.getDefaultToolkit ().getImage ("images/program16.gif"));
415         addMouseListener (this);
416         addMouseMotionListener (this);
417
418         // clipboard buffer
419
mSelection = new Vector JavaDoc ();
420     }
421
422     /**
423      * Creates a new instance of an FilterBuilder environment with the given title.
424      * @param title the title for the new frame.
425      * @see #FilterBuilder()
426      */

427     public FilterBuilder (String JavaDoc title)
428     {
429         this ();
430         setTitle (title);
431     }
432
433     /**
434      * Makes menu and toolbar items for commands.
435      * @param name The name of the command.
436      * @param description A description for the tooltip.
437      * @param text The text for the menu.
438      * @param mnemonic The navigation mnemonic.
439      * @param key Accelerator key.
440      * @param toolbar The toolbar to add the button to.
441      * @param menu The menu to add the menu item to.
442      */

443     protected void makeMenuButton (
444             String JavaDoc name,
445             String JavaDoc description,
446             String JavaDoc text,
447             int mnemonic,
448             KeyStroke JavaDoc key,
449             JToolBar JavaDoc toolbar,
450             JMenu JavaDoc menu)
451     {
452         JButton JavaDoc button;
453         JMenuItem JavaDoc item;
454         ImageIcon JavaDoc icon;
455         String JavaDoc command;
456
457         command = name.toLowerCase ();
458         try
459         {
460             icon = new ImageIcon JavaDoc (getURL ("images/" + command + ".gif"));
461         }
462         catch (java.net.MalformedURLException JavaDoc error)
463         {
464             icon = null;
465         }
466
467         item = new JMenuItem JavaDoc ();
468         item.setText (text);
469         item.setActionCommand (command + "Action");
470         item.setAccelerator (key);
471         item.setMnemonic (mnemonic);
472         item.setIcon (icon);
473         item.addActionListener (this);
474         menu.add (item);
475
476         if (null != toolbar)
477         {
478             button = new JButton JavaDoc ();
479             button.setDefaultCapable (false);
480             button.setToolTipText (description);
481             button.setMnemonic (mnemonic);
482             button.setActionCommand (command + "Action");
483             button.setMargin (new Insets JavaDoc (0, 0, 0, 0));
484             button.setIcon (icon);
485             button.addActionListener (this);
486             toolbar.add (button);
487         }
488     }
489
490     /**
491      * Get a url for the given resource specification.
492      * @param spec The name of the resource.
493      */

494     protected URL JavaDoc getURL (String JavaDoc spec)
495         throws MalformedURLException JavaDoc
496     {
497         URL JavaDoc ret;
498
499         if (null == (ret = getClass ().getResource (spec)))
500             if ((null != mDocumentBase) && (-1 == spec.indexOf ("//")))
501                 ret = new URL JavaDoc (mDocumentBase, spec);
502             else
503                 ret = new URL JavaDoc (spec);
504
505         return ret;
506     }
507
508     /**
509      * Creates a new button for the given class.
510      * @param class_name The name of the Filter class.
511      * @return A fully functional button with name, tool tip,
512      * icon and drag recognizer.
513      */

514     public JButton JavaDoc makeFilterButton (String JavaDoc class_name)
515     {
516         Filter filter;
517         JButton JavaDoc ret;
518
519         ret = new JButton JavaDoc ();
520         filter = Filter.instantiate (class_name);
521         if (null != filter)
522         {
523             ret.setName (class_name); // filter.getNodeFilter ().getClass ().getName ());
524
ret.setToolTipText (filter.getDescription ());
525             ret.setMargin (new Insets JavaDoc (0, 0, 0, 0));
526             ret.setIcon (filter.getIcon ());
527             mDragSource.createDefaultDragGestureRecognizer (
528                 ret,
529                 DnDConstants.ACTION_MOVE,
530                 this);
531             ret.setActionCommand ("filterAction");
532             ret.addActionListener (this);
533         }
534         
535         return (ret);
536     }
537
538     public void addFilter (JMenu JavaDoc menu, JToolBar JavaDoc toolbar, String JavaDoc class_name)
539     {
540         Filter filter;
541
542         filter = Filter.instantiate (class_name);
543         if (null != filter)
544         {
545             String JavaDoc name;
546             String JavaDoc description;
547             Icon JavaDoc icon;
548             String JavaDoc text;
549             JMenuItem JavaDoc item;
550
551             name = filter.getNodeFilter ().getClass ().getName ();
552             description = filter.getDescription ();
553             icon = filter.getIcon ();
554             text = name.substring (name.lastIndexOf ('.') + 1);
555
556             item = new JMenuItem JavaDoc ();
557             item.setName (class_name);
558             item.setText (text);
559             item.setActionCommand ("filterAction");
560 // item.setAccelerator (key);
561
// item.setMnemonic (mnemonic);
562
item.setToolTipText (description);
563             item.setIcon (icon);
564             item.addActionListener (this);
565             menu.add (item);
566             
567             toolbar.add (makeFilterButton (class_name));
568         }
569     }
570
571     protected void insertFilters (Filter[] filters, Point JavaDoc point, SubFilterList list)
572     {
573         Dimension JavaDoc dimension;
574
575         if (null == list)
576         {
577             for (int i = 0; i < filters.length; i++)
578             {
579                 filters[i].setLocation (point);
580                 mMainPanel.add (filters[i]);
581                 dimension = filters[i].getPreferredSize ();
582                 point.y += dimension.height;
583             }
584         }
585         else
586             for (int i = 0; i < filters.length; i++)
587                 list.addFilter (filters[i]);
588         setupDropTargets (filters);
589         setupMouseListeners (filters);
590         relayout ();
591     }
592
593     /**
594      * Sets the position of the mouse in the component.
595      *
596      * @param point The point where the mouse position is.
597      */

598     protected void setBasePoint (Point JavaDoc point)
599     {
600         mBasePoint = point;
601     }
602     
603     /**
604      * Gets the current base point of the mouse pointer.
605      * This value is used to offset the drag position
606      * to maintain the mouse position at the same
607      * relative position within the card while dragging.
608      *
609      * @return The current base point of the mouse pointer.
610      */

611     protected Point JavaDoc getBasePoint ()
612     {
613         return (mBasePoint);
614     }
615
616     /**
617      * Get the enclosing sub filter list if any.
618      * @param component The component that's supposedly enclosed.
619      * @return The enclosing component or <code>null</code> otherwise.
620      */

621     protected SubFilterList getEnclosing (Component JavaDoc component)
622     {
623         do
624             component = component.getParent ();
625         while ( (null != component)
626                 && !(component instanceof SubFilterList));
627
628         return ((SubFilterList)component);
629     }
630
631     /**
632      * Get the enclosed sub filter list if any.
633      * @param component The component that's supposedly enclosing the list.
634      * @return The enclosed component or <code>null</code> otherwise.
635      */

636     protected SubFilterList getEnclosed (Component JavaDoc component)
637     {
638         Component JavaDoc[] list;
639
640         if (component instanceof Container JavaDoc)
641         {
642             list = ((Container JavaDoc)component).getComponents ();
643             for (int i = 0; i < list.length; i++)
644                 if (list[i] instanceof SubFilterList)
645                     return ((SubFilterList)list[i]);
646         }
647
648         return (null);
649     }
650
651     /* makes a program like:
652         // Generated by FilterBuilder. http://htmlparser.org
653         // [aced0005737200206f72672e68746d6c7061727365722e66696c746572732e416e6446696c74657224c30516b2b7b2120200015b000b6d5072656469636174657374001c5b4c6f72672f68746d6c7061727365722f4e6f646546696c7465723b78707572001c5b4c6f72672e68746d6c7061727365722e4e6f646546696c7465723b8f17479b1d5f7992020000787000000002737200246f72672e68746d6c7061727365722e66696c746572732e5461674e616d6546696c746572b28b2601a614890f0200014c00056d4e616d657400124c6a6176612f6c616e672f537472696e673b78707400044d455441737200296f72672e68746d6c7061727365722e66696c746572732e48617341747472696275746546696c74657296abdfb3b0714cda0200024c000a6d41747472696275746571007e00064c00066d56616c756571007e000678707400046e616d6570]
654                                                                                                                                                                 
655         import org.htmlparser.*;
656         import org.htmlparser.filters.*;
657         import org.htmlparser.beans.*;
658         import org.htmlparser.util.*;
659                                                                                                                                                                 
660         public class Test
661         {
662             public static void main (String args[])
663             {
664                 TagNameFilter filter0 = new TagNameFilter ();
665                 filter0.setName ("META");
666                 HasAttributeFilter filter1 = new HasAttributeFilter ();
667                 filter1.setAttributeName ("name");
668                 NodeFilter[] array0 = new NodeFilter[2];
669                 array0[0] = filter0;
670                 array0[1] = filter1;
671                 AndFilter filter2 = new AndFilter ();
672                 filter2.setPredicates (array0);
673                 NodeFilter[] array1 = new NodeFilter[1];
674                 array1[0] = filter2;
675                 FilterBean bean = new FilterBean ();
676                 bean.setFilters (array1);
677                 if (0 != args.length)
678                 {
679                     bean.setURL (args[0]);
680                     System.out.println (bean.getNodes ().toHtml ());
681                 }
682                 else
683                     System.out.println ("Usage: java -classpath .:htmlparser.jar Test <url>");
684             }
685         }
686      */

687     protected void makeProgram (String JavaDoc name, StringBuffer JavaDoc out, FilterBean bean)
688     {
689         // so we need to keep track of filters and arrays of filters to give them unique numbers
690
// each Filter is responsible for outputting it's code and returning it's variable name
691
int[] context; // 0 - indent, 1 - next filter variable #, 2 - next array of filters variable #
692
String JavaDoc[] names;
693         Filter[] filters;
694         String JavaDoc array;
695
696         filters = (Filter[])bean.getFilters ();
697
698         context = new int[3];
699         context[0] = 0;
700
701         Filter.spaces (out, context[0]);
702         out.append ("// Generated by FilterBuilder. http://htmlparser.org");
703         Filter.newline (out);
704         Filter.spaces (out, context[0]);
705         out.append ("// ");
706         try
707         {
708             out.append (Filter.deconstitute (filters));
709         }
710         catch (IOException JavaDoc ioe)
711         {
712             ioe.printStackTrace ();
713         }
714         Filter.newline (out);
715         Filter.newline (out);
716
717         Filter.spaces (out, context[0]);
718         out.append ("import org.htmlparser.*;");
719         Filter.newline (out);
720         Filter.spaces (out, context[0]);
721         out.append ("import org.htmlparser.filters.*;");
722         Filter.newline (out);
723         Filter.spaces (out, context[0]);
724         out.append ("import org.htmlparser.beans.*;");
725         Filter.newline (out);
726         Filter.spaces (out, context[0]);
727         out.append ("import org.htmlparser.util.*;");
728