gdx-studio

#libgdx#java#desktop

git clone https://git.pyrossh.dev/gdx-studio

An IDE for creating Games using libgdx and Java supported on all platforms Android, iOS, Desktop


src/gdxstudio/ToolBar.java
package gdxstudio;
import gdxstudio.panel.ConsolePanel;
import gdxstudio.panel.OptionsPanel;
import gdxstudio.panel.ProjectPanel;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FileDialog;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.lang.ProcessBuilder.Redirect;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.SwingConstants;

import com.badlogic.gdx.tools.imagepacker.TexturePacker2;
import com.badlogic.gdx.tools.imagepacker.TexturePacker2.Settings;

import web.laf.lite.layout.HorizontalFlowLayout;
import web.laf.lite.layout.ToolbarLayout;
import web.laf.lite.layout.VerticalFlowLayout;
import web.laf.lite.popup.ButtonPopup;
import web.laf.lite.popup.PopupWay;
import web.laf.lite.utils.UIUtils;
import web.laf.lite.widget.WebButtonGroup;

final public class ToolBar extends JPanel {
	private static final long serialVersionUID = 1L;
	SearchBar searchBar;
	ProcessBuilder pb;
	Process runningProcess;
	OptionsPanel optionsPanel;
    
	public ToolBar(){
		super(new ToolbarLayout());
        initAbout();
        initProject();
        initOpen();
        initPack();
        initExport();
        addSeparator();
        initOptions();
        addSeparator();
        add(Style.createToolPanel("Build", "esource", new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				ConsolePanel.build();
			}
	    }));
        add(Style.createToolPanel("Compile", "esource", new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				Content.editor.save();
			}
	    }));
        add(Style.createToolPanel("Run", "go", new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				run();
			}
	    }));
        add(Style.createToolPanel("Stop", "stop", new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				stop();
			}
	    }));
        Style.btnMap.get("stop").setEnabled(false);
        addSeparator();
        addSpace();
        addSpace();
        initSearch();
        addSpace();
        addSpace();
        addSeparator();
        initView();
        setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Style.border));
	}
	
	@Override
	public void paintComponent(Graphics g){
		Style.drawHorizontalBar(g, getWidth (), getHeight ());
	}
	
	void initSearch(){
		searchBar = new SearchBar();
        final JPanel pan = new JPanel(new VerticalFlowLayout(FlowLayout.CENTER));
        pan.setOpaque(false);
        pan.add(searchBar);
        add(pan);
	}
	
	void initAbout(){
		add(Style.createToolPanel("", "sabout", new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				JDialog dialog = new JDialog(Frame.getInstance(), "About", false);
				dialog.setResizable(false);
				dialog.getContentPane().setLayout(new BorderLayout());
				final JPanel popupContent = new JPanel (new VerticalFlowLayout(5, 10));
				final JButton licenseBtn = new JButton("Apache License v2.0");
				final JPanel author = new JPanel(new HorizontalFlowLayout());
				final JPanel hoz = new JPanel(new HorizontalFlowLayout());
				popupContent.add(UIUtils.setBoldFont(new JLabel("GdxStudio v"+GdxStudio.version)));
				popupContent.add(new JSeparator(SwingConstants.HORIZONTAL));
				author.setOpaque(false);
				author.add(new JLabel("Created by: pyros2097"));
				author.add(licenseBtn);
				popupContent.add(author);
				popupContent.add(new JSeparator(SwingConstants.HORIZONTAL));
				popupContent.add(new JLabel("", Icon.icon("slibGDX"), JLabel.LEADING));
				popupContent.add(new JLabel("", Icon.icon("sweblaf"), JLabel.LEADING));
				hoz.setOpaque(false);
				hoz.add(new JLabel("", Icon.icon("shierologo"), JLabel.LEADING));
				hoz.add(new JLabel("", Icon.icon("stexturepacker"), JLabel.LEADING));
				popupContent.add(hoz);
				UIUtils.setUndecorated(popupContent, false);
				UIUtils.setMargin(popupContent, new Insets(0,0,0,0));
				UIUtils.setDrawSides(popupContent, false, false, false, false);
				dialog.getContentPane().add(popupContent);
				dialog.pack();
				dialog.setSize(525, 500);
				Dimension Size = Toolkit.getDefaultToolkit().getScreenSize();  
				dialog.setLocation(new Double((Size.getWidth()/2) - (dialog.getWidth()/2)).intValue(), 
						new Double((Size.getHeight()/2) - (dialog.getHeight()/2)).intValue());  
				dialog.setVisible(true);
			}
		}));
	}
	
	void initFile(){
		final JButton menuBtn1 = Style.createMenuButton("File");
        final ButtonPopup menu = new ButtonPopup(menuBtn1,PopupWay.downRight);
        menu.setRound(0);
        JPanel popupContent = new JPanel ( new VerticalFlowLayout ( 5, 5 ) );
        popupContent.setPreferredSize(new Dimension(200, 200));
        popupContent.add(UIUtils.setBoldFont(new JLabel("     ToolBar")));
        popupContent.add(new JSeparator(SwingConstants.HORIZONTAL));
        popupContent.add(UIUtils.setBoldFont(new JLabel("     Explorer")));
        popupContent.add(new JSeparator(SwingConstants.HORIZONTAL));
        popupContent.setOpaque(false);
        menu.setContent(popupContent);
        add(menuBtn1);
	}
        
    void initEdit(){
    	final JButton menuBtn2 = Style.createMenuButton("Edit");
        final ButtonPopup menu2 = new ButtonPopup(menuBtn2,PopupWay.downRight);
        menu2.setRound(0);
        JPanel popupContent2 = new JPanel ( new VerticalFlowLayout ( 5, 5 ) );
        popupContent2.setPreferredSize(new Dimension(200, 200));
        popupContent2.add(UIUtils.setBoldFont(new JLabel("     ToolBar")));
        popupContent2.add(new JSeparator(SwingConstants.HORIZONTAL));
        popupContent2.add(UIUtils.setBoldFont(new JLabel("     Explorer")));
        popupContent2.add(new JSeparator(SwingConstants.HORIZONTAL));
        popupContent2.setOpaque(false);
        menu2.setContent(popupContent2);
        add(menuBtn2);
	}
	
	void run(){
		if(!Style.btnMap.get("stop").isEnabled()){
			Style.btnMap.get("stop").setEnabled(true);
			Style.btnMap.get("go").setEnabled(false);
		}
		if(!new File(Content.getProject()+new File(Content.getProject()).getName()+".jar").exists())
			Export.createJar();
		pb = new ProcessBuilder("java", "-jar", Content.getProject()+new File(Content.getProject()).getName()+".jar");
		pb.redirectOutput(Redirect.INHERIT);
		pb.redirectError(Redirect.INHERIT);
		pb.redirectInput(Redirect.INHERIT);
		try {
			runningProcess = pb.start();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	void stop(){
		if(!Style.btnMap.get("go").isEnabled()){
			Style.btnMap.get("stop").setEnabled(false);
			Style.btnMap.get("go").setEnabled(true);
		}
		if(runningProcess != null)
			runningProcess.destroy();
	}
	
	void initProject(){
		JButton prj = Style.createMenuButton("Project");
		prj.setIcon(Icon.icon("newprj"));
		prj.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				FileDialog fd = new FileDialog((Frame)null, "New GdxStudio Project", FileDialog.SAVE);
				fd.setVisible(true);
				String filename = fd.getDirectory()+fd.getFile();
				if(filename != null && !filename.isEmpty())
					if(new File(filename).exists())
						Export.createProject(fd.getDirectory());
			}
		});
		add(prj);
	}
	
	void initOpen(){
		JButton open = Style.createMenuButton("Open");
		open.setIcon(Icon.icon("eopen"));
		open.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				FileDialog fd = new FileDialog((Frame)null, "Open GdxStudio Project", FileDialog.LOAD);
				fd.setVisible(true);
				String filename = fd.getDirectory()+fd.getFile();
				if(filename != null)
					if(!filename.isEmpty() && filename.contains("config"))
						if(new File(filename).exists())
							Export.openProject(fd.getDirectory());
			}
		});
		add(open);
	}
	
	void initPack(){
		JButton packButton = Style.createMenuButton("Pack");
		packButton.setIcon(Icon.icon("epackage"));
    	packButton.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				Settings settings = new Settings();
				settings.maxWidth = 2048;
		        settings.maxHeight = 2048;
		        settings.paddingX = 0;
		        settings.paddingY = 0;
				TexturePacker2.process(settings, Content.getProject()+File.separator+"pack",
						Content.getProject()+"atlas/", "pack.atlas");
				for(File f: new File(Content.getProject()+File.separator+"pack").listFiles()){
					if(f.isDirectory()){
						TexturePacker2.process(settings, f.getPath(), Content.getProject()+"atlas/", f.getName());
						JOptionPane.showMessageDialog(null, "Packed Texture: "+f.getName(), "Texture Packer", 
								JOptionPane.INFORMATION_MESSAGE);
					}
				}
			}
    	});
		add(packButton);
	}
	
	void initExport(){
		JButton export = Style.createMenuButton("Export");
		export.setIcon(Icon.icon("export"));
		export.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				if(ProjectPanel.targetComboBox.getSelectedIndex() == 0)
					Export.createJar();
				else
					Export.createDex();
			}
		});
		add(export);
	}

	void initOptions(){
        optionsPanel = new OptionsPanel();
	    add(Style.createToolPanel("Options", "options", new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent e) {
				JDialog dialog = new JDialog(Frame.getInstance(), "Options", false);
				dialog.setResizable(false);
				dialog.getContentPane().setLayout(new BorderLayout());
				dialog.getContentPane().add(optionsPanel);
				dialog.pack();
				dialog.setSize(525, 525);
				Dimension Size = Toolkit.getDefaultToolkit().getScreenSize();  
				dialog.setLocation(new Double((Size.getWidth()/2) - (dialog.getWidth()/2)).intValue(), 
						new Double((Size.getHeight()/2) - (dialog.getHeight()/2)).intValue());  
				dialog.setVisible(true);
			}
	    	
	    }));
	}
	
	void initView(){
        Style.viewButton("Editor", "editor");
        Style.viewButton("Studio", "studio");
        Style.viewButton("Hiero", "shiero");
        Style.viewButton("Particle", "sparticle");
        WebButtonGroup textGroup = new WebButtonGroup(true, Style.viewGroup.get(0), Style.viewGroup.get(1), 
        		Style.viewGroup.get(2), Style.viewGroup.get(3));
        textGroup.setButtonsDrawFocus(false);
        UIUtils.setUndecorated(textGroup, true);
        UIUtils.setShadeWidth(textGroup, 0);
        UIUtils.setMargin(textGroup, new Insets(0, 0, -1, 0));
        UIUtils.setRound(textGroup, 0);
        UIUtils.setDrawSides(textGroup, false, false, false, false);
        add(textGroup);
	}
    
    public void addSpace(){
		add(new JLabel("       "), ToolbarLayout.START);
	}
	
	public void addSeparator(){
		add(new JSeparator(SwingConstants.VERTICAL), ToolbarLayout.START);
	}
}