/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.reporting.designer.extensions.pentaho.repository.dialogs; import org.apache.commons.vfs2.FileObject; import org.apache.commons.vfs2.FileSystemException; import org.apache.commons.vfs2.FileType; import org.pentaho.reporting.designer.core.util.exceptions.UncaughtExceptionsModel; import org.pentaho.reporting.designer.extensions.pentaho.repository.Messages; import org.pentaho.reporting.designer.extensions.pentaho.repository.model.RepositoryTreeModel; import org.pentaho.reporting.designer.extensions.pentaho.repository.util.RepositoryTreeCellRenderer; import org.pentaho.reporting.libraries.base.util.StringUtils; import org.pentaho.reporting.libraries.designtime.swing.CommonDialog; import org.pentaho.reporting.libraries.pensol.WebSolutionFileObject; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.tree.TreePath; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Cursor; import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.net.URL; public class RepositoryTreeDialog extends CommonDialog { private class ShowHiddenFilesAction extends AbstractAction { private ShowHiddenFilesAction() { putValue( Action.NAME, Messages.getInstance().getString( "ShowHiddenFilesAction.Name" ) ); setSelected( Boolean.FALSE ); } private Boolean getSelected() { return (Boolean) this.getValue( Action.SELECTED_KEY ); } private void setSelected( final Boolean selected ) { this.putValue( Action.SELECTED_KEY, selected ); } /** * Invoked when an action occurs. */ public void actionPerformed( final ActionEvent e ) { repositoryTreeModel.setShowHiddenFiles( Boolean.TRUE.equals( getSelected() ) ); } } private class DoubleClickHandler extends MouseAdapter { private DoubleClickHandler() { } public void mouseClicked( final MouseEvent e ) { if ( e.getClickCount() <= 1 ) { return; } try { final TreePath selectionPath = repositoryBrowser.getSelectionPath(); if ( selectionPath == null ) { return; } final Object o = repositoryBrowser.getLastSelectedPathComponent(); if ( o instanceof FileObject ) { final FileObject treeNode = (FileObject) o; if ( repositoryBrowser.isExpanded( selectionPath ) && treeNode.getType() == FileType.FOLDER ) { setSelectedPath( treeNode ); setConfirmed( true ); setVisible( false ); } } } catch ( FileSystemException fse ) { // ignore .. } } } private class NewFolderAction extends AbstractAction { /** * Defines an <code>Action</code> object with a default description string and default icon. */ private NewFolderAction() { final URL location = RepositoryTreeDialog.class .getResource( "/org/pentaho/reporting/designer/extensions/pentaho/repository/resources/newfolder.png" ); putValue( Action.SMALL_ICON, new ImageIcon( location ) ); putValue( Action.SHORT_DESCRIPTION, Messages.getInstance().getString( "SolutionRepositoryTreeDialog.NewFolderAction.Name" ) ); } /** * Invoked when an action occurs. */ public void actionPerformed( final ActionEvent e ) { final CreateNewRepositoryFolderDialog newFolderDialog = new CreateNewRepositoryFolderDialog( RepositoryTreeDialog.this ); if ( !newFolderDialog.performEdit() ) { return; } final TreePath selectionPath = repositoryBrowser.getSelectionPath(); if ( selectionPath == null ) { return; } final FileObject treeNode = (FileObject) selectionPath.getLastPathComponent(); if ( !StringUtils.isEmpty( newFolderDialog.getName() ) ) { final Component glassPane = SwingUtilities.getRootPane( RepositoryTreeDialog.this ).getGlassPane(); try { glassPane.setVisible( true ); glassPane.setCursor( new Cursor( Cursor.WAIT_CURSOR ) ); final FileObject child = treeNode.resolveFile( newFolderDialog.getFolderName() ); if ( child instanceof WebSolutionFileObject ) { final WebSolutionFileObject webSolutionFileObject = (WebSolutionFileObject) child; webSolutionFileObject.setDescription( newFolderDialog.getDescription() ); } child.createFolder(); repositoryTreeModel.fireTreeDataChanged(); repositoryBrowser.setSelectionPath( selectionPath.getParentPath().pathByAddingChild( child ) ); setDirty( true ); } catch ( Exception e1 ) { UncaughtExceptionsModel.getInstance().addException( e1 ); } finally { glassPane.setVisible( false ); glassPane.setCursor( new Cursor( Cursor.DEFAULT_CURSOR ) ); } } } } private RepositoryTreeModel repositoryTreeModel; private JTree repositoryBrowser; private boolean dirty; private boolean addNewButtonPanel; public RepositoryTreeDialog( final JDialog dialog, final boolean addNewButtonPanel ) { super( dialog ); init( addNewButtonPanel ); } public RepositoryTreeDialog( final boolean addNewButtonPanel ) { init( addNewButtonPanel ); } public RepositoryTreeDialog( final Frame owner, final boolean addNewButtonPanel ) { super( owner ); init( addNewButtonPanel ); } protected void init( final boolean addNewButtonPanel ) { setModal( true ); setTitle( Messages.getInstance().getString( "SolutionRepositoryTreeDialog.Title" ) ); this.addNewButtonPanel = addNewButtonPanel; this.repositoryTreeModel = new RepositoryTreeModel(); repositoryBrowser = new JTree( repositoryTreeModel ); repositoryBrowser.setCellRenderer( new RepositoryTreeCellRenderer() ); repositoryBrowser.addMouseListener( new DoubleClickHandler() ); repositoryBrowser.setRootVisible( true ); repositoryBrowser.setShowsRootHandles( true ); repositoryBrowser.setToggleClickCount( 1 ); super.init(); setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE ); } protected String getDialogId() { return "ReportDesigner.Pentaho.RepositoryTree"; } public FileObject getSelectedPath() { final TreePath selectionPath = repositoryBrowser.getSelectionPath(); if ( selectionPath == null ) { return null; } if ( selectionPath.getLastPathComponent() instanceof FileObject ) { return (FileObject) selectionPath.getLastPathComponent(); } return null; } public void setSelectedPath( final FileObject path ) throws FileSystemException { final TreePath path1 = repositoryTreeModel.getTreePathForSelection( path, null ); if ( path1 != null ) { repositoryBrowser.setSelectionPath( path1 ); repositoryBrowser.scrollPathToVisible( path1 ); } else { repositoryBrowser.clearSelection(); } } public FileObject performSelectLocation( final FileObject fileSystemRoot, final String[] filter, final FileObject publishLocation ) throws FileSystemException { repositoryTreeModel.setShowFoldersOnly( true ); repositoryTreeModel.setFileSystemRoot( fileSystemRoot ); repositoryTreeModel.setFilters( filter ); // repositoryBrowser.setModel(null); // repositoryBrowser.setModel(repositoryTreeModel); repositoryTreeModel.fireTreeDataChanged(); dirty = false; setSelectedPath( publishLocation ); if ( performEdit() ) { return getSelectedPath(); } return null; } protected void setDirty( final boolean dirty ) { this.dirty = dirty; } public boolean isDirty() { return dirty; } /** * @noinspection ReuseOfLocalVariable */ protected Component createContentPane() { final JScrollPane treeView = new JScrollPane( repositoryBrowser ); final JPanel newFolderButtonPanel = new JPanel( new BorderLayout() ); final JPanel panel = new JPanel(); panel.setLayout( new GridBagLayout() ); GridBagConstraints c = new GridBagConstraints(); if ( addNewButtonPanel ) { final JButton newFolder = new JButton( new NewFolderAction() ); newFolder.setBorder( BorderFactory.createEmptyBorder() ); final JLabel label = new JLabel( Messages.getInstance().getString( "SolutionRepositoryTreeDialog.SelectLocation" ) ); label.setBorder( BorderFactory.createEmptyBorder( 0, 0, 0, 80 ) ); newFolderButtonPanel.add( label, BorderLayout.CENTER ); newFolderButtonPanel.add( newFolder, BorderLayout.EAST ); c.insets = new Insets( 2, 10, 0, 10 ); c.anchor = GridBagConstraints.WEST; c.gridx = 0; c.gridy = 0; c.fill = GridBagConstraints.HORIZONTAL; panel.add( newFolderButtonPanel, c ); } c = new GridBagConstraints(); c.insets = new Insets( 0, 10, 5, 10 ); c.gridx = 0; c.gridy = 1; c.fill = GridBagConstraints.BOTH; c.weightx = 1.0; c.weighty = 1.0; panel.add( treeView, c ); c = new GridBagConstraints(); c.anchor = GridBagConstraints.WEST; c.insets = new Insets( 0, 10, 5, 10 ); c.gridx = 0; c.gridy = 2; c.fill = GridBagConstraints.HORIZONTAL; panel.add( new JCheckBox( new ShowHiddenFilesAction() ) ); return panel; } }