windowsfilechooserui.java

来自「java jdk 1.4的源码」· Java 代码 · 共 2,088 行 · 第 1/5 页

JAVA
2,088
字号
	    if (col == COLUMN_FILENAME) {		JFileChooser chooser = getFileChooser();		File f = (File)getValueAt(row, col);		String oldDisplayName = chooser.getName(f);		String oldFileName = f.getName();		String newDisplayName = ((String)value).trim();		String newFileName;		if (!newDisplayName.equals(oldDisplayName)) {		    newFileName = newDisplayName;		    //Check if extension is hidden from user		    int i1 = oldFileName.length();		    int i2 = oldDisplayName.length();		    if (i1 > i2 && oldFileName.charAt(i2) == '.') {			newFileName = newDisplayName + oldFileName.substring(i2);		    }		    // rename		    FileSystemView fsv = chooser.getFileSystemView();		    File f2 = fsv.createFileObject(f.getParentFile(), newFileName);		    if (!f2.exists() && WindowsFileChooserUI.this.getModel().renameFile(f, f2)) {			if (fsv.isParent(chooser.getCurrentDirectory(), f2)) {			    if (chooser.isMultiSelectionEnabled()) {				chooser.setSelectedFiles(new File[] { f2 });			    } else {				chooser.setSelectedFile(f2);			    }			} else {			    //Could be because of delay in updating Desktop folder			    //chooser.setSelectedFile(null);			}		    } else {			// PENDING(jeff) - show a dialog indicating failure		    }		}	    }	}	public boolean isCellEditable(int row, int column) {	    return (column == COLUMN_FILENAME);	}	public void contentsChanged(ListDataEvent e) {	    fireTableDataChanged();	}	public void intervalAdded(ListDataEvent e) {	    fireTableDataChanged();	}	public void intervalRemoved(ListDataEvent e) {	    fireTableDataChanged();	}    }    class DetailsTableCellRenderer extends DefaultTableCellRenderer {	JFileChooser chooser;	DateFormat df;	DetailsTableCellRenderer(JFileChooser chooser) {	    this.chooser = chooser;	    df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT,						chooser.getLocale());	}	public void setBounds(int x, int y, int width, int height) { 	    super.setBounds(x, y, Math.min(width, this.getPreferredSize().width+4), height); 	}	public Component getTableCellRendererComponent(JTable table, Object value,			      boolean isSelected, boolean hasFocus, int row, int column) {	    if (column == COLUMN_FILESIZE || column == COLUMN_FILEATTR) {		setHorizontalAlignment(SwingConstants.TRAILING);	    } else {		setHorizontalAlignment(SwingConstants.LEADING);	    }	    if (column == COLUMN_FILENAME && table.isRowSelected(row) && table.isFocusOwner()) {		super.setForeground(table.getSelectionForeground());		super.setBackground(table.getSelectionBackground());	    } else {		super.setForeground(table.getForeground());		super.setBackground(table.getBackground());	    }	    setFont(table.getFont());	    setValue(value); 	    return this;	}	public void setValue(Object value) { 	    setIcon(null);	    if (value instanceof File) {		File file = (File)value;		String fileName = chooser.getName(file);		setText(fileName);		Icon icon = chooser.getIcon(file);		setIcon(icon);	    } else if (value instanceof Date) {		setText((value == null) ? "" : df.format((Date)value));	    } else {		super.setValue(value);	    }	}    }    protected JPanel createDetailsView(JFileChooser fc) {	final JFileChooser chooser = fc;	JPanel p = new JPanel(new BorderLayout());	DetailsTableModel detailsTableModel = new DetailsTableModel(chooser);	detailsTable = new JTable(detailsTableModel) {	    // Handle Escape key events here	    protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed) {		if (e.getKeyCode() == KeyEvent.VK_ESCAPE && getCellEditor() == null) {		    // We are not editing, forward to filechooser.		    chooser.dispatchEvent(e);		    return true;		}		return super.processKeyBinding(ks, e, condition, pressed);	    }	};	detailsTable.setComponentOrientation(chooser.getComponentOrientation());	detailsTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);	detailsTable.setShowGrid(false);	detailsTable.setSelectionModel(listSelectionModel); 	detailsTable.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE);	Font font = detailsTable.getFont();	detailsTable.setRowHeight(Math.max(font.getSize(), 19)+3);	TableColumnModel columnModel = detailsTable.getColumnModel();	TableColumn[] columns = new TableColumn[COLUMN_COLCOUNT];	for (int i = 0; i < COLUMN_COLCOUNT; i++) {	    columns[i] = columnModel.getColumn(i);	    columns[i].setPreferredWidth(COLUMN_WIDTHS[i]);	}	TableCellRenderer cellRenderer = new DetailsTableCellRenderer(chooser);	detailsTable.setDefaultRenderer(File.class, cellRenderer);	detailsTable.setDefaultRenderer(Date.class, cellRenderer);	detailsTable.setDefaultRenderer(Object.class, cellRenderer);	// Install cell editor for editing file name	final JTextField tf = new JTextField();	tf.addFocusListener(editorFocusListener);	columns[COLUMN_FILENAME].setCellEditor(new DefaultCellEditor(tf) {	    public boolean isCellEditable(EventObject e) {		if (e instanceof MouseEvent) { 		    MouseEvent me = (MouseEvent)e;		    int index = detailsTable.rowAtPoint(me.getPoint());		    return (me.getClickCount() == 1 && detailsTable.isRowSelected(index));		}		return super.isCellEditable(e);	    }	    public Component getTableCellEditorComponent(JTable table, Object value,							 boolean isSelected, int row, int column) {		Component comp = super.getTableCellEditorComponent(table, value, isSelected, row, column);		if (value instanceof File) {		    tf.setText(chooser.getName((File)value));		    tf.requestFocus();		    tf.selectAll();		}				return comp;	    }	});	JList fakeList = new JList(detailsTableModel.listModel) {	    JTable table = detailsTable;	    public int locationToIndex(Point location) {		return table.rowAtPoint(location);	    }	    public Rectangle getCellBounds(int index0, int index1) {		Rectangle r0 = table.getCellRect(index0, COLUMN_FILENAME, false);		Rectangle r1 = table.getCellRect(index1, COLUMN_FILENAME, false);		return r0.union(r1);	    }	    	    public Object getSelectedValue() {		return table.getValueAt(table.getSelectedRow(), COLUMN_FILENAME);	    }	    public Component add(Component comp) {		if (comp instanceof JTextField) {		    return table.add(comp);		} else {		    return super.add(comp);		}	    }	    public void repaint() {		if (table != null)		    table.repaint();	    }	    public TransferHandler getTransferHandler() {		if (table != null) {		    return table.getTransferHandler();		} else {		    return super.getTransferHandler();		}	    }	    public void setTransferHandler(TransferHandler newHandler) {		if (table != null) {		    table.setTransferHandler(newHandler);		} else {		    super.setTransferHandler(newHandler);		}	    }	    public boolean getDragEnabled() {		if (table != null) {		    return table.getDragEnabled();		} else {		    return super.getDragEnabled();		}	    }	    public void setDragEnabled(boolean b) {		if (table != null) {		    table.setDragEnabled(b);		} else {		    super.setDragEnabled(b);		}	    }	};	fakeList.setSelectionModel(listSelectionModel);	detailsTable.addMouseListener(createDoubleClickListener(chooser, fakeList));	//detailsTable.addMouseListener(createSingleClickListener(chooser, fakeList));	JScrollPane scrollpane = new JScrollPane(detailsTable);	scrollpane.setComponentOrientation(chooser.getComponentOrientation());        LookAndFeel.installColors(scrollpane.getViewport(), "Table.background", "Table.foreground");	scrollpane.addComponentListener(new ComponentAdapter() {	    public void componentResized(ComponentEvent e) {		JScrollPane sp = (JScrollPane)e.getComponent();		fixNameColumnWidth(sp.getViewport().getSize().width);		sp.removeComponentListener(this);	    }	});	XPStyle xp = XPStyle.getXP();	if (xp != null) {	    Color bg = xp.getColor("listview.fillcolor", null);	    if (bg != null) {		list.setBackground(bg);	    }	}	if (listViewBorder != null) {	    scrollpane.setBorder(listViewBorder);	}	p.add(scrollpane, BorderLayout.CENTER);	return p;    }    private void fixNameColumnWidth(int viewWidth) {	TableColumn nameCol = detailsTable.getColumnModel().getColumn(COLUMN_FILENAME);	int tableWidth = detailsTable.getPreferredSize().width;	if (tableWidth < viewWidth) {	    nameCol.setPreferredWidth(nameCol.getPreferredWidth() + viewWidth - tableWidth);	}    }    private class DelayedSelectionUpdater implements Runnable {	File editFile;	DelayedSelectionUpdater() {	    this(null);	}	DelayedSelectionUpdater(File editFile) {	    this.editFile = editFile;	    SwingUtilities.invokeLater(this);	}	public void run() {	    setFileSelected();	    if (editFile != null) {		editFileName(getModel().indexOf(editFile));		editFile = null;	    }	}    }    /**     * Creates a selection listener for the list of files and directories.     *     * @param fc a <code>JFileChooser</code>     * @return a <code>ListSelectionListener</code>     */    public ListSelectionListener createListSelectionListener(JFileChooser fc) {	return new SelectionListener() {	    public void valueChanged(ListSelectionEvent e) {		if (!e.getValueIsAdjusting()) {		    JFileChooser chooser = getFileChooser();		    FileSystemView fsv = chooser.getFileSystemView();		    JList list = (JList) e.getSource();		    if (chooser.isMultiSelectionEnabled()) {			File[] files = null;			Object[] objects = list.getSelectedValues();			if (objects != null) {			    if (objects.length == 1				&& ((File)objects[0]).isDirectory()				&& chooser.isTraversable(((File)objects[0]))				&& (chooser.getFileSelectionMode() == chooser.FILES_ONLY				    || !fsv.isFileSystem(((File)objects[0])))) {				setDirectorySelected(true);				setDirectory(((File)objects[0]));			    } else {				files = new File[objects.length];				int j = 0;				for (int i = 0; i < objects.length; i++) {				    File f = (File)objects[i];				    boolean isDir = f.isDirectory();				    boolean isFile = ShellFolder.disableFileChooserSpeedFix() ? f.isFile() : !isDir;				    if ((chooser.isFileSelectionEnabled() && isFile)					|| (chooser.isDirectorySelectionEnabled()					    && fsv.isFileSystem(f)					    && isDir)) {					files[j++] = f;				    }				}				if (j == 0) {				    files = null;				} else if (j < objects.length) {				    File[] tmpFiles = new File[j];				    System.arraycopy(files, 0, tmpFiles, 0, j);				    files = tmpFiles;				}				setDirectorySelected(false);			    }			}			chooser.setSelectedFiles(files);		    } else {			File file = (File)list.getSelectedValue();			if (file != null			    && file.isDirectory()			    && chooser.isTraversable(file)			    && (chooser.getFileSelectionMode() == chooser.FILES_ONLY				|| !fsv.isFileSystem(file))) {			    setDirectorySelected(true);			    setDirectory(file);			    chooser.setSelectedFile(null);			} else {			    setDirectorySelected(false);			    if (file != null) {			       chooser.setSelectedFile(file);			    }			}		    }		}	    }	};    }    private MouseListener createSingleClickListener(JFileChooser fc, JList list) {	return new SingleClickListener(list);    }    int lastIndex = -1;    File editFile = null;    int editX = 20;    private int getEditIndex() {	return lastIndex;    }    private void setEditIndex(int i) {	lastIndex = i;    }    private void resetEditIndex() {	lastIndex = -1;    }    private void cancelEdit() {	if (editFile != null) {	    editFile = null;	    list.remove(editCell);	    centerPanel.repaint();	} else if (detailsTable != null && detailsTable.isEditing()) {	    detailsTable.getCellEditor().cancelCellEditing();	}    }    JTextField editCell = null;    private void editFileName(int index) {	ensureIndexIsVisible(index);	if (listViewPanel.isVisible()) {	    editFile = (File)getModel().getElementAt(index);	    Rectangle r = list.getCellBounds(index, index);	    if (editCell == null) {		editCell = new JTextField();		editCell.addActionListener(new EditActionListener());		editCell.addFocusListener(editorFocusListener);		editCell.setNextFocusableComponent(list);	    }	    list.add(editCell);	    editCell.setText(getFileChooser().getName(editFile));	    if (list.getComponentOrientation().isLeftToRight()) {		editCell.setBounds(editX + r.x, r.y, r.width - editX, r.height);	    } else {		editCell.setBounds(r.x, r.y, r.width - editX, r.height);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?