Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "filebrowser.h"
Toshihiro Shimizu 890ddd
#include "thumbnail.h"
Toshihiro Shimizu 890ddd
#include "thumbnailviewer.h"
Toshihiro Shimizu 890ddd
#include "tw/treeview.h"
Toshihiro Shimizu 890ddd
#include "tw/colors.h"
Toshihiro Shimizu 890ddd
#include "tw/button.h"
Toshihiro Shimizu 890ddd
#include "tw/scrollbar.h"
Toshihiro Shimizu 890ddd
#include "tw/mainshell.h"
Toshihiro Shimizu 890ddd
#include "tfilepath.h"
Toshihiro Shimizu 890ddd
#include "tsystem.h"
Toshihiro Shimizu 890ddd
#include "tenv.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tw/message.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
using namespace TwConsts;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "filebrowser_icons.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DirectoryBrowser : public ThumbnailViewer
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePath m_filepath;
Toshihiro Shimizu 890ddd
	vector<string> m_fileTypes;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	GenericFileBrowserAction *m_fileSelChangeAction;
Toshihiro Shimizu 890ddd
	GenericFileBrowserAction *m_fileDblClickAction;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	DirectoryBrowser(TWidget *parent, const vector<string> &fileTypes)
Toshihiro Shimizu 890ddd
		: ThumbnailViewer(parent), m_fileSelChangeAction(0), m_fileDblClickAction(0), m_fileTypes(fileTypes) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	~DirectoryBrowser()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		if (m_fileSelChangeAction)
Toshihiro Shimizu 890ddd
			delete m_fileSelChangeAction;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (m_fileDblClickAction)
Toshihiro Shimizu 890ddd
			delete m_fileDblClickAction;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setPath(const TFilePath &filepath);
Toshihiro Shimizu 890ddd
	void setFilter(const vector<string> &fileTypes);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath getPath() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return m_filepath;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void onDoubleClick(int index);
Toshihiro Shimizu 890ddd
	void onSelect(int index);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setFileSelChangeAction(GenericFileBrowserAction *action)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_fileSelChangeAction = action;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setFileDblClickAction(GenericFileBrowserAction *action)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_fileDblClickAction = action;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DirectoryBrowser::setPath(const TFilePath &filepath)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_filepath = filepath;
Toshihiro Shimizu 890ddd
	loadDirectory(filepath, m_fileTypes);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DirectoryBrowser::setFilter(const vector<string> &fileTypes)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_fileTypes = fileTypes;
Toshihiro Shimizu 890ddd
	if (!m_filepath.isEmpty())
Toshihiro Shimizu 890ddd
		loadDirectory(m_filepath, m_fileTypes);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DirectoryBrowser::onDoubleClick(int index)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	Thumbnail *thumbnail = getItem(index);
Toshihiro Shimizu 890ddd
	if (thumbnail->getType() != Thumbnail::SCENE)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
	TFilePath path =
Toshihiro Shimizu 890ddd
		thumbnail->getPath().getParentDir() + (thumbnail->getName() + "_files");
Toshihiro Shimizu 890ddd
	setPath(path);
Toshihiro Shimizu 890ddd
	invalidate();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void DirectoryBrowser::onSelect(int index)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (index != -1) {
Toshihiro Shimizu 890ddd
		Thumbnail *thumbnail = getItem(index);
Toshihiro Shimizu 890ddd
		if (m_fileSelChangeAction)
Toshihiro Shimizu 890ddd
			m_fileSelChangeAction->sendCommand(thumbnail->getPath());
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class MyTreeViewItem : public TTreeViewItem
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	MyTreeViewItem(TTreeViewItemParent *parent)
Toshihiro Shimizu 890ddd
		: TTreeViewItem(parent) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDimension getIconSize() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return TDimension(26, 26);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void drawIcon(TTreeView *w, const TPoint &origin)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		TRect rect(origin, getIconSize());
Toshihiro Shimizu 890ddd
		w->setColor(TWidget::Black);
Toshihiro Shimizu 890ddd
		w->drawRect(rect);
Toshihiro Shimizu 890ddd
		rect = rect.enlarge(-4);
Toshihiro Shimizu 890ddd
		w->setColor(Red);
Toshihiro Shimizu 890ddd
		w->drawRect(rect);
Toshihiro Shimizu 890ddd
		w->setColor(Blue);
Toshihiro Shimizu 890ddd
		w->fillRect(rect.enlarge(-1));
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void drawName(TTreeView *w, const TPoint &origin)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		string name = toString(getName());
Toshihiro Shimizu 890ddd
		TDimension textSize = w->getTextSize(name);
Toshihiro Shimizu 890ddd
		TDimension iconSize = getIconSize();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TPoint pos = origin;
Toshihiro Shimizu 890ddd
		pos.x += iconSize.lx;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (isSelected()) {
Toshihiro Shimizu 890ddd
			w->setColor(ToonzHighlightColor);
Toshihiro Shimizu 890ddd
			w->fillRect(pos.x + 2, pos.y + 2, pos.x + textSize.lx + 8, pos.y + iconSize.ly - 1 - 2);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		w->setColor(TWidget::Black);
Toshihiro Shimizu 890ddd
		w->drawText(pos + TPoint(5, iconSize.ly / 2 - textSize.ly / 2), name);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
  void draw(TTreeView *w, const TPoint &origin) {
Toshihiro Shimizu 890ddd
    drawIcon(w,origin);
Toshihiro Shimizu 890ddd
    drawName(w,origin);
Toshihiro Shimizu 890ddd
  }
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class MyTreeView : public TTreeView
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	MyTreeView(TWidget *parent, string name = "MyTreeView")
Toshihiro Shimizu 890ddd
		: TTreeView(parent, name)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		setBackgroundColor(White);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void drawButton(const TPoint &p, bool open)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		int r1 = 3, r2 = 1;
Toshihiro Shimizu 890ddd
		TRect rect(p.x - r1, p.y - r1, p.x + r1, p.y + r1);
Toshihiro Shimizu 890ddd
		setColor(getBackgroundColor());
Toshihiro Shimizu 890ddd
		fillRect(rect.enlarge(-1));
Toshihiro Shimizu 890ddd
		setColor(Gray210);
Toshihiro Shimizu 890ddd
		drawRect(rect);
Toshihiro Shimizu 890ddd
		setColor(Black);
Toshihiro Shimizu 890ddd
		drawLine(p.x - r2, p.y, p.x + r2, p.y);
Toshihiro Shimizu 890ddd
		if (!open)
Toshihiro Shimizu 890ddd
			drawLine(p.x, p.y - r2, p.x, p.y + r2);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class SimpleFileItem : public MyTreeViewItem
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePath m_path;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	SimpleFileItem(TTreeViewItemParent *parent, const TFilePath &path)
Toshihiro Shimizu 890ddd
		: MyTreeViewItem(parent), m_path(path) { setIsLeaf(true); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	wstring getName() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return m_path.withoutParentDir().getWideString();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TFilePath getPath() const { return m_path; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool caseInsensitiveLessThan(const TFilePath &fp1, const TFilePath &fp2)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return (stricmp(toString(fp1.getWideString()).c_str(),
Toshihiro Shimizu 890ddd
					toString(fp2.getWideString()).c_str()) < 0);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class FileFolderItem : public MyTreeViewItem
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TFilePath m_path;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	FileFolderItem(TTreeViewItemParent *parent, const TFilePath &path)
Toshihiro Shimizu 890ddd
		: MyTreeViewItem(parent), m_path(path) {}
Toshihiro Shimizu 890ddd
	wstring getName() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return m_path.isRoot()
Toshihiro Shimizu 890ddd
				   ? m_path.getWideString()
Toshihiro Shimizu 890ddd
				   : m_path.withoutParentDir().getWideString();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDimension getIconSize() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return TDimension(16, 16);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void onOpen()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		clearItems();
Toshihiro Shimizu 890ddd
		try {
Toshihiro Shimizu 890ddd
			TFilePathSet fps = TSystem::readDirectory(m_path);
Toshihiro Shimizu 890ddd
			fps.sort(caseInsensitiveLessThan);
Toshihiro Shimizu 890ddd
			for (TFilePathSet::iterator it = fps.begin(); it != fps.end(); it++) {
Toshihiro Shimizu 890ddd
				if (TFileStatus(*it).isDirectory())
Toshihiro Shimizu 890ddd
					new FileFolderItem(this, *it);
Toshihiro Shimizu 890ddd
				//else
Toshihiro Shimizu 890ddd
				//  new SimpleFileItem(this, *it);
Toshihiro Shimizu 890ddd
			}
Toshihiro Shimizu 890ddd
		} catch (TException &e) {
Toshihiro Shimizu 890ddd
			TMessage::error(toString(e.getMessage()));
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	TFilePath getPath() const { return m_path; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void drawIcon(TTreeView *w, const TPoint &origin)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		w->rectwrite(isOpen() ? openfolder : closedfolder, origin);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class MyComputerFolder : public MyTreeViewItem
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	MyComputerFolder(TTreeViewItemParent *parent)
Toshihiro Shimizu 890ddd
		: MyTreeViewItem(parent) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	wstring getName() const { return toWideString("My Computer"); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void onOpen()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		clearItems();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TFilePathSet fps = TSystem::getDisks();
Toshihiro Shimizu 890ddd
		for (TFilePathSet::iterator it = fps.begin(); it != fps.end(); it++) {
Toshihiro Shimizu 890ddd
			TTreeViewItem *item = new FileFolderItem(this, *it);
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	void drawIcon(TTreeView *w, const TPoint &origin)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		w->rectwrite(mycomputer, origin);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class HistoryFolder : public MyTreeViewItem
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	HistoryFolder(TTreeViewItemParent *parent)
Toshihiro Shimizu 890ddd
		: MyTreeViewItem(parent) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	wstring getName() const { return toWideString("History"); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void onOpen()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		clearItems();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	void drawIcon(TTreeView *w, const TPoint &origin)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		w->rectwrite(history, origin);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class LibraryFolder : public MyTreeViewItem
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	LibraryFolder(TTreeViewItemParent *parent)
Toshihiro Shimizu 890ddd
		: MyTreeViewItem(parent) {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	wstring getName() const { return toWideString("Library"); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void onOpen()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		clearItems();
Toshihiro Shimizu 890ddd
		TFilePath root = TEnv::getRootDir();
Toshihiro Shimizu 890ddd
		new FileFolderItem(this, root + "patterns");
Toshihiro Shimizu 890ddd
		new FileFolderItem(this, root + "images");
Toshihiro Shimizu 890ddd
		new FileFolderItem(this, root + "scenes");
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	void drawIcon(TTreeView *w, const TPoint &origin)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		w->rectwrite(library, origin);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class WorkFolder : public FileFolderItem
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	WorkFolder(TTreeViewItemParent *parent)
Toshihiro Shimizu 890ddd
		: FileFolderItem(parent, TEnv::getRootDir() + "work") {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TDimension getIconSize() const
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		return TDimension(24, 24);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	wstring getName() const { return toWideString("Work"); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void drawIcon(TTreeView *w, const TPoint &origin)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		w->rectwrite(workinprogress, origin);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class FileFolderTreeView : public MyTreeView
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	DirectoryBrowser *m_viewer;
Toshihiro Shimizu 890ddd
	TTreeViewItem *m_myComputer;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	FileFolderTreeView(TWidget *parent, DirectoryBrowser *viewer)
Toshihiro Shimizu 890ddd
		: MyTreeView(parent), m_viewer(viewer)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		m_myComputer = new MyComputerFolder(this);
Toshihiro Shimizu 890ddd
		m_myComputer->open();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		/*
Toshihiro Shimizu 890ddd
    new HistoryFolder(this);
Toshihiro Shimizu 890ddd
    new LibraryFolder(this);
Toshihiro Shimizu 890ddd
    new WorkFolder(this);
Toshihiro Shimizu 890ddd
    */
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void leftButtonDoubleClick(const TMouseEvent &e);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void onSelect(TTreeViewItem *item);
Toshihiro Shimizu 890ddd
	void setCurrentDir(const TFilePath &dirPath);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FileFolderTreeView::leftButtonDoubleClick(const TMouseEvent &e)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TTreeViewItem *item = getSelectedItem();
Toshihiro Shimizu 890ddd
	if (item) {
Toshihiro Shimizu 890ddd
		if (!item->isOpen())
Toshihiro Shimizu 890ddd
			item->open();
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			item->close();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		updateVisibleItems();
Toshihiro Shimizu 890ddd
		invalidate();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FileFolderTreeView::onSelect(TTreeViewItem *item)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FileFolderItem *folder = dynamic_cast<FileFolderItem *>(item);
Toshihiro Shimizu 890ddd
	if (folder && folder->getPath() != m_viewer->getPath()) {
Toshihiro Shimizu 890ddd
		TFilePath path = folder->getPath();
Toshihiro Shimizu 890ddd
		m_viewer->setPath(path);
Toshihiro Shimizu 890ddd
		m_viewer->invalidate();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TTreeViewItem *openChild(TTreeViewItem *folder, const TFilePath &childPath)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	int count = folder->getItemCount();
Toshihiro Shimizu 890ddd
	for (int i = 0; i < count; ++i) {
Toshihiro Shimizu 890ddd
		FileFolderItem *item =
Toshihiro Shimizu 890ddd
			dynamic_cast<FileFolderItem *>(folder->getItem(i));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		if (item && item->getPath() == childPath) {
Toshihiro Shimizu 890ddd
			item->open();
Toshihiro Shimizu 890ddd
			return item;
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FileFolderTreeView::setCurrentDir(const TFilePath &dirPath)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(TFileStatus(dirPath).isDirectory());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	list<TFilePath> ancestors;
Toshihiro Shimizu 890ddd
	ancestors.push_back(dirPath);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (!dirPath.isRoot()) {
Toshihiro Shimizu 890ddd
		TFilePath fp = dirPath;
Toshihiro Shimizu 890ddd
		while (!(fp = fp.getParentDir()).isRoot())
Toshihiro Shimizu 890ddd
			ancestors.push_front(fp);
Toshihiro Shimizu 890ddd
		ancestors.push_front(fp);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TTreeViewItem *folder = m_myComputer;
Toshihiro Shimizu 890ddd
	while (!ancestors.empty() && folder) {
Toshihiro Shimizu 890ddd
		TFilePath fp = ancestors.front();
Toshihiro Shimizu 890ddd
		folder = openChild(folder, fp);
Toshihiro Shimizu 890ddd
		ancestors.pop_front();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (folder) {
Toshihiro Shimizu 890ddd
		updateVisibleItems();
Toshihiro Shimizu 890ddd
		select(folder);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		TRect rect;
Toshihiro Shimizu 890ddd
		getPlacement(m_selectedItemIndex, rect);
Toshihiro Shimizu 890ddd
		int y = rect.getP00().y;
Toshihiro Shimizu 890ddd
		if (y <= 0)
Toshihiro Shimizu 890ddd
			y = m_yoffset - y;
Toshihiro Shimizu 890ddd
		else if (y > getLy())
Toshihiro Shimizu 890ddd
			y = m_yoffset - (rect.y1 - getLy());
Toshihiro Shimizu 890ddd
		else
Toshihiro Shimizu 890ddd
			y = m_yoffset;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		scrollToY(y);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		updateScrollbars();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
}; // anonymous namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
//==============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class FileBrowser::Data
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	Data() {}
Toshihiro Shimizu 890ddd
	~Data() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	FileFolderTreeView *m_tree;
Toshihiro Shimizu 890ddd
	DirectoryBrowser *m_panel;
Toshihiro Shimizu 890ddd
	TScrollbar *m_panelScb, *m_treeVscb, *m_treeHscb;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TIconButton *m_upButton, *m_createFolderButton, *m_deleteFileButton;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	vector<string> m_fileTypes;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FileBrowser::FileBrowser(TWidget *parent, string name, const vector<string> &fileTypes)
Toshihiro Shimizu 890ddd
	: TWidget(parent, name), m_data(new Data())
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_data->m_fileTypes = fileTypes;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_data->m_panel = new DirectoryBrowser(this, fileTypes);
Toshihiro Shimizu 890ddd
	m_data->m_tree = new FileFolderTreeView(this, m_data->m_panel);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_data->m_panelScb = new TScrollbar(this);
Toshihiro Shimizu 890ddd
	m_data->m_treeHscb = new TScrollbar(this);
Toshihiro Shimizu 890ddd
	m_data->m_treeVscb = new TScrollbar(this);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_data->m_panel->setScrollbars(0, m_data->m_panelScb);
Toshihiro Shimizu 890ddd
	m_data->m_tree->setScrollbars(m_data->m_treeHscb, m_data->m_treeVscb);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setBackgroundColor(Gray210);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_data->m_upButton = new TIconButton(this, parentfolder);
Toshihiro Shimizu 890ddd
	tconnect(*m_data->m_upButton, this, &FileBrowser::selectParentDirectory);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_data->m_createFolderButton = new TIconButton(this, newfolder);
Toshihiro Shimizu 890ddd
	m_data->m_deleteFileButton = new TIconButton(this, trash);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
FileBrowser::~FileBrowser()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	delete m_data;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FileBrowser::setFilter(const vector<string> &fileTypes)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_data->m_fileTypes = fileTypes;
Toshihiro Shimizu 890ddd
	m_data->m_panel->setFilter(fileTypes);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FileBrowser::draw()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	setColor(White);
Toshihiro Shimizu 890ddd
	fillRect(0, 0, 4, getLy() - 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPoint p;
Toshihiro Shimizu 890ddd
	p = m_data->m_treeVscb->getGeometry().getP11();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	setColor(Gray150);
Toshihiro Shimizu 890ddd
	drawLine(p.x + 1, 1, p.x + 1, p.y);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	p = m_data->m_panel->getGeometry().getP01();
Toshihiro Shimizu 890ddd
	drawLine(p.x - 1, 1, p.x - 1, p.y);
Toshihiro Shimizu 890ddd
	drawLine(p.x - 1, p.y + 1, getLx() - 2, p.y + 1);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FileBrowser::configureNotify(const TDimension &d)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
  TRect rect = getBounds();
Toshihiro Shimizu 890ddd
  int x = 200;
Toshihiro Shimizu 890ddd
  int w = 15;
Toshihiro Shimizu 890ddd
  int xa = x-w-4;
Toshihiro Shimizu 890ddd
  TDimension scbSize(w, rect.getLy());
Toshihiro Shimizu 890ddd
  m_data->m_tree->setGeometry(rect.x0,rect.y0,xa-1,rect.y1);
Toshihiro Shimizu 890ddd
  m_data->m_treeVscb->setGeometry(TPoint(xa,rect.y0),scbSize);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  m_data->m_treeHscb->setGeometry(rect.x0, rect.y0, x-1-scbSize,rect.y0+scbSize-1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  int buttonBarHeight = 30;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  rect.y1 -= buttonBarHeight;
Toshihiro Shimizu 890ddd
  scbSize.ly -= buttonBarHeight;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  m_data->m_panel->setGeometry(x,rect.y0,rect.x1-w,rect.y1);
Toshihiro Shimizu 890ddd
  m_data->m_panelScb->setGeometry(TPoint(rect.x1-w+1,rect.y0),scbSize);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  int y = rect.y1+4;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  m_data->m_upButton->setPosition(x-1, y);
Toshihiro Shimizu 890ddd
  m_data->m_createFolderButton->setPosition(x+25, y);
Toshihiro Shimizu 890ddd
  m_data->m_deleteFileButton->setPosition(rect.x1-26, y);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  invalidate();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
*/
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const int scbSize = 15;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRect rect = getBounds();
Toshihiro Shimizu 890ddd
	int x = 196;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_data->m_tree->setGeometry(rect.x0, rect.y0 + scbSize, x - 1 - scbSize, rect.y1);
Toshihiro Shimizu 890ddd
	m_data->m_treeVscb->setGeometry(x - scbSize, rect.y0 + scbSize, x - 1, rect.y1);
Toshihiro Shimizu 890ddd
	m_data->m_treeHscb->setGeometry(rect.x0, rect.y0, x - 1 - scbSize, rect.y0 + scbSize - 1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int buttonBarHeight = 29;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	rect.y1 -= buttonBarHeight;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_data->m_panel->setGeometry(x + 4, rect.y0, rect.x1 - scbSize, rect.y1);
Toshihiro Shimizu 890ddd
	m_data->m_panelScb->setGeometry(rect.x1 - scbSize + 1, rect.y0, rect.x1, rect.y1);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int y = rect.y1 + 4;
Toshihiro Shimizu 890ddd
	x += 4;
Toshihiro Shimizu 890ddd
	m_data->m_upButton->setPosition(x - 1, y);
Toshihiro Shimizu 890ddd
	m_data->m_createFolderButton->setPosition(x + 25, y);
Toshihiro Shimizu 890ddd
	m_data->m_deleteFileButton->setPosition(rect.x1 - 26, y);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	m_data->m_upButton->invalidate();
Toshihiro Shimizu 890ddd
	m_data->m_createFolderButton->invalidate();
Toshihiro Shimizu 890ddd
	m_data->m_deleteFileButton->invalidate();
Toshihiro Shimizu 890ddd
	m_data->m_treeVscb->invalidate();
Toshihiro Shimizu 890ddd
	m_data->m_treeHscb->invalidate();
Toshihiro Shimizu 890ddd
	m_data->m_tree->invalidate();
Toshihiro Shimizu 890ddd
	invalidate();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FileBrowser::setBackgroundColor(const TGuiColor &color)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	TWidget::setBackgroundColor(color);
Toshihiro Shimizu 890ddd
	m_data->m_panel->setBackgroundColor(color);
Toshihiro Shimizu 890ddd
	m_data->m_tree->setBackgroundColor(color);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FileBrowser::setFileSelChangeAction(GenericFileBrowserAction *action)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_data->m_panel->setFileSelChangeAction(action);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FileBrowser::setFileDblClickAction(GenericFileBrowserAction *action)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_data->m_panel->setFileDblClickAction(action);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TFilePath FileBrowser::getCurrentDir() const
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	FileFolderItem *item = dynamic_cast<FileFolderItem *>(m_data->m_tree->getSelectedItem());
Toshihiro Shimizu 890ddd
	if (item)
Toshihiro Shimizu 890ddd
		return item->getPath();
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		return TFilePath();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FileBrowser::setCurrentDir(const TFilePath &dirPath)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_data->m_tree->setCurrentDir(dirPath);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void FileBrowser::selectParentDirectory()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_data->m_tree->selectParent();
Toshihiro Shimizu 890ddd
}