@@ -0,0 +1,44 @@ | |||
/* | |||
* Copyright 2011 gitblit.com. | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
package com.gitblit.client; | |||
import java.awt.Component; | |||
import java.text.SimpleDateFormat; | |||
import java.util.Date; | |||
import javax.swing.JTable; | |||
import javax.swing.table.DefaultTableCellRenderer; | |||
public class DateCellRenderer extends DefaultTableCellRenderer { | |||
private static final long serialVersionUID = 1L; | |||
private final String pattern; | |||
public DateCellRenderer(String pattern) { | |||
this.pattern = (pattern == null ? "yyyy-MM-dd HH:mm" : pattern); | |||
} | |||
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, | |||
boolean hasFocus, int row, int column) { | |||
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); | |||
if (value instanceof Date) { | |||
String strDate = new SimpleDateFormat(pattern).format((Date) value); | |||
this.setText(strDate); | |||
} | |||
return this; | |||
} | |||
} |
@@ -0,0 +1,103 @@ | |||
/* | |||
* Copyright 2011 gitblit.com. | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
package com.gitblit.client; | |||
import java.awt.BorderLayout; | |||
import java.awt.EventQueue; | |||
import java.awt.Menu; | |||
import java.awt.MenuBar; | |||
import java.awt.MenuItem; | |||
import java.awt.MenuShortcut; | |||
import java.awt.event.ActionEvent; | |||
import java.awt.event.ActionListener; | |||
import java.awt.event.KeyEvent; | |||
import java.io.IOException; | |||
import javax.swing.JFrame; | |||
import javax.swing.JOptionPane; | |||
import javax.swing.JPanel; | |||
import javax.swing.JTabbedPane; | |||
import com.gitblit.Constants; | |||
import com.gitblit.utils.StringUtils; | |||
public class GitblitClient extends JFrame { | |||
private static final long serialVersionUID = 1L; | |||
private JTabbedPane serverTabs; | |||
private GitblitClient() { | |||
super(); | |||
} | |||
private void initialize() { | |||
setupMenu(); | |||
setContentPane(getCenterPanel()); | |||
setTitle("Gitblit Client v" + Constants.VERSION + " (" + Constants.VERSION_DATE + ")"); | |||
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | |||
setSize(800, 600); | |||
setLocationRelativeTo(null); | |||
} | |||
private void setupMenu() { | |||
MenuBar menuBar = new MenuBar(); | |||
setMenuBar(menuBar); | |||
Menu serversMenu = new Menu("Servers"); | |||
menuBar.add(serversMenu); | |||
MenuItem login = new MenuItem("Login...", new MenuShortcut(KeyEvent.VK_L, false)); | |||
login.addActionListener(new ActionListener() { | |||
public void actionPerformed(ActionEvent event) { | |||
String url = JOptionPane.showInputDialog(GitblitClient.this, | |||
"Please enter Gitblit server URL", "https://localhost:8443"); | |||
if (StringUtils.isEmpty(url)) { | |||
return; | |||
} | |||
login(url, "admin", "admin".toCharArray()); | |||
} | |||
}); | |||
serversMenu.add(login); | |||
} | |||
private JPanel getCenterPanel() { | |||
serverTabs = new JTabbedPane(JTabbedPane.TOP); | |||
JPanel panel = new JPanel(new BorderLayout()); | |||
panel.add(serverTabs, BorderLayout.CENTER); | |||
return panel; | |||
} | |||
private void login(String url, String account, char[] password) { | |||
try { | |||
GitblitPanel panel = new GitblitPanel(url, account, password); | |||
panel.login(); | |||
serverTabs.addTab(url.substring(url.indexOf("//") + 2), panel); | |||
serverTabs.setSelectedIndex(serverTabs.getTabCount() - 1); | |||
} catch (IOException e) { | |||
JOptionPane.showMessageDialog(GitblitClient.this, e.getMessage(), "Error", | |||
JOptionPane.ERROR_MESSAGE); | |||
} | |||
} | |||
public static void main(String[] args) { | |||
EventQueue.invokeLater(new Runnable() { | |||
public void run() { | |||
GitblitClient frame = new GitblitClient(); | |||
frame.initialize(); | |||
frame.setVisible(true); | |||
} | |||
}); | |||
} | |||
} |
@@ -0,0 +1,112 @@ | |||
/* | |||
* Copyright 2011 gitblit.com. | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
package com.gitblit.client; | |||
import java.awt.BorderLayout; | |||
import java.awt.Component; | |||
import java.io.IOException; | |||
import java.util.Date; | |||
import java.util.Map; | |||
import javax.swing.JPanel; | |||
import javax.swing.JScrollPane; | |||
import javax.swing.JTabbedPane; | |||
import javax.swing.JTable; | |||
import javax.swing.table.DefaultTableColumnModel; | |||
import javax.swing.table.TableCellRenderer; | |||
import javax.swing.table.TableColumn; | |||
import com.gitblit.models.RepositoryModel; | |||
import com.gitblit.utils.RpcUtils; | |||
public class GitblitPanel extends JPanel { | |||
private static final long serialVersionUID = 1L; | |||
String url; | |||
String account; | |||
char[] password; | |||
JTabbedPane tabs; | |||
private JTable repositoriesTable; | |||
public GitblitPanel(String url, String account, char[] password) { | |||
this.url = url; | |||
this.account = account; | |||
this.password = password; | |||
tabs = new JTabbedPane(JTabbedPane.TOP); | |||
repositoriesTable = new JTable(); | |||
repositoriesTable.setDefaultRenderer(Date.class, new DateCellRenderer(null)); | |||
tabs.addTab("Repositories", new JScrollPane(repositoriesTable)); | |||
setLayout(new BorderLayout()); | |||
add(tabs, BorderLayout.CENTER); | |||
} | |||
public void login() throws IOException { | |||
refreshRepositoriesTable(); | |||
} | |||
private void refreshRepositoriesTable() throws IOException { | |||
Map<String, RepositoryModel> repositories = RpcUtils | |||
.getRepositories(url, account, password); | |||
repositoriesTable.setModel(new RepositoriesModel(repositories)); | |||
packColumns(repositoriesTable, 2); | |||
} | |||
private void packColumns(JTable table, int margin) { | |||
for (int c = 0; c < table.getColumnCount(); c++) { | |||
packColumn(table, c, 4); | |||
} | |||
} | |||
// Sets the preferred width of the visible column specified by vColIndex. | |||
// The column will be just wide enough to show the column head and the | |||
// widest cell in the column. margin pixels are added to the left and right | |||
// (resulting in an additional width of 2*margin pixels). | |||
private void packColumn(JTable table, int vColIndex, int margin) { | |||
DefaultTableColumnModel colModel = (DefaultTableColumnModel) table.getColumnModel(); | |||
TableColumn col = colModel.getColumn(vColIndex); | |||
int width = 0; | |||
// Get width of column header | |||
TableCellRenderer renderer = col.getHeaderRenderer(); | |||
if (renderer == null) { | |||
renderer = table.getTableHeader().getDefaultRenderer(); | |||
} | |||
Component comp = renderer.getTableCellRendererComponent(table, col.getHeaderValue(), false, | |||
false, 0, 0); | |||
width = comp.getPreferredSize().width; | |||
// Get maximum width of column data | |||
for (int r = 0; r < table.getRowCount(); r++) { | |||
renderer = table.getCellRenderer(r, vColIndex); | |||
comp = renderer.getTableCellRendererComponent(table, table.getValueAt(r, vColIndex), | |||
false, false, r, vColIndex); | |||
width = Math.max(width, comp.getPreferredSize().width); | |||
} | |||
// Add margin | |||
width += 2 * margin; | |||
// Set the width | |||
col.setPreferredWidth(width); | |||
} | |||
} |
@@ -0,0 +1,101 @@ | |||
/* | |||
* Copyright 2011 gitblit.com. | |||
* | |||
* Licensed under the Apache License, Version 2.0 (the "License"); | |||
* you may not use this file except in compliance with the License. | |||
* You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
package com.gitblit.client; | |||
import java.util.ArrayList; | |||
import java.util.Collections; | |||
import java.util.Date; | |||
import java.util.List; | |||
import java.util.Map; | |||
import javax.swing.table.AbstractTableModel; | |||
import com.gitblit.models.RepositoryModel; | |||
public class RepositoriesModel extends AbstractTableModel { | |||
private static final long serialVersionUID = 1L; | |||
Map<String, RepositoryModel> repositories; | |||
List<RepositoryModel> list; | |||
enum Columns { | |||
Name, Description, Owner, Last_Change, Size; | |||
@Override | |||
public String toString() { | |||
return name().replace('_', ' '); | |||
} | |||
} | |||
public RepositoriesModel(Map<String, RepositoryModel> repositories) { | |||
this.repositories = repositories; | |||
list = new ArrayList<RepositoryModel>(repositories.values()); | |||
Collections.sort(list); | |||
} | |||
@Override | |||
public int getRowCount() { | |||
return repositories.size(); | |||
} | |||
@Override | |||
public int getColumnCount() { | |||
return Columns.values().length; | |||
} | |||
@Override | |||
public String getColumnName(int column) { | |||
Columns col = Columns.values()[column]; | |||
return col.toString(); | |||
} | |||
/** | |||
* Returns <code>Object.class</code> regardless of <code>columnIndex</code>. | |||
* | |||
* @param columnIndex | |||
* the column being queried | |||
* @return the Object.class | |||
*/ | |||
public Class<?> getColumnClass(int columnIndex) { | |||
Columns col = Columns.values()[columnIndex]; | |||
switch (col) { | |||
case Last_Change: | |||
return Date.class; | |||
} | |||
return String.class; | |||
} | |||
@Override | |||
public Object getValueAt(int rowIndex, int columnIndex) { | |||
RepositoryModel model = list.get(rowIndex); | |||
Columns col = Columns.values()[columnIndex]; | |||
switch (col) { | |||
case Name: | |||
return model.name; | |||
case Description: | |||
return model.description; | |||
case Owner: | |||
return model.owner; | |||
case Last_Change: | |||
return model.lastChange; | |||
case Size: | |||
return model.size; | |||
} | |||
return null; | |||
} | |||
} |