]> git.lyx.org Git - lyx.git/blobdiff - src/lyxfunc.C
Fixed disabled Table-Menu entries, renamed table-insert to dialog-tabular-insert
[lyx.git] / src / lyxfunc.C
index fe0b186c8cd605041eb6e3b4d2eaece1a92d88ad..32984cbd0cdc32ecb79af364fefa975bf299ef4c 100644 (file)
@@ -92,6 +92,8 @@ using std::istringstream;
 #include "menus.h"
 #endif
 #include "FloatList.h"
+#include "FontLoader.h"
+#include "TextCache.h"
 
 using std::pair;
 using std::endl;
@@ -108,7 +110,7 @@ extern bool selection_possible;
 
 extern kb_keymap * toplevel_keymap;
 
-extern void MenuWrite(Buffer *);
+extern bool MenuWrite(Buffer *);
 extern bool MenuWriteAs(Buffer *);
 extern int  MenuRunLaTeX(Buffer *);
 extern int  MenuBuildProg(Buffer *);
@@ -129,7 +131,6 @@ extern void AutoSave(BufferView *);
 extern bool PreviewDVI(Buffer *);
 extern bool PreviewPostscript(Buffer *);
 extern void MenuInsertLabel(char const *);
-extern void MenuInsertRef();
 extern void MenuLayoutCharacter();
 extern void MenuLayoutParagraph();
 extern void MenuLayoutDocument();
@@ -186,13 +187,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 +327,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 +389,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 +426,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 +439,7 @@ int LyXFunc::processKeyEvent(XEvent * ev)
        
        return 0;
 } 
+#endif
 
 
 LyXFunc::func_status LyXFunc::getStatus(int ac) const
@@ -434,7 +560,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 +571,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 +607,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)
@@ -921,7 +1049,7 @@ string LyXFunc::Dispatch(int ac,
                break;
        }
                
-       case LFUN_TABLE:
+       case LFUN_DIALOG_TABULAR_INSERT:
 #ifndef NEW_TABULAR
                Table();
 #else
@@ -1287,7 +1415,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:
@@ -1322,11 +1454,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:
@@ -1421,30 +1557,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()) {
@@ -2838,6 +2977,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;
@@ -2963,7 +3118,7 @@ void LyXFunc::MenuNew(bool fromTemplate)
        }
 
        static int newfile_number = 0;
-       string s = "newfile"+tostr(++newfile_number);
+       string s;
 
        if (lyxrc.new_ask_filename) {
                ProhibitInput(owner->view());
@@ -2981,7 +3136,7 @@ void LyXFunc::MenuNew(bool fromTemplate)
        
                // get absolute path of file and make sure the filename ends
                // with .lyx
-               string s = MakeAbsPath(fname);
+               s = MakeAbsPath(fname);
                if (!IsLyXFilename(s))
                        s += ".lyx";
 
@@ -3025,10 +3180,12 @@ void LyXFunc::MenuNew(bool fromTemplate)
                        }
                }
        } else {
+               s = lyxrc.document_path + "newfile" + tostr(++newfile_number);
                FileInfo fi(s);
                while (bufferlist.exists(s) || fi.readable()) {
                        ++newfile_number;
-                       s = "newfile"+tostr(newfile_number);
+                       s = lyxrc.document_path + "newfile" +
+                               tostr(newfile_number);
                        fi.newFile(s);
                }
        }