blob: 1ea0e359bb24ab10f4b4708b787b0dfed158d27d [file] [log] [blame]
/*
* 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
* https://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;
}