package org.incha.ui; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.LinkedList; import javax.swing.JButton; import javax.swing.JDesktopPane; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JSeparator; import javax.swing.JSplitPane; import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; import org.apache.commons.logging.LogFactory; import org.incha.core.JavaProject; import org.incha.core.JavaProjectsModel; import org.incha.core.StatisticsManager; import org.incha.ui.stats.ShowCurrentStateAction; import org.incha.ui.stats.StartAnalysisAction; public class JSwingRipplesApplication extends JFrame { private static final long serialVersionUID = 6142679404175274529L; /** * The view area */ private final JDesktopPane viewArea = new JDesktopPane(); private final ProjectsView projectsView; private static JSwingRipplesApplication instance; private final ProgressMonitorImpl progressMonitor = new ProgressMonitorImpl(); /** * Default constructor. */ public JSwingRipplesApplication() { super("JSwingRipples"); instance = this; setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); final JPanel contentPane = new JPanel(new BorderLayout(0, 5)); setContentPane(contentPane); contentPane.setBorder(new EmptyBorder(2, 2, 2, 2)); setJMenuBar(createMenuBar()); projectsView = new ProjectsView(JavaProjectsModel.getInstance()); projectsView.addProjectsViewMouseListener(new ProjectsViewMouseListener() { @Override public void handle(final ProjectsViewMouseEvent e) { handleProjectsViewMouseEvent(e); } }); final JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, projectsView, viewArea); getContentPane().add(pane, BorderLayout.CENTER); //add progress monitor. getContentPane().add(progressMonitor, BorderLayout.SOUTH); //init liteners final DefaultController controller = new DefaultController(); StatisticsManager.getInstance().addStatisticsChangeListener(controller); //create model saver, this class will watch for model //and save it when model state changed new ModelSaver(JavaProjectsModel.getInstance(), JavaProjectsModel.getModelFile()); } /** * @param e */ protected void handleProjectsViewMouseEvent(final ProjectsViewMouseEvent e) { if (e.getType() != ProjectsViewMouseEvent.LEFT_MOUSE_PRESSED) { return; } final Object[] path = e.getPath(); if (path[path.length -1] instanceof JavaProject) { final JavaProject project = (JavaProject) path[path.length -1]; final JPopupMenu menu = new JPopupMenu(); //delete project menu item final JMenuItem delete = new JMenuItem("Delete"); delete.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { JavaProjectsModel.getInstance().deleteProject(project); } }); menu.add(delete); //project preferences menu item final JMenuItem prefs = new JMenuItem("Preferences"); prefs.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { showProjectSettinsEditor(project); } }); menu.add(prefs); //start analisics final JMenuItem startAnalysis = new JMenuItem("Start analysis"); startAnalysis.addActionListener(new StartAnalysisAction()); menu.add(startAnalysis); menu.show(projectsView, e.getX(), e.getY()); } } /** * @param project */ protected void showProjectSettinsEditor(final JavaProject project) { final JFrame f = new JFrame("Project Settings"); f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); f.getContentPane().setLayout(new BorderLayout(0, 5)); final ProjectSettingsEditor view = new ProjectSettingsEditor(project); f.getContentPane().add(view, BorderLayout.CENTER); //add ok button final JPanel south = new JPanel(new FlowLayout()); final JButton ok = new JButton("Ok"); ok.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { f.dispose(); } }); south.add(ok); f.getContentPane().add(south, BorderLayout.SOUTH); //set frame location final Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); f.setSize(size.width / 2, size.height / 2); f.setLocationRelativeTo(this); //show frame f.setVisible(true); } /** * @return */ private JMenuBar createMenuBar() { final JMenuBar bar = new JMenuBar(); //file menu final JMenu file = new JMenu("File"); bar.add(file); final JMenuItem newProject = new JMenuItem("New Project"); newProject.addActionListener(new ActionListener() { @Override public void actionPerformed(final ActionEvent e) { createNewProject(); } }); file.add(newProject); //JRipples menu final JMenu jRipples = new JMenu("JRipples"); bar.add(jRipples); final JMenuItem startAnalysis = new JMenuItem("Start analysis"); startAnalysis.addActionListener(new StartAnalysisAction()); jRipples.add(startAnalysis); jRipples.add(new JSeparator(JSeparator.HORIZONTAL)); final JMenuItem currentState = new JMenuItem("Current state - statistics"); currentState.addActionListener(new ShowCurrentStateAction()); jRipples.add(currentState); // final JMenuItem manageStates = new JMenuItem("Manage Statess"); // jRipples.add(manageStates); // final JMenuItem saveState = new JMenuItem("Save State"); // jRipples.add(saveState); // final JMenuItem loadState = new JMenuItem("Load State"); // jRipples.add(loadState); return bar; } /** * Creates new project. */ protected void createNewProject() { final JavaProject project = NewProjectWizard.showDialog(this); if (project != null) { JavaProjectsModel.getInstance().addProject(project); } } /** * @return the application home folder. */ public static File getHome() { return new File(System.getProperty("user.home") + File.separator + ".jswingripples"); } public static void main(final String[] args) { //init logging getHome().mkdirs(); final JFrame f = new JSwingRipplesApplication(); //set frame location final Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); f.setSize(size.width / 2, size.height / 2); f.setLocationByPlatform(true); LogFactory.getLog(JSwingRipplesApplication.class).debug("Prueba uno"); // If called with the protocol args processArgs(args); //show frame SwingUtilities.invokeLater(new Runnable() { @Override public void run() { f.setVisible(true); } }); } private static void processArgs(final String[] args) { if (args.length != 0) { JavaProjectsModel javaProjectsModel = JavaProjectsModel.getInstance(); JavaProject project = javaProjectsModel.getProjectByName(args[0]); if (project == null) { project = new JavaProject(args[0]); javaProjectsModel.addProject(project); } for (int argNumber = 1; argNumber < args.length; argNumber++) { project.getBuildPath().addSource(new File(args[argNumber])); } } } /** * Get function using singleton. * @return shared application window. */ public static JSwingRipplesApplication getInstance() { if(instance==null){ instance=new JSwingRipplesApplication(); } return instance; } /** * @return progress monitor. */ public TaskProgressMonitor getProgressMonitor() { return this.progressMonitor; } /** * @return the viewArea */ public JDesktopPane getViewArea() { return viewArea; } }