#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include 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 mRightButtonDownHandler; Callback 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 mailBlock; ::sprintf(strIndex,"(%d)",itemIndex); mailBlock.insert(&String(String("From: Sean Kessler")+strIndex+String(""))); 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 &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 &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;itemIndexaddNode(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 &mailList=mMailBlock[itemID]; if(itemID<0)return; for(int itemIndex=0;itemIndexsetText(messageString); } void POPDlg::message(Block &messageStrings) { if(!mStatusBar.isOkay())return; for(int lineIndex=0;lineIndexsetText(messageStrings[lineIndex]); }