File: ExampleSimpleMenu.java

package info (click to toggle)
java-gnome 4.1.3-10
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, sid
  • size: 9,840 kB
  • sloc: java: 27,002; ansic: 4,517; perl: 1,651; python: 1,187; makefile: 136
file content (273 lines) | stat: -rw-r--r-- 9,408 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
/*
 * java-gnome, a UI library for writing GTK and GNOME programs from Java!
 *
 * Copyright © 2007      Vreixo Formoso
 * Copyright © 2007-2010 Operational Dynamics Consulting, Pty Ltd
 *
 * The code in this file, and the program it is a part of, is made available
 * to you by its authors as open source software: you can redistribute it
 * and/or modify it under the terms of the GNU General Public License version
 * 2 ("GPL") as published by the Free Software Foundation.
 *
 * 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 GPL for more details.
 *
 * You should have received a copy of the GPL along with this program. If not,
 * see http://www.gnu.org/licenses/. The authors of this program may be
 * contacted through http://java-gnome.sourceforge.net/.
 */
package menu;

import org.gnome.gdk.Event;
import org.gnome.gdk.Keyval;
import org.gnome.gdk.ModifierType;
import org.gnome.gtk.AcceleratorGroup;
import org.gnome.gtk.CheckMenuItem;
import org.gnome.gtk.Gtk;
import org.gnome.gtk.ImageMenuItem;
import org.gnome.gtk.Label;
import org.gnome.gtk.Menu;
import org.gnome.gtk.MenuBar;
import org.gnome.gtk.MenuItem;
import org.gnome.gtk.SeparatorMenuItem;
import org.gnome.gtk.Stock;
import org.gnome.gtk.VBox;
import org.gnome.gtk.Widget;
import org.gnome.gtk.Window;

/**
 * How to use {@link Menu} and related Widgets.
 * 
 * @author Vreixo Formoso
 * @author Andrew Cowie
 * @author Sarah Leibbrand
 */
public class ExampleSimpleMenu
{
    public ExampleSimpleMenu() {
        final Window window;
        final VBox box;
        final Label label;
        final Menu fileMenu, editMenu, viewMenu;
        final MenuItem file, edit, view;
        final MenuItem save, copy, paste;
        final ImageMenuItem nouveau, close;
        final AcceleratorGroup group;
        final MenuBar bar;

        /*
         * Begin with the standard VBox in a Window setup:
         */

        window = new Window();
        box = new VBox(false, 3);
        window.add(box);

        label = new Label("Select an action in a menu");
        label.setWidthChars(30);
        label.setAlignment(0.0f, 0.5f);

        /*
         * Most applications will use several Menus in a MenuBar:
         */
        fileMenu = new Menu();
        editMenu = new Menu();
        viewMenu = new Menu();

        /*
         * Create all of MenuItems that will be used:
         */
        nouveau = new ImageMenuItem(Stock.NEW);
        save = new MenuItem("_Save");
        close = new ImageMenuItem(Stock.CLOSE);
        copy = new MenuItem("_Edit");
        paste = new MenuItem("_Paste");

        /*
         * Create the AcceleratorGroup object and add it to the window.
         */

        group = new AcceleratorGroup();
        window.addAcceleratorGroup(group);

        /*
         * Now we add the keybindings for the menu items. This has to be done
         * before you append them to their Menus.
         */
        save.setAccelerator(group, Keyval.s, ModifierType.CONTROL_MASK);
        copy.setAccelerator(group, Keyval.c, ModifierType.CONTROL_MASK);
        paste.setAccelerator(group, Keyval.v, ModifierType.CONTROL_MASK);

        /*
         * For ImageMenuItems you can activate the keybinding that comes with
         * the Stock item instead.
         */
        nouveau.setAccelerator(group);

        /*
         * Despite 'close' also being an ImageMenuItem we could use the
         * keybinding that is set for Stock.CLOSE. But since we have already
         * set Control + C for editCopy we set this one manually to another
         * keybinding:
         */
        close.setAccelerator(group, Keyval.w, ModifierType.CONTROL_MASK);

        /*
         * To ensure keybindings will work we also have set the
         * AcceleratorGroup to the menus containing the MenuItems with the
         * keybindings.
         * 
         * Since we have not set a keybinding for hide text MenuItem we also
         * do not need to set the AcceleratorGroup of the Menu containing this
         * menu item. Also if a Menu only contains MenuItems with keybindings
         * set from Stock Items (and not set a keybinding manually) it is also
         * not needed.
         */
        fileMenu.setAcceleratorGroup(group);
        editMenu.setAcceleratorGroup(group);

        /*
         * Now you can add MenuItems to the "file" Menu.
         */
        fileMenu.append(nouveau);
        fileMenu.append(save);

        /*
         * A SeparatorMenuItem can be used to differentiate between unrelated
         * menu options; in practise, though, only use sparingly.
         */
        fileMenu.append(new SeparatorMenuItem());

        /*
         * And add the rest of the menu items.
         */
        fileMenu.append(close);
        editMenu.append(copy);
        editMenu.append(paste);

        /*
         * Usually you will want to connect to the MenuItem.Activate signal,
         * that is emitted when the user "activates" the menu by either
         * clicking it with the mouse or navigating to it with the keyboard
         * and pressing <ENTER>.
         */
        nouveau.connect(new MenuItem.Activate() {
            public void onActivate(MenuItem source) {
                label.setLabel("You have selected File->New menu.");
            }
        });
        save.connect(new MenuItem.Activate() {
            public void onActivate(MenuItem source) {
                label.setLabel("You have selected File->Save.");
            }
        });

        close.connect(new MenuItem.Activate() {
            public void onActivate(MenuItem source) {
                label.setLabel("You have selected File->Close.");
            }
        });

        /*
         * Given that in most cases you will connect to the MenuItem.Activate
         * signal on MenuItems, a convenience constructor is provided:
         */
        fileMenu.append(new MenuItem("_Quit", new MenuItem.Activate() {
            public void onActivate(MenuItem source) {
                Gtk.mainQuit();
            }
        }));

        /*
         * And now add the actions for the items making up the "edit" Menu.
         */
        copy.connect(new MenuItem.Activate() {
            public void onActivate(MenuItem source) {
                label.setLabel("You have selected Edit->Copy.");
            }
        });
        paste.connect(new MenuItem.Activate() {
            public void onActivate(MenuItem source) {
                label.setLabel("You have selected Edit->Paste.");
            }
        });

        /*
         * CheckMenuItems hold a boolean state. One use is to allow users to
         * hide some parts of the GUI, as in this example which we put into
         * the "view" Menu:
         */
        viewMenu.append(new CheckMenuItem("Hide _text", new CheckMenuItem.Toggled() {
            public void onToggled(CheckMenuItem source) {
                if (source.getActive()) {
                    label.hide();
                } else {
                    label.show();
                }
            }
        }));

        /*
         * A MenuItem can have a "sub-menu", that will be expanded when the
         * user puts the mouse pointer over it. This is also used in creating
         * the elements for the top level MenuBar, but you can use it within
         * normal Menus as well. That said, submenus of Menus are considered
         * less "discoverable" because the user has to navigate through the
         * hierarchy to find out what options are available to them, rather
         * than seeing them at first glance.
         */
        file = new MenuItem("_File");
        file.setSubmenu(fileMenu);
        edit = new MenuItem("_Edit");
        edit.setSubmenu(editMenu);
        view = new MenuItem("_View");
        view.setSubmenu(viewMenu);

        /*
         * Finally, most applications make use of a MenuBar that is by
         * convention located at the top of the application Window. It
         * contains the top-level MenuItems.
         */
        bar = new MenuBar();
        bar.append(file);
        bar.append(edit);
        bar.append(view);

        /*
         * Finally, pack the Widgets into the VBox, and present.
         */
        box.packStart(bar, false, false, 0);
        box.packStart(label, false, false, 0);

        window.showAll();

        /*
         * And that's it! One last piece of house keeping, though: it is
         * always necessary to deal with the user closing (what is in this
         * case) the last Window in the application; otherwise the Java VM
         * will keep running even after the (sole) Window is closed - because
         * the main loop never returned.
         */
        window.connect(new Window.DeleteEvent() {
            public boolean onDeleteEvent(Widget source, Event event) {
                Gtk.mainQuit();
                return false;
            }
        });
    }

    public static void main(String[] args) {
        Gtk.init(args);

        new ExampleSimpleMenu();

        /*
         * Yes, you could have written all the Window creation code here in
         * main() but it is generally good practise to put that setup into a
         * constructor, as we have here.
         */

        Gtk.main();
    }
}