/* * Beanfabrics Framework Copyright (C) by Michael Karneim, beanfabrics.org * Use is subject to license terms. See license.txt. */ package org.beanfabrics.swing.table; import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.FlowLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.util.Date; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.UIManager; import javax.swing.border.EmptyBorder; import org.beanfabrics.BnModelObserver; import org.beanfabrics.IModelProvider; import org.beanfabrics.Link; import org.beanfabrics.ModelProvider; import org.beanfabrics.ModelSubscriber; import org.beanfabrics.Path; import org.beanfabrics.View; import org.beanfabrics.model.AbstractPM; import org.beanfabrics.model.IconTextPM; import org.beanfabrics.model.MapPM; import org.beanfabrics.model.OperationPM; import org.beanfabrics.model.PMManager; import org.beanfabrics.model.TextPM; import org.beanfabrics.support.Operation; import org.beanfabrics.support.Validation; import org.beanfabrics.swing.BnAction; import org.beanfabrics.swing.BnButton; import org.beanfabrics.swing.table.BnTable; import org.beanfabrics.swing.table.BnColumnBuilder; /** * @author Michael Karneim */ @SuppressWarnings("serial") public class FileBrowserBnTableTestGUI extends JFrame implements View<FileBrowserBnTableTestGUI.DirectoryBrowserPM>, ModelSubscriber { private static JFileChooser FILE_CHOOSER; private final Link link = new Link(this); private ModelProvider localProvider; private BnButton btnChangeToParent; private JPanel buttonPanel; private BnAction changeDirAction; private BnModelObserver propertyObserver; private BnTable bnTable; private JScrollPane scrollPane; private JPanel panel; public static void main(String[] args) throws Exception { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); FILE_CHOOSER = new JFileChooser(); EventQueue.invokeLater(new Runnable() { public void run() { FileBrowserBnTableTestGUI f = new FileBrowserBnTableTestGUI(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(400, 400); f.setLocationRelativeTo(null); DirectoryBrowserPM pm = new DirectoryBrowserPM(); pm.setDirectory(new File(System.getProperty("user.home"))); f.setPresentationModel(pm); f.setVisible(true); } }); } public FileBrowserBnTableTestGUI() { super(); getContentPane().setLayout(new BorderLayout()); getContentPane().add(getPanel(), BorderLayout.CENTER); setTitle("File System"); getPropertyObserver(); // make sure that the prop. observer is // instantiated // } /** {@inheritDoc} */ public DirectoryBrowserPM getPresentationModel() { return getLocalProvider().getPresentationModel(); } /** {@inheritDoc} */ public void setPresentationModel(DirectoryBrowserPM pModel) { getLocalProvider().setPresentationModel(pModel); } /** {@inheritDoc} */ public IModelProvider getModelProvider() { return link.getModelProvider(); } /** {@inheritDoc} */ public void setModelProvider(IModelProvider provider) { this.link.setModelProvider(provider); } /** {@inheritDoc} */ public Path getPath() { return link.getPath(); } /** {@inheritDoc} */ public void setPath(Path path) { this.link.setPath(path); } /** * @wbp.nonvisual location=11,442 * @return */ protected ModelProvider getLocalProvider() { if (localProvider == null) { localProvider = new ModelProvider(); // @wb:location=11,442 localProvider.setPresentationModelType(DirectoryBrowserPM.class); } return localProvider; } private JPanel getPanel() { if (panel == null) { panel = new JPanel(); panel.setBorder(new EmptyBorder(12, 8, 12, 8)); panel.setLayout(new BorderLayout()); panel.add(getScrollPane(), BorderLayout.CENTER); panel.add(getButtonPanel(), BorderLayout.NORTH); } return panel; } private JScrollPane getScrollPane() { if (scrollPane == null) { scrollPane = new JScrollPane(); scrollPane.setViewportView(getBnTable()); } return scrollPane; } private BnTable getBnTable() { if (bnTable == null) { bnTable = new BnTable(); bnTable.setColumns(new BnColumnBuilder() .addColumn().withPath("this.name").withName("Name") .build()); bnTable.setModelProvider(getLocalProvider()); bnTable.addMouseListener(new MouseAdapter() { public void mouseClicked(final MouseEvent e) { if (e.getClickCount() == 2) { getChangeDirAction().actionPerformed(null); } } }); bnTable.setPath(new org.beanfabrics.Path("this.elements")); } return bnTable; } private BnModelObserver getPropertyObserver() { // observe the "title" property of the model and change this frame's // title accordingly if (propertyObserver == null) { propertyObserver = new BnModelObserver(); // @wb:location=116,467 propertyObserver .addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(final PropertyChangeEvent evt) { TextPM titlePM = (TextPM) propertyObserver .getPresentationModel(); if (titlePM != null) { setTitle(titlePM.getText()); } else { setTitle(""); } } }); propertyObserver.setModelProvider(getLocalProvider()); propertyObserver.setPath(new Path("this.title")); } return propertyObserver; } protected BnAction getChangeDirAction() { if (changeDirAction == null) { changeDirAction = new BnAction(); // @wb:location=238,461 changeDirAction.setModelProvider(getLocalProvider()); changeDirAction.setPath(new Path("changeDir")); } return changeDirAction; } protected JPanel getButtonPanel() { if (buttonPanel == null) { buttonPanel = new JPanel(); final FlowLayout flowLayout = new FlowLayout(); flowLayout.setAlignment(FlowLayout.LEFT); buttonPanel.setLayout(flowLayout); buttonPanel.add(getBtnChangeToParent()); } return buttonPanel; } protected BnButton getBtnChangeToParent() { if (btnChangeToParent == null) { btnChangeToParent = new BnButton(); btnChangeToParent.setPath(new org.beanfabrics.Path( "this.changeToParentDir")); btnChangeToParent.setModelProvider(getLocalProvider()); btnChangeToParent.setFocusable(false); btnChangeToParent.setText(".."); } return btnChangeToParent; } /** * PresentationModel for a file entry. */ private static class FilePM extends AbstractPM { private File file; protected final IconTextPM name = new IconTextPM(); public FilePM() { PMManager.setup(this); name.setEditable(false); } public void setFile(File f) { this.file = f; name.setText(f.getName()); name.setIcon(FILE_CHOOSER.getIcon(f)); name.setDescription("<html>Last Changed: " + new Date(f.lastModified()) + "\n<br>" + "Size: " + f.length() + " Bytes</html>"); } public File getFile() { return file; } } /** * PresentationModel for the directory browser. */ static class DirectoryBrowserPM extends AbstractPM { private File dir; protected final MapPM<File, FilePM> elements = new MapPM<File, FilePM>(); protected final TextPM title = new TextPM(); protected final OperationPM changeDir = new OperationPM(); protected final OperationPM changeToParentDir = new OperationPM(); public DirectoryBrowserPM() { PMManager.setup(this); } public void setDirectory(File dir) { this.dir = dir; elements.clear(); this.title.setText(dir.getAbsolutePath()); File[] files = dir.listFiles(); for (File f : files) { FilePM pModel = new FilePM(); pModel.setFile(f); elements.put(f, pModel); } } @Validation(path = "changeDir", message = "Select single directory") boolean isDirectorySelected() { return elements.getSelection().size() == 1 && elements.getSelection().getFirst().getFile() .isDirectory(); } @Operation public void changeDir() { this.changeDir.check(); File toDir = elements.getSelection().getFirst().getFile(); this.setDirectory(toDir); } @Validation(path = "changeToParentDir", message = "No parent directory available") boolean hasParentDirectory() { return dir != null && dir.getParentFile() != null; } @Operation public void changeToParentDir() { this.changeToParentDir.check(); this.setDirectory(dir.getParentFile()); } } }