]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfunc.C
the export patch from Dekel
[lyx.git] / src / lyxfunc.C
index d01236b739da9216911a1ff169d21ce891e73903..79d0dc66a0db010db0a72d57901e216b79f1ebe6 100644 (file)
@@ -92,6 +92,9 @@ using std::istringstream;
 #include "menus.h"
 #endif
 #include "FloatList.h"
+#include "exporter.h"
+#include "FontLoader.h"
+#include "TextCache.h"
 
 using std::pair;
 using std::endl;
@@ -108,17 +111,23 @@ extern bool selection_possible;
 
 extern kb_keymap * toplevel_keymap;
 
-extern void MenuWrite(Buffer *);
+extern bool MenuWrite(Buffer *);
 extern bool MenuWriteAs(Buffer *);
+#ifdef NEW_MENUBAR
 extern int  MenuRunLaTeX(Buffer *);
+#endif
 extern int  MenuBuildProg(Buffer *);
 extern int  MenuRunChktex(Buffer *);
+#ifndef NEW_EXPORT
 extern bool CreatePostscript(Buffer *, bool);
+#endif
 extern void MenuPrint(Buffer *);
 extern void MenuSendto();
 extern void QuitLyX();
 extern void MenuFax(Buffer *);
+#ifndef NEW_EXPORT
 extern void MenuExport(Buffer *, string const &);
+#endif
 extern void show_symbols_form(LyXFunc *);
 
 extern LyXAction lyxaction;
@@ -126,10 +135,11 @@ extern LyXAction lyxaction;
 extern tex_accent_struct get_accent(kb_action action);
 
 extern void AutoSave(BufferView *);
+#ifndef NEW_EXPORT
 extern bool PreviewDVI(Buffer *);
 extern bool PreviewPostscript(Buffer *);
+#endif
 extern void MenuInsertLabel(char const *);
-extern void MenuInsertRef();
 extern void MenuLayoutCharacter();
 extern void MenuLayoutParagraph();
 extern void MenuLayoutDocument();
@@ -186,13 +196,133 @@ void LyXFunc::moveCursorUpdate(bool selecting)
 }
 
 
+int LyXFunc::processKeySym(KeySym keysym, unsigned int state) 
+{
+       string argument;
+       
+       if (lyxerr.debugging(Debug::KEY)) {
+               char * tmp = XKeysymToString(keysym);
+               string stm = (tmp ? tmp : "");
+               lyxerr << "KeySym is "
+                      << stm
+                      << "["
+                      << keysym << "]"
+                      << endl;
+       }
+       // Do nothing if we have nothing (JMarc)
+       if (keysym == NoSymbol) {
+               lyxerr[Debug::KEY] << "Empty kbd action (probably composing)"
+                                  << endl;
+               //return 0;
+               return FL_PREEMPT;
+       }
+       
+       // this function should be used always [asierra060396]
+       UpdatableInset * tli = owner->view()->the_locking_inset;
+       if (owner->view()->available() && tli && (keysym == XK_Escape)) {
+               if (tli == tli->GetLockingInset()) {
+                       owner->view()->unlockInset(tli);
+                       owner->view()->text->CursorRight(owner->view());
+                       moveCursorUpdate(false);
+                       owner->showState();
+               } else {
+                       tli->UnlockInsetInInset(owner->view(),
+                                               tli->GetLockingInset(),true);
+               }
+               //return 0;
+               return FL_PREEMPT;
+       }
+
+       // Can we be sure that this will work for all X-Windows
+       // implementations? (Lgb)
+       // This code snippet makes lyx ignore some keys. Perhaps
+       // all of them should be explictly mentioned?
+       if((keysym >= XK_Shift_L && keysym <= XK_Hyper_R)
+          || keysym == XK_Mode_switch || keysym == 0x0)
+               return 0;
+
+       // Do a one-deep top-level lookup for
+       // cancel and meta-fake keys. RVDK_PATCH_5
+       cancel_meta_seq.reset();
+
+       int action = cancel_meta_seq.addkey(keysym, state
+                                           &(ShiftMask|ControlMask
+                                             |Mod1Mask)); 
+
+       // When not cancel or meta-fake, do the normal lookup. 
+       // Note how the meta_fake Mod1 bit is OR-ed in and reset afterwards.
+       // Mostly, meta_fake_bit = 0. RVDK_PATCH_5.
+       if ( (action != LFUN_CANCEL) && (action != LFUN_META_FAKE) ) {
+
+               // remove Caps Lock and Mod2 as a modifiers
+               action = keyseq.addkey(keysym,
+                                      (state | meta_fake_bit)
+                                      &(ShiftMask|ControlMask
+                                        |Mod1Mask));      
+       }
+       // Dont remove this unless you know what you are doing.
+       meta_fake_bit = 0;
+               
+       if (action == 0) action = LFUN_PREFIX;
+
+       if (lyxerr.debugging(Debug::KEY)) {
+               string buf;
+               keyseq.print(buf);
+               lyxerr << "Key ["
+                      << action << "]["
+                      << buf << "]"
+                      << endl;
+       }
+
+       // already here we know if it any point in going further
+       // why not return already here if action == -1 and
+       // num_bytes == 0? (Lgb)
+
+       if(keyseq.length > 1 || keyseq.length < -1) {
+               string buf;
+               keyseq.print(buf);
+               owner->getMiniBuffer()->Set(buf);
+       }
+
+       if (action == -1) {
+               if (keyseq.length < -1) { // unknown key sequence...
+                       string buf;
+                       LyXBell();
+                       keyseq.print(buf);
+                       owner->getMiniBuffer()->Set(_("Unknown sequence:"), buf);
+                       return 0;
+               }
+       
+               char isochar = keyseq.getiso();
+               if (!(state & ControlMask) &&
+                   !(state & Mod1Mask) &&
+                   (isochar && keysym < 0xF000)) {
+                       argument += isochar;
+               }
+               if (argument.empty()) {
+                       lyxerr.debug() << "Empty argument!" << endl;
+                       // This can`t possibly be of any use
+                       // so we`ll skip the dispatch.
+                       return 0;
+               }
+       }
+
+        bool tmp_sc = show_sc;
+       show_sc = false;
+       Dispatch(action, argument.c_str());
+       show_sc = tmp_sc;
+       
+       return 0;
+} 
+
+
+#if 0
 int LyXFunc::processKeyEvent(XEvent * ev)
 {
        char s_r[10];
+       KeySym keysym_return = 0;
        string argument;
        XKeyEvent * keyevent = &ev->xkey;
-       KeySym keysym_return = 0;
-
        int num_bytes = LyXLookupString(ev, s_r, 10, &keysym_return);
        s_r[num_bytes] = '\0';
 
@@ -206,7 +336,8 @@ int LyXFunc::processKeyEvent(XEvent * ev)
                       << " and num_bytes is "
                       << num_bytes
                       << " the string returned is \""
-                      << s_r << '\"' << endl;
+                      << s_r << '\"'
+                      << endl;
        }
        // Do nothing if we have nothing (JMarc)
        if (num_bytes == 0 && keysym_return == NoSymbol) {
@@ -267,8 +398,10 @@ int LyXFunc::processKeyEvent(XEvent * ev)
                keyseq.print(buf);
                lyxerr << "Key ["
                       << action << "]["
-                      << buf << "]["
-                      << num_bytes << "]" << endl;
+                      << buf << "]"
+                      << "["
+                      << num_bytes << "]"
+                      << endl;
        }
 
        // already here we know if it any point in going further
@@ -302,11 +435,12 @@ int LyXFunc::processKeyEvent(XEvent * ev)
                        // so we`ll skip the dispatch.
                        return 0;
                }
-       } else
+       }
+       else
                if (action == LFUN_SELFINSERT) {
                        argument = s_r[0];
                }
-    
+
         bool tmp_sc = show_sc;
        show_sc = false;
        Dispatch(action, argument.c_str());
@@ -314,6 +448,7 @@ int LyXFunc::processKeyEvent(XEvent * ev)
        
        return 0;
 } 
+#endif
 
 
 LyXFunc::func_status LyXFunc::getStatus(int ac) const
@@ -360,6 +495,7 @@ LyXFunc::func_status LyXFunc::getStatus(int ac) const
         static bool noLaTeX = lyxrc.latex_command == "none";
         bool disable = false;
         switch (action) {
+#ifndef NEW_EXPORT
        case LFUN_PREVIEW:
                disable = noLaTeX || lyxrc.view_dvi_command == "none";
                break;
@@ -370,6 +506,7 @@ LyXFunc::func_status LyXFunc::getStatus(int ac) const
        case LFUN_RUNDVIPS:
                disable = noLaTeX;
                break;
+#endif
        case LFUN_MENUPRINT:
                disable = noLaTeX || lyxrc.print_command == "none";
                break;
@@ -382,6 +519,7 @@ LyXFunc::func_status LyXFunc::getStatus(int ac) const
                else if (argument == "linuxdoc")
                        disable = lyxrc.linuxdoc_to_lyx_command == "none";
                break;
+#ifndef NEW_EXPORT
        case LFUN_EXPORT:
                if (argument == "latex")
                        disable = (! buf->isLatex() && ! buf->isLiterate()) ;
@@ -401,6 +539,7 @@ LyXFunc::func_status LyXFunc::getStatus(int ac) const
                else if (argument == "custom")
                        disable = (! buf->isLatex() && ! buf->isLiterate());
                break;
+#endif
        case LFUN_UNDO:
                disable = buf->undostack.empty();
                break;
@@ -434,7 +573,7 @@ LyXFunc::func_status LyXFunc::getStatus(int ac) const
        case LFUN_TABULAR_FEATURE:
                disable = true;
                if (owner->view()->the_locking_inset) {
-                       int ret = 0;
+                       func_status ret = LyXFunc::Disabled;
                        if (owner->view()->the_locking_inset->LyxCode() == Inset::TABULAR_CODE) {
                                ret = static_cast<InsetTabular *>
                                        (owner->view()->the_locking_inset)->
@@ -445,21 +584,17 @@ LyXFunc::func_status LyXFunc::getStatus(int ac) const
                                        GetFirstLockingInsetOfType(Inset::TABULAR_CODE))->
                                        getStatus(argument);
                        }
-                       switch(ret) {
-                       case 0:
-                               break;
-                       case 1:
-                               disable = false;
-                               break;
-                       case 2:
-                               disable = false;
-                               flag |= LyXFunc::ToggleOn;
-                               break;
-                       case 3:
-                               disable = false;
-                               flag |= LyXFunc::ToggleOff;
-                               break;
-                       }
+                       flag |= ret;
+                       disable = false;
+               } else {
+                   static InsetTabular inset(owner->buffer(), 1, 1);
+                   func_status ret;
+
+                   disable = true;
+                   ret = inset.getStatus(argument);
+                   if ((ret & LyXFunc::ToggleOn) ||
+                       (ret & LyXFunc::ToggleOff))
+                       flag |= LyXFunc::ToggleOff;
                }
                break;
 
@@ -485,7 +620,13 @@ LyXFunc::func_status LyXFunc::getStatus(int ac) const
 
        if (buf) {
                func_status box = LyXFunc::ToggleOff;
-               LyXFont font = owner->view()->text->real_current_font;
+               LyXFont font;
+               if (owner->view()->the_locking_inset &&
+                   owner->view()->the_locking_inset->getLyXText(owner->view()))
+                   font = owner->view()->the_locking_inset->
+                       getLyXText(owner->view())->real_current_font;
+               else
+                   font = owner->view()->text->real_current_font;
                switch (action) {
                case LFUN_EMPH:
                        if (font.emph() == LyXFont::ON)
@@ -835,6 +976,15 @@ string LyXFunc::Dispatch(int ac,
                reloadBuffer();
                break;
                
+#ifdef NEW_EXPORT
+       case LFUN_UPDATE:
+               Exporter::Export(owner->buffer(), argument, true);
+               break;
+
+       case LFUN_PREVIEW:
+               Exporter::Preview(owner->buffer(), argument);
+               break;
+#else
        case LFUN_PREVIEW:
                PreviewDVI(owner->buffer());
                break;
@@ -846,6 +996,11 @@ string LyXFunc::Dispatch(int ac,
        case LFUN_RUNLATEX:
                MenuRunLaTeX(owner->buffer());
                break;
+
+       case LFUN_RUNDVIPS:
+               CreatePostscript(owner->buffer(), false);
+               break;
+#endif
                
         case LFUN_BUILDPROG:
                 MenuBuildProg(owner->buffer());
@@ -854,11 +1009,7 @@ string LyXFunc::Dispatch(int ac,
        case LFUN_RUNCHKTEX:
                MenuRunChktex(owner->buffer());
                break;
-               
-       case LFUN_RUNDVIPS:
-               CreatePostscript(owner->buffer(), false);
-               break;
-               
+                               
        case LFUN_MENUPRINT:
                owner->getDialogs()->showPrint();
                break;
@@ -868,7 +1019,11 @@ string LyXFunc::Dispatch(int ac,
                break;
                        
        case LFUN_EXPORT:
+#ifdef NEW_EXPORT
+               Exporter::Export(owner->buffer(), argument, false);
+#else
                MenuExport(owner->buffer(), argument);
+#endif
                break;
 
        case LFUN_IMPORT:
@@ -921,7 +1076,7 @@ string LyXFunc::Dispatch(int ac,
                break;
        }
                
-       case LFUN_TABLE:
+       case LFUN_DIALOG_TABULAR_INSERT:
 #ifndef NEW_TABULAR
                Table();
 #else
@@ -930,6 +1085,7 @@ string LyXFunc::Dispatch(int ac,
                break;
                
        case LFUN_TABULAR_FEATURE:
+       case LFUN_SCROLL_INSET:
                // this is not handled here as this funktion is only aktive
                // if we have a locking_inset and that one is (or contains)
                // a tabular-inset
@@ -945,8 +1101,9 @@ string LyXFunc::Dispatch(int ac,
                if (!owner->view()->insertInset(new_inset)) {
                        delete new_inset;
                } else {
-                   // this is need because you don't use a inset->Edit()
-                   owner->view()->updateInset(new_inset, true);
+                       // this is need because you don't use a inset->Edit()
+                       owner->view()->updateInset(new_inset, true);
+                       new_inset->Edit(owner->view(), 0, 0, 0);
                }
                break;
        }
@@ -1285,7 +1442,11 @@ string LyXFunc::Dispatch(int ac,
        break;
 
        case LFUN_LAYOUT_DOCUMENT:
+#ifdef USE_OLD_DOCUMENT_LAYOUT
                MenuLayoutDocument();
+#else
+               owner->getDialogs()->showLayoutDocument();
+#endif
                break;
                
        case LFUN_LAYOUT_PARAGRAPH:
@@ -1320,11 +1481,15 @@ string LyXFunc::Dispatch(int ac,
            break;
 
        case LFUN_LAYOUT_PAPER:
+#ifdef USE_OLD_DOCUMENT_LAYOUT
                MenuLayoutPaper();
+#endif
                break;
                
        case LFUN_LAYOUT_QUOTES:
+#ifdef USE_OLD_DOCUMENT_LAYOUT
                MenuLayoutQuotes();
+#endif
                break;
                
        case LFUN_LAYOUT_PREAMBLE:
@@ -1419,30 +1584,33 @@ string LyXFunc::Dispatch(int ac,
                MenuInsertLabel(argument.c_str());
                break;
                
-       case LFUN_INSERT_REF:
-               MenuInsertRef();
-               break;
+       case LFUN_REF_CREATE:
+       {
+               InsetCommandParams p( "ref" );
+               owner->getDialogs()->createRef( p.getAsString() );
+       }
+       break;
                
-       case LFUN_REFTOGGLE:
+       case LFUN_REF_INSERT:
        {
-               InsetRef * inset = 
-                       static_cast<InsetRef*>(getInsetByCode(Inset::REF_CODE));
-               if (inset) {
-                       inset->Toggle();
-                       owner->view()->updateInset(inset, true);
-               } else {
-                       setErrorMessage(N_("No cross-reference to toggle"));
-               }
+               InsetCommandParams p;
+               p.setFromString( argument );
+
+               InsetRef * inset = new InsetRef( p );
+               if (!owner->view()->insertInset(inset))
+                       delete inset;
+               else
+                       owner->view()->updateInset( inset, true );
        }
        break;
-       
-       case LFUN_REFBACK:
+                   
+       case LFUN_REF_BACK:
        {
                owner->view()->restorePosition();
        }
        break;
 
-       case LFUN_REFGOTO:
+       case LFUN_REF_GOTO:
        {
                string label(argument);
                if (label.empty()) {
@@ -2572,20 +2740,19 @@ string LyXFunc::Dispatch(int ac,
                // ale970405+lasgoutt970425
                // The argument can be up to two tokens separated 
                // by a space. The first one is the bibstyle.
-               string lsarg(argument);
-               string bibstyle = token(lsarg, ' ', 1);
+               string db       = token(argument, ' ', 0);
+               string bibstyle = token(argument, ' ', 1);
                if (bibstyle.empty())
                        bibstyle = "plain";
-               InsetBibtex * new_inset 
-                       = new InsetBibtex(token(lsarg, ' ', 0),
-                                         bibstyle,
-                                         owner->buffer());
+
+               InsetCommandParams p( "BibTeX", db, bibstyle );
+               InsetBibtex * inset = new InsetBibtex(p, owner->buffer());
                
-               if (owner->view()->insertInset(new_inset)) {
-                       if (lsarg.empty())
-                               new_inset->Edit(owner->view(), 0, 0, 0);
+               if (owner->view()->insertInset(inset)) {
+                       if (argument.empty())
+                               inset->Edit(owner->view(), 0, 0, 0);
                } else
-                       delete new_inset;
+                       delete inset;
        }
        break;
                
@@ -2621,28 +2788,22 @@ string LyXFunc::Dispatch(int ac,
        break;
                
        case LFUN_INDEX_CREATE:
-       case LFUN_INDEX_CREATE_LAST:
        {
-               // Can't do that at the beginning of a paragraph.
-               if (owner->view()->text->cursor.pos() - 1 < 0)
-                       break;
-
                InsetCommandParams p( "index" );
                
-               if (!argument.empty()) {
-                       p.setContents( argument );
-               } else {
-                       //get the current word for an argument
-                       LyXParagraph::size_type lastpos = 
+               if( argument.empty() ) {
+                       // Get the word immediately preceding the cursor
+                       LyXParagraph::size_type curpos = 
                                owner->view()->text->cursor.pos() - 1;
-                       // Get the current word. note that this must be done
-                       // before inserting the inset, or the inset will
-                       // break the word
-                       string curstring(owner->view()
-                                        ->text->cursor.par()->GetWord(lastpos));
 
-                       //make the new inset and write the current word into it
+                       string curstring;
+                       if( curpos >= 0 )
+                               curstring = owner->view()->text
+                                           ->cursor.par()->GetWord(curpos);
+
                        p.setContents( curstring );
+               } else {
+                       p.setContents( argument );
                }
 
                owner->getDialogs()->createIndex( p.getAsString() );
@@ -2653,8 +2814,29 @@ string LyXFunc::Dispatch(int ac,
        {
                InsetCommandParams p;
                p.setFromString( argument );
+               InsetIndex * inset = new InsetIndex( p );
 
+               if (!owner->view()->insertInset(inset))
+                       delete inset;
+               else
+                       owner->view()->updateInset( inset, true );
+       }
+       break;
+                   
+       case LFUN_INDEX_INSERT_LAST:
+       {
+               // Get word immediately preceding the cursor
+               LyXParagraph::size_type curpos = 
+                       owner->view()->text->cursor.pos() - 1;
+               // Can't do that at the beginning of a paragraph
+               if( curpos < 0 ) break;
+
+               string curstring( owner->view()->text
+                                 ->cursor.par()->GetWord(curpos) );
+
+               InsetCommandParams p( "index", curstring );
                InsetIndex * inset = new InsetIndex( p );
+
                if (!owner->view()->insertInset(inset))
                        delete inset;
                else
@@ -2664,7 +2846,7 @@ string LyXFunc::Dispatch(int ac,
                    
        case LFUN_INDEX_PRINT:
        {
-               InsetCommandParams p("printindex");
+               InsetCommandParams p( "printindex" );
                Inset * inset = new InsetPrintIndex(p);
                if (!owner->view()->insertInset(inset, "Standard", true))
                        delete inset;
@@ -2674,20 +2856,21 @@ string LyXFunc::Dispatch(int ac,
        case LFUN_PARENTINSERT:
        {
                lyxerr << "arg " << argument << endl;
-               Inset * new_inset = new InsetParent(argument, owner->buffer());
-               if (!owner->view()->insertInset(new_inset, "Standard", true))
-                       delete new_inset;
+               InsetCommandParams p( "lyxparent", argument );
+               Inset * inset = new InsetParent(p, owner->buffer());
+               if (!owner->view()->insertInset(inset, "Standard", true))
+                       delete inset;
        }
        break;
 
        case LFUN_CHILDINSERT:
        {
-               Inset * new_inset = new InsetInclude(argument,
-                                                    owner->buffer());
-               if (owner->view()->insertInset(new_inset, "Standard", true))
-                       new_inset->Edit(owner->view(), 0, 0, 0);
+               InsetCommandParams p( "Include", argument );
+               Inset * inset = new InsetInclude(p, owner->buffer());
+               if (owner->view()->insertInset(inset, "Standard", true))
+                       inset->Edit(owner->view(), 0, 0, 0);
                else
-                       delete new_inset;
+                       delete inset;
        }
        break;
 
@@ -2821,6 +3004,22 @@ string LyXFunc::Dispatch(int ac,
        }
        break;
 
+       case LFUN_SCREEN_FONT_UPDATE:
+       {
+               // handle the screen font changes.
+               // 
+               lyxrc.set_font_norm_type();
+               fontloader.update();
+               // Of course we should only do the resize and the textcache.clear
+               // if values really changed...but not very important right now. (Lgb)
+               // All buffers will need resize
+               bufferlist.resize();
+               // We also need to empty the textcache so that
+               // the buffer will be formatted correctly after
+               // a zoom change.
+               textcache.clear();
+       }
+
        case LFUN_SET_COLOR:
        {
                string lyx_name, x11_name;
@@ -2945,32 +3144,35 @@ void LyXFunc::MenuNew(bool fromTemplate)
                        initpath = trypath;
        }
 
-#ifdef NEW_WITH_FILENAME
-       ProhibitInput(owner->view());
-       fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
-       fileDlg.SetButton(1, _("Templates"), lyxrc.template_path);
-       fname = fileDlg.Select(_("Enter Filename for new document"), 
-                              initpath, "*.lyx", _("newfile"));
-       AllowInput(owner->view());
+       static int newfile_number = 0;
+       string s;
+
+       if (lyxrc.new_ask_filename) {
+               ProhibitInput(owner->view());
+               fileDlg.SetButton(0, _("Documents"), lyxrc.document_path);
+               fileDlg.SetButton(1, _("Templates"), lyxrc.template_path);
+               fname = fileDlg.Select(_("Enter Filename for new document"), 
+                                      initpath, "*.lyx", _("newfile"));
+               AllowInput(owner->view());
        
-       if (fname.empty()) {
-               owner->getMiniBuffer()->Set(_("Canceled."));
-               lyxerr.debug() << "New Document Cancelled." << endl;
-               return;
-       }
+               if (fname.empty()) {
+                       owner->getMiniBuffer()->Set(_("Canceled."));
+                       lyxerr.debug() << "New Document Cancelled." << endl;
+                       return;
+               }
        
-       // get absolute path of file and make sure the filename ends
-       // with .lyx
-       string s = MakeAbsPath(fname);
-       if (!IsLyXFilename(s))
-               s += ".lyx";
-
-       // Check if the document already is open
-       if (bufferlist.exists(s)) {
-               switch(AskConfirmation(_("Document is already open:"), 
-                                      MakeDisplayPath(s, 50),
-                                      _("Do you want to close that document now?\n"
-                                        "('No' will just switch to the open version)")))
+               // get absolute path of file and make sure the filename ends
+               // with .lyx
+               s = MakeAbsPath(fname);
+               if (!IsLyXFilename(s))
+                       s += ".lyx";
+
+               // Check if the document already is open
+               if (bufferlist.exists(s)) {
+                       switch(AskConfirmation(_("Document is already open:"), 
+                                              MakeDisplayPath(s, 50),
+                                              _("Do you want to close that document now?\n"
+                                                "('No' will just switch to the open version)")))
                        {
                        case 1: // Yes: close the document
                                if (!bufferlist.close(bufferlist.getBuffer(s)))
@@ -2984,37 +3186,36 @@ void LyXFunc::MenuNew(bool fromTemplate)
                                owner->getMiniBuffer()->Set(_("Canceled."));
                                return;
                        }
-       }
-
-       // Check whether the file already exists
-       if (IsLyXFilename(s)) {
+               }
+               // Check whether the file already exists
+               if (IsLyXFilename(s)) {
+                       FileInfo fi(s);
+                       if (fi.readable() &&
+                           AskQuestion(_("File already exists:"), 
+                                       MakeDisplayPath(s, 50),
+                                       _("Do you want to open the document?"))) {
+                               // loads document
+                               owner->getMiniBuffer()->Set(_("Opening document"), 
+                                                           MakeDisplayPath(s), "...");
+                               XFlush(fl_display);
+                               owner->view()->buffer(
+                                       bufferlist.loadLyXFile(s));
+                               owner->getMiniBuffer()->Set(_("Document"),
+                                                           MakeDisplayPath(s),
+                                                           _("opened."));
+                               return;
+                       }
+               }
+       } else {
+               s = lyxrc.document_path + "newfile" + tostr(++newfile_number);
                FileInfo fi(s);
-               if (fi.readable() &&
-                   AskQuestion(_("File already exists:"), 
-                               MakeDisplayPath(s, 50),
-                               _("Do you want to open the document?"))) {
-                       // loads document
-                       owner->getMiniBuffer()->Set(_("Opening document"), 
-                                                   MakeDisplayPath(s), "...");
-                       XFlush(fl_display);
-                       owner->view()->buffer(
-                               bufferlist.loadLyXFile(s));
-                       owner->getMiniBuffer()->Set(_("Document"),
-                                                   MakeDisplayPath(s),
-                                                   _("opened."));
-                       return;
+               while (bufferlist.exists(s) || fi.readable()) {
+                       ++newfile_number;
+                       s = lyxrc.document_path + "newfile" +
+                               tostr(newfile_number);
+                       fi.newFile(s);
                }
        }
-#else
-       static int newfile_number = 0;
-       string s = "/lyx/dummy/dirname/newfile ["+tostr(++newfile_number)+"]";
-       FileInfo fi(s);
-       while (bufferlist.exists(s) || fi.readable()) {
-               ++newfile_number;
-               s = "/lyx/dummy/dirname/newfile ["+tostr(newfile_number)+"]";
-               fi.newFile(s);
-       }
-#endif
 
        // The template stuff
        string templname;