The R Project SVN R

Rev

Rev 49479 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

/*
 *  R : A Computer Language for Statistical Data Analysis
 *  Copyright (C) 1998--1999  Guido Masarotto
 *  Copyright (C) 2004 The R Foundation
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, a copy is available at
 *  http://www.r-project.org/Licenses/
 */

/*
   Pop-up menus support + convenience methods for definining
   menubar (and pop-up) from static array of MenuItem (defined in
   ga.h)
 */

#include "win-nls.h"
#include "internal.h"

static void mdimenu(menuitem m)
{
    switch (getvalue(m)) {
    case 1:
    SendMessage(hwndClient,WM_MDICASCADE,0,0);
    break;
    case 2:
    SendMessage(hwndClient,WM_MDITILE,MDITILE_HORIZONTAL,0);
    break;
    case 3:
    SendMessage(hwndClient,WM_MDITILE,MDITILE_VERTICAL,0);
    break;  
    case 4:
    SendMessage(hwndClient,WM_MDIICONARRANGE,0,0);
    break;
    }
}

menu newmdimenu()
{
    menu m ;
    if (!ismdi()) return NULL;
    m = newmenu(G_("Windows"));
    setvalue(newmenuitem(G_("Cascade"),0,mdimenu),1);
    setvalue(newmenuitem(G_("Tile &Horizontally"),0,mdimenu),2);
    setvalue(newmenuitem(G_("Tile &Vertically"),0,mdimenu),3);
    setvalue(newmenuitem(G_("Arrange Icons"),0,mdimenu),4);
    current_menubar->menubar = m;
    return m;
}

menu newpopup(actionfn fn)
{
    menu mnew;
    if (!current_window) return 0;
    mnew = newsubmenu(current_window,"");
    mnew->action = fn;
    current_window->popup = mnew;
    current_menu = mnew;
    return mnew;
}

void gchangepopup(window w, menu m)
{
    w->popup = m;
}

void gchangemenubar(menubar mb)
{
    window w = current_window;
    if (!w) return;
    w->menubar = mb;
    SetMenu(w->handle, mb->handle);
    if (ismdi()) {
    menu mdi = (w->menubar)->menubar;
    SendMessage(hwndClient, WM_MDISETMENU,
            (WPARAM)w->menubar->handle,
            (LPARAM)(mdi ? (mdi->handle) : 0));
    DrawMenuBar(hwndFrame);
    } else
    DrawMenuBar(w->handle);
}

/* FIXME: only one level of sub-menu - no checks -*/
static int addmenuitemarray(menu m,MenuItem a[])
{
    menu ma  = m;
    int i = 0;
    while (a[i].nm) {
    if (!strcmp(a[i].nm,"@STARTMENU")) {
        i += 1;
        ma = newsubmenu(m, G_(a[i].nm));
    }
    else if (!strcmp(a[i].nm,"@ENDMENU")) {
        i += 1;
        ma = m;
    }
    else if (!strcmp(a[i].nm,"@STARTSUBMENU")) {
        i += 1;
        newsubmenu(ma,a[i].nm);
    }
    else if (!strcmp(a[i].nm,"@ENDSUBMENU")) {
        i += 1;
    }
    else if (!strcmp(a[i].nm,"@MDIMENU")) {
        if (!(a[i].m = newmdimenu())) return 0;
        ma = a[i].m;
    }
    else {
        if (!(a[i].m = newmenuitem(G_(a[i].nm), a[i].key, a[i].fn))) return 0;
    }
    i += 1;
    }
    return 1;
}

menubar gmenubar(actionfn fn, MenuItem a[])
{
    menubar m = newmenubar(fn);
    if (m)  {
    if (!addmenuitemarray(m,a)) {
        del(m);
        m = NULL;
    }
    }
    return m;
}


popup gpopup(actionfn fn, MenuItem a[])
{
    popup m = newpopup(fn);
    if (m)  {
    if (!addmenuitemarray(m,a)) {
        del(m);
        m = NULL;
    }
    }
    return m;
}