From 0e44acbb2fec928a1606dc60f427a148fff405c9 Mon Sep 17 00:00:00 2001
From: Mohamed Ragab <moragab@gmail.com>
Date: Wed, 02 May 2012 11:15:01 -0400
Subject: [PATCH] Added a script to facilitate setting the proxy host and port and no proxy hosts, and then it concatenates all the java system properties for setting the java proxy configurations and puts the resulting string in an environment variable JAVA_PROXY_CONFIG, modified the scirpts gitblit,  gitblit-ubuntu, and gitblit-centos to source the java-proxy-config.sh script and then include the resulting java proxy configuration in the java command

---
 src/com/gitblit/client/GitblitPanel.java | 1169 ++++------------------------------------------------------
 1 files changed, 87 insertions(+), 1,082 deletions(-)

diff --git a/src/com/gitblit/client/GitblitPanel.java b/src/com/gitblit/client/GitblitPanel.java
index 198b24b..f14ce79 100644
--- a/src/com/gitblit/client/GitblitPanel.java
+++ b/src/com/gitblit/client/GitblitPanel.java
@@ -16,55 +16,21 @@
 package com.gitblit.client;
 
 import java.awt.BorderLayout;
-import java.awt.Color;
 import java.awt.Component;
-import java.awt.Desktop;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.GridLayout;
 import java.awt.Insets;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.awt.event.KeyAdapter;
-import java.awt.event.KeyEvent;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
 import java.io.IOException;
-import java.net.URI;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
-import javax.swing.ImageIcon;
-import javax.swing.JButton;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
 import javax.swing.JPanel;
-import javax.swing.JScrollPane;
 import javax.swing.JTabbedPane;
-import javax.swing.JTable;
-import javax.swing.JTextField;
-import javax.swing.RowFilter;
-import javax.swing.SwingConstants;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
-import javax.swing.table.DefaultTableCellRenderer;
-import javax.swing.table.TableCellRenderer;
-import javax.swing.table.TableRowSorter;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 
-import com.gitblit.Constants.RpcRequest;
 import com.gitblit.client.ClosableTabComponent.CloseTabListener;
-import com.gitblit.models.RepositoryModel;
-import com.gitblit.models.SettingModel;
-import com.gitblit.models.SyndicatedEntryModel;
-import com.gitblit.models.UserModel;
-import com.gitblit.utils.StringUtils;
+import com.gitblit.models.FeedModel;
 
 /**
- * GitblitPanel performs the login, all business logic, and contains all widgets
- * to represent the state of a repository for the given account credentials.
+ * GitblitPanel is a container for the repository, users, settings, etc panels.
  * 
  * @author James Moger
  * 
@@ -73,53 +39,23 @@
 
 	private static final long serialVersionUID = 1L;
 
-	private final int margin = 5;
-
-	private final Insets insets = new Insets(margin, margin, margin, margin);
-
 	private final RegistrationsDialog.RegistrationListener listener;
 
 	private GitblitClient gitblit;
 
 	private JTabbedPane tabs;
 
-	private JTable repositoriesTable;
+	private RepositoriesPanel repositoriesPanel;
 
-	private RepositoriesTableModel repositoriesModel;
+	private FeedsPanel feedsPanel;
 
-	private JTable usersTable;
+	private UsersPanel usersPanel;
+	
+	private TeamsPanel teamsPanel;
 
-	private UsersTableModel usersModel;
-
-	private JTable settingsTable;
-
-	private SettingsTableModel settingsModel;
-
-	private JButton createRepository;
-
-	private JButton delRepository;
-
-	private TableRowSorter<RepositoriesTableModel> defaultRepositoriesSorter;
-
-	private TableRowSorter<UsersTableModel> defaultUsersSorter;
-
-	private TableRowSorter<SettingsTableModel> defaultSettingsSorter;
-
-	private JButton editRepository;
-
-	private HeaderPanel repositoriesHeader;
-
-	private HeaderPanel usersHeader;
-
-	private HeaderPanel settingsHeader;
+	private SettingsPanel settingsPanel;
 
 	private StatusPanel statusPanel;
-
-	private SyndicatedEntryTableModel syndicationModel;
-
-	private HeaderPanel feedsHeader;
-
-	private JTable syndicationEntriesTable;
 
 	public GitblitPanel(GitblitRegistration reg, RegistrationsDialog.RegistrationListener listener) {
 		this.gitblit = new GitblitClient(reg);
@@ -127,511 +63,130 @@
 
 		tabs = new JTabbedPane(JTabbedPane.BOTTOM);
 		tabs.addTab(Translation.get("gb.repositories"), createRepositoriesPanel());
-		tabs.addTab(Translation.get("gb.recentCommits"), createFeedsPanel());
+		tabs.addTab(Translation.get("gb.activity"), createFeedsPanel());
+		tabs.addTab(Translation.get("gb.teams"), createTeamsPanel());
 		tabs.addTab(Translation.get("gb.users"), createUsersPanel());
 		tabs.addTab(Translation.get("gb.settings"), createSettingsPanel());
 		tabs.addTab(Translation.get("gb.status"), createStatusPanel());
+		tabs.addChangeListener(new ChangeListener() {
+			public void stateChanged(ChangeEvent e) {
+				tabs.getSelectedComponent().requestFocus();
+			}
+		});
 
 		setLayout(new BorderLayout());
 		add(tabs, BorderLayout.CENTER);
 	}
 
 	private JPanel createRepositoriesPanel() {
-		final JButton browseRepository = new JButton(Translation.get("gb.browse"));
-		browseRepository.setEnabled(false);
-		browseRepository.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				RepositoryModel model = getSelectedRepositories().get(0);
-				String u = MessageFormat.format("{0}/summary/{1}", gitblit.url,
-						StringUtils.encodeURL(model.name));
-				try {
-					Desktop.getDesktop().browse(new URI(u));
-				} catch (Exception x) {
-					x.printStackTrace();
-				}
-			}
-		});
-
-		JButton refreshRepositories = new JButton(Translation.get("gb.refresh"));
-		refreshRepositories.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				refreshRepositories();
-			}
-		});
-
-		createRepository = new JButton(Translation.get("gb.create"));
-		createRepository.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				createRepository();
-			}
-		});
-
-		editRepository = new JButton(Translation.get("gb.edit"));
-		editRepository.setEnabled(false);
-		editRepository.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				editRepository(getSelectedRepositories().get(0));
-			}
-		});
-
-		delRepository = new JButton(Translation.get("gb.delete"));
-		delRepository.setEnabled(false);
-		delRepository.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				deleteRepositories(getSelectedRepositories());
-			}
-		});
-
-		final JButton subscribeRepository = new JButton(Translation.get("gb.subscribe") + "...");
-		subscribeRepository.setEnabled(false);
-		subscribeRepository.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				subscribeRepository(getSelectedRepositories().get(0));
-			}
-		});
-
-		NameRenderer nameRenderer = new NameRenderer(true);
-		IndicatorsRenderer typeRenderer = new IndicatorsRenderer();
-
-		DefaultTableCellRenderer sizeRenderer = new DefaultTableCellRenderer();
-		sizeRenderer.setHorizontalAlignment(SwingConstants.RIGHT);
-		sizeRenderer.setForeground(new Color(0, 0x80, 0));
-
-		DefaultTableCellRenderer ownerRenderer = new DefaultTableCellRenderer();
-		ownerRenderer.setForeground(Color.gray);
-		ownerRenderer.setHorizontalAlignment(SwingConstants.CENTER);
-
-		repositoriesModel = new RepositoriesTableModel();
-		defaultRepositoriesSorter = new TableRowSorter<RepositoriesTableModel>(repositoriesModel);
-		repositoriesTable = Utils.newTable(repositoriesModel, Utils.DATE_FORMAT);
-		repositoriesTable.setRowHeight(nameRenderer.getFont().getSize() + 8);
-		repositoriesTable.setRowSorter(defaultRepositoriesSorter);
-		repositoriesTable.getRowSorter().toggleSortOrder(
-				RepositoriesTableModel.Columns.Name.ordinal());
-
-		setRepositoryRenderer(RepositoriesTableModel.Columns.Name, nameRenderer, -1);
-		setRepositoryRenderer(RepositoriesTableModel.Columns.Indicators, typeRenderer, 100);
-		setRepositoryRenderer(RepositoriesTableModel.Columns.Owner, ownerRenderer, -1);
-		setRepositoryRenderer(RepositoriesTableModel.Columns.Size, sizeRenderer, 60);
-
-		repositoriesTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
-			@Override
-			public void valueChanged(ListSelectionEvent e) {
-				if (e.getValueIsAdjusting()) {
-					return;
-				}
-				boolean singleSelection = repositoriesTable.getSelectedRowCount() == 1;
-				boolean selected = repositoriesTable.getSelectedRow() > -1;
-				browseRepository.setEnabled(singleSelection);
-				delRepository.setEnabled(selected);
-				subscribeRepository.setEnabled(singleSelection);
-				if (selected) {
-					int viewRow = repositoriesTable.getSelectedRow();
-					int modelRow = repositoriesTable.convertRowIndexToModel(viewRow);
-					RepositoryModel model = ((RepositoriesTableModel) repositoriesTable.getModel()).list
-							.get(modelRow);
-					editRepository.setEnabled(singleSelection
-							&& (gitblit.allowManagement() || gitblit.isOwner(model)));
-				} else {
-					editRepository.setEnabled(false);
-				}
-			}
-		});
-
-		repositoriesTable.addMouseListener(new MouseAdapter() {
-			public void mouseClicked(MouseEvent e) {
-				if (e.getClickCount() == 2 && gitblit.allowManagement()) {
-					editRepository(getSelectedRepositories().get(0));
-				}
-			}
-		});
-
-		final JTextField repositoryFilter = new JTextField();
-		repositoryFilter.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				filterRepositories(repositoryFilter.getText());
-			}
-		});
-		repositoryFilter.addKeyListener(new KeyAdapter() {
-			public void keyReleased(KeyEvent e) {
-				filterRepositories(repositoryFilter.getText());
-			}
-		});
-
-		JPanel repositoryFilterPanel = new JPanel(new BorderLayout(margin, margin));
-		repositoryFilterPanel.add(new JLabel(Translation.get("gb.filter")), BorderLayout.WEST);
-		repositoryFilterPanel.add(repositoryFilter, BorderLayout.CENTER);
-
-		JPanel repositoryTablePanel = new JPanel(new BorderLayout(margin, margin));
-		repositoryTablePanel.add(repositoryFilterPanel, BorderLayout.NORTH);
-		repositoryTablePanel.add(new JScrollPane(repositoriesTable), BorderLayout.CENTER);
-
-		JPanel repositoryControls = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0));
-		repositoryControls.add(refreshRepositories);
-		repositoryControls.add(browseRepository);
-		repositoryControls.add(createRepository);
-		repositoryControls.add(editRepository);
-		repositoryControls.add(delRepository);
-		repositoryControls.add(subscribeRepository);
-
-		JPanel repositoriesPanel = new JPanel(new BorderLayout(margin, margin)) {
+		repositoriesPanel = new RepositoriesPanel(gitblit) {
 
 			private static final long serialVersionUID = 1L;
 
-			public Insets getInsets() {
-				return insets;
+			@Override
+			protected void subscribeFeeds(List<FeedModel> feeds) {
+				GitblitPanel.this.subscribeFeeds(feeds);
 			}
-		};
-		repositoriesHeader = new HeaderPanel(Translation.get("gb.repositories"),
-				"gitweb-favicon.png");
-		repositoriesPanel.add(repositoriesHeader, BorderLayout.NORTH);
-		repositoriesPanel.add(repositoryTablePanel, BorderLayout.CENTER);
-		repositoriesPanel.add(repositoryControls, BorderLayout.SOUTH);
 
+			@Override
+			protected void updateUsersTable() {
+				usersPanel.updateTable(false);
+			}
+			
+			@Override
+			protected void updateTeamsTable() {
+				teamsPanel.updateTable(false);
+			}
+
+		};
 		return repositoriesPanel;
 	}
 
-	private void setRepositoryRenderer(RepositoriesTableModel.Columns col,
-			TableCellRenderer renderer, int maxWidth) {
-		String name = repositoriesTable.getColumnName(col.ordinal());
-		repositoriesTable.getColumn(name).setCellRenderer(renderer);
-		if (maxWidth > 0) {
-			repositoriesTable.getColumn(name).setMinWidth(maxWidth);
-			repositoriesTable.getColumn(name).setMaxWidth(maxWidth);
-		}
-	}
-
 	private JPanel createFeedsPanel() {
-		JButton refreshFeeds = new JButton(Translation.get("gb.refresh"));
-		refreshFeeds.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				refreshFeeds();
-			}
-		});
-
-		final JButton viewCommit = new JButton(Translation.get("gb.view"));
-		viewCommit.setEnabled(false);
-		viewCommit.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				viewCommit();
-			}
-		});
-
-		final JButton viewCommitDiff = new JButton(Translation.get("gb.commitdiff"));
-		viewCommitDiff.setEnabled(false);
-		viewCommitDiff.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				viewCommitDiff();
-			}
-		});
-
-		final JButton viewTree = new JButton(Translation.get("gb.tree"));
-		viewTree.setEnabled(false);
-		viewTree.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				viewTree();
-			}
-		});
-
-		JPanel controls = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0));
-		controls.add(refreshFeeds);
-		controls.add(viewCommit);
-		controls.add(viewCommitDiff);
-		controls.add(viewTree);
-
-		NameRenderer nameRenderer = new NameRenderer();
-		syndicationModel = new SyndicatedEntryTableModel();
-		feedsHeader = new HeaderPanel(Translation.get("gb.recentCommits"), "feed_16x16.png");
-		syndicationEntriesTable = Utils.newTable(syndicationModel, Utils.DATE_FORMAT);
-		String name = syndicationEntriesTable
-				.getColumnName(SyndicatedEntryTableModel.Columns.Author.ordinal());
-		syndicationEntriesTable.setRowHeight(nameRenderer.getFont().getSize() + 8);
-		syndicationEntriesTable.getColumn(name).setCellRenderer(nameRenderer);
-
-		syndicationEntriesTable.addMouseListener(new MouseAdapter() {
-			public void mouseClicked(MouseEvent e) {
-				if (e.getClickCount() == 2) {
-					if (e.isControlDown()) {
-						viewCommitDiff();
-					} else {
-						viewCommit();
-					}
-				}
-			}
-		});
-
-		syndicationEntriesTable.getSelectionModel().addListSelectionListener(
-				new ListSelectionListener() {
-					@Override
-					public void valueChanged(ListSelectionEvent e) {
-						if (e.getValueIsAdjusting()) {
-							return;
-						}
-						boolean singleSelection = syndicationEntriesTable.getSelectedRowCount() == 1;
-						viewCommit.setEnabled(singleSelection);
-						viewCommitDiff.setEnabled(singleSelection);
-						viewTree.setEnabled(singleSelection);
-					}
-				});
-
-		JPanel panel = new JPanel(new BorderLayout(5, 5)) {
-
+		feedsPanel = new FeedsPanel(gitblit) {
 			private static final long serialVersionUID = 1L;
 
 			@Override
-			public Insets getInsets() {
-				return insets;
+			protected void subscribeFeeds(List<FeedModel> feeds) {
+				GitblitPanel.this.subscribeFeeds(feeds);
 			}
 		};
-		panel.add(feedsHeader, BorderLayout.NORTH);
-		panel.add(new JScrollPane(syndicationEntriesTable), BorderLayout.CENTER);
-		panel.add(controls, BorderLayout.SOUTH);
-		return panel;
+		return feedsPanel;
 	}
 
 	private JPanel createUsersPanel() {
-		JButton refreshUsers = new JButton(Translation.get("gb.refresh"));
-		refreshUsers.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				refreshUsers();
-			}
-		});
-
-		JButton createUser = new JButton(Translation.get("gb.create"));
-		createUser.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				createUser();
-			}
-		});
-
-		final JButton editUser = new JButton(Translation.get("gb.edit"));
-		editUser.setEnabled(false);
-		editUser.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				editUser(getSelectedUsers().get(0));
-			}
-		});
-
-		final JButton delUser = new JButton(Translation.get("gb.delete"));
-		delUser.setEnabled(false);
-		delUser.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				deleteUsers(getSelectedUsers());
-			}
-		});
-
-		NameRenderer nameRenderer = new NameRenderer();
-		usersModel = new UsersTableModel();
-		defaultUsersSorter = new TableRowSorter<UsersTableModel>(usersModel);
-		usersTable = Utils.newTable(usersModel, Utils.DATE_FORMAT);
-		String name = usersTable.getColumnName(UsersTableModel.Columns.Name.ordinal());
-		usersTable.setRowHeight(nameRenderer.getFont().getSize() + 8);
-		usersTable.getColumn(name).setCellRenderer(nameRenderer);
-		usersTable.setRowSorter(defaultUsersSorter);
-		usersTable.getRowSorter().toggleSortOrder(UsersTableModel.Columns.Name.ordinal());
-		usersTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
-
-			@Override
-			public void valueChanged(ListSelectionEvent e) {
-				if (e.getValueIsAdjusting()) {
-					return;
-				}
-				boolean selected = usersTable.getSelectedRow() > -1;
-				boolean singleSelection = usersTable.getSelectedRows().length == 1;
-				editUser.setEnabled(singleSelection && selected);
-				delUser.setEnabled(selected);
-			}
-		});
-
-		usersTable.addMouseListener(new MouseAdapter() {
-			public void mouseClicked(MouseEvent e) {
-				if (e.getClickCount() == 2) {
-					editUser(getSelectedUsers().get(0));
-				}
-			}
-		});
-
-		final JTextField userFilter = new JTextField();
-		userFilter.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				filterUsers(userFilter.getText());
-			}
-		});
-		userFilter.addKeyListener(new KeyAdapter() {
-			public void keyReleased(KeyEvent e) {
-				filterUsers(userFilter.getText());
-			}
-		});
-
-		JPanel userFilterPanel = new JPanel(new BorderLayout(margin, margin));
-		userFilterPanel.add(new JLabel(Translation.get("gb.filter")), BorderLayout.WEST);
-		userFilterPanel.add(userFilter, BorderLayout.CENTER);
-
-		JPanel userTablePanel = new JPanel(new BorderLayout(margin, margin));
-		userTablePanel.add(userFilterPanel, BorderLayout.NORTH);
-		userTablePanel.add(new JScrollPane(usersTable), BorderLayout.CENTER);
-
-		JPanel userControls = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0));
-		userControls.add(refreshUsers);
-		userControls.add(createUser);
-		userControls.add(editUser);
-		userControls.add(delUser);
-
-		JPanel usersPanel = new JPanel(new BorderLayout(margin, margin)) {
-
+		usersPanel = new UsersPanel(gitblit) {
+			
 			private static final long serialVersionUID = 1L;
-
-			public Insets getInsets() {
-				return insets;
+			
+			@Override
+			protected void updateTeamsTable() {
+				teamsPanel.updateTable(false);
 			}
 		};
-		usersHeader = new HeaderPanel(Translation.get("gb.users"), "user_16x16.png");
-		usersPanel.add(usersHeader, BorderLayout.NORTH);
-		usersPanel.add(userTablePanel, BorderLayout.CENTER);
-		usersPanel.add(userControls, BorderLayout.SOUTH);
-
 		return usersPanel;
 	}
-
-	private JPanel createSettingsPanel() {
-		JButton refreshSettings = new JButton(Translation.get("gb.refresh"));
-		refreshSettings.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				refreshSettings();
-			}
-		});
-
-		final JButton editSetting = new JButton(Translation.get("gb.edit"));
-		editSetting.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				int viewRow = settingsTable.getSelectedRow();
-				int modelRow = settingsTable.convertRowIndexToModel(viewRow);
-				String key = settingsModel.keys.get(modelRow);
-				SettingModel setting = settingsModel.settings.get(key);
-				editSetting(setting);
-			}
-		});
-
-		NameRenderer nameRenderer = new NameRenderer();
-		final SettingPanel settingPanel = new SettingPanel();
-		settingsModel = new SettingsTableModel();
-		defaultSettingsSorter = new TableRowSorter<SettingsTableModel>(settingsModel);
-		settingsTable = Utils.newTable(settingsModel, Utils.DATE_FORMAT);
-		settingsTable.setDefaultRenderer(SettingModel.class, new SettingCellRenderer());
-		String name = settingsTable.getColumnName(UsersTableModel.Columns.Name.ordinal());
-		settingsTable.setRowHeight(nameRenderer.getFont().getSize() + 8);
-		settingsTable.getColumn(name).setCellRenderer(nameRenderer);
-		settingsTable.setRowSorter(defaultSettingsSorter);
-		settingsTable.getRowSorter().toggleSortOrder(SettingsTableModel.Columns.Name.ordinal());
-		settingsTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
-
-			@Override
-			public void valueChanged(ListSelectionEvent e) {
-				if (e.getValueIsAdjusting()) {
-					return;
-				}
-				boolean singleSelection = settingsTable.getSelectedRows().length == 1;
-				editSetting.setEnabled(singleSelection);
-				if (singleSelection) {
-					int viewRow = settingsTable.getSelectedRow();
-					int modelRow = settingsTable.convertRowIndexToModel(viewRow);
-					SettingModel setting = settingsModel.get(modelRow);
-					settingPanel.setSetting(setting);
-				} else {
-					settingPanel.clear();
-				}
-			}
-		});
-
-		final JTextField settingFilter = new JTextField();
-		settingFilter.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				filterSettings(settingFilter.getText());
-			}
-		});
-		settingFilter.addKeyListener(new KeyAdapter() {
-			public void keyReleased(KeyEvent e) {
-				filterSettings(settingFilter.getText());
-			}
-		});
-
-		JPanel settingFilterPanel = new JPanel(new BorderLayout(margin, margin));
-		settingFilterPanel.add(new JLabel(Translation.get("gb.filter")), BorderLayout.WEST);
-		settingFilterPanel.add(settingFilter, BorderLayout.CENTER);
-
-		JPanel settingsTablePanel = new JPanel(new BorderLayout(margin, margin));
-		settingsTablePanel.add(settingFilterPanel, BorderLayout.NORTH);
-		settingsTablePanel.add(new JScrollPane(settingsTable), BorderLayout.CENTER);
-		settingsTablePanel.add(settingPanel, BorderLayout.SOUTH);
-
-		JPanel settingsControls = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0));
-		settingsControls.add(refreshSettings);
-		settingsControls.add(editSetting);
-
-		JPanel settingsPanel = new JPanel(new BorderLayout(margin, margin)) {
-
+	
+	private JPanel createTeamsPanel() {
+		teamsPanel = new TeamsPanel(gitblit) {
+			
 			private static final long serialVersionUID = 1L;
 
-			public Insets getInsets() {
-				return insets;
+			@Override
+			protected void updateUsersTable() {
+				usersPanel.updateTable(false);
 			}
 		};
-		settingsHeader = new HeaderPanel(Translation.get("gb.settings"), "settings_16x16.png");
-		settingsPanel.add(settingsHeader, BorderLayout.NORTH);
-		settingsPanel.add(settingsTablePanel, BorderLayout.CENTER);
-		settingsPanel.add(settingsControls, BorderLayout.SOUTH);
+		return teamsPanel;
+	}	
 
+	private JPanel createSettingsPanel() {
+		settingsPanel = new SettingsPanel(gitblit);
 		return settingsPanel;
 	}
 
 	private JPanel createStatusPanel() {
-		JButton refreshStatus = new JButton(Translation.get("gb.refresh"));
-		refreshStatus.addActionListener(new ActionListener() {
-			public void actionPerformed(ActionEvent e) {
-				refreshStatus();
-			}
-		});
-
-		JPanel controls = new JPanel();
-		controls.add(refreshStatus);
-
-		JPanel panel = new JPanel(new BorderLayout());
-		statusPanel = new StatusPanel();
-		panel.add(statusPanel, BorderLayout.CENTER);
-		panel.add(controls, BorderLayout.SOUTH);
-		return panel;
+		statusPanel = new StatusPanel(gitblit);
+		return statusPanel;
 	}
 
 	public void login() throws IOException {
 		gitblit.login();
 
-		updateRepositoriesTable();
-		Utils.packColumns(repositoriesTable, 5);
-
-		updateFeedsTable();
-		Utils.packColumns(syndicationEntriesTable, 5);
+		repositoriesPanel.updateTable(true);
+		feedsPanel.updateTable(true);
 
 		if (gitblit.allowManagement()) {
-			updateUsersTable();
+			if (gitblit.getProtocolVersion() >= 2) {
+				// refresh teams panel
+				teamsPanel.updateTable(false);
+			} else {
+				// remove teams panel
+				String teams = Translation.get("gb.teams");
+				for (int i = 0; i < tabs.getTabCount(); i++) {
+					if (teams.equals(tabs.getTitleAt(i))) {
+						tabs.removeTabAt(i);
+						break;
+					}
+				}
+			}
+			usersPanel.updateTable(false);
 		} else {
 			// user does not have administrator privileges
 			// hide admin repository buttons
-			createRepository.setVisible(false);
-			editRepository.setVisible(false);
-			delRepository.setVisible(false);
+			repositoriesPanel.disableManagement();
 
-			while (tabs.getTabCount() > 1) {
+			while (tabs.getTabCount() > 2) {
 				// remove all management/administration tabs
-				tabs.removeTabAt(1);
+				tabs.removeTabAt(2);
 			}
 		}
 
 		if (gitblit.allowAdministration()) {
-			updateSettingsTable();
-			updateStatusPanel();
-			Utils.packColumns(settingsTable, 5);
+			settingsPanel.updateTable(true);
+			statusPanel.updateTable(false);
 		} else {
-			// remove the settings tab
+			// remove the settings and status tab
 			String[] titles = { Translation.get("gb.settings"), Translation.get("gb.status") };
 			for (String title : titles) {
 				for (int i = 0; i < tabs.getTabCount(); i++) {
@@ -644,124 +199,9 @@
 		}
 	}
 
-	private void updateRepositoriesTable() {
-		repositoriesModel.list.clear();
-		repositoriesModel.list.addAll(gitblit.getRepositories());
-		repositoriesModel.fireTableDataChanged();
-		repositoriesHeader.setText(Translation.get("gb.repositories") + " ("
-				+ gitblit.getRepositories().size() + ")");
-	}
-
-	private void updateFeedsTable() {
-		syndicationModel.entries.clear();
-		syndicationModel.entries.addAll(gitblit.getSyndicatedEntries());
-		syndicationModel.fireTableDataChanged();
-		feedsHeader.setText(Translation.get("gb.recentCommits") + " ("
-				+ gitblit.getSyndicatedEntries().size() + ")");
-	}
-
-	private void updateUsersTable() {
-		usersModel.list.clear();
-		usersModel.list.addAll(gitblit.getUsers());
-		usersModel.fireTableDataChanged();
-		usersHeader.setText(Translation.get("gb.users") + " (" + gitblit.getUsers().size() + ")");
-	}
-
-	private void updateSettingsTable() {
-		settingsModel.setSettings(gitblit.getSettings());
-		settingsModel.fireTableDataChanged();
-		settingsHeader.setText(Translation.get("gb.settings"));
-	}
-
-	private void updateStatusPanel() {
-		statusPanel.setStatus(gitblit.url, gitblit.getStatus());
-	}
-
-	private void filterRepositories(final String fragment) {
-		if (StringUtils.isEmpty(fragment)) {
-			repositoriesTable.setRowSorter(defaultRepositoriesSorter);
-			return;
-		}
-		RowFilter<RepositoriesTableModel, Object> containsFilter = new RowFilter<RepositoriesTableModel, Object>() {
-			public boolean include(Entry<? extends RepositoriesTableModel, ? extends Object> entry) {
-				for (int i = entry.getValueCount() - 1; i >= 0; i--) {
-					if (entry.getStringValue(i).toLowerCase().contains(fragment.toLowerCase())) {
-						return true;
-					}
-				}
-				return false;
-			}
-		};
-		TableRowSorter<RepositoriesTableModel> sorter = new TableRowSorter<RepositoriesTableModel>(
-				repositoriesModel);
-		sorter.setRowFilter(containsFilter);
-		repositoriesTable.setRowSorter(sorter);
-	}
-
-	private void filterUsers(final String fragment) {
-		if (StringUtils.isEmpty(fragment)) {
-			usersTable.setRowSorter(defaultUsersSorter);
-			return;
-		}
-		RowFilter<UsersTableModel, Object> containsFilter = new RowFilter<UsersTableModel, Object>() {
-			public boolean include(Entry<? extends UsersTableModel, ? extends Object> entry) {
-				for (int i = entry.getValueCount() - 1; i >= 0; i--) {
-					if (entry.getStringValue(i).toLowerCase().contains(fragment.toLowerCase())) {
-						return true;
-					}
-				}
-				return false;
-			}
-		};
-		TableRowSorter<UsersTableModel> sorter = new TableRowSorter<UsersTableModel>(usersModel);
-		sorter.setRowFilter(containsFilter);
-		usersTable.setRowSorter(sorter);
-	}
-
-	private void filterSettings(final String fragment) {
-		if (StringUtils.isEmpty(fragment)) {
-			settingsTable.setRowSorter(defaultSettingsSorter);
-			return;
-		}
-		RowFilter<SettingsTableModel, Object> containsFilter = new RowFilter<SettingsTableModel, Object>() {
-			public boolean include(Entry<? extends SettingsTableModel, ? extends Object> entry) {
-				for (int i = entry.getValueCount() - 1; i >= 0; i--) {
-					if (entry.getStringValue(i).toLowerCase().contains(fragment.toLowerCase())) {
-						return true;
-					}
-				}
-				return false;
-			}
-		};
-		TableRowSorter<SettingsTableModel> sorter = new TableRowSorter<SettingsTableModel>(
-				settingsModel);
-		sorter.setRowFilter(containsFilter);
-		settingsTable.setRowSorter(sorter);
-	}
-
-	private List<RepositoryModel> getSelectedRepositories() {
-		List<RepositoryModel> repositories = new ArrayList<RepositoryModel>();
-		for (int viewRow : repositoriesTable.getSelectedRows()) {
-			int modelRow = repositoriesTable.convertRowIndexToModel(viewRow);
-			RepositoryModel model = repositoriesModel.list.get(modelRow);
-			repositories.add(model);
-		}
-		return repositories;
-	}
-
-	private List<UserModel> getSelectedUsers() {
-		List<UserModel> users = new ArrayList<UserModel>();
-		for (int viewRow : usersTable.getSelectedRows()) {
-			int modelRow = usersTable.convertRowIndexToModel(viewRow);
-			UserModel model = usersModel.list.get(modelRow);
-			users.add(model);
-		}
-		return users;
-	}
-
 	@Override
 	public Insets getInsets() {
-		return insets;
+		return Utils.INSETS;
 	}
 
 	@Override
@@ -769,455 +209,20 @@
 		gitblit = null;
 	}
 
-	protected void refreshRepositories() {
-		GitblitWorker worker = new GitblitWorker(GitblitPanel.this, RpcRequest.LIST_REPOSITORIES) {
-			@Override
-			protected Boolean doRequest() throws IOException {
-				gitblit.refreshRepositories();
-				return true;
-			}
+	protected void subscribeFeeds(final List<FeedModel> feeds) {
+		SubscriptionsDialog dialog = new SubscriptionsDialog(feeds) {
+
+			private static final long serialVersionUID = 1L;
 
 			@Override
-			protected void onSuccess() {
-				updateRepositoriesTable();
+			public void save() {
+				gitblit.updateSubscribedFeeds(feeds);
+				listener.saveRegistration(gitblit.reg.name, gitblit.reg);
+				setVisible(false);
+				repositoriesPanel.updateTable(false);
 			}
 		};
-		worker.execute();
-	}
-
-	/**
-	 * Displays the create repository dialog and fires a SwingWorker to update
-	 * the server, if appropriate.
-	 * 
-	 */
-	protected void createRepository() {
-		EditRepositoryDialog dialog = new EditRepositoryDialog();
 		dialog.setLocationRelativeTo(GitblitPanel.this);
-		dialog.setUsers(null, gitblit.getUsernames(), null);
-		dialog.setRepositories(gitblit.getRepositories());
-		dialog.setFederationSets(gitblit.getFederationSets(), null);
 		dialog.setVisible(true);
-		final RepositoryModel newRepository = dialog.getRepository();
-		final List<String> permittedUsers = dialog.getPermittedUsers();
-		if (newRepository == null) {
-			return;
-		}
-
-		GitblitWorker worker = new GitblitWorker(this, RpcRequest.CREATE_REPOSITORY) {
-
-			@Override
-			protected Boolean doRequest() throws IOException {
-				boolean success = gitblit.createRepository(newRepository, permittedUsers);
-				if (success) {
-					gitblit.refreshRepositories();
-					if (permittedUsers.size() > 0) {
-						gitblit.refreshUsers();
-					}
-				}
-				return success;
-			}
-
-			@Override
-			protected void onSuccess() {
-				updateRepositoriesTable();
-				updateUsersTable();
-			}
-
-			@Override
-			protected void onFailure() {
-				showFailure("Failed to execute request \"{0}\" for repository \"{1}\".",
-						getRequestType(), newRepository.name);
-			}
-		};
-		worker.execute();
-	}
-
-	/**
-	 * Displays the edit repository dialog and fires a SwingWorker to update the
-	 * server, if appropriate.
-	 * 
-	 * @param repository
-	 */
-	protected void editRepository(final RepositoryModel repository) {
-		EditRepositoryDialog dialog = new EditRepositoryDialog(repository);
-		dialog.setLocationRelativeTo(GitblitPanel.this);
-		List<String> usernames = gitblit.getUsernames();
-		List<String> members = gitblit.getPermittedUsernames(repository);
-		dialog.setUsers(repository.owner, usernames, members);
-		dialog.setRepositories(gitblit.getRepositories());
-		dialog.setFederationSets(gitblit.getFederationSets(), repository.federationSets);
-		dialog.setVisible(true);
-		final RepositoryModel revisedRepository = dialog.getRepository();
-		final List<String> permittedUsers = dialog.getPermittedUsers();
-		if (revisedRepository == null) {
-			return;
-		}
-
-		GitblitWorker worker = new GitblitWorker(this, RpcRequest.EDIT_REPOSITORY) {
-
-			@Override
-			protected Boolean doRequest() throws IOException {
-				boolean success = gitblit.updateRepository(repository.name, revisedRepository,
-						permittedUsers);
-				if (success) {
-					gitblit.refreshRepositories();
-					gitblit.refreshUsers();
-				}
-				return success;
-			}
-
-			@Override
-			protected void onSuccess() {
-				updateRepositoriesTable();
-				updateUsersTable();
-			}
-
-			@Override
-			protected void onFailure() {
-				showFailure("Failed to execute request \"{0}\" for repository \"{1}\".",
-						getRequestType(), repository.name);
-			}
-		};
-		worker.execute();
-	}
-
-	protected void deleteRepositories(final List<RepositoryModel> repositories) {
-		if (repositories == null || repositories.size() == 0) {
-			return;
-		}
-		StringBuilder message = new StringBuilder("Delete the following repositories?\n\n");
-		for (RepositoryModel repository : repositories) {
-			message.append(repository.name).append("\n");
-		}
-		int result = JOptionPane.showConfirmDialog(GitblitPanel.this, message.toString(),
-				"Delete Repositories?", JOptionPane.YES_NO_OPTION);
-		if (result == JOptionPane.YES_OPTION) {
-			GitblitWorker worker = new GitblitWorker(this, RpcRequest.DELETE_REPOSITORY) {
-				@Override
-				protected Boolean doRequest() throws IOException {
-					boolean success = true;
-					for (RepositoryModel repository : repositories) {
-						success &= gitblit.deleteRepository(repository);
-					}
-					if (success) {
-						gitblit.refreshRepositories();
-						gitblit.refreshUsers();
-					}
-					return success;
-				}
-
-				@Override
-				protected void onSuccess() {
-					updateRepositoriesTable();
-					updateUsersTable();
-				}
-
-				@Override
-				protected void onFailure() {
-					showFailure("Failed to delete specified repositories!");
-				}
-			};
-			worker.execute();
-		}
-	}
-
-	protected void subscribeRepository(final RepositoryModel repository) {
-		if (repository == null) {
-			return;
-		}
-		// TODO this is lame. need better ui.
-		if (gitblit.isSubscribed(repository, null)) {
-			// unsubscribe
-			String msg = MessageFormat.format("Do you want to unsubscribe from {0}?",
-					repository.name);
-			String[] options = { "no", "yes" };
-			int result = JOptionPane.showOptionDialog(GitblitPanel.this, msg, "Unsubscribe?",
-					JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options,
-					options[0]);
-			if (result == 1) {
-				if (gitblit.unsubscribe(repository, null)) {
-					updateFeedsTable();
-					updateRepositoriesTable();
-					listener.saveRegistration(repository.name, gitblit.reg);
-				}
-			}
-		} else {
-			// subscribe
-			String msg = MessageFormat.format("Do you want to subscribe to {0}?", repository.name);
-			String[] options = { "no", "yes" };
-			int result = JOptionPane.showOptionDialog(GitblitPanel.this, msg, "Subscribe?",
-					JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options,
-					options[0]);
-			if (result == 1) {
-				if (gitblit.subscribe(repository, null)) {
-					updateRepositoriesTable();
-					listener.saveRegistration(repository.name, gitblit.reg);
-				}
-			}
-		}
-	}
-
-	protected void refreshFeeds() {
-		// TODO change request type here
-		GitblitWorker worker = new GitblitWorker(GitblitPanel.this, RpcRequest.LIST_USERS) {
-			@Override
-			protected Boolean doRequest() throws IOException {
-				gitblit.refreshSubscribedFeeds();
-				return true;
-			}
-
-			@Override
-			protected void onSuccess() {
-				updateFeedsTable();
-			}
-		};
-		worker.execute();
-	}
-
-	protected SyndicatedEntryModel getSelectedSyndicatedEntry() {
-		int viewRow = syndicationEntriesTable.getSelectedRow();
-		int modelRow = syndicationEntriesTable.convertRowIndexToModel(viewRow);
-		SyndicatedEntryModel entry = syndicationModel.get(modelRow);
-		return entry;
-	}
-
-	protected void viewCommit() {
-		SyndicatedEntryModel entry = getSelectedSyndicatedEntry();
-		browse(entry.link);
-	}
-
-	protected void viewCommitDiff() {
-		SyndicatedEntryModel entry = getSelectedSyndicatedEntry();
-		browse(entry.link.replace("/commit/", "/commitdiff/"));
-	}
-
-	protected void viewTree() {
-		SyndicatedEntryModel entry = getSelectedSyndicatedEntry();
-		browse(entry.link.replace("/commit/", "/tree/"));
-	}
-
-	protected void browse(String url) {
-		try {
-			Desktop.getDesktop().browse(new URI(url));
-		} catch (Exception x) {
-			x.printStackTrace();
-		}
-	}
-
-	protected void refreshUsers() {
-		GitblitWorker worker = new GitblitWorker(GitblitPanel.this, RpcRequest.LIST_USERS) {
-			@Override
-			protected Boolean doRequest() throws IOException {
-				gitblit.refreshUsers();
-				return true;
-			}
-
-			@Override
-			protected void onSuccess() {
-				updateUsersTable();
-			}
-		};
-		worker.execute();
-	}
-
-	/**
-	 * Displays the create user dialog and fires a SwingWorker to update the
-	 * server, if appropriate.
-	 * 
-	 */
-	protected void createUser() {
-		EditUserDialog dialog = new EditUserDialog(gitblit.getSettings());
-		dialog.setLocationRelativeTo(GitblitPanel.this);
-		dialog.setUsers(gitblit.getUsers());
-		dialog.setRepositories(gitblit.getRepositories(), null);
-		dialog.setVisible(true);
-		final UserModel newUser = dialog.getUser();
-		if (newUser == null) {
-			return;
-		}
-
-		GitblitWorker worker = new GitblitWorker(this, RpcRequest.CREATE_USER) {
-
-			@Override
-			protected Boolean doRequest() throws IOException {
-				boolean success = gitblit.createUser(newUser);
-				if (success) {
-					gitblit.refreshUsers();
-				}
-				return success;
-			}
-
-			@Override
-			protected void onSuccess() {
-				updateUsersTable();
-			}
-
-			@Override
-			protected void onFailure() {
-				showFailure("Failed to execute request \"{0}\" for user \"{1}\".",
-						getRequestType(), newUser.username);
-			}
-		};
-		worker.execute();
-	}
-
-	/**
-	 * Displays the edit user dialog and fires a SwingWorker to update the
-	 * server, if appropriate.
-	 * 
-	 * @param user
-	 */
-	protected void editUser(final UserModel user) {
-		EditUserDialog dialog = new EditUserDialog(user, gitblit.getSettings());
-		dialog.setLocationRelativeTo(GitblitPanel.this);
-		dialog.setUsers(gitblit.getUsers());
-		dialog.setRepositories(gitblit.getRepositories(), new ArrayList<String>(user.repositories));
-		dialog.setVisible(true);
-		final UserModel revisedUser = dialog.getUser();
-		if (revisedUser == null) {
-			return;
-		}
-
-		GitblitWorker worker = new GitblitWorker(this, RpcRequest.EDIT_USER) {
-			@Override
-			protected Boolean doRequest() throws IOException {
-				boolean success = gitblit.updateUser(user.username, revisedUser);
-				if (success) {
-					gitblit.refreshUsers();
-				}
-				return success;
-			}
-
-			@Override
-			protected void onSuccess() {
-				updateUsersTable();
-			}
-
-			@Override
-			protected void onFailure() {
-				showFailure("Failed to execute request \"{0}\" for user \"{1}\".",
-						getRequestType(), user.username);
-			}
-		};
-		worker.execute();
-	}
-
-	protected void deleteUsers(final List<UserModel> users) {
-		if (users == null || users.size() == 0) {
-			return;
-		}
-		StringBuilder message = new StringBuilder("Delete the following users?\n\n");
-		for (UserModel user : users) {
-			message.append(user.username).append("\n");
-		}
-		int result = JOptionPane.showConfirmDialog(GitblitPanel.this, message.toString(),
-				"Delete Users?", JOptionPane.YES_NO_OPTION);
-		if (result == JOptionPane.YES_OPTION) {
-			GitblitWorker worker = new GitblitWorker(this, RpcRequest.DELETE_USER) {
-				@Override
-				protected Boolean doRequest() throws IOException {
-					boolean success = true;
-					for (UserModel user : users) {
-						success &= gitblit.deleteUser(user);
-					}
-					if (success) {
-						gitblit.refreshUsers();
-					}
-					return success;
-				}
-
-				@Override
-				protected void onSuccess() {
-					updateUsersTable();
-				}
-
-				@Override
-				protected void onFailure() {
-					showFailure("Failed to delete specified users!");
-				}
-			};
-			worker.execute();
-		}
-	}
-
-	protected void refreshSettings() {
-		GitblitWorker worker = new GitblitWorker(GitblitPanel.this, RpcRequest.LIST_SETTINGS) {
-			@Override
-			protected Boolean doRequest() throws IOException {
-				gitblit.refreshSettings();
-				return true;
-			}
-
-			@Override
-			protected void onSuccess() {
-				updateSettingsTable();
-			}
-		};
-		worker.execute();
-	}
-
-	protected void refreshStatus() {
-		GitblitWorker worker = new GitblitWorker(GitblitPanel.this, RpcRequest.LIST_STATUS) {
-			@Override
-			protected Boolean doRequest() throws IOException {
-				gitblit.refreshStatus();
-				return true;
-			}
-
-			@Override
-			protected void onSuccess() {
-				updateStatusPanel();
-			}
-		};
-		worker.execute();
-	}
-
-	protected void editSetting(final SettingModel settingModel) {
-		final JTextField textField = new JTextField(settingModel.currentValue);
-		JPanel editPanel = new JPanel(new GridLayout(0, 1));
-		editPanel.add(new JLabel("New Value"));
-		editPanel.add(textField);
-
-		JPanel settingPanel = new JPanel(new BorderLayout());
-		settingPanel.add(new SettingPanel(settingModel), BorderLayout.CENTER);
-		settingPanel.add(editPanel, BorderLayout.SOUTH);
-		settingPanel.setPreferredSize(new Dimension(800, 200));
-
-		String[] options;
-		if (settingModel.currentValue.equals(settingModel.defaultValue)) {
-			options = new String[] { Translation.get("gb.cancel"), Translation.get("gb.save") };
-		} else {
-			options = new String[] { Translation.get("gb.cancel"),
-					Translation.get("gb.setDefault"), Translation.get("gb.save") };
-		}
-		String defaultOption = options[0];
-		int selection = JOptionPane.showOptionDialog(GitblitPanel.this, settingPanel,
-				settingModel.name, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE,
-				new ImageIcon(getClass().getResource("/settings_16x16.png")), options,
-				defaultOption);
-		if (selection <= 0) {
-			return;
-		}
-		if (options[selection].equals(Translation.get("gb.setDefault"))) {
-			textField.setText(settingModel.defaultValue);
-		}
-		final Map<String, String> newSettings = new HashMap<String, String>();
-		newSettings.put(settingModel.name, textField.getText().trim());
-		GitblitWorker worker = new GitblitWorker(GitblitPanel.this, RpcRequest.EDIT_SETTINGS) {
-			@Override
-			protected Boolean doRequest() throws IOException {
-				boolean success = gitblit.updateSettings(newSettings);
-				if (success) {
-					gitblit.refreshSettings();
-				}
-				return success;
-			}
-
-			@Override
-			protected void onSuccess() {
-				updateSettingsTable();
-			}
-		};
-		worker.execute();
 	}
 }
\ No newline at end of file

--
Gitblit v1.9.1