зеркало из https://github.com/mozilla/pjs.git
179 строки
4.8 KiB
Java
179 строки
4.8 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.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.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.
|
|
*
|
|
* Created: Will Scullin <scullin@netscape.com>, 6 Nov 1997.
|
|
*/
|
|
|
|
package grendel.ui;
|
|
|
|
import java.awt.Color;
|
|
import java.awt.Component;
|
|
import java.awt.Dimension;
|
|
import java.awt.Insets;
|
|
import java.util.StringTokenizer;
|
|
|
|
import javax.mail.MessagingException;
|
|
import javax.mail.Session;
|
|
import javax.mail.Store;
|
|
import javax.mail.Folder;
|
|
|
|
import javax.swing.ImageIcon;
|
|
import javax.swing.ListCellRenderer;
|
|
import javax.swing.JComboBox;
|
|
import javax.swing.JLabel;
|
|
import javax.swing.JList;
|
|
import javax.swing.border.EmptyBorder;
|
|
import javax.swing.UIManager;
|
|
|
|
import grendel.view.ViewedStore;
|
|
import grendel.view.ViewedFolder;
|
|
|
|
public class FolderCombo extends JComboBox {
|
|
int fExclude;
|
|
int fInclude;
|
|
|
|
Color fTextColor;
|
|
Color fHighlightTextColor;
|
|
Color fWindowColor;
|
|
Color fHighlightColor;
|
|
|
|
public FolderCombo() {
|
|
updateUI();
|
|
}
|
|
|
|
public void populate() {
|
|
populate(-1, 0);
|
|
}
|
|
|
|
public void populate(int aInclude, int aExclude) {
|
|
ViewedStore stores[] = StoreFactory.Instance().getStores();
|
|
fInclude = aInclude;
|
|
fExclude = aExclude;
|
|
|
|
// this hack is getting old. why do i need it in the first place?
|
|
// this sucks!
|
|
if (getItemCount() > 0) {
|
|
removeAllItems();
|
|
}
|
|
|
|
try {
|
|
for (int i = 0; i < stores.length; i++) {
|
|
populateRecurse(stores[i], fInclude, fExclude);
|
|
}
|
|
} catch (MessagingException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
int populateRecurse(ViewedFolder aFolder, int fInclude, int fExclude)
|
|
throws MessagingException {
|
|
|
|
int total = 0;
|
|
|
|
while (aFolder != null) {
|
|
int idx = getItemCount();
|
|
int count = populateRecurse(aFolder.getFirstSubFolder(),
|
|
fInclude, fExclude);
|
|
total += count;
|
|
|
|
if ((aFolder.getFolder().getType() & fInclude) != 0 &&
|
|
(aFolder.getFolder().getType() & fExclude) == 0) {
|
|
insertItemAt(aFolder, idx);
|
|
total++;
|
|
} else if (count > 0) {
|
|
insertItemAt(aFolder, idx);
|
|
total++;
|
|
}
|
|
aFolder = aFolder.getNextFolder();
|
|
}
|
|
|
|
return total;
|
|
}
|
|
|
|
public ViewedFolder getSelectedFolder() {
|
|
return (ViewedFolder) getSelectedItem();
|
|
}
|
|
|
|
class FolderRenderer extends JLabel implements ListCellRenderer {
|
|
public FolderRenderer() {
|
|
setIcon(new ImageIcon(getClass().getResource("/grendel/ui/images/folder-small.gif")));
|
|
setOpaque(true);
|
|
}
|
|
|
|
public Component getListCellRendererComponent(JList aList,
|
|
Object aValue,
|
|
int aIndex,
|
|
boolean aIsSelected,
|
|
boolean aHasFocus) {
|
|
boolean isEnabled = true;
|
|
|
|
Folder folder = null;
|
|
|
|
if (aValue != null) {
|
|
folder = ((ViewedFolder) aValue).getFolder();
|
|
}
|
|
|
|
if (folder != null) {
|
|
try {
|
|
StringTokenizer counter =
|
|
new StringTokenizer(folder.getFullName(),
|
|
"" +
|
|
folder.getSeparator());
|
|
|
|
int depth = counter.countTokens();
|
|
setBorder(new EmptyBorder(0, depth * 16, 0, 0));
|
|
setText(folder.getName());
|
|
|
|
if ((folder.getType() & fInclude) == 0 ||
|
|
(folder.getType() & fExclude) != 0) {
|
|
isEnabled = false;
|
|
}
|
|
} catch (MessagingException e) {
|
|
e.printStackTrace();
|
|
}
|
|
} else {
|
|
setText("");
|
|
}
|
|
|
|
this.setEnabled(isEnabled);
|
|
|
|
if (aIsSelected) {
|
|
setBackground(fHighlightColor);
|
|
setForeground(fHighlightTextColor);
|
|
} else {
|
|
setBackground(fWindowColor);
|
|
setForeground(fTextColor);
|
|
}
|
|
|
|
return this;
|
|
}
|
|
}
|
|
|
|
public void updateUI() {
|
|
super.updateUI();
|
|
|
|
fTextColor = UIManager.getColor("textText");
|
|
fHighlightTextColor = UIManager.getColor("textHighlightText");
|
|
fWindowColor = UIManager.getColor("window");
|
|
fHighlightColor = UIManager.getColor("textHighlight");
|
|
|
|
setRenderer(new FolderRenderer());
|
|
}
|
|
}
|
|
|