package org.jtheque.movies.views.impl.panel; import org.jdesktop.swingx.event.WeakEventListenerList; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JTable; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.table.TableCellEditor; import java.awt.Color; import java.awt.Component; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.EventObject; /* * Copyright JTheque (Baptiste Wicht) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * An editor to choose a movie file in a table. * * @author Baptiste Wicht */ public final class MovieChooserEditor extends JButton implements TableCellEditor, ActionListener { private final WeakEventListenerList listeners = new WeakEventListenerList(); private final ChangeEvent event = new ChangeEvent(this); private File file; /** * Construct a new MovieChooserEditor. */ public MovieChooserEditor() { super(""); setBackground(Color.white); setBorderPainted(false); setMargin(new Insets(0, 0, 0, 0)); addActionListener(this); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { return this; } @Override public void actionPerformed(ActionEvent e) { JFileChooser chooser = new JFileChooser("d:\\html"); int returnVal = chooser.showOpenDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { file = chooser.getSelectedFile(); fireEditingStopped(); } else { fireEditingCanceled(); } } @Override public void addCellEditorListener(CellEditorListener listener) { listeners.add(CellEditorListener.class, listener); } @Override public void removeCellEditorListener(CellEditorListener listener) { listeners.remove(CellEditorListener.class, listener); } /** * Fire an event that say that the editing has stopped. */ protected void fireEditingStopped() { CellEditorListener[] editorListeners = listeners.getListeners(CellEditorListener.class); for (CellEditorListener listener : editorListeners) { listener.editingStopped(event); } } /** * Fire an event that say that the editing has been canceled. */ protected void fireEditingCanceled() { CellEditorListener[] editorListeners = listeners.getListeners(CellEditorListener.class); for (CellEditorListener listener : editorListeners) { listener.editingCanceled(event); } } @Override public void cancelCellEditing() { fireEditingCanceled(); } @Override public boolean stopCellEditing() { fireEditingStopped(); return true; } @Override public boolean isCellEditable(EventObject event) { return true; } @Override public boolean shouldSelectCell(EventObject event) { return true; } @Override public Object getCellEditorValue() { return file; } }