blob: 83c19382507185c23dffaddf52c1fcd7f5352b0d [file] [log] [blame]
/*
* Copyright (c) 2009, Tony Kohar. All Rights Reserved.
*
* 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.
*/
package org.apache.zest.envisage;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ResourceBundle;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import org.apache.zest.api.structure.ApplicationDescriptor;
import org.apache.zest.envisage.detail.DetailModelPane;
import org.apache.zest.envisage.event.LinkEvent;
import org.apache.zest.envisage.event.LinkListener;
import org.apache.zest.envisage.graph.GraphPane;
import org.apache.zest.envisage.print.PDFWriter;
import org.apache.zest.envisage.tree.TreeModelPane;
import org.apache.zest.tools.model.descriptor.ApplicationDetailDescriptor;
import org.apache.zest.tools.model.descriptor.ApplicationDetailDescriptorBuilder;
/**
* Envisage Main Frame
*/
public final class EnvisageFrame
extends JFrame
{
private static final ResourceBundle BUNDLE = ResourceBundle.getBundle( EnvisageFrame.class.getName() );
private JPanel contentPane;
private final JSplitPane graphSplitPane;
private final JSplitPane modelSplitPane;
private final GraphPane graphPane;
private final TreeModelPane treeModelPane;
private final DetailModelPane detailModelPane;
private final ApplicationDescriptor application;
private ApplicationDetailDescriptor descriptor;
private boolean graphItemSelectionInProgress;
public EnvisageFrame( ApplicationDescriptor application )
{
this.application = application;
setTitle( BUNDLE.getString( "Application.Title" ) );
setContentPane( contentPane );
graphPane = new GraphPane();
treeModelPane = new TreeModelPane();
detailModelPane = new DetailModelPane();
treeModelPane.addTreeSelectionListener( new TreeSelectionListener()
{
@Override
public void valueChanged( TreeSelectionEvent evt )
{
applicationModelPaneValueChanged();
}
} );
graphPane.addLinkListener( new LinkListener()
{
@Override
public void activated( LinkEvent evt )
{
graphItemLinkActivated( evt );
}
} );
detailModelPane.addLinkListener( new LinkListener()
{
@Override
public void activated( LinkEvent evt )
{
detailModelPaneLinkActivated( evt );
}
} );
modelSplitPane = new JSplitPane();
modelSplitPane.setOrientation( JSplitPane.HORIZONTAL_SPLIT );
modelSplitPane.setDividerLocation( 300 );
modelSplitPane.setOneTouchExpandable( true );
modelSplitPane.setLeftComponent( treeModelPane );
modelSplitPane.setRightComponent( detailModelPane );
graphSplitPane = new JSplitPane();
graphSplitPane.setOrientation( JSplitPane.VERTICAL_SPLIT );
graphSplitPane.setDividerLocation( 384 ); // 768/2
graphSplitPane.setOneTouchExpandable( true );
//graphSplitPane.setTopComponent( graphPane );
//graphSplitPane.setBottomComponent( modelSplitPane );
graphSplitPane.setTopComponent( modelSplitPane );
graphSplitPane.setBottomComponent( graphPane );
this.setJMenuBar( createMenu() );
contentPane.add( graphSplitPane, BorderLayout.CENTER );
}
public void initQi4J()
{
modelSplitPane.setDividerLocation( 300 );
graphSplitPane.setDividerLocation( 384 );
descriptor = ApplicationDetailDescriptorBuilder.createApplicationDetailDescriptor( application );
treeModelPane.initQi4J( descriptor );
graphPane.initQi4J( descriptor );
}
/**
* Create menubar
*
* @return JMenuBar
*/
protected JMenuBar createMenu()
{
ActionListener menuActionListener = new ActionListener()
{
@Override
public void actionPerformed( ActionEvent evt )
{
if( evt.getActionCommand().equals( "export" ) )
{
exportAsPDF();
}
if( evt.getActionCommand().equals( "exit" ) )
{
System.exit( 0 );
}
}
};
// TODO i18n
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu( "File" );
menu.setMnemonic( KeyEvent.VK_F );
menuBar.add( menu );
JMenuItem menuItem = new JMenuItem( "Export As PDF", KeyEvent.VK_E );
menuItem.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_E, ActionEvent.CTRL_MASK ) );
menuItem.setActionCommand( "export" );
menuItem.addActionListener( menuActionListener );
menu.add( menuItem );
menuItem = new JMenuItem( "Exit", KeyEvent.VK_X );
menuItem.setActionCommand( "exit" );
menuItem.addActionListener( menuActionListener );
menu.add( menuItem );
return menuBar;
}
protected void applicationModelPaneValueChanged()
{
Object obj = treeModelPane.getLastSelected();
detailModelPane.setDescriptor( obj );
if( !graphItemSelectionInProgress )
{
graphPane.setSelectedValue( obj );
}
}
protected void graphItemLinkActivated( LinkEvent evt )
{
graphItemSelectionInProgress = true;
try
{
treeModelPane.setSelectedValue( evt.getObject() );
}
finally
{
graphItemSelectionInProgress = false;
}
}
protected void detailModelPaneLinkActivated( LinkEvent evt )
{
treeModelPane.setSelectedValue( evt.getObject() );
}
protected void exportAsPDF()
{
SwingUtilities.invokeLater( new Runnable()
{
@Override
public void run()
{
PDFWriter pdf = new PDFWriter();
pdf.write( EnvisageFrame.this, descriptor, graphPane.getGraphDisplays() );
}
} );
}
{
// GUI initializer generated by IntelliJ IDEA GUI Designer
// >>> IMPORTANT!! <<<
// DO NOT EDIT OR ADD ANY CODE HERE!
$$$setupUI$$$();
}
/**
* Method generated by IntelliJ IDEA GUI Designer
* >>> IMPORTANT!! <<<
* DO NOT edit this method OR call it in your code!
*
*/
private void $$$setupUI$$$()
{
contentPane = new JPanel();
contentPane.setLayout( new BorderLayout( 0, 0 ) );
}
public JComponent $$$getRootComponent$$$()
{
return contentPane;
}
}