Files
Work/browse/brwsview.cpp
2024-08-07 09:12:07 -04:00

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;
}