diff --git a/src/main/java/com/ardublock/ui/OpenblocksFrame.java b/src/main/java/com/ardublock/ui/OpenblocksFrame.java index 628afa83d7389e3586913609e60f910a721b67f5..aabf5b00aaf12efb6d97236e8214c7a763f304c1 100644 --- a/src/main/java/com/ardublock/ui/OpenblocksFrame.java +++ b/src/main/java/com/ardublock/ui/OpenblocksFrame.java @@ -6,7 +6,6 @@ import java.awt.Cursor; import java.awt.Desktop; import java.awt.Dimension; import java.awt.FlowLayout; -import java.awt.Font; import java.awt.Graphics2D; import java.awt.Insets; import java.awt.event.ActionEvent; @@ -27,7 +26,6 @@ import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JFrame; -import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; @@ -35,7 +33,6 @@ import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.KeyStroke; import javax.swing.ToolTipManager; -import javax.swing.UIManager; import javax.swing.filechooser.FileFilter; import javax.swing.filechooser.FileNameExtensionFilter; @@ -43,6 +40,7 @@ import com.ardublock.core.Context; import com.ardublock.ui.listener.ArdublockWorkspaceListener; import com.ardublock.ui.listener.ButtonMouseListener; import com.ardublock.ui.listener.GenerateCodeButtonListener; +import com.ardublock.ui.listener.HelpButtonListener; import com.ardublock.ui.listener.CopyButtonListener; import com.ardublock.ui.listener.NewButtonListener; import com.ardublock.ui.listener.OpenButtonListener; @@ -61,6 +59,8 @@ import com.ardublock.ui.listener.ZoomInButtonListener; import com.ardublock.ui.listener.ZoomOutButtonListener; import edu.mit.blocks.controller.WorkspaceController; +import edu.mit.blocks.workspace.SearchBar; +import edu.mit.blocks.workspace.SearchableContainer; import edu.mit.blocks.workspace.Workspace; //import edu.mit.blocks.workspace.ZoomSlider; import tec.letsgoing.ardublock.simulator.view.GUI; @@ -87,6 +87,8 @@ public class OpenblocksFrame extends JFrame JButton modeProButton = null; JButton modeSimButton = null; + SearchBar searchBar = null; + public void addListener(OpenblocksFrameListener ofl) { context.registerOpenblocksFrameListener(ofl); @@ -144,6 +146,8 @@ public class OpenblocksFrame extends JFrame //display ToolTips for 10 seconds ToolTipManager.sharedInstance().setDismissDelay(TOOLTIP_DISMISS_DELAY); + searchBar = new SearchBar(uiMessageBundle.getString("ardublock.ui.search"), uiMessageBundle.getString("ardublock.ui.search.tooltip"), workspace); + addSearchableBlocks(workspace); //NEW //********** @@ -315,7 +319,15 @@ public class OpenblocksFrame extends JFrame JMenuItem simulatorHelpMenuItem = new JMenuItem(uiMessageBundle.getString("ardublock.ui.simulatorHelp")); simulatorHelpMenuItem.addActionListener(simulatorHelpButtonListener); simulatorHelpMenuItem.setToolTipText(uiMessageBundle.getString("ardublock.ui.simulatorHelp.tooltip")); - simulatorHelpMenuItem.setVisible(false); //hide on startUp + //simulatorHelpMenuItem.setVisible(false); //hide on startUp + + //HELP + //************** + ActionListener helpButtonListener = new HelpButtonListener(this); + + JMenuItem helpMenuItem = new JMenuItem(uiMessageBundle.getString("ardublock.ui.help")); + helpMenuItem.addActionListener(helpButtonListener); + helpMenuItem.setToolTipText(uiMessageBundle.getString("ardublock.ui.help.tooltip")); //SERIAL MONITOR @@ -508,8 +520,10 @@ public class OpenblocksFrame extends JFrame //TODO: check why blocks are rearranged while changing WS double currentWorkspaceZoom = workspace.getCurrentWorkspaceZoom(); try { + removeSearchableBlocks(workspace); WorkspaceController workspaceController = context.getWorkspaceController(); workspaceController.loadProject(getArduBlockString(), null , "default"); + addSearchableBlocks(workspace); generateButton.setVisible(true); generateMenuItem.setVisible(true); generateMenuItem.registerKeyboardAction(generateButtonListener, ctrluKeyStroke, JComponent.WHEN_IN_FOCUSED_WINDOW); @@ -525,7 +539,7 @@ public class OpenblocksFrame extends JFrame modeBasicButton.setIcon(modeBasicButtonIconSelected); modeProButton.setIcon(modeProButtonIcon); modeSimButton.setIcon(modeSimButtonIcon); - //modeBasicButton.setFont(new Font("Sans", Font.BOLD, 12)); + //modeBasicButton.setFont(new Font("Sans", Font.BOLD, 12)); //modeProButton.setFont(new Font("Sans", Font.PLAIN, 12)); //modeSimButton.setFont(new Font("Sans", Font.PLAIN, 12)); @@ -573,8 +587,10 @@ public class OpenblocksFrame extends JFrame //TODO: check why blocks are rearanged while changing WS double currentWorkspaceZoom = workspace.getCurrentWorkspaceZoom(); try { + removeSearchableBlocks(workspace); WorkspaceController workspaceController = context.getWorkspaceController(); workspaceController.loadProject(getArduBlockString(), null , "custom"); + addSearchableBlocks(workspace); generateButton.setVisible(true); generateMenuItem.setVisible(true); generateMenuItem.registerKeyboardAction(generateButtonListener, ctrluKeyStroke, JComponent.WHEN_IN_FOCUSED_WINDOW); @@ -636,9 +652,11 @@ public class OpenblocksFrame extends JFrame double currentWorkspaceZoom = workspace.getCurrentWorkspaceZoom(); try { + removeSearchableBlocks(workspace); WorkspaceController workspaceController = context.getWorkspaceController(); //TODO check if reduced sim-blockset is necessary workspaceController.loadProject(getArduBlockString(), null , "page"); + addSearchableBlocks(workspace); generateButton.setVisible(false); generateMenuItem.setVisible(false); generateMenuItem.unregisterKeyboardAction(ctrluKeyStroke); @@ -776,6 +794,7 @@ public class OpenblocksFrame extends JFrame JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); JPanel menuePanel = new JPanel(new BorderLayout());//new FlowLayout(FlowLayout.LEFT)); JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + JComponent searchBarComponent = searchBar.getComponent(); bottomPanel.setBackground(new Color(40, 76, 102)); buttonPanel.setBackground(new Color(40, 76, 102)); @@ -787,12 +806,14 @@ public class OpenblocksFrame extends JFrame JMenu toolsMenu = new JMenu(uiMessageBundle.getString("ardublock.ui.menu.tools")); JMenu blocksMenu = new JMenu(uiMessageBundle.getString("ardublock.ui.menu.blocks")); JMenu aboutMenu = new JMenu(uiMessageBundle.getString("ardublock.ui.menu.about")); + JMenu helpMenu = new JMenu(uiMessageBundle.getString("ardublock.ui.menu.help")); menuBar.add(fileMenu); menuBar.add(programMenu); menuBar.add(toolsMenu); menuBar.add(blocksMenu); menuBar.add(aboutMenu); + menuBar.add(helpMenu); fileMenu.add(newMenuItem); fileMenu.add(openMenuItem); @@ -819,9 +840,12 @@ public class OpenblocksFrame extends JFrame blocksMenu.add(blockreferenceMenuItem); aboutMenu.add(websiteButtonMenuItem); - aboutMenu.add(simulatorHelpMenuItem); + //aboutMenu.add(simulatorHelpMenuItem); aboutMenu.add(versionMenuItem); + helpMenu.add(helpMenuItem); + helpMenu.add(simulatorHelpMenuItem); + menuePanel.add(menuBar, BorderLayout.CENTER ); topPanel.add(menuePanel, BorderLayout.NORTH); //TEST topPanel.add(buttonPanel, BorderLayout.CENTER); //TEST @@ -837,12 +861,14 @@ public class OpenblocksFrame extends JFrame buttonPanel.add(simulatorHelpButton); buttonPanel.add(serialMonitorButton); buttonPanel.add(serialPlotterButton); + //buttonPanel.add(Box.createRigidArea(new Dimension(30, 0))); //std value 30,0 bottomPanel.add(modeBasicButton); bottomPanel.add(modeProButton); bottomPanel.add(modeSimButton); bottomPanel.add(Box.createRigidArea(new Dimension(30, 0))); //std value 30,0 - bottomPanel.add(context.getWorkspaceController().getSearchBar(uiMessageBundle.getString("ardublock.ui.search"), uiMessageBundle.getString("ardublock.ui.search.tooltip"))); + bottomPanel.add(searchBarComponent); + //bottomPanel.add(blockreferenceButton); //bottomPanel.add(Box.createRigidArea(new Dimension(5, 0))); //std value 30,0 @@ -1136,6 +1162,22 @@ public class OpenblocksFrame extends JFrame } } + private void removeSearchableBlocks(Workspace workspace) { + for (SearchableContainer con : getAllSearchableContainers(workspace)) { + searchBar.removeSearchableContainer(con); + } + } + + private void addSearchableBlocks(Workspace workspace) { + for (SearchableContainer con : getAllSearchableContainers(workspace)) { + searchBar.addSearchableContainer(con); + } + } + + private Iterable<SearchableContainer> getAllSearchableContainers(Workspace workspace) { + return workspace.getAllSearchableContainers(); + } + public void saveProgramAsImage() { Workspace workspace = context.getWorkspace(); diff --git a/src/main/java/com/ardublock/ui/listener/SimulatorHelpButtonListener.java b/src/main/java/com/ardublock/ui/listener/SimulatorHelpButtonListener.java index 9c92fce95aae633242071aa7c817c8f95a639a38..f7bab80471786e0a61e47f46890872dd18876477 100644 --- a/src/main/java/com/ardublock/ui/listener/SimulatorHelpButtonListener.java +++ b/src/main/java/com/ardublock/ui/listener/SimulatorHelpButtonListener.java @@ -1,7 +1,15 @@ package com.ardublock.ui.listener; +import java.awt.Desktop; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import java.util.ResourceBundle; import javax.swing.ImageIcon; @@ -26,19 +34,139 @@ public class SimulatorHelpButtonListener implements ActionListener public void actionPerformed(ActionEvent e) { //System.out.println("Help is pressed"); - ImageIcon icon = new ImageIcon(openBlocksFrame.getToolkit().getImage(GUI.class.getResource("/com/ardublock/block/SimHelp.png"))); + /* ImageIcon icon = new ImageIcon(openBlocksFrame.getToolkit().getImage(GUI.class.getResource("/com/ardublock/block/SimHelp.png"))); JOptionPane.showMessageDialog( null, uiMessageBundle.getString("ardublock.ui.simulatorHelp.text"), uiMessageBundle.getString("ardublock.ui.simulatorHelp.title"), JOptionPane.INFORMATION_MESSAGE, icon); - + */ /* * JOptionPane.showMessageDialog( null, new JLabel("Hello world", icon, * JLabel.LEFT), "Hello", JOptionPane.INFORMATION_MESSAGE); */ - } + + File cssFile = null; + File helpFile = null; + File imageFile = null; + File logoFile = null; + + //TODO: add css + String cssResource ="/com/ardublock/reference/_seitenformatierung.css"; + String helpResource ="/com/ardublock/reference/simHelp.html"; + String logoResource ="/com/ardublock/reference/_Logo_LGI_page.png"; + String imageResource ="/com/ardublock/block/SimHelp.png"; + String tempPath = ""; - - + //get current .jar path for temp files + try { + tempPath = new File(URLDecoder.decode(getClass().getProtectionDomain().getCodeSource().getLocation().getFile(), "UTF-8")).getParentFile().getPath(); + } catch (UnsupportedEncodingException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + //copy css File to tmp files + try { + InputStream input = getClass().getResourceAsStream(cssResource); + if(input != null) { + cssFile = new File(tempPath +"/"+ "_seitenformatierung.css"); + OutputStream out = new FileOutputStream(cssFile); + int read; + byte[] bytes = new byte[1024]; + while ((read = input.read(bytes)) != -1) { + out.write(bytes, 0, read); + } + out.close(); + cssFile.deleteOnExit(); + } else { + //TODO: use resources + System.out.println("Sorry, css stylesheet was not found in reference."); + //TODO: open 404-page + //!!!!!!!!!!!!!!!!!!!!!!!!!!!! + } + } catch (IOException ex) { + ex.printStackTrace(); + } + + //copy help File to tmp files + try { + InputStream input = getClass().getResourceAsStream(helpResource); + if(input != null) { + helpFile = new File(tempPath +"/"+ "simHelp.html"); + OutputStream out = new FileOutputStream(helpFile); + int read; + byte[] bytes = new byte[1024]; + while ((read = input.read(bytes)) != -1) { + out.write(bytes, 0, read); + } + out.close(); + helpFile.deleteOnExit(); + } else { + //TODO: use resources + System.out.println("Sorry, help file was not found."); + //TODO: open 404-page + //!!!!!!!!!!!!!!!!!!!!!!!!!!!! + } + } catch (IOException ex) { + ex.printStackTrace(); + } + + //copy logo to tmp files + try { + InputStream input = getClass().getResourceAsStream(logoResource); + if(input != null) { + logoFile = new File(tempPath +"/_Logo_LGI_page.png"); + OutputStream out = new FileOutputStream(logoFile); + int read; + byte[] bytes = new byte[10000]; + while ((read = input.read(bytes)) != -1) { + out.write(bytes, 0, read); + } + out.close(); + logoFile.deleteOnExit(); + } else { + //TODO: use resources + System.out.println("Sorry, logo image was not found."); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + + //copy block-image to tmp files + try { + InputStream input = getClass().getResourceAsStream(imageResource); + if(input != null) { + imageFile = new File(tempPath +"/simHelp.png"); + OutputStream out = new FileOutputStream(imageFile); + int read; + byte[] bytes = new byte[10000]; + while ((read = input.read(bytes)) != -1) { + out.write(bytes, 0, read); + } + out.close(); + imageFile.deleteOnExit(); + } else { + //TODO: use resources + System.out.println("Sorry, image for help was not found in reference."); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + + //open file in standard browser + if (helpFile != null && !helpFile.exists() && cssFile != null && !cssFile.exists() && imageFile != null && !imageFile.exists() && !logoFile.exists() ) { + throw new RuntimeException("Error: Resource not found!"); + }else { + try { + Desktop.getDesktop().browse(helpFile.toURI()); + } catch (IOException e1) { + // TODO Auto-generated catch block + //e.printStackTrace(); + } catch (NullPointerException e2) { + // TODO Auto-generated catch block + //e.printStackTrace(); + } + } + + } } diff --git a/src/main/resources/com/ardublock/block/ardublock.properties b/src/main/resources/com/ardublock/block/ardublock.properties index c304c6b4702cf81b62cb0d360ecd0ccdff99b7ca..6010e18bfba12065516df8b45faedb08906be80e 100644 --- a/src/main/resources/com/ardublock/block/ardublock.properties +++ b/src/main/resources/com/ardublock/block/ardublock.properties @@ -14,6 +14,7 @@ ardublock.ui.menu.program=Program ardublock.ui.menu.tools=Tools ardublock.ui.menu.blocks=Blocks ardublock.ui.menu.about=About +ardublock.ui.menu.help=? ardublock.ui.new=New ardublock.ui.new.tooltip=new program @@ -73,9 +74,11 @@ ardublock.ui.copy=copy ardublock.ui.copy.tooltip=copy program to clipboard ardublock.ui.paste=paste ardublock.ui.paste.tooltip=paste program from +ardublock.ui.help=Help ArduBlock +ardublock.ui.help.tooltip=Help ArduBlock ardublock.ui.simulation=simulate ardublock.ui.simulation.tooltip=start simulation with basic block-set and letsgoING modules -ardublock.ui.simulatorHelp=help +ardublock.ui.simulatorHelp=Help Simulator ardublock.ui.simulatorHelp.tooltip=About the letsgoING-simulator ardublock.ui.simulatorHelp.title=About the letsgoING-simulator ardublock.ui.simulatorHelp.text= diff --git a/src/main/resources/com/ardublock/block/ardublock_de.properties b/src/main/resources/com/ardublock/block/ardublock_de.properties index 3278b5c70ad0952ff3a45476b150f8b02e486017..80a2c1d7b8782d5ed8985042b7f7cc11bdc0e384 100644 --- a/src/main/resources/com/ardublock/block/ardublock_de.properties +++ b/src/main/resources/com/ardublock/block/ardublock_de.properties @@ -14,6 +14,7 @@ ardublock.ui.menu.program=Programm ardublock.ui.menu.tools=Werkzeuge ardublock.ui.menu.blocks=Blöcke ardublock.ui.menu.about=Über +ardublock.ui.menu.help=? ardublock.ui.new=Neu ardublock.ui.new.tooltip=Neues Programm erstellen @@ -75,9 +76,11 @@ ardublock.ui.copy=Programm kopieren ardublock.ui.copy.tooltip=kopiere gesamtes Programm in Zwischenablage ardublock.ui.paste=Programm einfügen ardublock.ui.paste.tooltip=füge gesamtes Programm aus Zwischenablage ein +ardublock.ui.help=Hilfe zu ArduBlock +ardublock.ui.help.tooltip=Hilfe zu ArduBlock ardublock.ui.simulation=Hochladen auf den Simulator ardublock.ui.simulation.tooltip=Starte den Simulator und lade das Programm hoch -ardublock.ui.simulatorHelp=Hilfe +ardublock.ui.simulatorHelp=Hilfe zum Simulator ardublock.ui.simulatorHelp.tooltip=Infos zum letsgoING-Simulator ardublock.ui.simulatorHelp.title=Infos zum letsgoING-Simulator ardublock.ui.simulatorHelp.text=TASTER\n**********************\nlinke Maustaste -> Taster-Funktion\nrechte oder mittlere Maustaste -> Schalterfunktion (bleibt aktiv)\n\n\n\nPOTI\n**********************\nSlider ziehen oder mit Mausrad verstellen (Mauszeiger über Slider)\n\n\nSERIALMONITOR\n**********************\nHier werden die Nachrichten vom "Serial.Print"-Block ausgegeben\nAutoscroll:\n an -> neueste Nachrichten werden angezeigt\n aus -> Ausgabe kann manuell ausgewählt werden\nReset SerialMonitor: bisherige Ausgabe wird gelöscht\n\n\n\RESET ARDUINO\n**********************\nTaster startet das Programm neu\n\n\n\ONBOARD LED\n**********************\nLED kann über Pin13 angesteuert werden diff --git a/src/main/webapp/com/ardublock/reference/_seitenformatierung.css b/src/main/webapp/com/ardublock/reference/_seitenformatierung.css index d1f4893b39c2bb600d3cd26975e52f9bbe2faaae..0872d0f2d102ea8d885146aa6b209c74630831ff 100644 --- a/src/main/webapp/com/ardublock/reference/_seitenformatierung.css +++ b/src/main/webapp/com/ardublock/reference/_seitenformatierung.css @@ -9,12 +9,14 @@ font-size: 120%; height: 60px; } - + li { float: left; font-weight: 200; } + + #uebersichtbutton{ float: left; font-weight: 200; @@ -68,6 +70,10 @@ ; } + article li { + float: none; + } + #beschreibung{ padding: 18px; background-color: #284a66; @@ -103,3 +109,4 @@ border-top: 1px solid #000; display: block; } +