← Back to team overview

linuxdcpp-team team mailing list archive

[Branch ~dcplusplus-team/dcplusplus/trunk] Rev 2458: Save and restore the current directory of file lists

 

------------------------------------------------------------
revno: 2458
committer: poy <poy@xxxxxxxxxx>
branch nick: trunk
timestamp: Wed 2011-03-16 19:23:54 +0100
message:
  Save and restore the current directory of file lists
modified:
  changelog.txt
  dcpp/FavoriteManager.cpp
  dcpp/WindowInfo.cpp
  dcpp/WindowInfo.h
  dcpp/WindowManager.cpp
  dcpp/WindowManager.h
  dcpp/WindowManagerListener.h
  win32/DirectoryListingFrame.cpp
  win32/DirectoryListingFrame.h
  win32/HubFrame.cpp
  win32/HubFrame.h
  win32/IRecent.h
  win32/MDIChildFrame.h
  win32/MainWindow.cpp
  win32/MainWindow.h
  win32/PrivateFrame.cpp
  win32/PrivateFrame.h
  win32/StaticFrame.h


--
lp:dcplusplus
https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk

Your team Dcplusplus-team is subscribed to branch lp:dcplusplus.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== modified file 'changelog.txt'
--- changelog.txt	2011-03-10 20:27:58 +0000
+++ changelog.txt	2011-03-16 18:23:54 +0000
@@ -9,6 +9,7 @@
 * Better splitter resizing
 * [L#730828] Prevent a stack overflow when searching within too big file lists (poy)
 * [L#710359] Add finished downloads log (emtee)
+* Save and restore the current directory of file lists (poy)
 
 -- 0.782 2011-03-05 --
 * Prevent a remote crash triggered via malformed user commands (poy)

=== modified file 'dcpp/FavoriteManager.cpp'
--- dcpp/FavoriteManager.cpp	2011-01-30 20:01:21 +0000
+++ dcpp/FavoriteManager.cpp	2011-03-16 18:23:54 +0000
@@ -509,9 +509,9 @@
 		if(i->second.connect) {
 			FavoriteHubEntryList hubs = getFavoriteHubs(i->first);
 			for(FavoriteHubEntryList::const_iterator hub = hubs.begin(), hub_end = hubs.end(); hub != hub_end; ++hub) {
-				StringMap map;
-				map[WindowInfo::address] = (*hub)->getServer();
-				WindowManager::getInstance()->add(WindowManager::hub(), map);
+				WindowParams params;
+				params[WindowInfo::address] = WindowParam((*hub)->getServer(), true);
+				WindowManager::getInstance()->add(WindowManager::hub(), params);
 			}
 		}
 	}

=== modified file 'dcpp/WindowInfo.cpp'
--- dcpp/WindowInfo.cpp	2011-01-02 17:12:02 +0000
+++ dcpp/WindowInfo.cpp	2011-03-16 18:23:54 +0000
@@ -23,13 +23,11 @@
 
 namespace dcpp {
 
-const string WindowInfo::title = "Title";
-
 const string WindowInfo::address = "Address";
 const string WindowInfo::cid = "CID";
 const string WindowInfo::fileList = "FileList";
 
-WindowInfo::WindowInfo(const string& id_, const StringMap& params_) :
+WindowInfo::WindowInfo(const string& id_, const WindowParams& params_) :
 id(id_),
 params(params_)
 {
@@ -39,21 +37,22 @@
 	if(id != rhs.id)
 		return false;
 
-	if(params.size() != rhs.params.size())
-		return false;
-
-	// compare each param, except "Title" which is not used for identification.
-	for(StringMap::const_iterator i = params.begin(), iend = params.end(); i != iend; ++i) {
-		if(i->first == title)
-			continue;
-		StringMap::const_iterator ri = rhs.params.find(i->first);
-		if(ri == rhs.params.end())
-			return false;
-		if(i->second != ri->second)
-			return false;
+	// compare every identifying params.
+	int rParams = 0;
+	for(auto i = rhs.params.cbegin(), iend = rhs.params.cend(); i != iend; ++i)
+		if(i->second.identifies)
+			++rParams;
+	for(auto i = params.cbegin(), iend = params.cend(); i != iend; ++i) {
+		if(i->second.identifies) {
+			auto ri = rhs.params.find(i->first);
+			if(ri == rhs.params.end())
+				return false;
+			if(i->second.content != ri->second.content)
+				return false;
+			--rParams;
+		}
 	}
-
-	return true;
+	return rParams == 0;
 }
 
 } // namespace dcpp

=== modified file 'dcpp/WindowInfo.h'
--- dcpp/WindowInfo.h	2011-01-02 17:12:02 +0000
+++ dcpp/WindowInfo.h	2011-03-16 18:23:54 +0000
@@ -24,18 +24,29 @@
 
 namespace dcpp {
 
+struct WindowParam {
+	WindowParam() : identifies(false) { }
+	WindowParam(const string& content, bool identifies) : content(content), identifies(identifies) { }
+
+	string content;
+	bool identifies; /// whether this param determines the uniqueness of the WindowInfo holding it.
+
+	operator const string&() const { return content; }
+	template<typename T> bool operator==(const T& str) const { return content == str; }
+	bool empty() const { return content.empty(); }
+};
+
+typedef unordered_map<string, WindowParam> WindowParams;
+
 class WindowInfo {
 public:
-	explicit WindowInfo(const string& id_, const StringMap& params_);
+	explicit WindowInfo(const string& id_, const WindowParams& params_);
 
 	GETSET(string, id, Id);
-	GETSET(StringMap, params, Params);
+	GETSET(WindowParams, params, Params);
 
 	bool operator==(const WindowInfo& rhs) const;
 
-	/// special param used for displaying; ignored for identification.
-	static const string title;
-
 	/// special param for hub addresses.
 	static const string address;
 

=== modified file 'dcpp/WindowManager.cpp'
--- dcpp/WindowManager.cpp	2011-01-29 14:15:43 +0000
+++ dcpp/WindowManager.cpp	2011-03-16 18:23:54 +0000
@@ -21,7 +21,6 @@
 
 #include "WindowManager.h"
 
-#include "WindowInfo.h"
 #include "SimpleXML.h"
 #include "ClientManager.h"
 #include "QueueManager.h"
@@ -57,7 +56,7 @@
 	return Lock(cs);
 }
 
-void WindowManager::add(const string& id, const StringMap& params) {
+void WindowManager::add(const string& id, const WindowParams& params) {
 	list.push_back(WindowInfo(id, params));
 }
 
@@ -65,12 +64,12 @@
 	list.clear();
 }
 
-void WindowManager::addRecent(const string& id, const StringMap& params) {
+void WindowManager::addRecent(const string& id, const WindowParams& params) {
 	Lock l(cs);
 	addRecent_(id, params, true);
 }
 
-void WindowManager::addRecent_(const string& id, const StringMap& params, bool top) {
+void WindowManager::addRecent_(const string& id, const WindowParams& params, bool top) {
 	unsigned max;
 	{
 		MaxRecentItems::const_iterator i = maxRecentItems.find(id);
@@ -105,7 +104,7 @@
 		infoList.push_back(info);
 }
 
-void WindowManager::updateRecent(const string& id, const StringMap& params) {
+void WindowManager::updateRecent(const string& id, const WindowParams& params) {
 	Lock l(cs);
 	RecentList::iterator ri = recent.find(id);
 	if(ri != recent.end()) {
@@ -147,13 +146,13 @@
 }
 
 void WindowManager::prepareSave(const WindowInfoList& infoList) const {
-	for(WindowInfoList::const_iterator wi = infoList.begin(), wiend = infoList.end(); wi != wiend; ++wi) {
-		StringMap::const_iterator i = wi->getParams().find(WindowInfo::cid);
+	for(auto wi = infoList.cbegin(), wiend = infoList.cend(); wi != wiend; ++wi) {
+		auto i = wi->getParams().find(WindowInfo::cid);
 		if(i != wi->getParams().end())
 			ClientManager::getInstance()->saveUser(CID(i->second));
 
 		i = wi->getParams().find(WindowInfo::fileList);
-		if(i != wi->getParams().end() && !i->second.empty())
+		if(i != wi->getParams().end() && !i->second.content.empty())
 			QueueManager::getInstance()->noDeleteFileList(i->second);
 	}
 }
@@ -166,13 +165,14 @@
 		if(id.empty())
 			continue;
 
-		StringMap params;
+		WindowParams params;
 		xml.stepIn();
 		while(xml.findChild("Param")) {
 			const string& id_ = xml.getChildAttrib("Id");
 			if(id_.empty())
 				continue;
-			params[id_] = xml.getChildData();
+			params[id_] = WindowParam(xml.getChildData(), !xml.getBoolChildAttrib("Opt")
+				&& id_ != "Title"); /// @todo for back compat - remove later
 		}
 		xml.stepOut();
 
@@ -188,9 +188,11 @@
 
 	if(!info.getParams().empty()) {
 		xml.stepIn();
-		for(StringMap::const_iterator i = info.getParams().begin(), iend = info.getParams().end(); i != iend; ++i) {
-			xml.addTag("Param", i->second);
+		for(auto i = info.getParams().cbegin(), iend = info.getParams().cend(); i != iend; ++i) {
+			xml.addTag("Param", i->second.content);
 			xml.addChildAttrib("Id", i->first);
+			if(!i->second.identifies)
+				xml.addChildAttrib("Opt", true);
 		}
 		xml.stepOut();
 	}

=== modified file 'dcpp/WindowManager.h'
--- dcpp/WindowManager.h	2011-01-29 14:15:43 +0000
+++ dcpp/WindowManager.h	2011-03-16 18:23:54 +0000
@@ -21,6 +21,7 @@
 
 #include "forward.h"
 #include "SettingsManager.h"
+#include "WindowInfo.h"
 #include "WindowManagerListener.h"
 
 namespace dcpp {
@@ -39,13 +40,13 @@
 
 	Lock lock();
 
-	void add(const string& id, const StringMap& params);
+	void add(const string& id, const WindowParams& params);
 	void clear();
 
 	/// adds the referenced window if it doesn't exist, and moves it to the top of the stack.
-	void addRecent(const string& id, const StringMap& params);
+	void addRecent(const string& id, const WindowParams& params);
 	/// updates the title of the referenced window without changing its position in the stack.
-	void updateRecent(const string& id, const StringMap& params);
+	void updateRecent(const string& id, const WindowParams& params);
 	const RecentList& getRecent() const { return recent; }
 	void setMaxRecentItems(const string& id, unsigned max);
 	unsigned getMaxRecentItems(const string& id) const;
@@ -67,12 +68,12 @@
 	WindowManager();
 	virtual ~WindowManager() throw();
 
-	inline void addRecent_(const string& id, const StringMap& params) { addRecent_(id, params, false); }
-	void addRecent_(const string& id, const StringMap& params, bool top);
+	inline void addRecent_(const string& id, const WindowParams& params) { addRecent_(id, params, false); }
+	void addRecent_(const string& id, const WindowParams& params, bool top);
 
 	void prepareSave(const WindowInfoList& infoList) const;
 
-	typedef void (WindowManager::*handler_type)(const std::string&, const StringMap&);
+	typedef void (WindowManager::*handler_type)(const std::string&, const WindowParams&);
 	void parseTags(SimpleXML& xml, handler_type handler);
 	void addTag(SimpleXML& xml, const WindowInfo& info) const;
 

=== modified file 'dcpp/WindowManagerListener.h'
--- dcpp/WindowManagerListener.h	2011-01-02 17:12:02 +0000
+++ dcpp/WindowManagerListener.h	2011-03-16 18:23:54 +0000
@@ -20,6 +20,7 @@
 #define DCPLUSPLUS_DCPP_WINDOW_MANAGER_LISTENER_H
 
 #include "forward.h"
+#include "WindowInfo.h"
 
 namespace dcpp {
 
@@ -30,7 +31,7 @@
 
 	typedef X<0> Window;
 
-	virtual void on(Window, const string&, const StringMap&) throw() = 0;
+	virtual void on(Window, const string&, const WindowParams&) throw() = 0;
 };
 
 } // namespace dcpp

=== modified file 'win32/DirectoryListingFrame.cpp'
--- win32/DirectoryListingFrame.cpp	2011-03-15 21:16:24 +0000
+++ win32/DirectoryListingFrame.cpp	2011-03-16 18:23:54 +0000
@@ -118,8 +118,8 @@
 	}
 }
 
-void DirectoryListingFrame::openOwnList(TabViewPtr parent, Activation activate) {
-	openWindow(parent, Text::toT(ShareManager::getInstance()->getOwnListFile()), Util::emptyStringT,
+void DirectoryListingFrame::openOwnList(TabViewPtr parent, const tstring& dir, Activation activate) {
+	openWindow(parent, Text::toT(ShareManager::getInstance()->getOwnListFile()), dir,
 		HintedUser(ClientManager::getInstance()->getMe(), Util::emptyString), 0, activate);
 }
 
@@ -128,37 +128,43 @@
 		i->second->close(true);
 }
 
-const StringMap DirectoryListingFrame::getWindowParams() const {
-	StringMap ret;
-	ret[WindowInfo::title] = Text::fromT(getText());
-	ret[WindowInfo::cid] = dl->getUser().user->getCID().toBase32();
-	ret[WindowInfo::fileList] = (dl->getUser() == ClientManager::getInstance()->getMe()) ? "" : path;
-	ret["Hub"] = dl->getUser().hint;
-	ret["Speed"] = Util::toString(speed);
+WindowParams DirectoryListingFrame::getWindowParams() const {
+	WindowParams ret;
+	addRecentParams(ret);
+	ret[WindowInfo::cid] = WindowParam(dl->getUser().user->getCID().toBase32(), false);
+	ret[WindowInfo::fileList] = WindowParam((dl->getUser() == ClientManager::getInstance()->getMe()) ? "" : path, true);
+	ItemInfo* ii = dirs->getSelectedData();
+	if(ii && ii->type == ItemInfo::DIRECTORY)
+		ret["Directory"] = WindowParam(dl->getPath(ii->dir), false);
+	ret["Hub"] = WindowParam(dl->getUser().hint, false);
+	ret["Speed"] = WindowParam(Util::toString(speed), false);
 	return ret;
 }
 
-void DirectoryListingFrame::parseWindowParams(TabViewPtr parent, const StringMap& params) {
-	StringMap::const_iterator path = params.find(WindowInfo::fileList);
-	StringMap::const_iterator hub = params.find("Hub");
-	StringMap::const_iterator speed = params.find("Speed");
+void DirectoryListingFrame::parseWindowParams(TabViewPtr parent, const WindowParams& params) {
+	auto path = params.find(WindowInfo::fileList);
+	auto dir = params.find("Directory");
+	auto hub = params.find("Hub");
+	auto speed = params.find("Speed");
 	if(path != params.end() && speed != params.end()) {
 		Activation activate = parseActivateParam(params) ? FORCE_ACTIVE : FORCE_INACTIVE;
 		if(path->second.empty()) {
-			openOwnList(parent, activate);
+			openOwnList(parent, (dir == params.end()) ? Util::emptyStringT : Text::toT(dir->second), activate);
 		} else if(File::getSize(path->second) != -1) {
 			UserPtr u = DirectoryListing::getUserFromFilename(path->second);
 			if(u) {
-				openWindow(parent, Text::toT(path->second), Util::emptyStringT, HintedUser(u,
-					(hub == params.end()) ? Util::emptyString : hub->second), Util::toInt64(speed->second), activate);
+				openWindow(parent, Text::toT(path->second),
+					(dir == params.end()) ? Util::emptyStringT : Text::toT(dir->second),
+					HintedUser(u, (hub == params.end()) ? Util::emptyString : hub->second),
+					Util::toInt64(speed->second), activate);
 			}
 		}
 	}
 }
 
-bool DirectoryListingFrame::isFavorite(const StringMap& params) {
-	StringMap::const_iterator path = params.find(WindowInfo::fileList);
-	if(path != params.end() && path->second != "OwnList" && File::getSize(path->second) != -1) {
+bool DirectoryListingFrame::isFavorite(const WindowParams& params) {
+	auto path = params.find(WindowInfo::fileList);
+	if(path != params.end() && !(path->second.content == "OwnList") && File::getSize(path->second) != -1) {
 		UserPtr u = DirectoryListing::getUserFromFilename(path->second);
 		if(u)
 			return FavoriteManager::getInstance()->isFavoriteUser(u);
@@ -397,6 +403,8 @@
 }
 
 void DirectoryListingFrame::postClosing() {
+	updateRecent();
+
 	clearList();
 
 	SettingsManager::getInstance()->set(SettingsManager::DIRECTORYLISTINGFRAME_ORDER, WinUtil::toString(files->getColumnOrder()));

=== modified file 'win32/DirectoryListingFrame.h'
--- win32/DirectoryListingFrame.h	2011-03-10 18:29:54 +0000
+++ win32/DirectoryListingFrame.h	2011-03-16 18:23:54 +0000
@@ -74,12 +74,12 @@
 	static void openWindow_(TabViewPtr parent, const tstring& aFile, const tstring& aDir, const HintedUser& aUser, int64_t aSpeed, Activation activate);
 public:
 	static void openWindow(TabViewPtr parent, const HintedUser& aUser, const string& txt, int64_t aSpeed);
-	static void openOwnList(TabViewPtr parent, Activation activate = FOLLOW_SETTING);
+	static void openOwnList(TabViewPtr parent, const tstring& dir = Util::emptyStringT, Activation activate = FOLLOW_SETTING);
 	static void closeAll();
 
-	const StringMap getWindowParams() const;
-	static void parseWindowParams(TabViewPtr parent, const StringMap& params);
-	static bool isFavorite(const StringMap& params);
+	WindowParams getWindowParams() const;
+	static void parseWindowParams(TabViewPtr parent, const WindowParams& params);
+	static bool isFavorite(const WindowParams& params);
 
 private:
 	enum {

=== modified file 'win32/HubFrame.cpp'
--- win32/HubFrame.cpp	2011-03-15 22:39:48 +0000
+++ win32/HubFrame.cpp	2011-03-16 18:23:54 +0000
@@ -97,21 +97,21 @@
 		(*i)->resortForFavsFirst(true);
 }
 
-const StringMap HubFrame::getWindowParams() const {
-	StringMap ret;
-	ret[WindowInfo::title] = Text::fromT(getText());
-	ret[WindowInfo::address] = url;
+WindowParams HubFrame::getWindowParams() const {
+	WindowParams ret;
+	addRecentParams(ret);
+	ret[WindowInfo::address] = WindowParam(url, true);
 	return ret;
 }
 
-void HubFrame::parseWindowParams(TabViewPtr parent, const StringMap& params) {
-	StringMap::const_iterator i = params.find(WindowInfo::address);
+void HubFrame::parseWindowParams(TabViewPtr parent, const WindowParams& params) {
+	auto i = params.find(WindowInfo::address);
 	if(i != params.end())
 		openWindow(parent, i->second, parseActivateParam(params));
 }
 
-bool HubFrame::isFavorite(const StringMap& params) {
-	StringMap::const_iterator i = params.find(WindowInfo::address);
+bool HubFrame::isFavorite(const WindowParams& params) {
+	auto i = params.find(WindowInfo::address);
 	if(i != params.end())
 		return FavoriteManager::getInstance()->isFavoriteHub(i->second);
 	return false;

=== modified file 'win32/HubFrame.h'
--- win32/HubFrame.h	2011-03-02 21:33:22 +0000
+++ win32/HubFrame.h	2011-03-16 18:23:54 +0000
@@ -70,9 +70,9 @@
 	static void closeFavGroup(const string& group, bool reversed);
 	static void resortUsers();
 
-	const StringMap getWindowParams() const;
-	static void parseWindowParams(TabViewPtr parent, const StringMap& params);
-	static bool isFavorite(const StringMap& params);
+	WindowParams getWindowParams() const;
+	static void parseWindowParams(TabViewPtr parent, const WindowParams& params);
+	static bool isFavorite(const WindowParams& params);
 
 private:
 	friend class MainWindow;

=== modified file 'win32/IRecent.h'
--- win32/IRecent.h	2011-01-02 17:12:02 +0000
+++ win32/IRecent.h	2011-03-16 18:23:54 +0000
@@ -32,9 +32,17 @@
 		WindowManager::getInstance()->addRecent(t().getId(), t().getWindowParams());
 	}
 
+	void updateRecent() {
+		WindowManager::getInstance()->updateRecent(t().getId(), t().getWindowParams());
+	}
+
 	void setText(const tstring& text) {
 		t().MDIChildFrame<T>::setText(text);
-		WindowManager::getInstance()->updateRecent(t().getId(), t().getWindowParams());
+		updateRecent();
+	}
+
+	void addRecentParams(WindowParams& params) const {
+		params["Title"] = WindowParam(Text::fromT(t().getText()), false);
 	}
 };
 

=== modified file 'win32/MDIChildFrame.h'
--- win32/MDIChildFrame.h	2011-03-15 19:52:17 +0000
+++ win32/MDIChildFrame.h	2011-03-16 18:23:54 +0000
@@ -24,6 +24,7 @@
 #include "AspectStatus.h"
 #include <dwt/widgets/Menu.h>
 #include <dcpp/SettingsManager.h>
+#include <dcpp/WindowInfo.h>
 #include "resource.h"
 
 template<typename T>
@@ -131,7 +132,7 @@
 		getParent()->setIcon(this, WinUtil::tabIcon(iconId));
 	}
 
-	static bool parseActivateParam(const StringMap& params) {
+	static bool parseActivateParam(const WindowParams& params) {
 		auto i = params.find("Active");
 		return i != params.end() && i->second == "1";
 	}
@@ -141,8 +142,8 @@
 		return Util::emptyString;
 	}
 
-	virtual const StringMap getWindowParams() const {
-		return StringMap();
+	virtual WindowParams getWindowParams() const {
+		return WindowParams();
 	}
 
 private:

=== modified file 'win32/MainWindow.cpp'
--- win32/MainWindow.cpp	2011-03-15 21:16:24 +0000
+++ win32/MainWindow.cpp	2011-03-16 18:23:54 +0000
@@ -615,18 +615,18 @@
 		WinUtil::menuIcon(IDI_SETTINGS), true, true);
 	popup->appendSeparator();
 
-	WindowManager::RecentList::const_iterator it = recent.find(T::id);
+	auto it = recent.find(T::id);
 	if(it == recent.end()) {
 		popup->appendItem(T_("(No recent item found)"), 0, 0, false);
 	} else {
 
 		dwt::IconPtr favIcon = WinUtil::menuIcon(favIconId);
 
-		const WindowManager::WindowInfoList& list = it->second;
-		for(WindowManager::WindowInfoList::const_iterator i = list.begin(), iend = list.end(); i != iend; ++i) {
-			StringMap params = i->getParams();
+		const auto& list = it->second;
+		for(auto i = list.cbegin(), iend = list.cend(); i != iend; ++i) {
+			const auto& params = i->getParams();
 
-			StringMap::const_iterator title = params.find(WindowInfo::title);
+			auto title = params.find("Title");
 			if(title == params.end() || title->second.empty())
 				continue;
 
@@ -643,7 +643,7 @@
 	{
 		WindowManager* wm = WindowManager::getInstance();
 		auto lock = wm->lock();
-		const WindowManager::RecentList& recent = wm->getRecent();
+		const auto& recent = wm->getRecent();
 
 		typedef void (MainWindow::*configureF)(const string&, const tstring&);
 		configureF f = &MainWindow::handleConfigureRecent;
@@ -804,7 +804,7 @@
 			auto child = static_cast<MDIChildFrame<dwt::Container>*>(*i);
 			auto params = child->getWindowParams();
 			if(child == active)
-				params["Active"] = "1";
+				params["Active"] = WindowParam("1", false);
 			wm->add(child->getId(), params);
 		}
 	}
@@ -1429,7 +1429,7 @@
 	}
 }
 
-void MainWindow::on(WindowManagerListener::Window, const string& id, const StringMap& params) throw() {
+void MainWindow::on(WindowManagerListener::Window, const string& id, const WindowParams& params) throw() {
 	if(0);
 #define compare_id(frame) else if(frame::id == id) callAsync([this, params] { frame::parseWindowParams(getTabView(), params); })
 	compare_id(HubFrame);

=== modified file 'win32/MainWindow.h'
--- win32/MainWindow.h	2011-03-02 21:33:22 +0000
+++ win32/MainWindow.h	2011-03-16 18:23:54 +0000
@@ -219,7 +219,7 @@
 	virtual void on(PartialList, const HintedUser&, const string& text) throw();
 
 	// WindowManagerListener
-	virtual void on(WindowManagerListener::Window, const string& id, const StringMap& params) throw();
+	virtual void on(WindowManagerListener::Window, const string& id, const WindowParams& params) throw();
 };
 
 #endif // !defined(MAIN_FRM_H)

=== modified file 'win32/PrivateFrame.cpp'
--- win32/PrivateFrame.cpp	2011-03-15 21:16:24 +0000
+++ win32/PrivateFrame.cpp	2011-03-16 18:23:54 +0000
@@ -85,27 +85,27 @@
 	}
 }
 
-const StringMap PrivateFrame::getWindowParams() const {
-	StringMap ret;
-	ret[WindowInfo::title] = Text::fromT(getText());
-	ret[WindowInfo::cid] = replyTo.getUser().user->getCID().toBase32();
-	ret["Hub"] = replyTo.getUser().hint;
-	ret["LogPath"] = getLogPath();
+WindowParams PrivateFrame::getWindowParams() const {
+	WindowParams ret;
+	addRecentParams(ret);
+	ret[WindowInfo::cid] = WindowParam(replyTo.getUser().user->getCID().toBase32(), true);
+	ret["Hub"] = WindowParam(replyTo.getUser().hint, false);
+	ret["LogPath"] = WindowParam(getLogPath(), false);
 	return ret;
 }
 
-void PrivateFrame::parseWindowParams(TabViewPtr parent, const StringMap& params) {
-	StringMap::const_iterator cid = params.find(WindowInfo::cid);
-	StringMap::const_iterator hub = params.find("Hub");
+void PrivateFrame::parseWindowParams(TabViewPtr parent, const WindowParams& params) {
+	auto cid = params.find(WindowInfo::cid);
+	auto hub = params.find("Hub");
 	if(cid != params.end() && hub != params.end()) {
-		StringMap::const_iterator logPath = params.find("LogPath");
+		auto logPath = params.find("LogPath");
 		openWindow(parent, HintedUser(ClientManager::getInstance()->getUser(CID(cid->second)), hub->second), Util::emptyStringT,
 			logPath != params.end() ? logPath->second : Util::emptyString, parseActivateParam(params));
 	}
 }
 
-bool PrivateFrame::isFavorite(const StringMap& params) {
-	StringMap::const_iterator cid = params.find(WindowInfo::cid);
+bool PrivateFrame::isFavorite(const WindowParams& params) {
+	auto cid = params.find(WindowInfo::cid);
 	if(cid != params.end()) {
 		UserPtr u = ClientManager::getInstance()->getUser(CID(cid->second));
 		if(u)

=== modified file 'win32/PrivateFrame.h'
--- win32/PrivateFrame.h	2011-01-09 14:54:10 +0000
+++ win32/PrivateFrame.h	2011-03-16 18:23:54 +0000
@@ -63,9 +63,9 @@
 	static void closeAll();
 	static void closeAllOffline();
 
-	const StringMap getWindowParams() const;
-	static void parseWindowParams(TabViewPtr parent, const StringMap& params);
-	static bool isFavorite(const StringMap& params);
+	WindowParams getWindowParams() const;
+	static void parseWindowParams(TabViewPtr parent, const WindowParams& params);
+	static bool isFavorite(const WindowParams& params);
 
 	void sendMessage(const tstring& msg, bool thirdPerson = false);
 

=== modified file 'win32/StaticFrame.h'
--- win32/StaticFrame.h	2011-01-09 21:22:07 +0000
+++ win32/StaticFrame.h	2011-03-16 18:23:54 +0000
@@ -53,7 +53,7 @@
 		}
 	}
 
-	static void parseWindowParams(TabViewPtr parent, const StringMap& params) {
+	static void parseWindowParams(TabViewPtr parent, const WindowParams& params) {
 		openWindow(parent, false, BaseType::parseActivateParam(params));
 	}