#include <algorithm>
using std::map;
+using std::max;
using std::sort;
#include "lyx_gui_misc.h" // CancelCloseCB
#include "support/FileInfo.h"
+#include "support/lyxlib.h"
#include "gettext.h"
+#include "frontends/Dialogs.h"
#ifdef HAVE_ERRNO_H
#include <cerrno>
#include "support/filetools.h"
#include "filedlg.h"
+#ifdef SIGC_CXX_NAMESPACES
+using SigC::slot;
+#endif
+
// six months, in seconds
static const long SIX_MONTH_SEC = 6L * 30L * 24L * 60L * 60L;
static const long ONE_HOUR_SEC = 60L * 60L;
mutable Users users;
};
+
void UserCache::add(uid_t ID) const
{
string pszNewName;
mutable Groups groups;
};
- string const & GroupCache::find(gid_t ID) const
- {
- Groups::const_iterator cit = groups.find(ID);
- if (cit == groups.end()) {
- add(ID);
- return groups[ID];
- }
- return (*cit).second;
+
+string const & GroupCache::find(gid_t ID) const
+{
+ Groups::const_iterator cit = groups.find(ID);
+ if (cit == groups.end()) {
+ add(ID);
+ return groups[ID];
}
+ return (*cit).second;
+}
+
+
void GroupCache::add(gid_t ID) const
{
string pszNewName;
// adds new node
groups[ID] = pszNewName;
}
-
+
+
// static instances
static UserCache lyxUserCache;
static GroupCache lyxGroupCache;
+
// some "C" wrappers around callbacks
extern "C" void C_LyXFileDlg_FileDlgCB(FL_OBJECT *, long lArgument);
extern "C" void C_LyXFileDlg_DoubleClickCB(FL_OBJECT *, long);
if (!pDirectory) {
WriteFSAlert(_("Warning! Couldn't open directory."),
pszDirectory);
- pszDirectory = GetCWD();
+ pszDirectory = lyx::getcwd();
pDirectory = ::opendir(pszDirectory.c_str());
}
// Add them to directory box
for (DirEntries::const_iterator cit = direntries.begin();
cit != direntries.end(); ++cit) {
- string temp = line + (*cit).pszDisplayed;
+ string const temp = line + (*cit).pszDisplayed;
fl_add_browser_line(pFileDlgForm->List, temp.c_str());
}
fl_set_browser_topline(pFileDlgForm->List, iDepth);
}
fl_hide_object(pFileDlgForm->User1);
fl_hide_object(pFileDlgForm->User2);
+
+ r_ = Dialogs::redrawGUI.connect(slot(this, &LyXFileDlg::redraw));
+}
+
+
+LyXFileDlg::~LyXFileDlg()
+{
+ r_.disconnect();
+}
+
+
+void LyXFileDlg::redraw()
+{
+ if (pFileDlgForm->FileDlg && pFileDlgForm->FileDlg->visible)
+ fl_redraw_form(pFileDlgForm->FileDlg);
}
// event loop
while(true) {
-
FL_OBJECT * pObject = fl_do_forms();
if (pObject == pFileDlgForm->Ready) {
void LyXFileDlg::HandleListHit()
{
// set info line
- int iSelect = fl_get_browser(pFileDlgForm->List);
+ int const iSelect = fl_get_browser(pFileDlgForm->List);
if (iSelect > iDepth) {
SetInfoLine(direntries[iSelect - iDepth - 1].pszLsEntry);
} else {
pCurrentDlg->Force(false);
}
+
extern "C" void C_LyXFileDlg_DoubleClickCB(FL_OBJECT * ob, long data)
{
LyXFileDlg::DoubleClickCB(ob, data);
}
+
// Handle double click from list
bool LyXFileDlg::HandleDoubleClick()
{
// set info line
bool isDir = true;
- int iSelect = fl_get_browser(pFileDlgForm->List);
+ int const iSelect = fl_get_browser(pFileDlgForm->List);
if (iSelect > iDepth) {
pszTemp = direntries[iSelect - iDepth - 1].pszName;
SetInfoLine(direntries[iSelect - iDepth - 1].pszLsEntry);
{
// mask was changed
string pszTemp = fl_get_input(pFileDlgForm->PatBox);
- if (pszTemp!= pszMask) {
+ if (pszTemp != pszMask) {
SetMask(pszTemp);
Reread();
return false;
}
// Handle return from list
- int select = fl_get_browser(pFileDlgForm->List);
+ int const select = fl_get_browser(pFileDlgForm->List);
if (select > iDepth) {
- string temp = direntries[select - iDepth - 1].pszName;
+ string const temp = direntries[select - iDepth - 1].pszName;
if (!suffixIs(temp, '/')) {
// If user didn't type anything, use browser
- string name = fl_get_input(pFileDlgForm->Filename);
+ string const name =
+ fl_get_input(pFileDlgForm->Filename);
if (name.empty()) {
fl_set_input(pFileDlgForm->Filename, temp.c_str());
}
return true;
}
}
-
+
// Emulate a doubleclick
return HandleDoubleClick();
}
// Select: launches dialog and returns selected file
string const LyXFileDlg::Select(string const & title, string const & path,
- string const & mask, string const & suggested)
+ string const & mask, string const & suggested)
{
// handles new mask and path
bool isOk = true;
isOk = false;
}
if (!isOk) Reread();
- else {
- fl_select_browser_line(pFileDlgForm->List, 1);
- fl_set_browser_topline(pFileDlgForm->List, 1);
+
+ // highlight the suggested file in the browser, if it exists.
+ int sel = 0;
+ string const filename = OnlyFilename(suggested);
+ if (!filename.empty()) {
+ for (int i = 0;
+ i < fl_get_browser_maxline(pFileDlgForm->List); ++i) {
+ string s =
+ fl_get_browser_line(pFileDlgForm->List, i + 1);
+ s = strip(frontStrip(s));
+ if (s == filename) {
+ sel = i + 1;
+ break;
+ }
+ }
}
+
+ if (sel != 0) fl_select_browser_line(pFileDlgForm->List, sel);
+ int const top = max(sel - 5, 1);
+ fl_set_browser_topline(pFileDlgForm->List, top);
// checks whether dialog can be started
if (pCurrentDlg) return string();
pCurrentDlg = this;
// runs dialog
- SetInfoLine (string());
+ SetInfoLine(string());
fl_set_input(pFileDlgForm->Filename, suggested.c_str());
fl_set_button(pFileDlgForm->Cancel, 0);
fl_set_button(pFileDlgForm->Ready, 0);
fl_set_focus_object(pFileDlgForm->FileDlg, pFileDlgForm->Filename);
fl_deactivate_all_forms();
- fl_show_form(pFileDlgForm->FileDlg, FL_PLACE_MOUSE | FL_FREE_SIZE,
- FL_FULLBORDER, title.c_str());
+ fl_show_form(pFileDlgForm->FileDlg,
+ FL_PLACE_MOUSE | FL_FREE_SIZE, FL_TRANSIENT,
+ title.c_str());
isOk = RunDialog();