# Inhalt eines Archivs in einem JTree?



## Math55 (20. Dezember 2004)

nabend, ich möchte den inhalt eines zipfiles in einem jtree darstellen. das ganze soll dann so aussehen, wie ein dateisystembrowser. hat das schonmal jemand von euch gemacht?

DANKE


----------



## soa (20. Dezember 2004)

Moin,

bei Swing gibt es einenContainer  Split Pane, der wohl eine entsprechende Ausgabe 
erzeugen könnte. Schau doch bitte einmal in die API...

Den File würde ich über eine separate Klasse mit ZipInputStream einlesen. Gemacht habe ich das jedoch noch nicht. Vielleicht hilft es ja trotzdem ein wenig...

Grüße
SOA


----------



## Math55 (21. Dezember 2004)

hi, ich weiss doch, wie ich das zip einlese. mirgehts um die darstellung in dem jtree

gruß


----------



## RedWing (22. Dezember 2004)

Hallo,
was für eine Darstellung hättest du denn gern?
Also alle Files in einer einhierarchischen Ebene abzubilden sollte kein Problem sein,
schwieriger wirds wenn du Verzeichnissbasierend alles abbilden willst. Also sprich:

test.zip:
/test/hallo
/test/daten/versuch
/test.txt

Dann willst du sicherlich sowas haben:


```
test.zip
  |
  ->hallo
  ->daten
  |     |
  |     ->versuch
  ->test.txt
```
Auf eine Lösung nur mit der Java API bin ich auch nicht gekommen,
aber wenn du mit eclipse arbeitest könntest du die Klasse 
org.eclipse.ui.wizards.datatransfer.ZipFileStructureProvider
verwenden.
Die Klasse bietet dir nämlich im  Unterschied zu den Standard zip Utilities der Java API
die Möglichkeit das Zipfile gleich als strukturierte Datenstruktur zu interpretieren.
Man könnte sich dann alle children eines Knoten von der Klasse geben lassen
und diese dann zu den Root Knoten des JTrees adden(iterativ). Wenn der 
momentane Knoten der Klasse ZipFileStructureProvider ein directory ist ruft man die
Funktion dann rekursiv auf...
Wenn jemand eine Lösung unabhängig vom eclipse package parat hat würde mich das auch
intressieren..

Gruß

RedWing


----------



## Math55 (23. Dezember 2004)

hallo, jaja, du weisst was ich meine . ich werd die klasse mal testen. nur mit der api ist das irgendwie sehr kompliziert. die eclipse sache sollte ja mit jarsauch gehen, oder?

muss ich dazu swt nutzen? sicher nicht, oder? also ich habe eiclipse als entwicklungsumgebung installiert, aber woher bekomm ich denn das package dafür, wenn ich ohne eclipse arbeite?

gruß und besten DANK


----------



## RedWing (23. Dezember 2004)

Math55 hat gesagt.:
			
		

> hallo, jaja, du weisst was ich meine . ich werd die klasse mal testen. nur mit der api ist das irgendwie sehr kompliziert. die eclipse sache sollte ja mit jarsauch gehen, oder?
> 
> muss ich dazu swt nutzen? sicher nicht, oder? also ich habe eiclipse als entwicklungsumgebung installiert, aber woher bekomm ich denn das package dafür, wenn ich ohne eclipse arbeite?
> 
> gruß und besten DANK



Hi,

wie gesagt hab mich mit der Java API an das Problem gewagt, nachdem ich aber dann gemerkt hatte das ich so nicht zum Ziel kommen kann, hab ich nach ner brauchbaren Lösung
im Internet gesucht, und bin auf die Klasse gestoßen. Aber da ich nicht mit eclipse
arbeite hat ich keine Lust deswegen noch eclipse zu installieren, deswegen kann 
ich dir da leieder nicht viel Infos mitgeben...




> muss ich dazu swt nutzen? sicher nicht, oder?



Ich glaube nicht wozu auch?

Ich hoffe ich konnt dir trotzdem weiter helfen...

Gruß

RedWing


----------



## Thomas Darimont (23. Dezember 2004)

Hallo!

"Man sollte nicht immer alles von Hand machen"...
hab meine Lösung eingestampft.

hier die "Musterlösung" -> http://www.java-forum.org/de/viewtopic.php?p=66046#66046

Gruß Tom


----------



## RedWing (23. Dezember 2004)

Thomas Darimont hat gesagt.:
			
		

> Hallo!
> 
> "Man sollte nicht immer alles von Hand machen"...
> hab meine Lösung eingestampft.
> ...



Kann sein, 
fand deine Lösung trotzdem Klasse 
Respekt

Gruß

RedWing


----------



## Thomas Darimont (23. Dezember 2004)

Hallo!

Hier mal ne neue Lösung die auf der von Benjamin aufbaut aber IMHO noch ein wenig schicker ist ;-)

(Auch wenn ich keine Generics verwendet hab... ) 
Btw. solangsam wirds mal Zeit für ne Umfrage ab wann ich in allen meinen Beispielen Generics verwenden kann, sprich ab wann die überwiegende Mehrheit der "Mitleser/Poster" Java 5.0 verwenden....


```
/*
 * Created on 23.12.2004@20:18:59
 *
 * TODO Licence info
 *  
 */
package de.tutorials;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.filechooser.FileFilter;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;

/**
 * @author Administrator
 * 
 * TODO Explain me
 * 
 */
public class ZipViewer extends JFrame {

	/**
	 * Comment for <code>serialVersionUID</code>
	 */
	private static final long serialVersionUID = 3979269140316238387L;

	private JTree tree;

	private JButton btn;

	private JProgressBar progressBar;

	private JFileChooser fileChooser;

	private DefaultTreeModel model;

	public ZipViewer() {
		super("ZipViewer");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		tree = new JTree((TreeModel) null);
		btn = new JButton("select archive");
		progressBar = new JProgressBar();
		btn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (fileChooser == null) {
					fileChooser = new JFileChooser();
					fileChooser.setFileFilter(new FileFilter() {
						public boolean accept(File f) {
							if (f.isDirectory()) {
								return true;
							}
							String name = f.getName();
							return Pattern.matches(".*.(zip|jar)", name);
						}

						public String getDescription() {
							return "Supported Archiv extensions (zip,jar)";
						}
					});
				}

				if (fileChooser.showOpenDialog(ZipViewer.this) == JFileChooser.APPROVE_OPTION) {
					final File file = fileChooser.getSelectedFile();
					if (file.isFile()) {
						System.out.println(file);

						new Thread() {
							{
								setPriority(MIN_PRIORITY);
							}

							public void run() {
								btn.setEnabled(false);
								processArchive(file);
								btn.setEnabled(true);
							}
						}.start();
						
					}
				}
			}
		});

		Container c = getContentPane();
		c.add(new JScrollPane(tree) {
			{
				setPreferredSize(new Dimension(180, 400));
			}
		}, BorderLayout.NORTH);
		c.add(btn, BorderLayout.CENTER);
		c.add(progressBar, BorderLayout.SOUTH);

		pack();
		setVisible(true);
	}

	/**
	 * @param file
	 */
	protected void processArchive(File file) {

		try {
			model = new ArchiveTreeModel(new ZipFile(file));
		} catch (ZipException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		tree.setModel(model);
	}

	public static void main(String[] args) {
		new ZipViewer();
	}

	class ArchiveTreeModel extends DefaultTreeModel {

		/**
		 * Comment for <code>serialVersionUID</code>
		 */
		private static final long serialVersionUID = 3258689897023093049L;

		public ArchiveTreeModel(ZipFile zipFile) {
			super(new DefaultMutableTreeNode("/"));

			/* */
			progressBar.setMinimum(0);
			progressBar.setMaximum(zipFile.size());
			int value = 0;
			/* */

			Enumeration entries = zipFile.entries();
			while (entries.hasMoreElements()) {
				ZipEntry entry = (ZipEntry) entries.nextElement();
				String name = entry.getName();
				String[] elements = name.split("/");

				DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) getRoot();
				/* */
				progressBar.setValue(++value);
				/* */

				for (int i = 0; i < elements.length; i++) {
					String token = elements[i];
					DefaultMutableTreeNode nextNode = findNode(currentNode,
							token);
					if (nextNode == null) {
						nextNode = new DefaultMutableTreeNode(token);
						currentNode.add(nextNode);
					}
					currentNode = nextNode;
				}

			}
		}

		private DefaultMutableTreeNode findNode(DefaultMutableTreeNode parent,
				String name) {
			Enumeration e = parent.children();
			while (e.hasMoreElements()) {
				DefaultMutableTreeNode element = (DefaultMutableTreeNode) e
						.nextElement();
				if (element.getUserObject().equals(name)) {
					return element;
				}
			}
			return null;
		}
	}
}
```

Gruß Tom


----------



## Thomas Darimont (24. Dezember 2004)

Hallo!

Hier nochmal kurz auf die schnelle ein Update:

```
/*
 * Created on 23.12.2004@20:18:59
 *
 * TODO Licence info
 *  
 */
package de.tutorials.zipviewer;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextPane;
import javax.swing.JTree;
import javax.swing.filechooser.FileFilter;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;

/**
 * @author Administrator
 * 
 * TODO Explain me
 * 
 */
public class ArchiveViewer extends JFrame {

	/**
	 * Comment for <code>serialVersionUID</code>
	 */
	private static final long serialVersionUID = 3979269140316238387L;

	private JTree tree;
	
	private final static String APP_TITLE = "ArchiveViewer";

	private JButton btn;

	private JTextPane textPane;

	private JProgressBar progressBar;

	private JFileChooser fileChooser;

	private DefaultTreeModel model;

	private ZipFile theZipFile;

	public ArchiveViewer() {
		super(APP_TITLE);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setResizable(false);

		JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
		JPanel leftPanel = new JPanel(new BorderLayout());
		tree = new JTree((TreeModel) null);
		tree.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				TreePath path = tree.getSelectionPath();
				if (path == null)
					return;

				tree.scrollPathToVisible(path);
				
				Object[] elements = path.getPath();
				String fileName = elements[elements.length - 1].toString();
				if (!fileName.endsWith(".java"))
					return;

				
				StringBuilder builder = new StringBuilder();
				for (int i = 1; i < elements.length - 1; i++) {
					builder.append(elements[i]);
					builder.append('/');
				}

				builder.append(fileName);

				ZipEntry entry = findEntryByName(builder.toString());
				if (entry == null)
					return;
				
				try {
					textPane.read(theZipFile.getInputStream(entry), fileName);
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});

		btn = new JButton("select archive");
		progressBar = new JProgressBar();
		btn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (fileChooser == null) {
					fileChooser = new JFileChooser();
					fileChooser.setFileFilter(new FileFilter() {
						public boolean accept(File f) {
							if (f.isDirectory()) {
								return true;
							}
							String name = f.getName();
							return name.matches(".*.(zip|jar)");
						}

						public String getDescription() {
							return "Supported Archiv extensions (zip,jar)";
						}
					});
				}

				if (fileChooser.showOpenDialog(ArchiveViewer.this) == JFileChooser.APPROVE_OPTION) {
					final File file = fileChooser.getSelectedFile();
					if (file.isFile()) {
						System.out.println(file);

						new Thread() {
							{
								setPriority(MIN_PRIORITY);
							}

							public void run() {
								btn.setEnabled(false);
								setTitle(APP_TITLE + ": " + file.getName());
								processArchive(file);
								btn.setEnabled(true);
							}
						}.start();

					}
				}
			}
		});

		Container c = getContentPane();

		leftPanel.add(new JScrollPane(tree) {
			{
				setPreferredSize(new Dimension(180, 400));
			}
		}, BorderLayout.NORTH);
		leftPanel.add(btn, BorderLayout.CENTER);
		leftPanel.add(progressBar, BorderLayout.SOUTH);

		textPane = new JTextPane() {
			public void setSize(Dimension d) {
				if (d.width < getParent().getSize().width)
					d.width = getParent().getSize().width;

				super.setSize(d);
			}

			public boolean getScrollableTracksViewportWidth() {
				return false;
			}
		};

		splitPane.add(leftPanel);
		splitPane.add(new JPanel(new BorderLayout()) {
			{
				setPreferredSize(new Dimension(500, 400));
				add(new JScrollPane(textPane), BorderLayout.CENTER);
			}
		});

		c.add(splitPane);

		pack();
		setVisible(true);
	}

	/**
	 * @param file
	 */
	protected void processArchive(File file) {

		try {
			model = new ArchiveTreeModel(new ZipFile(file));
		} catch (ZipException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		tree.setModel(model);
	}

	public static void main(String[] args) {
		new ArchiveViewer();
	}

	private ZipEntry findEntryByName(String name) {
		ZipEntry entry = null;
		for (Enumeration e = theZipFile.entries(); e
				.hasMoreElements();) {
			entry = (ZipEntry)e.nextElement();
			if (entry.getName().equals(name)) {
				return entry;
			}
		}

		return null;
	}

	class ArchiveTreeModel extends DefaultTreeModel {

		/**
		 * Comment for <code>serialVersionUID</code>
		 */
		private static final long serialVersionUID = 3258689897023093049L;

		public ArchiveTreeModel(ZipFile zipFile) {
			super(new DefaultMutableTreeNode("/"));

			/* */

			theZipFile = zipFile;

			progressBar.setMinimum(0);
			progressBar.setMaximum(zipFile.size());
			int value = 0;
			/* */

			Enumeration entries = zipFile.entries();
			while (entries.hasMoreElements()) {
				ZipEntry entry = (ZipEntry) entries.nextElement();
				String name = entry.getName();
				String[] elements = name.split("/");

				DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) getRoot();
				/* */
				progressBar.setValue(++value);
				/* */

				for (int i = 0; i < elements.length; i++) {
					String token = elements[i];
					DefaultMutableTreeNode nextNode = findNode(currentNode,
							token);
					if (nextNode == null) {
						nextNode = new DefaultMutableTreeNode(token);
						currentNode.add(nextNode);
					}
					currentNode = nextNode;
				}

			}
		}

		private DefaultMutableTreeNode findNode(DefaultMutableTreeNode parent,
				String name) {
			Enumeration e = parent.children();
			while (e.hasMoreElements()) {
				DefaultMutableTreeNode element = (DefaultMutableTreeNode) e
						.nextElement();
				if (element.getUserObject().equals(name)) {
					return element;
				}
			}
			return null;
		}
	}
}
```

Vielleicht hat ja mal jemand über die "Tage" Zeit und Lust Syntaxhighlighting (das hier:
http://ostermiller.org/syntax/editor.html ) einzubauen... ;-)

Gruß tom


----------



## RedWing (29. Dezember 2004)

Hi,
update:


```
/**reated on 23.12.2004@20:18:59
 *
 * TODO Licence info
 *
 */

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyAdapter;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextPane;
import javax.swing.JTree;
import javax.swing.filechooser.FileFilter;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
import javax.swing.text.StyleConstants;
import javax.swing.text.Style;

import com.Ostermiller.Syntax.Lexer.JavaLexer;
import com.Ostermiller.Syntax.Lexer.CLexer;
import com.Ostermiller.Syntax.Lexer.Lexer;
import com.Ostermiller.Syntax.Lexer.JavaToken;
import com.Ostermiller.Syntax.Lexer.CToken;
import com.Ostermiller.Syntax.Lexer.Token;

/**
 * @author Administrator
 *
 * TODO Explain me
 *
 */

public class ArchiveViewer extends JFrame {

	/**
	 * Comment for <code>serialVersionUID</code>
	 */
	private static final long serialVersionUID = 3979269140316238387L;

	private JTree tree;

	private final static String APP_TITLE = "ArchiveViewer";

	private JButton btn;

	private JTextPane textPane;

	private JProgressBar progressBar;

	private JFileChooser fileChooser;

	private DefaultTreeModel model;

	private ZipFile theZipFile;

	private SyntaxHighLighter highlighter;

	public ArchiveViewer() {
		super(APP_TITLE);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setResizable(false);

		JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
		JPanel leftPanel = new JPanel(new BorderLayout());
		tree = new JTree((TreeModel) null);
		tree.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				TreePath path = tree.getSelectionPath();
				if (path == null)
					return;

				tree.scrollPathToVisible(path);

				Object[] elements = path.getPath();
				String fileName = elements[elements.length - 1].toString();

				StringBuilder builder = new StringBuilder();
				for (int i = 1; i < elements.length - 1; i++) {
					builder.append(elements[i]);
					builder.append('/');
				}

				builder.append(fileName);

				ZipEntry entry = findEntryByName(builder.toString());
				if (entry == null)
					return;


				try {
					if(fileName.endsWith(".java"))
						highlighter = new JavaSyntaxHighLighter(theZipFile.getInputStream(entry), textPane);



					else if(fileName.endsWith(".cpp") || fileName.endsWith(".c")
									|| fileName.endsWith(".cc")
									|| fileName.endsWith(".c++")
									|| fileName.endsWith(".h")
									|| fileName.endsWith(".hpp"))
						highlighter = new CSyntaxHighLighter(theZipFile.getInputStream(entry), textPane);
					textPane.read(theZipFile.getInputStream(entry), fileName);
					highlighter.highlight();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});

		btn = new JButton("select archive");
		progressBar = new JProgressBar();
		btn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (fileChooser == null) {
					fileChooser = new JFileChooser();
					fileChooser.setFileFilter(new FileFilter() {
						public boolean accept(File f) {
							if (f.isDirectory()) {
								return true;
							}
							String name = f.getName();
							return name.matches(".*.(zip|jar)");
						}

						public String getDescription() {
							return "Supported Archiv extensions (zip,jar)";
						}
					});
				}

				if (fileChooser.showOpenDialog(ArchiveViewer.this) == JFileChooser.APPROVE_OPTION) {
					final File file = fileChooser.getSelectedFile();
					if (file.isFile()) {
						System.out.println(file);

						new Thread() {
							{
								setPriority(MIN_PRIORITY);
							}

							public void run() {
								btn.setEnabled(false);
								setTitle(APP_TITLE + ": " + file.getName());
								processArchive(file);
								btn.setEnabled(true);
							}
						}.start();

					}
				}
			}
		});

		Container c = getContentPane();

		leftPanel.add(new JScrollPane(tree) {
			{
				setPreferredSize(new Dimension(180, 400));
			}
		}, BorderLayout.NORTH);
		leftPanel.add(btn, BorderLayout.CENTER);
		leftPanel.add(progressBar, BorderLayout.SOUTH);

		textPane = new JTextPane() {
			public void setSize(Dimension d) {
				if (d.width < getParent().getSize().width)
					d.width = getParent().getSize().width;

				super.setSize(d);
			}

			public boolean getScrollableTracksViewportWidth() {
				return false;
			}
		};

		splitPane.add(leftPanel);
		splitPane.add(new JPanel(new BorderLayout()) {
			{
				setPreferredSize(new Dimension(500, 400));
				add(new JScrollPane(textPane), BorderLayout.CENTER);
			}
		});

		c.add(splitPane);

		pack();
		setVisible(true);
		textPane.setEditable(false);
	}

	/**
	 * @param file
	 */
	protected void processArchive(File file) {

		try {
			model = new ArchiveTreeModel(new ZipFile(file));
		} catch (ZipException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		tree.setModel(model);
	}

	public static void main(String[] args) {
		new ArchiveViewer();
	}

	private ZipEntry findEntryByName(String name) {
		ZipEntry entry = null;
		for (Enumeration e = theZipFile.entries(); e
				.hasMoreElements();) {
			entry = (ZipEntry)e.nextElement();
			if (entry.getName().equals(name)) {
				return entry;
			}
		}

		return null;
	}

	class ArchiveTreeModel extends DefaultTreeModel {

		/**
		 * Comment for <code>serialVersionUID</code>
		 */
		private static final long serialVersionUID = 3258689897023093049L;

		public ArchiveTreeModel(ZipFile zipFile) {
			super(new DefaultMutableTreeNode("/"));

			/* */

			theZipFile = zipFile;

			progressBar.setMinimum(0);
			progressBar.setMaximum(zipFile.size());
			int value = 0;
			/* */

			Enumeration entries = zipFile.entries();
			while (entries.hasMoreElements()) {
				ZipEntry entry = (ZipEntry) entries.nextElement();
				String name = entry.getName();
				String[] elements = name.split("/");

				DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) getRoot();
				/* */
				progressBar.setValue(++value);
				/* */

				for (int i = 0; i < elements.length; i++) {
					String token = elements[i];
					DefaultMutableTreeNode nextNode = findNode(currentNode,
							token);
					if (nextNode == null) {
						nextNode = new DefaultMutableTreeNode(token);
						currentNode.add(nextNode);
					}
					currentNode = nextNode;
				}

			}
		}

		private DefaultMutableTreeNode findNode(DefaultMutableTreeNode parent,
				String name) {
			Enumeration e = parent.children();
			while (e.hasMoreElements()) {
				DefaultMutableTreeNode element = (DefaultMutableTreeNode) e
						.nextElement();
				if (element.getUserObject().equals(name)) {
					return element;
				}
			}
			return null;
		}
	}
}

class JavaSyntaxHighLighter extends SyntaxHighLighter{

	public JavaSyntaxHighLighter(InputStream in, JTextPane pane){
		this.pane = pane;
		reader = new InputStreamReader(in);
		lexer = new JavaLexer(reader);
	}

	public void highlight(){
		JavaToken token = null;
		initializeStyles();
		try{
			while((token = (JavaToken)lexer.getNextToken()) != null){
				if(token.isReservedWord()){
				pane.getStyledDocument().setCharacterAttributes(token.getCharBegin(),
									token.getCharEnd() - token.getCharBegin(),
									pane.getStyle("Khaki"), true);
				}
				if(token.isLiteral()){
					pane.getStyledDocument().setCharacterAttributes(token.getCharBegin(),
									token.getCharEnd() - token.getCharBegin(),
									 pane.getStyle("Coral"), true);
				}
				if(token.isComment()){
					pane.getStyledDocument().setCharacterAttributes(token.getCharBegin(),
									token.getCharEnd() - token.getCharBegin(),
									 pane.getStyle("NavyBlue"), true);
				}
			}
		}
		catch(IOException e){ System.out.println("IO Exception :(");}
	}
}

class CSyntaxHighLighter extends SyntaxHighLighter{

	public CSyntaxHighLighter(InputStream in, JTextPane pane){
		this.pane = pane;
		reader = new InputStreamReader(in);
		lexer = new CLexer(reader);
	}

	public void highlight(){
		CToken token = null;
		initializeStyles();
		try{
			while((token = (CToken)lexer.getNextToken()) != null){
				if(token.isReservedWord()){
					pane.getStyledDocument().setCharacterAttributes(token.getCharBegin(),
									token.getCharEnd() - token.getCharBegin(),
									pane.getStyle("Khaki"), true);
				}
				if(token.isLiteral()){
					pane.getStyledDocument().setCharacterAttributes(token.getCharBegin(),
									token.getCharEnd() - token.getCharBegin(),
									 pane.getStyle("Coral"), true);
				}
				if(token.isComment()){
					pane.getStyledDocument().setCharacterAttributes(token.getCharBegin(),
									token.getCharEnd() - token.getCharBegin(),
									 pane.getStyle("NavyBlue"), true);
				}
				if(token.isPreProcessor()){
					pane.getStyledDocument().setCharacterAttributes(token.getCharBegin(),
									token.getCharEnd() - token.getCharBegin(),
									pane.getStyle("Violet"),true);
				}
			}
		}
		catch(IOException e){ System.out.println("IO Exception :(");}
	}
}

abstract class SyntaxHighLighter{

	protected JTextPane pane = null;
	protected Lexer lexer = null;
	protected InputStreamReader reader = null;

	protected void initializeStyles(){
		Style style = pane.addStyle("Khaki", null);
		StyleConstants.setForeground(style, new Color(220,210,140));
		style = pane.addStyle("NavyBlue", null);
		StyleConstants.setForeground(style, new Color(0,0,196));
		style = pane.addStyle("Coral", null);
		StyleConstants.setForeground(style, new Color(205,91,69));
		style = pane.addStyle("Violet", null);
		StyleConstants.setForeground(style, new Color(208,32,144));

	}

	abstract public void highlight();
}
```

@Tom:

Würde sich bestimmt gut als JavaTutorial machen 

Gruß

RedWing


----------



## Thomas Darimont (30. Dezember 2004)

Hi Redwing!

Coole Sache mit dem Syntaxhighlighting. Jedoch will das bei mir irgendwie noch nciht so richtig   "er" highlightet mir auch einfach "zwischendrin" Wörter in Kommentaren etc. auch extrakte von Methodennamen werden "gehighlightet".

Ist das hier nicht schon viel zu speziell für ein tutorial? Okay man könnte natürlich ein "So bastel ich mir meinen Archiv Viewer"-Tutorial draus machen. Aber dazu ist der Code noch zu unvollständig ... dann bräuchte man noch Unterstützung für Bildformate und und und.... aber mal schauen wie sich das ganze aufbereiten lässt.  

Gruß Tom


----------



## RedWing (30. Dezember 2004)

Hallo Thomas.


> Coole Sache mit dem Syntaxhighlighting. Jedoch will das bei mir irgendwie noch nciht so richtig "er" highlightet mir auch einfach "zwischendrin" Wörter in Kommentaren etc. auch extrakte von Methodennamen werden "gehighlightet".



Mhm strange schau mal da:
http://turing.fh-landshut.de/~skreyer/Screen.jpg

Was verstehst du unter Methoden extrakten?



> Ist das hier nicht schon viel zu speziell für ein tutorial? Okay man könnte natürlich ein "So bastel ich mir meinen Archiv Viewer"-Tutorial draus machen.



Naja so ein Tutorial koennte den Leuten den Umgang mit JTrees zeigen,
und wie man Zipfiles ein und ausliest, wäre dann halt sehr praktisch orientiert,
aber ok wie ich finde...

Extensions die man noch vornehmen koennte wären zum Beispiel den 
ArchiveViewer vielleicht zu einem ArchivModifier umzuwandeln. Mit 
Grundfunktionen wie update oder Speichern,
einem kleinen Texteditor der ja schon vorhanden ist, bei dem man aber 
das Highlighting noch auf Caretereignisse anpassen müsste...

Gruß

RedWing


----------



## desmina (28. Februar 2005)

Hallo Läute,

 hab ein Problem, muss ein Baum implementieren, das wie ein BrowserBaum funktioniert, ihm sollen belibig viele Knoten hinzugefügt und gelöscht werden können.Dankbar für je Hinweiß. 

  gruß desmina


----------

