package com.baselet.standalone.gui; import java.awt.Dimension; import java.awt.Frame; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import javax.imageio.ImageIO; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSplitPane; import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.JToggleButton; import javax.swing.ToolTipManager; import javax.swing.WindowConstants; import com.baselet.control.config.Config; import com.baselet.control.constants.Constants; import com.baselet.control.enums.Program; import com.baselet.gui.BaseGUIBuilder; import com.baselet.gui.filedrop.FileDrop; import com.baselet.gui.filedrop.FileDropListener; import com.baselet.gui.listener.GUIListener; import com.baselet.gui.listener.UmletWindowFocusListener; public class StandaloneGUIBuilder extends BaseGUIBuilder { private JComboBox zoomComboBox; private ZoomListener zoomListener; private JTextField searchField; private JTabbedPane diagramtabs; private JToggleButton mailButton; public JTabbedPane getDiagramtabs() { return diagramtabs; } public JComboBox getZoomComboBox() { return zoomComboBox; } public ZoomListener getZoomListener() { return zoomListener; } public JTextField getSearchField() { return searchField; } public JFrame initSwingGui(MenuBuilder menuBuilder) { JFrame mainFrame = new JFrame(); mainFrame.addWindowFocusListener(new UmletWindowFocusListener()); mainFrame.addKeyListener(new GUIListener()); mainFrame.addKeyListener(new SearchKeyListener()); mainFrame.addWindowListener(new SwingWindowListener()); mainFrame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); // closing is handled in the StandaloneGUI.closeWindow() callback (fix for issue #250) mainFrame.setBounds(Config.getInstance().getProgram_location().x, Config.getInstance().getProgram_location().y, Config.getInstance().getProgram_size().width, Config.getInstance().getProgram_size().height); mainFrame.setTitle(Program.getInstance().getProgramName() + " - Free UML Tool for Fast UML Diagrams"); setImage(mainFrame); if (Config.getInstance().isStart_maximized()) { // If Main starts maximized we set fixed bounds and must set the frame visible // now to avoid a bug where the right sidebar doesn't have the correct size mainFrame.setExtendedState(mainFrame.getExtendedState() | Frame.MAXIMIZED_BOTH); mainFrame.setVisible(true); } mainFrame.setJMenuBar(menuBuilder.createMenu(createSearchPanel(), createZoomPanel(), createMailButton())); JPanel diagramTabPanel = createDiagramTabPanel(); int mainDividerLoc = Math.min(mainFrame.getSize().width - Constants.MIN_MAIN_SPLITPANEL_SIZE, Config.getInstance().getMain_split_position()); JSplitPane baseSplitPane = initBase(diagramTabPanel, mainDividerLoc); mainFrame.add(baseSplitPane); ToolTipManager.sharedInstance().setInitialDelay(100); mainFrame.setVisible(true); return mainFrame; } /** * set several image sizes of umlet_logo*.png */ private void setImage(JFrame mainFrame) { ArrayList<BufferedImage> images = new ArrayList<BufferedImage>(); for (Integer i : new int[] { 16, 20, 24, 32, 40, 48, 64 }) { InputStream is = null; try { is = this.getClass().getClassLoader().getResourceAsStream(Program.getInstance().getProgramName().toLowerCase() + "_logo" + i + ".png"); images.add(ImageIO.read(is)); } catch (IOException e) { throw new RuntimeException("Cannot read image", e); } finally { if (is != null) { try { is.close(); } catch (IOException e) {} } } } mainFrame.setIconImages(images); } private void createZoomComboBox() { zoomComboBox = new JComboBox(); zoomComboBox.setPreferredSize(new Dimension(80, 24)); zoomComboBox.setMinimumSize(zoomComboBox.getPreferredSize()); zoomComboBox.setMaximumSize(zoomComboBox.getPreferredSize()); zoomListener = new ZoomListener(); zoomComboBox.addActionListener(zoomListener); zoomComboBox.addMouseWheelListener(zoomListener); zoomComboBox.setToolTipText("Use ± or mouse wheel to zoom"); String[] zoomValues = Constants.zoomValueList.toArray(new String[Constants.zoomValueList.size()]); zoomComboBox.setModel(new DefaultComboBoxModel(zoomValues)); zoomComboBox.setSelectedIndex(9); } public JPanel createZoomPanel() { createZoomComboBox(); JPanel zoomPanel = new JPanel(); zoomPanel.setOpaque(false); zoomPanel.setLayout(new BoxLayout(zoomPanel, BoxLayout.X_AXIS)); zoomPanel.add(new JLabel("Zoom: ")); zoomPanel.add(zoomComboBox); zoomPanel.add(Box.createRigidArea(new Dimension(20, 0))); return zoomPanel; } private void createSearchField() { searchField = new JTextField(10); searchField.setMinimumSize(searchField.getPreferredSize()); searchField.setMaximumSize(searchField.getPreferredSize()); searchField.addKeyListener(new SearchListener()); } public JPanel createSearchPanel() { createSearchField(); JPanel searchPanel = new JPanel(); searchPanel.setOpaque(false); searchPanel.setLayout(new BoxLayout(searchPanel, BoxLayout.X_AXIS)); searchPanel.add(Box.createRigidArea(new Dimension(50, 0))); searchPanel.add(new JLabel("Search: ")); searchPanel.add(searchField); searchPanel.add(Box.createRigidArea(new Dimension(20, 0))); return searchPanel; } @SuppressWarnings("unused") public JPanel createDiagramTabPanel() { JPanel diagramspanel = new JPanel(); new FileDrop(diagramspanel, new FileDropListener()); // enable drag&drop from desktop into diagrampanel diagramtabs = new JTabbedPane(); diagramtabs.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT); diagramspanel.setLayout(new GridLayout(1, 1)); diagramspanel.add(diagramtabs); return diagramspanel; } public JToggleButton createMailButton() { mailButton = new JToggleButton("Mail diagram"); mailButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setMailPanelEnabled(!getMailPanel().isVisible()); } }); return mailButton; } @Override public void setMailPanelEnabled(boolean enable) { super.setMailPanelEnabled(enable); mailButton.setSelected(enable); } }