422 lines
13 KiB
C++
422 lines
13 KiB
C++
#include <pop/popdlg.hpp>
|
|
#include <pop/srvrdlg.hpp>
|
|
#include <pop/popclnt.hpp>
|
|
#include <pop/srvrreg.hpp>
|
|
#include <pop/logindlg.hpp>
|
|
#include <pop/header.hpp>
|
|
#include <pop/mail.hpp>
|
|
#include <pop/drgsprt.hpp>
|
|
#include <common/systime.hpp>
|
|
#include <common/opendlg.hpp>
|
|
#include <common/purehdc.hpp>
|
|
#include <common/crsctrl.hpp>
|
|
#include <common/brush.hpp>
|
|
#include <statbar/statbar.hpp>
|
|
#include <imagelst/ftree.hpp>
|
|
#include <imagelst/tvmsghdr.hpp>
|
|
#include <imagelst/imgeinfo.hpp>
|
|
#include <imagelst/hittest.hpp>
|
|
|
|
POPDlg::POPDlg(void)
|
|
: mIsInDrag(FALSE), mhItemDrop(0), mhItemDrag(0)
|
|
{
|
|
mInitHandler.setCallback(this,&POPDlg::initHandler);
|
|
mDestroyHandler.setCallback(this,&POPDlg::destroyHandler);
|
|
mCommandHandler.setCallback(this,&POPDlg::commandHandler);
|
|
mCloseHandler.setCallback(this,&POPDlg::closeHandler);
|
|
mDlgCodeHandler.setCallback(this,&POPDlg::dlgCodeHandler);
|
|
mMailSelChangedHandler.setCallback(this,&POPDlg::mailSelChangedHandler);
|
|
mMailBeginDragHandler.setCallback(this,&POPDlg::mailBeginDragHandler);
|
|
mFolderBeginDragHandler.setCallback(this,&POPDlg::folderBeginDragHandler);
|
|
mMouseMoveHandler.setCallback(this,&POPDlg::mouseMoveHandler);
|
|
mLeftButtonUpHandler.setCallback(this,&POPDlg::leftButtonUpHandler);
|
|
|
|
Callback<POPDlg> mRightButtonDownHandler;
|
|
Callback<POPDlg> mRightButtonUpHandler;
|
|
|
|
DWindow::insertHandler(VectorHandler::InitDialogHandler,&mInitHandler);
|
|
DWindow::insertHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
|
|
DWindow::insertHandler(VectorHandler::CommandHandler,&mCommandHandler);
|
|
DWindow::insertHandler(VectorHandler::CloseHandler,&mCloseHandler);
|
|
DWindow::insertHandler(VectorHandler::DialogCodeHandler,&mDlgCodeHandler);
|
|
DWindow::insertHandler(VectorHandler::MouseMoveHandler,&mMouseMoveHandler);
|
|
DWindow::insertHandler(VectorHandler::LeftButtonUpHandler,&mLeftButtonUpHandler);
|
|
}
|
|
|
|
POPDlg::~POPDlg()
|
|
{
|
|
DWindow::removeHandler(VectorHandler::InitDialogHandler,&mInitHandler);
|
|
DWindow::removeHandler(VectorHandler::DestroyHandler,&mDestroyHandler);
|
|
DWindow::removeHandler(VectorHandler::CommandHandler,&mCommandHandler);
|
|
DWindow::removeHandler(VectorHandler::CloseHandler,&mCloseHandler);
|
|
DWindow::removeHandler(VectorHandler::DialogCodeHandler,&mDlgCodeHandler);
|
|
DWindow::removeHandler(VectorHandler::MouseMoveHandler,&mMouseMoveHandler);
|
|
DWindow::removeHandler(VectorHandler::LeftButtonUpHandler,&mLeftButtonUpHandler);
|
|
}
|
|
|
|
POPDlg &POPDlg::operator=(const POPDlg &/*somePOPDlg*/)
|
|
{ // private implementation
|
|
return *this;
|
|
}
|
|
|
|
BOOL POPDlg::perform(void)
|
|
{
|
|
return ::DialogBoxParam(processInstance(),(LPSTR)"POPCLIENT",(HWND)0,DWindow::DlgProc,(LPARAM)(DWindow*)this);
|
|
}
|
|
|
|
CallbackData::ReturnType POPDlg::initHandler(CallbackData &/*someCallbackData*/)
|
|
{
|
|
mStatusBar=new StatusBar(*this);
|
|
mFolderTree=new FolderTree(*this,Rect(xFolder,yFolder,cxFolder,cyFolder),110);
|
|
mFolderTree->insertHandler(FolderTree::BeginDragHandler,&mFolderBeginDragHandler);
|
|
mMailTree=new FolderTree(*this,Rect(xMail,yMail,cxMail,cyMail),111);
|
|
mMailTree->insertHandler(FolderTree::SelChangedHandler,&mMailSelChangedHandler);
|
|
mMailTree->insertHandler(FolderTree::BeginDragHandler,&mMailBeginDragHandler);
|
|
mFolderTree.disposition(PointerDisposition::Delete);
|
|
mMailTree.disposition(PointerDisposition::Delete);
|
|
mStatusBar.disposition(PointerDisposition::Delete);
|
|
getMail();
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType POPDlg::destroyHandler(CallbackData &/*someCallbackData*/)
|
|
{
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType POPDlg::dlgCodeHandler(CallbackData &/*someCallbackData*/)
|
|
{
|
|
return (CallbackData::ReturnType)DLGC_WANTARROWS|DLGC_WANTCHARS;
|
|
}
|
|
|
|
CallbackData::ReturnType POPDlg::commandHandler(CallbackData &someCallbackData)
|
|
{
|
|
switch(someCallbackData.wmCommandID())
|
|
{
|
|
case IDOK :
|
|
break;
|
|
case IDCANCEL :
|
|
endDialog(FALSE);
|
|
break;
|
|
case Server :
|
|
handleServer(someCallbackData);
|
|
break;
|
|
case GetMail :
|
|
getMail();
|
|
break;
|
|
}
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType POPDlg::closeHandler(CallbackData &/*someCallbackData*/)
|
|
{
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType POPDlg::mouseMoveHandler(CallbackData &someCallbackData)
|
|
{
|
|
if(!mIsInDrag)return (CallbackData::ReturnType)FALSE;
|
|
GDIPoint mousePoint(someCallbackData.loWord(),someCallbackData.hiWord());
|
|
mImageList.dragMove(GDIPoint(mousePoint.x(),mousePoint.y()+::GetSystemMetrics(SM_CYCAPTION)));
|
|
handleFolderDrag();
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType POPDlg::leftButtonUpHandler(CallbackData &/*someCallbackData*/)
|
|
{
|
|
if(!mIsInDrag)return (CallbackData::ReturnType)FALSE;
|
|
mIsInDrag=FALSE;
|
|
mImageList.dragLeave(*this);
|
|
mImageList.endDrag();
|
|
mImageList=(HIMAGELIST)0;
|
|
copyItem(mhItemDrag,mhItemDrop);
|
|
mMailTree->remove(mhItemDrag);
|
|
mFolderTree->selectDropTarget((HTREEITEM)0);
|
|
releaseCapture();
|
|
mhItemDrag=0;
|
|
mhItemDrop=0;
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType POPDlg::mailBeginDragHandler(CallbackData &someCallbackData)
|
|
{
|
|
#if 0
|
|
GDIPoint ptAction;
|
|
HitTestInfo hitInfo;
|
|
|
|
mIsInDrag=TRUE;
|
|
::GetCursorPos(&((POINT&)ptAction));
|
|
::ScreenToClient(mMailTree->getControlWnd(),&((POINT&)ptAction));
|
|
hitInfo.point(ptAction);
|
|
mhItemDrag=mMailTree->hitTest(hitInfo);
|
|
mMailTree->selectItem(mhItemDrag);
|
|
mhItemDrag=hitInfo.item();
|
|
mImageList=mMailTree->createDragImage(mhItemDrag);
|
|
mImageList.dragShowNoLock(TRUE);
|
|
mImageList.setDragCursorImage(0,GDIPoint());
|
|
mImageList.beginDrag(0,GDIPoint());
|
|
::GetCursorPos(&((POINT&)ptAction));
|
|
::ScreenToClient(*this,&((POINT&)ptAction));
|
|
ptAction.y(ptAction.y()+::GetSystemMetrics(SM_CYCAPTION));
|
|
mImageList.dragMove(ptAction);
|
|
mImageList.dragEnter(*this,ptAction);
|
|
setCapture();
|
|
#endif
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType POPDlg::mailSelChangedHandler(CallbackData &someCallbackData)
|
|
{
|
|
String itemID;
|
|
|
|
::sprintf(itemID,"index:%d type:%d\n",someCallbackData.loWord()-1,someCallbackData.hiWord());
|
|
::OutputDebugString(itemID);
|
|
// TreeViewMessageHeader &treeViewMessageHeader=*((TreeViewMessageHeader*)someCallbackData.lParam());
|
|
// setDisplay(someCallbackData.loWord()-1);
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType POPDlg::rightButtonUpHandler(CallbackData &someCallbackData)
|
|
{
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType POPDlg::rightButtonDownHandler(CallbackData &someCallbackData)
|
|
{
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType POPDlg::folderBeginDragHandler(CallbackData &someCallbackData)
|
|
{
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
void POPDlg::handleFolderDrag(void)
|
|
{
|
|
HTREEITEM hItemDrop;
|
|
HitTestInfo hitInfo;
|
|
GDIPoint ptAction;
|
|
|
|
::GetCursorPos(&((POINT&)ptAction));
|
|
::ScreenToClient((HWND)(*mFolderTree),&((POINT&)ptAction));
|
|
hitInfo.point(ptAction);
|
|
if(0!=(hItemDrop=mFolderTree->hitTest(hitInfo)))
|
|
{
|
|
mImageList.dragLeave(*this);
|
|
mFolderTree->selectDropTarget(hItemDrop);
|
|
mhItemDrop=hItemDrop;
|
|
::GetCursorPos(&((POINT&)ptAction));
|
|
::ScreenToClient(*this,&((POINT&)ptAction));
|
|
ptAction.y(ptAction.y()+::GetSystemMetrics(SM_CYCAPTION));
|
|
mImageList.dragEnter(*this,ptAction);
|
|
}
|
|
}
|
|
|
|
void POPDlg::copyItem(HTREEITEM hDragItem,HTREEITEM hDropItem)
|
|
{
|
|
TreeViewInsert tvInsert;
|
|
TreeViewItem tvItem;
|
|
String strItem;
|
|
|
|
strItem.length(String::MaxString);
|
|
tvItem.item(hDragItem);
|
|
tvItem.maxText(String::MaxString);
|
|
tvItem.text(strItem);
|
|
tvItem.mask(TreeViewItem::MaskChildren|TreeViewItem::MaskHandle|TreeViewItem::MaskImage|TreeViewItem::MaskSelectedImage|TreeViewItem::MaskText);
|
|
mMailTree->getItem(tvItem);
|
|
tvInsert.parent(hDropItem);
|
|
tvInsert.insertAfter(TreeViewInsert::InsertSort);
|
|
tvInsert.viewItem(tvItem);
|
|
mFolderTree->insertItem(tvInsert);
|
|
mMailTree->invalidate();
|
|
mMailTree->update();
|
|
mFolderTree->invalidate();
|
|
mFolderTree->update();
|
|
return;
|
|
}
|
|
|
|
void POPDlg::handleServer(CallbackData &someCallbackData)
|
|
{
|
|
ServerDialog serverDialog(*this);
|
|
serverDialog.performDialog();
|
|
}
|
|
|
|
void POPDlg::getMail(void)
|
|
{
|
|
retrieveMail();
|
|
populateMail();
|
|
populateFolders();
|
|
}
|
|
|
|
#if 0
|
|
void POPDlg::retrieveMail(void)
|
|
{
|
|
mMailBlock.remove();
|
|
|
|
for(int itemIndex=0;itemIndex<20;itemIndex++)
|
|
{
|
|
String strIndex;
|
|
Block<String> mailBlock;
|
|
::sprintf(strIndex,"(%d)",itemIndex);
|
|
mailBlock.insert(&String(String("From: Sean Kessler")+strIndex+String("<europa@li.net>")));
|
|
mailBlock.insert(&String(" "));
|
|
mailBlock.insert(&String("Sean Kessler wrote:"));
|
|
mailBlock.insert(&strIndex);
|
|
mMailBlock.insert(&Mail(mailBlock));
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if 0
|
|
void POPDlg::retrieveMail(void)
|
|
{
|
|
POPClient popClient;
|
|
ServerReg serverReg;
|
|
WORD messages;
|
|
WORD octets;
|
|
|
|
mMailBlock.remove();
|
|
if(!handleLoginParams(serverReg)){userMessage("Incorrect Login.");return;}
|
|
if(!popClient.open(serverReg.serverName())){userMessage("Connect Failed..");return;}
|
|
if(!popClient.authenticate(serverReg.userName(),serverReg.password()))
|
|
{
|
|
popClient.quit();
|
|
popClient.close();
|
|
userMessage("Authentication Failed.");
|
|
return;
|
|
}
|
|
popClient.stat(messages,octets);
|
|
if(!messages){userMessage("No Messages.");return;}
|
|
for(int msgIndex=1;msgIndex<=messages;msgIndex++)
|
|
{
|
|
mMailBlock.insert(&Mail());
|
|
Block<String> &msgLines=mMailBlock[mMailBlock.size()-1];
|
|
Header &mailHeader=mMailBlock[mMailBlock.size()-1];
|
|
popClient.retrieve(msgIndex,msgLines);
|
|
mailHeader=msgLines;
|
|
if(!msgLines.size())continue;
|
|
}
|
|
popClient.quit();
|
|
popClient.close();
|
|
}
|
|
#endif
|
|
|
|
|
|
void POPDlg::retrieveMail(void)
|
|
{
|
|
POPClient popClient;
|
|
ServerReg serverReg;
|
|
WORD messages;
|
|
WORD octets;
|
|
|
|
mMailBlock.remove();
|
|
if(!handleLoginParams(serverReg)){userMessage("Incorrect Login.");return;}
|
|
if(!popClient.open(serverReg.serverName())){userMessage("Connect Failed..");return;}
|
|
if(!popClient.authenticate(serverReg.userName(),serverReg.password()))
|
|
{
|
|
popClient.quit();
|
|
popClient.close();
|
|
userMessage("Authentication Failed.");
|
|
return;
|
|
}
|
|
popClient.stat(messages,octets);
|
|
if(!messages)::MessageBox(*this,"No Messages","POPCLIENT",MB_OK);
|
|
else
|
|
{
|
|
String strCount;
|
|
::sprintf(strCount,"%d message(s)",messages);
|
|
::MessageBox(*this,strCount,"POPCLIENT",MB_OK);
|
|
}
|
|
// for(int msgIndex=1;msgIndex<=messages;msgIndex++)
|
|
// {
|
|
// mMailBlock.insert(&Mail());
|
|
// Block<String> &msgLines=mMailBlock[mMailBlock.size()-1];
|
|
// Header &mailHeader=mMailBlock[mMailBlock.size()-1];
|
|
// popClient.retrieve(msgIndex,msgLines);
|
|
// mailHeader=msgLines;
|
|
// if(!msgLines.size())continue;
|
|
// }
|
|
popClient.quit();
|
|
popClient.close();
|
|
}
|
|
|
|
BOOL POPDlg::handleLoginParams(ServerReg &serverReg)
|
|
{
|
|
if(serverReg.serverName().isNull()){::MessageBox(*this,(LPSTR)"No Server Defined",(LPSTR)"SERVER ERROR",MB_ICONSTOP);return FALSE;}
|
|
if(serverReg.userName().isNull()||serverReg.password().isNull())
|
|
{
|
|
String userName;
|
|
String password;
|
|
LoginDialog loginDialog;
|
|
if(!loginDialog.performLogin())return FALSE;
|
|
userName=loginDialog.userName();
|
|
password=loginDialog.password();
|
|
serverReg.userName(userName);
|
|
serverReg.password(password);
|
|
}
|
|
if(serverReg.userName().isNull()||serverReg.password().isNull())return FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
void POPDlg::populateMail(void)
|
|
{
|
|
String strMailBox(STRING_MAILBOXNAME);
|
|
|
|
mMailTree->setRedraw(FALSE);
|
|
mMailTree->remove();
|
|
mMailTree->addRootNode(FolderTree::FolderClosed,strMailBox,makeItemID(NullNode,RootID));
|
|
for(int itemIndex=0;itemIndex<mMailBlock.size();itemIndex++)
|
|
{
|
|
TreeViewItem insertItem(0,0,0,0,(LPSTR)mMailBlock[itemIndex].from(),mMailBlock[itemIndex].from().length(),3,3,0,makeItemID(MailNode,itemIndex+1));
|
|
mMailTree->addNode(TreeView::NodeChild,insertItem,strMailBox);
|
|
}
|
|
mMailTree->setRedraw(TRUE);
|
|
}
|
|
|
|
void POPDlg::populateFolders(void)
|
|
{
|
|
String strUserFolder(STRING_USERFOLDERNAME);
|
|
String strMainFolder("Main Folder");
|
|
|
|
mFolderTree->setRedraw(FALSE);
|
|
mFolderTree->remove();
|
|
mFolderTree->addRootNode(FolderTree::FolderClosed,strUserFolder,makeItemID(NullNode,RootID));
|
|
TreeViewItem insertItem(0,0,0,0,(LPSTR)strMainFolder,strMainFolder.length(),3,3,0,makeItemID(MailNode,1));
|
|
mFolderTree->addNode(TreeView::NodeChild,insertItem,strUserFolder);
|
|
mFolderTree->setRedraw(TRUE);
|
|
}
|
|
|
|
void POPDlg::setDisplay(int itemID)
|
|
{
|
|
String lineItem;
|
|
Block<String> &mailList=mMailBlock[itemID];
|
|
|
|
if(itemID<0)return;
|
|
for(int itemIndex=0;itemIndex<mailList.size();itemIndex++)
|
|
{
|
|
lineItem+=mailList[itemIndex];
|
|
lineItem+="\r\n";
|
|
}
|
|
setText(EditControl,(LPSTR)lineItem);
|
|
}
|
|
|
|
void POPDlg::userMessage(const String &message)
|
|
{
|
|
::MessageBox(*this,(LPSTR)(String&)message,(LPSTR)"POPClient",MB_OK);
|
|
}
|
|
|
|
// **************** virtuals
|
|
|
|
void POPDlg::message(const String &messageString)
|
|
{
|
|
if(!mStatusBar.isOkay())return;
|
|
mStatusBar->setText(messageString);
|
|
}
|
|
|
|
void POPDlg::message(Block<String> &messageStrings)
|
|
{
|
|
if(!mStatusBar.isOkay())return;
|
|
for(int lineIndex=0;lineIndex<messageStrings.size();lineIndex++)
|
|
mStatusBar->setText(messageStrings[lineIndex]);
|
|
}
|