| /* |
| x * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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 org.apache.chemistry.opencmis.workbench; |
| |
| import java.awt.BorderLayout; |
| import java.awt.Component; |
| import java.awt.Container; |
| import java.awt.Cursor; |
| import java.awt.Dimension; |
| import java.awt.Font; |
| import java.awt.Frame; |
| import java.awt.Toolkit; |
| import java.awt.event.ActionEvent; |
| import java.awt.event.ActionListener; |
| import java.util.Collections; |
| import java.util.Comparator; |
| import java.util.List; |
| import java.util.ServiceLoader; |
| |
| import javax.swing.BorderFactory; |
| import javax.swing.BoxLayout; |
| import javax.swing.JButton; |
| import javax.swing.JComboBox; |
| import javax.swing.JDialog; |
| import javax.swing.JLabel; |
| import javax.swing.JList; |
| import javax.swing.JOptionPane; |
| import javax.swing.JPanel; |
| import javax.swing.JTabbedPane; |
| import javax.swing.ListCellRenderer; |
| import javax.swing.UIManager; |
| import javax.swing.WindowConstants; |
| import javax.swing.event.ChangeEvent; |
| import javax.swing.event.ChangeListener; |
| |
| import org.apache.chemistry.opencmis.client.api.Repository; |
| import org.apache.chemistry.opencmis.workbench.model.ClientSession; |
| |
| public class LoginDialog extends JDialog { |
| |
| private static final long serialVersionUID = 1L; |
| |
| public static final String SYSPROP_LOGIN_TAB = ClientSession.WORKBENCH_PREFIX + "logintab"; |
| |
| private static final ServiceLoader<AbstractLoginTab> TAB_SERVICE_LOADER = ServiceLoader |
| .load(AbstractLoginTab.class); |
| |
| private JTabbedPane loginTabs; |
| private BasicLoginTab basicLoginTab; |
| private ExpertLoginTab expertLoginTab; |
| private DiscoverLoginTab discoverLoginTab; |
| private JButton loadRepositoryButton; |
| private JButton loginButton; |
| private JComboBox<Repository> repositoryBox; |
| private AbstractLoginTab currentTab; |
| |
| private boolean canceled = true; |
| |
| private ClientSession clientSession; |
| |
| public LoginDialog(Frame owner) { |
| super(owner, "Login", true); |
| createGUI(); |
| } |
| |
| private void createGUI() { |
| Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); |
| setPreferredSize(new Dimension((int) (screenSize.getWidth() / 2), (int) (screenSize.getHeight() / 3))); |
| setMinimumSize(new Dimension(700, 500)); |
| |
| Container pane = getContentPane(); |
| pane.setLayout(new BorderLayout()); |
| |
| loginTabs = new JTabbedPane(); |
| add(loginTabs, BorderLayout.CENTER); |
| |
| // add tabs |
| addLoginTabs(loginTabs); |
| |
| // repository |
| JPanel buttonPanel = new JPanel(); |
| buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.PAGE_AXIS)); |
| buttonPanel.setBorder(WorkbenchScale.scaleBorder(BorderFactory.createEmptyBorder(0, 5, 5, 5))); |
| add(buttonPanel, BorderLayout.PAGE_END); |
| |
| loadRepositoryButton = createButton("Load Repositories"); |
| buttonPanel.add(loadRepositoryButton); |
| getRootPane().setDefaultButton(loadRepositoryButton); |
| |
| createRepositoryBox(buttonPanel); |
| |
| loginButton = createButton("Login"); |
| buttonPanel.add(loginButton); |
| loginButton.setEnabled(false); |
| |
| // listeners |
| loadRepositoryButton.addActionListener(new ActionListener() { |
| @Override |
| public void actionPerformed(ActionEvent e) { |
| repositoryBox.removeAllItems(); |
| |
| try { |
| setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); |
| |
| currentTab.beforeLoadRepositories(); |
| |
| createClientSession(); |
| |
| List<Repository> repositories = clientSession.getRepositories(); |
| |
| Collections.sort(repositories, new Comparator<Repository>() { |
| @Override |
| public int compare(Repository r1, Repository r2) { |
| if (r1 == null || r1.getName() == null) { |
| return 1; |
| } |
| |
| if (r2 == null || r2.getName() == null) { |
| return -1; |
| } |
| |
| return r1.getName().compareTo(r2.getName()); |
| } |
| }); |
| |
| if (repositories.isEmpty()) { |
| repositoryBox.setEnabled(false); |
| loginButton.setEnabled(false); |
| getRootPane().setDefaultButton(loadRepositoryButton); |
| |
| JOptionPane.showMessageDialog(getOwner(), |
| "The CMIS endpoint retruned an empty list of repositories.", "No repositories!", |
| JOptionPane.WARNING_MESSAGE); |
| } else { |
| for (Repository repository : repositories) { |
| repositoryBox.addItem(repository); |
| } |
| |
| repositoryBox.setEnabled(true); |
| loginButton.setEnabled(true); |
| getRootPane().setDefaultButton(loginButton); |
| } |
| |
| currentTab.afterLoadRepositories(repositories); |
| } catch (Exception ex) { |
| repositoryBox.setEnabled(false); |
| loginButton.setEnabled(false); |
| getRootPane().setDefaultButton(loadRepositoryButton); |
| |
| new ConnectionErrorDialog(LoginDialog.this, ex); |
| } finally { |
| setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); |
| } |
| } |
| }); |
| |
| loginButton.addActionListener(new ActionListener() { |
| @Override |
| public void actionPerformed(ActionEvent e) { |
| try { |
| setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); |
| |
| currentTab.beforeLogin(clientSession.getRepositories().get(repositoryBox.getSelectedIndex())); |
| |
| clientSession.createSession(repositoryBox.getSelectedIndex()); |
| |
| currentTab.afterLogin(clientSession.getSession()); |
| |
| clientSession.setStartFolderId(currentTab.getStartFolderId()); |
| |
| canceled = false; |
| hideDialog(); |
| } catch (Exception ex) { |
| repositoryBox.setEnabled(false); |
| loginButton.setEnabled(false); |
| getRootPane().setDefaultButton(loadRepositoryButton); |
| |
| new ConnectionErrorDialog(LoginDialog.this, ex); |
| } finally { |
| setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); |
| getRootPane().setDefaultButton(loadRepositoryButton); |
| } |
| } |
| }); |
| |
| ClientHelper.installEscapeBinding(this, getRootPane(), false); |
| |
| setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE); |
| pack(); |
| |
| // if a login tab is too big... |
| if (loginTabs.getPreferredSize().height - loginTabs.getSize().height > 0) { |
| // ... resize the dialog |
| setPreferredSize(new Dimension(getSize().width, getSize().height |
| + (loginTabs.getPreferredSize().height - loginTabs.getSize().height))); |
| pack(); |
| } |
| |
| setLocationRelativeTo(null); |
| } |
| |
| private void addLoginTabs(final JTabbedPane loginTabs) { |
| |
| for (AbstractLoginTab tab : TAB_SERVICE_LOADER) { |
| loginTabs.add(tab.getTabTitle(), tab); |
| } |
| |
| basicLoginTab = new BasicLoginTab(); |
| loginTabs.addTab(basicLoginTab.getTabTitle(), basicLoginTab); |
| |
| expertLoginTab = new ExpertLoginTab(); |
| loginTabs.addTab(expertLoginTab.getTabTitle(), expertLoginTab); |
| |
| discoverLoginTab = new DiscoverLoginTab(); |
| loginTabs.addTab(discoverLoginTab.getTabTitle(), discoverLoginTab); |
| |
| loginTabs.setSelectedIndex(0); |
| |
| String startTab = System.getProperty(SYSPROP_LOGIN_TAB, "0"); |
| try { |
| int tab = Integer.parseInt(startTab); |
| if (tab >= 0 && tab < loginTabs.getTabCount()) { |
| loginTabs.setSelectedIndex(tab); |
| } |
| } catch (NumberFormatException nfe) { |
| // do nothing |
| } |
| |
| currentTab = (AbstractLoginTab) loginTabs.getSelectedComponent(); |
| |
| loginTabs.addChangeListener(new ChangeListener() { |
| @Override |
| public void stateChanged(ChangeEvent e) { |
| if (loginTabs.getSelectedComponent() == expertLoginTab) { |
| if (currentTab.transferSessionParametersToExpertTab()) { |
| expertLoginTab.setSessionParameters(currentTab.getSessionParameters()); |
| } |
| } |
| |
| if (loginTabs.getSelectedComponent() == discoverLoginTab) { |
| loadRepositoryButton.setEnabled(false); |
| } else { |
| loadRepositoryButton.setEnabled(true); |
| } |
| |
| currentTab = (AbstractLoginTab) loginTabs.getSelectedComponent(); |
| } |
| }); |
| } |
| |
| private JButton createButton(String title) { |
| JButton button = new JButton(title); |
| |
| int height = 30; |
| height = Math.max(height, |
| getFontMetrics(button.getFont()).getHeight() + button.getInsets().top + button.getInsets().bottom); |
| |
| button.setPreferredSize(new Dimension(Short.MAX_VALUE, height)); |
| button.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE)); |
| button.setAlignmentX(Component.CENTER_ALIGNMENT); |
| |
| return button; |
| } |
| |
| private void createRepositoryBox(Container pane) { |
| repositoryBox = new JComboBox<Repository>(); |
| |
| RepositoryRenderer renderer = new RepositoryRenderer(); |
| |
| int height = (int) (renderer.getPreferredSize().height * 1.1); |
| |
| repositoryBox.setEnabled(false); |
| repositoryBox.setRenderer(renderer); |
| repositoryBox.setPreferredSize(new Dimension(Short.MAX_VALUE, height)); |
| repositoryBox.setAlignmentX(Component.CENTER_ALIGNMENT); |
| |
| pane.add(repositoryBox); |
| } |
| |
| protected void setClientSession(ClientSession clientSession) { |
| this.clientSession = clientSession; |
| } |
| |
| public void createClientSession() { |
| setClientSession(new ClientSession(currentTab.getSessionParameters(), currentTab.getObjectFactory(), |
| currentTab.getAuthenticationProvider(), currentTab.getCache(), currentTab.getTypeDefinitionCache())); |
| } |
| |
| public void showDialog() { |
| clientSession = null; |
| canceled = true; |
| |
| repositoryBox.removeAllItems(); |
| repositoryBox.setEnabled(false); |
| loginButton.setEnabled(false); |
| getRootPane().setDefaultButton(loadRepositoryButton); |
| |
| setLocationRelativeTo(getOwner()); |
| setVisible(true); |
| } |
| |
| public void hideDialog() { |
| setVisible(false); |
| } |
| |
| public ClientSession getClientSession() { |
| return clientSession; |
| } |
| |
| public void switchToBasicTab() { |
| loginTabs.setSelectedComponent(basicLoginTab); |
| } |
| |
| public void switchToExpertTab() { |
| if (currentTab.transferSessionParametersToExpertTab()) { |
| expertLoginTab.setSessionParameters(currentTab.getSessionParameters()); |
| } |
| loginTabs.setSelectedComponent(expertLoginTab); |
| } |
| |
| public void switchToDiscoverTab() { |
| loginTabs.setSelectedComponent(discoverLoginTab); |
| } |
| |
| public boolean isCanceled() { |
| return canceled; |
| } |
| |
| static class RepositoryRenderer extends JPanel implements ListCellRenderer<Repository> { |
| private static final long serialVersionUID = 1L; |
| |
| private final JLabel nameLabel; |
| private final JLabel idLabel; |
| private final JLabel descriptionLabel; |
| |
| public RepositoryRenderer() { |
| super(); |
| setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); |
| setBorder(WorkbenchScale.scaleBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3))); |
| |
| Font labelFont = UIManager.getFont("Label.font"); |
| |
| nameLabel = new JLabel(); |
| nameLabel.setFont(labelFont.deriveFont(Font.BOLD)); |
| add(nameLabel); |
| |
| idLabel = new JLabel(); |
| add(idLabel); |
| |
| descriptionLabel = new JLabel(); |
| add(descriptionLabel); |
| |
| setPreferredSize(new Dimension(Short.SIZE, (getFontMetrics(labelFont).getHeight() * 3) |
| + WorkbenchScale.scaleInt(6))); |
| } |
| |
| @Override |
| public Component getListCellRendererComponent(JList<? extends Repository> list, Repository value, int index, |
| boolean isSelected, boolean cellHasFocus) { |
| if (isSelected) { |
| setBackground(list.getSelectionBackground()); |
| setForeground(list.getSelectionForeground()); |
| } else { |
| setBackground(list.getBackground()); |
| setForeground(list.getForeground()); |
| } |
| |
| if (value == null) { |
| nameLabel.setText(""); |
| idLabel.setText(""); |
| descriptionLabel.setText(""); |
| } else { |
| nameLabel.setText(value.getName()); |
| idLabel.setText(value.getId()); |
| descriptionLabel.setText(value.getDescription()); |
| } |
| |
| return this; |
| } |
| } |
| } |