| 1 27 package org.htmlparser.parserapplications.filterbuilder; 28 29 import java.awt.BorderLayout ; 30 import java.awt.Component ; 31 import java.awt.Container ; 32 import java.awt.Dimension ; 33 import java.awt.Event ; 34 import java.awt.FileDialog ; 35 import java.awt.FlowLayout ; 36 import java.awt.Insets ; 37 import java.awt.Point ; 38 import java.awt.Toolkit ; 39 import java.awt.datatransfer.Clipboard ; 40 import java.awt.datatransfer.ClipboardOwner ; 41 import java.awt.datatransfer.DataFlavor ; 42 import java.awt.datatransfer.StringSelection ; 43 import java.awt.datatransfer.Transferable ; 44 import java.awt.datatransfer.UnsupportedFlavorException ; 45 import java.awt.dnd.DnDConstants ; 46 import java.awt.dnd.DragGestureEvent ; 47 import java.awt.dnd.DragGestureListener ; 48 import java.awt.dnd.DragSource ; 49 import java.awt.dnd.DragSourceDragEvent ; 50 import java.awt.dnd.DragSourceDropEvent ; 51 import java.awt.dnd.DragSourceEvent ; 52 import java.awt.dnd.DragSourceListener ; 53 import java.awt.dnd.DropTarget ; 54 import java.awt.dnd.DropTargetContext ; 55 import java.awt.dnd.DropTargetDragEvent ; 56 import java.awt.dnd.DropTargetDropEvent ; 57 import java.awt.dnd.DropTargetEvent ; 58 import java.awt.dnd.DropTargetListener ; 59 import java.awt.event.ActionEvent ; 60 import java.awt.event.ActionListener ; 61 import java.awt.event.InputEvent ; 62 import java.awt.event.KeyEvent ; 63 import java.awt.event.MouseEvent ; 64 import java.awt.event.MouseListener ; 65 import java.awt.event.MouseMotionListener ; 66 import java.awt.event.WindowEvent ; 67 import java.awt.event.WindowListener ; 68 import java.beans.PropertyVetoException ; 69 import java.io.File ; 70 import java.io.FileReader ; 71 import java.io.FileWriter ; 72 import java.io.IOException ; 73 import java.io.LineNumberReader ; 74 import java.io.PrintWriter ; 75 import java.io.StringWriter ; 76 import java.lang.reflect.Method ; 77 import java.net.MalformedURLException ; 78 import java.net.URL ; 79 import java.util.Vector ; 80 81 import javax.swing.Icon ; 82 import javax.swing.ImageIcon ; 83 import javax.swing.JButton ; 84 import javax.swing.JDesktopPane ; 85 import javax.swing.JFrame ; 86 import javax.swing.JInternalFrame ; 87 import javax.swing.JMenu ; 88 import javax.swing.JMenuBar ; 89 import javax.swing.JMenuItem ; 90 import javax.swing.JOptionPane ; 91 import javax.swing.JPanel ; 92 import javax.swing.JPopupMenu ; 93 import javax.swing.JScrollPane ; 94 import javax.swing.JSeparator ; 95 import javax.swing.JSplitPane ; 96 import javax.swing.JTextField ; 97 import javax.swing.JToolBar ; 99 import javax.swing.JTree ; 100 import javax.swing.KeyStroke ; 101 import javax.swing.ScrollPaneConstants ; 102 import javax.swing.WindowConstants ; 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 127 public class FilterBuilder 128 extends 129 JFrame  130 implements 131 WindowListener , 132 ActionListener , 133 MouseListener , 134 MouseMotionListener , 135 DragGestureListener , 136 DragSourceListener , 137 DropTargetListener , 138 ClipboardOwner  139 { 140 static final String TITLE = "HTML Parser FilterBuilder"; 141 142 static final URL mDocumentBase; 143 144 static 145 { 146 147 String p; 148 char ps; 149 URL base; 150 151 p = System.getProperty ("user.dir"); 152 try 154 { 155 ps = (System.getProperty ("file.separator")).charAt(0); 156 if ('/' != ps) 157 p.replace (ps, '/'); 158 } 159 catch (StringIndexOutOfBoundsException e) 160 { 161 } 162 163 try 164 { 165 base = new URL ("file:///" + p + "/"); 166 } 167 catch (MalformedURLException murle) 168 { 169 base = null; 170 } 171 mDocumentBase = base; 172 } 173 174 static String mHomeDir; 175 176 static 177 { 178 String dir; 179 File file; 180 181 dir = System.getProperty ("user.home") 182 + System.getProperty ("file.separator") 183 + ".htmlparser"; 184 file = new File (dir); 185 if (!file.exists ()) 186 if (!file.mkdirs ()) throw new RuntimeException ( 188 "cannot create directory " 189 + file.getAbsolutePath ()); 190 mHomeDir = file.getAbsolutePath (); 191 } 192 193 196 protected Point mBasePoint; 197 198 201 protected Vector mSelection; 202 203 206 protected boolean mMoved; 207 208 211 protected DropTarget mDropTarget; 212 213 216 protected DragSource mDragSource; 217 218 221 protected Component mCurrentComponent; 222 223 protected JPanel mMainPanel; 224 protected JScrollPane mMainScroller; 225 protected JTextField mURLField; 226 protected JDesktopPane mOutput; 227 228 231 public FilterBuilder () 232 { 233 JMenuBar menubar; 234 JToolBar toolbar; 235 JMenu menu; 236 JPanel panel; 237 JScrollPane pane; 238 JSplitPane split; 239 JMenuItem item; 240 241 mMainPanel = new JPanel (); 243 mDropTarget = new DropTarget (mMainPanel, this); 244 mDragSource = new DragSource (); 245 246 menubar = new JMenuBar (); 248 toolbar = new JToolBar (); 249 toolbar.setAlignmentY (0.222222F); 250 251 menu = new JMenu (); 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 ()); 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 ()); 265 266 menu = new JMenu (); 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 menu = new JMenu (); 279 menu.setText ("Filter"); 280 menu.setActionCommand ("Filter"); 281 menu.setMnemonic ((int)'F'); 282 menubar.add (menu); 283 284 toolbar.add (new JToolBar.Separator ()); 285 286 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 ()); 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 ()); 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 ()); 306 307 menu = new JMenu (); 309 menu.setText ("Operation"); 310 menu.setActionCommand ("Operation"); 311 menu.setMnemonic ((int)'r'); 312 item = new JMenuItem (); 313 item.setText ("Expand"); 314 item.setActionCommand ("expandAction"); 315 item.addActionListener (this); 316 menu.add (item); 317 item = new JMenuItem (); 318 item.setText ("Collapse"); 319 item.setActionCommand ("collapseAction"); 320 item.addActionListener (this); 321 menu.add (item); 322 menu.addSeparator (); 323 item = new JMenuItem (); 324 item.setText ("Expand All"); 325 item.setActionCommand ("expandAllAction"); 326 item.addActionListener (this); 327 menu.add (item); 328 item = new JMenuItem (); 329 item.setText ("Collapse All"); 330 item.setActionCommand ("collapseAllAction"); 331 item.addActionListener (this); 332 menu.add (item); 333 menu.addSeparator (); 334 item = new JMenuItem ("Fetch Page"); 335 item.setActionCommand ("fetchAction"); 336 item.addActionListener (this); 337 menu.add (item); 338 item = new JMenuItem ("Execute Filter"); 339 item.setActionCommand ("executeAction"); 340 item.addActionListener (this); 341 menu.add (item); 342 menubar.add (menu); 343 344 menu = new JMenu (); 346 menu.setText ("Help"); 347 menu.setActionCommand ("Help"); 348 menu.setMnemonic ((int)'H'); 349 item = new JMenuItem ("Filtering"); 350 item.setActionCommand ("filteringAction"); 351 item.addActionListener (this); 352 menu.add (item); 353 item = new JMenuItem ("Instructions"); 354 item.setActionCommand ("instructionsAction"); 355 item.addActionListener (this); 356 menu.add (item); 357 item = new JMenuItem ("Tutorial"); 358 item.setActionCommand ("tutorialAction"); 359 item.addActionListener (this); 360 menu.add (item); 361 item = new JMenuItem ("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 panel = new JPanel (); 372 panel.setLayout (new FlowLayout (FlowLayout.LEFT,0,0)); 373 panel.add (toolbar); 374 getContentPane().setLayout (new BorderLayout (0,0)); 375 getContentPane ().add (BorderLayout.NORTH, panel); 376 377 mURLField = new JTextField (); 379 mURLField.setToolTipText ("Enter the URL to view"); 380 mURLField.setText ("http://sourceforge.org/projects/htmlparser"); 382 getContentPane().add (BorderLayout.SOUTH, mURLField); 383 384 setTitle (TITLE); 386 setDefaultCloseOperation (WindowConstants.DO_NOTHING_ON_CLOSE); 387 setSize (640, 480); 388 setVisible (false); 389 390 mMainPanel.setLayout (new NullLayoutManager ()); 392 mMainScroller = new JScrollPane ( 393 mMainPanel, 394 ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, 395 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); 396 397 split = new JSplitPane (); 398 pane = new JScrollPane (); 399 pane.setViewportView (mMainScroller); 400 split.setLeftComponent (pane); 401 402 mOutput = new JDesktopPane (); 403 split.setRightComponent (mOutput); 404 405 getContentPane().add (BorderLayout.CENTER, split); 406 407 setVisible (true); 409 split.setDividerLocation (0.5); 410 setVisible (false); 411 412 addWindowListener (this); 414 setIconImage (Toolkit.getDefaultToolkit ().getImage ("images/program16.gif")); 415 addMouseListener (this); 416 addMouseMotionListener (this); 417 418 mSelection = new Vector (); 420 } 421 422 427 public FilterBuilder (String title) 428 { 429 this (); 430 setTitle (title); 431 } 432 433 443 protected void makeMenuButton ( 444 String name, 445 String description, 446 String text, 447 int mnemonic, 448 KeyStroke key, 449 JToolBar toolbar, 450 JMenu menu) 451 { 452 JButton button; 453 JMenuItem item; 454 ImageIcon icon; 455 String command; 456 457 command = name.toLowerCase (); 458 try 459 { 460 icon = new ImageIcon (getURL ("images/" + command + ".gif")); 461 } 462 catch (java.net.MalformedURLException error) 463 { 464 icon = null; 465 } 466 467 item = new JMenuItem (); 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 (); 479 button.setDefaultCapable (false); 480 button.setToolTipText (description); 481 button.setMnemonic (mnemonic); 482 button.setActionCommand (command + "Action"); 483 button.setMargin (new Insets (0, 0, 0, 0)); 484 button.setIcon (icon); 485 button.addActionListener (this); 486 toolbar.add (button); 487 } 488 } 489 490 494 protected URL getURL (String spec) 495 throws MalformedURLException  496 { 497 URL ret; 498 499 if (null == (ret = getClass ().getResource (spec))) 500 if ((null != mDocumentBase) && (-1 == spec.indexOf ("//"))) 501 ret = new URL (mDocumentBase, spec); 502 else 503 ret = new URL (spec); 504 505 return ret; 506 } 507 508 514 public JButton makeFilterButton (String class_name) 515 { 516 Filter filter; 517 JButton ret; 518 519 ret = new JButton (); 520 filter = Filter.instantiate (class_name); 521 if (null != filter) 522 { 523 ret.setName (class_name); ret.setToolTipText (filter.getDescription ()); 525 ret.setMargin (new Insets (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 menu, JToolBar toolbar, String class_name) 539 { 540 Filter filter; 541 542 filter = Filter.instantiate (class_name); 543 if (null != filter) 544 { 545 String name; 546 String description; 547 Icon icon; 548 String text; 549 JMenuItem 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 (); 557 item.setName (class_name); 558 item.setText (text); 559 item.setActionCommand ("filterAction"); 560 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 point, SubFilterList list) 572 { 573 Dimension 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 598 protected void setBasePoint (Point point) 599 { 600 mBasePoint = point; 601 } 602 603 611 protected Point getBasePoint () 612 { 613 return (mBasePoint); 614 } 615 616 621 protected SubFilterList getEnclosing (Component component) 622 { 623 do 624 component = component.getParent (); 625 while ( (null != component) 626 && !(component instanceof SubFilterList)); 627 628 return ((SubFilterList)component); 629 } 630 631 636 protected SubFilterList getEnclosed (Component component) 637 { 638 Component [] list; 639 640 if (component instanceof Container ) 641 { 642 list = ((Container )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 687 protected void makeProgram (String name, StringBuffer out, FilterBean bean) 688 { 689 int[] context; String [] names; 693 Filter[] filters; 694 String 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 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
|