/* Glazed Lists (c) 2003-2006 */ /* http://publicobject.com/glazedlists/ publicobject.com,*/ /* O'Dell Engineering Ltd.*/ package net.nikr.eve.jeveasset.gui.dialogs.account; import ca.odell.glazedlists.SeparatorList; import ca.odell.glazedlists.SeparatorList.Separator; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.JTextField; import net.nikr.eve.jeveasset.Program; import net.nikr.eve.jeveasset.data.api.accounts.ApiType; import net.nikr.eve.jeveasset.data.api.accounts.DeprecatedOwner; import net.nikr.eve.jeveasset.data.api.accounts.OwnerType; import net.nikr.eve.jeveasset.data.settings.ColorEntry; import net.nikr.eve.jeveasset.data.settings.ColorSettings; import net.nikr.eve.jeveasset.gui.images.Images; import net.nikr.eve.jeveasset.gui.shared.table.SeparatorTableCell; import net.nikr.eve.jeveasset.i18n.DialoguesAccount; /** * * @author <a href="mailto:[email protected]">Jesse Wilson</a> */ public class AccountSeparatorTableCell extends SeparatorTableCell<OwnerType> { public enum AccountCellAction { ACCOUNT_NAME, EDIT, DELETE, MIGRATE } private final JTextField jAccountName; private final JLabel jAccountType; private final JButton jEdit; private final JButton jDelete; private final JButton jMigrate; private final JLabel jInvalidLabel; private final JLabel jExpiredLabel; private final JLabel jMigratedLabel; private final JLabel jCanMigrateLabel; private final JLabel jSpaceLabel; private final JLabel jSeparatorLabel; private final Color defaultColor; private final AccountManagerDialog accountManagerDialog; public AccountSeparatorTableCell(final AccountManagerDialog accountManagerDialog, final ActionListener actionListener, final JTable jTable, final SeparatorList<OwnerType> separatorList) { super(jTable, separatorList); this.accountManagerDialog = accountManagerDialog; defaultColor = jPanel.getBackground(); ListenerClass listener = new ListenerClass(); jSeparatorLabel = new JLabel(); jSeparatorLabel.setBackground(jTable.getBackground()); jSeparatorLabel.setOpaque(true); jSeparatorLabel.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, jTable.getGridColor())); jAccountType = new JLabel(); jEdit = new JButton(DialoguesAccount.get().edit()); jEdit.setOpaque(false); jEdit.setActionCommand(AccountCellAction.EDIT.name()); jEdit.addActionListener(actionListener); jMigrate = new JButton(DialoguesAccount.get().migrate()); jMigrate.setOpaque(false); jMigrate.setActionCommand(AccountCellAction.MIGRATE.name()); jMigrate.addActionListener(actionListener); jDelete = new JButton(DialoguesAccount.get().delete()); jDelete.setOpaque(false); jDelete.setActionCommand(AccountCellAction.DELETE.name()); jDelete.addActionListener(actionListener); jAccountName = new JTextField(); jAccountName.addFocusListener(listener); jAccountName.setBorder(null); jAccountName.setOpaque(false); jAccountName.setActionCommand(AccountCellAction.ACCOUNT_NAME.name()); jAccountName.addActionListener(listener); jInvalidLabel = new JLabel(DialoguesAccount.get().accountInvalid()); jExpiredLabel = new JLabel(DialoguesAccount.get().accountExpired()); jMigratedLabel = new JLabel(DialoguesAccount.get().accountMigrated()); jCanMigrateLabel = new JLabel(DialoguesAccount.get().accountCanMigrate()); jSpaceLabel = new JLabel(); layout.setHorizontalGroup( layout.createParallelGroup() .addComponent(jSeparatorLabel, 0, 0, Integer.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addComponent(jExpand) .addGap(1) .addComponent(jEdit, Program.getButtonsWidth(), Program.getButtonsWidth(), Program.getButtonsWidth()) .addComponent(jMigrate, Program.getButtonsWidth(), Program.getButtonsWidth(), Program.getButtonsWidth()) .addComponent(jDelete, Program.getButtonsWidth(), Program.getButtonsWidth(), Program.getButtonsWidth()) .addGap(5) .addComponent(jAccountType) .addGap(5) .addComponent(jAccountName, 20, 20, Integer.MAX_VALUE) .addGap(10) .addComponent(jExpiredLabel) .addComponent(jInvalidLabel) .addComponent(jMigratedLabel) .addComponent(jCanMigrateLabel) .addComponent(jSpaceLabel, 20, 20, Integer.MAX_VALUE) ) ); layout.setVerticalGroup( layout.createSequentialGroup() .addComponent(jSeparatorLabel, jTable.getRowHeight(), jTable.getRowHeight(), jTable.getRowHeight()) .addGap(1) .addGroup(layout.createParallelGroup() .addComponent(jExpand, Program.getButtonsHeight(), Program.getButtonsHeight(), Program.getButtonsHeight()) .addComponent(jAccountType, Program.getButtonsHeight(), Program.getButtonsHeight(), Program.getButtonsHeight()) .addComponent(jEdit, Program.getButtonsHeight(), Program.getButtonsHeight(), Program.getButtonsHeight()) .addComponent(jMigrate, Program.getButtonsHeight(), Program.getButtonsHeight(), Program.getButtonsHeight()) .addComponent(jDelete, Program.getButtonsHeight(), Program.getButtonsHeight(), Program.getButtonsHeight()) .addComponent(jAccountName, Program.getButtonsHeight(), Program.getButtonsHeight(), Program.getButtonsHeight()) .addComponent(jInvalidLabel, Program.getButtonsHeight(), Program.getButtonsHeight(), Program.getButtonsHeight()) .addComponent(jExpiredLabel, Program.getButtonsHeight(), Program.getButtonsHeight(), Program.getButtonsHeight()) .addComponent(jMigratedLabel, Program.getButtonsHeight(), Program.getButtonsHeight(), Program.getButtonsHeight()) .addComponent(jCanMigrateLabel, Program.getButtonsHeight(), Program.getButtonsHeight(), Program.getButtonsHeight()) .addComponent(jSpaceLabel, Program.getButtonsHeight(), Program.getButtonsHeight(), Program.getButtonsHeight()) ) .addGap(2) ); } @Override protected void configure(final Separator<?> separator) { OwnerType owner = (OwnerType) separator.first(); if (owner == null) { // handle 'late' rendering calls after this separator is invalid return; } jSeparatorLabel.setVisible(currentRow != 0); boolean allMigrated = false; boolean canMigrate = false; if (owner.getAccountAPI() == ApiType.EVE_ONLINE || owner.getAccountAPI() == ApiType.EVEKIT) { try { separatorList.getReadWriteLock().readLock().lock(); for (Object object : separator.getGroup()) { if (object instanceof DeprecatedOwner) { DeprecatedOwner deprecatedOwner = (DeprecatedOwner) object; if (deprecatedOwner.canMigrate()) { canMigrate = true; break; } } } } finally { separatorList.getReadWriteLock().readLock().unlock(); } allMigrated = !canMigrate; jMigrate.setVisible(true); jMigrate.setEnabled(canMigrate); jEdit.setVisible(false); } else { jMigrate.setVisible(false); jEdit.setVisible(true); } switch (owner.getAccountAPI()) { case EVE_ONLINE: jAccountType.setIcon(Images.MISC_EVE.getIcon()); break; case EVEKIT: jAccountType.setIcon(Images.MISC_EVEKIT.getIcon()); break; case ESI: jAccountType.setIcon(Images.MISC_ESI.getIcon()); break; } jAccountName.setText(owner.getAccountName()); //Expired jExpiredLabel.setVisible(owner.isExpired()); //Invalid jInvalidLabel.setVisible(owner.isInvalid()); //All Migrated jMigratedLabel.setVisible(allMigrated); //Can Migrate jCanMigrateLabel.setVisible(canMigrate); //Invalid / Expired jSpaceLabel.setVisible(owner.isInvalid() || owner.isExpired() || allMigrated || canMigrate); if (owner.isInvalid() || owner.isExpired()) { ColorSettings.config(jPanel, ColorEntry.GLOBAL_ENTRY_INVALID); } else if (allMigrated) { ColorSettings.config(jPanel, ColorEntry.GLOBAL_ENTRY_VALID); } else if (canMigrate) { ColorSettings.config(jPanel, ColorEntry.GLOBAL_ENTRY_WARNING); } else { jPanel.setBackground(defaultColor); } } private class ListenerClass implements FocusListener, ActionListener { @Override public void actionPerformed(final ActionEvent e) { if (AccountCellAction.ACCOUNT_NAME.name().equals(e.getActionCommand())) { OwnerType owner = (OwnerType) currentSeparator.first(); if (jAccountName.getText().isEmpty()) { owner.setResetAccountName(); } else { owner.setAccountName(jAccountName.getText()); } jAccountName.transferFocus(); accountManagerDialog.forceUpdate(); expandSeparator(true); int index = jTable.getSelectedRow() + 1; if (jTable.getRowCount() >= index) { jTable.setRowSelectionInterval(index, index); } } } @Override public void focusGained(final FocusEvent e) { if (e.getSource() instanceof JTextField) { jTable.setRowSelectionInterval(currentRow, currentRow); jAccountName.selectAll(); } } @Override public void focusLost(final FocusEvent e) { } } }