239 lines
7.7 KiB
C++
239 lines
7.7 KiB
C++
#include <browse/brwsview.hpp>
|
|
#include <browse/thmbnail.hpp>
|
|
#include <mediapak/entryinf.hpp>
|
|
#include <bsptree/btree.hpp>
|
|
#include <statbar/statbarx.hpp>
|
|
#include <common/crsctrl.hpp>
|
|
#include <common/pathfnd.hpp>
|
|
#include <common/brush.hpp>
|
|
#include <common/pen.hpp>
|
|
|
|
BrowseView::BrowseView(void)
|
|
{
|
|
mCreateHandler.setCallback(this,&BrowseView::createHandler);
|
|
mSizeHandler.setCallback(this,&BrowseView::sizeHandler);
|
|
mPaintHandler.setCallback(this,&BrowseView::paintHandler);
|
|
mHorizontalScrollHandler.setCallback(this,&BrowseView::horizontalScrollHandler);
|
|
mVerticalScrollHandler.setCallback(this,&BrowseView::verticalScrollHandler);
|
|
mLeftButtonDoubleHandler.setCallback(this,&BrowseView::leftButtonDoubleHandler);
|
|
insertHandler(VectorHandler::CreateHandler,&mCreateHandler);
|
|
insertHandler(VectorHandler::SizeHandler,&mSizeHandler);
|
|
insertHandler(VectorHandler::PaintHandler,&mPaintHandler);
|
|
insertHandler(VectorHandler::VerticalScrollHandler,&mVerticalScrollHandler);
|
|
insertHandler(VectorHandler::HorizontalScrollHandler,&mHorizontalScrollHandler);
|
|
insertHandler(VectorHandler::LeftButtonDoubleHandler,&mLeftButtonDoubleHandler);
|
|
}
|
|
|
|
BrowseView::~BrowseView()
|
|
{
|
|
removeHandler(VectorHandler::CreateHandler,&mCreateHandler);
|
|
removeHandler(VectorHandler::SizeHandler,&mSizeHandler);
|
|
removeHandler(VectorHandler::PaintHandler,&mPaintHandler);
|
|
removeHandler(VectorHandler::VerticalScrollHandler,&mVerticalScrollHandler);
|
|
removeHandler(VectorHandler::HorizontalScrollHandler,&mHorizontalScrollHandler);
|
|
removeHandler(VectorHandler::LeftButtonDoubleHandler,&mLeftButtonDoubleHandler);
|
|
}
|
|
|
|
CallbackData::ReturnType BrowseView::createHandler(CallbackData &someCallbackData)
|
|
{
|
|
mScrollInfo.hwndOwner(*this);
|
|
setTitle("None");
|
|
return FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType BrowseView::sizeHandler(CallbackData &someCallbackData)
|
|
{
|
|
if(mThumbPage.rowItems()!=mThumbPage.rowItems(*this))
|
|
{
|
|
CursorControl cursorControl;
|
|
cursorControl.waitCursor(true);
|
|
mThumbPage.isDirty(true);
|
|
mThumbPage.update(*this);
|
|
mScrollInfo.scrollableObjectDimensions(mThumbPage.width(),mThumbPage.height());
|
|
cursorControl.waitCursor(false);
|
|
}
|
|
mScrollInfo.handleSize(someCallbackData);
|
|
return FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType BrowseView::paintHandler(CallbackData &someCallbackData)
|
|
{
|
|
PaintInformation &paintInfo=*((PaintInformation*)someCallbackData.lParam());
|
|
PureDevice &paintDevice=(PureDevice&)paintInfo;
|
|
if(mScrollInfo.sizeEvent())
|
|
{
|
|
mScrollInfo.sizeEvent(FALSE);
|
|
mThumbPage.draw(paintDevice,Rect(0,0,mThumbPage.width(),mThumbPage.height()),Point(mScrollInfo.currScrollx(),mScrollInfo.currScrolly()));
|
|
}
|
|
if(mScrollInfo.scrollEvent()||(!mScrollInfo.sizeEvent()&&!mScrollInfo.scrollEvent()))
|
|
{
|
|
Rect paintRect(paintInfo.paintRect());
|
|
mScrollInfo.scrollEvent(FALSE);
|
|
paintRect.right(paintRect.right()-paintRect.left());
|
|
paintRect.bottom((paintRect.bottom()-paintRect.top()));
|
|
mThumbPage.draw(paintDevice,paintRect,Point(paintRect.left()+mScrollInfo.currScrollx(),paintRect.top()+mScrollInfo.currScrolly()));
|
|
}
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType BrowseView::verticalScrollHandler(CallbackData &someCallbackData)
|
|
{
|
|
mScrollInfo.handleVerticalScroll(someCallbackData);
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType BrowseView::horizontalScrollHandler(CallbackData &someCallbackData)
|
|
{
|
|
mScrollInfo.handleHorizontalScroll(someCallbackData);
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
CallbackData::ReturnType BrowseView::leftButtonDoubleHandler(CallbackData &someCallbackData)
|
|
{
|
|
Point clickPoint(someCallbackData.loWord(),someCallbackData.hiWord());
|
|
CallbackData callbackData;
|
|
String strPathFileName;
|
|
String strItemName;
|
|
|
|
clickPoint.x(clickPoint.x()+mScrollInfo.currScrollx());
|
|
clickPoint.y(clickPoint.y()+mScrollInfo.currScrolly());
|
|
if(!mThumbPage.hitTest(*this,clickPoint,strItemName))return (CallbackData::ReturnType)FALSE;
|
|
strPathFileName=getTitle()+String("\\")+strItemName;
|
|
::OutputDebugString(strPathFileName+String("\n"));
|
|
callbackData.lParam(int((char*)strPathFileName));
|
|
mSelectHandler.callback(callbackData);
|
|
return (CallbackData::ReturnType)FALSE;
|
|
}
|
|
|
|
bool BrowseView::browse(const String &strPathDirectory)
|
|
{
|
|
CursorControl cursorControl;
|
|
Block<String> strPathFileNames;
|
|
PureDevice pureDevice(*this);
|
|
PakEntry pakEntry;
|
|
|
|
String strMessage;
|
|
DWORD elapsedTime;
|
|
|
|
|
|
setTitle(strPathDirectory);
|
|
if(strPathDirectory.isNull())return FALSE;
|
|
cursorControl.waitCursor(true);
|
|
getDirectoryFileNames(strPathDirectory,strPathFileNames);
|
|
mMediaPak.open(strPathDirectory+String(".pak"),MediaPak::OpenAlways);
|
|
if(mMediaPak.entries())
|
|
{
|
|
elapsedTime=::GetTickCount();
|
|
|
|
PakEntry pakEntry;
|
|
DWORD pakEntries=mMediaPak.entries();
|
|
for(int index=0;index<pakEntries;index++)
|
|
{
|
|
mMediaPak.getEntry(pakEntry,index);
|
|
mThumbPage.insert(pakEntry,pureDevice);
|
|
}
|
|
merge(mMediaPak,strPathFileNames,strPathDirectory,pureDevice);
|
|
::sprintf(strMessage,"Load took %d seconds\n",(::GetTickCount()-elapsedTime)/1000);
|
|
::OutputDebugString(strMessage);
|
|
}
|
|
else
|
|
{
|
|
for(int index=0;index<strPathFileNames.size();index++)
|
|
{
|
|
GlobalData<BYTE> rawData;
|
|
PakEntry pakEntry;
|
|
|
|
String strPathFileName(strPathDirectory+String("\\")+strPathFileNames[index]);
|
|
mThumbPage.insert(strPathFileName,pureDevice);
|
|
mThumbPage[mThumbPage.entries()-1].getRawData(rawData);
|
|
pakEntry.type(PakEntry::Blob);
|
|
pakEntry.name(strPathFileNames[index]);
|
|
pakEntry.id(mMediaPak.entries());
|
|
pakEntry.rawData(rawData);
|
|
mMediaPak.add(pakEntry);
|
|
}
|
|
}
|
|
mThumbPage.update(*this);
|
|
mScrollInfo.scrollableObjectDimensions(mThumbPage.width(),mThumbPage.height());
|
|
cursorControl.waitCursor(false);
|
|
invalidate(false);
|
|
return TRUE;
|
|
}
|
|
|
|
void BrowseView::merge(MediaPak &mediaPak,Block<String> &strPathDirFileNames,const String &strPathDirectory,PureDevice &pureDevice)
|
|
{
|
|
BTree<String> strPathFileNames;
|
|
EntryInfo entryInfo;
|
|
String strFound;
|
|
int index;
|
|
|
|
for(index=0;index<mediaPak.entries();index++)
|
|
{
|
|
mediaPak.getInfo(entryInfo,index);
|
|
strPathFileNames.insert(entryInfo.name());
|
|
}
|
|
for(index=0;index<strPathDirFileNames.size();index++)
|
|
{
|
|
if(!strPathFileNames.find(strPathDirFileNames[index]))
|
|
{
|
|
GlobalData<BYTE> rawData;
|
|
PakEntry pakEntry;
|
|
|
|
::OutputDebugString(String("Adding ")+strPathDirFileNames[index]+String("\n"));
|
|
strPathFileNames.insert(strPathDirFileNames[index]);
|
|
String strPathFileName(strPathDirectory+String("\\")+strPathDirFileNames[index]);
|
|
mThumbPage.insert(strPathFileName,pureDevice);
|
|
mThumbPage[mThumbPage.entries()-1].getRawData(rawData);
|
|
pakEntry.type(PakEntry::Blob);
|
|
pakEntry.name(strPathDirFileNames[index]);
|
|
pakEntry.id(mMediaPak.entries());
|
|
pakEntry.rawData(rawData);
|
|
mMediaPak.add(pakEntry);
|
|
}
|
|
}
|
|
}
|
|
|
|
bool BrowseView::getDirectoryFileNames(const String &strDirectory,Block<String> &strPathFileNames)
|
|
{
|
|
PathFind pathFind;
|
|
|
|
strPathFileNames.remove();
|
|
pathFind.fileList(strDirectory+String("\\")+String("*.jpg"),strPathFileNames);
|
|
return strPathFileNames.size()?true:false;
|
|
}
|
|
|
|
void BrowseView::setTitle(const String &strTitle)
|
|
{
|
|
String strCaption;
|
|
String strString;
|
|
|
|
windowText(strCaption);
|
|
strString=strCaption;
|
|
strCaption=strCaption.betweenString(0,' ');
|
|
if(strCaption.isNull())strCaption=strString;
|
|
strCaption+=String(" - [")+strTitle+String("]");
|
|
setCaption(strCaption);
|
|
}
|
|
|
|
String BrowseView::getTitle(void)const
|
|
{
|
|
String strCaption;
|
|
|
|
windowText(strCaption);
|
|
return strCaption.betweenString('[',']');
|
|
}
|
|
|
|
// *** virtuals
|
|
|
|
void BrowseView::preRegister(WNDCLASS &wndClass)
|
|
{
|
|
wndClass.style|=CS_SAVEBITS|CS_OWNDC;
|
|
wndClass.hbrBackground=(HBRUSH)::GetStockObject(WHITE_BRUSH);
|
|
}
|
|
|
|
void BrowseView::preCreate(MDICREATESTRUCT &createStruct)
|
|
{
|
|
createStruct.style|=WS_VSCROLL|WS_HSCROLL|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;
|
|
}
|
|
|