/** * * Copyright (c) 2009-2016 Freedomotic team http://freedomotic.com * * This file is part of Freedomotic * * 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, 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 * Freedomotic; see the file COPYING. If not, see * <http://www.gnu.org/licenses/>. */ package com.freedomotic.jfrontend; import java.awt.BorderLayout; import java.awt.Desktop; import java.awt.Dimension; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.KeyEventDispatcher; import java.awt.KeyboardFocusManager; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.KeyEvent; //import java.awt.event.WindowEvent; import java.beans.PropertyVetoException; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Collections; import java.util.Locale; import java.util.Vector; import javax.swing.AbstractListModel; import javax.swing.JComboBox; import javax.swing.JDesktopPane; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JScrollPane; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.WindowConstants; import org.apache.commons.io.FileUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.freedomotic.api.API; import com.freedomotic.api.Client; import com.freedomotic.api.Plugin; import com.freedomotic.app.Freedomotic; import com.freedomotic.core.ResourcesManager; import com.freedomotic.environment.EnvironmentLogic; import com.freedomotic.environment.Room; import com.freedomotic.environment.ZoneLogic; import com.freedomotic.events.GenericEvent; import com.freedomotic.exceptions.RepositoryException; import com.freedomotic.i18n.ComboLanguage; import com.freedomotic.i18n.I18n; import com.freedomotic.jfrontend.utils.OpenDialogFileFilter; import com.freedomotic.jfrontend.utils.TipOfTheDay; import com.freedomotic.model.environment.Zone; import com.freedomotic.plugins.ObjectPluginPlaceholder; import com.freedomotic.reactions.Command; import com.freedomotic.security.Auth; import com.freedomotic.settings.Info; import com.freedomotic.things.EnvObjectLogic; /** * * @author Enrico Nicoletti */ public class MainWindow extends javax.swing.JFrame { private Drawer drawer; private static boolean isFullscreen = false; private JavaDesktopFrontend master; private JDesktopPane desktopPane; private JInternalFrame frameClient; private JInternalFrame frameMap; private PluginJList lstClients; private boolean editMode; private final Auth Auth; private final API api; private final I18n i18n; private boolean isAuthenticated = false; private static final Logger LOG = LoggerFactory.getLogger(JavaDesktopFrontend.class.getName()); /** * * @return */ public Drawer getDrawer() { return drawer; } /** * * @param master */ public MainWindow(final JavaDesktopFrontend master) { this.i18n = master.getApi().getI18n(); UIManager.put("OptionPane.yesButtonText", i18n.msg("yes")); UIManager.put("OptionPane.noButtonText", i18n.msg("no")); UIManager.put("OptionPane.cancelButtonText", i18n.msg("cancel")); this.master = master; this.api = master.getApi(); this.Auth = api.getAuth(); ObjectEditor.setAPI(api); setWindowedMode(); updateMenusPermissions(); String defEnv = master.getApi().getConfig().getProperty("KEY_ROOM_XML_PATH"); EnvironmentLogic env = api.environments().findOne(defEnv.substring(defEnv.length() - 41, defEnv.length() - 5)); setEnvironment(env); checkDeletableEnvironments(); KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); manager.addKeyEventDispatcher(new MyDispatcher()); if (master.configuration.getBooleanProperty("show.tips", true)) { new TipOfTheDay(master); } } private void updateMenusPermissions() { mnuSwitchUser.setEnabled(Auth.isInited()); mnuNewEnvironment.setEnabled(Auth.isPermitted("environments:create")); mnuOpenEnvironment.setEnabled(Auth.isPermitted("environments:load")); frameMap.setVisible(Auth.isPermitted("environments:read")); mnuSave.setEnabled(Auth.isPermitted("environments:save")); mnuSaveAs.setEnabled(Auth.isPermitted("environments:save")); mnuRenameEnvironment.setEnabled(Auth.isPermitted("environments:update")); mnuPluginConfigure.setEnabled(Auth.isPermitted("plugins:update")); mnuPluginList.setEnabled(Auth.isPermitted("plugins:read")); frameClient.setVisible(Auth.isPermitted("plugins:read")); mnuPrivileges.setEnabled(Auth.isPermitted("auth:privileges:read") || Auth.isPermitted("auth:privileges:update")); mnuSelectEnvironment.setEnabled(master.getApi().environments().findAll().size() > 1); } private void setEnvironment(EnvironmentLogic input) { drawer.setCurrEnv(input); setMapTitle(input.getPojo().getName()); api.getConfig().setProperty("KEY_ROOM_XML_PATH", input.getSource().toString().replace( new File(Info.PATHS.PATH_DATA_FOLDER + "/furn").toString(), "")); } private class MyDispatcher implements KeyEventDispatcher { @Override public boolean dispatchKeyEvent(KeyEvent e) { if (e.getID() == KeyEvent.KEY_PRESSED) { if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { master.getMainWindow().setWindowedMode(); } if (e.getKeyCode() == KeyEvent.VK_F11) { master.getMainWindow().setFullscreenMode(); } } return false; } } /** * * @param editMode */ protected void setEditMode(boolean editMode) { this.editMode = editMode; mnuRenameRoom.setEnabled(editMode); mnuRemoveRoom.setEnabled(editMode); mnuAddRoom.setEnabled(editMode); mnuRoomBackground.setEnabled(editMode); } private void checkDeletableEnvironments() { // disable remove option if ther's just an available environment if (api.environments().findAll().size() == 1) { mnuDelete.setEnabled(false); } else { mnuDelete.setEnabled(true); } } private void setWindowedMode() { this.setVisible(false); this.dispose(); this.setUndecorated(false); this.setResizable(true); try { this.getContentPane().removeAll(); } catch (Exception e) { } try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { LOG.error("Cannot find system look&feel\n", ex.toString()); } catch (InstantiationException ex) { LOG.error("Cannot instantiate system look&feel\n", ex.toString()); } catch (IllegalAccessException ex) { LOG.error("Illegal access to system look&feel\n", ex.toString()); } catch (UnsupportedLookAndFeelException ex) { LOG.error("Unsupported system look&feel\n", ex.toString()); } setDefaultLookAndFeelDecorated(true); initComponents(); this.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); setLayout(new BorderLayout()); desktopPane = new JDesktopPane(); lstClients = new PluginJList(this); frameClient = new JInternalFrame(); frameClient.setLayout(new BorderLayout()); JScrollPane clientScroll = new JScrollPane(lstClients); frameClient.add(clientScroll, BorderLayout.CENTER); frameClient.setTitle(i18n.msg("loaded_plugins")); frameClient.setResizable(true); frameClient.setMaximizable(true); frameMap = new JInternalFrame(); setMapTitle(""); frameMap.setMaximizable(true); frameMap.setResizable(true); desktopPane.add(frameMap); desktopPane.add(frameClient); frameClient.moveToFront(); frameClient.setVisible(Auth.isPermitted("plugins:read")); desktopPane.moveToFront(this); this.getContentPane().add(desktopPane); try { frameClient.setSelected(true); } catch (PropertyVetoException ex) { LOG.error(Freedomotic.getStackTraceInfo(ex)); } EnvironmentLogic previousEnv = api.environments().findAll().get(0); if (drawer != null) { previousEnv = drawer.getCurrEnv(); } initializeRenderer(previousEnv); drawer = master.createRenderer(previousEnv); if (drawer != null) { setDrawer(drawer); ResourcesManager.clear(); } else { LOG.error("Unable to create a drawer to render the environment on the desktop frontend"); } this.setTitle("Freedomotic " + Info.getLicense() + " - www.freedomotic.com"); this.setSize(1100, 700); centerFrame(this); frameClient.moveToFront(); frameMap.moveToFront(); optimizeFramesDimension(); drawer.repaint(); lstClients.update(); frameClient.setVisible(Auth.isPermitted("plugins:read")); frameMap.setVisible(Auth.isPermitted("environments:read")); setEditMode(false); this.setVisible(true); isFullscreen = false; } private void setFullscreenMode() { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gd = ge.getDefaultScreenDevice(); if (gd.isFullScreenSupported()) { frameMap.setVisible(false); menuBar.setVisible(false); frameMap.dispose(); frameClient.setVisible(false); frameClient.dispose(); desktopPane.removeAll(); desktopPane.moveToBack(this); setVisible(false); dispose(); setUndecorated(true); setResizable(false); setLayout(new BorderLayout()); drawer = master.createRenderer(drawer.getCurrEnv()); if (drawer != null) { setDrawer(drawer); } else { LOG.error("Unable to create a drawer to render the environment on the desktop frontend in fullscreen mode"); } add(drawer); Rectangle maximumWindowBounds = ge.getMaximumWindowBounds(); setBounds(maximumWindowBounds); drawer.setVisible(true); this.setVisible(true); gd.setFullScreenWindow(this); isFullscreen = true; Callout callout = new Callout(this.getClass().getCanonicalName(), "info", i18n.msg("esc_to_exit_fullscreen"), 100, 100, 0, 5000); drawer.createCallout(callout); } } private void logUser() { // send command to restart java frontend Command c = new Command(); c.setName("Restart Java frontend"); c.setReceiver("app.actuators.plugins.controller.in"); c.setProperty("plugin", master.getName()); c.setProperty("action", "restart"); //the default choice master.notifyCommand(c); } private void changeRenderer(String renderer) { drawer.getCurrEnv().getPojo().setRenderer(renderer.toLowerCase()); master.getMainWindow().setWindowedMode(); } /** * * @return */ public JInternalFrame getFrameMap() { return frameMap; } /** * * @return */ public PluginJList getPluginJList() { return lstClients; } /** * * @param frame */ public static void centerFrame(JFrame frame) { frame.setLocation((Toolkit.getDefaultToolkit().getScreenSize().width - frame.getWidth()) / 2, (Toolkit.getDefaultToolkit().getScreenSize().height - frame.getHeight()) / 2); } /** * */ public void maximizeMap() { try { frameMap.setMaximum(true); } catch (Exception e) { } } /** * */ public void setQuarterSize() { Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); setSize((int) dim.getWidth() / 2, (int) dim.getHeight() / 2); } /** * */ public void optimizeFramesDimension() { try { if (!frameMap.isMaximum() || !frameClient.isIcon()) { frameClient.setBounds(0, 0, desktopPane.getWidth() / 3, desktopPane.getHeight()); frameMap.setBounds(desktopPane.getWidth() / 3, 0, (desktopPane.getWidth() / 3) * 2, desktopPane.getHeight()); } else { maximizeMap(); frameClient.hide(); } } catch (Exception e) { } } /** * * @param prevEnv */ public void initializeRenderer(EnvironmentLogic prevEnv) { drawer = null; frameMap.dispose(); frameMap = new JInternalFrame(); frameMap.setBackground(new java.awt.Color(38, 186, 254)); frameMap.setIconifiable(false); frameMap.setMaximizable(true); frameMap.setResizable(true); setMapTitle(i18n.msg("not_inited") + i18n.msg("inited")); desktopPane.add(frameMap, javax.swing.JLayeredPane.DEFAULT_LAYER); // referenceRatio = new Float(prevEnv.getPojo().getWidth() / new Float(prevEnv.getPojo().getWidth())); } /** * * @param drawer */ public void setDrawer(Drawer drawer) { frameMap.getContentPane().add(drawer); Renderer renderer = (Renderer) drawer; desktopPane.setBackground(renderer.getBackgroundColor()); frameMap.getContentPane().setBackground(renderer.backgroundColor); setMapTitle(drawer.getCurrEnv().getPojo().getName()); } /** * * @param name */ public void setMapTitle(String name) { String envName = ""; try { envName = drawer.getCurrEnv().getSource().getParentFile().getName() + "/"; } catch (Exception e) { //do nothing, this is not important } frameMap.setTitle(i18n.msg("environment") + ": " + envName + name); } class StringListModel extends AbstractListModel { private java.util.List<String> list; public StringListModel(ArrayList<String> strings) { list = strings; } @Override public Object getElementAt(int index) { return list.get(index); } @Override public int getSize() { return list.size(); } } /* * AUTOGENERATED CODE BELOW - DON'T MIND IT */ /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jTextField1 = new javax.swing.JTextField(); scrollTxtOut1 = new javax.swing.JScrollPane(); txtOut1 = new javax.swing.JTextArea(); scrollTxtOut2 = new javax.swing.JScrollPane(); txtOut2 = new javax.swing.JTextArea(); jMenuItem4 = new javax.swing.JMenuItem(); jSeparator2 = new javax.swing.JSeparator(); menuBar = new javax.swing.JMenuBar(); mnuOpenNew = new javax.swing.JMenu(); mnuNewEnvironment = new javax.swing.JMenuItem(); mnuOpenEnvironment = new javax.swing.JMenuItem(); mnuSave = new javax.swing.JMenuItem(); mnuSaveAs = new javax.swing.JMenuItem(); jSeparator1 = new javax.swing.JSeparator(); mnuSwitchUser = new javax.swing.JMenuItem(); mnuExit = new javax.swing.JMenuItem(); mnuEditMode = new javax.swing.JMenu(); mnuSelectEnvironment = new javax.swing.JMenuItem(); jMenu4 = new javax.swing.JMenu(); mnuRenameEnvironment = new javax.swing.JMenuItem(); mnuAddDuplicateEnvironment = new javax.swing.JMenuItem(); mnuChangeRenderer = new javax.swing.JMenuItem(); mnuBackground = new javax.swing.JMenuItem(); mnuDelete = new javax.swing.JMenuItem(); mnuRoomEditMode = new javax.swing.JCheckBoxMenuItem(); jMenu3 = new javax.swing.JMenu(); mnuRenameRoom = new javax.swing.JMenuItem(); mnuAddRoom = new javax.swing.JMenuItem(); mnuRoomBackground = new javax.swing.JMenuItem(); mnuRemoveRoom = new javax.swing.JMenuItem(); mnuObjects = new javax.swing.JMenu(); mnuObjectEditMode = new javax.swing.JCheckBoxMenuItem(); jMenu2 = new javax.swing.JMenu(); mnuAutomations = new javax.swing.JMenuItem(); jMenu1 = new javax.swing.JMenu(); jCheckBoxMarket = new javax.swing.JCheckBoxMenuItem(); mnuPluginConfigure = new javax.swing.JMenuItem(); jMenu5 = new javax.swing.JMenu(); mnuLanguage = new javax.swing.JMenuItem(); mnuPrivileges = new javax.swing.JMenuItem(); mnuWindow = new javax.swing.JMenu(); mnuPluginList = new javax.swing.JMenuItem(); jMenuItem3 = new javax.swing.JMenuItem(); mnuHelp = new javax.swing.JMenu(); mnuTutorial = new javax.swing.JMenuItem(); jMenuItem1 = new javax.swing.JMenuItem(); submnuHelp = new javax.swing.JMenuItem(); jTextField1.setText("jTextField1"); scrollTxtOut1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); txtOut1.setEditable(false); txtOut1.setColumns(20); txtOut1.setFont(new java.awt.Font("Arial", 0, 10)); // NOI18N txtOut1.setRows(5); txtOut1.setWrapStyleWord(true); txtOut1.setName("txtOutput"); // NOI18N txtOut1.setOpaque(false); scrollTxtOut1.setViewportView(txtOut1); scrollTxtOut2.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); txtOut2.setEditable(false); txtOut2.setColumns(20); txtOut2.setFont(new java.awt.Font("Arial", 0, 10)); // NOI18N txtOut2.setRows(5); txtOut2.setWrapStyleWord(true); txtOut2.setName("txtOutput"); // NOI18N txtOut2.setOpaque(false); scrollTxtOut2.setViewportView(txtOut2); jMenuItem4.setText("jMenuItem4"); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("Freedomotic"); setBackground(java.awt.SystemColor.window); setBounds(new java.awt.Rectangle(50, 20, 0, 0)); setLocationByPlatform(true); setMinimumSize(new java.awt.Dimension(500, 400)); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { formWindowClosing(evt); } public void windowClosed(java.awt.event.WindowEvent evt) { formWindowClosed(evt); } public void windowActivated(java.awt.event.WindowEvent evt) { drawer.repaint(); } }); addComponentListener(new java.awt.event.ComponentAdapter() { public void componentResized(java.awt.event.ComponentEvent evt) { formComponentResized(evt); } }); addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { public void mouseMoved(java.awt.event.MouseEvent evt) { formMouseMoved(evt); } }); mnuOpenNew.setText(i18n.msg("file")); mnuOpenNew.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuOpenNewActionPerformed(evt); } }); mnuNewEnvironment.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK)); mnuNewEnvironment.setText(i18n.msg("new") + i18n.msg("environment")); mnuNewEnvironment.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuNewEnvironmentActionPerformed(evt); } }); mnuOpenNew.add(mnuNewEnvironment); mnuOpenEnvironment.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK)); mnuOpenEnvironment.setText(i18n.msg("open") + i18n.msg("environment")); mnuOpenEnvironment.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuOpenEnvironmentActionPerformed(evt); } }); mnuOpenNew.add(mnuOpenEnvironment); mnuSave.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK)); mnuSave.setText(i18n.msg("save") + i18n.msg("environment")); mnuSave.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuSaveActionPerformed(evt); } }); mnuOpenNew.add(mnuSave); mnuSaveAs.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK)); mnuSaveAs.setText(i18n.msg("save_X_as",new Object[]{i18n.msg("environment")})); mnuSaveAs.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuSaveAsActionPerformed(evt); } }); mnuOpenNew.add(mnuSaveAs); mnuOpenNew.add(jSeparator1); mnuSwitchUser.setText(i18n.msg("change_user")); mnuSwitchUser.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuSwitchUserActionPerformed(evt); } }); mnuOpenNew.add(mnuSwitchUser); mnuExit.setText(i18n.msg("exit")); mnuExit.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuExitActionPerformed(evt); } }); mnuOpenNew.add(mnuExit); menuBar.add(mnuOpenNew); mnuEditMode.setText(i18n.msg("environment")); mnuSelectEnvironment.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F3, 0)); mnuSelectEnvironment.setText(i18n.msg("select_X",new Object[]{i18n.msg("area_floor")})); mnuSelectEnvironment.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuSelectEnvironmentActionPerformed(evt); } }); mnuEditMode.add(mnuSelectEnvironment); jMenu4.setText(i18n.msg("area_floor")); mnuRenameEnvironment.setText(i18n.msg("rename")); mnuRenameEnvironment.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuRenameEnvironmentActionPerformed(evt); } }); jMenu4.add(mnuRenameEnvironment); mnuAddDuplicateEnvironment.setText(i18n.msg("add")+"/"+i18n.msg("duplicate")); mnuAddDuplicateEnvironment.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuAddDuplicateEnvironmentActionPerformed(evt); } }); jMenu4.add(mnuAddDuplicateEnvironment); mnuChangeRenderer.setText(i18n.msg("change_X",new Object[]{i18n.msg("renderer")})); mnuChangeRenderer.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuChangeRendererActionPerformed(evt); } }); jMenu4.add(mnuChangeRenderer); mnuBackground.setText(i18n.msg("change_X",new Object[]{i18n.msg("background")})); mnuBackground.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuBackgroundActionPerformed(evt); } }); jMenu4.add(mnuBackground); mnuDelete.setText(i18n.msg("delete")); mnuDelete.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuDeleteActionPerformed(evt); } }); jMenu4.add(mnuDelete); mnuEditMode.add(jMenu4); mnuRoomEditMode.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F5, 0)); mnuRoomEditMode.setText(i18n.msg("X_edit_mode",new Object[]{i18n.msg("rooms")})); mnuRoomEditMode.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuRoomEditModeActionPerformed(evt); } }); mnuEditMode.add(mnuRoomEditMode); jMenu3.setText(i18n.msg("rooms")); mnuRenameRoom.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R, java.awt.event.InputEvent.CTRL_MASK)); mnuRenameRoom.setText(i18n.msg("rename") + i18n.msg("room")); mnuRenameRoom.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuRenameRoomActionPerformed(evt); } }); jMenu3.add(mnuRenameRoom); mnuAddRoom.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A, java.awt.event.InputEvent.CTRL_MASK)); mnuAddRoom.setText(i18n.msg("add") + i18n.msg("room")); mnuAddRoom.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuAddRoomActionPerformed(evt); } }); jMenu3.add(mnuAddRoom); mnuRoomBackground.setText(i18n.msg("change_X",new Object[]{i18n.msg("background")})); mnuRoomBackground.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuRoomBackgroundActionPerformed(evt); } }); jMenu3.add(mnuRoomBackground); mnuRemoveRoom.setText(i18n.msg("remove") + i18n.msg("room")); mnuRemoveRoom.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuRemoveRoomActionPerformed(evt); } }); jMenu3.add(mnuRemoveRoom); mnuEditMode.add(jMenu3); menuBar.add(mnuEditMode); mnuObjects.setText(i18n.msg("objects")); mnuObjectEditMode.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F6, 0)); mnuObjectEditMode.setText(i18n.msg("X_edit_mode",new Object[]{i18n.msg("objects")})); mnuObjectEditMode.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuObjectEditModeActionPerformed(evt); } }); mnuObjects.add(mnuObjectEditMode); menuBar.add(mnuObjects); jMenu2.setText(i18n.msg("automations")); mnuAutomations.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F7, 0)); mnuAutomations.setText(i18n.msg("manage") + i18n.msg("automations")); mnuAutomations.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuAutomationsActionPerformed(evt); } }); jMenu2.add(mnuAutomations); menuBar.add(jMenu2); jMenu1.setText(i18n.msg("plugins")); jCheckBoxMarket.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F8, 0)); jCheckBoxMarket.setText(i18n.msg("install_from_marketplace")); jCheckBoxMarket.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jCheckBoxMarketActionPerformed(evt); } }); jMenu1.add(jCheckBoxMarket); mnuPluginConfigure.setText(i18n.msg("configure")); mnuPluginConfigure.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuPluginConfigureActionPerformed(evt); } }); jMenu1.add(mnuPluginConfigure); menuBar.add(jMenu1); jMenu5.setText(i18n.msg("settings")); mnuLanguage.setText(i18n.msg("language")); mnuLanguage.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuLanguageActionPerformed(evt); } }); jMenu5.add(mnuLanguage); mnuPrivileges.setText(i18n.msg("privileges")); mnuPrivileges.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuPrivilegesActionPerformed(evt); } }); jMenu5.add(mnuPrivileges); menuBar.add(jMenu5); mnuWindow.setText(i18n.msg("window")); mnuPluginList.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F9, 0)); mnuPluginList.setText(i18n.msg("X_list",new Object[]{i18n.msg("plugins")})); mnuPluginList.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuPluginListActionPerformed(evt); } }); mnuWindow.add(mnuPluginList); jMenuItem3.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F11, 0)); jMenuItem3.setText(i18n.msg("fullscreen")); jMenuItem3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem3ActionPerformed(evt); } }); mnuWindow.add(jMenuItem3); menuBar.add(mnuWindow); mnuHelp.setText(i18n.msg("help")); mnuTutorial.setText(i18n.msg("tutorial")); mnuTutorial.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { mnuTutorialActionPerformed(evt); } }); mnuHelp.add(mnuTutorial); jMenuItem1.setText(master.getApi().getI18n().msg("report_issue") ); jMenuItem1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenuItem1ActionPerformed(evt); } }); mnuHelp.add(jMenuItem1); submnuHelp.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F1, 0)); submnuHelp.setText(i18n.msg("about")); submnuHelp.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { submnuHelpActionPerformed(evt); } }); mnuHelp.add(submnuHelp); menuBar.add(mnuHelp); setJMenuBar(menuBar); pack(); }// </editor-fold>//GEN-END:initComponents private void formMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseClicked }//GEN-LAST:event_formMouseClicked private void formMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseMoved }//GEN-LAST:event_formMouseMoved private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing closeFreedomotic(); }//GEN-LAST:event_formWindowClosing private void submnuHelpActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_submnuHelpActionPerformed String runningUser = ((Auth.getPrincipal() == null) ? "\n" : i18n.msg("running_as_user") + ": " + Auth.getPrincipal() + "\n"); JOptionPane.showMessageDialog(this, "" //+ I18n.msg("running_as_user") + ": " + Auth.getPrincipal() + "\n" + runningUser + i18n.msg("author") + ": " + Info.getAuthor() + "\n" + i18n.msg("email") + ": " + Info.getAuthorMail() + "\n" + i18n.msg("release") + ": " + Info.getReleaseDate() + ". " + Info.getVersionCodeName() + " - v" + Info.getVersion() + "\n" + i18n.msg("licence") + ": " + Info.getLicense() + "\n\n" + i18n.msg("find_support_msg") + ":\n" + "https://github.com/freedomotic/freedomotic" + "\n" + "http://freedomotic.com/", i18n.msg("info"), JOptionPane.INFORMATION_MESSAGE); }//GEN-LAST:event_submnuHelpActionPerformed private void mnuExitActionPerformed(java.awt.event.ActionEvent evt) { closeFreedomotic(); } private void closeFreedomotic() { GenericEvent exitSignal = new GenericEvent(this); exitSignal.setDestination("app.event.system.exit"); Freedomotic.sendEvent(exitSignal); } /** * * @return */ public Plugin getPlugin() { return master; } private void mnuOpenEnvironmentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuOpenEnvironmentActionPerformed mnuSaveActionPerformed(null); final JFileChooser fc = new JFileChooser(Info.PATHS.PATH_DATA_FOLDER + "/furn/"); fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); File file = null; // OpenDialogFileFilter filter = new OpenDialogFileFilter(); // filter.addExtension("xenv"); // filter.setDescription("Freedomotic XML Environment file"); // fc.addChoosableFileFilter(filter); // fc.setFileFilter(filter); int returnVal = fc.showOpenDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { file = fc.getSelectedFile(); LOG.info("Opening \"{}\"", file.getAbsolutePath()); try { api.environments().init(file); setEnvironment(api.environments().findAll().get(0)); mnuSelectEnvironmentActionPerformed(null); } catch (RepositoryException e) { LOG.error(Freedomotic.getStackTraceInfo(e)); } setWindowedMode(); } else { LOG.info(i18n.msg("canceled_by_user")); } }//GEN-LAST:event_mnuOpenEnvironmentActionPerformed private void formComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentResized optimizeFramesDimension(); }//GEN-LAST:event_formComponentResized private void mnuPluginListActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuPluginListActionPerformed if (frameClient.isClosed()) { frameClient.show(); } else { frameClient.hide(); } }//GEN-LAST:event_mnuPluginListActionPerformed private void jCheckBoxMarketActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBoxMarketActionPerformed MarketPlaceForm marketPlace = new MarketPlaceForm(master.getApi()); marketPlace.setVisible(true); }//GEN-LAST:event_jCheckBoxMarketActionPerformed private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem3ActionPerformed master.getMainWindow().setFullscreenMode(); }//GEN-LAST:event_jMenuItem3ActionPerformed private void mnuRoomEditModeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuRoomEditModeActionPerformed if (mnuRoomEditMode.getState() == true) { drawer.setObjectEditMode(false); mnuObjectEditMode.setSelected(drawer.getRoomEditMode()); setEditMode(true); drawer.setRoomEditMode(true); lstClients.setFilter("Plugin"); setMapTitle("(" + i18n.msg("room_edit_mode") + ") " + drawer.getCurrEnv().getPojo().getName()); } else { drawer.setRoomEditMode(false); setEditMode(false); mnuRoomEditMode.setSelected(drawer.getRoomEditMode()); lstClients.setFilter("Plugin"); setMapTitle(drawer.getCurrEnv().getPojo().getName()); } }//GEN-LAST:event_mnuRoomEditModeActionPerformed private void mnuRenameRoomActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuRenameRoomActionPerformed ZoneLogic zone = drawer.getSelectedZone(); if (zone == null) { JOptionPane.showMessageDialog(this, i18n.msg("select_room_first"), i18n.msg("room_rename_popup_title"), JOptionPane.ERROR_MESSAGE); } else { String input = JOptionPane.showInputDialog(this, i18n.msg("enter_new_name_for_zone") + zone.getPojo().getName(), i18n.msg("room_rename_popup_title"), JOptionPane.PLAIN_MESSAGE); if (input != null && !input.isEmpty()) { zone.getPojo().setName(input.trim()); } else { JOptionPane.showMessageDialog(this, i18n.msg("room_name_cannot_be_empty"), i18n.msg("room_rename_popup_title"), JOptionPane.ERROR_MESSAGE); } drawer.setNeedRepaint(true); } }//GEN-LAST:event_mnuRenameRoomActionPerformed private void mnuAddRoomActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuAddRoomActionPerformed Zone z = new Zone(); z.init(); z.setName(i18n.msg("room") + Math.random()); Room room = new Room(z); room.getPojo().setTexture((new File(Info.PATHS.PATH_RESOURCES_FOLDER + "/wood.jpg")).getName()); room.init(drawer.getCurrEnv()); drawer.getCurrEnv().addRoom(room); drawer.setSelectedZone(room); drawer.createHandles(room); }//GEN-LAST:event_mnuAddRoomActionPerformed private void mnuRemoveRoomActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuRemoveRoomActionPerformed ZoneLogic zone = drawer.getSelectedZone(); if (zone == null) { JOptionPane.showMessageDialog(this, i18n.msg("select_room_first")); } else { if (JOptionPane.showConfirmDialog(this, i18n.msg("really_delete_room_X", new Object[]{zone.getPojo().getName()}), i18n.msg("room_delete_confirm_title"), JOptionPane.OK_CANCEL_OPTION) == JOptionPane.OK_OPTION) { drawer.getCurrEnv().removeZone(zone); drawer.createHandles(null); } } }//GEN-LAST:event_mnuRemoveRoomActionPerformed private void mnuOpenNewActionPerformed(java.awt.event.ActionEvent evt) { //GEN-FIRST:event_mnuOpenNewActionPerformed }//GEN-LAST:event_mnuOpenNewActionPerformed private void mnuSaveAsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuSaveAsActionPerformed final JFileChooser fc = new JFileChooser(Info.PATHS.PATH_DATA_FOLDER + "/furn/"); int returnVal = fc.showSaveDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { File folder = fc.getSelectedFile(); try { master.getApi().environments().saveEnvironmentsToFolder(folder); } catch (Exception ex) { LOG.error(ex.getMessage()); } } else { LOG.info(i18n.msg("canceled_by_user")); } }//GEN-LAST:event_mnuSaveAsActionPerformed private void mnuObjectEditModeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuObjectEditModeActionPerformed if (mnuObjectEditMode.getState() == true) { //in edit objects mode //deactivate room edit mode drawer.setRoomEditMode(false); mnuRoomEditMode.setSelected(drawer.getRoomEditMode()); //activate object edit mode drawer.setObjectEditMode(true); //switch to objects list lstClients.setFilter("Object"); setMapTitle("(" + i18n.msg("object_edit_mode") + "): " + drawer.getCurrEnv().getPojo().getName()); } else { drawer.setObjectEditMode(false); mnuObjectEditMode.setSelected(drawer.getObjectEditMode()); lstClients.setFilter("Plugin"); setMapTitle(drawer.getCurrEnv().getPojo().getName()); } }//GEN-LAST:event_mnuObjectEditModeActionPerformed private void mnuAutomationsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuAutomationsActionPerformed Command c = new Command(); c.setName("Popup Automation Editor Gui"); c.setReceiver("app.actuators.plugins.controller.in"); c.setProperty("plugin", "Automations Editor"); c.setProperty("action", "show"); //the default choice master.notifyCommand(c); }//GEN-LAST:event_mnuAutomationsActionPerformed private void mnuChangeRendererActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuChangeRendererActionPerformed Object[] possibilities = {"list", "plain", "image", "photo"}; String input = (String) JOptionPane.showInputDialog( this, i18n.msg("select_renderer"), i18n.msg("select_renderer_title"), JOptionPane.PLAIN_MESSAGE, null, possibilities, drawer.getCurrEnv().getPojo().getRenderer()); //If a string was returned if ((input != null) && (!input.isEmpty())) { changeRenderer(input); } }//GEN-LAST:event_mnuChangeRendererActionPerformed private void mnuBackgroundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuBackgroundActionPerformed final JFileChooser fc = new JFileChooser(Info.PATHS.PATH_DATA_FOLDER + File.separator + "resources" + File.separator + "system" + File.separator + "map" + File.separator); OpenDialogFileFilter filter = new OpenDialogFileFilter(); filter.addExtension("png"); filter.addExtension("jpeg"); filter.addExtension("jpg"); filter.setDescription("Image files (png, jpeg)"); fc.addChoosableFileFilter(filter); fc.setFileFilter(filter); int returnVal = fc.showOpenDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); //This is where a real application would open the file. LOG.info("Opening \"{}\"", file.getAbsolutePath()); file = this.moveBackgroundFile(file); drawer.getCurrEnv().getPojo().setBackgroundImage(file.getAbsolutePath()); drawer.setNeedRepaint(true); frameMap.validate(); } }//GEN-LAST:event_mnuBackgroundActionPerformed private File moveBackgroundFile(File backgroundImage) { File resourcesFolder = new File(Info.PATHS.PATH_DATA_FOLDER + File.separator + "resources" + File.separator + "system" + File.separator + "map"); if (backgroundImage.exists() && resourcesFolder.isDirectory() && !(new File(resourcesFolder, backgroundImage.getName()).exists())) { try { FileUtils.copyFileToDirectory(backgroundImage, resourcesFolder); backgroundImage = new File(resourcesFolder, backgroundImage.getName()); } catch (IOException e) { LOG.error(e.getMessage(), e); } } return backgroundImage; } private void mnuRoomBackgroundActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuRoomBackgroundActionPerformed ZoneLogic zone = drawer.getSelectedZone(); if (zone == null) { JOptionPane.showMessageDialog(this, i18n.msg("select_room_first")); } else { final JFileChooser fc = new JFileChooser(Info.PATHS.PATH_RESOURCES_FOLDER); OpenDialogFileFilter filter = new OpenDialogFileFilter(); filter.addExtension("png"); filter.addExtension("jpeg"); filter.addExtension("jpg"); filter.setDescription("Image files (png, jpeg)"); fc.addChoosableFileFilter(filter); fc.setFileFilter(filter); int returnVal = fc.showOpenDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); //This is where a real application would open the file. LOG.info("Opening \"{}\"", file.getAbsolutePath()); zone.getPojo().setTexture(file.getName()); drawer.setNeedRepaint(true); frameMap.validate(); } } }//GEN-LAST:event_mnuRoomBackgroundActionPerformed private void mnuNewEnvironmentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuNewEnvironmentActionPerformed // we are about to make changes to environments: we'd better save current status mnuSaveActionPerformed(null); File oldEnv = api.environments().findAll().get(0).getSource(); //creates a new environment coping it from a template File template = new File(Info.PATHS.PATH_DATA_FOLDER + "/furn/templates/template-square/template-square.xenv"); LOG.info("Opening \"{}\"", template.getAbsolutePath()); setEnvironment(api.environments().findAll().get(0)); try { EnvironmentLogic enL = api.environments().loadEnvironmentFromFile(template); if (enL != null) { //EnvObjectPersistence.loadObjects(EnvironmentPersistence.getEnvironments().get(0).getObjectFolder(), false); final JFileChooser fc = new JFileChooser(oldEnv.getParentFile().getParentFile()); fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); fc.setDialogTitle(api.getI18n().msg("select_env_folder_save")); fc.setSelectedFile(oldEnv.getParentFile()); int returnVal = fc.showSaveDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { File folder = fc.getSelectedFile(); if (!folder.getName().isEmpty()) { if (!folder.getAbsolutePath().equalsIgnoreCase(oldEnv.getParentFile().getAbsolutePath())) { // we are making a new environment set api.environments().deleteAll(); } EnvironmentLogic newenv = api.environments().copy(enL); newenv.setSource( new File(folder + "/" + newenv.getPojo().getUUID() + ".xenv")); setEnvironment(newenv); api.environments().saveAs(newenv, folder); } } else { LOG.info("Save command cancelled by user."); //reload the old file api.environments().init(oldEnv.getParentFile()); setEnvironment(api.environments().findAll().get(0)); } } } catch (Exception e) { LOG.error(Freedomotic.getStackTraceInfo(e)); } setWindowedMode(); }//GEN-LAST:event_mnuNewEnvironmentActionPerformed private void mnuSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuSaveActionPerformed String environmentFilePath = Info.PATHS.PATH_DATA_FOLDER + "/furn" + api.getConfig().getProperty("KEY_ROOM_XML_PATH"); try { api.environments().saveEnvironmentsToFolder(new File(environmentFilePath).getParentFile()); } catch (RepositoryException ex) { JOptionPane.showMessageDialog(this, "Cannot save environment at " + new File(environmentFilePath).getAbsolutePath()); } }//GEN-LAST:event_mnuSaveActionPerformed private void mnuPluginConfigureActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuPluginConfigureActionPerformed new PluginConfigure(api); }//GEN-LAST:event_mnuPluginConfigureActionPerformed private void mnuTutorialActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuTutorialActionPerformed String url = "http://freedomotic-user-manual.readthedocs.io/"; if (Desktop.isDesktopSupported()) { Desktop desktop = Desktop.getDesktop(); if (desktop.isSupported(java.awt.Desktop.Action.BROWSE)) { try { URI uri = new URI(url); // url is a string containing the URL desktop.browse(uri); } catch (IOException | URISyntaxException ex) { LOG.error(ex.getLocalizedMessage()); } } } else { //open popup with link JOptionPane.showMessageDialog(this, i18n.msg("goto") + url); } }//GEN-LAST:event_mnuTutorialActionPerformed private void mnuSelectEnvironmentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuSelectEnvironmentActionPerformed if (Auth.isPermitted("environments:read")) { if (api.environments().findAll().size() == 1) { drawer.setCurrEnv(api.environments().findAll().get(0)); setMapTitle(api.environments().findAll().get(0).getPojo().getName()); } else { Object[] possibilities = api.environments().findAll().toArray(); EnvironmentLogic input = (EnvironmentLogic) JOptionPane.showInputDialog( this, i18n.msg("select_env"), i18n.msg("select_env_title"), JOptionPane.PLAIN_MESSAGE, null, possibilities, drawer.getCurrEnv()); //If a string was returned if (input != null) { setEnvironment(input); } else { setEnvironment(api.environments().findAll().get(0)); } } } }//GEN-LAST:event_mnuSelectEnvironmentActionPerformed private void mnuAddDuplicateEnvironmentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuAddDuplicateEnvironmentActionPerformed EnvironmentLogic newEnv = api.environments().copy(drawer.getCurrEnv()); String input = JOptionPane.showInputDialog(this, i18n.msg("enter_new_name_for_env") + newEnv.getPojo().getName(), i18n.msg("environment_duplicate_popup_title"), JOptionPane.QUESTION_MESSAGE); if (input != null && !input.isEmpty()) { newEnv.getPojo().setName(input.trim()); newEnv.setSource(new File(drawer.getCurrEnv().getSource().getParentFile() + "/" + newEnv.getPojo().getUUID() + ".xenv")); setEnvironment(api.environments().findOne(newEnv.getPojo().getUUID())); } else { JOptionPane.showMessageDialog(this, i18n.msg("environment_name_cannot_be_empty"), i18n.msg("environment_rename_popup_title"), JOptionPane.ERROR_MESSAGE); } checkDeletableEnvironments(); }//GEN-LAST:event_mnuAddDuplicateEnvironmentActionPerformed private void mnuRenameEnvironmentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuRenameEnvironmentActionPerformed String input = JOptionPane.showInputDialog(this, i18n.msg("enter_new_name_for_env", new Object[]{drawer.getCurrEnv().getPojo().getName()}), i18n.msg("environment_rename_popup_title"), JOptionPane.QUESTION_MESSAGE); if (input != null) { if (!input.isEmpty()) { drawer.getCurrEnv().getPojo().setName(input.trim()); setMapTitle(drawer.getCurrEnv().getPojo().getName()); } else { JOptionPane.showMessageDialog(this, i18n.msg("environment_name_cannot_be_empty"), i18n.msg("environment_rename_popup_title"), JOptionPane.ERROR_MESSAGE); } } }//GEN-LAST:event_mnuRenameEnvironmentActionPerformed private void mnuDeleteActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuDeleteActionPerformed EnvironmentLogic oldenv = drawer.getCurrEnv(); JLabel confirmLbl = new JLabel(i18n.msg("confirm_env_delete")); JLabel selectLbl = new JLabel(i18n.msg("select_env_to_reassing_objects")); ArrayList<Object> possibilities = new ArrayList<Object>(); possibilities.add(i18n.msg("delete_envobj_alongside_environment")); possibilities.addAll(api.environments().findAll()); possibilities.remove(oldenv); JComboBox envCombo = new JComboBox(possibilities.toArray()); int result = JOptionPane.showConfirmDialog(null, new Object[]{confirmLbl, selectLbl, envCombo}, i18n.msg("confirm_deletion_title"), JOptionPane.OK_CANCEL_OPTION); if (result == JOptionPane.OK_OPTION) { if (envCombo.getSelectedItem() instanceof EnvironmentLogic) { // assign objects to new environment EnvironmentLogic env = (EnvironmentLogic) envCombo.getSelectedItem(); for (EnvObjectLogic obj : api.things().findByEnvironment(oldenv)) { obj.setEnvironment(env); } setEnvironment(env); } else { // let objects be deleted and automatically select a new environment to show if (api.environments().findAll().get(0) != oldenv) { setEnvironment(api.environments().findAll().get(0)); } else { setEnvironment(api.environments().findAll().get(1)); } } api.environments().delete(oldenv); if (api.things().findAll().isEmpty()) { // add a new object placeholder ObjectPluginPlaceholder objp = (ObjectPluginPlaceholder) api.getClients("object").toArray()[0]; objp.startOnEnv(oldenv); } setWindowedMode(); checkDeletableEnvironments(); } }//GEN-LAST:event_mnuDeleteActionPerformed private void mnuSwitchUserActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuSwitchUserActionPerformed logUser(); }//GEN-LAST:event_mnuSwitchUserActionPerformed private void mnuPrivilegesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuPrivilegesActionPerformed // TODO add your handling code here: new PrivilegesConfiguration(api); }//GEN-LAST:event_mnuPrivilegesActionPerformed private void mnuLanguageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mnuLanguageActionPerformed //JDK 1,7 version: JComboBox<i18n.ComboLanguage> combo = new JComboBox<i18n.ComboLanguage>(I18n.getAvailableLocales()); //JDK 1.6 version: next line Vector<ComboLanguage> languages = new Vector<ComboLanguage>(); for (Locale loc : i18n.getAvailableLocales()) { languages.add(new ComboLanguage(loc.getDisplayCountry(i18n.getDefaultLocale()) + " - " + loc.getDisplayLanguage(loc), loc.toString(), loc)); } Collections.sort(languages); languages.add(new ComboLanguage("Automatic", "auto", Locale.ENGLISH)); JComboBox combo = new JComboBox(languages); for (ComboLanguage cmb : languages) { if (cmb.getValue().equals(i18n.getDefaultLocale())) { combo.setSelectedItem(cmb); break; } } JLabel lbl = new JLabel(i18n.msg("language")); int result = JOptionPane.showConfirmDialog( this, new Object[]{lbl, combo}, i18n.msg("language"), JOptionPane.OK_CANCEL_OPTION); if (result == JOptionPane.OK_OPTION) { ComboLanguage selected = (ComboLanguage) combo.getSelectedItem(); i18n.setDefaultLocale(selected.getValue()); updateStrings(); } }//GEN-LAST:event_mnuLanguageActionPerformed private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed }//GEN-LAST:event_formWindowClosed private void openGoogleForm() {//GEN-FIRST:event_jMenuItem1ActionPerformed // TODO add your handling code here: String url = "https://goo.gl/CC65By"; if (Desktop.isDesktopSupported()) { Desktop desktop = Desktop.getDesktop(); if (desktop.isSupported(java.awt.Desktop.Action.BROWSE)) { try { URI uri = new URI(url); // url is a string containing the URL desktop.browse(uri); } catch (IOException | URISyntaxException ex) { LOG.error(ex.getLocalizedMessage()); } } } else { //open popup with link JOptionPane.showMessageDialog(this, i18n.msg("goto") + url); } }//GEN-LAST:event_jMenuItem1ActionPerformed private void sendLogByMail() { java.util.List<Client> clients = (java.util.List<Client>) this.getPlugin().getApi().getClients("plugin"); boolean isMailerActive = false; for (Client plugin : clients) { if ("Mailer".equalsIgnoreCase(plugin.getName().trim()) && plugin.isRunning()) { isMailerActive = true; } } if (Freedomotic.isLogToFileEnabled() && isMailerActive) { Command c = new Command(); c.setName("Mailer"); c.setReceiver("app.actuators.messaging.mail.in"); c.setProperty("from", master.getApi().getConfig().getStringProperty("ADMIN_SENDING_ADDRESS", "issue.reporter@freedomotic.com")); c.setProperty("to", master.getApi().getConfig().getStringProperty("ADMIN_RECIPIENT_ADDRESS", "admin@freedomotic.com")); c.setProperty("message", "Here you are with the log received from an user"); c.setProperty("subject", "Log sent by Freedomotic"); c.setProperty("attachment", Freedomotic.logPath()); master.notifyCommand(c); JOptionPane.showMessageDialog(this, i18n.msg("log_sent")); } else { JOptionPane.showMessageDialog(this, i18n.msg("no_log_sent")); } } private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) { String[] buttons = {i18n.msg("form_compilation"), i18n.msg("send_log"), i18n.msg("delete")}; int option = JOptionPane.showOptionDialog(null, i18n.msg("report_issue_dialog"), i18n.msg("report_issue"), JOptionPane.WARNING_MESSAGE, 0, null, buttons, buttons[2]); switch (option) { case 0: this.openGoogleForm(); break; case 1: this.sendLogByMail(); break; default: break; } } private void updateStrings() { mnuOpenNew.setText(i18n.msg("file")); mnuNewEnvironment.setText(i18n.msg("new") + i18n.msg("environment")); mnuOpenEnvironment.setText(i18n.msg("open") + i18n.msg("environment")); mnuSave.setText(i18n.msg("save") + i18n.msg("environment")); mnuSaveAs.setText(i18n.msg("save_X_as", new Object[]{i18n.msg("environment")})); mnuSwitchUser.setText(i18n.msg("change_user")); mnuExit.setText(i18n.msg("exit")); mnuEditMode.setText(i18n.msg("environment")); mnuSelectEnvironment.setText(i18n.msg("select_X", new Object[]{i18n.msg("area_floor")})); jMenu4.setText(i18n.msg("area_floor")); mnuRenameEnvironment.setText(i18n.msg("rename")); mnuAddDuplicateEnvironment.setText(i18n.msg("add") + "/" + i18n.msg("duplicate")); mnuChangeRenderer.setText(i18n.msg("change_X", new Object[]{i18n.msg("renderer")})); mnuBackground.setText(i18n.msg("change_X", new Object[]{i18n.msg("background")})); mnuDelete.setText(i18n.msg("delete")); mnuRoomEditMode.setText(i18n.msg("X_edit_mode", new Object[]{i18n.msg("rooms")})); jMenu3.setText(i18n.msg("rooms")); mnuRenameRoom.setText(i18n.msg("rename") + i18n.msg("room")); mnuAddRoom.setText(i18n.msg("add") + i18n.msg("room")); mnuRoomBackground.setText(i18n.msg("change_X", new Object[]{i18n.msg("background")})); mnuRemoveRoom.setText(i18n.msg("remove") + i18n.msg("room")); mnuObjects.setText(i18n.msg("objects")); mnuObjectEditMode.setText(i18n.msg("X_edit_mode", new Object[]{i18n.msg("objects")})); jMenu2.setText(i18n.msg("automations")); mnuAutomations.setText(i18n.msg("manage") + i18n.msg("automations")); jCheckBoxMarket.setText(i18n.msg("install_from_marketplace")); mnuPluginConfigure.setText(i18n.msg("configure")); jMenu5.setText(i18n.msg("settings")); mnuLanguage.setText(i18n.msg("language")); mnuPrivileges.setText(i18n.msg("privileges")); mnuWindow.setText(i18n.msg("window")); mnuPluginList.setText(i18n.msg("X_list", new Object[]{i18n.msg("plugins")})); jMenuItem3.setText(i18n.msg("fullscreen")); mnuHelp.setText(i18n.msg("help")); mnuTutorial.setText(i18n.msg("tutorial")); submnuHelp.setText(i18n.msg("about")); frameClient.setTitle(i18n.msg("loaded_plugins")); setMapTitle(drawer.getCurrEnv().getPojo().getName()); // frameMap } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JCheckBoxMenuItem jCheckBoxMarket; private javax.swing.JMenu jMenu1; private javax.swing.JMenu jMenu2; private javax.swing.JMenu jMenu3; private javax.swing.JMenu jMenu4; private javax.swing.JMenu jMenu5; private javax.swing.JMenuItem jMenuItem1; private javax.swing.JMenuItem jMenuItem3; private javax.swing.JMenuItem jMenuItem4; private javax.swing.JSeparator jSeparator1; private javax.swing.JSeparator jSeparator2; private javax.swing.JTextField jTextField1; private javax.swing.JMenuBar menuBar; private javax.swing.JMenuItem mnuAddDuplicateEnvironment; private javax.swing.JMenuItem mnuAddRoom; private javax.swing.JMenuItem mnuAutomations; private javax.swing.JMenuItem mnuBackground; private javax.swing.JMenuItem mnuChangeRenderer; private javax.swing.JMenuItem mnuDelete; private javax.swing.JMenu mnuEditMode; private javax.swing.JMenuItem mnuExit; private javax.swing.JMenu mnuHelp; private javax.swing.JMenuItem mnuLanguage; private javax.swing.JMenuItem mnuNewEnvironment; private javax.swing.JCheckBoxMenuItem mnuObjectEditMode; private javax.swing.JMenu mnuObjects; private javax.swing.JMenuItem mnuOpenEnvironment; private javax.swing.JMenu mnuOpenNew; private javax.swing.JMenuItem mnuPluginConfigure; private javax.swing.JMenuItem mnuPluginList; private javax.swing.JMenuItem mnuPrivileges; private javax.swing.JMenuItem mnuRemoveRoom; private javax.swing.JMenuItem mnuRenameEnvironment; private javax.swing.JMenuItem mnuRenameRoom; private javax.swing.JMenuItem mnuRoomBackground; private javax.swing.JCheckBoxMenuItem mnuRoomEditMode; private javax.swing.JMenuItem mnuSave; private javax.swing.JMenuItem mnuSaveAs; private javax.swing.JMenuItem mnuSelectEnvironment; private javax.swing.JMenuItem mnuSwitchUser; private javax.swing.JMenuItem mnuTutorial; private javax.swing.JMenu mnuWindow; private javax.swing.JScrollPane scrollTxtOut1; private javax.swing.JScrollPane scrollTxtOut2; private javax.swing.JMenuItem submnuHelp; private javax.swing.JTextArea txtOut1; private javax.swing.JTextArea txtOut2; // End of variables declaration//GEN-END:variables }