]> git.lyx.org Git - lyx.git/blobdiff - src/filedlg.C
More fixes to insettabular/text (and some missing features added).
[lyx.git] / src / filedlg.C
index eea8a9e59527c2ce1d541fed5c37cfe692264979..2b6949034aca2fe0d77ff25169b6e593bbee7622 100644 (file)
 #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>
@@ -69,6 +72,10 @@ extern "C" int gettimeofday(struct timeval *, struct timezone *);
 #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;
@@ -95,6 +102,7 @@ private:
        mutable Users users;
 };
 
+
 void UserCache::add(uid_t ID) const 
 {
        string pszNewName;
@@ -126,15 +134,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;
+
+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;
@@ -148,11 +159,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);
@@ -190,7 +203,7 @@ void LyXFileDlg::Reread()
        if (!pDirectory) {
                WriteFSAlert(_("Warning! Couldn't open directory."), 
                             pszDirectory);
-               pszDirectory = GetCWD();
+               pszDirectory = lyx::getcwd();
                pDirectory = ::opendir(pszDirectory.c_str());
        }
 
@@ -329,7 +342,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);
@@ -401,6 +414,21 @@ LyXFileDlg::LyXFileDlg()
        }
        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);
 }
 
 
@@ -448,7 +476,6 @@ bool LyXFileDlg::RunDialog()
        
         // event loop
         while(true) {
-
                 FL_OBJECT * pObject = fl_do_forms();
 
                 if (pObject == pFileDlgForm->Ready) {
@@ -528,7 +555,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 {
@@ -545,11 +572,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()
 {
@@ -557,7 +586,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);
@@ -606,7 +635,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;
@@ -621,19 +650,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();
 }
@@ -671,7 +701,7 @@ void LyXFileDlg::Force(bool cancel)
 
 // 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;
@@ -684,27 +714,44 @@ string const 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;