/*
* ******************************************************************************
* * Copyright 2015 See AUTHORS file.
* *
* * 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 com.uwsoft.editor.view.menu;
import java.io.File;
import java.util.ArrayList;
import org.apache.commons.lang3.SystemUtils;
import com.badlogic.gdx.scenes.scene2d.ui.Cell;
import com.badlogic.gdx.utils.Array;
import com.kotcrab.vis.ui.widget.MenuItem;
import com.kotcrab.vis.ui.widget.PopupMenu;
import com.uwsoft.editor.data.manager.PreferencesManager;
import com.uwsoft.editor.Overlap2DFacade;
import com.uwsoft.editor.event.MenuItemListener;
import com.uwsoft.editor.renderer.data.SceneVO;
import com.uwsoft.editor.view.ui.widget.CustomMenu;
import com.uwsoft.editor.view.ui.widget.CustomMenuBar;
public class Overlap2DMenuBar extends CustomMenuBar {
public static final String prefix = "com.uwsoft.editor.view.Overlap2DMenuBar";
public static final String FILE_MENU = prefix + ".FILE_MENU";
public static final String NEW_PROJECT = prefix + ".NEW_PROJECT";
public static final String OPEN_PROJECT = prefix + ".OPEN_PROJECT";
public static final String SAVE_PROJECT = prefix + ".SAVE_PROJECT";
public static final String IMPORT_TO_LIBRARY = prefix + ".IMPORT_TO_LIBRARY";
public static final String RECENT_PROJECTS = prefix + ".RECENT_PROJECTS";
public static final String CLEAR_RECENTS = prefix + ".CLEAR_RECENTS";
public static final String EXPORT = prefix + ".EXPORT";
public static final String EXPORT_SETTINGS = prefix + ".EXPORT_SETTINGS";
public static final String EXIT = prefix + ".EXIT";
public static final String NEW_SCENE = prefix + ".NEW_SCENE";
public static final String SELECT_SCENE = prefix + ".SELECT_SCENE";
public static final String DELETE_CURRENT_SCENE = prefix + ".DELETE_CURRENT_SCENE";
//
public static final String EDIT_MENU = prefix + ".EDIT_MENU";
public static final String CUT = prefix + ".CUT";
public static final String COPY = prefix + ".COPY";
public static final String PASTE = prefix + ".PASTE";
public static final String UNDO = prefix + ".UNDO";
public static final String REDO = prefix + ".REDO";
//
public static final String WINDOW_MENU = prefix + ".WINDOW_MENU";
public static final String SPRITE_ANIMATIONS_EDITOR_OPEN = prefix + ".SPRITE_ANIMATIONS_EDITOR_OPEN";
public static final String CUSTOM_VARIABLES_EDITOR_OPEN = prefix + ".CUSTOM_VARIABLES_EDITOR_OPEN";
public static final String RECENT_LIST_MODIFIED = prefix + ".RECENT_LIST_MODIFIED";
private static final String TAG = Overlap2DMenuBar.class.getCanonicalName();
private final FileMenu fileMenu;
private final String maskKey;
private final EditMenu editMenu;
private final WindowMenu windowMenu;
private final Overlap2DFacade facade;
public Overlap2DMenuBar() {
facade = Overlap2DFacade.getInstance();
maskKey = SystemUtils.IS_OS_MAC_OSX || SystemUtils.IS_OS_MAC ? "Cmd" : "Ctrl";
fileMenu = new FileMenu();
editMenu = new EditMenu();
windowMenu = new WindowMenu();
// getTable().debug();
addMenu(fileMenu);
addMenu(editMenu);
addMenu(windowMenu);
setProjectOpen(false);
}
public void addScenes(ArrayList<SceneVO> scenes) {
fileMenu.addScenes(scenes);
}
public void reInitScenes(ArrayList<SceneVO> scenes) {
fileMenu.reInitScenes(scenes);
}
public void reInitRecent(ArrayList<String> paths) {
fileMenu.reInitRecent(paths);
}
public void setProjectOpen(boolean open) {
fileMenu.setProjectOpen(open);
editMenu.setProjectOpen(open);
windowMenu.setProjectOpen(open);
}
private class WindowMenu extends O2DMenu {
private final MenuItem customVars;
private final MenuItem animations;
public WindowMenu() {
super("Window");
customVars = new MenuItem("Custom Variables", new MenuItemListener(CUSTOM_VARIABLES_EDITOR_OPEN, null, WINDOW_MENU));
animations = new MenuItem("Sprite Animations", new MenuItemListener(SPRITE_ANIMATIONS_EDITOR_OPEN, null, WINDOW_MENU));
addItem(customVars);
addItem(animations);
}
public void setProjectOpen(boolean open) {
customVars.setDisabled(!open);
animations.setDisabled(!open);
}
}
private class EditMenu extends O2DMenu {
private final MenuItem cut;
private final MenuItem copy;
private final MenuItem paste;
private final MenuItem undo;
private final MenuItem redo;
public EditMenu() {
super("Edit");
cut = new MenuItem("Cut", new MenuItemListener(CUT, null, EDIT_MENU)).setShortcut(maskKey + " + X");
copy = new MenuItem("Copy", new MenuItemListener(COPY, null, EDIT_MENU)).setShortcut(maskKey + " + C");
paste = new MenuItem("Paste", new MenuItemListener(PASTE, null, EDIT_MENU)).setShortcut(maskKey + " + P");
undo = new MenuItem("Undo", new MenuItemListener(UNDO, null, EDIT_MENU)).setShortcut(maskKey + " + Z");
redo = new MenuItem("Redo", new MenuItemListener(REDO, null, EDIT_MENU)).setShortcut(maskKey + " + Shift + Z");
addItem(cut);
addItem(copy);
addItem(paste);
addItem(undo);
addItem(redo);
}
public void setProjectOpen(boolean open) {
cut.setDisabled(!open);
copy.setDisabled(!open);
paste.setDisabled(!open);
undo.setDisabled(!open);
redo.setDisabled(!open);
}
}
private class FileMenu extends O2DMenu {
private final PopupMenu scenesPopupMenu;
private final Array<MenuItem> sceneMenuItems;
private final MenuItem saveProject;
private final MenuItem scenesMenuItem;
private final MenuItem importToLibrary;
private final MenuItem export;
private final MenuItem exportSettings;
private final PopupMenu recentProjectsPopupMenu;
private final Array<MenuItem> recentProjectsMenuItems;
private final MenuItem recentProjectsMenuItem;
public FileMenu() {
super("File");
saveProject = new MenuItem("Save Project", new MenuItemListener(SAVE_PROJECT, null, FILE_MENU));
addItem(new MenuItem("New Project", new MenuItemListener(NEW_PROJECT, null, FILE_MENU)));
addItem(new MenuItem("Open Project", new MenuItemListener(OPEN_PROJECT, null, FILE_MENU)));
addItem(saveProject);
//
scenesMenuItem = new MenuItem("Scenes");
scenesPopupMenu = new PopupMenu();
scenesMenuItem.setSubMenu(scenesPopupMenu);
addItem(scenesMenuItem);
//
addSeparator();
importToLibrary = new MenuItem("Import Resources", new MenuItemListener(IMPORT_TO_LIBRARY, null, FILE_MENU));
export = new MenuItem("Export", new MenuItemListener(EXPORT, null, FILE_MENU));
exportSettings = new MenuItem("Export Settings", new MenuItemListener(EXPORT_SETTINGS, null, FILE_MENU));
addItem(importToLibrary);
addItem(export);
addItem(exportSettings);
//
addSeparator();
recentProjectsMenuItem = new MenuItem("Recent Projects...");
recentProjectsPopupMenu = new PopupMenu();
recentProjectsMenuItem.setSubMenu(recentProjectsPopupMenu);
addItem(recentProjectsMenuItem);
recentProjectsMenuItems = new Array<>();
PreferencesManager prefs = PreferencesManager.getInstance();
prefs.buildRecentHistory();
reInitRecent(prefs.getRecentHistory());
//
addSeparator();
addItem(new MenuItem("Exit", new MenuItemListener(EXIT, null , FILE_MENU)));
sceneMenuItems = new Array<>();
}
public void addScenes(ArrayList<SceneVO> scenes) {
for (SceneVO sceneVO : scenes) {
MenuItem menuItem = new MenuItem(sceneVO.sceneName, new MenuItemListener(SELECT_SCENE, sceneVO.sceneName, FILE_MENU));
sceneMenuItems.add(menuItem);
scenesPopupMenu.addItem(menuItem);
}
}
public void reInitScenes(ArrayList<SceneVO> scenes) {
sceneMenuItems.clear();
scenesPopupMenu.clear();
scenesPopupMenu.addItem(new MenuItem("Create New Scene", new MenuItemListener(NEW_SCENE, null, FILE_MENU)));
scenesPopupMenu.addItem(new MenuItem("Delete Current Scene", new MenuItemListener(DELETE_CURRENT_SCENE, null, FILE_MENU)));
scenesPopupMenu.addSeparator();
addScenes(scenes);
}
public String getFolderNameAndPath(String path) {
File path1 = new File(path);
File path2 = new File(path1.getParent());
return path2.getName() + " - [ " + path + "]";
}
public void addRecent(ArrayList<String> paths) {
for (String path : paths) {
MenuItem menuItem = new MenuItem(getFolderNameAndPath(path) , new MenuItemListener(RECENT_PROJECTS, path, FILE_MENU));
recentProjectsMenuItems.add(menuItem);
recentProjectsPopupMenu.addItem(menuItem);
}
}
public void reInitRecent(ArrayList<String> paths) {
recentProjectsMenuItems.clear();
recentProjectsPopupMenu.clear();
addRecent(paths);
if (paths.size() > 0) {
recentProjectsPopupMenu.addSeparator();
}
MenuItem menuItem = new MenuItem("Clear list", new MenuItemListener(CLEAR_RECENTS, null, FILE_MENU));
recentProjectsMenuItems.add(menuItem);
recentProjectsPopupMenu.addItem(menuItem);
}
public void setProjectOpen(boolean open) {
saveProject.setDisabled(!open);
scenesMenuItem.setDisabled(!open);
importToLibrary.setDisabled(!open);
export.setDisabled(!open);
exportSettings.setDisabled(!open);
}
// private class RecentProjectListener extends ChangeListener {
// private final String path;
//
// public RecentProjectListener(String path) {
// this.path = path;
// }
//
// @Override
// public void changed(ChangeEvent event, Actor actor) {
// Gdx.app.log(TAG, "recentProject : " + path);
// mediator.recentProjectItemClicked(path);
// }
// }
}
class O2DMenu extends CustomMenu {
public O2DMenu(String title) {
super(title);
Cell labelCell = openButton.getLabelCell();
labelCell.width(openButton.getWidth() + 14);
}
}
public void addMenuItem(String menu, String subMenuName, String notificationName) {
if(menu.equals(FILE_MENU)) {
fileMenu.addItem(new MenuItem(subMenuName, new MenuItemListener(notificationName, null, menu)));
}
if(menu.equals(EDIT_MENU)) {
editMenu.addItem(new MenuItem(subMenuName, new MenuItemListener(notificationName, null, menu)));
}
if(menu.equals(WINDOW_MENU)) {
windowMenu.addItem(new MenuItem(subMenuName, new MenuItemListener(notificationName, null, menu)));
}
}
}