]> git.lyx.org Git - lyx.git/blobdiff - src/filedlg.C
prepare for 1.1.6pre2
[lyx.git] / src / filedlg.C
index 1413a9fffaabee899f14994f64aef726604f96c8..2240d9db56a69cc0a89797f9503b5287f42e7762 100644 (file)
 #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"
 
 #ifdef HAVE_ERRNO_H
@@ -59,7 +62,6 @@ using std::sort;
 
 #ifdef BROKEN_HEADERS
 extern "C" int gettimeofday(struct timeval *, struct timezone *);
-#define remove(a) unlink(a)      
 #endif
 
 #ifdef __GNUG__
@@ -95,6 +97,7 @@ private:
        mutable Users users;
 };
 
+
 void UserCache::add(uid_t ID) const 
 {
        string pszNewName;
@@ -116,14 +119,7 @@ void UserCache::add(uid_t ID) const
 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;
@@ -133,6 +129,18 @@ private:
        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;
@@ -146,11 +154,13 @@ void GroupCache::add(gid_t ID) const
        // 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);
@@ -161,6 +171,9 @@ extern "C" int C_LyXFileDlg_CancelCB(FL_FORM *, void *);
 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, '/');
@@ -168,7 +181,6 @@ public:
                if (!r1d && r2d) return 0;
                return r1.pszName < r2.pszName;
        }
-};
 
 
 // *** LyXFileDlg class implementation
@@ -182,12 +194,12 @@ LyXFileDlg * LyXFileDlg::pCurrentDlg = 0;
 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
@@ -325,7 +337,7 @@ void LyXFileDlg::Reread()
        // 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);
@@ -427,7 +439,7 @@ void LyXFileDlg::SetButton(int iIndex, string const & pszName,
 
 
 // GetDirectory: gets last dialog directory
-string LyXFileDlg::GetDirectory() const
+string const LyXFileDlg::GetDirectory() const
 {
        if (!pszDirectory.empty())
                return pszDirectory;
@@ -444,7 +456,6 @@ bool LyXFileDlg::RunDialog()
        
         // event loop
         while(true) {
-
                 FL_OBJECT * pObject = fl_do_forms();
 
                 if (pObject == pFileDlgForm->Ready) {
@@ -524,7 +535,7 @@ extern "C" void C_LyXFileDlg_FileDlgCB(FL_OBJECT * ob, long 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 {
@@ -541,11 +552,13 @@ void LyXFileDlg::DoubleClickCB(FL_OBJECT *, long)
                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()
 {
@@ -553,7 +566,7 @@ 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);
@@ -602,7 +615,7 @@ bool LyXFileDlg::HandleOK()
 {
        // mask was changed
        string pszTemp = fl_get_input(pFileDlgForm->PatBox);
-       if (pszTemp!= pszMask) {
+       if (pszTemp != pszMask) {
                SetMask(pszTemp);
                Reread();
                return false;
@@ -617,19 +630,20 @@ bool LyXFileDlg::HandleOK()
        }
        
        // 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();
 }
@@ -666,8 +680,8 @@ void LyXFileDlg::Force(bool cancel)
 
 
 // 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;
@@ -680,27 +694,44 @@ string LyXFileDlg::Select(string const & title, string const & path,
                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;