/* -*- 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): * * Created: Will Scullin , 6 Nov 1997. * * Contributors: Jeff Galyan * Giao Nguyen * Edwin Woudt */ 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()); } }