/*
* This file is part of the OSMembrane project.
* More informations under www.osmembrane.de
*
* The project is licensed under the GNU GENERAL PUBLIC LICENSE 3.0.
* for more details about the license see http://www.osmembrane.de/license/
*
* Source: $HeadURL$ ($Revision$)
* Last changed: $Date$
*/
package de.osmembrane.view.frames;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JSplitPane;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import de.osmembrane.controller.ActionRegistry;
import de.osmembrane.controller.actions.ArrangePipelineAction;
import de.osmembrane.controller.actions.ChangePipelineSettingsAction;
import de.osmembrane.controller.actions.ChangeSettingsAction;
import de.osmembrane.controller.actions.DeleteSelectionAction;
import de.osmembrane.controller.actions.DuplicateFunctionAction;
import de.osmembrane.controller.actions.ExecutePipelineAction;
import de.osmembrane.controller.actions.ExitAction;
import de.osmembrane.controller.actions.ExportPipelineAction;
import de.osmembrane.controller.actions.GeneratePipelineAction;
import de.osmembrane.controller.actions.ImportPipelineAction;
import de.osmembrane.controller.actions.LoadPipelineAction;
import de.osmembrane.controller.actions.NewPipelineAction;
import de.osmembrane.controller.actions.PreviewPipelineAction;
import de.osmembrane.controller.actions.RedoAction;
import de.osmembrane.controller.actions.ResetViewAction;
import de.osmembrane.controller.actions.SaveAsPipelineAction;
import de.osmembrane.controller.actions.SavePipelineAction;
import de.osmembrane.controller.actions.ShowAboutAction;
import de.osmembrane.controller.actions.ShowHelpAction;
import de.osmembrane.controller.actions.ShowQuickstartAction;
import de.osmembrane.controller.actions.UndoAction;
import de.osmembrane.controller.actions.ViewAllAction;
import de.osmembrane.controller.actions.ZoomInAction;
import de.osmembrane.controller.actions.ZoomOutAction;
import de.osmembrane.model.ModelProxy;
import de.osmembrane.model.pipeline.AbstractFunctionGroup;
import de.osmembrane.model.settings.SettingType;
import de.osmembrane.resources.Resource;
import de.osmembrane.tools.I18N;
import de.osmembrane.tools.IconLoader.Size;
import de.osmembrane.view.AbstractFrame;
import de.osmembrane.view.interfaces.IMainFrame;
import de.osmembrane.view.interfaces.IZoomDevice;
import de.osmembrane.view.panels.InspectorPanel;
import de.osmembrane.view.panels.LibraryPanel;
import de.osmembrane.view.panels.LibraryPanelGroup;
import de.osmembrane.view.panels.PipelinePanel;
import de.osmembrane.view.panels.Tool;
/**
* The Main window that is the center of OSMembrane and the first thing you'll
* see after the splash screen.
*
* @see "Spezifikation.pdf, chapter 2.1 (German)"
*
* @author tobias_kuhn
*
*/
public class MainFrame extends AbstractFrame implements IMainFrame {
private static final long serialVersionUID = 6464462774273555770L;
/**
* The PipelinePanel showing the pipeline
*/
private PipelinePanel pipelineView;
/**
* The images, cursors and the selected item of the tools
*/
private Map<Tool, ImageIcon> toolsImages;
private Map<Tool, Cursor> toolsCursors;
/**
* Creates the {@link MainFrame}.
*/
public MainFrame() {
// window title
setWindowTitle(I18N.getInstance().getString("osmembrane"));
// closing window listener
addWindowListener(new WindowListener() {
@Override
public void windowOpened(WindowEvent e) {
}
@Override
public void windowClosing(WindowEvent e) {
ActionRegistry.getInstance().get(ExitAction.class)
.actionPerformed(null);
}
@Override
public void windowClosed(WindowEvent e) {
}
@Override
public void windowIconified(WindowEvent e) {
}
@Override
public void windowDeiconified(WindowEvent e) {
}
@Override
public void windowActivated(WindowEvent e) {
}
@Override
public void windowDeactivated(WindowEvent e) {
}
});
// set own glass pane used for drag & drop
boolean showStartScreen = (Boolean) ModelProxy.getInstance()
.getSettings().getValue(SettingType.SHOW_STARTUP_SCREEN)
&& (ModelProxy.getInstance().getPipeline().getFunctions().length == 0);
// if there is something on the pipeline, probably a backup was loaded
setGlassPane(new MainFrameGlassPane(showStartScreen));
getGlassPane().setVisible(showStartScreen);
// initialize tools
Toolkit tk = Toolkit.getDefaultToolkit();
toolsImages = new HashMap<Tool, ImageIcon>();
toolsImages.put(Tool.DEFAULT_MAGIC_TOOL, Resource.CURSOR_ICON
.getImageIcon("cursor-magic.png", Size.NORMAL));
toolsImages.put(Tool.SELECTION_TOOL, Resource.CURSOR_ICON.getImageIcon(
"cursor-select.png", Size.NORMAL));
toolsImages.put(Tool.VIEW_TOOL, Resource.CURSOR_ICON.getImageIcon(
"cursor-move.png", Size.NORMAL));
toolsImages.put(Tool.CONNECTION_TOOL, Resource.CURSOR_ICON
.getImageIcon("cursor-connect.png", Size.NORMAL));
toolsCursors = new HashMap<Tool, Cursor>();
toolsCursors.put(Tool.DEFAULT_MAGIC_TOOL, Cursor.getDefaultCursor());
for (Entry<Tool, ImageIcon> e : toolsImages.entrySet()) {
if (e.getKey() != Tool.DEFAULT_MAGIC_TOOL) {
toolsCursors.put(e.getKey(), tk.createCustomCursor(e.getValue()
.getImage(), new Point(0, 0),
String.valueOf(e.getKey())));
}
}
// menu bar
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu(I18N.getInstance().getString(
"View.Menu.File"));
fileMenu.add(ActionRegistry.getInstance().get(NewPipelineAction.class));
fileMenu.add(ActionRegistry.getInstance().get(LoadPipelineAction.class));
fileMenu.add(ActionRegistry.getInstance().get(SavePipelineAction.class));
fileMenu.add(ActionRegistry.getInstance().get(
SaveAsPipelineAction.class));
fileMenu.add(new JSeparator());
fileMenu.add(ActionRegistry.getInstance().get(
ImportPipelineAction.class));
fileMenu.add(ActionRegistry.getInstance().get(
ExportPipelineAction.class));
fileMenu.add(new JSeparator());
fileMenu.add(ActionRegistry.getInstance().get(ExitAction.class));
menuBar.add(fileMenu);
JMenu editMenu = new JMenu(I18N.getInstance().getString(
"View.Menu.Edit"));
editMenu.add(ActionRegistry.getInstance().get(UndoAction.class));
editMenu.add(ActionRegistry.getInstance().get(RedoAction.class));
editMenu.add(new JSeparator());
editMenu.add(ActionRegistry.getInstance().get(
DuplicateFunctionAction.class));
editMenu.add(ActionRegistry.getInstance().get(
DeleteSelectionAction.class));
menuBar.add(editMenu);
JMenu viewMenu = new JMenu(I18N.getInstance().getString(
"View.Menu.View"));
viewMenu.add(ActionRegistry.getInstance().get(ResetViewAction.class));
viewMenu.add(ActionRegistry.getInstance().get(ViewAllAction.class));
viewMenu.add(new JSeparator());
viewMenu.add(ActionRegistry.getInstance().get(ZoomInAction.class));
viewMenu.add(ActionRegistry.getInstance().get(ZoomOutAction.class));
menuBar.add(viewMenu);
JMenu pipelineMenu = new JMenu(I18N.getInstance().getString(
"View.Menu.Pipeline"));
pipelineMenu.add(ActionRegistry.getInstance().get(
ArrangePipelineAction.class));
pipelineMenu.add(ActionRegistry.getInstance().get(
ChangePipelineSettingsAction.class));
pipelineMenu.add(new JSeparator());
pipelineMenu.add(ActionRegistry.getInstance().get(
GeneratePipelineAction.class));
pipelineMenu.add(new JSeparator());
pipelineMenu.add(ActionRegistry.getInstance().get(
ExecutePipelineAction.class));
pipelineMenu.add(ActionRegistry.getInstance().get(
PreviewPipelineAction.class));
menuBar.add(pipelineMenu);
JMenu extrasMenu = new JMenu(I18N.getInstance().getString(
"View.Menu.Extras"));
extrasMenu.add(ActionRegistry.getInstance().get(
ChangeSettingsAction.class));
menuBar.add(extrasMenu);
JMenu aboutMenu = new JMenu(I18N.getInstance().getString(
"View.Menu.About"));
aboutMenu.add(ActionRegistry.getInstance().get(ShowHelpAction.class));
aboutMenu.add(ActionRegistry.getInstance().get(
ShowQuickstartAction.class));
aboutMenu.add(new JSeparator());
aboutMenu.add(ActionRegistry.getInstance().get(ShowAboutAction.class));
menuBar.add(aboutMenu);
setJMenuBar(menuBar);
// also provide a popupMenu
JPopupMenu popupMenu = new JPopupMenu();
popupMenu.add(ActionRegistry.getInstance().get(
DuplicateFunctionAction.class));
popupMenu.add(ActionRegistry.getInstance().get(
DeleteSelectionAction.class));
popupMenu.add(new JSeparator());
popupMenu.add(ActionRegistry.getInstance().get(UndoAction.class));
popupMenu.add(ActionRegistry.getInstance().get(RedoAction.class));
popupMenu.add(new JSeparator());
popupMenu.add(ActionRegistry.getInstance().get(ResetViewAction.class));
popupMenu.add(ActionRegistry.getInstance().get(ViewAllAction.class));
// tool bar with actions
JToolBar toolBar = new JToolBar(I18N.getInstance().getString(
"osmembrane"), SwingConstants.HORIZONTAL);
if (!UIManager.getLookAndFeel().getName().toLowerCase()
.contains("nimbus")) {
toolBar.setLayout(new FlowLayout(FlowLayout.LEFT));
}
toolBar.add(ActionRegistry.getInstance().get(NewPipelineAction.class));
toolBar.add(ActionRegistry.getInstance().get(LoadPipelineAction.class));
toolBar.add(ActionRegistry.getInstance().get(SavePipelineAction.class));
toolBar.add(new JSeparator(SwingConstants.VERTICAL));
toolBar.add(ActionRegistry.getInstance()
.get(ImportPipelineAction.class));
toolBar.add(ActionRegistry.getInstance()
.get(ExportPipelineAction.class));
toolBar.add(new JSeparator(SwingConstants.VERTICAL));
toolBar.add(ActionRegistry.getInstance().get(UndoAction.class));
toolBar.add(ActionRegistry.getInstance().get(RedoAction.class));
toolBar.add(new JSeparator(SwingConstants.VERTICAL));
toolBar.add(ActionRegistry.getInstance().get(
PreviewPipelineAction.class));
toolBar.add(ActionRegistry.getInstance().get(
GeneratePipelineAction.class));
toolBar.add(ActionRegistry.getInstance().get(
ExecutePipelineAction.class));
toolBar.add(new JSeparator(SwingConstants.VERTICAL));
toolBar.add(ActionRegistry.getInstance().get(
ArrangePipelineAction.class));
toolBar.add(new JSeparator(SwingConstants.VERTICAL));
toolBar.add(ActionRegistry.getInstance().get(ShowHelpAction.class));
getContentPane().add(toolBar, BorderLayout.NORTH);
// tools bar with tools for editing the pipeline
JToolBar toolsBar = new JToolBar(I18N.getInstance().getString(
"osmembrane"), SwingConstants.HORIZONTAL);
if (!UIManager.getLookAndFeel().getName().toLowerCase()
.contains("nimbus")) {
toolsBar.setLayout(new FlowLayout(FlowLayout.LEFT));
}
ButtonGroup tools = new ButtonGroup();
// will store the buttons later
final Map<JToggleButton, Tool> toolsButtons = new HashMap<JToggleButton, Tool>();
ActionListener toolsButtonsActionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Tool t = toolsButtons.get(e.getSource());
pipelineView.setActiveTool(t, toolsCursors.get(t));
}
};
JToggleButton magicTool = new JToggleButton(
toolsImages.get(Tool.DEFAULT_MAGIC_TOOL), true);
magicTool.setToolTipText(I18N.getInstance().getString(
"View.Tools.Magic"));
magicTool.addActionListener(toolsButtonsActionListener);
tools.add(magicTool);
toolsBar.add(magicTool);
JToggleButton selectTool = new JToggleButton(
toolsImages.get(Tool.SELECTION_TOOL));
selectTool.setToolTipText(I18N.getInstance().getString(
"View.Tools.Select"));
selectTool.addActionListener(toolsButtonsActionListener);
tools.add(selectTool);
toolsBar.add(selectTool);
JToggleButton viewTool = new JToggleButton(
toolsImages.get(Tool.VIEW_TOOL));
viewTool.setToolTipText(I18N.getInstance().getString("View.Tools.View"));
viewTool.addActionListener(toolsButtonsActionListener);
tools.add(viewTool);
toolsBar.add(viewTool);
JToggleButton connectTool = new JToggleButton(
toolsImages.get(Tool.CONNECTION_TOOL));
connectTool.setToolTipText(I18N.getInstance().getString(
"View.Tools.Connect"));
connectTool.addActionListener(toolsButtonsActionListener);
tools.add(connectTool);
toolsBar.add(connectTool);
toolsButtons.put(magicTool, Tool.DEFAULT_MAGIC_TOOL);
toolsButtons.put(selectTool, Tool.SELECTION_TOOL);
toolsButtons.put(viewTool, Tool.VIEW_TOOL);
toolsButtons.put(connectTool, Tool.CONNECTION_TOOL);
toolsBar.add(new JSeparator(SwingConstants.VERTICAL));
toolsBar.add(ActionRegistry.getInstance().get(ResetViewAction.class));
toolsBar.add(ActionRegistry.getInstance().get(ViewAllAction.class));
toolsBar.add(new JSeparator(SwingConstants.VERTICAL));
toolsBar.add(ActionRegistry.getInstance().get(ZoomInAction.class));
toolsBar.add(ActionRegistry.getInstance().get(ZoomOutAction.class));
toolBar.add(toolsBar);
/* yes the order is important */
// function inspector
InspectorPanel functionInspector = new InspectorPanel();
// pipeline view
pipelineView = new PipelinePanel(functionInspector, popupMenu);
JPanel panePipeline = new JPanel(new BorderLayout());
panePipeline.add(pipelineView, BorderLayout.CENTER);
panePipeline.add(pipelineView.getVerticalScroll(), BorderLayout.EAST);
panePipeline
.add(pipelineView.getHorizontalScroll(), BorderLayout.SOUTH);
// function library
LibraryPanel functionLibrary = new LibraryPanel(pipelineView);
for (AbstractFunctionGroup afg : ModelProxy.getInstance()
.getFunctions().getFunctionGroups()) {
LibraryPanelGroup lpg = new LibraryPanelGroup(functionLibrary,
pipelineView, afg);
functionLibrary.addGroup(lpg);
}
JScrollPane paneLibrary = new JScrollPane(functionLibrary);
paneLibrary
.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
paneLibrary.getVerticalScrollBar().setUnitIncrement(10);
// split containers
JSplitPane splitLibAndView = new JSplitPane(
JSplitPane.HORIZONTAL_SPLIT, true, paneLibrary, panePipeline);
JSplitPane splitMain = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
true, splitLibAndView, functionInspector);
splitMain.setResizeWeight(1.0);
getContentPane().add(splitMain);
// set the application icon
Image icon = getToolkit().getImage(
getClass().getResource(
"/de/osmembrane/resources/images/icon.png"));
setIconImage(icon);
// center, then maximize
pack();
centerWindow();
if (!showStartScreen) {
setExtendedState(Frame.MAXIMIZED_BOTH);
}
// correct width
splitMain.setDividerLocation(splitMain.getSize().width
- splitMain.getInsets().right - splitMain.getDividerSize()
- 384);
}
@Override
public void setWindowTitle(String title) {
super.setWindowTitle(title + " - "
+ I18N.getInstance().getString("osmembrane"));
}
@Override
public Object getSelected() {
return pipelineView.getSelected();
}
@Override
public void setHint(String hint) {
pipelineView.setHint(hint);
}
@Override
public MainFrameGlassPane getMainGlassPane() {
return (MainFrameGlassPane) getGlassPane();
}
@Override
public boolean isDragAndDropTarget(Point at) {
Point framePoint = SwingUtilities.convertPoint(this.getGlassPane(), at,
this);
Component target = findComponentAt(framePoint);
return (pipelineView.getLayeredPane().equals(target))
|| (pipelineView.getLayeredPane().equals(target.getParent()));
}
@Override
public IZoomDevice getZoomDevice() {
return pipelineView;
}
@Override
public void maximizeWindow() {
setExtendedState(Frame.MAXIMIZED_BOTH);
}
}