1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00
JUCE/extras/JuceDemo/Source/MainDemoWindow.cpp

595 lines
21 KiB
C++

/*
==============================================================================
This file is part of the JUCE library - "Jules' Utility Class Extensions"
Copyright 2004-9 by Raw Material Software Ltd.
------------------------------------------------------------------------------
JUCE can be redistributed and/or modified under the terms of the GNU General
Public License (Version 2), as published by the Free Software Foundation.
A copy of the license is included in the JUCE distribution, or can be found
online at www.gnu.org/licenses.
JUCE 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.
------------------------------------------------------------------------------
To release a closed-source product which uses JUCE, commercial licenses are
available: visit www.rawmaterialsoftware.com/juce for more information.
==============================================================================
*/
#include "jucedemo_headers.h"
#include "MainDemoWindow.h"
//==============================================================================
class ContentComp : public Component,
public MenuBarModel,
public ApplicationCommandTarget
{
public:
//==============================================================================
ContentComp (MainDemoWindow* mainWindow_)
: mainWindow (mainWindow_),
currentDemoId (0)
{
invokeDirectly (showRendering, true);
}
~ContentComp()
{
}
//==============================================================================
void resized()
{
if (currentDemo != 0)
currentDemo->setBounds (0, 0, getWidth(), getHeight());
}
//==============================================================================
void showDemo (Component* demoComp)
{
currentDemo = demoComp;
addAndMakeVisible (currentDemo);
resized();
}
//==============================================================================
const StringArray getMenuBarNames()
{
const char* const names[] = { "Demo", "Look-and-feel", 0 };
return StringArray (names);
}
const PopupMenu getMenuForIndex (int menuIndex, const String& /*menuName*/)
{
ApplicationCommandManager* commandManager = &(mainWindow->commandManager);
PopupMenu menu;
if (menuIndex == 0)
{
menu.addCommandItem (commandManager, showRendering);
menu.addCommandItem (commandManager, showFontsAndText);
menu.addCommandItem (commandManager, showWidgets);
menu.addCommandItem (commandManager, showThreading);
menu.addCommandItem (commandManager, showTreeView);
menu.addCommandItem (commandManager, showTable);
menu.addCommandItem (commandManager, showAudio);
menu.addCommandItem (commandManager, showDragAndDrop);
menu.addCommandItem (commandManager, showOpenGL);
menu.addCommandItem (commandManager, showQuicktime);
menu.addCommandItem (commandManager, showInterprocessComms);
menu.addCommandItem (commandManager, showCamera);
menu.addCommandItem (commandManager, showWebBrowser);
menu.addCommandItem (commandManager, showCodeEditor);
menu.addSeparator();
menu.addCommandItem (commandManager, StandardApplicationCommandIDs::quit);
}
else if (menuIndex == 1)
{
menu.addCommandItem (commandManager, setDefaultLookAndFeel);
menu.addCommandItem (commandManager, setOldSchoolLookAndFeel);
menu.addSeparator();
menu.addCommandItem (commandManager, useNativeTitleBar);
#if JUCE_MAC
menu.addCommandItem (commandManager, useNativeMenus);
#endif
#if ! JUCE_LINUX
menu.addCommandItem (commandManager, goToKioskMode);
#endif
StringArray renderingEngines (getPeer()->getAvailableRenderingEngines());
if (renderingEngines.size() > 1)
{
menu.addSeparator();
for (int i = 0; i < renderingEngines.size(); ++i)
menu.addItem (5001 + i, "Use " + renderingEngines[i], true,
i == getPeer()->getCurrentRenderingEngine());
}
}
return menu;
}
void menuItemSelected (int menuItemID, int /*topLevelMenuIndex*/)
{
// most of our menu items are invoked automatically as commands, but we can handle the
// other special cases here..
if (menuItemID >= 5001 && menuItemID < 5010)
getPeer()->setCurrentRenderingEngine (menuItemID - 5001);
}
//==============================================================================
// The following methods implement the ApplicationCommandTarget interface, allowing
// this window to publish a set of actions it can perform, and which can be mapped
// onto menus, keypresses, etc.
ApplicationCommandTarget* getNextCommandTarget()
{
// this will return the next parent component that is an ApplicationCommandTarget (in this
// case, there probably isn't one, but it's best to use this method in your own apps).
return findFirstTargetParentComponent();
}
void getAllCommands (Array <CommandID>& commands)
{
// this returns the set of all commands that this target can perform..
const CommandID ids[] = { showRendering,
showFontsAndText,
showWidgets,
showThreading,
showTreeView,
showTable,
showAudio,
showDragAndDrop,
showOpenGL,
showQuicktime,
showCamera,
showWebBrowser,
showCodeEditor,
showInterprocessComms,
setDefaultLookAndFeel,
setOldSchoolLookAndFeel,
useNativeTitleBar
#if JUCE_MAC
, useNativeMenus
#endif
#if ! JUCE_LINUX
, goToKioskMode
#endif
};
commands.addArray (ids, numElementsInArray (ids));
}
// This method is used when something needs to find out the details about one of the commands
// that this object can perform..
void getCommandInfo (CommandID commandID, ApplicationCommandInfo& result)
{
const String generalCategory ("General");
const String demosCategory ("Demos");
switch (commandID)
{
case showRendering:
result.setInfo ("Graphics Rendering", "Shows the graphics demo", demosCategory, 0);
result.setTicked (currentDemoId == showRendering);
result.addDefaultKeypress ('1', ModifierKeys::commandModifier);
break;
case showFontsAndText:
result.setInfo ("Fonts and Text", "Shows the fonts & text demo", demosCategory, 0);
result.setTicked (currentDemoId == showFontsAndText);
result.addDefaultKeypress ('2', ModifierKeys::commandModifier);
break;
case showWidgets:
result.setInfo ("Widgets", "Shows the widgets demo", demosCategory, 0);
result.setTicked (currentDemoId == showWidgets);
result.addDefaultKeypress ('3', ModifierKeys::commandModifier);
break;
case showThreading:
result.setInfo ("Multithreading", "Shows the threading demo", demosCategory, 0);
result.setTicked (currentDemoId == showThreading);
result.addDefaultKeypress ('4', ModifierKeys::commandModifier);
break;
case showTreeView:
result.setInfo ("Treeviews", "Shows the treeviews demo", demosCategory, 0);
result.setTicked (currentDemoId == showTreeView);
result.addDefaultKeypress ('5', ModifierKeys::commandModifier);
break;
case showTable:
result.setInfo ("Table Components", "Shows the table component demo", demosCategory, 0);
result.setTicked (currentDemoId == showTable);
result.addDefaultKeypress ('6', ModifierKeys::commandModifier);
break;
case showAudio:
result.setInfo ("Audio", "Shows the audio demo", demosCategory, 0);
result.setTicked (currentDemoId == showAudio);
result.addDefaultKeypress ('7', ModifierKeys::commandModifier);
break;
case showDragAndDrop:
result.setInfo ("Drag-and-drop", "Shows the drag & drop demo", demosCategory, 0);
result.setTicked (currentDemoId == showDragAndDrop);
result.addDefaultKeypress ('8', ModifierKeys::commandModifier);
break;
case showOpenGL:
result.setInfo ("OpenGL", "Shows the OpenGL demo", demosCategory, 0);
result.addDefaultKeypress ('9', ModifierKeys::commandModifier);
result.setTicked (currentDemoId == showOpenGL);
#if ! JUCE_OPENGL
result.setActive (false);
#endif
break;
case showQuicktime:
result.setInfo ("Quicktime", "Shows the Quicktime demo", demosCategory, 0);
result.addDefaultKeypress ('b', ModifierKeys::commandModifier);
result.setTicked (currentDemoId == showQuicktime);
#if ! (JUCE_QUICKTIME && ! JUCE_LINUX)
result.setActive (false);
#endif
break;
case showCamera:
result.setInfo ("Camera Capture", "Shows the camera demo", demosCategory, 0);
result.addDefaultKeypress ('c', ModifierKeys::commandModifier);
result.setTicked (currentDemoId == showCamera);
#if ! JUCE_USE_CAMERA
result.setActive (false);
#endif
break;
case showWebBrowser:
result.setInfo ("Web Browser", "Shows the web browser demo", demosCategory, 0);
result.addDefaultKeypress ('i', ModifierKeys::commandModifier);
result.setTicked (currentDemoId == showWebBrowser);
#if (! JUCE_WEB_BROWSER) || JUCE_LINUX
result.setActive (false);
#endif
break;
case showCodeEditor:
result.setInfo ("Code Editor", "Shows the code editor demo", demosCategory, 0);
result.addDefaultKeypress ('e', ModifierKeys::commandModifier);
result.setTicked (currentDemoId == showCodeEditor);
break;
case showInterprocessComms:
result.setInfo ("Interprocess Comms", "Shows the interprocess communications demo", demosCategory, 0);
result.addDefaultKeypress ('0', ModifierKeys::commandModifier);
result.setTicked (currentDemoId == showInterprocessComms);
break;
case setDefaultLookAndFeel:
result.setInfo ("Use default look-and-feel", String::empty, generalCategory, 0);
result.setTicked (dynamic_cast <OldSchoolLookAndFeel*> (&getLookAndFeel()) == 0);
break;
case setOldSchoolLookAndFeel:
result.setInfo ("Use the old, original juce look-and-feel", String::empty, generalCategory, 0);
result.setTicked (dynamic_cast <OldSchoolLookAndFeel*> (&getLookAndFeel()) != 0);
break;
case useNativeTitleBar:
result.setInfo ("Use native window title bar", String::empty, generalCategory, 0);
result.setTicked (mainWindow->isUsingNativeTitleBar());
break;
#if JUCE_MAC
case useNativeMenus:
result.setInfo ("Use the native OSX menu bar", String::empty, generalCategory, 0);
result.setTicked (MenuBarModel::getMacMainMenu() != 0);
break;
#endif
#if ! JUCE_LINUX
case goToKioskMode:
result.setInfo ("Show full-screen kiosk mode", String::empty, generalCategory, 0);
result.setTicked (Desktop::getInstance().getKioskModeComponent() != 0);
break;
#endif
default:
break;
};
}
// this is the ApplicationCommandTarget method that is used to actually perform one of our commands..
bool perform (const InvocationInfo& info)
{
switch (info.commandID)
{
case showRendering:
showDemo (createRenderingDemo());
currentDemoId = showRendering;
break;
case showFontsAndText:
showDemo (createFontsAndTextDemo());
currentDemoId = showFontsAndText;
break;
case showWidgets:
showDemo (createWidgetsDemo());
currentDemoId = showWidgets;
break;
case showThreading:
showDemo (createThreadingDemo());
currentDemoId = showThreading;
break;
case showTreeView:
showDemo (createTreeViewDemo());
currentDemoId = showTreeView;
break;
case showTable:
showDemo (createTableDemo());
currentDemoId = showTable;
break;
case showAudio:
showDemo (createAudioDemo());
currentDemoId = showAudio;
break;
case showDragAndDrop:
showDemo (createDragAndDropDemo());
currentDemoId = showDragAndDrop;
break;
case showOpenGL:
#if JUCE_OPENGL
showDemo (createOpenGLDemo());
currentDemoId = showOpenGL;
#endif
break;
case showQuicktime:
#if JUCE_QUICKTIME && ! JUCE_LINUX
showDemo (createQuickTimeDemo());
currentDemoId = showQuicktime;
#endif
break;
case showCamera:
#if JUCE_USE_CAMERA
showDemo (createCameraDemo());
currentDemoId = showCamera;
#endif
break;
case showWebBrowser:
#if JUCE_WEB_BROWSER
showDemo (createWebBrowserDemo());
currentDemoId = showWebBrowser;
#endif
break;
case showCodeEditor:
showDemo (createCodeEditorDemo());
currentDemoId = showCodeEditor;
break;
case showInterprocessComms:
showDemo (createInterprocessCommsDemo());
currentDemoId = showInterprocessComms;
break;
case setDefaultLookAndFeel:
LookAndFeel::setDefaultLookAndFeel (nullptr);
break;
case setOldSchoolLookAndFeel:
LookAndFeel::setDefaultLookAndFeel (&oldLookAndFeel);
break;
case useNativeTitleBar:
mainWindow->setUsingNativeTitleBar (! mainWindow->isUsingNativeTitleBar());
break;
#if JUCE_MAC
case useNativeMenus:
if (MenuBarModel::getMacMainMenu() != 0)
{
MenuBarModel::setMacMainMenu (0);
mainWindow->setMenuBar ((ContentComp*) mainWindow->getContentComponent());
}
else
{
MenuBarModel::setMacMainMenu ((ContentComp*) mainWindow->getContentComponent());
mainWindow->setMenuBar (0);
}
break;
#endif
#if ! JUCE_LINUX
case goToKioskMode:
if (Desktop::getInstance().getKioskModeComponent() == 0)
{
Desktop::getInstance().setKioskModeComponent (getTopLevelComponent());
}
else
{
Desktop::getInstance().setKioskModeComponent (0);
}
break;
#endif
default:
return false;
};
return true;
}
private:
//==============================================================================
MainDemoWindow* mainWindow;
OldSchoolLookAndFeel oldLookAndFeel;
ScopedPointer<Component> currentDemo;
int currentDemoId;
TooltipWindow tooltipWindow; // to add tooltips to an application, you
// just need to create one of these and leave it
// there to do its work..
enum CommandIDs
{
showRendering = 0x2000,
showFontsAndText = 0x2001,
showWidgets = 0x2002,
showThreading = 0x2003,
showTreeView = 0x2004,
showAudio = 0x2005,
showDragAndDrop = 0x2006,
showOpenGL = 0x2007,
showQuicktime = 0x2008,
showInterprocessComms = 0x2009,
showTable = 0x2010,
showCamera = 0x2011,
showWebBrowser = 0x2012,
showCodeEditor = 0x2013,
setDefaultLookAndFeel = 0x200b,
setOldSchoolLookAndFeel = 0x200c,
useNativeTitleBar = 0x200d,
useNativeMenus = 0x200e,
goToKioskMode = 0x200f
};
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ContentComp);
};
//==============================================================================
#if JUCE_WINDOWS || JUCE_LINUX
// Just add a simple icon to the Window system tray area..
class DemoTaskbarComponent : public SystemTrayIconComponent
{
public:
DemoTaskbarComponent()
{
// Create an icon which is just a square with a "j" in it..
Image icon (Image::RGB, 32, 32, true);
Graphics g (icon);
g.fillAll (Colours::lightblue);
g.setColour (Colours::black);
g.setFont ((float) icon.getHeight(), Font::bold);
g.drawText ("j", 0, 0, icon.getWidth(), icon.getHeight(), Justification::centred, false);
setIconImage (icon);
setIconTooltip ("Juce Demo App!");
}
~DemoTaskbarComponent()
{
}
void mouseDown (const MouseEvent&)
{
PopupMenu m;
m.addItem (1, "Quit the Juce demo");
const int result = m.show();
if (result == 1)
JUCEApplication::getInstance()->systemRequestedQuit();
}
};
#endif
//==============================================================================
MainDemoWindow::MainDemoWindow()
: DocumentWindow ("JUCE Demo!",
Colours::azure,
DocumentWindow::allButtons,
true)
{
setResizable (true, false); // resizability is a property of ResizableWindow
setResizeLimits (400, 300, 8192, 8192);
ContentComp* contentComp = new ContentComp (this);
commandManager.registerAllCommandsForTarget (contentComp);
commandManager.registerAllCommandsForTarget (JUCEApplication::getInstance());
// this lets the command manager use keypresses that arrive in our window to send
// out commands
addKeyListener (commandManager.getKeyMappings());
// sets the main content component for the window to be this tabbed
// panel. This will be deleted when the window is deleted.
setContentOwned (contentComp, false);
// this tells the DocumentWindow to automatically create and manage a MenuBarComponent
// which uses our contentComp as its MenuBarModel
setMenuBar (contentComp);
// tells our menu bar model that it should watch this command manager for
// changes, and send change messages accordingly.
contentComp->setApplicationCommandManagerToWatch (&commandManager);
setVisible (true);
#if JUCE_WINDOWS || JUCE_LINUX
taskbarIcon = new DemoTaskbarComponent();
#endif
}
MainDemoWindow::~MainDemoWindow()
{
// because we've set the content comp to be used as our menu bar model, we
// have to switch this off before deleting the content comp..
setMenuBar (0);
#if JUCE_MAC // ..and also the main bar if we're using that on a Mac...
MenuBarModel::setMacMainMenu (0);
#endif
// clearing the content component will delete the current one, and
// that will in turn delete all its child components. You don't always
// have to do this explicitly, because the base class's destructor will
// also delete the content component, but in this case we need to
// make sure our content comp has gone away before deleting our command
// manager.
clearContentComponent();
}
void MainDemoWindow::closeButtonPressed()
{
// The correct thing to do when you want the app to quit is to call the
// JUCEApplication::systemRequestedQuit() method.
// That means that requests to quit that come from your own UI, or from other
// OS-specific sources (e.g. the dock menu on the mac) all get handled in the
// same way.
JUCEApplication::getInstance()->systemRequestedQuit();
}