Checking in Brian Duff's ui mods (looks great!). --talisman

git-svn-id: svn://10.0.0.236/trunk@97825 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
talisman%anamorphic.com
2001-06-23 19:23:33 +00:00
parent 2c1d4fc46a
commit a084202fee
6 changed files with 277 additions and 271 deletions

View File

@@ -18,7 +18,8 @@
* Rights Reserved.
*
* Contributor(s): Jeff Galyan <talisman@anamorphic.com>
* Edwin Woudt <edwin@woudt.nl>
* Edwin Woudt <edwin@woudt.nl>
* Brian Duff <Brian.Duff@oracle.com>
*/
package grendel.composition;
@@ -26,35 +27,50 @@ package grendel.composition;
import java.awt.*;
import javax.swing.*;
public class AddressBar extends NSTabbedPane {
/**
* The address bar is displayed at the top of the message composition panel.
* It consists of a split pane, on the left of which is the From: field
* (identity), address list and subject field, and on the right of which
* is the attachements list.
*/
public class AddressBar extends JPanel {
AddressList mAddressList;
AttachmentsList mAttachmentsList;
OptionsPanel mOptionsPanel;
public AddressBar(CompositionPanel cp) {
// address panel
ImageIcon addressIcon = new ImageIcon(getClass().getResource("images/small_address.gif"));
mAddressList = new AddressList ();
// attachments panel
ImageIcon attachmentsIcon = new ImageIcon(getClass().getResource("images/small_attachments.gif"));
mAttachmentsList = new AttachmentsList();
// options panel
ImageIcon optionsIcon = new ImageIcon(getClass().getResource("images/small_otpions.gif"));
super();
setLayout(new BorderLayout());
JSplitPane splitPane = new JSplitPane();
// options panel
mOptionsPanel = new OptionsPanel(cp);
// address panel
mAddressList = new AddressList ();
JPanel leftPanel = new JPanel();
leftPanel.setLayout(new BorderLayout(3, 3));
leftPanel.add(mOptionsPanel, BorderLayout.NORTH);
leftPanel.add(mAddressList, BorderLayout.CENTER);
splitPane.setLeftComponent(leftPanel);
// tabbed panel holds address, attachments and otpions.
addTab("", addressIcon, mAddressList);
addTab("", attachmentsIcon, mAttachmentsList);
addTab("", optionsIcon, mOptionsPanel);
setSelectedIndex(0);
setBackgroundAt(0, Color.lightGray);
setBackgroundAt(1, Color.lightGray);
setBackgroundAt(2, Color.lightGray);
setTabPlacement(LEFT);
// attachments panel
mAttachmentsList = new AttachmentsList();
JPanel rightPanel = new JPanel();
JLabel attachLabel = new JLabel("Attachments:");
rightPanel.setLayout(new BorderLayout(3,3));
rightPanel.add(attachLabel, BorderLayout.NORTH);
rightPanel.add(mAttachmentsList, BorderLayout.CENTER);
splitPane.setRightComponent(rightPanel);
add(splitPane, BorderLayout.CENTER);
}

View File

@@ -18,7 +18,8 @@
* Rights Reserved.
*
* Contributor(s): Jeff Galyan <talisman@anamorphic.com>
* Edwin Woudt <edwin@woudt.nl>
* Edwin Woudt <edwin@woudt.nl>
* Brian Duff <Brian.Duff@oracle.com>
*/
package grendel.composition;
@@ -37,11 +38,10 @@ import java.util.*;
import javax.swing.*;
import javax.swing.JTable;
//import netscape.orion.misc.*;
public class AddressList extends JScrollPane implements Serializable {
protected AddressPanel mAddressPanel;
public static final Color LINE_COLOR = new Color(200, 200, 255);
public AddressList() {
super();
@@ -56,7 +56,9 @@ public class AddressList extends JScrollPane implements Serializable {
spViewPort.add(mAddressPanel);
spViewPort.setView(mAddressPanel);
setViewport(spViewPort);
setBackground (Color.white);
// Use the textfield background color for the grid. This is
// consistent with Mozilla and looks neat on all LAFs
setBackground (UIManager.getColor("TextField.background"));
}
int mProp1 = 0;
@@ -136,6 +138,8 @@ public class AddressList extends JScrollPane implements Serializable {
protected Vector mAddressees; //Addresses
private Dimension mAddLineSize; //The size of one AddressLine. For layout.
private Dimension mPerfSize; //The preferred size of this panel = 4 * mAddLineSize.
public AddressPanel () {
super();
@@ -143,6 +147,9 @@ public class AddressList extends JScrollPane implements Serializable {
//vector for holding addressee list.
mAddressees = new Vector();
setBackground(UIManager.getColor("TextField.background"));
setOpaque(true);
//create the first addressee to start them off.
repack();
@@ -404,7 +411,7 @@ public class AddressList extends JScrollPane implements Serializable {
Dimension size = getSize();
g.setColor (Color.blue);
g.setColor (AddressList.LINE_COLOR);
//draw horizonttal lines BELOW the AddressLine gadgets.
for (int i = mAddressees.size() * mAddLineSize.height; i < size.height; i += mAddLineSize.height) {
@@ -445,6 +452,10 @@ public class AddressList extends JScrollPane implements Serializable {
//right side text field ("john_doe@company.com")
mAddressTextField = new AddressTextField (aAddressee.getText(), mDeliveryButton);
add (mAddressTextField);
// Set the background to be the same as the text field. This
// makes the overall grid look a little less messy
setBackground(mAddressTextField.getBackground());
}
protected void atfRemoveKeyListener(KeyListener kl){ mAddressTextField.removeKeyListener (kl); }
@@ -503,7 +514,7 @@ public class AddressList extends JScrollPane implements Serializable {
FontMetrics fm = g.getFontMetrics();
int buttonWidth = getButtonWidth();
g.setColor (Color.blue);
g.setColor (AddressList.LINE_COLOR);
g.drawLine (buttonWidth, 0, size.width, 0); //top
g.drawLine (buttonWidth, size.height, size.width, size.height); //bottom
}
@@ -698,58 +709,79 @@ public class AddressList extends JScrollPane implements Serializable {
return tokenArray;
}
}
//*************************
/**
* DeliveryButton displays "To:", "Cc:", etc and has a popup menu to change values.
*/
public class DeliveryButton extends JPanel implements
MouseListener, //show popup menu on mouse click
FocusListener, //display focus when tabbed to.
ActionListener, //get popup menu selection.
KeyListener { //show popup menu when focus and spacebar pressed.
private int mDeliveryMode;
// private Dimension mPerfSize = null;
private Dimension mPerfSize = new Dimension(50, 20);
private Insets mInsets = new Insets (4, 4, 4, 8);
private PopupMenu mPopup;
public DeliveryButton (int aDeliveryMode) {
//get your own mouse events for popup menu.
addMouseListener (this);
//get your own focus events for button highlight.
addFocusListener (this);
//display popup menu when in focus and spacebar pressed.
addKeyListener (this);
*/
public class DeliveryButton extends JButton implements ActionListener {
private int mDeliveryMode;
private JPopupMenu mPopup;
private Dimension mPrefSize;
private int stringWidth = 0;
public DeliveryButton(int aDeliveryMode) {
//create the popup menu..
mPopup = createPopup ();
mPopup = createPopup();
//add popup to me.
add (mPopup);
setDeliveryMode (aDeliveryMode);
setDefaultCapable(false);
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Point buttonLoc = DeliveryButton.this.getLocation();
int buttonHeight = DeliveryButton.this.getHeight();
mPopup.show(DeliveryButton.this,
buttonLoc.x, buttonLoc.y + buttonHeight);
}
});
setDeliveryMode (aDeliveryMode);
Font fnt = getFont();
setMargin(new Insets(0, 0, 0, 0));
if (null != fnt) {
FontMetrics fm = getToolkit().getFontMetrics(fnt);
if (null != fm) {
String longestString = Addressee.getLongestString();
mPrefSize = new Dimension(
fm.stringWidth(longestString) + 20, // Fudge factor.
super.getPreferredSize().height // whatever the default is
);
}
}
setIcon(new DownArrowIcon());
}
/**
* The preferred size of the button is whatever the default preferred
* height is and the preferred width of the popup menu.
*/
public Dimension getPreferredSize()
{
return mPrefSize;
}
/**
* Creates the popup menu.
*/
private PopupMenu createPopup () {
PopupMenu pm = new PopupMenu (Addressee.getDeliveryTitle());
private JPopupMenu createPopup () {
JPopupMenu pm = new JPopupMenu (Addressee.getDeliveryTitle());
//added text commands to popup
for (int i = 0; i < Addressee.mDeliveryStr.length; i++) {
MenuItem mi = new MenuItem (Addressee.mDeliveryStr[i]);
JMenuItem mi = new JMenuItem (Addressee.mDeliveryStr[i]);
pm.add (mi);
mi.addActionListener (this);
}
return pm;
}
}
/*
* Set the button delivery mode.
* @param aDeliveryMode a value like Addressee.TO or Addressee.BCC
@@ -757,6 +789,9 @@ public class AddressList extends JScrollPane implements Serializable {
*/
protected void setDeliveryMode (int aDeliveryMode) {
mDeliveryMode = aDeliveryMode;
setText(Addressee.deliveryToString(mDeliveryMode));
stringWidth = getToolkit().getFontMetrics(getFont()).stringWidth(getText());
repaint();
}
@@ -765,166 +800,42 @@ public class AddressList extends JScrollPane implements Serializable {
* @return a delivery mode a value like Addressee.TO or Addressee.BCC
* @see setDeliveryMode
*/
protected int getDeliveryMode () { return mDeliveryMode; }
public Dimension getMaximumSize() {
return getPreferredSize();
}
public Dimension getMinimumSize() {
return getPreferredSize();
}
/**
* addNotify creates the preferred size dimension because only
* after the peer has been created can we get the font metrics.
*/
/* public void addNotify () {
super.addNotify ();
if (null == mPerfSize) {
Font fnt = getFont();
if (null != fnt) {
FontMetrics fm = getToolkit().getFontMetrics(fnt);
if (null != fm) {
String longestString = Addressee.getLongestString();
mPerfSize = new Dimension(fm.stringWidth(longestString) + mInsets.left + mInsets.right,
fm.getMaxAscent() + fm.getMaxDescent() + mInsets.top + mInsets.bottom);
}
}
}
}
*/
/**
* Return PerfSize created in addNotify.
*/
public Dimension getPreferredSize() {
if (null != mPerfSize) {
return mPerfSize;
}
return new Dimension(50, 20);
}
public boolean isFocusTraversable() {
return true;
}
/**
* Display button highlight.
*/
public void focusGained(FocusEvent evt) {
repaint();
}
/**
* Remove button highlight.
*/
public void focusLost(FocusEvent evt) {
repaint();
}
/**
* Paint the button's bevels and arrow and text string (i.e. "To:")
*/
public void paint(Graphics g) {
Dimension size = getSize();
//gray background
g.setColor (Color.lightGray);
g.fillRect (0, 0, size.width - 1, size.height - 1);
//draw bezel borders
g.setColor (Color.white);
g.drawLine (0, 0, 0, size.height - 1); //top
g.drawLine (0, 0, size.width - 1, 0); //left
g.setColor (Color.black);
g.drawLine (size.width - 1, 0, size.width - 1, size.height - 1); //right
g.drawLine (0, size.height - 1, size.width - 1, size.height - 1); //bottom
//down arrow
g.setColor (Color.gray);
int xPoints[] = {0, 10, 5};
int yPoints[] = {0, 0, 10};
Polygon arrow = new Polygon (xPoints, yPoints, 3);
Rectangle arrowRect = arrow.getBounds();
int deltaX = mInsets.left;
int deltaY = (size.height - arrowRect.height)/2;
arrow.translate (deltaX, deltaY);
g.fillPolygon(arrow);
g.setColor (Color.white);
g.drawLine (xPoints[1] + deltaX,
yPoints[1] + deltaY,
xPoints[2] + deltaX,
yPoints[2] + deltaY); //right edge
//Delivery mode text (ie. "To:")
g.setColor (Color.black);
FontMetrics fm = g.getFontMetrics();
//Font height is wacky.
//g.drawString (mLabel, arrowRect.width + mInsets.left + 4, (fm.getHeight() + size.height)/2);
g.drawString (Addressee.deliveryToString(mDeliveryMode), arrowRect.width + mInsets.left + 4, fm.getHeight());
//draw focus rectangle (AWT 1.1 doesn't have support for line styles)
if (true == hasFocus()) {
final int offset = 3; //insets of focus rectangle.
//top and bottom
int bottomOffset = size.height - offset - 1;
for (int x = offset; x < size.width - offset; x += 2) {
g.drawLine (x, offset, x, offset); //top
g.drawLine (x, bottomOffset, x, bottomOffset); //bottom
}
//left and right
int rightOffset = size.width - offset - 1;
for (int y = offset; y < size.height - offset; y += 2) {
g.drawLine (offset, y, offset, y); //left
g.drawLine (rightOffset, y, rightOffset, y); //right
}
}
}
//implements KeyListener...
public void keyReleased (KeyEvent e) {}
public void keyTyped (KeyEvent e) {}
/*
* Display popup menu when spacebar pressed.
*/
public void keyPressed (KeyEvent e) {
if ((KeyEvent.KEY_PRESSED == e.getID()) &&
(KeyEvent.VK_SPACE == e.getKeyCode())) {
mPopup.show (e.getComponent (), 0, 0);
}
}
protected int getDeliveryMode () { return mDeliveryMode; }
/**
* Called when popup menu item is selected.
*/
public void actionPerformed (ActionEvent e) {
String menuCommand = e.getActionCommand();
setDeliveryMode (Addressee.deliveryToInt (menuCommand));
}
public void mouseEntered (MouseEvent e) {}
public void mouseExited (MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseClicked (MouseEvent e) {}
}
/**
* On any mouse click show the popup menu.
* Windows has bug for getX(), getY(). (UNIX OK)
* A downwards pointing arrow icon
*/
public void mousePressed (MouseEvent e) {
mPopup.show (e.getComponent (), e.getX(), e.getY());
private class DownArrowIcon implements Icon
{
// Must be odd. 7 is the same as Mozilla uses.
private final int WIDTH=7;
private final int HEIGHT = (WIDTH +1) / 2;
public int getIconHeight() {
return HEIGHT;
}
public int getIconWidth() {
return WIDTH + mPrefSize.width - 20 - stringWidth;
}
public void paintIcon(Component c, Graphics g, int x, int y) {
g.setColor(UIManager.getColor("Button.foreground"));
for (int i=0; i < HEIGHT; i++)
{
g.drawLine(x + i, y + i, x + WIDTH - i, y + i);
}
}
}
}
}

View File

@@ -25,6 +25,7 @@
* Giao Nguyen <grail@cafebabe.org>
* Edwin Woudt <edwin@woudt.nl>
* Thomas Down <thomas.down@tri.ox.ac.uk>
* Brian Duff <Brian.Duff@oracle.com>
*/
package grendel.composition;
@@ -315,6 +316,8 @@ public class CompositionPanel extends GeneralPanel {
public static final String viewAttachmentsTag ="viewAttachments";
public static final String viewOptionsTag ="viewOptions";
public static final String wrapLongLinesTag ="wrapLongLines";
// --- action implementations -----------------------------------
private UIAction[] defaultActions = {
@@ -357,9 +360,6 @@ public class CompositionPanel extends GeneralPanel {
//"View" actions
// new HideMessageToolbar(),
// new HideAddressingArea(),
new ViewAddress(),
new ViewAttachments(),
new ViewOptions(),
// new WrapLongLines()
};
@@ -851,7 +851,7 @@ public class CompositionPanel extends GeneralPanel {
//display the AttachmentsList and have the file dialog "popup" on them.
public void actionPerformed(ActionEvent e) {
mAddressBar.setSelectedIndex(1);
//mAddressBar.setSelectedIndex(1);
mAttachmentsList.showDialog();
}
}
@@ -919,39 +919,6 @@ public class CompositionPanel extends GeneralPanel {
//"View" actions
//-----------------------
class ViewAddress extends UIAction {
ViewAddress() {
super(viewAddressTag);
this.setEnabled(true);
}
public void actionPerformed(ActionEvent e) {
mAddressBar.setSelectedIndex(0);
}
}
class ViewAttachments extends UIAction {
ViewAttachments() {
super(viewAttachmentsTag);
this.setEnabled(true);
}
public void actionPerformed(ActionEvent e) {
mAddressBar.setSelectedIndex(1);
}
}
class ViewOptions extends UIAction {
ViewOptions() {
super(viewOptionsTag);
this.setEnabled(true);
}
public void actionPerformed(ActionEvent e) {
mAddressBar.setSelectedIndex(2);
}
}
/**
* Create a Toolbar
* @see addToolbarButton

View File

@@ -81,5 +81,34 @@ optionsLabel =Options
optionsAccel =O
# "options" menu definitions
optionsLabel =Options
optionsAccel =O
formatLabel =Format
formatAccel =F
fmtAskMeLabel=Ask Me
fmtAskMeAccel=A
fmtPlainTextLabel=Plain Text Only
fmtPlainTextAccel=P
fmtHTMLLabel=HTML Text Only
fmtHTMLAccel=H
fmtPlainAndHTMLLabel=Plain and HTML Text
fmtPlainAndHTMLAccel=l
priorityLabel=Priority
priorityAccel=P
priLowestLabel=Lowest
priLowestAccel=L
priLowLabel=Low
priLowAccel=o
priNormalLabel=Normal
priNormalAccel=N
priHighLabel=High
priHighAccel=H
priHighestLabel=Highest
priHighestAccel=i
returnReceiptLabel=Return Receipt
returnReceiptAccel=R
signedLabel=Signed
signedAccel=S
uuencodeLabel=Uuencode Attachments
uuencodeAccel=U

View File

@@ -18,8 +18,9 @@
* Rights Reserved.
*
* Contributor(s): Jeff Galyan <talisman@anamorphic.com>
* Giao Nguyen <grail@cafebabe.org>
* Edwin Woudt <edwin@woudt.nl>
* Giao Nguyen <grail@cafebabe.org>
* Edwin Woudt <edwin@woudt.nl>
* Brian Duff <Brian.Duff@oracle.com>
*/
package grendel.composition;
@@ -31,10 +32,70 @@ import javax.swing.*;
import javax.swing.border.*;
import grendel.prefs.base.IdentityArray;
import grendel.prefs.base.IdentityStructure;
import grendel.ui.ActionFactory;
/**
* The "OptionsPanel" is just a simple panel with a label and combobox
* containing all identities defined by the user. This serves as the
* "From:" field in the composer
*/
public class OptionsPanel extends JPanel implements Serializable {
// private final int BOX_WIDTH = 300;
protected CompositionPanel mCompositionPanel;
protected JComboBox mIdentityCombo;
public OptionsPanel(CompositionPanel cp) {
super();
mCompositionPanel = cp;
setLayout(new BorderLayout(3,3));
add(new JLabel("From:"), BorderLayout.WEST);
mIdentityCombo = createIdentityCombo();
add(mIdentityCombo, BorderLayout.CENTER);
}
private JComboBox createIdentityCombo() {
JComboBox ident = new JComboBox();
// Read all the different identities from the preferences file
IdentityArray ia = IdentityArray.GetMaster();
for (int i=0; i<ia.size(); i++) {
IdentityStructure s = ia.get(i);
ident.addItem(s.getName() +" <"+s.getEMail()+">");
}
// Select the default identity
ident.setSelectedIndex(ActionFactory.getIdent());
ident.addItemListener(new IdentityChangeListener());
return ident;
}
public int getSelectedIdentity() {
return mIdentityCombo.getSelectedIndex();
}
class IdentityChangeListener implements ItemListener {
private boolean first = true;
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == e.SELECTED) {
if (first) {
first = false;
} else {
mCompositionPanel.AddSignature();
}
}
}
}
/*
// private final int BOX_WIDTH = 300;
private final int BOX_WIDTH = 160;
private final int BOX_HEIGHT = 30;
@@ -194,5 +255,5 @@ public class OptionsPanel extends JPanel implements Serializable {
}
}
*/
}

View File

@@ -50,17 +50,39 @@
label="$appPrefsLabel" accel="$appPrefsAccel"
description=""/>
</menu>
<menu id="ViewMenu" category="view"
label="$viewLabel" accel="$viewAccel">
<menuitem id="address" category="view" action="viewAddress"
label="$addressLabel" accel="$addressAccel"
description=""/>
<menuitem id="attachments" category="view" action="viewAttachments"
label="$attachmentsLabel" accel="$attachmentsAccel"
description=""/>
<menuitem id="options" category="view" action="viewOptions"
label="$optionsLabel" accel="$optionsAccel"
description=""/>
<menu id="OptionsMenu" category="options"
label="$optionsLabel" accel="$optionsAccel">
<menu id="format" category="options" label="$formatLabel"
accel="$formatAccel" >
<menuitem id="fmtAskMe" category="options" label="$fmtAskMeLabel"
accel="$fmtAskMeAccel" type="radio" group="format" />
<menuitem id="fmtPlainText" category="options" label="$fmtPlainTextLabel"
accel="$fmtPlainTextAccel" type="radio" group="format" />
<menuitem id="fmtHTML" category="options" label="$fmtHTMLLabel"
accel="$fmtHTMLAccel" type="radio" group="format" />
<menuitem id="fmtPlainAndHTML" category="options"
label="$fmtPlainAndHTMLLabel" accel="$fmtPlainAndHTMLAccel"
type="radio" group="format"/>
</menu>
<menu id="priority" category="options" label="$priorityLabel"
accel="$priorityAccel" >
<menuitem id="priLowest" category="options" label="$priLowestLabel"
accel="$priLowestAccel" type="radio" group="priority" />
<menuitem id="priLow" category="options" label="$priLowLabel"
accel="$priLowAccel" type="radio" group="priority" />
<menuitem id="priNormal" category="options" label="$priNormalLabel"
accel="$priNormalAccel" type="radio" group="priority" />
<menuitem id="priHigh" category="options" label="$priHighLabel"
accel="$priHighAccel" type="radio" group="priority" />
<menuitem id="priHighest" category="options" label="$priHighestLabel"
accel="$priHighestAccel" type="radio" group="priority" />
</menu>
<menuitem id="returnReceipt" category="options"
label="$returnReceiptLabel" accel="$returnReceiptAccel" type="checkbox" />
<menuitem id="signed" category="options" label="$signedLabel"
accel="$signedAccel" type="checkbox" />
<menuitem id="uuencode" category="options" label="$uuencodeLabel"
accel="$uuencodeAccel" type="checkbox" />
</menu>
</menubar>
</body>