From ee25c8391c07dc59dc7cb9b3ff8b1b30dcbd2fcd Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Tue, 18 Oct 2011 17:01:22 -0400 Subject: [PATCH] Added icons and polish. Save and load gitblit registrations. --- src/com/gitblit/client/GitblitManager.java | 131 +++++++++++++++++++++++++++++++++++++++---- 1 files changed, 119 insertions(+), 12 deletions(-) diff --git a/src/com/gitblit/client/GitblitManager.java b/src/com/gitblit/client/GitblitManager.java index f777fdb..47ff6ea 100644 --- a/src/com/gitblit/client/GitblitManager.java +++ b/src/com/gitblit/client/GitblitManager.java @@ -20,12 +20,18 @@ import java.awt.EventQueue; import java.awt.Font; import java.awt.GridLayout; +import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.io.File; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.text.MessageFormat; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; import javax.swing.ImageIcon; import javax.swing.JFrame; @@ -41,11 +47,17 @@ import javax.swing.KeyStroke; import javax.swing.UIManager; +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.lib.StoredConfig; +import org.eclipse.jgit.storage.file.FileBasedConfig; +import org.eclipse.jgit.util.Base64; +import org.eclipse.jgit.util.FS; + import com.gitblit.Constants; import com.gitblit.utils.StringUtils; /** - * Sample RPC application. + * Gitblit Manager issues JSON RPC requests to a Gitblit server. * * @author James Moger * @@ -54,10 +66,11 @@ private static final long serialVersionUID = 1L; private JTabbedPane serverTabs; + private File configFile = new File(System.getProperty("user.home"), ".gitblit/config"); private GitblitRegistration localhost = new GitblitRegistration("default", "https://localhost:8443", "admin", "admin".toCharArray()); - private List<GitblitRegistration> registrations = new ArrayList<GitblitRegistration>(); + private Map<String, GitblitRegistration> registrations = new LinkedHashMap<String, GitblitRegistration>(); private JMenu recentMenu; private GitblitManager() { @@ -67,10 +80,66 @@ private void initialize() { setContentPane(getCenterPanel()); setIconImage(new ImageIcon(getClass().getResource("/gitblt-favicon.png")).getImage()); - setTitle("Gitblit Manager v" + Constants.VERSION + " (" + Constants.VERSION_DATE + ")"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setSize(800, 500); + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent event) { + saveSizeAndPosition(); + } + }); + + setSizeAndPosition(); + loadRegistrations(); + rebuildRecentMenu(); + } + + private void setSizeAndPosition() { + String sz = null; + String pos = null; + try { + StoredConfig config = getConfig(); + sz = config.getString("ui", null, "size"); + pos = config.getString("ui", null, "position"); + } catch (Throwable t) { + t.printStackTrace(); + } + + // try to restore saved window size + if (StringUtils.isEmpty(sz)) { + setSize(850, 500); + } else { + String[] chunks = sz.split("x"); + int width = Integer.parseInt(chunks[0]); + int height = Integer.parseInt(chunks[1]); + setSize(width, height); + } + + // try to restore saved window position + if (StringUtils.isEmpty(pos)) { + setLocationRelativeTo(null); + } else { + String[] chunks = pos.split(","); + int x = Integer.parseInt(chunks[0]); + int y = Integer.parseInt(chunks[1]); + setLocation(x, y); + } + } + + private void saveSizeAndPosition() { + try { + // save window size and position + StoredConfig config = getConfig(); + Dimension sz = GitblitManager.this.getSize(); + config.setString("ui", null, "size", + MessageFormat.format("{0,number,0}x{1,number,0}", sz.width, sz.height)); + Point pos = GitblitManager.this.getLocationOnScreen(); + config.setString("ui", null, "position", + MessageFormat.format("{0,number,0},{1,number,0}", pos.x, pos.y)); + config.save(); + } catch (Throwable t) { + Utils.showException(GitblitManager.this, t); + } } public void setVisible(boolean value) { @@ -80,10 +149,10 @@ loginPrompt(localhost); } else if (registrations.size() == 1) { // single registration prompt - loginPrompt(registrations.get(0)); + GitblitRegistration reg = registrations.values().iterator().next(); + loginPrompt(reg); } super.setVisible(value); - setLocationRelativeTo(null); } } @@ -147,7 +216,7 @@ reg = new GitblitRegistration(nameField.getText(), url, accountField.getText(), passwordField.getPassword()); boolean success = login(reg); - registrations.add(0, reg); + registrations.put(reg.name, reg); rebuildRecentMenu(); return success; } @@ -161,6 +230,7 @@ serverTabs.setSelectedIndex(idx); serverTabs.setTabComponentAt(idx, new ClosableTabComponent(reg.name, null, serverTabs, panel)); + saveRegistration(reg); return true; } catch (IOException e) { JOptionPane.showMessageDialog(GitblitManager.this, e.getMessage(), @@ -171,17 +241,54 @@ private void rebuildRecentMenu() { recentMenu.removeAll(); - for (final GitblitRegistration reg : registrations) { - JMenuItem item = new JMenuItem(reg.name); + ImageIcon icon = new ImageIcon(getClass().getResource("/gitblt-favicon.png")); + for (final GitblitRegistration reg : registrations.values()) { + JMenuItem item = new JMenuItem(reg.name, icon); item.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - login(reg); + loginPrompt(reg); } }); recentMenu.add(item); } } + private void loadRegistrations() { + try { + StoredConfig config = getConfig(); + Set<String> servers = config.getSubsections("servers"); + for (String server : servers) { + String url = config.getString("servers", server, "url"); + String account = config.getString("servers", server, "account"); + char[] password = new String(Base64.decode(config.getString("servers", server, + "password"))).toCharArray(); + GitblitRegistration reg = new GitblitRegistration(server, url, account, password); + registrations.put(reg.name, reg); + } + } catch (Throwable t) { + Utils.showException(GitblitManager.this, t); + } + } + + private void saveRegistration(GitblitRegistration reg) { + try { + StoredConfig config = getConfig(); + config.setString("servers", reg.name, "url", reg.url); + config.setString("servers", reg.name, "account", reg.account); + config.setString("servers", reg.name, "password", + Base64.encodeBytes(new String(reg.password).getBytes("UTF-8"))); + config.save(); + } catch (Throwable t) { + Utils.showException(GitblitManager.this, t); + } + } + + private StoredConfig getConfig() throws IOException, ConfigInvalidException { + FileBasedConfig config = new FileBasedConfig(configFile, FS.detect()); + config.load(); + return config; + } + public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { -- Gitblit v1.9.1