gecko-dev/grendel/addressbook/AddressBook.java
1999-11-02 01:51:54 +00:00

1103 lines
34 KiB
Java

/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (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.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the Grendel mail/news client.
*
* The Initial Developer of the Original Code is Netscape Communications
* Corporation. Portions created by Netscape are
* Copyright (C) 1997 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s): Jeff Galyan <talisman@anamorphic.com>
* Giao Nguyen <grail@cafebabe.org>
* Edwin Woudt <edwin@woudt.nl>
* Mauro Botelho <mabotelh@bellsouth.net>
*/
package grendel.addressbook;
import grendel.addressbook.addresscard.*;
import grendel.ui.UIAction;
import grendel.ui.GeneralFrame;
import grendel.widgets.*;
import calypso.util.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.table.*;
//import javax.swing.table.DefaultTableModel;
import javax.swing.event.TableModelEvent;
import javax.swing.border.EmptyBorder;
import netscape.ldap.*;
/**
*
* @author Lester Schueler
*/
public class AddressBook extends GeneralFrame {
private Hashtable mCommands;
private Hashtable mMenuItems;
// private ACS_Personal myLocalAddressBook;
private MenuBarCtrl mMenuBarCtrl;
private GrendelToolBar mTtoolbar;
// private Component mStatusbar;
private JTable mTable;
private JButton mSearchButton;
protected DataSourceList mDataSourceList;
protected JComboBox mSearchSource;
protected JTextField mSearchField;
protected boolean mSortAscending;
protected String ColumnName;
protected int mColumnSorted;
Preferences prefs = PreferencesFactory.Get();
public static void main(String[] args) {
AddressBook AddressBookFrame = new AddressBook();
AddressBookFrame.addWindowListener(new AppCloser());
AddressBookFrame.show();
}
protected static final class AppCloser extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
//***************************
abstract class DataSource {
private String mReadableName;
private ICardSource mCardSource;
DataSource (String aReadableName) {
mReadableName = aReadableName;
}
private DataSource () {
mReadableName = "";
}
protected abstract ICardSource getCardSource();
public String getReadableName () { return mReadableName; }
public Vector query (String aSearchString) {
Vector retVecVec = new Vector(); //return vector of vectors.
// try {
//open a connection to the LDAP server
System.out.println ("Opening server " + mReadableName);
ICardSource Four11AddressBook = getCardSource();
//create the query
ITerm query = new TermEqual (new AC_Attribute ("sn", aSearchString));
String[] attributes = {"givenName", "sn", "cn", "o", "mail", "telephoneNumber", "city"};
//query the LDAP server.
System.out.println ("Send query" + query);
ICardSet cardSet = Four11AddressBook.getCardSet (query, attributes);
//Sort the list.
String[] sortOrder = {"sn", "cn"};
cardSet.sort (sortOrder);
//hack. I've put the for loop in a try block to catch the exception
//thrown when cardEnum.hasMoreElements() incorrectly returns true.
try {
//enumerate thru the cards.
for (Enumeration cardEnum = cardSet.getEnumeration();
cardEnum.hasMoreElements(); ) {
System.out.println ("got card");
//get the addres card
ICard card = (ICard) cardEnum.nextElement();
//get the attributes for this card
IAttributeSet attrSet = card.getAttributeSet ();
//create a simple vector to hold the attributes values for this card.
Vector thisRow = new Vector(6);
String commonName = "";
String organization = "";
String mail = "";
String phone = "";
String city = "";
String nickName = "";
// enumerate thru the card attributes.
for (Enumeration attEnum = attrSet.getEnumeration();
attEnum.hasMoreElements(); ) {
IAttribute attr = (IAttribute) attEnum.nextElement();
String attrName = attr.getName();
if (attrName.equals ("cn")) {
commonName = attr.getValue();
}
else if (attrName.equals ("o")) {
organization = attr.getValue();
}
else if (attrName.equals ("mail")) {
mail = attr.getValue();
}
else if (attrName.equals ("telephoneNumber")) {
phone = attr.getValue();
}
else if (attrName.equals ("city")) {
city = attr.getValue();
}
}
//create this row for the table.
thisRow.addElement (commonName);
thisRow.addElement (mail);
thisRow.addElement (organization);
thisRow.addElement (phone);
thisRow.addElement (city);
thisRow.addElement (nickName);
//add this row to the table
retVecVec.addElement (thisRow);
}
}
catch (Exception e) {
}
// }
// catch( LDAPException e ) {
// System.out.println( "Error: " + e.toString() );
// }
System.out.println ("Done.");
return retVecVec;
}
}
//***************************
class LDAPDataSource extends DataSource {
private String mDomainName;
private int mPort;
LDAPDataSource (String aReadableName, String aDomainName) {
this (aReadableName, aDomainName, 389);
}
LDAPDataSource (String aReadableName, String aDomainName, int aPort) {
super(aReadableName);
mDomainName = aDomainName;
mPort = aPort;
}
protected ICardSource getCardSource() {
return new LDAP_Server (mDomainName);
}
public String getDomainName () { return mDomainName; }
public int getPort () { return mPort; }
}
//***************************
class FileDataSource extends DataSource {
private String mFileName;
FileDataSource (String aReadableName, String aFileName) {
super(aReadableName);
mFileName = aFileName;
}
protected ICardSource getCardSource() {
System.out.println("Entering in the getCardSource");
return new ACS_Personal (mFileName, false);
}
public String getFileName () { return mFileName; }
}
//***************************
class DataSourceList {
private Vector mDataSources;
DataSourceList () {
mDataSources = new Vector ();
}
public Enumeration getEnumeration () { return mDataSources.elements(); }
public void addEntry (DataSource aDataSource) { mDataSources.addElement (aDataSource); }
public DataSource find (String aReadableName) {
for (Enumeration e = mDataSources.elements() ; e.hasMoreElements() ;) {
DataSource ds = (DataSource) e.nextElement();
if (ds.getReadableName ().equalsIgnoreCase(aReadableName))
return ds;
}
return null;
}
}
/**
*
*/
public AddressBook() {
super("Address Book","addressbook");
// Setting the default values to the variables
mSortAscending = true;
mColumnSorted = 0;
setBackground(Color.lightGray);
getContentPane().setLayout(new BorderLayout());
//create menubar (top)
//merge both the editors commands with this applications commands.
//mMenubar = NsMenuManager.createMenuBar("grendel.addressbook.Menus", "grendel.addressbook.MenuLabels", "mainMenubar", defaultActions);
// FIXME - need to build the menu bar
// (Jeff)
mMenuBarCtrl = buildMenu("menus.xml",defaultActions);
JMenuItem aMenuItem = mMenuBarCtrl.getCtrlByName("sortAscending");
if (aMenuItem != null) {
aMenuItem.setSelected(true);
}
aMenuItem = mMenuBarCtrl.getCtrlByName("byName");
if (aMenuItem != null) {
aMenuItem.setSelected(true);
}
setJMenuBar(mMenuBarCtrl);
//collapsble panels holds toolbar.
CollapsiblePanel collapsePanel = new CollapsiblePanel(true);
collapsePanel.setBorder (new EmptyBorder(5,5,5,5));
//toolbar buttons
mTtoolbar = createToolbar();
//collapsible item
collapsePanel.add(mTtoolbar);
//create status bar (bottom)
// mStatusbar = createStatusbar();
JPanel panel1 = new JPanel();
panel1.setLayout(new BorderLayout());
panel1.add(collapsePanel, BorderLayout.NORTH);
//hack together the data sources.
mDataSourceList = new DataSourceList ();
for(int j = 0 ; j < prefs.getInt("addressbook.datasource.count",1) - 1 ; j++) {
String DataSourceName = "DataSourceName" + j;
mDataSourceList.addEntry(new LDAPDataSource (prefs.getString("addressbook.datasource.name." + j),
prefs.getString("addressbook.datasource.source." + j)));
}
mDataSourceList.addEntry (new FileDataSource ("Local Addressbook","aBook.nab"));
mDataSourceList.addEntry (new LDAPDataSource ("Four11 Directory", "ldap.four11.com"));
mDataSourceList.addEntry (new LDAPDataSource ("InfoSpace Directory", "ldap.infospace.com"));
mDataSourceList.addEntry (new LDAPDataSource ("WhoWhere Directory", "ldap.whowhere.com"));
mDataSourceList.addEntry (new LDAPDataSource ("InfoSeek Directory", "ldap.infoseek.com"));
//Create address panel
AddressPanel addressPanel = new AddressPanel (mDataSourceList);
panel1.add(addressPanel, BorderLayout.CENTER);
// getContentPane().add(mMenubar, BorderLayout.NORTH);
getContentPane().add(panel1, BorderLayout.CENTER);
setSize (600, 400);
//Create Local Address Book
//myLocalAddressBook = new ACS_Personal ("MyAddressBook.nab", true);
}
/**
* Hide this frame.
*/
protected void hideThisFrame () {
setVisible(false);
}
/**
* Handles windowClosing for window listener.
*/
protected class FrameHider extends WindowAdapter {
public void windowClosing(WindowEvent e) {
hideThisFrame();
}
}
/**
* Find the hosting frame, for the file-chooser dialog.
*/
protected JFrame getParentFrame() {
// for (Container p = getParent(); p != null; p = p.getParent()) {
// if (p instanceof Frame) {
// return (Frame) p;
// }
// }
return this;
}
//**********************
//**********************
// menus
private JMenuBar menubar;
//"File" actions
public static final String newCardTag ="newCard";
public static final String newListTag ="newList";
public static final String importTag ="import";
public static final String saveAsTag ="saveAs";
public static final String callTag ="call";
public static final String closeWindowTag ="closeWindow";
// "file->new" actions
public static final String navigatorWindowTag ="navigatorWindow";
public static final String messageTag ="message";
public static final String blankPageTag ="blankPage";
public static final String pageFromTemplateTag ="pageFromTemplate";
public static final String pageFromWizardTag ="pageFromWizard";
//"Edit" actions
public static final String undoTag ="undo";
public static final String redoTag ="redo";
public static final String deleteTag ="delete";
public static final String searchDirectoryTag ="searchDirectory";
public static final String HTMLDomainsTag ="HTMLDomains";
public static final String cardPropertiesTag ="cardProperties";
public static final String preferencesTag ="preferences";
//"View" actions
public static final String hideMessageToolbarTag ="hideMessageToolbar";
public static final String byTypeTag ="byType";
public static final String byNameTag ="byName";
public static final String byEmailAddressTag ="byEmailAddress";
public static final String byCompanyTag ="byCompany";
public static final String byCityTag ="byCity";
public static final String byNicknameTag ="byNickname";
public static final String sortAscendingTag ="sortAscending";
public static final String sortDescendingTag ="sortDescending";
public static final String myAddressBookCardTag ="myAddressBookCard";
// --- action implementations -----------------------------------
private UIAction[] defaultActions = {
//"File" actions
new NewCard(),
// new NewList(),
// new Import(),
new SaveAs(),
// new Call(),
new CloseWindow(),
// "file->new" actions
// new NavigatorWindow(),
// new Message(),
// new BlankPage(),
// new PageFromTemplate(),
// new PageFromWizard(),
//"Edit" actions
// new Undo(),
// new Redo(),
// new Delete(),
new SearchDirectory(),
// new HTMLDomains(),
// new CardProperties(),
// new Preferences(),
//"View" actions
// new HideMessageToolbar(),
// new ByType(),
new ByName(),
new ByEmailAddress(),
new ByCompany(),
new ByCity(),
new ByNickname(),
new SortAscending(),
new SortDescending(),
// new MyAddressBookCard(),
// new WrapLongLines()
};
//-----------------------
//"File" actions
//-----------------------
/**
*/
class NewCard extends UIAction {
NewCard() {
super(newCardTag);
this.setEnabled(true);
}
public void actionPerformed(ActionEvent e) {
NewCardDialog aDialog = new NewCardDialog(getParentFrame());
//display the new card dialog
aDialog.show ();
aDialog.dispose();
}
}
class SearchDirectory extends UIAction {
SearchDirectory() {
super(searchDirectoryTag);
this.setEnabled(true);
}
public void actionPerformed(ActionEvent e) {
SearchDirectoryDialog aDialog = new SearchDirectoryDialog(getParentFrame());
//display the new card dialog
aDialog.show ();
aDialog.dispose();
}
}
class SaveAs extends UIAction {
SaveAs() {
super(saveAsTag);
this.setEnabled(true);
}
public void actionPerformed(ActionEvent ae) {
NewCardDialog aDialog = new NewCardDialog(getParentFrame());
//display the new card dialog
aDialog.show ();
aDialog.dispose();
}
}
class CloseWindow extends UIAction {
CloseWindow() {
super(closeWindowTag);
this.setEnabled(true);
}
public void actionPerformed(ActionEvent e) {
//hide after send.
hideThisFrame();
}
}
//-----------------------
// "file->new" actions
//-----------------------
//-----------------------
//"Edit" actions
//-----------------------
class Undo extends UIAction {
Undo() {
super(undoTag);
this.setEnabled(true);
}
public void actionPerformed(ActionEvent e) {}
}
//-----------------------
//"View" actions
//-----------------------
class HideMessageToolbar extends UIAction {
HideMessageToolbar() {
super(hideMessageToolbarTag);
this.setEnabled(true);
}
public void actionPerformed(ActionEvent e) {}
}
//-----------------------
//-----------------------
class Search extends UIAction {
Search() {
super(newListTag);
this.setEnabled(true);
}
public void actionPerformed(ActionEvent e) {
String readableName = (String) mSearchSource.getSelectedItem();
int index = mSearchSource.getSelectedIndex();
DataSource ds = mDataSourceList.find (readableName);
if (null != ds) {
//get the text to search for.
String textToSearchFor = mSearchField.getText();
if (!textToSearchFor.trim().equals ("")) {
DataModel dm = (DataModel) mTable.getModel ();
dm.reloadData (ds, textToSearchFor);
//dm.reloadData (ds.getDomainName(), ds.getPort(), textToSearchFor);
dm.fireTableDataChanged();
//repaint the table with results.
mTable.repaint();
}
}
}
}
//----------------
// Sort Ascending
//----------------
class SortAscending extends UIAction {
SortAscending() {
super(sortAscendingTag);
this.setEnabled(true);
}
public void actionPerformed(ActionEvent e) {
if (!mSortAscending) {
mSortAscending = true;
DataModel dm = (DataModel) mTable.getModel ();
System.out.println("Column Name is " + ColumnName);
int colnumber = dm.findColumn(ColumnName);
System.out.println("Column Number for " + ColumnName + " is: " + colnumber);
dm.sortData(colnumber,mSortAscending);
mTable.repaint();
}
}
}
//----------------
// Sort Descending
//----------------
class SortDescending extends UIAction {
SortDescending() {
super(sortDescendingTag);
this.setEnabled(true);
}
public void actionPerformed(ActionEvent e) {
System.out.println("I'm in sort descending");
if (mSortAscending) {
DataModel dm = (DataModel) mTable.getModel ();
mSortAscending = false;
System.out.println("Column Name is " + ColumnName);
int colnumber = dm.findColumn(ColumnName);
System.out.println("Column Number for " + ColumnName + " is: " + colnumber);
dm.sortData(colnumber,mSortAscending);
mTable.repaint();
}
}
}
//----------------------------------
// Base class for sorting the names
//----------------------------------
class ResultSorter extends UIAction {
String myLocalColumnName;
ResultSorter(String Tag){
super(Tag);
}
public void actionPerformed(ActionEvent e) {
DataModel dm = (DataModel) mTable.getModel ();
ColumnName = myLocalColumnName;
int colnumber = dm.findColumn(ColumnName);
System.out.println("Column Number for " + ColumnName + " is: " + colnumber);
dm.sortData(colnumber,mSortAscending);
mTable.repaint();
}
}
//-----------------------
//ByName action
//-----------------------
class ByName extends ResultSorter {
ByName() {
super(byNameTag);
myLocalColumnName = new String("Name");
this.setEnabled(true);
}
}
//-----------------------
//ByEmailAddress action
//-----------------------
class ByEmailAddress extends ResultSorter {
ByEmailAddress() {
super(byEmailAddressTag);
myLocalColumnName = new String("Email Address");
this.setEnabled(true);
}
}
//-----------------------
//ByCompany action
//-----------------------
class ByCompany extends ResultSorter {
ByCompany() {
super(byCompanyTag);
myLocalColumnName = new String("Organization");
this.setEnabled(true);
}
}
//-----------------------
//ByCity action
//-----------------------
class ByCity extends ResultSorter {
ByCity() {
super(byCityTag);
myLocalColumnName = new String("City");
this.setEnabled(true);
}
}
//-----------------------
//ByNickname action
//-----------------------
class ByNickname extends ResultSorter {
ByNickname() {
super(byNicknameTag);
myLocalColumnName = new String("Nickname");
this.setEnabled(true);
}
}
/**
* Create a Toolbar
* @see addToolbarButton
*/
private GrendelToolBar createToolbar() {
GrendelToolBar toolBar = new GrendelToolBar();
addToolbarButton(toolBar, new NewCard(), "moz-newcard.gif", "Create a new card");
addToolbarButton(toolBar, null, "moz-newlist.gif", "Create a new list");
addToolbarButton(toolBar, null, "moz-properties.gif", "Edit the selected card");
addToolbarButton(toolBar, null, "moz-newmsg.gif", "New Message (Ctrl+M)");
addToolbarButton(toolBar, null, "moz-stop.gif", "Look up an address");
addToolbarButton(toolBar, null, "moz-stop.gif", "Start Netscape Conference");
addToolbarButton(toolBar, null, "moz-delete.gif", "Delete selected cards <Del>");
return toolBar;
}
/**
* create a toolbar button
* @param aToolBar The parent toolbar to add this button to.
* @param aActionListener Who you want to be notified when the button is pressed.
* @param aImageName The image name for the button. like "save.gif"
* @param aToolTip The buttons tool tip. like "Save the current file".
* @see createToolbar
*/
public void addToolbarButton(GrendelToolBar aToolBar,
UIAction aActionListener,
String aImageName, String aToolTip) {
JButton b = new JButton();
b.setHorizontalTextPosition(JButton.CENTER);
b.setVerticalTextPosition(JButton.BOTTOM);
b.setToolTipText(aToolTip);
// URL iconUrl = getClass().getResource("images/" + gifName + ".gif");
// b.setIcon(new ImageIcon(getClass().getResource(aImageName)));
File resourceFile = new File(aImageName);
try {
if (resourceFile.exists()) {
b.setIcon(new ImageIcon(resourceFile.getCanonicalPath()));
}
} catch (IOException e) {
System.out.println("IOException occured");
}
// iconUrl = getClass().getResource("images/" + gifName + "-disabled.gif");
// button.setDisabledIcon(ImageIcon.createImageIcon(iconUrl));
// iconUrl = getClass().getResource("images/" + gifName + "-depressed.gif");
// button.setPressedIcon(ImageIcon.createImageIcon(iconUrl));
// iconUrl = getClass().getResource("images/" + gifName + "-rollover.gif");
// button.setRolloverIcon(ImageIcon.createImageIcon(iconUrl));
// JButton b = new JButton(new ImageIcon(aImageName));
b.setToolTipText(aToolTip);
// b.setPad(new Insets(3,3,3,3));
if (aActionListener != null) {
b.addActionListener(aActionListener);}
aToolBar.add(b);
}
private String getFirstEnum (Enumeration enumVals) {
if (enumVals.hasMoreElements())
return (String) enumVals.nextElement();
return null;
}
/* This function is now obsolete, the responsible for querying is now
** the datasource, so that we can create other types of datasources (files!)
public Vector queryLDAP (String aServerName, int aPort,
String aSearchString) {
Vector retVecVec = new Vector(); //return vector of vectors.
// try {
//open a connection to the LDAP server
System.out.println ("Opening server " + aServerName);
ICardSource Four11AddressBook = new LDAP_Server (aServerName);
//create the query
ITerm query = new TermEqual (new AC_Attribute ("sn", aSearchString));
String[] attributes = {"sn", "cn", "o", "mail", "city"};
//query the LDAP server.
System.out.println ("Send query" + query);
ICardSet cardSet = Four11AddressBook.getCardSet (query, attributes);
//Sort the list.
String[] sortOrder = {"sn", "cn"};
cardSet.sort (sortOrder);
//hack. I've put the for loop in a try block to catch the exception
//thrown when cardEnum.hasMoreElements() incorrectly returns true.
try {
//enumerate thru the cards.
for (Enumeration cardEnum = cardSet.getEnumeration();
cardEnum.hasMoreElements(); ) {
System.out.println ("got card");
//get the addres card
ICard card = (ICard) cardEnum.nextElement();
//get the attributes for this card
IAttributeSet attrSet = card.getAttributeSet ();
//create a simple vector to hold the attributes values for this card.
Vector thisRow = new Vector(6);
String commonName = "";
String organization = "";
String mail = "";
String phone = "";
String city = "";
String nickName = "";
// enumerate thru the card attributes.
for (Enumeration attEnum = attrSet.getEnumeration();
attEnum.hasMoreElements(); ) {
IAttribute attr = (IAttribute) attEnum.nextElement();
String attrName = attr.getName();
if (attrName.equals ("cn")) {
commonName = attr.getValue();
}
else if (attrName.equals ("o")) {
organization = attr.getValue();
}
else if (attrName.equals ("mail")) {
mail = attr.getValue();
}
else if (attrName.equals ("sn")) {
phone = attr.getValue();
}
else if (attrName.equals ("city")) {
city = attr.getValue();
}
}
//create this row for the table.
thisRow.addElement (commonName);
thisRow.addElement (mail);
thisRow.addElement (organization);
thisRow.addElement (phone);
thisRow.addElement (city);
thisRow.addElement (nickName);
//add this row to the table
retVecVec.addElement (thisRow);
}
}
catch (Exception e) {
}
// }
// catch( LDAPException e ) {
// System.out.println( "Error: " + e.toString() );
// }
System.out.println ("Done.");
return retVecVec;
}
*/
public class DataModel extends AbstractTableModel {
private Vector mVecVec;
private String[] mColumnNames;
public DataModel (String[] aNames) {
super();
mVecVec = new Vector ();
mColumnNames = aNames;
}
public int getRowCount() { return mVecVec.size(); }
public int getColumnCount () { return mColumnNames.length; }
public String getColumnName(int column) { return mColumnNames[column]; }
public Class getColumnClass(int col) { return String.class; }
public boolean isCellEditable(int row, int col) { return false;}
public void setValueAt(Object aValue, int row, int column) {
((Vector)mVecVec.elementAt(row)).setElementAt(aValue, column);
}
public void reloadData (DataSource ds, String aSearchString) {
mVecVec = ds.query(aSearchString);
}
/* This method is now obsolete, since I moved the query function
** from the AddressBook to the datasource
**
public void reloadData (String aServerName, int aPort,
String aSearchString) {
//reload the data from LDAP.
mVecVec = queryLDAP (aServerName, aPort, aSearchString);
}
*/
public Object getValueAt(int row, int column) {
return (((Vector)mVecVec.elementAt(row)).elementAt(column));
}
public void sortData(int column, final boolean sortascending) {
Object[][] ColumnValues = new String [mVecVec.size()][2];
int row;
int col;
for(row = 0 ; row < mVecVec.size() ; ++row) {
ColumnValues[row][0] =
(((Vector)mVecVec.elementAt(row)).elementAt(column));
ColumnValues[row][1] = new Integer(row).toString();
}
System.out.println("Values before sorting");
for(row = 0; row < ColumnValues.length ; ++row) {
System.out.println(ColumnValues[row][0] + " row: "
+ ColumnValues[row][1]);
}
QSort sorter = new QSort(new Comparer() {
public int compare(Object a, Object b) {
int returnValue;
try {
returnValue = (((String[])a)[0]).compareTo(((String[])b)[0]);
}
catch (NullPointerException e) {
returnValue = 1;
}
if (!sortascending)
returnValue = -1 * returnValue;
return returnValue;
}
});
sorter.sort(ColumnValues);
System.out.println("Values after sorting");
for(row = 0; row < ColumnValues.length ; ++row) {
System.out.println(ColumnValues[row][0] + " row: "
+ ColumnValues[row][1]);
}
Vector SortedVector = new Vector();
for(row = 0; row < ColumnValues.length ; ++row) {
Vector thisRow = new Vector(6);
Integer OriginalPosition = new Integer((String)ColumnValues[row][1]);
for(col = 0; col < ((Vector)mVecVec.elementAt(row)).size();
++col) {
thisRow.addElement(((Vector)mVecVec.elementAt(OriginalPosition.intValue())).elementAt(col));
}
SortedVector.addElement(thisRow);
}
mVecVec = SortedVector;
fireTableDataChanged();
}
}
/**
* Create a status bar
* @return
* @see
*/
// protected Component createStatusbar() {
// // need to do something reasonable here
// StatusBar status = new StatusBar();
// return status;
// }
//***************************
/**
*
*/
class StatusBar extends JPanel {
public StatusBar() {
super();
this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
}
public void paint(Graphics g) {
super.paint(g);
}
}
/**
*/
class AddressPanel extends JPanel {
public AddressPanel(DataSourceList aDataSourceList) {
//super(true);
setBorder (new EmptyBorder(10,10,10,10));
this.setLayout (new BorderLayout(10, 5));
add(createSearchPane(aDataSourceList), BorderLayout.NORTH);
add(createTable(), BorderLayout.CENTER);
}
private Box createSearchPane (DataSourceList aDataSourceList) {
//explaination
JLabel explaination = new JLabel ("Type in the name you're looking for:");
explaination.setAlignmentX((float)0.0); //align left
//text field
mSearchField = new JTextField (20);
mSearchField.setAlignmentX((float)0.0); //align left
//box for explain and text field
Box innerBoxPane = new Box (BoxLayout.Y_AXIS);
// innerBoxPane.setAlignmentY((float)0.0); //align to bottom
innerBoxPane.add (explaination);
innerBoxPane.add (mSearchField);
//drop down combo box
mSearchSource = new JComboBox();
mSearchSource.setAlignmentY((float)0.0); //align to bottom
for (Enumeration e = aDataSourceList.getEnumeration() ;
e.hasMoreElements() ;) {
DataSource ds = (DataSource) e.nextElement();
mSearchSource.addItem(ds.getReadableName());
}
//label
JLabel lbl = new JLabel ("in:");
lbl.setAlignmentY((float)0.0); //align to bottom
//search button
mSearchButton = new JButton ("Search");
mSearchButton.addActionListener(new Search());
mSearchButton.setAlignmentY((float)0.0); //align to bottom
Dimension spacer = new Dimension (10, 10);
//assemble all the pieces together.
Box boxPane = new Box (BoxLayout.X_AXIS);
boxPane.add (innerBoxPane); //explaination and text field
boxPane.add (Box.createRigidArea(spacer)); //spacer
boxPane.add (lbl); //"in:" label
boxPane.add (Box.createRigidArea(spacer)); //spacer
boxPane.add (mSearchSource); //drop down combo box
boxPane.add (Box.createRigidArea(spacer)); //spacer
boxPane.add (mSearchButton); //search buttton
return boxPane;
}
private JScrollPane createTable () {
String[] columnNames = {
"Name",
"Email Address",
"Organization",
"Phone",
"City",
"Nickname"};
//create the data model.
DataModel dm = new DataModel (columnNames);
//create the table.
mTable = new JTable(dm);
// mTable.setAutoCreateColumnsFromModel(false);
// Add our columns into the column model
// for (int columnIndex = 0; columnIndex < columnNames.length; columnIndex++){
// Create a column object for each column of data
// TableColumn newColumn = new TableColumn(columnNames[columnIndex]);
// Set a tool tip for the column header cell
// TableCellRenderer renderer2 = newColumn.getHeaderRenderer();
// if (renderer2 instanceof DefaultCellRenderer)
// ((DefaultCellRenderer)renderer2).setToolTipText(columnNames[columnIndex]);
// newColumn.setWidth(200);
// mTable.addColumn(newColumn);
// }
//no selection, no grid.
mTable.setColumnSelectionAllowed(false);
mTable.setShowGrid(false);
// Put the table and header into a scrollPane
JScrollPane scrollpane = new JScrollPane(mTable);
// JTableHeader tableHeader = mTable.getTableHeader();
// create and add the column heading to the scrollpane's
// column header viewport
// JViewport headerViewport = new JViewport();
// headerViewport.setLayout(new BoxLayout(headerViewport, BoxLayout.X_AXIS));
// headerViewport.add(tableHeader);
// scrollpane.setColumnHeader(headerViewport);
// add the table to the viewport
/// JViewport mainViewPort = scrollpane.getViewport();
// mainViewPort.add(mTable);
// mainViewPort.setBackground (Color.white);
// speed up resizing repaints by turning off live cell updates
// tableHeader.setUpdateTableInRealTime(false);
//return the JScrollPane with the table in it.
return scrollpane;
}
}
}