/************************************************************************** * Copyright (c) 2001, 2002, 2003 by Acunia N.V. All rights reserved. * * * * This software is copyrighted by and is the sole property of Acunia N.V. * * and its licensors, if any. All rights, title, ownership, or other * * interests in the software remain the property of Acunia N.V. and its * * licensors, if any. * * * * This software may only be used in accordance with the corresponding * * license agreement. Any unauthorized use, duplication, transmission, * * distribution or disclosure of this software is expressly forbidden. * * * * This Copyright notice may not be removed or modified without prior * * written consent of Acunia N.V. * * * * Acunia N.V. reserves the right to modify this software without notice. * * * * Acunia N.V. * * Philips-site 5, box 3 info@acunia.com * * 3001 Leuven http://www.acunia.com * * Belgium - EUROPE * **************************************************************************/ package com.acunia.wonka.rudolph.peers; import java.awt.peer.*; import java.awt.event.*; import java.awt.*; import java.io.*; import java.util.StringTokenizer; import java.util.Arrays; public class DefaultFileDialog extends DefaultDialog implements FileDialogPeer { TextField pathtext; TextField filetext; TextField filtertext; List folderlist; private List fileslist; private Button okbutton; private Button cancelbutton; private EventHandler eventHandler = new EventHandler(); FilenameFilter filter; String dir = ""; String file; private boolean gui = false; boolean loopback = false; public DefaultFileDialog(FileDialog fileDialog) { super(fileDialog); } public void setDirectory(String dir) { if(loopback) return; this.dir = dir; } public void setFile(String file) { if(loopback) return; this.file = file; } public void setFilenameFilter(FilenameFilter filter) { this.filter = filter; } public void setVisible(boolean visible) { if(visible && !gui) { buildDialog(); updateLists(); } super.setVisible(visible); } private void buildDialog() { gui = true; InsetsPanel mainpanel = new InsetsPanel(0, 4, 0, 4); mainpanel.setLayout(new BorderLayout(1, 1)); Panel pathpanel = new Panel(); pathpanel.setLayout(new BorderLayout()); pathtext = new TextField(dir); pathtext.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { dir = pathtext.getText(); updateLists(); } }); Label pathlabel = new Label("Enter path or folder name:"); pathpanel.add(pathlabel, BorderLayout.NORTH); pathpanel.add(pathtext, BorderLayout.CENTER); Panel filepanel = new Panel(); filepanel.setLayout(new BorderLayout()); filetext = new TextField(); filetext.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { file = pathtext.getText(); } }); Label filelabel = new Label("Enter file name:"); filepanel.add(filelabel, BorderLayout.NORTH); filepanel.add(filetext, BorderLayout.CENTER); Panel filterpanel = new Panel(); filterpanel.setLayout(new BorderLayout()); Label filterlabel = new Label("Filter"); filtertext = new TextField(); filtertext.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if(filtertext.getText() != "") { filter = new Filter(filtertext.getText()); } else { filter = null; } updateLists(); } }); filterpanel.add(filterlabel, BorderLayout.NORTH); filterpanel.add(filtertext, BorderLayout.CENTER); Panel bottompanel = new Panel(); bottompanel.setLayout(new BorderLayout()); bottompanel.add(filepanel, BorderLayout.CENTER); bottompanel.add(filterpanel, BorderLayout.EAST); Panel selectpanel = new Panel(); selectpanel.setLayout(new GridLayout(1, 2)); InsetsPanel selpathpanel = new InsetsPanel(0, 0, 0, 2); selpathpanel.setLayout(new BorderLayout()); Label folderlabel = new Label("Folders"); folderlist = new List(); folderlist.addItemListener(eventHandler); selpathpanel.add(folderlabel, BorderLayout.NORTH); selpathpanel.add(folderlist, BorderLayout.CENTER); InsetsPanel selfilepanel = new InsetsPanel(0, 2, 0, 0); selfilepanel.setLayout(new BorderLayout()); Label fileslabel = new Label("Files"); fileslist = new List(); fileslist.addItemListener(eventHandler); selfilepanel.add(fileslabel, BorderLayout.NORTH); selfilepanel.add(fileslist, BorderLayout.CENTER); selectpanel.add(selpathpanel); selectpanel.add(selfilepanel); mainpanel.add(pathpanel, BorderLayout.NORTH); mainpanel.add(selectpanel, BorderLayout.CENTER); mainpanel.add(bottompanel, BorderLayout.SOUTH); InsetsPanel buttonpanel = new InsetsPanel(2, 2, 2, 2); buttonpanel.setLayout(new GridLayout(1, 2, 2, 2)); okbutton = new Button(((FileDialog)component).getMode() == FileDialog.LOAD ? "Load" : "Save"); cancelbutton = new Button("Cancel"); okbutton.addActionListener(eventHandler); okbutton.setActionCommand("ok"); cancelbutton.addActionListener(eventHandler); cancelbutton.setActionCommand("cancel"); buttonpanel.add(okbutton); buttonpanel.add(cancelbutton); ((Dialog)component).add(mainpanel, BorderLayout.CENTER); ((Dialog)component).add(buttonpanel, BorderLayout.SOUTH); } void updateLists() { folderlist.removeAll(); folderlist.add(".."); fileslist.removeAll(); File currentdir = new File(dir); String list[] = currentdir.list(); Arrays.sort(list); for(int i=0; i<list.length; i++) { File current = new File(dir + "/" + list[i]); if(current.isFile()) { if((filter != null && filter.accept(currentdir, list[i])) || filter == null) { fileslist.add(list[i]); } } else { folderlist.add(list[i]); } } } /* ** A small and simple class to handle all the events in the ** FileDialog. */ private class EventHandler implements ItemListener, ActionListener { public synchronized void itemStateChanged(ItemEvent event) { if(event.getItemSelectable() == folderlist) { File f = new File(dir += "/" + (String)event.getItem()); try { dir = f.getCanonicalPath(); } catch(Exception e) { } loopback = true; ((FileDialog)component).setDirectory(dir); loopback = false; pathtext.setText(dir); updateLists(); } else { file = (String)event.getItem(); filetext.setText(file); loopback = true; ((FileDialog)component).setFile(file); loopback = false; } } public synchronized void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("cancel")) { file = null; } if(file == "") file = null; component.setVisible(false); loopback = true; ((FileDialog)component).setFile(file); loopback = false; } } /* ** A Panel with specified insets.. This will be removed once ** the whole layout is done over with a GridbagLayout. */ private class InsetsPanel extends Panel { private Insets insets; public InsetsPanel(int x1, int y1, int x2, int y2) { insets = new Insets(x1, y1, x2, y2); } public Insets getInsets() { return insets; } } /* ** A simple FilenameFilter. */ private class Filter implements FilenameFilter { private String tokens[]; public Filter(String filter) { StringTokenizer stok = new StringTokenizer(filter, "*?", true); tokens = new String[stok.countTokens()]; int i = 0; while(stok.hasMoreTokens()) { tokens[i++] = stok.nextToken(); } } public boolean accept(File dir, String name) { return match(name, 0); } public boolean match(String name, int level) { if (level == tokens.length) { /* ** There's no more stuff left. */ return true; } if(tokens[level].equals("?")) { /* ** Skip a character and this token and continue. */ return match(name.substring(1), level + 1); } else if(tokens[level].equals("*")) { /* ** Skip a lot. */ if(level == tokens.length - 1) { /* ** This is the last token, so there's ** a match. */ return true; } boolean result = false; int name_length = name.length(); for(int i=0; i < name_length && !result; i++) { result = match(name.substring(i), level + 1); } return result; } else { /* ** Check if this token matches. */ if(name.startsWith(tokens[level])) { /* ** There's a match, continue with the remaining. */ return match(name.substring(tokens[level].length()), level + 1); } else { /* ** No match. */ return false; } } } } }