#include <cstring>
#include <map>
#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>
#ifdef BROKEN_HEADERS
extern "C" int gettimeofday(struct timeval *, struct timezone *);
-#define remove(a) unlink(a)
#endif
#ifdef __GNUG__
#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;
class GroupCache {
public:
/// seeks group name from group ID
- string const & 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 & find(gid_t ID) const ;
private:
///
void add(gid_t ID) const;
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;
+}
+
+
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);
class comp_direntry {
public:
int operator()(LyXDirEntry const & r1,
+ LyXDirEntry const & r2) const ;
+};
+ int comp_direntry::operator()(LyXDirEntry const & r1,
LyXDirEntry const & r2) const {
bool r1d = suffixIs(r1.pszName, '/');
bool r2d = suffixIs(r2.pszName, '/');
if (!r1d && r2d) return 0;
return r1.pszName < r2.pszName;
}
-};
// *** LyXFileDlg class implementation
void LyXFileDlg::Reread()
{
// Opens directory
- DIR * pDirectory = opendir(pszDirectory.c_str());
+ DIR * pDirectory = ::opendir(pszDirectory.c_str());
if (!pDirectory) {
WriteFSAlert(_("Warning! Couldn't open directory."),
pszDirectory);
- pszDirectory = GetCWD();
- pDirectory = opendir(pszDirectory.c_str());
+ pszDirectory = lyx::getcwd();
+ pDirectory = ::opendir(pszDirectory.c_str());
}
// Clear the present namelist
// 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);
}
*pTemp = pszPath;
} else {
fl_hide_object(pObject);
- (*pTemp).clear();
+ (*pTemp).erase();
}
}
// GetDirectory: gets last dialog directory
-string LyXFileDlg::GetDirectory() const
+string const LyXFileDlg::GetDirectory() const
{
if (!pszDirectory.empty())
return pszDirectory;
// event loop
while(true) {
-
FL_OBJECT * pObject = fl_do_forms();
if (pObject == pFileDlgForm->Ready) {
}
}
+
extern "C" void C_LyXFileDlg_FileDlgCB(FL_OBJECT * ob, long data)
{
LyXFileDlg::FileDlgCB(ob, data);
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);
Temp += pszTemp;
} else {
// Directory higher up
- Temp.clear();
+ Temp.erase();
for (int i = 0; i < iSelect; ++i) {
string piece = fl_get_browser_line(pFileDlgForm->List, i+1);
// The '+2' is here to count the '@b' (JMarc)
{
// 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 LyXFileDlg::Select(string const & title, string const & path,
- string const & mask, string const & suggested)
+string const LyXFileDlg::Select(string const & title, string const & path,
+ 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();
-
+
fl_hide_form(pFileDlgForm->FileDlg);
fl_activate_all_forms();
pCurrentDlg = 0;