package thaw.plugins.miniFrost;
import javax.swing.JSplitPane;
import javax.swing.JComponent;
import java.util.Observer;
import java.util.Observable;
import java.util.Vector;
import java.util.Iterator;
import thaw.core.Config;
import thaw.plugins.Hsqldb;
import thaw.plugins.MiniFrost;
import thaw.plugins.miniFrost.interfaces.Board;
import thaw.plugins.miniFrost.interfaces.Draft;
/**
* Some explanations :<br/>
* At the beginning, I wanted to the UI like Frost, with a board tree,
* etc. In the end, a board list is enought <br/>
* So:
* <ul>
* <li>BoardTree => Board list</li>
* </ul>
*/
public class MiniFrostPanel implements Observer {
public final static int DEFAULT_VIEW = 0; /* 0 = Gmail ; 1 = Outlook */
private Config config;
private Hsqldb db;
private BoardTree boardTree;
private MessageTreeTable messageTreeTable;
private MessagePanel messagePanel;
private DraftPanel draftPanel;
private MiniFrost pluginCore;
private boolean gmailView = true;
private JSplitPane mainSplit = null;
private JSplitPane rightSplit = null;
public MiniFrostPanel(Config config, Hsqldb db, MiniFrost pluginCore) {
this.config = config;
this.db = db;
this.pluginCore = pluginCore;
gmailView = (DEFAULT_VIEW == 0);
if (config.getValue("miniFrostView") != null
&& "1".equals(config.getValue("miniFrostView")))
gmailView = false;
/* board tree use some settings provided by the message tree table
* to count the unread messages => it must instanciated after */
messageTreeTable = new MessageTreeTable(this);
boardTree = new BoardTree(this);
messagePanel = new MessagePanel(this);
draftPanel = new DraftPanel(this);
boardTree.addObserver(messageTreeTable);
boardTree.addObserver(this);
JComponent mainComponent;
if (gmailView) {
mainComponent = messageTreeTable.getPanel();
rightSplit = null;
} else {
rightSplit = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
messageTreeTable.getPanel(),
messagePanel.getPanel());
mainComponent = rightSplit;
}
mainSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
boardTree.getPanel(),
mainComponent);
}
public void displayDraftPanel() {
saveState();
messagePanel.hided();
messageTreeTable.hided();
if (gmailView)
mainSplit.setRightComponent(draftPanel.getPanel());
else
rightSplit.setRightComponent(draftPanel.getPanel());
//mainSplit.validate();
draftPanel.redisplayed();
loadState();
}
public void displayMessageTable() {
saveState();
messagePanel.hided();
draftPanel.hided();
if (gmailView)
mainSplit.setRightComponent(messageTreeTable.getPanel());
else {
rightSplit.setLeftComponent(messageTreeTable.getPanel());
rightSplit.setRightComponent(messagePanel.getPanel());
}
//mainSplit.validate();
messageTreeTable.redisplayed();
loadState();
}
public void displayMessage() {
saveState();
messageTreeTable.hided();
draftPanel.hided();
if (gmailView)
mainSplit.setRightComponent(messagePanel.getPanel());
else
rightSplit.setRightComponent(messagePanel.getPanel());
messagePanel.redisplayed();
//mainSplit.validate();
if (messagePanel.getMessage() != null
&& !messagePanel.getMessage().isRead()) {
messagePanel.getMessage().setRead(true);
int row = messageTreeTable.getRow(messagePanel.getMessage());
if (row >= 0)
messageTreeTable.refresh(row);
else
messageTreeTable.refresh();
boardTree.refresh(messagePanel.getMessage().getBoard());
}
messagePanel.redisplayed();
loadState();
}
/**
* notify major changes : board added / removed
*/
public void notifyChange() {
boardTree.refresh();
}
/**
* notify a change on this board. usually
* that a new non-read message has been added
*/
public void notifyChange(Board board) {
boardTree.refresh(board);
if (board == messageTreeTable.getBoard()) {
messageTreeTable.refresh();
}
}
public MiniFrost getPluginCore() {
return pluginCore;
}
public JSplitPane getPanel() {
return mainSplit;
}
public Config getConfig() {
return config;
}
public Hsqldb getDb() {
return db;
}
public BoardTree getBoardTree() {
return boardTree;
}
public MessageTreeTable getMessageTreeTable() {
return messageTreeTable;
}
public MessagePanel getMessagePanel() {
return messagePanel;
}
public DraftPanel getDraftPanel() {
return draftPanel;
}
public void loadState() {
String val;
mainSplit.setResizeWeight(0.5);
if ((val = config.getValue("miniFrostMainSplitPosition")) != null)
mainSplit.setDividerLocation(Integer.parseInt(val));
else
mainSplit.setDividerLocation(150);
if (rightSplit != null) {
rightSplit.setResizeWeight(0.5);
if ((val = config.getValue("miniFrostRightSplitPosition")) != null)
rightSplit.setDividerLocation(Integer.parseInt(val));
else
rightSplit.setDividerLocation(150);
}
boardTree.loadState();
}
public void saveState() {
config.setValue("miniFrostMainSplitPosition",
Integer.toString(mainSplit.getDividerLocation()));
if (rightSplit != null) {
config.setValue("miniFrostRightSplitPosition",
Integer.toString(rightSplit.getDividerLocation()));
}
boardTree.saveState();
}
public void update(Observable o, Object param) {
if (o == boardTree) {
displayMessageTable();
}
}
private Vector drafts = null;
public void update(Draft draft) {
if (drafts == null)
drafts = new Vector();
if (!draft.isPosting() && !draft.isWaiting())
drafts.remove(draft);
else if (drafts.indexOf(draft) < 0)
drafts.add(draft);
int waitings = 0;
int postings = 0;
for (Iterator it = drafts.iterator();
it.hasNext();) {
Draft draftIt = (Draft)it.next();
if (draftIt.isPosting()) postings++;
if (draftIt.isWaiting()) waitings++;
}
boardTree.updateDraftValues(waitings, postings);
}
public Vector getDrafts() {
return drafts;
}
public boolean isInGmailView() {
return gmailView;
}
public void setVisible(boolean v) {
if (v) {
boardTree.getToolbarModifier().displayButtonsInTheToolbar();
} else {
boardTree.getToolbarModifier().hideButtonsInTheToolbar();
}
}
}