/*! * 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.tools.configeditor; import org.pentaho.reporting.libraries.base.boot.AbstractBoot; import org.pentaho.reporting.libraries.base.config.HierarchicalConfiguration; import org.pentaho.reporting.tools.configeditor.editor.ConfigEditorPanel; import org.pentaho.reporting.tools.configeditor.model.ConfigDescriptionEntry; import org.pentaho.reporting.tools.configeditor.model.ConfigTreeModel; import org.pentaho.reporting.tools.configeditor.model.ConfigTreeModelException; import org.pentaho.reporting.tools.configeditor.model.ConfigTreeModuleNode; import org.pentaho.reporting.tools.configeditor.util.ConfigTreeRenderer; import javax.swing.*; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultTreeSelectionModel; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import java.awt.*; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; public class ConfigEditorPane extends JPanel { /** * This class handles the tree selection events and activates the detail editors. */ private class ModuleTreeSelectionHandler implements TreeSelectionListener { /** * DefaultConstructor. */ protected ModuleTreeSelectionHandler() { } /** * Called whenever the value of the selection changes. * * @param e the event that characterizes the change. */ public void valueChanged( final TreeSelectionEvent e ) { if ( configuration == null ) { throw new IllegalStateException( "Need a configuration" ); } final TreePath path = e.getPath(); final Object lastPathElement = path.getLastPathComponent(); if ( lastPathElement instanceof ConfigTreeModuleNode ) { final ConfigTreeModuleNode node = (ConfigTreeModuleNode) lastPathElement; final ConfigEditorPanel detailEditorPane = getDetailEditorPane(); detailEditorPane.store(); detailEditorPane.editModule( node.getModule(), configuration, node.getAssignedKeys() ); } } } /** * The detail editor for the currently selected tree node. */ private ConfigEditorPanel detailEditorPane; /** * The tree model used to display the structure of the report configuration. */ private ConfigTreeModel treeModel; /** * Need to keep a hold of this so that we can manipulate it when the tree is loaded. */ private JTree tree; /** * The currently used report configuration. */ private HierarchicalConfiguration configuration; private AbstractBoot packageManager; public ConfigEditorPane( final AbstractBoot packageManager, final boolean includeGlobals ) { this.packageManager = packageManager; detailEditorPane = new ConfigEditorPanel(); setLayout( new BorderLayout() ); final JSplitPane splitPane = new JSplitPane ( JSplitPane.HORIZONTAL_SPLIT, createEntryTree( includeGlobals ), detailEditorPane ); splitPane.setDividerLocation( 250 ); add( splitPane, BorderLayout.CENTER ); } /** * Creates the JTree for the report configuration. * * @return the tree component. * @throws ConfigTreeModelException if the model could not be built. */ private JComponent createEntryTree( final boolean includeGlobals ) { treeModel = new ConfigTreeModel( packageManager, includeGlobals ); final TreeSelectionModel selectionModel = new DefaultTreeSelectionModel(); selectionModel.setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION ); tree = new JTree( treeModel ); tree.setSelectionModel( selectionModel ); tree.setCellRenderer( new ConfigTreeRenderer() ); tree.setRootVisible( false ); tree.setShowsRootHandles( true ); tree.addTreeSelectionListener( new ModuleTreeSelectionHandler() ); return new JScrollPane ( tree, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER ); } public void updateConfiguration( final HierarchicalConfiguration configuration ) { this.configuration = configuration; treeModel.updateConfiguration(); // expand out the tree and select the first node. for ( int i = 0; i < tree.getRowCount(); i++ ) { tree.expandRow( i ); } tree.setSelectionRow( 1 ); } /** * Resets all values. */ public void reset() { if ( configuration == null ) { return; } // clear all previously set configuration settings ... final Enumeration defaults = configuration.getConfigProperties(); while ( defaults.hasMoreElements() ) { final String key = (String) defaults.nextElement(); configuration.setConfigProperty( key, null ); } } public String getDescriptionForKey( final String key ) { final ConfigDescriptionEntry entry = treeModel.getEntryForKey( key ); if ( entry != null ) { return entry.getDescription(); } return null; } public void load( final boolean append ) throws IOException { treeModel.load( append ); } public void loadModel( final InputStream in, final boolean append ) throws IOException { treeModel.load( in, append ); } /** * Returns the detail editor pane. * * @return the detail editor. */ protected ConfigEditorPanel getDetailEditorPane() { return detailEditorPane; } public void commit() { detailEditorPane.store(); } }