package org.korsakow.ide.ui.interfacebuilder; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Collection; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JToggleButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSlider; import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.UIManager; import org.korsakow.domain.interf.IImage; import org.korsakow.domain.interf.ISound; import org.korsakow.ide.lang.LanguageBundle; import org.korsakow.ide.ui.components.KCollapsiblePane; import org.korsakow.ide.ui.components.TokenizerTextArea; import org.korsakow.ide.ui.components.cell.ResourceDOComboBoxRenderer; import org.korsakow.ide.ui.components.model.ResourceComboBoxModel; import org.korsakow.ide.ui.factory.IUIFactory; import org.korsakow.ide.ui.factory.UIFactory; import org.korsakow.ide.ui.interfacebuilder.panel.ArrangePanel; import org.korsakow.ide.ui.interfacebuilder.panel.GridInfoPanel; import org.korsakow.ide.ui.interfacebuilder.panel.InfoPanel; import org.korsakow.ide.ui.interfacebuilder.panel.WidgetsPanel; import org.korsakow.ide.ui.resources.ResourceView; import org.korsakow.ide.util.UIHelper; import org.korsakow.ide.util.UIResourceManager; import org.korsakow.ide.util.UIUtil; public class InterfaceBuilderMainPanel extends ResourceView { private JPanel topPanel; private JPanel toolsPanel; private JPanel settingsPanel; private WidgetCanvas canvas; private JScrollPane canvasScroll; private WidgetsPanel widgetsPanel; private JButton deleteButton; private JComboBox clickSoundCombo; private JSlider clickSoundVolumeSlider; private JComboBox backgroundImageCombo; private JLabel backgroundColorLabel; private JButton backgroundColorButton; private JButton clearBackgroundColorButton; private JToggleButton snapToGridButton; private InfoPanel infoPanel; private ArrangePanel arrangePanel; private GridInfoPanel gridInfoPanel; private KCollapsiblePane propertiesCollapse; private Color backgroundColorModel = null; private JCheckBox showBackgroundCheck; // private ISound clickSound; private IUIFactory uifac; public InterfaceBuilderMainPanel() { } @Override protected void initUI() { // super.initUI(); uifac = UIFactory.getFactory(); setLayout(new BorderLayout()); // hack until ui is consistent accross the whole app setBackground(UIManager.getColor("window2")); setOpaque(true); UIUtil.runUITaskLater(new Runnable() { public void run() { if (getTopLevelAncestor() != null) ((JFrame)getTopLevelAncestor()).getContentPane().setBackground(getBackground()); } }); // /hack createTopPanel(); add(topPanel, BorderLayout.NORTH); createMainCanvas(); add(mainPanel, BorderLayout.CENTER); tabbedPane = new JTabbedPane(); add(tabbedPane, BorderLayout.EAST); createToolsTab(); tabbedPane.addTab(LanguageBundle.getString("interfacebuilder.tab.tools.label"), toolsPanel); settingsPanel = createSettingsPanel(); tabbedPane.addTab(LanguageBundle.getString("interfacebuilder.tab.settings.label"), settingsPanel); toolsPanel.add(Box.createVerticalGlue()); toolsPanel.setMaximumSize(new Dimension(250, Short.MAX_VALUE)); toolsPanel.setPreferredSize(new Dimension(250, 100)); settingsPanel.add(Box.createVerticalGlue()); settingsPanel.setMaximumSize(new Dimension(200, Short.MAX_VALUE)); settingsPanel.setPreferredSize(new Dimension(200, 100)); } protected void createTopPanel() { topPanel = new JPanel(); topPanel.setLayout(new BoxLayout(topPanel, BoxLayout.Y_AXIS)); statusArea = uifac.createTextArea("statusArea"); statusArea.setEditable(false); statusArea.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); statusArea.setBackground(Color.white); statusArea.setMaximumSize(new Dimension(Integer.MAX_VALUE, 60)); statusArea.setVisible(false); topPanel.add(statusArea); } protected void createMainCanvas() { mainPanel = new JPanel(new BorderLayout()); canvas = new WidgetCanvas(); canvasScroll = new JScrollPane(canvas) { @Override public Dimension getPreferredSize() { // somehow avoids a scrollbar appearing when not necessary on initial show Dimension d = super.getPreferredSize(); d.width += canvas.getModel().getGridWidth(); d.height += canvas.getModel().getGridHeight(); return d; } }; mainPanel.add(canvasScroll, BorderLayout.CENTER); } protected void createToolsTab() { toolsPanel = new JPanel(); toolsPanel.setLayout(new BoxLayout(toolsPanel, BoxLayout.Y_AXIS)); toolsPanel.add(Box.createVerticalStrut(25)); infoPanel = new InfoPanel(); infoPanel.setBorder(BorderFactory.createEmptyBorder(20, 10, 20, 25)); KCollapsiblePane infoCollapse = new KCollapsiblePane(LanguageBundle.getString("interfacebuilder.infopanel.label"), infoPanel); infoCollapse.setAutoSetMaxSize(true); toolsPanel.add(infoCollapse); arrangePanel = new ArrangePanel(); arrangePanel.setBorder(BorderFactory.createEmptyBorder(20, 25, 20, 25)); KCollapsiblePane arrangeCollapse = new KCollapsiblePane(LanguageBundle.getString("interfacebuilder.arrangepanel.label"), arrangePanel); arrangeCollapse.setAutoSetMaxSize(true); toolsPanel.add(arrangeCollapse); propertiesCollapse = new KCollapsiblePane(LanguageBundle.getString("interfacebuilder.propertiespanel.label"), new JPanel()); toolsPanel.add(propertiesCollapse); JPanel widgetsHolderPane = new JPanel(new BorderLayout()); widgetsHolderPane.add(new JLabel("Drag to stage", JLabel.CENTER), BorderLayout.NORTH); widgetsPanel = new WidgetsPanel(); widgetsHolderPane.add(widgetsPanel, BorderLayout.CENTER); KCollapsiblePane widgetsCollapse = new KCollapsiblePane(LanguageBundle.getString("interfacebuilder.widgetspanel.label"), widgetsHolderPane); widgetsCollapse.setAutoSetMaxSize(true); toolsPanel.add(widgetsCollapse); toolsPanel.add(Box.createVerticalGlue()); JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); deleteButton = uifac.createButton("deleteButton", UIResourceManager.getIcon(UIResourceManager.ICON_DELETE)); buttonPanel.add(deleteButton, BorderLayout.EAST); //Snap to grid toggle Button snapToGridButton = uifac.createToggleButton("snapToGridButton","Snap to Grid", UIResourceManager.getIcon(UIResourceManager.ICON_DELETE), true); buttonPanel.add(snapToGridButton, BorderLayout.EAST); toolsPanel.add(buttonPanel); } @Override protected void initListeners() { super.initListeners(); deleteButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { canvas.getModel().removeWidgets(canvas.getSelectionModel().getSelectedWidgets()); } }); snapToGridButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { canvas.getModel().toggleSnapToGrid(); } }); } public WidgetCanvas getCanvas() { return canvas; } public JScrollPane getCanvasScroll() { return canvasScroll; } public InfoPanel getInfoPanel() { return infoPanel; } public ArrangePanel getArrangePanel() { return arrangePanel; } public void setPropertiesEditor(JComponent editor) { propertiesCollapse.setContent(editor); } public GridInfoPanel getGridInfoPanel() { return gridInfoPanel; } public void setClickSoundChoices(Collection<ISound> sounds) { clickSoundCombo.setModel(new ResourceComboBoxModel(sounds, true)); } public void setClickSound(ISound sound) { clickSoundCombo.setSelectedItem(sound); } public Long getClickSoundId() { return getClickSound()!=null?getClickSound().getId():null; } private ISound getClickSound() { return (ISound)clickSoundCombo.getSelectedItem(); } public float getClickSoundVolume() { return clickSoundVolumeSlider.getValue()/100.0f; } public void setClickSoundVolume(float volume) { clickSoundVolumeSlider.setValue((int)(100*volume)); } public void setShowBackground(boolean show) { showBackgroundCheck.setSelected(show); } public boolean getShowBackground() { return showBackgroundCheck.isSelected(); } public void addShowBackgroundListener(ActionListener listener) { showBackgroundCheck.addActionListener(listener); } @Override public void dispose() { // if (clickSound != null) { // clickSoundPanel.setResource(null); // } } protected JPanel createSettingsPanel() { JPanel settingsPanel = new JPanel(); settingsPanel.setLayout(new BoxLayout(settingsPanel, BoxLayout.Y_AXIS)); settingsPanel.add(Box.createVerticalStrut(25)); JPanel interfPanel = UIHelper.createVerticalBoxLayoutPanel( UIHelper.createBorderLayoutLabelPanel(LanguageBundle.getString("interfacebuilder.name.label"), nameField = new JTextField()) ); interfPanel.setBorder(BorderFactory.createEmptyBorder(20, 25, 20, 25)); KCollapsiblePane interfCollapse = new KCollapsiblePane("Interface", interfPanel); settingsPanel.add(interfCollapse); uifac.createLabel("keywordLabel", LanguageBundle.getString("interfacebuilder.keywords.label")); inKeywordBox = new TokenizerTextArea(); inKeywordBox.setName("inKeywordBox"); KCollapsiblePane gridCollapse = new KCollapsiblePane(LanguageBundle.getString("interfacebuilder.gridinfo.label"), gridInfoPanel = new GridInfoPanel()); settingsPanel.add(gridCollapse); gridCollapse.setName("gridInfoPanel"); KCollapsiblePane mediaCollapse = new KCollapsiblePane("Media", new JPanel()); settingsPanel.add(mediaCollapse); mediaCollapse.getContent().setLayout(uifac.createLayout("interface_media")); mediaCollapse.getContent().setBorder(BorderFactory.createEmptyBorder(20, 25, 20, 25)); mediaCollapse.getContent().add(uifac.createLabel("clickSoundLabel", LanguageBundle.getString("interfacebuilder.clicksound.label"))); mediaCollapse.getContent().add(clickSoundVolumeSlider = uifac.createHorizontalSlider("clickSoundVolumeSlider", 0, 100, 100)); mediaCollapse.getContent().add(clickSoundCombo = uifac.createComboBox("clickSoundCombo", new ResourceComboBoxModel(true), new ResourceDOComboBoxRenderer())); clickSoundCombo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { setClickSound((ISound)clickSoundCombo.getSelectedItem()); } }); mediaCollapse.getContent().add(uifac.createLabel("backgroundImageLabel", LanguageBundle.getString("projectsettings.backgroundimage.label"))); mediaCollapse.getContent().add(backgroundImageCombo = uifac.createComboBox("backgroundImageCombo", new ResourceComboBoxModel(true), new ResourceDOComboBoxRenderer())); mediaCollapse.getContent().add(backgroundColorButton = uifac.createButton("backgroundColorButton", "Color")); mediaCollapse.getContent().add(clearBackgroundColorButton = uifac.createButton("clearBackgroundColorButton", UIResourceManager.getIcon(UIResourceManager.ICON_DELETE))); mediaCollapse.getContent().add(backgroundColorLabel = uifac.createLabel("backgroundColorLabel", "")); backgroundColorLabel.setOpaque(true); KCollapsiblePane previewCollapse = new KCollapsiblePane("Preview", UIHelper.createVerticalBoxLayoutPanel( UIHelper.createLabelPanel("Show Background", showBackgroundCheck = new JCheckBox()) )); previewCollapse.getContent().setBorder(BorderFactory.createEmptyBorder(20, 25, 20, 25)); settingsPanel.add(previewCollapse); return settingsPanel; } public void setBackgroundImageChoices(Collection<IImage> images) { backgroundImageCombo.setModel(new ResourceComboBoxModel(images, true)); } public void setBackgroundImage(IImage image) { backgroundImageCombo.setSelectedItem(image); } public void addBackgroundImageActionListener(ActionListener listener) { backgroundImageCombo.addActionListener(listener); } public void addBackgroundColorActionListener(ActionListener listener) { backgroundColorButton.addActionListener(listener); } public void addClearBackgroundColorActionListener(ActionListener listener) { clearBackgroundColorButton.addActionListener(listener); } public Color getBackgroundColor() { return backgroundColorModel; } public void setBackgroundColorModel(Color color) { backgroundColorModel = color; backgroundColorLabel.setBackground(color); } public Long getBackgroundImageId() { return getBackgroundImage()!=null?getBackgroundImage().getId():null; } public IImage getBackgroundImage() { return (IImage)backgroundImageCombo.getSelectedItem(); } }