/*
* ARX: Powerful Data Anonymization
* Copyright 2012 - 2017 Fabian Prasser, Florian Kohlmayer and contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.deidentifier.arx.gui.view.impl;
import java.util.List;
import org.deidentifier.arx.gui.Controller;
import org.deidentifier.arx.gui.model.Model;
import org.deidentifier.arx.gui.model.ModelEvent;
import org.deidentifier.arx.gui.model.ModelEvent.ModelPart;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
/**
* This class implements the global main menu.
*
* @author Fabian Prasser
*/
public class MainMenu extends AbstractMenu {
/** The menu */
private Menu menu;
/**
* Creates a new instance.
*
* @param shell
* @param controller
* @param items
*/
public MainMenu(final Shell shell, final Controller controller, final List<MainMenuItem> items) {
super(controller);
// Create Menu
this.menu = new Menu(shell, SWT.BAR);
// Create items
this.createItems(menu, items);
// Set menu bar
shell.setMenuBar(this.menu);
// Initialize
this.update(new ModelEvent(this, ModelPart.MODEL, null));
}
@Override
public void dispose() {
super.dispose();
if (!menu.isDisposed()) {
menu.dispose();
}
}
/**
* Creates all according entries
* @param menu
* @param items
*/
private void createItems(Menu menu, List<MainMenuItem> items) {
// For each item
for (final MainMenuItem item : items) {
// Create group
if (item instanceof MainMenuGroup) {
MainMenuGroup group = (MainMenuGroup) item;
MenuItem menuItem = new MenuItem(menu, SWT.CASCADE);
Menu menuMenu = new Menu(menu.getShell(), SWT.DROP_DOWN);
menuItem.setText(group.getLabel());
if (group.getImage() != null) {
menuItem.setImage(group.getImage());
}
menuItem.setMenu(menuMenu);
createItems(menuMenu, group.getItems());
menuItem.setEnabled(false);
menuItem.setData(item);
// Create separator
} else if (item instanceof MainMenuSeparator) {
new MenuItem(menu, SWT.SEPARATOR);
// Create item
} else {
MenuItem menuItem = new MenuItem(menu, SWT.PUSH);
menuItem.setText(item.getLabel());
if (item.getImage() != null) {
menuItem.setImage(item.getImage());
}
menuItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
item.action(getController());
}
});
menuItem.setData(item);
menuItem.setEnabled(false);
}
}
}
/**
* Updates the menu
* @param menu
* @param model
*/
private void update(Menu menu, Model model) {
// Check
if (menu == null) return;
// For each item
for (final MenuItem item : menu.getItems()) {
// Check group
if (item.getData() instanceof MainMenuGroup) {
MainMenuGroup group = (MainMenuGroup) item.getData();
item.setEnabled(group.isEnabled(model));
update(item.getMenu(), model);
// Check item
} else {
MainMenuItem mItem = (MainMenuItem) item.getData();
item.setEnabled(mItem == null || mItem.isEnabled(model));
}
}
}
@Override
protected void update(Model model) {
update(menu, model);
}
}