/*!
* 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 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;
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 org.apache.commons.vfs.FileObject;
import org.apache.commons.vfs.FileSystemException;
import org.apache.commons.vfs.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;
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;
}
}