package osp.ui; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.BorderFactory; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSplitPane; import javax.swing.WindowConstants; import osp.FieldOfView; import osp.Image; import osp.Reader; import osp.Writer; import osp.utils.TableurModel; import osp.utils.TableurPanel; import osp.utils.WaitGlassPanel; /** * This class is the main support for the display. * There are 2 main panels : one to select images with a tree, * another one to display them and working on. * The informations about objects loaded and selected are below those panels. */ public class OSPE_MainFrame extends JFrame implements StatusInterface, AccessMenuInterface, AccessSlitMenuInterface { private static final long serialVersionUID = 1L; private JPanel contentPane; private JSplitPane splitPane; private JLabel statusBarLabel; public OspeMenuBar menuBar; private OSPE_SelectPanel selectPanel; private OSPE_VisuPanel visuPanel; public JSplitPane dualPane; private TableurPanel tableurPanel; private OSPE_BrowserToolBar toolBar; public OSPE_SettingsPanel settingsPanel; protected FieldOfView fov; protected Reader theReader; protected Writer theWriter; private OspeControl ospeControl; /** * Constructor. * * @param f * : field of view */ public OSPE_MainFrame(FieldOfView f) { fov = f; theReader = new Reader(this, fov); theWriter = new Writer(this, fov); ospeControl = new OspeControl(this, getVisuPanel(), getSelectPanel(), getSettingsPanel(), fov, getToolBar(),theReader, theWriter, getMenu()) ; getVisuPanel().setControl(ospeControl); visuPanel.setWriter(theWriter); getMenu().setControl(ospeControl); getToolBar().setControl(ospeControl); getSelectPanel().setControl(ospeControl); tableurPanel.setVisuPanel(visuPanel); fov.addObserver(ospeControl); setName("OSPE_MainFrame"); setDefaultLookAndFeelDecorated(false); this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); setGlassPane(new WaitGlassPanel()); setJMenuBar(getMenu()); setContentPane(getContentPanel()); setResizable(true); setTitle("OSP EDITOR "); pack(); setVisible(true); addFrameListener(); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } ospeControl.createFirstProject(); } private OSPE_SettingsPanel getSettingsPanel() { if (settingsPanel == null){ settingsPanel = new OSPE_SettingsPanel(); } return settingsPanel; } /** * */ private void addFrameListener() { this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { menuBar.getProjectExitMenu().doClick(); } }); // this.addComponentListener(new ComponentAdapter() { // public void componentResized(ComponentEvent evt) { // if (fov.getSelectedImage() >= 0) // visuPanel.update(null, null); // } // }); } /** * */ private JLabel getStatusBarLabel() { if (statusBarLabel == null) { statusBarLabel = new JLabel("Press F1 Key for OSP_Editor Help"); statusBarLabel.setBorder(BorderFactory.createEtchedBorder()); } return statusBarLabel; } /** * @return */ private JSplitPane getDualPane() { if (dualPane == null) { dualPane = new JSplitPane(); dualPane.setOrientation(JSplitPane.VERTICAL_SPLIT); dualPane.setDividerSize(10); dualPane.setOneTouchExpandable(true); dualPane.add(getTableurPanel(), JSplitPane.BOTTOM); dualPane.add(getSplitPane(), JSplitPane.TOP); } return dualPane; } public TableurPanel getTableurPanel() { if (tableurPanel == null) { int defNbCol; TableurModel tableurModel = new TableurModel(); defNbCol = tableurModel.getColumnCount(); int[] defColSize = tableurModel.getColSize(); tableurPanel = new TableurPanel(tableurModel, defColSize); } return tableurPanel; } /** * */ private JSplitPane getSplitPane() { if (splitPane == null) { splitPane = new JSplitPane(); splitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT); splitPane.setDividerSize(10); splitPane.setOneTouchExpandable(true); splitPane.add(getVisuPanel(), JSplitPane.RIGHT); splitPane.add(getSelectPanel(), JSplitPane.LEFT); } return splitPane; } /** * Visualization Panel Creation * */ public OSPE_VisuPanel getVisuPanel() { if (visuPanel == null){ visuPanel = new OSPE_VisuPanel(this, this, fov, theWriter, getTableurPanel()); tableurPanel=getTableurPanel(); visuPanel.setBorder(BorderFactory.createEtchedBorder()); } return visuPanel; } /** SelectPanel Creation * */ public OSPE_SelectPanel getSelectPanel() { if (selectPanel == null) { selectPanel = new OSPE_SelectPanel(this, this,fov, getVisuPanel()); selectPanel.setBorder(BorderFactory.createEtchedBorder()); selectPanel.setPreferredSize(new Dimension(250, 800)); } return selectPanel; } /** * * @return */ public JPanel getContentPanel() { if (contentPane == null) { contentPane = new JPanel(new BorderLayout()); contentPane.add(getDualPane(), BorderLayout.CENTER); contentPane.add(getStatusBarLabel(), BorderLayout.SOUTH); contentPane.add(getToolBar(), BorderLayout.NORTH); // New windows // settingsPanel = new OSPE_SettingsPanel(); // settingsPanel.setVisible(false); } return contentPane; } /** * Get the actions controller * @return OspeControl */ public OspeControl getOspeControl() { return ospeControl; } /** * Set a status bar * @param s: text to display in the Status bar * */ @Override public void setStatusBarText(String s) { getStatusBarLabel().setForeground(Color.black); getStatusBarLabel().setText(s); } /** * Put color in the status bar. * @param c: Color of the text to display * @param s: text to display in the Status bar */ @Override public void setStatusBarText(Color c, String s) { statusBarLabel.setForeground(c); statusBarLabel.setText(s); } /** * Creation, Activation or not of menu options and toolbar buttons. * */ public OSPE_BrowserToolBar getToolBar() { if (toolBar == null) { toolBar = new OSPE_BrowserToolBar(); } return toolBar; } /** * Function to create menus bar */ private OspeMenuBar getMenu() { if (menuBar == null) { menuBar = new OspeMenuBar(); } return menuBar; } @Override public boolean isjMenuSlitEnabled() { return getMenu().jMenuSlit.isEnabled(); } @Override public void setjMenuSlitEnabled(boolean b) { getMenu().jMenuSlit.setEnabled(b); } @Override public void enableButtonsForPicObject(boolean b) { for (int i = 0; i < getToolBar().getComponentCount() - 1; i++) getToolBar().getComponent(i).setEnabled(b); for (int i = 0; i < menuBar.getComponentCount() - 1; i++) menuBar.getComponent(i).setEnabled(b); getSelectPanel().getFovTree().setEnabled(b); } @Override public void clickOnMaskStop() { menuBar.jMenuMaskStop.doClick(); } @Override public boolean isMenuDisplayPlotObjectsSelected() { return menuBar.jMenuDisplayPlotObjects.isSelected(); } @Override public void clickOnMenuDisplayPlotSelectedSpectra() { menuBar.jMenuDisplayPlotSelectedSpectra.doClick(); } @Override public boolean isMenuDisplayPlotDetectorSelected() { return menuBar.jMenuDisplayPlotDetector.isSelected(); } @Override public boolean isMenuDisplayPlotMaskSelected() { return menuBar.jMenuDisplayPlotMask.isSelected(); } @Override public boolean isMenuDisplayPlotMaskCenterSelected() { return menuBar.jMenuDisplayPlotMaskCenter.isSelected(); } /** * Enable / disable some buttons of the menu bar * following the load of an image or not. */ @Override public void updateButtons() { menuBar.jMenuImage.setEnabled(true); menuBar.jMenuImageLoad.setEnabled(true); // An image can be loaded if (visuPanel.getNavigatorImageDisplay().getState() == 0){ menuBar.jMenuProjectSave.setEnabled(true); menuBar.jMenuObject.setEnabled(false); menuBar.jMenuImageRemove.setEnabled(false); menuBar.jMenuImageEditCuts.setEnabled(false); } else // it is. if (visuPanel.getNavigatorImageDisplay().getState() > 0) { menuBar.jMenuObject.setEnabled(true); menuBar.jMenuImageRemove.setEnabled(true); menuBar.jMenuImageEditCuts.setEnabled(true); } if (fov.getSelectedImage() >= 0) { updateButtonsIfImage(); final Image currIm=fov.getCurrentImage(); if ((currIm.getNbrObjects()>0) || (currIm.getNbrMasks()>0)) { updateButtonsIfObjects(currIm); } else { disableButtonsMasksSlits(); menuBar.jMenuMask.setEnabled(true); disableMaskFontionality(); } } else { // There is no image disableButtonsMasksSlits(); disableMaskFontionality(); } } /** * */ public void disableButtonsMasksSlits() { // menuBar.jMenuMask.setEnabled(false); // visuPanel.searchButton.setEnabled(false); menuBar.jMenuSlit.setEnabled(false); toolBar.getButtonUndoToolBar().setEnabled(false); toolBar.enableButtonDuringMaskEdition(false); } /** * Enable / disable some buttons of the menu bar when an image is loaded * and following if there is a mask or not. * */ public void updateButtonsIfImage() { menuBar.jMenuObject.setEnabled(true); ; } /** * Update buttons if mask selected. * */ public void updateButtonsIfObjects(Image im) { if ((im.getNbrObjects()>0)|| (im.getNbrMasks()>0)) { menuBar.jMenuMask.setEnabled(true); menuBar.jMenuMaskAdd.setEnabled(true); if (im.getNbrObjects()>0) visuPanel.searchButton.setEnabled(true); if (im.getSelectedMask() >= 0 && !im.getCurrentMask().validated) { // There is a mask menuBar.jMenuMaskMove.setEnabled(true); menuBar.jMenuMaskTurn.setEnabled(true); menuBar.jMenuMaskRemove.setEnabled(true); menuBar.jMenuMaskStop.setEnabled(true); menuBar.jMenuSlit.setEnabled(true); toolBar.enableButtonDuringMaskEdition(true); visuPanel.validateButton.setEnabled(true); visuPanel.writeButton.setEnabled(true); if (im.getCurrentMask().getHistory().isEmpty()) { toolBar.getButtonUndoToolBar().setEnabled(false); menuBar.getMenuMaskUndoItem().setEnabled(false); menuBar.getMenuMaskUndoItem().setText("Undo last action"); } else { toolBar.getButtonUndoToolBar().setEnabled(true); menuBar.getMenuMaskUndoItem().setEnabled(true); menuBar.getMenuMaskUndoItem().setText("Undo " + im.getCurrentMask().getHistory().getLastEntry() .getName()); } } else { // There is no mask or it's validated. disableMaskFontionality(); if ((im.getSelectedMask()>=0) && (im.getNbrMasks()>0) && (im.getCurrentMask().validated)) { visuPanel.validateButton.setEnabled(true); visuPanel.writeButton.setEnabled(true); } else { visuPanel.validateButton.setEnabled(false); visuPanel.writeButton.setEnabled(false); } } } else // No objects { menuBar.jMenuMask.setEnabled(true); } } public void disableMaskFontionality() { menuBar.jMenuMaskMove.setEnabled(false); menuBar.jMenuMaskTurn.setEnabled(false); menuBar.jMenuMaskRemove.setEnabled(false); menuBar.jMenuMaskStop.setEnabled(false); toolBar.getButtonUndoToolBar().setEnabled(false); menuBar.getMenuMaskUndoItem().setEnabled(false); menuBar.getMenuMaskUndoItem().setText("Undo last action"); menuBar.jMenuSlit.setEnabled(false); toolBar.enableButtonDuringMaskEdition(false); } } // End class